]> 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 83d80012cbca8c36b8da3dfa489a5894c218f45c..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>)),
@@ -446,11 +450,24 @@ void DolphinView::stopLoading()
     m_dirLister->stop();
 }
 
-void DolphinView::refresh()
+void DolphinView::readSettings()
 {
+    const int oldZoomLevel = m_container->zoomLevel();
+
     GeneralSettings::self()->readConfig();
-    m_container->refresh();
+    m_container->readSettings();
     applyViewProperties();
+
+    const int newZoomLevel = m_container->zoomLevel();
+    if (newZoomLevel != oldZoomLevel) {
+        emit zoomLevelChanged(newZoomLevel, oldZoomLevel);
+    }
+}
+
+void DolphinView::writeSettings()
+{
+    GeneralSettings::self()->writeConfig();
+    m_container->writeSettings();
 }
 
 void DolphinView::setNameFilter(const QString& nameFilter)
@@ -661,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;
     }
@@ -681,6 +714,12 @@ void DolphinView::wheelEvent(QWheelEvent* event)
     }
 }
 
+void DolphinView::hideEvent(QHideEvent* event)
+{
+    hideToolTip();
+    QWidget::hideEvent(event);
+}
+
 void DolphinView::activate()
 {
     setActive(true);
@@ -789,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);
@@ -809,13 +848,16 @@ void DolphinView::slotItemUnhovered(int index)
 
 void DolphinView::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* event)
 {
+    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();
-        if (destItem.isNull()) {
-            kWarning() << "No destination item available for drop operation.";
-            return;
-        }
+        destUrl = url();
+    } else {
+        // The item represents a directory or desktop-file
+        destUrl = destItem.url();
     }
 
     QDropEvent dropEvent(event->pos().toPoint(),
@@ -824,7 +866,7 @@ void DolphinView::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* even
                          event->buttons(),
                          event->modifiers());
 
-    const QString error = DragAndDropHelper::dropUrls(destItem, &dropEvent);
+    const QString error = DragAndDropHelper::dropUrls(destItem, destUrl, &dropEvent);
     if (!error.isEmpty()) {
         emit errorMessage(error);
     }
@@ -863,16 +905,6 @@ void DolphinView::emitSelectionChangedSignal()
     emit selectionChanged(selectedItems());
 }
 
-void DolphinView::dropUrls(const KFileItem& destItem,
-                           const KUrl& destPath,
-                           QDropEvent* event)
-{
-    Q_UNUSED(destItem);
-    Q_UNUSED(destPath);
-    markPastedUrlsAsSelected(event->mimeData());
-    //DragAndDropHelper::instance().dropUrls(destItem, destPath, event, this);
-}
-
 void DolphinView::updateSorting(DolphinView::Sorting sorting)
 {
     ViewProperties props(url());
@@ -1127,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());
@@ -1156,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;
 
@@ -1189,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();