]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/views/dolphinview.cpp
Allow custom sorting of details-view columns
[dolphin.git] / src / views / dolphinview.cpp
index 661ce101bbe7f4c55e9d918eb4d893a875dd6c6d..148459f68ced3750931ec11b095558cc55bdad46 100644 (file)
@@ -81,6 +81,7 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) :
     m_tabsForFiles(false),
     m_assureVisibleCurrentIndex(false),
     m_isFolderWritable(true),
+    m_dragging(false),
     m_url(url),
     m_mode(DolphinView::IconsView),
     m_additionalInfoList(),
@@ -155,10 +156,13 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) :
     }
 
     KItemListView* view = controller->view();
+    view->installEventFilter(this);
     connect(view, SIGNAL(sortOrderChanged(Qt::SortOrder,Qt::SortOrder)),
             this, SLOT(slotSortOrderChangedByHeader(Qt::SortOrder,Qt::SortOrder)));
     connect(view, SIGNAL(sortRoleChanged(QByteArray,QByteArray)),
             this, SLOT(slotSortRoleChangedByHeader(QByteArray,QByteArray)));
+    connect(view, SIGNAL(visibleRolesChanged(QList<QByteArray>,QList<QByteArray>)),
+            this, SLOT(slotVisibleRolesChangedByHeader(QList<QByteArray>,QList<QByteArray>)));
 
     KItemListSelectionManager* selectionManager = controller->selectionManager();
     connect(selectionManager, SIGNAL(selectionChanged(QSet<int>,QSet<int>)),
@@ -449,11 +453,11 @@ void DolphinView::stopLoading()
 void DolphinView::readSettings()
 {
     const int oldZoomLevel = m_container->zoomLevel();
-    
+
     GeneralSettings::self()->readConfig();
     m_container->readSettings();
     applyViewProperties();
-    
+
     const int newZoomLevel = m_container->zoomLevel();
     if (newZoomLevel != oldZoomLevel) {
         emit zoomLevelChanged(newZoomLevel, oldZoomLevel);
@@ -674,6 +678,22 @@ bool DolphinView::eventFilter(QObject* watched, QEvent* event)
         }
         break;
 
+    case QEvent::GraphicsSceneDragEnter:
+        if (watched == m_container->controller()->view()) {
+            m_dragging = true;
+        }
+        break;
+
+    case QEvent::GraphicsSceneDragLeave:
+        if (watched == m_container->controller()->view()) {
+            m_dragging = false;
+        }
+        break;
+
+    case QEvent::GraphicsSceneDrop:
+        if (watched == m_container->controller()->view()) {
+            m_dragging = false;
+        }
     default:
         break;
     }
@@ -694,6 +714,12 @@ void DolphinView::wheelEvent(QWheelEvent* event)
     }
 }
 
+void DolphinView::hideEvent(QHideEvent* event)
+{
+    hideToolTip();
+    QWidget::hideEvent(event);
+}
+
 void DolphinView::activate()
 {
     setActive(true);
@@ -802,7 +828,7 @@ void DolphinView::slotItemHovered(int index)
 {
     const KFileItem item = fileItemModel()->fileItem(index);
 
-    if (GeneralSettings::showToolTips() && QApplication::mouseButtons() == Qt::NoButton) {
+    if (GeneralSettings::showToolTips() && !m_dragging) {
         QRectF itemRect = m_container->controller()->view()->itemContextRect(index);
         const QPoint pos = m_container->mapToGlobal(itemRect.topLeft().toPoint());
         itemRect.moveTo(pos);
@@ -824,10 +850,13 @@ void DolphinView::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* even
 {
     KUrl destUrl;
     KFileItem destItem = fileItemModel()->fileItem(index);
-    if (destItem.isNull()) {
+    if (destItem.isNull() || (!destItem.isDir() && !destItem.isDesktopFile())) {
+        // Use the URL of the view as drop target if the item is no directory
+        // or desktop-file
         destItem = fileItemModel()->rootItem();
         destUrl = url();
     } else {
+        // The item represents a directory or desktop-file
         destUrl = destItem.url();
     }
 
@@ -1130,6 +1159,29 @@ void DolphinView::slotSortRoleChangedByHeader(const QByteArray& current, const Q
     emit sortingChanged(sorting);
 }
 
+void DolphinView::slotVisibleRolesChangedByHeader(const QList<QByteArray>& current,
+                                                  const QList<QByteArray>& previous)
+{
+    Q_UNUSED(previous);
+    Q_ASSERT(m_container->controller()->view()->visibleRoles() == current);
+
+    const QList<AdditionalInfo> previousAdditionalInfoList = m_additionalInfoList;
+
+    m_additionalInfoList.clear();
+    m_additionalInfoList.reserve(current.count());
+    const AdditionalInfoAccessor& infoAccessor = AdditionalInfoAccessor::instance();
+    foreach (const QByteArray& role, current) {
+        if (role != "name") {
+            m_additionalInfoList.append(infoAccessor.additionalInfo(role));
+        }
+    }
+
+    ViewProperties props(url());
+    props.setAdditionalInfoList(m_additionalInfoList);
+
+    emit additionalInfoListChanged(m_additionalInfoList, previousAdditionalInfoList);
+}
+
 KFileItemModel* DolphinView::fileItemModel() const
 {
     return static_cast<KFileItemModel*>(m_container->controller()->model());
@@ -1159,19 +1211,6 @@ void DolphinView::applyViewProperties()
 
     const Mode mode = props.viewMode();
     if (m_mode != mode) {
-        // Prevent an animated transition of the position and size of the items when switching
-        // the view-mode by temporary clearing the model and updating it again after the view mode
-        // has been modified.
-        const bool restoreModel = (model->count() > 0);
-        if (restoreModel) {
-            const int currentItemIndex = m_container->controller()->selectionManager()->currentItem();
-            if (currentItemIndex >= 0) {
-                m_currentItemUrl = model->fileItem(currentItemIndex).url();
-            }
-            m_selectedUrls = selectedItems().urlList();
-            model->clear();
-        }
-
         const Mode previousMode = m_mode;
         m_mode = mode;
 
@@ -1192,10 +1231,6 @@ void DolphinView::applyViewProperties()
         if (m_container->zoomLevel() != oldZoomLevel) {
             emit zoomLevelChanged(m_container->zoomLevel(), oldZoomLevel);
         }
-
-        if (restoreModel) {
-            loadDirectory(url());
-        }
     }
 
     const bool hiddenFilesShown = props.hiddenFilesShown();