]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/views/dolphinview.cpp
Fix minor visual issues in the view-engine
[dolphin.git] / src / views / dolphinview.cpp
index fe45541e358cee77748b30f92af91cee43d33e19..961651b698594263c237ba9710e985ad099d34cd 100644 (file)
@@ -164,13 +164,16 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) :
 
     m_container = new DolphinItemListContainer(m_dirLister, this);
     m_container->setVisibleRoles(QList<QByteArray>() << "name");
+    m_container->installEventFilter(this);
 
     KItemListController* controller = m_container->controller();
     controller->setSelectionBehavior(KItemListController::MultiSelection);
     connect(controller, SIGNAL(itemActivated(int)),
             this, SLOT(slotItemActivated(int)));
     connect(controller, SIGNAL(itemMiddleClicked(int)), this, SLOT(slotItemMiddleClicked(int)));
-    connect(controller, SIGNAL(contextMenuRequested(int,QPointF)), this, SLOT(slotContextMenuRequested(int,QPointF)));
+    connect(controller, SIGNAL(itemContextMenuRequested(int,QPointF)), this, SLOT(slotItemContextMenuRequested(int,QPointF)));
+    connect(controller, SIGNAL(viewContextMenuRequested(QPointF)), this, SLOT(slotViewContextMenuRequested(QPointF)));
+    connect(controller, SIGNAL(headerContextMenuRequested(QPointF)), this, SLOT(slotHeaderContextMenuRequested(QPointF)));
     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)));
@@ -264,19 +267,65 @@ DolphinView::Mode DolphinView::mode() const
     return m_mode;
 }
 
+void DolphinView::setPreviewsShown(bool show)
+{
+    if (previewsShown() == show) {
+        return;
+    }
+
+    ViewProperties props(url());
+    props.setPreviewsShown(show);
+
+    m_container->setPreviewsShown(show);
+    emit previewsShownChanged(show);
+}
+
 bool DolphinView::previewsShown() const
 {
     return m_container->previewsShown();
 }
 
+void DolphinView::setHiddenFilesShown(bool show)
+{
+    if (m_dirLister->showingDotFiles() == show) {
+        return;
+    }
+
+    const KFileItemList itemList = selectedItems();
+    m_selectedUrls.clear();
+    m_selectedUrls = itemList.urlList();
+
+    ViewProperties props(url());
+    props.setHiddenFilesShown(show);
+
+    m_dirLister->setShowingDotFiles(show);
+    m_dirLister->emitChanges();
+    emit hiddenFilesShownChanged(show);
+}
+
 bool DolphinView::hiddenFilesShown() const
 {
     return m_dirLister->showingDotFiles();
 }
 
-bool DolphinView::categorizedSorting() const
+void DolphinView::setGroupedSorting(bool grouped)
 {
-    return false; //m_storedCategorizedSorting;
+    if (grouped == groupedSorting()) {
+        return;
+    }
+
+    ViewProperties props(url());
+    props.setGroupedSorting(grouped);
+    props.save();
+
+    m_container->controller()->model()->setGroupedSorting(grouped);
+
+    emit groupedSortingChanged(grouped);
+}
+
+bool DolphinView::groupedSorting() const
+{
+    return fileItemModel()->groupedSorting();
 }
 
 KFileItemList DolphinView::items() const
@@ -290,8 +339,11 @@ KFileItemList DolphinView::selectedItems() const
     const KItemListSelectionManager* selectionManager = m_container->controller()->selectionManager();
     const QSet<int> selectedIndexes = selectionManager->selectedItems();
 
+    QList<int> sortedIndexes = selectedIndexes.toList();
+    qSort(sortedIndexes);
+
     KFileItemList selectedItems;
-    QSetIterator<int> it(selectedIndexes);
+    QListIterator<int> it(sortedIndexes);
     while (it.hasNext()) {
         const int index = it.next();
         selectedItems.append(model->fileItem(index));
@@ -647,69 +699,20 @@ void DolphinView::pasteIntoFolder()
     }
 }
 
-void DolphinView::setPreviewsShown(bool show)
-{
-    if (previewsShown() == show) {
-        return;
-    }
-
-    ViewProperties props(url());
-    props.setPreviewsShown(show);
-
-    m_container->setPreviewsShown(show);
-    emit previewsShownChanged(show);
-}
-
-void DolphinView::setHiddenFilesShown(bool show)
+bool DolphinView::eventFilter(QObject* watched, QEvent* event)
 {
-    if (m_dirLister->showingDotFiles() == show) {
-        return;
-    }
-
-    const KFileItemList itemList = selectedItems();
-    m_selectedUrls.clear();
-    m_selectedUrls = itemList.urlList();
-
-    ViewProperties props(url());
-    props.setHiddenFilesShown(show);
-
-    m_dirLister->setShowingDotFiles(show);
-    m_dirLister->emitChanges();
-    emit hiddenFilesShownChanged(show);
-}
+    switch (event->type()) {
+    case QEvent::FocusIn:
+        if (watched == m_container) {
+            setActive(true);
+        }
+        break;
 
-void DolphinView::setCategorizedSorting(bool categorized)
-{
-    if (categorized == categorizedSorting()) {
-        return;
+    default:
+        break;
     }
 
-    ViewProperties props(url());
-    props.setCategorizedSorting(categorized);
-    props.save();
-
-    //m_viewAccessor.proxyModel()->setCategorizedModel(categorized);
-
-    emit categorizedSortingChanged(categorized);
-}
-
-void DolphinView::mouseReleaseEvent(QMouseEvent* event)
-{
-    QWidget::mouseReleaseEvent(event);
-    setActive(true);
-}
-
-void DolphinView::contextMenuEvent(QContextMenuEvent* event)
-{
-    Q_UNUSED(event);
-
-    const QPoint pos = m_container->mapFromGlobal(QCursor::pos());
-    const KItemListView* view = m_container->controller()->view();
-    if (view->itemAt(pos) < 0) {
-        // Only open the context-menu if the cursor is above the viewport
-        // (the context-menu for items is handled in slotContextMenuRequested())
-        requestContextMenu(KFileItem(), url(), QList<QAction*>());
-    }
+    return QWidget::eventFilter(watched, event);
 }
 
 void DolphinView::wheelEvent(QWheelEvent* event)
@@ -719,8 +722,10 @@ void DolphinView::wheelEvent(QWheelEvent* event)
         const int numSteps = numDegrees / 15;
 
         setZoomLevel(zoomLevel() + numSteps);
+        event->accept();
+    } else {
+        event->ignore();
     }
-    event->accept();
 }
 
 void DolphinView::activate()
@@ -758,14 +763,71 @@ void DolphinView::slotItemMiddleClicked(int index)
     }
 }
 
-void DolphinView::slotContextMenuRequested(int index, const QPointF& pos)
+void DolphinView::slotItemContextMenuRequested(int index, const QPointF& pos)
 {
-    Q_UNUSED(pos);
     if (GeneralSettings::showToolTips()) {
         m_toolTipManager->hideToolTip();
     }
     const KFileItem item = fileItemModel()->fileItem(index);
-    emit requestContextMenu(item, url(), QList<QAction*>());
+    emit requestContextMenu(pos.toPoint(), item, url(), QList<QAction*>());
+}
+
+void DolphinView::slotViewContextMenuRequested(const QPointF& pos)
+{
+    if (GeneralSettings::showToolTips()) {
+        m_toolTipManager->hideToolTip();
+    }
+    emit requestContextMenu(pos.toPoint(), KFileItem(), url(), QList<QAction*>());
+}
+
+void DolphinView::slotHeaderContextMenuRequested(const QPointF& pos)
+{
+    QWeakPointer<KMenu> menu = new KMenu(QApplication::activeWindow());
+
+    KItemListView* view = m_container->controller()->view();
+    const QSet<QByteArray> visibleRolesSet = view->visibleRoles().toSet();
+
+    // Add all roles to the menu that can be shown or hidden by the user
+    const AdditionalInfoAccessor& infoAccessor = AdditionalInfoAccessor::instance();
+    const QList<DolphinView::AdditionalInfo> keys = infoAccessor.keys();
+    foreach (const DolphinView::AdditionalInfo info, keys) {
+        const QByteArray& role = infoAccessor.role(info);
+        if (role != "name") {
+            const QString text = fileItemModel()->roleDescription(role);
+
+            QAction* action = menu.data()->addAction(text);
+            action->setCheckable(true);
+            action->setChecked(visibleRolesSet.contains(role));
+            action->setData(info);
+        }
+    }
+
+    QAction* action = menu.data()->exec(pos.toPoint());
+    if (action) {
+        // Show or hide the selected role
+        const DolphinView::AdditionalInfo info =
+            static_cast<DolphinView::AdditionalInfo>(action->data().toInt());
+
+        ViewProperties props(url());
+        QList<DolphinView::AdditionalInfo> infoList = props.additionalInfoList();
+
+        const QByteArray selectedRole = infoAccessor.role(info);
+        QList<QByteArray> visibleRoles = view->visibleRoles();
+
+        if (action->isChecked()) {
+            const int index = keys.indexOf(info) + 1;
+            visibleRoles.insert(index, selectedRole);
+            infoList.insert(index, info);
+        } else {
+            visibleRoles.removeOne(selectedRole);
+            infoList.removeOne(info);
+        }
+
+        view->setVisibleRoles(visibleRoles);
+        props.setAdditionalInfoList(infoList);
+    }
+
+    delete menu.data();
 }
 
 void DolphinView::slotItemExpansionToggleClicked(int index)
@@ -784,7 +846,7 @@ void DolphinView::slotItemHovered(int index)
     const KFileItem item = fileItemModel()->fileItem(index);
 
     if (GeneralSettings::showToolTips()) {
-        QRectF itemRect = m_container->controller()->view()->itemBoundingRect(index);
+        QRectF itemRect = m_container->controller()->view()->itemRect(index);
         const QPoint pos = m_container->mapToGlobal(itemRect.topLeft().toPoint());
         itemRect.moveTo(pos);
 
@@ -849,18 +911,6 @@ void DolphinView::emitSelectionChangedSignal()
     emit selectionChanged(selectedItems());
 }
 
-void DolphinView::openContextMenu(const QPoint& pos,
-                                  const QList<QAction*>& customActions)
-{
-    KFileItem item;
-    const int index = m_container->controller()->view()->itemAt(pos);
-    if (index >= 0) {
-        item = fileItemModel()->fileItem(index);
-    }
-
-    emit requestContextMenu(item, url(), customActions);
-}
-
 void DolphinView::dropUrls(const KFileItem& destItem,
                            const KUrl& destPath,
                            QDropEvent* event)
@@ -1151,15 +1201,15 @@ void DolphinView::applyViewProperties()
         emit hiddenFilesShownChanged(hiddenFilesShown);
     }
 
-/*    m_storedCategorizedSorting = props.categorizedSorting();
-    const bool categorized = m_storedCategorizedSorting && supportsCategorizedSorting();
-    if (categorized != m_viewAccessor.proxyModel()->isCategorizedModel()) {
-        m_viewAccessor.proxyModel()->setCategorizedModel(categorized);
-        emit categorizedSortingChanged();
-    }*/
+    KFileItemModel* model = fileItemModel();
+
+    const bool groupedSorting = props.groupedSorting();
+    if (groupedSorting != model->groupedSorting()) {
+        model->setGroupedSorting(groupedSorting);
+        emit groupedSortingChanged(groupedSorting);
+    }
 
     const DolphinView::Sorting sorting = props.sorting();
-    KFileItemModel* model = fileItemModel();
     const QByteArray newSortRole = sortRoleForSorting(sorting);
     if (newSortRole != model->sortRole()) {
         model->setSortRole(newSortRole);