]> cloud.milkyroute.net Git - dolphin.git/commitdiff
view: Add setting to trigger user set action with double click
authorGeorge Florea Bănuș <georgefb899@gmail.com>
Wed, 8 May 2024 08:11:56 +0000 (08:11 +0000)
committerMéven Car <meven.car@kdemail.net>
Wed, 8 May 2024 08:11:56 +0000 (08:11 +0000)
Default action is select-all.

src/dolphinmainwindow.cpp
src/dolphinmainwindow.h
src/kitemviews/kitemlistcontroller.cpp
src/kitemviews/kitemlistcontroller.h
src/settings/dolphin_generalsettings.kcfg
src/settings/viewmodes/generalviewsettingspage.cpp
src/settings/viewmodes/generalviewsettingspage.h
src/views/dolphinview.cpp
src/views/dolphinview.h

index 05fbb41b2ea31902ec307729eda5fc1de58f2755..10dc9375de0a6d0318c2979af8e75f3190aa4ca4 100644 (file)
@@ -40,6 +40,7 @@
 #include <KColorSchemeManager>
 #include <KConfig>
 #include <KConfigGui>
+#include <KDialogJobUiDelegate>
 #include <KDualAction>
 #include <KFileItemListProperties>
 #include <KIO/CommandLauncherJob>
@@ -81,6 +82,7 @@
 #include <QTimer>
 #include <QToolButton>
 #include <QtConcurrentRun>
+#include <dolphindebug.h>
 
 #include <algorithm>
 
@@ -2586,6 +2588,7 @@ void DolphinMainWindow::connectViewSignals(DolphinViewContainer *container)
     connect(view, &DolphinView::goForwardRequested, this, &DolphinMainWindow::goForward);
     connect(view, &DolphinView::urlActivated, this, &DolphinMainWindow::handleUrl);
     connect(view, &DolphinView::goUpRequested, this, &DolphinMainWindow::goUp);
+    connect(view, &DolphinView::doubleClickViewBackground, this, &DolphinMainWindow::slotDoubleClickViewBackground);
 
     connect(container->urlNavigatorInternalWithHistory(), &KUrlNavigator::urlChanged, this, &DolphinMainWindow::changeUrl);
     connect(container->urlNavigatorInternalWithHistory(), &KUrlNavigator::historyChanged, this, &DolphinMainWindow::updateHistory);
@@ -2902,4 +2905,38 @@ bool DolphinMainWindow::isItemVisibleInAnyView(const QString &urlOfItem)
     return m_tabWidget->isItemVisibleInAnyView(QUrl::fromUserInput(urlOfItem));
 }
 
+void DolphinMainWindow::slotDoubleClickViewBackground(Qt::MouseButton button)
+{
+    Q_UNUSED(button) // might be of use later
+
+    GeneralSettings *settings = GeneralSettings::self();
+    QString clickAction = settings->doubleClickViewAction();
+
+    DolphinView *view = activeViewContainer()->view();
+    if (view == nullptr || clickAction == "none") {
+        return;
+    }
+
+    if (clickAction == customCommand) {
+        // run custom command set by the user
+        QString path = view->url().toLocalFile();
+        QString clickCustomAction = settings->doubleClickViewCustomAction();
+        clickCustomAction.replace("{path}", path.prepend('"').append('"'));
+
+        m_job = new KIO::CommandLauncherJob(clickCustomAction);
+        m_job->setUiDelegate(new KDialogJobUiDelegate(KJobUiDelegate::AutoHandlingEnabled, this));
+        m_job->start();
+
+    } else {
+        // get the action set by the user and trigger it
+        const KActionCollection *actions = actionCollection();
+        QAction *action = actions->action(clickAction);
+        if (action == nullptr) {
+            qCWarning(DolphinDebug) << QStringLiteral("Double-click view: action `%1` was not found").arg(clickAction);
+            return;
+        }
+        action->trigger();
+    }
+}
+
 #include "moc_dolphinmainwindow.cpp"
index 9a1582c1fef903b949f9a84ec614e016db4c22e2..5f96ca3b621fbb04ea7cabbd870513c6f39df468 100644 (file)
@@ -47,9 +47,13 @@ class QToolButton;
 class PlacesPanel;
 class TerminalPanel;
 
+/** Used to identify that a custom command should be triggered on a view background double-click.*/
+constexpr QLatin1String customCommand{"CUSTOM_COMMAND"};
+
 namespace KIO
 {
 class OpenUrlJob;
+class CommandLauncherJob;
 }
 namespace SelectionMode
 {
@@ -131,6 +135,11 @@ public:
     bool isInformationPanelEnabled() const;
     bool isSplitViewEnabledInCurrentTab() const;
 
+    /**
+     * Activates a user set action when double clicking the view's background.
+     */
+    void slotDoubleClickViewBackground(Qt::MouseButton button);
+
 public Q_SLOTS:
     /**
      * Opens each directory in \p dirs in a separate tab. If \a splitView is set,
@@ -748,6 +757,8 @@ private:
     QFutureWatcher<void> *m_sessionSaveWatcher;
     bool m_sessionSaveScheduled;
 
+    KIO::CommandLauncherJob *m_job;
+
     friend class DolphinMainWindowTest;
 };
 
index 2cda2987b14c378fff91ea3011dc2a79ee40b029..b25c73843c1e47df1a82a36e5b6b22887cf8bf7f 100644 (file)
@@ -700,6 +700,11 @@ bool KItemListController::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event,
     const QPointF pos = transform.map(event->pos());
     const std::optional<int> index = m_view->itemAt(pos);
 
+    if (!index.has_value()) {
+        Q_EMIT doubleClickViewBackground(event->button());
+        return false;
+    }
+
     // Expand item if desired - See Bug 295573
     if (m_mouseDoubleClickAction != ActivateItemOnly) {
         if (m_view && m_model && m_view->supportsItemExpanding() && m_model->isExpandable(index.value_or(-1))) {
index ccfc7626710d272ec01fba63153fc4808b85dcd2..fcb971fb7ff81d68b641741636f5b40b07858256 100644 (file)
@@ -230,6 +230,12 @@ Q_SIGNALS:
     void decreaseZoom();
     void swipeUp();
 
+    /**
+     * Emitted when the view's background is double-clicked.
+     * Used to trigger an user configured action.
+     */
+    void doubleClickViewBackground(Qt::MouseButton button);
+
 public Q_SLOTS:
     void slotStateChanged(QScroller::State newState);
 
index dbb7dcd2cdd12f5940b9aa7bc3a3d5eb42f0c1e3..c800eadb8f353401e1c54cc3da7d831f4bcd693d 100644 (file)
         <argument type="Bool">showStatusBar</argument>
     </signal>
     <group name="General">
+        <entry name="DoubleClickViewAction" type="String">
+            <label>Select Action</label>
+            <default>edit_select_all</default>
+        </entry>
+        <entry name="DoubleClickViewCustomAction" type="String">
+            <label>Custom Action</label>
+        </entry>
         <entry name="EditableUrl" type="Bool">
             <label>Should the URL be editable for the user</label>
             <default>false</default>
index cd68cdaeb9acefdf11e820db2b091a101c7cfd1a..51ab664f100da1e640674cb935dae46b8d1b53b5 100644 (file)
@@ -6,16 +6,21 @@
 
 #include "generalviewsettingspage.h"
 #include "dolphin_generalsettings.h"
+#include "dolphindebug.h"
 #include "dolphinmainwindow.h"
 #include "views/viewproperties.h"
 
+#include <KActionCollection>
 #include <KLocalizedString>
 
+#include <QApplication>
 #include <QButtonGroup>
 #include <QCheckBox>
+#include <QComboBox>
 #include <QFontDatabase>
 #include <QFormLayout>
 #include <QLabel>
+#include <QLineEdit>
 #include <QMimeDatabase>
 #include <QVBoxLayout>
 
@@ -85,6 +90,90 @@ GeneralViewSettingsPage::GeneralViewSettingsPage(const QUrl &url, QWidget *paren
                                         (mime.globPatterns().join(", "))));
     topLayout->addRow(QString(), m_hideXtrashFiles);
 
+    // --------------------- //
+    // START double click view background
+
+    // list of actions allowed to be triggered by double click
+    // actions were selected based on their usefulness of being triggered with the mouse
+    QStringList allowedActions{"new_tab",
+                               "file_new",
+                               "show_places_panel",
+                               "show_information_panel",
+                               "show_folders_panel",
+                               "show_terminal_panel",
+                               "open_terminal",
+                               "go_up",
+                               "go_back",
+                               "go_home",
+                               "view_redisplay",
+                               "split_view",
+                               "edit_select_all",
+                               "toggle_selection_mode",
+                               "create_dir",
+                               "show_preview",
+                               "show_hidden_files",
+                               "show_in_groups",
+                               "view_properties"};
+
+    // create actions combo-box and add actions
+    m_doubleClickViewComboBox = new QComboBox();
+    m_doubleClickViewComboBox->setAccessibleDescription(i18nc("Accessible description for combobox with actions of double click view background setting",
+                                                              "Action to trigger when double clicking view background"));
+    // i18n: Completes the sentence "Double-click triggers [Nothing]".
+    m_doubleClickViewComboBox->addItem(QIcon::fromTheme("empty"), i18nc("@item:inlistbox", "Nothing"), QStringLiteral("none"));
+    m_doubleClickViewComboBox->addItem(QIcon::fromTheme("list-add"), i18nc("@item:inlistbox", "Custom Command"), customCommand);
+    m_doubleClickViewComboBox->insertSeparator(2);
+
+    DolphinMainWindow *mainWindow = static_cast<DolphinMainWindow *>(QApplication::activeWindow());
+    if (mainWindow != nullptr) {
+        KActionCollection *actions = mainWindow->actionCollection();
+        // get the allowed actions from actionCollection and add them to the combobox
+        for (const QString &actionName : allowedActions) {
+            QAction *action = actions->action(actionName);
+            if (action == nullptr) {
+                qCWarning(DolphinDebug) << QStringLiteral("Double click view: action `%1` was not found").arg(actionName);
+                continue;
+            }
+
+            QString actionText = action->text();
+            // remove ampersand used to define the action's shortcut
+            actionText.remove(QLatin1Char('&'));
+            m_doubleClickViewComboBox->addItem(action->icon(), actionText, action->objectName());
+        }
+    }
+    // i18n: This sentence is incomplete because the user can choose an action that is triggered in a combobox that will appear directly after "triggers".
+    // (While using a left-to-right language it will be to the right of "triggers", in a right-to-left layout it will be to the left.)
+    // So please try to keep this translation in a way that it is a complete sentence when reading the content of the combobox as part of the sentence.
+    // There can be many possible actions in the combobox. The default is "Nothing". Other actions are "New Tab", "Create Folder", "Show Hidden Files", …
+    QLabel *doubleClickViewLabel{new QLabel(i18nc("@info", "Double-click triggers"))};
+    QHBoxLayout *doubleClickViewHLayout{new QHBoxLayout()};
+    QWidget *doubleClickViewWidget{new QWidget()};
+    doubleClickViewWidget->setLayout(doubleClickViewHLayout);
+    doubleClickViewHLayout->addWidget(doubleClickViewLabel);
+    doubleClickViewHLayout->setContentsMargins(0, 0, 0, 0);
+    doubleClickViewHLayout->addWidget(m_doubleClickViewComboBox);
+    topLayout->addRow(i18nc("@title:group", "Background: "), doubleClickViewWidget);
+
+    m_doubleClickViewCustomAction = new QLineEdit();
+    m_doubleClickViewCustomAction->setAccessibleDescription(
+        i18nc("Accessible description for custom command text field of double click view background setting",
+              "Enter custom command to trigger when double clicking view background"));
+    m_doubleClickViewCustomAction->setPlaceholderText(i18nc("@info:placeholder for terminal command", "Command…"));
+    topLayout->addRow(QString(), m_doubleClickViewCustomAction);
+
+    m_doubleClickViewCustomActionInfo = new QLabel(i18nc("@label",
+                                                         "Use {path} to get the path of the current folder. "
+                                                         "Example: dolphin {path}"));
+    m_doubleClickViewCustomActionInfo->setFont(QFontDatabase::systemFont(QFontDatabase::SmallestReadableFont));
+    m_doubleClickViewCustomActionInfo->setWordWrap(true);
+    m_doubleClickViewCustomActionInfo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+    m_doubleClickViewCustomActionInfo->hide();
+    m_doubleClickViewCustomActionInfo->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard
+                                                               | Qt::LinksAccessibleByKeyboard); // for accessibility
+    topLayout->addRow(QString(), m_doubleClickViewCustomActionInfo);
+    // END double click view background
+    // --------------------- //
+
     loadSettings();
 
     connect(m_localViewProps, &QRadioButton::toggled, this, &GeneralViewSettingsPage::changed);
@@ -98,6 +187,9 @@ GeneralViewSettingsPage::GeneralViewSettingsPage(const QUrl &url, QWidget *paren
     connect(m_showSelectionToggle, &QCheckBox::toggled, this, &GeneralViewSettingsPage::changed);
     connect(m_renameInline, &QCheckBox::toggled, this, &GeneralViewSettingsPage::changed);
     connect(m_hideXtrashFiles, &QCheckBox::toggled, this, &GeneralViewSettingsPage::changed);
+    connect(m_doubleClickViewCustomAction, &QLineEdit::textChanged, this, &GeneralViewSettingsPage::changed);
+    connect(m_doubleClickViewComboBox, qOverload<int>(&QComboBox::currentIndexChanged), this, &GeneralViewSettingsPage::changed);
+    connect(m_doubleClickViewComboBox, qOverload<int>(&QComboBox::currentIndexChanged), this, &GeneralViewSettingsPage::updateCustomActionVisibility);
 }
 
 GeneralViewSettingsPage::~GeneralViewSettingsPage()
@@ -118,6 +210,8 @@ void GeneralViewSettingsPage::applySettings()
     settings->setHideXTrashFile(m_hideXtrashFiles->isChecked());
     settings->setAutoExpandFolders(m_autoExpandFolders->isChecked());
     settings->setBrowseThroughArchives(m_openArchivesAsFolder->isChecked());
+    settings->setDoubleClickViewCustomAction(m_doubleClickViewCustomAction->text());
+    settings->setDoubleClickViewAction(m_doubleClickViewComboBox->currentData().toString());
     settings->save();
     if (useGlobalViewProps) {
         // Remember the global view properties by applying the current view properties.
@@ -151,6 +245,17 @@ void GeneralViewSettingsPage::loadSettings()
 
     m_localViewProps->setChecked(!useGlobalViewProps);
     m_globalViewProps->setChecked(useGlobalViewProps);
+    int index = m_doubleClickViewComboBox->findData(GeneralSettings::doubleClickViewAction());
+    m_doubleClickViewComboBox->setCurrentIndex((index == -1) ? 0 : index);
+    m_doubleClickViewCustomAction->setText(GeneralSettings::doubleClickViewCustomAction());
+    updateCustomActionVisibility(m_doubleClickViewComboBox->currentIndex());
+}
+
+void GeneralViewSettingsPage::updateCustomActionVisibility(int doubleClickViewComboBoxCurrentIndex)
+{
+    auto data = m_doubleClickViewComboBox->itemData(doubleClickViewComboBoxCurrentIndex, Qt::UserRole);
+    m_doubleClickViewCustomAction->setVisible(data == customCommand);
+    m_doubleClickViewCustomActionInfo->setVisible(data == customCommand);
 }
 
 #include "moc_generalviewsettingspage.cpp"
index 234fb03cbf6851a6bb8d2f764519b7c0a77e361b..1d4caab655077d0e2aacaf5ef54949f57f8d1c89 100644 (file)
@@ -13,7 +13,9 @@
 #include <QUrl>
 
 class QCheckBox;
+class QComboBox;
 class QLabel;
+class QLineEdit;
 class QRadioButton;
 
 /**
@@ -35,6 +37,7 @@ public:
 
 private:
     void loadSettings();
+    void updateCustomActionVisibility(int doubleClickViewComboBoxCurrentIndex);
 
 private:
     QUrl m_url;
@@ -48,6 +51,9 @@ private:
     QCheckBox *m_openArchivesAsFolder = nullptr;
     QCheckBox *m_autoExpandFolders = nullptr;
     QCheckBox *m_hideXtrashFiles = nullptr;
+    QComboBox *m_doubleClickViewComboBox = nullptr;
+    QLineEdit *m_doubleClickViewCustomAction = nullptr;
+    QLabel *m_doubleClickViewCustomActionInfo = nullptr;
 };
 
 #endif
index 1bbcd5998e25e515b8195659016e96f69ed5efd3..d42d9cfcd81d7fe9f909548f16766e38c26259ff 100644 (file)
@@ -119,6 +119,7 @@ DolphinView::DolphinView(const QUrl &url, QWidget *parent)
     KItemListController *controller = new KItemListController(m_model, m_view, this);
     const int delay = GeneralSettings::autoExpandFolders() ? 750 : -1;
     controller->setAutoActivationDelay(delay);
+    connect(controller, &KItemListController::doubleClickViewBackground, this, &DolphinView::doubleClickViewBackground);
 
     // The EnlargeSmallPreviews setting can only be changed after the model
     // has been set in the view by KItemListController.
index d4f82ae2f98637ad471d185e60103b970f21e09e..b55e2ee9becc5b2463f28c59acd7456f79509481 100644 (file)
@@ -665,6 +665,12 @@ Q_SIGNALS:
      */
     void currentDirectoryRemoved();
 
+    /**
+     * Emitted when the view's background is double-clicked.
+     * Used to trigger an user configured action.
+     */
+    void doubleClickViewBackground(Qt::MouseButton button);
+
 protected:
     /** Changes the zoom level if Control is pressed during a wheel event. */
     void wheelEvent(QWheelEvent *event) override;