mirror of
https://invent.kde.org/system/dolphin
synced 2024-11-05 18:47:12 +00:00
First step to reactivate version control plugin functionality
- Add a DolphinFileItemListWidget that provides icon-overlays and colored text for the version state (implementation is missing yet) - Allow KFileItemListWidget to have custom text colors - Update interface of VersionControlObserver to work with KFileItemModel instead of the old model-interface.
This commit is contained in:
parent
7a91492cff
commit
b8c718a6fd
13 changed files with 237 additions and 89 deletions
|
@ -43,6 +43,7 @@ set(dolphinprivate_LIB_SRCS
|
||||||
settings/viewpropsprogressinfo.cpp
|
settings/viewpropsprogressinfo.cpp
|
||||||
views/additionalinfoaccessor.cpp
|
views/additionalinfoaccessor.cpp
|
||||||
views/dolphindirlister.cpp
|
views/dolphindirlister.cpp
|
||||||
|
views/dolphinfileitemlistwidget.cpp
|
||||||
views/dolphinview.cpp
|
views/dolphinview.cpp
|
||||||
views/dolphinitemlistcontainer.cpp
|
views/dolphinitemlistcontainer.cpp
|
||||||
views/dolphinnewfilemenuobserver.cpp
|
views/dolphinnewfilemenuobserver.cpp
|
||||||
|
|
|
@ -27,6 +27,15 @@
|
||||||
class KFileItemModelRolesUpdater;
|
class KFileItemModelRolesUpdater;
|
||||||
class QTimer;
|
class QTimer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief View that allows to show the content of file-items.
|
||||||
|
*
|
||||||
|
* The corresponding model set by the controller must be an instance
|
||||||
|
* of KFileItemModel. Per default KFileItemListWidget is set as widget creator
|
||||||
|
* value and KItemListGroupHeader as group-header creator value. Use
|
||||||
|
* KItemListView::setWidgetCreator() and KItemListView::setGroupHeaderCreator()
|
||||||
|
* to apply customized generators.
|
||||||
|
*/
|
||||||
class LIBDOLPHINPRIVATE_EXPORT KFileItemListView : public KItemListView
|
class LIBDOLPHINPRIVATE_EXPORT KFileItemListView : public KItemListView
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
|
@ -56,6 +56,7 @@ KFileItemListWidget::KFileItemListWidget(QGraphicsItem* parent) :
|
||||||
m_textBoundingRect(),
|
m_textBoundingRect(),
|
||||||
m_sortedVisibleRoles(),
|
m_sortedVisibleRoles(),
|
||||||
m_expansionArea(),
|
m_expansionArea(),
|
||||||
|
m_customTextColor(0),
|
||||||
m_additionalInfoTextColor()
|
m_additionalInfoTextColor()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < TextIdCount; ++i) {
|
for (int i = 0; i < TextIdCount; ++i) {
|
||||||
|
@ -66,6 +67,8 @@ KFileItemListWidget::KFileItemListWidget(QGraphicsItem* parent) :
|
||||||
|
|
||||||
KFileItemListWidget::~KFileItemListWidget()
|
KFileItemListWidget::~KFileItemListWidget()
|
||||||
{
|
{
|
||||||
|
delete m_customTextColor;
|
||||||
|
m_customTextColor = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KFileItemListWidget::setLayout(Layout layout)
|
void KFileItemListWidget::setLayout(Layout layout)
|
||||||
|
@ -114,7 +117,11 @@ void KFileItemListWidget::paint(QPainter* painter, const QStyleOptionGraphicsIte
|
||||||
}
|
}
|
||||||
|
|
||||||
painter->setFont(itemListStyleOption.font);
|
painter->setFont(itemListStyleOption.font);
|
||||||
|
if (m_customTextColor) {
|
||||||
|
painter->setPen(*m_customTextColor);
|
||||||
|
} else {
|
||||||
painter->setPen(itemListStyleOption.palette.text().color());
|
painter->setPen(itemListStyleOption.palette.text().color());
|
||||||
|
}
|
||||||
painter->drawStaticText(m_textPos[Name], m_text[Name]);
|
painter->drawStaticText(m_textPos[Name], m_text[Name]);
|
||||||
|
|
||||||
painter->setPen(m_additionalInfoTextColor);
|
painter->setPen(m_additionalInfoTextColor);
|
||||||
|
@ -153,6 +160,27 @@ QRectF KFileItemListWidget::expansionToggleRect() const
|
||||||
return m_isDir ? m_expansionArea : QRectF();
|
return m_isDir ? m_expansionArea : QRectF();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void KFileItemListWidget::setTextColor(const QColor& color)
|
||||||
|
{
|
||||||
|
if (color.isValid()) {
|
||||||
|
if (!m_customTextColor) {
|
||||||
|
m_customTextColor = new QColor(color);
|
||||||
|
} else {
|
||||||
|
*m_customTextColor = color;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
delete m_customTextColor;
|
||||||
|
m_customTextColor = 0;
|
||||||
|
}
|
||||||
|
updateAdditionalInfoTextColor();
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
QColor KFileItemListWidget::textColor() const
|
||||||
|
{
|
||||||
|
return m_customTextColor ? *m_customTextColor : styleOption().palette.text().color();
|
||||||
|
}
|
||||||
|
|
||||||
void KFileItemListWidget::dataChanged(const QHash<QByteArray, QVariant>& current,
|
void KFileItemListWidget::dataChanged(const QHash<QByteArray, QVariant>& current,
|
||||||
const QSet<QByteArray>& roles)
|
const QSet<QByteArray>& roles)
|
||||||
{
|
{
|
||||||
|
@ -215,18 +243,7 @@ void KFileItemListWidget::styleOptionChanged(const KItemListStyleOption& current
|
||||||
const KItemListStyleOption& previous)
|
const KItemListStyleOption& previous)
|
||||||
{
|
{
|
||||||
KItemListWidget::styleOptionChanged(current, previous);
|
KItemListWidget::styleOptionChanged(current, previous);
|
||||||
|
updateAdditionalInfoTextColor();
|
||||||
// For the color of the additional info the inactive text color
|
|
||||||
// is not used as this might lead to unreadable text for some color schemes. Instead
|
|
||||||
// the text color is slightly mixed with the background color.
|
|
||||||
const QColor c1 = current.palette.text().color();
|
|
||||||
const QColor c2 = current.palette.background().color();
|
|
||||||
const int p1 = 70;
|
|
||||||
const int p2 = 100 - p1;
|
|
||||||
m_additionalInfoTextColor = QColor((c1.red() * p1 + c2.red() * p2) / 100,
|
|
||||||
(c1.green() * p1 + c2.green() * p2) / 100,
|
|
||||||
(c1.blue() * p1 + c2.blue() * p2) / 100);
|
|
||||||
|
|
||||||
m_dirtyLayout = true;
|
m_dirtyLayout = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -602,6 +619,20 @@ void KFileItemListWidget::updateDetailsLayoutTextCache()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void KFileItemListWidget::updateAdditionalInfoTextColor()
|
||||||
|
{
|
||||||
|
// For the color of the additional info the inactive text color
|
||||||
|
// is not used as this might lead to unreadable text for some color schemes. Instead
|
||||||
|
// the text color is slightly mixed with the background color.
|
||||||
|
const QColor c1 = m_customTextColor ? *m_customTextColor : styleOption().palette.text().color();
|
||||||
|
const QColor c2 = styleOption().palette.background().color();
|
||||||
|
const int p1 = 70;
|
||||||
|
const int p2 = 100 - p1;
|
||||||
|
m_additionalInfoTextColor = QColor((c1.red() * p1 + c2.red() * p2) / 100,
|
||||||
|
(c1.green() * p1 + c2.green() * p2) / 100,
|
||||||
|
(c1.blue() * p1 + c2.blue() * p2) / 100);
|
||||||
|
}
|
||||||
|
|
||||||
QString KFileItemListWidget::roleText(TextId textId, const QVariant& roleValue) const
|
QString KFileItemListWidget::roleText(TextId textId, const QVariant& roleValue) const
|
||||||
{
|
{
|
||||||
QString text;
|
QString text;
|
||||||
|
|
|
@ -53,6 +53,9 @@ public:
|
||||||
virtual QRectF expansionToggleRect() const;
|
virtual QRectF expansionToggleRect() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
void setTextColor(const QColor& color);
|
||||||
|
QColor textColor() const;
|
||||||
|
|
||||||
virtual void dataChanged(const QHash<QByteArray, QVariant>& current, const QSet<QByteArray>& roles = QSet<QByteArray>());
|
virtual void dataChanged(const QHash<QByteArray, QVariant>& current, const QSet<QByteArray>& roles = QSet<QByteArray>());
|
||||||
virtual void visibleRolesChanged(const QHash<QByteArray, int>& current, const QHash<QByteArray, int>& previous);
|
virtual void visibleRolesChanged(const QHash<QByteArray, int>& current, const QHash<QByteArray, int>& previous);
|
||||||
virtual void visibleRolesSizesChanged(const QHash<QByteArray, QSizeF>& current, const QHash<QByteArray, QSizeF>& previous);
|
virtual void visibleRolesSizesChanged(const QHash<QByteArray, QSizeF>& current, const QHash<QByteArray, QSizeF>& previous);
|
||||||
|
@ -83,6 +86,8 @@ private:
|
||||||
void updateCompactLayoutTextCache();
|
void updateCompactLayoutTextCache();
|
||||||
void updateDetailsLayoutTextCache();
|
void updateDetailsLayoutTextCache();
|
||||||
|
|
||||||
|
void updateAdditionalInfoTextColor();
|
||||||
|
|
||||||
QString roleText(TextId textId, const QVariant& roleValue) const;
|
QString roleText(TextId textId, const QVariant& roleValue) const;
|
||||||
|
|
||||||
void drawPixmap(QPainter* painter, const QPixmap& pixmap);
|
void drawPixmap(QPainter* painter, const QPixmap& pixmap);
|
||||||
|
@ -111,6 +116,7 @@ private:
|
||||||
QList<QByteArray> m_sortedVisibleRoles;
|
QList<QByteArray> m_sortedVisibleRoles;
|
||||||
|
|
||||||
QRectF m_expansionArea;
|
QRectF m_expansionArea;
|
||||||
|
QColor* m_customTextColor;
|
||||||
QColor m_additionalInfoTextColor;
|
QColor m_additionalInfoTextColor;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -213,6 +213,15 @@ int KFileItemModel::index(const KFileItem& item) const
|
||||||
return m_items.value(item, -1);
|
return m_items.value(item, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
KUrl KFileItemModel::rootDirectory() const
|
||||||
|
{
|
||||||
|
const KDirLister* dirLister = m_dirLister.data();
|
||||||
|
if (dirLister) {
|
||||||
|
return dirLister->url();
|
||||||
|
}
|
||||||
|
return KUrl();
|
||||||
|
}
|
||||||
|
|
||||||
void KFileItemModel::clear()
|
void KFileItemModel::clear()
|
||||||
{
|
{
|
||||||
slotClear();
|
slotClear();
|
||||||
|
|
|
@ -89,6 +89,11 @@ public:
|
||||||
*/
|
*/
|
||||||
int index(const KFileItem& item) const;
|
int index(const KFileItem& item) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Root directory of all items.
|
||||||
|
*/
|
||||||
|
KUrl rootDirectory() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clears all items of the model.
|
* Clears all items of the model.
|
||||||
*/
|
*/
|
||||||
|
|
31
src/views/dolphinfileitemlistwidget.cpp
Normal file
31
src/views/dolphinfileitemlistwidget.cpp
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* Copyright (C) 2011 by Peter Penz <peter.penz19@gmail.com> *
|
||||||
|
* *
|
||||||
|
* This program is free software; you can redistribute it and/or modify *
|
||||||
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
|
* (at your option) any later version. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License *
|
||||||
|
* along with this program; if not, write to the *
|
||||||
|
* Free Software Foundation, Inc., *
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include "dolphinfileitemlistwidget.h"
|
||||||
|
|
||||||
|
DolphinFileItemListWidget::DolphinFileItemListWidget(QGraphicsItem* parent) :
|
||||||
|
KFileItemListWidget(parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
DolphinFileItemListWidget::~DolphinFileItemListWidget()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "dolphinfileitemlistwidget.moc"
|
38
src/views/dolphinfileitemlistwidget.h
Normal file
38
src/views/dolphinfileitemlistwidget.h
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* Copyright (C) 2011 by Peter Penz <peter.penz19@gmail.com> *
|
||||||
|
* *
|
||||||
|
* This program is free software; you can redistribute it and/or modify *
|
||||||
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
|
* (at your option) any later version. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License *
|
||||||
|
* along with this program; if not, write to the *
|
||||||
|
* Free Software Foundation, Inc., *
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#ifndef DOLPHINFILEITEMLISTWIDGET_H
|
||||||
|
#define DOLPHINFILEITEMLISTWIDGET_H
|
||||||
|
|
||||||
|
#include <libdolphin_export.h>
|
||||||
|
|
||||||
|
#include <kitemviews/kfileitemlistwidget.h>
|
||||||
|
|
||||||
|
class LIBDOLPHINPRIVATE_EXPORT DolphinFileItemListWidget : public KFileItemListWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
DolphinFileItemListWidget(QGraphicsItem* parent);
|
||||||
|
virtual ~DolphinFileItemListWidget();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,8 @@
|
||||||
#include "dolphin_detailsmodesettings.h"
|
#include "dolphin_detailsmodesettings.h"
|
||||||
#include "dolphin_compactmodesettings.h"
|
#include "dolphin_compactmodesettings.h"
|
||||||
|
|
||||||
|
#include "dolphinfileitemlistwidget.h"
|
||||||
|
|
||||||
#include <kitemviews/kfileitemlistview.h>
|
#include <kitemviews/kfileitemlistview.h>
|
||||||
#include <kitemviews/kfileitemmodel.h>
|
#include <kitemviews/kfileitemmodel.h>
|
||||||
#include <kitemviews/kitemlistcontroller.h>
|
#include <kitemviews/kitemlistcontroller.h>
|
||||||
|
@ -45,6 +47,7 @@ DolphinItemListContainer::DolphinItemListContainer(KDirLister* dirLister,
|
||||||
controller()->setModel(new KFileItemModel(dirLister, this));
|
controller()->setModel(new KFileItemModel(dirLister, this));
|
||||||
|
|
||||||
m_fileItemListView = new KFileItemListView();
|
m_fileItemListView = new KFileItemListView();
|
||||||
|
m_fileItemListView->setWidgetCreator(new KItemListWidgetCreator<DolphinFileItemListWidget>());
|
||||||
controller()->setView(m_fileItemListView);
|
controller()->setView(m_fileItemListView);
|
||||||
|
|
||||||
KItemListStyleOption option;
|
KItemListStyleOption option;
|
||||||
|
|
|
@ -65,6 +65,7 @@
|
||||||
#include "draganddrophelper.h"
|
#include "draganddrophelper.h"
|
||||||
#include "renamedialog.h"
|
#include "renamedialog.h"
|
||||||
#include "settings/dolphinsettings.h"
|
#include "settings/dolphinsettings.h"
|
||||||
|
#include "versioncontrol/versioncontrolobserver.h"
|
||||||
#include "viewmodecontroller.h"
|
#include "viewmodecontroller.h"
|
||||||
#include "viewproperties.h"
|
#include "viewproperties.h"
|
||||||
#include "views/tooltips/tooltipmanager.h"
|
#include "views/tooltips/tooltipmanager.h"
|
||||||
|
@ -92,7 +93,8 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) :
|
||||||
m_currentItemIndex(-1),
|
m_currentItemIndex(-1),
|
||||||
m_restoredContentsPosition(),
|
m_restoredContentsPosition(),
|
||||||
m_createdItemUrl(),
|
m_createdItemUrl(),
|
||||||
m_selectedItems()
|
m_selectedItems(),
|
||||||
|
m_versionControlObserver(0)
|
||||||
{
|
{
|
||||||
m_topLayout = new QVBoxLayout(this);
|
m_topLayout = new QVBoxLayout(this);
|
||||||
m_topLayout->setSpacing(0);
|
m_topLayout->setSpacing(0);
|
||||||
|
@ -176,6 +178,7 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) :
|
||||||
connect(controller, SIGNAL(itemHovered(int)), this, SLOT(slotItemHovered(int)));
|
connect(controller, SIGNAL(itemHovered(int)), this, SLOT(slotItemHovered(int)));
|
||||||
connect(controller, SIGNAL(itemUnhovered(int)), this, SLOT(slotItemUnhovered(int)));
|
connect(controller, SIGNAL(itemUnhovered(int)), this, SLOT(slotItemUnhovered(int)));
|
||||||
connect(controller, SIGNAL(itemDropEvent(int,QGraphicsSceneDragDropEvent*)), this, SLOT(slotItemDropEvent(int,QGraphicsSceneDragDropEvent*)));
|
connect(controller, SIGNAL(itemDropEvent(int,QGraphicsSceneDragDropEvent*)), this, SLOT(slotItemDropEvent(int,QGraphicsSceneDragDropEvent*)));
|
||||||
|
connect(controller, SIGNAL(modelChanged(KItemModelBase*,KItemModelBase*)), this, SLOT(slotModelChanged(KItemModelBase*,KItemModelBase*)));
|
||||||
|
|
||||||
KItemListSelectionManager* selectionManager = controller->selectionManager();
|
KItemListSelectionManager* selectionManager = controller->selectionManager();
|
||||||
connect(selectionManager, SIGNAL(selectionChanged(QSet<int>,QSet<int>)),
|
connect(selectionManager, SIGNAL(selectionChanged(QSet<int>,QSet<int>)),
|
||||||
|
@ -183,6 +186,12 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) :
|
||||||
|
|
||||||
m_toolTipManager = new ToolTipManager(this);
|
m_toolTipManager = new ToolTipManager(this);
|
||||||
|
|
||||||
|
m_versionControlObserver = new VersionControlObserver(this);
|
||||||
|
m_versionControlObserver->setModel(fileItemModel());
|
||||||
|
connect(m_versionControlObserver, SIGNAL(infoMessage(QString)), this, SIGNAL(infoMessage(QString)));
|
||||||
|
connect(m_versionControlObserver, SIGNAL(errorMessage(QString)), this, SIGNAL(errorMessage(QString)));
|
||||||
|
connect(m_versionControlObserver, SIGNAL(operationCompletedMessage(QString)), this, SIGNAL(operationCompletedMessage(QString)));
|
||||||
|
|
||||||
applyViewProperties();
|
applyViewProperties();
|
||||||
m_topLayout->addWidget(m_container);
|
m_topLayout->addWidget(m_container);
|
||||||
|
|
||||||
|
@ -793,6 +802,15 @@ void DolphinView::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* even
|
||||||
DragAndDropHelper::dropUrls(destItem, url(), &dropEvent, this);
|
DragAndDropHelper::dropUrls(destItem, url(), &dropEvent, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DolphinView::slotModelChanged(KItemModelBase* current, KItemModelBase* previous)
|
||||||
|
{
|
||||||
|
Q_UNUSED(previous);
|
||||||
|
Q_ASSERT(qobject_cast<KFileItemModel*>(current));
|
||||||
|
|
||||||
|
KFileItemModel* fileItemModel = static_cast<KFileItemModel*>(current);
|
||||||
|
m_versionControlObserver->setModel(fileItemModel);
|
||||||
|
}
|
||||||
|
|
||||||
void DolphinView::slotSelectionChanged(const QSet<int>& current, const QSet<int>& previous)
|
void DolphinView::slotSelectionChanged(const QSet<int>& current, const QSet<int>& previous)
|
||||||
{
|
{
|
||||||
const int currentCount = current.count();
|
const int currentCount = current.count();
|
||||||
|
|
|
@ -44,8 +44,10 @@ class DolphinItemListContainer;
|
||||||
class KAction;
|
class KAction;
|
||||||
class KActionCollection;
|
class KActionCollection;
|
||||||
class KFileItemModel;
|
class KFileItemModel;
|
||||||
|
class KItemModelBase;
|
||||||
class KUrl;
|
class KUrl;
|
||||||
class ToolTipManager;
|
class ToolTipManager;
|
||||||
|
class VersionControlObserver;
|
||||||
class ViewProperties;
|
class ViewProperties;
|
||||||
class QGraphicsSceneDragDropEvent;
|
class QGraphicsSceneDragDropEvent;
|
||||||
class QRegExp;
|
class QRegExp;
|
||||||
|
@ -560,6 +562,7 @@ private slots:
|
||||||
void slotItemHovered(int index);
|
void slotItemHovered(int index);
|
||||||
void slotItemUnhovered(int index);
|
void slotItemUnhovered(int index);
|
||||||
void slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* event);
|
void slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* event);
|
||||||
|
void slotModelChanged(KItemModelBase* current, KItemModelBase* previous);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Emits the signal \a selectionChanged() with a small delay. This is
|
* Emits the signal \a selectionChanged() with a small delay. This is
|
||||||
|
@ -756,6 +759,8 @@ private:
|
||||||
KUrl m_createdItemUrl; // URL for a new item that got created by the "Create New..." menu
|
KUrl m_createdItemUrl; // URL for a new item that got created by the "Create New..." menu
|
||||||
KFileItemList m_selectedItems; // this is used for making the View to remember selections after F5
|
KFileItemList m_selectedItems; // this is used for making the View to remember selections after F5
|
||||||
|
|
||||||
|
VersionControlObserver* m_versionControlObserver;
|
||||||
|
|
||||||
// For unit tests
|
// For unit tests
|
||||||
friend class TestBase;
|
friend class TestBase;
|
||||||
friend class DolphinDetailsViewTest;
|
friend class DolphinDetailsViewTest;
|
||||||
|
|
|
@ -25,40 +25,25 @@
|
||||||
#include <KLocale>
|
#include <KLocale>
|
||||||
#include <KService>
|
#include <KService>
|
||||||
#include <KServiceTypeTrader>
|
#include <KServiceTypeTrader>
|
||||||
|
#include <kitemviews/kfileitemmodel.h>
|
||||||
#include <kversioncontrolplugin.h>
|
#include <kversioncontrolplugin.h>
|
||||||
|
|
||||||
#include "pendingthreadsmaintainer.h"
|
#include "pendingthreadsmaintainer.h"
|
||||||
#include "updateitemstatesthread.h"
|
#include "updateitemstatesthread.h"
|
||||||
|
|
||||||
#include <QAbstractProxyModel>
|
|
||||||
#include <QAbstractItemView>
|
|
||||||
#include <QMutexLocker>
|
#include <QMutexLocker>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
VersionControlObserver::VersionControlObserver(QWidget* view) :
|
VersionControlObserver::VersionControlObserver(QObject* parent) :
|
||||||
QObject(view),
|
QObject(parent),
|
||||||
m_pendingItemStatesUpdate(false),
|
m_pendingItemStatesUpdate(false),
|
||||||
m_versionedDirectory(false),
|
m_versionedDirectory(false),
|
||||||
m_silentUpdate(false),
|
m_silentUpdate(false),
|
||||||
m_view(view),
|
m_model(0),
|
||||||
//m_dirLister(0),
|
|
||||||
//m_dolphinModel(0),
|
|
||||||
m_dirVerificationTimer(0),
|
m_dirVerificationTimer(0),
|
||||||
m_plugin(0),
|
m_plugin(0),
|
||||||
m_updateItemStatesThread(0)
|
m_updateItemStatesThread(0)
|
||||||
{
|
{
|
||||||
Q_ASSERT(view);
|
|
||||||
|
|
||||||
/*QAbstractProxyModel* proxyModel = qobject_cast<QAbstractProxyModel*>(view->model());
|
|
||||||
m_dolphinModel = proxyModel ?
|
|
||||||
qobject_cast<DolphinModel*>(proxyModel->sourceModel()) :
|
|
||||||
qobject_cast<DolphinModel*>(view->model());
|
|
||||||
|
|
||||||
if (m_dolphinModel) {
|
|
||||||
m_dirLister = m_dolphinModel->dirLister();
|
|
||||||
connect(m_dirLister, SIGNAL(completed()),
|
|
||||||
this, SLOT(delayedDirectoryVerification()));
|
|
||||||
|
|
||||||
// The verification timer specifies the timeout until the shown directory
|
// The verification timer specifies the timeout until the shown directory
|
||||||
// is checked whether it is versioned. Per default it is assumed that users
|
// is checked whether it is versioned. Per default it is assumed that users
|
||||||
// don't iterate through versioned directories and a high timeout is used
|
// don't iterate through versioned directories and a high timeout is used
|
||||||
|
@ -69,7 +54,6 @@ VersionControlObserver::VersionControlObserver(QWidget* view) :
|
||||||
m_dirVerificationTimer->setInterval(500);
|
m_dirVerificationTimer->setInterval(500);
|
||||||
connect(m_dirVerificationTimer, SIGNAL(timeout()),
|
connect(m_dirVerificationTimer, SIGNAL(timeout()),
|
||||||
this, SLOT(verifyDirectory()));
|
this, SLOT(verifyDirectory()));
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VersionControlObserver::~VersionControlObserver()
|
VersionControlObserver::~VersionControlObserver()
|
||||||
|
@ -96,6 +80,26 @@ VersionControlObserver::~VersionControlObserver()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VersionControlObserver::setModel(KFileItemModel* model)
|
||||||
|
{
|
||||||
|
if (m_model) {
|
||||||
|
disconnect(m_model, SIGNAL(itemsInserted(KItemRangeList)),
|
||||||
|
this, SLOT(delayedDirectoryVerification()));
|
||||||
|
}
|
||||||
|
|
||||||
|
m_model = model;
|
||||||
|
|
||||||
|
if (model) {
|
||||||
|
connect(m_model, SIGNAL(itemsInserted(KItemRangeList)),
|
||||||
|
this, SLOT(delayedDirectoryVerification()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
KFileItemModel* VersionControlObserver::model() const
|
||||||
|
{
|
||||||
|
return m_model;
|
||||||
|
}
|
||||||
|
|
||||||
QList<QAction*> VersionControlObserver::contextMenuActions(const KFileItemList& items) const
|
QList<QAction*> VersionControlObserver::contextMenuActions(const KFileItemList& items) const
|
||||||
{
|
{
|
||||||
QList<QAction*> actions;
|
QList<QAction*> actions;
|
||||||
|
@ -131,7 +135,11 @@ void VersionControlObserver::silentDirectoryVerification()
|
||||||
|
|
||||||
void VersionControlObserver::verifyDirectory()
|
void VersionControlObserver::verifyDirectory()
|
||||||
{
|
{
|
||||||
const KUrl versionControlUrl; // = m_dirLister->url();
|
if (!m_model) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const KUrl versionControlUrl = m_model->rootDirectory();
|
||||||
if (!versionControlUrl.isLocalFile()) {
|
if (!versionControlUrl.isLocalFile()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -141,7 +149,7 @@ void VersionControlObserver::verifyDirectory()
|
||||||
}
|
}
|
||||||
|
|
||||||
m_plugin = searchPlugin(versionControlUrl);
|
m_plugin = searchPlugin(versionControlUrl);
|
||||||
/*if (m_plugin) {
|
if (m_plugin) {
|
||||||
connect(m_plugin, SIGNAL(versionStatesChanged()),
|
connect(m_plugin, SIGNAL(versionStatesChanged()),
|
||||||
this, SLOT(silentDirectoryVerification()));
|
this, SLOT(silentDirectoryVerification()));
|
||||||
connect(m_plugin, SIGNAL(infoMessage(QString)),
|
connect(m_plugin, SIGNAL(infoMessage(QString)),
|
||||||
|
@ -157,9 +165,7 @@ void VersionControlObserver::verifyDirectory()
|
||||||
// The directory is versioned. Assume that the user will further browse through
|
// The directory is versioned. Assume that the user will further browse through
|
||||||
// versioned directories and decrease the verification timer.
|
// versioned directories and decrease the verification timer.
|
||||||
m_dirVerificationTimer->setInterval(100);
|
m_dirVerificationTimer->setInterval(100);
|
||||||
connect(m_dirLister, SIGNAL(refreshItems(QList<QPair<KFileItem,KFileItem> >)),
|
connect(m_model, SIGNAL(itemsInserted(KItemRangeList)),
|
||||||
this, SLOT(delayedDirectoryVerification()));
|
|
||||||
connect(m_dirLister, SIGNAL(newItems(KFileItemList)),
|
|
||||||
this, SLOT(delayedDirectoryVerification()));
|
this, SLOT(delayedDirectoryVerification()));
|
||||||
}
|
}
|
||||||
updateItemStates();
|
updateItemStates();
|
||||||
|
@ -170,11 +176,9 @@ void VersionControlObserver::verifyDirectory()
|
||||||
// value, so that browsing through non-versioned directories is not slown down
|
// value, so that browsing through non-versioned directories is not slown down
|
||||||
// by an immediate verification.
|
// by an immediate verification.
|
||||||
m_dirVerificationTimer->setInterval(500);
|
m_dirVerificationTimer->setInterval(500);
|
||||||
disconnect(m_dirLister, SIGNAL(refreshItems(QList<QPair<KFileItem,KFileItem> >)),
|
disconnect(m_model, SIGNAL(itemsInserted(KItemRangeList)),
|
||||||
this, SLOT(delayedDirectoryVerification()));
|
this, SLOT(delayedDirectoryVerification()));
|
||||||
disconnect(m_dirLister, SIGNAL(newItems(KFileItemList)),
|
}
|
||||||
this, SLOT(delayedDirectoryVerification()));
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void VersionControlObserver::slotThreadFinished()
|
void VersionControlObserver::slotThreadFinished()
|
||||||
|
@ -184,28 +188,18 @@ void VersionControlObserver::slotThreadFinished()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_updateItemStatesThread->retrievedItems()) {
|
if (!m_updateItemStatesThread->retrievedItems()) {
|
||||||
// ignore m_silentUpdate for an error message
|
// Ignore m_silentUpdate for an error message
|
||||||
emit errorMessage(i18nc("@info:status", "Update of version information failed."));
|
emit errorMessage(i18nc("@info:status", "Update of version information failed."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// QAbstractItemModel::setData() triggers a bottleneck in combination with QListView
|
|
||||||
// (a detailed description of the root cause is given in the class KFilePreviewGenerator
|
|
||||||
// from kdelibs). To bypass this bottleneck, the signals of the model are temporary blocked.
|
|
||||||
// This works as the update of the data does not require a relayout of the views used in Dolphin.
|
|
||||||
/*const bool signalsBlocked = m_dolphinModel->signalsBlocked();
|
|
||||||
m_dolphinModel->blockSignals(true);
|
|
||||||
|
|
||||||
const QList<ItemState> itemStates = m_updateItemStatesThread->itemStates();
|
const QList<ItemState> itemStates = m_updateItemStatesThread->itemStates();
|
||||||
foreach (const ItemState& itemState, itemStates) {
|
foreach (const ItemState& itemState, itemStates) {
|
||||||
m_dolphinModel->setData(itemState.index,
|
QHash<QByteArray, QVariant> values;
|
||||||
QVariant(static_cast<int>(itemState.version)),
|
values.insert("version", QVariant(static_cast<int>(itemState.version)));
|
||||||
Qt::DecorationRole);
|
m_model->setData(itemState.index, values);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_dolphinModel->blockSignals(signalsBlocked);
|
|
||||||
m_view->viewport()->repaint();
|
|
||||||
|
|
||||||
if (!m_silentUpdate) {
|
if (!m_silentUpdate) {
|
||||||
// Using an empty message results in clearing the previously shown information message and showing
|
// Using an empty message results in clearing the previously shown information message and showing
|
||||||
// the default status bar information. This is useful as the user already gets feedback that the
|
// the default status bar information. This is useful as the user already gets feedback that the
|
||||||
|
@ -216,7 +210,7 @@ void VersionControlObserver::slotThreadFinished()
|
||||||
if (m_pendingItemStatesUpdate) {
|
if (m_pendingItemStatesUpdate) {
|
||||||
m_pendingItemStatesUpdate = false;
|
m_pendingItemStatesUpdate = false;
|
||||||
updateItemStates();
|
updateItemStates();
|
||||||
}*/
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VersionControlObserver::updateItemStates()
|
void VersionControlObserver::updateItemStates()
|
||||||
|
@ -235,7 +229,7 @@ void VersionControlObserver::updateItemStates()
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<ItemState> itemStates;
|
QList<ItemState> itemStates;
|
||||||
addDirectory(QModelIndex(), itemStates);
|
//addDirectory(QModelIndex(), itemStates);
|
||||||
if (!itemStates.isEmpty()) {
|
if (!itemStates.isEmpty()) {
|
||||||
if (!m_silentUpdate) {
|
if (!m_silentUpdate) {
|
||||||
emit infoMessage(i18nc("@info:status", "Updating version information..."));
|
emit infoMessage(i18nc("@info:status", "Updating version information..."));
|
||||||
|
@ -245,11 +239,11 @@ void VersionControlObserver::updateItemStates()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VersionControlObserver::addDirectory(const QModelIndex& parentIndex, QList<ItemState>& itemStates)
|
/*void VersionControlObserver::addDirectory(const QModelIndex& parentIndex, QList<ItemState>& itemStates)
|
||||||
{
|
{
|
||||||
Q_UNUSED(parentIndex);
|
Q_UNUSED(parentIndex);
|
||||||
Q_UNUSED(itemStates);
|
Q_UNUSED(itemStates);
|
||||||
/*const int rowCount = m_dolphinModel->rowCount(parentIndex);
|
const int rowCount = m_dolphinModel->rowCount(parentIndex);
|
||||||
for (int row = 0; row < rowCount; ++row) {
|
for (int row = 0; row < rowCount; ++row) {
|
||||||
const QModelIndex index = m_dolphinModel->index(row, DolphinModel::Version, parentIndex);
|
const QModelIndex index = m_dolphinModel->index(row, DolphinModel::Version, parentIndex);
|
||||||
addDirectory(index, itemStates);
|
addDirectory(index, itemStates);
|
||||||
|
@ -260,8 +254,8 @@ void VersionControlObserver::addDirectory(const QModelIndex& parentIndex, QList<
|
||||||
itemState.version = KVersionControlPlugin::UnversionedVersion;
|
itemState.version = KVersionControlPlugin::UnversionedVersion;
|
||||||
|
|
||||||
itemStates.append(itemState);
|
itemStates.append(itemState);
|
||||||
}*/
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
KVersionControlPlugin* VersionControlObserver::searchPlugin(const KUrl& directory) const
|
KVersionControlPlugin* VersionControlObserver::searchPlugin(const KUrl& directory) const
|
||||||
{
|
{
|
||||||
|
@ -297,12 +291,12 @@ KVersionControlPlugin* VersionControlObserver::searchPlugin(const KUrl& director
|
||||||
// Verify whether the current directory contains revision information
|
// Verify whether the current directory contains revision information
|
||||||
// like .svn, .git, ...
|
// like .svn, .git, ...
|
||||||
Q_UNUSED(directory);
|
Q_UNUSED(directory);
|
||||||
/*foreach (KVersionControlPlugin* plugin, plugins) {
|
foreach (KVersionControlPlugin* plugin, plugins) {
|
||||||
// Use the KDirLister cache to check for .svn, .git, ... files
|
// Use the KDirLister cache to check for .svn, .git, ... files
|
||||||
KUrl dirUrl(directory);
|
KUrl dirUrl(directory);
|
||||||
KUrl fileUrl = dirUrl;
|
KUrl fileUrl = dirUrl;
|
||||||
fileUrl.addPath(plugin->fileName());
|
fileUrl.addPath(plugin->fileName());
|
||||||
const KFileItem item = m_dirLister->findByUrl(fileUrl);
|
const KFileItem item; // = m_dirLister->findByUrl(fileUrl);
|
||||||
if (!item.isNull()) {
|
if (!item.isNull()) {
|
||||||
return plugin;
|
return plugin;
|
||||||
}
|
}
|
||||||
|
@ -325,7 +319,7 @@ KVersionControlPlugin* VersionControlObserver::searchPlugin(const KUrl& director
|
||||||
upUrl = dirUrl.upUrl();
|
upUrl = dirUrl.upUrl();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}*/
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,13 +27,10 @@
|
||||||
#include <QList>
|
#include <QList>
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QPersistentModelIndex>
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
|
||||||
class DolphinModel;
|
|
||||||
class KDirLister;
|
|
||||||
class KFileItemList;
|
class KFileItemList;
|
||||||
class QAbstractItemView;
|
class KFileItemModel;
|
||||||
class QAction;
|
class QAction;
|
||||||
class QTimer;
|
class QTimer;
|
||||||
class UpdateItemStatesThread;
|
class UpdateItemStatesThread;
|
||||||
|
@ -41,8 +38,8 @@ class UpdateItemStatesThread;
|
||||||
/**
|
/**
|
||||||
* @brief Observes all version control plugins.
|
* @brief Observes all version control plugins.
|
||||||
*
|
*
|
||||||
* The item view gets updated automatically if the currently shown
|
* The items of the directory-model get updated automatically if the currently
|
||||||
* directory is under version control.
|
* shown directory is under version control.
|
||||||
*
|
*
|
||||||
* @see VersionControlPlugin
|
* @see VersionControlPlugin
|
||||||
*/
|
*/
|
||||||
|
@ -51,9 +48,12 @@ class LIBDOLPHINPRIVATE_EXPORT VersionControlObserver : public QObject
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
VersionControlObserver(QWidget* parent);
|
explicit VersionControlObserver(QObject* parent = 0);
|
||||||
virtual ~VersionControlObserver();
|
virtual ~VersionControlObserver();
|
||||||
|
|
||||||
|
void setModel(KFileItemModel* model);
|
||||||
|
KFileItemModel* model() const;
|
||||||
|
|
||||||
QList<QAction*> contextMenuActions(const KFileItemList& items) const;
|
QList<QAction*> contextMenuActions(const KFileItemList& items) const;
|
||||||
QList<QAction*> contextMenuActions(const QString& directory) const;
|
QList<QAction*> contextMenuActions(const QString& directory) const;
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ private slots:
|
||||||
private:
|
private:
|
||||||
struct ItemState
|
struct ItemState
|
||||||
{
|
{
|
||||||
QPersistentModelIndex index;
|
int index;
|
||||||
KFileItem item;
|
KFileItem item;
|
||||||
KVersionControlPlugin::VersionState version;
|
KVersionControlPlugin::VersionState version;
|
||||||
};
|
};
|
||||||
|
@ -114,7 +114,7 @@ private:
|
||||||
* Adds recursively all items from the directory \p parentIndex into
|
* Adds recursively all items from the directory \p parentIndex into
|
||||||
* the list \p itemStates.
|
* the list \p itemStates.
|
||||||
*/
|
*/
|
||||||
void addDirectory(const QModelIndex& parentIndex, QList<ItemState>& itemStates);
|
//void addDirectory(const QModelIndex& parentIndex, QList<ItemState>& itemStates);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a matching plugin for the given directory.
|
* Returns a matching plugin for the given directory.
|
||||||
|
@ -133,9 +133,7 @@ private:
|
||||||
bool m_silentUpdate; // if true, no messages will be send during the update
|
bool m_silentUpdate; // if true, no messages will be send during the update
|
||||||
// of version states
|
// of version states
|
||||||
|
|
||||||
QWidget* m_view;
|
KFileItemModel* m_model;
|
||||||
//KDirLister* m_dirLister;
|
|
||||||
//DolphinModel* m_dolphinModel;
|
|
||||||
|
|
||||||
QTimer* m_dirVerificationTimer;
|
QTimer* m_dirVerificationTimer;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue