]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/settings/viewmodes/generalviewsettingspage.cpp
ViewProperties: Store view properties in extended file attributes
[dolphin.git] / src / settings / viewmodes / generalviewsettingspage.cpp
index b1415feffa3f8e9a042726a0783a3fe824bfd228..c518147dd65e974d4f3f2fdd399421f2dde05561 100644 (file)
@@ -6,35 +6,54 @@
 
 #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>
 
 GeneralViewSettingsPage::GeneralViewSettingsPage(const QUrl &url, QWidget *parent)
     : SettingsPageBase(parent)
     , m_url(url)
-    , m_localViewProps(nullptr)
-    , m_globalViewProps(nullptr)
-    , m_showSelectionToggle(nullptr)
-    , m_renameInline(nullptr)
 {
     QFormLayout *topLayout = new QFormLayout(this);
 
     // Display style
     m_globalViewProps = new QRadioButton(i18nc("@option:radio", "Use common display style for all folders"));
+    // i18n: The information in this sentence contradicts the preceding sentence. That's what the word "still" is communicating.
+    // The previous sentence is "Use common display style for all folders".
+    QLabel *globalViewPropsLabel = new QLabel(i18nc("@info", "Some special views like search, recent files, or trash will still use a custom display style."));
+    globalViewPropsLabel->setFont(QFontDatabase::systemFont(QFontDatabase::SmallestReadableFont));
+    globalViewPropsLabel->setWordWrap(true);
+    globalViewPropsLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+
     m_localViewProps = new QRadioButton(i18nc("@option:radio", "Remember display style for each folder"));
-    m_localViewProps->setToolTip(i18nc("@info", "Dolphin will create a hidden .directory file in each folder you change view properties for."));
+    QLabel *localViewPropsLabel = new QLabel(i18nc("@info",
+                                                   "Dolphin will add file system metadata to folders you change view properties for. If that is not possible, "
+                                                   "a hidden .directory file is created instead."));
+    localViewPropsLabel->setFont(QFontDatabase::systemFont(QFontDatabase::SmallestReadableFont));
+    localViewPropsLabel->setWordWrap(true);
+    localViewPropsLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
 
     QButtonGroup *viewGroup = new QButtonGroup(this);
     viewGroup->addButton(m_globalViewProps);
     viewGroup->addButton(m_localViewProps);
     topLayout->addRow(i18nc("@title:group", "Display style: "), m_globalViewProps);
+    topLayout->addRow(QString(), globalViewPropsLabel);
     topLayout->addRow(QString(), m_localViewProps);
+    topLayout->addRow(QString(), localViewPropsLabel);
 
     topLayout->addItem(new QSpacerItem(0, Dolphin::VERTICAL_SPACER_HEIGHT, QSizePolicy::Fixed, QSizePolicy::Fixed));
 
@@ -48,7 +67,7 @@ GeneralViewSettingsPage::GeneralViewSettingsPage(const QUrl &url, QWidget *paren
 
 #if HAVE_BALOO
     // 'Show tooltips'
-    m_showToolTips = new QCheckBox(i18nc("@option:check", "Show tooltips"));
+    m_showToolTips = new QCheckBox(i18nc("@option:check", "Show item information on hover"));
     topLayout->addRow(i18nc("@title:group", "Miscellaneous: "), m_showToolTips);
 #endif
 
@@ -61,9 +80,102 @@ GeneralViewSettingsPage::GeneralViewSettingsPage(const QUrl &url, QWidget *paren
 #endif
 
     // 'Inline renaming of items'
-    m_renameInline = new QCheckBox(i18nc("option:check", "Rename inline"));
+    m_renameInline = new QCheckBox(i18nc("option:check", "Rename single items inline"));
+    m_renameInline->setToolTip(i18n("Renaming multiple items is always done with a dialog window."));
     topLayout->addRow(QString(), m_renameInline);
 
+    m_hideXtrashFiles = new QCheckBox(i18nc("option:check", "Also hide backup files while hiding hidden files"));
+    QMimeDatabase db;
+    QMimeType mime = db.mimeTypeForName(QStringLiteral("application/x-trash"));
+    m_hideXtrashFiles->setToolTip(i18nc("@info:tooltip %1 are the file patterns for mimetype application/x-trash",
+                                        "Backup files are the files whose mime-type is application/x-trash, patterns: %1",
+                                        (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);
@@ -76,6 +188,10 @@ GeneralViewSettingsPage::GeneralViewSettingsPage(const QUrl &url, QWidget *paren
 #endif
     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()
@@ -93,7 +209,11 @@ void GeneralViewSettingsPage::applySettings()
 #endif
     settings->setShowSelectionToggle(m_showSelectionToggle->isChecked());
     settings->setRenameInline(m_renameInline->isChecked());
+    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.
@@ -123,9 +243,21 @@ void GeneralViewSettingsPage::loadSettings()
 #endif
     m_showSelectionToggle->setChecked(GeneralSettings::showSelectionToggle());
     m_renameInline->setChecked(GeneralSettings::renameInline());
+    m_hideXtrashFiles->setChecked(GeneralSettings::hideXTrashFile());
 
     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"