]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/panels/places/placespanel.cpp
Add action to places panel context menu trash entry to open trash settings
[dolphin.git] / src / panels / places / placespanel.cpp
index 413d346b6e4840a025375d420d4fab5f9ae9c814..1f5f0260faba5b01e6ccb7e8dd5a5b0a26af40ab 100644 (file)
@@ -23,6 +23,7 @@
 #include "placesview.h"
 #include "trash/dolphintrash.h"
 #include "views/draganddrophelper.h"
+#include "settings/dolphinsettingsdialog.h"
 
 #include <KFilePlaceEditDialog>
 #include <KFilePlacesModel>
 #include <KMountPoint>
 #include <KPropertiesDialog>
 
+#include <QActionGroup>
 #include <QGraphicsSceneDragDropEvent>
 #include <QIcon>
 #include <QMenu>
 #include <QMimeData>
 #include <QVBoxLayout>
+#include <QToolTip>
+#include <QTimer>
 
 PlacesPanel::PlacesPanel(QWidget* parent) :
     Panel(parent),
@@ -49,8 +53,12 @@ PlacesPanel::PlacesPanel(QWidget* parent) :
     m_triggerStorageSetupButton(),
     m_itemDropEventIndex(-1),
     m_itemDropEventMimeData(nullptr),
-    m_itemDropEvent(nullptr)
+    m_itemDropEvent(nullptr),
+    m_tooltipTimer()
 {
+    m_tooltipTimer.setInterval(500);
+    m_tooltipTimer.setSingleShot(true);
+    connect(&m_tooltipTimer, &QTimer::timeout, this, &PlacesPanel::slotShowTooltip);
 }
 
 PlacesPanel::~PlacesPanel()
@@ -71,7 +79,7 @@ bool PlacesPanel::urlChanged()
     }
 
     if (m_controller) {
-        selectClosestItem();
+        selectItem();
     }
 
     return true;
@@ -104,11 +112,15 @@ void PlacesPanel::showEvent(QShowEvent* event)
                 this, &PlacesPanel::storageTearDownRequested);
         connect(m_model, &PlacesItemModel::storageTearDownExternallyRequested,
                 this, &PlacesPanel::storageTearDownExternallyRequested);
+        connect(m_model, &PlacesItemModel::storageTearDownSuccessful,
+                this, &PlacesPanel::storageTearDownSuccessful);
 
         m_view = new PlacesView();
         m_view->setWidgetCreator(new KItemListWidgetCreator<PlacesItemListWidget>());
         m_view->setGroupHeaderCreator(new KItemListGroupHeaderCreator<PlacesItemListGroupHeader>());
 
+        installEventFilter(this);
+
         m_controller = new KItemListController(m_model, m_view, this);
         m_controller->setSelectionBehavior(KItemListController::SingleSelection);
         m_controller->setSingleClickActivationEnforced(true);
@@ -129,12 +141,27 @@ void PlacesPanel::showEvent(QShowEvent* event)
         layout->setContentsMargins(0, 0, 0, 0);
         layout->addWidget(container);
 
-        selectClosestItem();
+        selectItem();
     }
 
     Panel::showEvent(event);
 }
 
+bool PlacesPanel::eventFilter(QObject * /* obj */, QEvent *event)
+{
+    if (event->type() == QEvent::ToolTip) {
+
+        QHelpEvent *hoverEvent = reinterpret_cast<QHelpEvent *>(event);
+
+        m_hoveredIndex = m_view->itemAt(hoverEvent->pos());
+        m_hoverPos = mapToGlobal(hoverEvent->pos());
+
+        m_tooltipTimer.start();
+        return true;
+    }
+    return false;
+}
+
 void PlacesPanel::slotItemActivated(int index)
 {
     triggerItem(index, Qt::LeftButton);
@@ -155,6 +182,7 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos)
     QMenu menu(this);
 
     QAction* emptyTrashAction = nullptr;
+    QAction* configureTrashAction = nullptr;
     QAction* editAction = nullptr;
     QAction* teardownAction = nullptr;
     QAction* ejectAction = nullptr;
@@ -174,7 +202,7 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos)
     if (item->url().isLocalFile()) {
         propertiesAction = menu.addAction(QIcon::fromTheme(QStringLiteral("document-properties")), i18nc("@action:inmenu", "Properties"));
     }
-    if (!isDevice && !isTrash) {
+    if (!isDevice) {
         menu.addSeparator();
     }
     
@@ -210,6 +238,10 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos)
         }
     }
 
+    if (isTrash) {
+        configureTrashAction = menu.addAction(QIcon::fromTheme(QStringLiteral("configure")), i18nc("@action:inmenu", "Configure Trash..."));
+    }
+
     if (!isDevice) {
         editAction = menu.addAction(QIcon::fromTheme(QStringLiteral("edit-entry")), i18nc("@item:inmenu", "Edit..."));
     }
@@ -229,6 +261,11 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos)
     if (action) {
         if (action == emptyTrashAction) {
             Trash::empty(this);
+        } else if (action == configureTrashAction) {
+            DolphinSettingsDialog* settingsDialog = new DolphinSettingsDialog(item->url(), this);
+            settingsDialog->setCurrentPage(settingsDialog->trashSettings);
+            settingsDialog->setAttribute(Qt::WA_DeleteOnClose);
+            settingsDialog->show();
         } else {
             // The index might have changed if devices were added/removed while
             // the context menu was open.
@@ -268,7 +305,7 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos)
         }
     }
 
-    selectClosestItem();
+    selectItem();
 }
 
 void PlacesPanel::slotViewContextMenuRequested(const QPointF& pos)
@@ -320,7 +357,8 @@ void PlacesPanel::slotViewContextMenuRequested(const QPointF& pos)
     menu.addMenu(iconSizeSubMenu);
 
     menu.addSeparator();
-    foreach (QAction* action, customContextMenuActions()) {
+    const auto actions = customContextMenuActions();
+    for (QAction* action : actions) {
         menu.addAction(action);
     }
 
@@ -335,7 +373,7 @@ void PlacesPanel::slotViewContextMenuRequested(const QPointF& pos)
         }
     }
 
-    selectClosestItem();
+    selectItem();
 }
 
 QAction *PlacesPanel::buildGroupContextMenu(QMenu *menu, int index)
@@ -434,7 +472,7 @@ void PlacesPanel::slotUrlsDropped(const QUrl& dest, QDropEvent* event, QWidget*
 {
     KIO::DropJob *job = DragAndDropHelper::dropUrls(dest, event, parent);
     if (job) {
-        connect(job, &KIO::DropJob::result, this, [this](KJob *job) { if (job->error()) emit errorMessage(job->errorString()); });
+        connect(job, &KIO::DropJob::result, this, [this](KJob *job) { if (job->error()) Q_EMIT errorMessage(job->errorString()); });
     }
 }
 
@@ -457,6 +495,13 @@ void PlacesPanel::slotStorageSetupDone(int index, bool success)
     }
 }
 
+void PlacesPanel::slotShowTooltip()
+{
+    const QUrl url = m_model->data(m_hoveredIndex).value("url").value<QUrl>();
+    const QString text = url.toDisplayString(QUrl::PreferLocalFile);
+    QToolTip::showText(m_hoverPos, text);
+}
+
 void PlacesPanel::addEntry()
 {
     const int index = m_controller->selectionManager()->currentItem();
@@ -496,13 +541,17 @@ void PlacesPanel::editEntry(int index)
     delete dialog;
 }
 
-void PlacesPanel::selectClosestItem()
+void PlacesPanel::selectItem()
 {
     const int index = m_model->closestItem(url());
     KItemListSelectionManager* selectionManager = m_controller->selectionManager();
     selectionManager->setCurrentItem(index);
     selectionManager->clearSelection();
-    selectionManager->setSelected(index);
+
+    const QUrl closestUrl = m_model->url(index);
+    if (!closestUrl.path().isEmpty() && url() == closestUrl) {
+        selectionManager->setSelected(index);
+    }
 }
 
 void PlacesPanel::triggerItem(int index, Qt::MouseButton button)
@@ -526,9 +575,9 @@ void PlacesPanel::triggerItem(int index, Qt::MouseButton button)
         const QUrl url = m_model->data(index).value("url").toUrl();
         if (!url.isEmpty()) {
             if (button == Qt::MiddleButton) {
-                emit placeMiddleClicked(KFilePlacesModel::convertedUrl(url));
+                Q_EMIT placeMiddleClicked(KFilePlacesModel::convertedUrl(url));
             } else {
-                emit placeActivated(KFilePlacesModel::convertedUrl(url));
+                Q_EMIT placeActivated(KFilePlacesModel::convertedUrl(url));
             }
         }
     }
@@ -537,7 +586,7 @@ void PlacesPanel::triggerItem(int index, Qt::MouseButton button)
 void PlacesPanel::showHiddenEntries(bool shown)
 {
     m_model->setHiddenItemsShown(shown);
-    emit showHiddenEntriesChanged(shown);
+    Q_EMIT showHiddenEntriesChanged(shown);
 }
 
 int PlacesPanel::hiddenListCount()