]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/sidebartreeview.cpp
Forwardport 773570:
[dolphin.git] / src / sidebartreeview.cpp
index 30ad6b169a16fee214b8fe79415aeb6f205a620f..d580cbf6de2c453f5775fa21edcbfb802f15902c 100644 (file)
 
 #include "sidebartreeview.h"
 
-#include <kdirmodel.h>
-#include <kfileitemdelegate.h>
+#include "dolphincontroller.h"
+#include "dolphinmodel.h"
+#include "draganddrophelper.h"
 
-#include <QDragEnterEvent>
-#include <QDropEvent>
+#include <kfileitemdelegate.h>
+#include <QKeyEvent>
+#include <QPainter>
 #include <QHeaderView>
+#include <QScrollBar>
 
 SidebarTreeView::SidebarTreeView(QWidget* parent) :
-        QTreeView(parent)
+    QTreeView(parent),
+    m_dragging(false)
 {
     setAcceptDrops(true);
     setUniformRowHeights(true);
@@ -35,42 +39,111 @@ SidebarTreeView::SidebarTreeView(QWidget* parent) :
     setEditTriggers(QAbstractItemView::NoEditTriggers);
     setSortingEnabled(true);
     setFrameStyle(QFrame::NoFrame);
+    setDragDropMode(QAbstractItemView::DragDrop);
+    setDropIndicatorShown(false);
+    setAutoExpandDelay(300);
+
+// TODO: Remove this check when 4.3.2 is released and KDE requires it... this
+//       check avoids a division by zero happening on versions before 4.3.1.
+//       Right now KDE in theory can be shipped with Qt 4.3.0 and above.
+//       ereslibre
+#if (QT_VERSION >= QT_VERSION_CHECK(4, 3, 2) || defined(QT_KDE_QT_COPY))
+    setVerticalScrollMode(QListView::ScrollPerPixel);
+    setHorizontalScrollMode(QListView::ScrollPerPixel);
+#endif
 
     viewport()->setAttribute(Qt::WA_Hover);
 
+    QPalette palette = viewport()->palette();
+    palette.setColor(viewport()->backgroundRole(), Qt::transparent);
+    viewport()->setPalette(palette);
+
     KFileItemDelegate* delegate = new KFileItemDelegate(this);
     setItemDelegate(delegate);
 }
 
 SidebarTreeView::~SidebarTreeView()
-{}
+{
+}
 
 bool SidebarTreeView::event(QEvent* event)
 {
     if (event->type() == QEvent::Polish) {
         // hide all columns except of the 'Name' column
-        hideColumn(KDirModel::Size);
-        hideColumn(KDirModel::ModifiedTime);
-        hideColumn(KDirModel::Permissions);
-        hideColumn(KDirModel::Owner);
-        hideColumn(KDirModel::Group);
+        hideColumn(DolphinModel::Size);
+        hideColumn(DolphinModel::ModifiedTime);
+        hideColumn(DolphinModel::Permissions);
+        hideColumn(DolphinModel::Owner);
+        hideColumn(DolphinModel::Group);
+        hideColumn(DolphinModel::Type);
+        hideColumn(DolphinModel::Rating);
+        hideColumn(DolphinModel::Tags);
         header()->hide();
     }
+    else if (event->type() == QEvent::UpdateRequest) {
+        // TODO: Remove this check when 4.3.2 is released and KDE requires it... this
+        //       check avoids a division by zero happening on versions before 4.3.1.
+        //       Right now KDE in theory can be shipped with Qt 4.3.0 and above.
+        //       ereslibre
+#if (QT_VERSION >= QT_VERSION_CHECK(4, 3, 2) || defined(QT_KDE_QT_COPY))
+        // a wheel movement will scroll 1 item
+        if (model()->rowCount() > 0) {
+            verticalScrollBar()->setSingleStep(sizeHintForRow(0) / 3);
+        }
+#endif
+    }
+    else if (event->type() == QEvent::MetaCall) {
+        resizeColumnToContents(DolphinModel::Name);
+    }
 
     return QTreeView::event(event);
 }
 
+void SidebarTreeView::startDrag(Qt::DropActions supportedActions)
+{
+    DragAndDropHelper::startDrag(this, supportedActions);
+}
+
 void SidebarTreeView::dragEnterEvent(QDragEnterEvent* event)
 {
+    QTreeView::dragEnterEvent(event);
+
     if (event->mimeData()->hasUrls()) {
         event->acceptProposedAction();
     }
+
+    m_dragging = true;
+}
+
+void SidebarTreeView::dragLeaveEvent(QDragLeaveEvent* event)
+{
+    QTreeView::dragLeaveEvent(event);
+
+    // TODO: remove this code when the issue #160611 is solved in Qt 4.4
+    m_dragging = false;
+    setDirtyRegion(m_dropRect);
+}
+
+void SidebarTreeView::dragMoveEvent(QDragMoveEvent* event)
+{
+    QTreeView::dragMoveEvent(event);
+
+    // TODO: remove this code when the issue #160611 is solved in Qt 4.4
+    const QModelIndex index = indexAt(event->pos());
+    setDirtyRegion(m_dropRect);
+    m_dropRect = visualRect(index);
+    setDirtyRegion(m_dropRect);
+
+    if (event->mimeData()->hasUrls()) {
+        // accept url drops, independently from the destination item
+        event->acceptProposedAction();
+    }
 }
 
 void SidebarTreeView::dropEvent(QDropEvent* event)
 {
     const KUrl::List urls = KUrl::List::fromMimeData(event->mimeData());
-    if (urls.isEmpty() || (event->source() == this)) {
+    if (urls.isEmpty()) {
         QTreeView::dropEvent(event);
     } else {
         event->acceptProposedAction();
@@ -79,6 +152,18 @@ void SidebarTreeView::dropEvent(QDropEvent* event)
             emit urlsDropped(urls, index);
         }
     }
+    m_dragging = false;
+}
+
+void SidebarTreeView::paintEvent(QPaintEvent* event)
+{
+    QTreeView::paintEvent(event);
+
+    // TODO: remove this code when the issue #160611 is solved in Qt 4.4
+    if (m_dragging) {
+        const QBrush& brush = palette().brush(QPalette::Normal, QPalette::Highlight);
+        DragAndDropHelper::drawHoverIndication(this, m_dropRect, brush);
+    }
 }
 
 #include "sidebartreeview.moc"