]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/views/dolphinview.cpp
Fix crash when expanding/closing a sub-tree
[dolphin.git] / src / views / dolphinview.cpp
index d00c5c0770aff15960f3a8c582e7b22594b6980d..7cb594d8e91c825e2a90e67737c1cd745c863ac5 100644 (file)
 
 #include <QAbstractItemView>
 #include <QApplication>
+#include <QBoxLayout>
 #include <QClipboard>
+#include <QDropEvent>
+#include <QGraphicsSceneDragDropEvent>
 #include <QKeyEvent>
 #include <QItemSelection>
-#include <QBoxLayout>
 #include <QTimer>
 #include <QScrollBar>
 
 #include <KActionCollection>
 #include <KColorScheme>
 #include <KDirLister>
+#include <KDirModel>
 #include <KIconEffect>
 #include <KFileItem>
 #include <KFileItemListProperties>
 #include "dolphin_detailsmodesettings.h"
 #include "dolphin_generalsettings.h"
 #include "dolphinitemlistcontainer.h"
+#include "draganddrophelper.h"
 #include "renamedialog.h"
 #include "settings/dolphinsettings.h"
+#include "versioncontrol/versioncontrolobserver.h"
 #include "viewmodecontroller.h"
 #include "viewproperties.h"
 #include "views/tooltips/tooltipmanager.h"
@@ -88,7 +93,8 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) :
     m_currentItemIndex(-1),
     m_restoredContentsPosition(),
     m_createdItemUrl(),
-    m_selectedItems()
+    m_selectedItems(),
+    m_versionControlObserver(0)
 {
     m_topLayout = new QVBoxLayout(this);
     m_topLayout->setSpacing(0);
@@ -171,6 +177,8 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) :
     connect(controller, SIGNAL(itemExpansionToggleClicked(int)), this, SLOT(slotItemExpansionToggleClicked(int)));
     connect(controller, SIGNAL(itemHovered(int)), this, SLOT(slotItemHovered(int)));
     connect(controller, SIGNAL(itemUnhovered(int)), this, SLOT(slotItemUnhovered(int)));
+    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();
     connect(selectionManager, SIGNAL(selectionChanged(QSet<int>,QSet<int>)),
@@ -178,6 +186,12 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) :
 
     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();
     m_topLayout->addWidget(m_container);
 
@@ -504,8 +518,16 @@ QString DolphinView::statusBarText() const
 
 QList<QAction*> DolphinView::versionControlActions(const KFileItemList& items) const
 {
-    Q_UNUSED(items);
-    return QList<QAction*>(); //m_dolphinViewController->versionControlActions(items);
+    QList<QAction*> actions;
+
+    if (items.isEmpty()) {
+        const KFileItem item = fileItemModel()->rootItem();
+        actions = m_versionControlObserver->actions(KFileItemList() << item);
+    } else {
+        actions = m_versionControlObserver->actions(items);
+    }
+
+    return actions;
 }
 
 void DolphinView::setUrl(const KUrl& url)
@@ -702,18 +724,21 @@ void DolphinView::activate()
 
 void DolphinView::slotItemActivated(int index)
 {
-    KFileItemList items = selectedItems();
-    if (items.isEmpty())
+    Q_UNUSED(index);
+
+    const KFileItemList items = selectedItems();
+    if (items.isEmpty()) {
         return;
+    }
+
     if (items.count() == 1) {
         emit itemActivated(items.at(0)); // caught by DolphinViewContainer or DolphinPart
-    }
-    else {
-        foreach (const KFileItem& fileItem, items) {
-            if (fileItem.isDir()) {
-                emit tabRequested(fileItem.url());
+    } else {
+        foreach (const KFileItem& item, items) {
+            if (item.isDir()) {
+                emit tabRequested(item.url());
             } else {
-                emit itemActivated(fileItem);
+                emit itemActivated(item);
             }
         }
     }
@@ -772,6 +797,28 @@ void DolphinView::slotItemUnhovered(int index)
     emit requestItemInfo(KFileItem());
 }
 
+void DolphinView::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* event)
+{
+    const KFileItem destItem = fileItemModel()->fileItem(index);
+
+    QDropEvent dropEvent(event->pos().toPoint(),
+                         event->possibleActions(),
+                         event->mimeData(),
+                         event->buttons(),
+                         event->modifiers());
+
+    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)
 {
     const int currentCount = current.count();
@@ -862,7 +909,7 @@ bool DolphinView::isTabsForFilesEnabled() const
 
 bool DolphinView::itemsExpandable() const
 {
-    return false; //m_viewAccessor.itemsExpandable();
+    return m_mode == DetailsView;
 }
 
 void DolphinView::restoreState(QDataStream& stream)
@@ -1172,18 +1219,17 @@ void DolphinView::updateZoomLevel(int oldZoomLevel)
 
 KUrl::List DolphinView::simplifiedSelectedUrls() const
 {
-    Q_ASSERT(false); // TODO
     KUrl::List urls;
-/*
+
     const KFileItemList items = selectedItems();
     foreach (const KFileItem &item, items) {
         urls.append(item.url());
     }
 
-
     if (itemsExpandable()) {
+        // TODO: Check if we still need KDirModel for this in KDE 5.0
         urls = KDirModel::simplifiedUrlList(urls);
-    }*/
+    }
 
     return urls;
 }