From d9f4fa7436126337a0cf5b28fdc040802b59ead7 Mon Sep 17 00:00:00 2001 From: xust Date: Mon, 21 Aug 2023 15:27:20 +0800 Subject: [PATCH] feat: [sidebar/settings] custom settings can be added. as title. now you can add your custom setting item into setting pane, and you can customize it's order. Log: custom setting pane. Task: https://pms.uniontech.com/task-view-286565.html?onlybody=yes --- .../settingdialog/customsettingitemregister.h | 30 +++ .../settingdialog/settingjsongenerator.h | 72 ++++++ .../configs/customsettingitemregister.cpp | 34 +++ src/dfm-base/base/configs/settingbackend.cpp | 233 +++++++++++++++--- src/dfm-base/base/configs/settingbackend.h | 2 + .../base/configs/settingjsongenerator.cpp | 208 ++++++++++++++++ .../dialogs/settingsdialog/settingdialog.cpp | 40 +-- .../dialogs/settingsdialog/settingdialog.h | 1 - .../dfmplugin_sidebar_global.h | 1 + .../events/sidebareventreceiver.cpp | 32 +++ .../events/sidebareventreceiver.h | 1 + .../core/dfmplugin-sidebar/sidebar.cpp | 3 + .../core/dfmplugin-sidebar/sidebar.h | 1 + .../dfmplugin-sidebar/utils/sidebarhelper.cpp | 149 ++++++++--- .../dfmplugin-sidebar/utils/sidebarhelper.h | 3 + .../dfmplugin-smbbrowser/smbbrowser.cpp | 2 + .../utils/smbbrowserutils.cpp | 9 +- .../utils/smbbrowserutils.h | 1 + .../utils/vaultvisiblemanager.cpp | 8 + .../utils/vaultvisiblemanager.h | 7 +- .../filemanager/dfmplugin-vault/vault.cpp | 1 + 21 files changed, 750 insertions(+), 88 deletions(-) create mode 100644 include/dfm-base/settingdialog/customsettingitemregister.h create mode 100644 include/dfm-base/settingdialog/settingjsongenerator.h create mode 100644 src/dfm-base/base/configs/customsettingitemregister.cpp create mode 100644 src/dfm-base/base/configs/settingjsongenerator.cpp diff --git a/include/dfm-base/settingdialog/customsettingitemregister.h b/include/dfm-base/settingdialog/customsettingitemregister.h new file mode 100644 index 0000000000..c9a56e864d --- /dev/null +++ b/include/dfm-base/settingdialog/customsettingitemregister.h @@ -0,0 +1,30 @@ +// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef CUSTOMSETTINGITEMREGISTER_H +#define CUSTOMSETTINGITEMREGISTER_H + +#include +#include + +class QWidget; +class QObject; + +typedef QPair (*CustomSettingItemCreator)(QObject *); + +namespace dfmbase { +class CustomSettingItemRegister +{ +public: + static CustomSettingItemRegister *instance(); + bool registCustomSettingItemType(const QString &type, const CustomSettingItemCreator &creator); + const QMap &getCreators() const; + +private: + CustomSettingItemRegister(); + QMap creators; +}; +} + +#endif // CUSTOMSETTINGITEMREGISTER_H diff --git a/include/dfm-base/settingdialog/settingjsongenerator.h b/include/dfm-base/settingdialog/settingjsongenerator.h new file mode 100644 index 0000000000..74de31e9ca --- /dev/null +++ b/include/dfm-base/settingdialog/settingjsongenerator.h @@ -0,0 +1,72 @@ +// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef SETTINGJSONGENERATOR_H +#define SETTINGJSONGENERATOR_H + +#include + +/* + * the root group: + * { + * "groups": [(top level group)] + * } + * + * a top level group: + * { + * "key": (string), + * "name": (string), + * "groups": [(config group)] + * } + * + * a config group: + * { + * "key": (string), + * "name": (string), + * "options": [(config item)] + * } + * + * config item: // option item + * { + * "key": (string), + * "text": (string), + * "type": (string), + * "default": (variant), + * "hide": (bool), + * "custom_info": (variant) + * } + * */ + +namespace dfmbase { + +class SettingJsonGenerator +{ +public: + static SettingJsonGenerator *instance(); + + QByteArray genSettingJson(); + bool addGroup(const QString &key, const QString &name); + bool addConfig(const QString &key, const QVariantMap &config); + bool addCheckBoxConfig(const QString &key, const QString &text, bool defaultVal = true); + bool addComboboxConfig(const QString &key, const QString &name, const QStringList &options, int defaultVal = 0); + bool addComboboxConfig(const QString &key, const QString &name, const QVariantMap &options, QVariant defaultVal = QVariant()); + +protected: + SettingJsonGenerator(); + + void mergeGroups(); + QJsonObject constructTopGroup(const QString &key); + QJsonObject constructConfigGroup(const QString &key); + QJsonObject constructConfig(const QString &key); + +private: + QMap topGroups; + QMap tmpTopGroups; + QMap configGroups; + QMap tmpConfigGroups; + QMap configs; +}; + +} +#endif // SETTINGJSONGENERATOR_H diff --git a/src/dfm-base/base/configs/customsettingitemregister.cpp b/src/dfm-base/base/configs/customsettingitemregister.cpp new file mode 100644 index 0000000000..b21b4196ee --- /dev/null +++ b/src/dfm-base/base/configs/customsettingitemregister.cpp @@ -0,0 +1,34 @@ +// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "dfm-base/settingdialog/customsettingitemregister.h" + +#include + +using namespace dfmbase; + +CustomSettingItemRegister::CustomSettingItemRegister() +{ +} + +const QMap &CustomSettingItemRegister::getCreators() const +{ + return creators; +} + +CustomSettingItemRegister *CustomSettingItemRegister::instance() +{ + static CustomSettingItemRegister ins; + return &ins; +} + +bool CustomSettingItemRegister::registCustomSettingItemType(const QString &type, const CustomSettingItemCreator &creator) +{ + if (creators.contains(type)) { + qWarning() << type << "is already registered..."; + return false; + } + creators.insert(type, creator); + return true; +} diff --git a/src/dfm-base/base/configs/settingbackend.cpp b/src/dfm-base/base/configs/settingbackend.cpp index e56d9c11cc..6b8a94c9a1 100644 --- a/src/dfm-base/base/configs/settingbackend.cpp +++ b/src/dfm-base/base/configs/settingbackend.cpp @@ -5,6 +5,7 @@ #include "settingbackend.h" #include "private/settingbackend_p.h" #include "dconfig/dconfigmanager.h" +#include "dfm-base/settingdialog/settingjsongenerator.h" #include @@ -14,40 +15,40 @@ DFMBASE_USE_NAMESPACE BidirectionHash SettingBackendPrivate::keyToAA { - { "base.open_action.allways_open_on_new_window", Application::kAllwayOpenOnNewWindow }, - { "base.open_action.open_file_action", Application::kOpenFileMode }, - { "base.new_tab_windows.default_window_path", Application::kUrlOfNewWindow }, - { "base.new_tab_windows.new_tab_path", Application::kUrlOfNewTab }, - { "base.default_view.icon_size", Application::kIconSizeLevel }, - { "base.default_view.view_mode", Application::kViewMode }, - { "base.default_view.view_size_adjustable", Application::kViewSizeAdjustable }, - { "base.default_view.mixed_sort", Application::kFileAndDirMixedSort }, + { "00_base.00_open_action.00_allways_open_on_new_window", Application::kAllwayOpenOnNewWindow }, + { "00_base.00_open_action.01_open_file_action", Application::kOpenFileMode }, + { "00_base.01_new_tab_windows.00_default_window_path", Application::kUrlOfNewWindow }, + { "00_base.01_new_tab_windows.01_new_tab_path", Application::kUrlOfNewTab }, + { "00_base.02_default_view.00_icon_size", Application::kIconSizeLevel }, + { "00_base.02_default_view.01_view_mode", Application::kViewMode }, + { "00_base.02_default_view.02_mixed_sort", Application::kFileAndDirMixedSort }, + // { "00_base.02_default_view.view_size_adjustable", Application::kViewSizeAdjustable }, }; BidirectionHash SettingBackendPrivate::keyToGA { - { "base.hidden_files.show_hidden", Application::kShowedHiddenFiles }, - { "base.hidden_files.show_suffix", Application::kShowedFileSuffix }, - { "advance.index.index_internal", Application::kIndexInternal }, - { "advance.index.index_external", Application::kIndexExternal }, - { "advance.index.index_search", Application::kIndexFullTextSearch }, - { "advance.search.show_hidden", Application::kShowedHiddenOnSearch }, - { "advance.preview.compress_file_preview", Application::kPreviewCompressFile }, - { "advance.preview.text_file_preview", Application::kPreviewTextFile }, - { "advance.preview.document_file_preview", Application::kPreviewDocumentFile }, - { "advance.preview.image_file_preview", Application::kPreviewImage }, - { "advance.preview.video_file_preview", Application::kPreviewVideo }, - { "advance.preview.audio_file_preview", Application::kPreviewAudio }, - { "advance.preview.remote_env_file_preview", Application::kShowThunmbnailInRemote }, - { "advance.mount.auto_mount", Application::kAutoMount }, - { "advance.mount.auto_mount_and_open", Application::kAutoMountAndOpen }, - { "advance.mount.mtp_show_bottom_info", Application::kMTPShowBottomInfo }, - { "advance.mount.merge_the_entries_of_samba_shared_folders", Application::kMergeTheEntriesOfSambaSharedFolders }, - { "advance.dialog.default_chooser_dialog", Application::kOverrideFileChooserDialog }, - { "advance.dialog.delete_confirmation_dialog", Application::kShowDeleteConfirmDialog }, - { "advance.other.hide_builtin_partition", Application::kHiddenSystemPartition }, - { "advance.other.hide_loop_partitions", Application::kHideLoopPartitions }, - { "advance.other.show_crumbbar_clickable_area", Application::kShowCsdCrumbBarClickableArea }, - { "advance.other.show_filesystemtag_on_diskicon", Application::kShowFileSystemTagOnDiskIcon }, + { "00_base.03_hidden_files.00_show_hidden", Application::kShowedHiddenFiles }, + { "00_base.03_hidden_files.01_show_suffix", Application::kShowedFileSuffix }, + { "01_advance.00_index.00_index_internal", Application::kIndexInternal }, + { "01_advance.00_index.01_index_external", Application::kIndexExternal }, + { "01_advance.00_index.02_index_search", Application::kIndexFullTextSearch }, + // { "01_advance.search.show_hidden", Application::kShowedHiddenOnSearch }, + { "01_advance.01_preview.00_compress_file_preview", Application::kPreviewCompressFile }, + { "01_advance.01_preview.01_text_file_preview", Application::kPreviewTextFile }, + { "01_advance.01_preview.02_document_file_preview", Application::kPreviewDocumentFile }, + { "01_advance.01_preview.03_image_file_preview", Application::kPreviewImage }, + { "01_advance.01_preview.04_video_file_preview", Application::kPreviewVideo }, + { "01_advance.01_preview.05_audio_file_preview", Application::kPreviewAudio }, + { "01_advance.01_preview.06_remote_env_file_preview", Application::kShowThunmbnailInRemote }, + { "01_advance.02_mount.00_auto_mount", Application::kAutoMount }, + { "01_advance.02_mount.01_auto_mount_and_open", Application::kAutoMountAndOpen }, + { "01_advance.02_mount.02_mtp_show_bottom_info", Application::kMTPShowBottomInfo }, + { "01_advance.02_mount.04_merge_the_entries_of_samba_shared_folders", Application::kMergeTheEntriesOfSambaSharedFolders }, + { "01_advance.03_dialog.00_default_chooser_dialog", Application::kOverrideFileChooserDialog }, + { "01_advance.03_dialog.01_delete_confirmation_dialog", Application::kShowDeleteConfirmDialog }, + { "01_advance.05_other.00_hide_builtin_partition", Application::kHiddenSystemPartition }, + { "01_advance.05_other.02_hide_loop_partitions", Application::kHideLoopPartitions }, + // { "01_advance.05_other.show_crumbbar_clickable_area", Application::kShowCsdCrumbBarClickableArea }, + { "01_advance.05_other.03_show_filesystemtag_on_diskicon", Application::kShowFileSystemTagOnDiskIcon }, }; SettingBackend::SettingBackend(QObject *parent) @@ -58,10 +59,13 @@ SettingBackend::SettingBackend(QObject *parent) connect(Application::instance(), &Application::appAttributeEdited, this, &SettingBackend::onValueChanged); connect(Application::instance(), &Application::genericAttributeEdited, this, &SettingBackend::onValueChanged); - addSettingAccessor( - "advance.other.extend_file_name", - [] { return DConfigManager::instance()->value(kDefaultCfgPath, "dfm.mount.dlnfs"); }, - [](const QVariant &var) { DConfigManager::instance()->setValue(kDefaultCfgPath, "dfm.mount.dlnfs", var); }); + initPresetSettingConfig(); + + // NOTE(xust): this item is hidden in *template*.js file. + // addSettingAccessor( + // "01_advance.05_other.extend_file_name", + // [] { return DConfigManager::instance()->value(kDefaultCfgPath, "dfm.mount.dlnfs"); }, + // [](const QVariant &var) { DConfigManager::instance()->setValue(kDefaultCfgPath, "dfm.mount.dlnfs", var); }); } SettingBackend::~SettingBackend() @@ -173,6 +177,165 @@ void SettingBackend::onValueChanged(int attribute, const QVariant &value) emit optionChanged(key, value); } +void SettingBackend::initPresetSettingConfig() +{ + auto ins = SettingJsonGenerator::instance(); + + // TODO(xust): these configs should be split into plugins. + ins->addGroup("00_base", "Basic"); + ins->addGroup("00_base.00_open_action", "Open behavior"); + ins->addCheckBoxConfig("00_base.00_open_action.00_allways_open_on_new_window", + "Always open folder in new window", + false); + ins->addComboboxConfig("00_base.00_open_action.01_open_file_action", + "Open file:", + QStringList { "Click", + "Double click" }, + 1); + + ins->addGroup("00_base.01_new_tab_windows", "New window and tab"); + ins->addComboboxConfig("00_base.01_new_tab_windows.00_default_window_path", + "Open from default window:", + { { "values", + QStringList { "Computer", + "Home", + "Desktop", + "Videos", + "Music", + "Pictures", + "Documents", + "Downloads" } }, + { "keys", + QStringList { "computer:///", + "standard://home", + "standard://desktop", + "standard://videos", + "standard://music", + "standard://pictures", + "standard://documents", + "standard://downloads" } } }, + "computer:///"); + ins->addComboboxConfig("00_base.01_new_tab_windows.01_new_tab_path", + "Open in new tab:", + { { "values", + QStringList { "Current Directory", + "Computer", + "Home", + "Desktop", + "Videos", + "Music", + "Pictures", + "Documents", + "Downloads" } }, + { "keys", + QStringList { "", + "computer:///", + "standard://home", + "standard://desktop", + "standard://videos", + "standard://music", + "standard://pictures", + "standard://documents", + "standard://downloads" } } }); + + ins->addGroup("00_base.02_default_view", "View"); + ins->addComboboxConfig("00_base.02_default_view.00_icon_size", + "Default size:", + QStringList { "Extra small", + "Small", + "Medium", + "Large", + "Extra large" }, + 1); + ins->addComboboxConfig("00_base.02_default_view.01_view_mode", + "Default view:", + { { "values", QStringList { "Icon", "List" } }, + { "keys", QVariantList { 1, 2 } } }, + 1); + ins->addCheckBoxConfig("00_base.02_default_view.02_mixed_sort", + "Mix sorting of files and folders", + false); + + ins->addGroup("00_base.03_hidden_files", "Hidden files"); + ins->addCheckBoxConfig("00_base.03_hidden_files.00_show_hidden", + "Show hidden files", + false); + ins->addCheckBoxConfig("00_base.03_hidden_files.01_show_suffix", + "Show file extensions"); + + ins->addGroup("01_advance", "Advanced"); + ins->addGroup("01_advance.00_index", "Index"); + ins->addCheckBoxConfig("01_advance.00_index.00_index_internal", + "Auto index internal disk"); + ins->addCheckBoxConfig("01_advance.00_index.01_index_external", + "Index external storage device after connected to computer", + false); + ins->addCheckBoxConfig("01_advance.00_index.02_index_search", + "Full-Text search", + false); + + ins->addGroup("01_advance.01_preview", "Preview"); + ins->addCheckBoxConfig("01_advance.01_preview.00_compress_file_preview", + "Compressed file preview", + false); + ins->addCheckBoxConfig("01_advance.01_preview.01_text_file_preview", + "Text preview"); + ins->addCheckBoxConfig("01_advance.01_preview.02_document_file_preview", + "Document preview"); + ins->addCheckBoxConfig("01_advance.01_preview.03_image_file_preview", + "Image preview"); + ins->addCheckBoxConfig("01_advance.01_preview.04_video_file_preview", + "Video preview"); + ins->addCheckBoxConfig("01_advance.01_preview.05_audio_file_preview", + "Music preview"); + ins->addConfig("01_advance.01_preview.06_remote_env_file_preview", + { { "key", "06_remote_env_file_preview" }, + { "text", "The remote environment shows thumbnail previews" }, + { "message", "Turning on the thumbnail preview may cause the remote directory to load slowly or the operation to freeze" }, + { "type", "checkBoxWithMessage" }, + { "default", false } }); + + ins->addGroup("01_advance.02_mount", "Mount"); + ins->addConfig("01_advance.02_mount.00_auto_mount", + { { "key", "00_auto_mount" }, + { "text", "Auto mount" }, + { "type", "mountCheckBox" }, + { "default", true } }); + ins->addConfig("01_advance.02_mount.01_auto_mount_and_open", + { { "key", "01_auto_mount_and_open" }, + { "text", "Open after auto mount" }, + { "type", "openCheckBox" }, + { "default", false } }); + ins->addCheckBoxConfig("01_advance.02_mount.02_mtp_show_bottom_info", + "Show item counts and sizes in the path of mounted MTP devices", + false); + ins->addConfig("01_advance.02_mount.04_merge_the_entries_of_samba_shared_folders", + { { "key", "04_merge_the_entries_of_samba_shared_folders" }, + { "text", "Merge the entries of Samba shared folders" }, + { "type", "checkBoxWithMessage" }, + { "message", "Switching the entry display may lead to failed mounting" }, + { "default", true } }); + + ins->addGroup("01_advance.03_dialog", "Dialog"); + ins->addCheckBoxConfig("01_advance.03_dialog.00_default_chooser_dialog", + "Use the file chooser dialog of File Manager"); + ins->addCheckBoxConfig("01_advance.03_dialog.01_delete_confirmation_dialog", + "Ask for my confirmation when deleting files", + false); + + ins->addGroup("01_advance.05_other", "Other"); + ins->addCheckBoxConfig("01_advance.05_other.00_hide_builtin_partition", + "Hide built-in disks on the Computer page"); + // ins->addCheckBoxConfig("01_advance.05_other.01_show_crumbbar_clickable_area", + // "Show crumb bar clickable area"); + ins->addCheckBoxConfig("01_advance.05_other.02_hide_loop_partitions", + "Hide loop partitions on the Computer page"); + ins->addCheckBoxConfig("01_advance.05_other.03_show_filesystemtag_on_diskicon", + "Show file system on disk icon"); + // ins->addCheckBoxConfig("01_advance.05_other.04_extend_file_name", + // ""); +} + void SettingBackendPrivate::saveAsAppAttr(const QString &key, const QVariant &val) { int attribute = keyToAA.value(key, static_cast(-1)); diff --git a/src/dfm-base/base/configs/settingbackend.h b/src/dfm-base/base/configs/settingbackend.h index 480a487a7a..e1f187f90f 100644 --- a/src/dfm-base/base/configs/settingbackend.h +++ b/src/dfm-base/base/configs/settingbackend.h @@ -40,6 +40,8 @@ class SettingBackend : public DSettingsBackend void doSetOption(const QString &key, const QVariant &value); void onValueChanged(int attribute, const QVariant &value); + void initPresetSettingConfig(); + private: explicit SettingBackend(QObject *parent = nullptr); ~SettingBackend(); diff --git a/src/dfm-base/base/configs/settingjsongenerator.cpp b/src/dfm-base/base/configs/settingjsongenerator.cpp new file mode 100644 index 0000000000..366dbcd183 --- /dev/null +++ b/src/dfm-base/base/configs/settingjsongenerator.cpp @@ -0,0 +1,208 @@ +// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "dfm-base/settingdialog/settingjsongenerator.h" + +#include +#include +#include + +#include + +using namespace dfmbase; + +SettingJsonGenerator::SettingJsonGenerator() +{ +} + +SettingJsonGenerator *SettingJsonGenerator::instance() +{ + static SettingJsonGenerator gen; + return &gen; +} + +QByteArray SettingJsonGenerator::genSettingJson() +{ + mergeGroups(); + + QJsonArray groups; + auto iter = topGroups.cbegin(); + while (iter != topGroups.cend()) { + groups.append(constructTopGroup(iter.key())); + iter++; + } + + QJsonObject obj; + obj.insert("groups", groups); + + QJsonDocument doc; + doc.setObject(obj); + return doc.toJson(QJsonDocument::Indented); +} + +bool SettingJsonGenerator::addGroup(const QString &key, const QString &name) +{ + if (key.count(".") > 1) { + qWarning() << "max group level is 2, inputed: " << key.count(".") << key; + return false; + } + if (key.startsWith(".") || key.endsWith(".")) { + qWarning() << "the dot must not be start or end of the key." << key; + return false; + } + + if (key.contains(".")) { + if (configGroups.contains(key)) { + qWarning() << "same name key has been added:" << key << ":" << configGroups.value(key); + return false; + } + configGroups.insert(key, name); + + // check if top group exist. + QString topGroup = key.split(".").first(); + if (!topGroups.contains(topGroup)) { + qWarning() << "no top group exist: " << topGroup; + tmpTopGroups.insert(topGroup, topGroup); + } + } else { + if (topGroups.contains(key)) { + qWarning() << "same name key has been added: " << key << ":" << topGroups.value(key); + return false; + } + topGroups.insert(key, name); + } + + return true; +} + +bool SettingJsonGenerator::addConfig(const QString &key, const QVariantMap &config) +{ + if (key.count(".") != 2) { + qWarning() << "config can only be inserted in level 2:" << key; + return false; + } + if (key.startsWith(".") || key.endsWith(".")) { + qWarning() << "the dot must not be start or end of the key." << key; + return false; + } + if (key.contains("..")) { + qWarning() << "cannot insert config into empty group: " << key; + return false; + } + if (configs.contains(key)) { + qWarning() << "a same name key is already added." << key << ":" << configs.value(key); + return false; + } + + QStringList frags = key.split("."); + if (frags.count() != 3) + return false; + QString configKey = frags.at(2); + if (config.value("key").toString() != configKey) { + qWarning() << "config is not valid with key" << key << config; + return false; + } + + frags.removeLast(); + tmpConfigGroups.insert(frags.join("."), frags.last()); + frags.removeLast(); + tmpTopGroups.insert(frags.first(), frags.first()); + + configs.insert(key, config); + return true; +} + +bool SettingJsonGenerator::addCheckBoxConfig(const QString &key, const QString &text, bool defaultVal) +{ + QVariantMap config { + { "key", key.mid(key.lastIndexOf(".") + 1) }, + { "text", text }, + { "type", "checkbox" }, + { "default", defaultVal } + }; + return addConfig(key, config); +} + +bool SettingJsonGenerator::addComboboxConfig(const QString &key, const QString &name, const QStringList &options, int defaultVal) +{ + QVariantMap config { + { "key", key.mid(key.lastIndexOf(".") + 1) }, + { "name", name }, + { "items", options }, + { "type", "combobox" }, + { "default", defaultVal } + }; + return addConfig(key, config); +} + +bool SettingJsonGenerator::addComboboxConfig(const QString &key, const QString &name, const QVariantMap &options, QVariant defaultVal) +{ + QVariantMap config { + { "key", key.mid(key.lastIndexOf(".") + 1) }, + { "name", name }, + { "items", options }, + { "type", "combobox" }, + { "default", defaultVal } + }; + return addConfig(key, config); +} + +void SettingJsonGenerator::mergeGroups() +{ + auto merge = [](const QMap &from, QMap &into) { + auto iter = from.cbegin(); + while (iter != from.cend()) { + if (!into.contains(iter.key())) + into.insert(iter.key(), iter.value()); + iter++; + } + }; + merge(tmpConfigGroups, configGroups); + merge(tmpTopGroups, topGroups); +} + +QJsonObject SettingJsonGenerator::constructTopGroup(const QString &key) +{ + qDebug() << "construct top group:" << key; + QJsonObject obj; + obj.insert("key", key); + obj.insert("name", topGroups.value(key, "Unknown")); + + QJsonArray groups; + auto iter = configGroups.cbegin(); + while (iter != configGroups.cend()) { + if (iter.key().startsWith(key)) + groups.append(constructConfigGroup(iter.key())); + iter++; + } + + obj.insert("groups", groups); + return obj; +} + +QJsonObject SettingJsonGenerator::constructConfigGroup(const QString &key) +{ + qDebug() << "construct config group:" << key; + QJsonObject obj; + obj.insert("key", key.mid(key.indexOf(".") + 1)); + obj.insert("name", configGroups.value(key, "Unknown")); + + QJsonArray options; + auto iter = configs.cbegin(); + while (iter != configs.cend()) { + if (iter.key().startsWith(key)) + options.append(constructConfig(iter.key())); + iter++; + } + + obj.insert("options", options); + return obj; +} + +QJsonObject SettingJsonGenerator::constructConfig(const QString &key) +{ + qDebug() << "construct item: " << key; + QVariantMap config = configs.value(key, QVariantMap()); + return QJsonObject::fromVariantMap(config); +} diff --git a/src/dfm-base/dialogs/settingsdialog/settingdialog.cpp b/src/dfm-base/dialogs/settingsdialog/settingdialog.cpp index 72733331a0..49d6bd8983 100644 --- a/src/dfm-base/dialogs/settingsdialog/settingdialog.cpp +++ b/src/dfm-base/dialogs/settingsdialog/settingdialog.cpp @@ -5,6 +5,8 @@ #include "settingdialog.h" #include "controls/checkboxwithmessage.h" +#include +#include #include #include #include @@ -149,19 +151,21 @@ void SettingDialog::settingFilter(QByteArray &data) } } -void SettingDialog::loadSettings(const QString &templateFile) +void SettingDialog::loadSettings(const QString & /*templateFile*/) { - QFile file(templateFile); - if (!file.open(QFile::ReadOnly)) - return; - QByteArray data = file.readAll(); - file.close(); + // QFile file(templateFile); + // if (!file.open(QFile::ReadOnly)) + // return; + // QByteArray data = file.readAll(); + // file.close(); + + QByteArray configJson = SettingJsonGenerator::instance()->genSettingJson(); if (!QDBusConnection::systemBus().interface()->isServiceRegistered("com.deepin.anything")) - data = removeQuickSearchIndex(data); + configJson = removeQuickSearchIndex(configJson); - settingFilter(data); - dtkSettings = DSettings::fromJson(data); + settingFilter(configJson); + dtkSettings = DSettings::fromJson(configJson); } QPointer SettingDialog::kAutoMountCheckBox = nullptr; @@ -171,11 +175,19 @@ QSet SettingDialog::kHiddenSettingItems {}; SettingDialog::SettingDialog(QWidget *parent) : DSettingsDialog(parent) { + // TODO(xust): move to server plugin. widgetFactory()->registerWidget("mountCheckBox", &SettingDialog::createAutoMountCheckBox); widgetFactory()->registerWidget("openCheckBox", &SettingDialog::createAutoMountOpenCheckBox); - widgetFactory()->registerWidget("splitter", &SettingDialog::createSplitter); + widgetFactory()->registerWidget("checkBoxWithMessage", &SettingDialog::createCheckBoxWithMessage); + auto creators = CustomSettingItemRegister::instance()->getCreators(); + auto iter = creators.cbegin(); + while (iter != creators.cend()) { + widgetFactory()->registerWidget(iter.key(), iter.value()); + iter++; + } + if (WindowUtils::isWayLand()) { setWindowFlags(this->windowFlags() & ~Qt::WindowMinMaxButtonsHint); setAttribute(Qt::WA_NativeWindow); @@ -185,6 +197,7 @@ SettingDialog::SettingDialog(QWidget *parent) setFixedSize(QSize(700, 700)); } + // TODO(xust): no need these files anymore. QString settingTemplate = #ifdef DISABLE_COMPRESS_PREIVEW ":/configure/global-setting-template-pro.js"; @@ -274,13 +287,6 @@ QPair SettingDialog::createAutoMountOpenCheckBox(QObject * return qMakePair(openCheckBox, nullptr); } -QPair SettingDialog::createSplitter(QObject *opt) -{ - auto option = qobject_cast(opt); - auto lab = new QLabel(qApp->translate("QObject", option->name().toStdString().c_str())); - return qMakePair(lab, nullptr); -} - QPair SettingDialog::createCheckBoxWithMessage(QObject *opt) { auto option = qobject_cast(opt); diff --git a/src/dfm-base/dialogs/settingsdialog/settingdialog.h b/src/dfm-base/dialogs/settingsdialog/settingdialog.h index 6116a51e45..c54ee8551f 100644 --- a/src/dfm-base/dialogs/settingsdialog/settingdialog.h +++ b/src/dfm-base/dialogs/settingsdialog/settingdialog.h @@ -28,7 +28,6 @@ class SettingDialog : public DSettingsDialog private: [[nodiscard]] static QPair createAutoMountCheckBox(QObject *opt); [[nodiscard]] static QPair createAutoMountOpenCheckBox(QObject *opt); - [[nodiscard]] static QPair createSplitter(QObject *opt); [[nodiscard]] static QPair createCheckBoxWithMessage(QObject *opt); static void mountCheckBoxStateChangedHandle(DSettingsOption *option, int state); diff --git a/src/plugins/filemanager/core/dfmplugin-sidebar/dfmplugin_sidebar_global.h b/src/plugins/filemanager/core/dfmplugin-sidebar/dfmplugin_sidebar_global.h index adbd440803..d401357aa8 100644 --- a/src/plugins/filemanager/core/dfmplugin-sidebar/dfmplugin_sidebar_global.h +++ b/src/plugins/filemanager/core/dfmplugin-sidebar/dfmplugin_sidebar_global.h @@ -43,6 +43,7 @@ inline constexpr char kQtItemFlags[] { "Property_Key_QtItemFlags" }; // value inline constexpr char kIsEjectable[] { "Property_Key_Ejectable" }; // value is bool, tem will set actionList(right edge) inline constexpr char kIsEditable[] { "Property_Key_Editable" }; // value is bool inline constexpr char kIsHidden[] { "Property_Key_Hidden" }; // value is bool, item will be hidden +inline constexpr char kVisiableSettingKey[] { "Property_Key_VisiableSettingItem" }; inline constexpr char kVisiableControlKey[] { "Property_Key_VisiableControl" }; // a string, used to identify the item when visiable state changed in dconfig; inline constexpr char kReportName[] { "Property_Key_ReportName" }; // a string, used to report log // calllbacks diff --git a/src/plugins/filemanager/core/dfmplugin-sidebar/events/sidebareventreceiver.cpp b/src/plugins/filemanager/core/dfmplugin-sidebar/events/sidebareventreceiver.cpp index 86594203a9..a8d606d736 100644 --- a/src/plugins/filemanager/core/dfmplugin-sidebar/events/sidebareventreceiver.cpp +++ b/src/plugins/filemanager/core/dfmplugin-sidebar/events/sidebareventreceiver.cpp @@ -12,6 +12,7 @@ #include #include +#include #include @@ -36,6 +37,7 @@ void SideBarEventReceiver::bindEvents() dpfSlotChannel->connect(kCurrentEventSpace, "slot_Item_Hidden", this, &SideBarEventReceiver::handleItemHidden); dpfSlotChannel->connect(kCurrentEventSpace, "slot_Item_TriggerEdit", this, &SideBarEventReceiver::handleItemTriggerEdit); dpfSlotChannel->connect(kCurrentEventSpace, "slot_Sidebar_UpdateSelection", this, &SideBarEventReceiver::handleSidebarUpdateSelection); + dpfSlotChannel->connect(kCurrentEventSpace, "slot_SidebarSetting_AddItem", this, &SideBarEventReceiver::handleAddSidebarVisiableControl); } void SideBarEventReceiver::handleItemHidden(const QUrl &url, bool visible) @@ -70,6 +72,24 @@ void SideBarEventReceiver::handleSidebarUpdateSelection(quint64 winId) } } +QString SideBarEventReceiver::handleAddSidebarVisiableControl(const QString &keyName, const QString &displayName) +{ + static int order = 30; + DFMBASE_USE_NAMESPACE; + SettingJsonGenerator::instance()->addConfig("01_advance.04_items_in_sidebar.30_3rd_plugin_splitter", + { { "key", "30_3rd_plugin_splitter" }, + { "name", tr("3rd plugins") }, + { "type", "sidebar-splitter" } }); + + QString key; + do { + order++; + key = QString("01_advance.04_items_in_sidebar.%1_%2").arg(order).arg(keyName); + } while (!SettingJsonGenerator::instance()->addCheckBoxConfig(key, displayName)); + qInfo() << "custom sidebar setting item added:" << key << order << keyName << displayName; + return key; +} + void SideBarEventReceiver::handleSetContextMenuEnable(bool enable) { SideBarHelper::contextMenuEnabled = enable; @@ -101,6 +121,12 @@ bool SideBarEventReceiver::handleItemAdd(const QUrl &url, const QVariantMap &pro if (SideBarInfoCacheMananger::instance()->contains(info)) return false; + if (properties.contains(PropertyKey::kVisiableSettingKey) + && properties.contains(PropertyKey::kVisiableControlKey)) { + SideBarHelper::bindSetting(properties.value(PropertyKey::kVisiableSettingKey).toString(), + properties.value(PropertyKey::kVisiableControlKey).toString()); + } + QList allSideBar = SideBarHelper::allSideBar(); if (!allSideBar.isEmpty()) { SideBarInfoCacheMananger::instance()->addItemInfoCache(info); @@ -189,6 +215,12 @@ bool SideBarEventReceiver::handleItemInsert(int index, const QUrl &url, const QV if (SideBarInfoCacheMananger::instance()->contains(info)) return false; + if (properties.contains(PropertyKey::kVisiableSettingKey) + && properties.contains(PropertyKey::kVisiableControlKey)) { + SideBarHelper::bindSetting(properties.value(PropertyKey::kVisiableSettingKey).toString(), + properties.value(PropertyKey::kVisiableControlKey).toString()); + } + QList allSideBar = SideBarHelper::allSideBar(); if (!allSideBar.isEmpty()) { SideBarInfoCacheMananger::instance()->insertItemInfoCache(index, info); diff --git a/src/plugins/filemanager/core/dfmplugin-sidebar/events/sidebareventreceiver.h b/src/plugins/filemanager/core/dfmplugin-sidebar/events/sidebareventreceiver.h index 9d1a444f76..26ddcb2aa1 100644 --- a/src/plugins/filemanager/core/dfmplugin-sidebar/events/sidebareventreceiver.h +++ b/src/plugins/filemanager/core/dfmplugin-sidebar/events/sidebareventreceiver.h @@ -30,6 +30,7 @@ public slots: void handleItemHidden(const QUrl &url, bool visible); // TODO(zhangs): remove void handleItemTriggerEdit(quint64 winId, const QUrl &url); void handleSidebarUpdateSelection(quint64 winId); + QString handleAddSidebarVisiableControl(const QString &keyName, const QString &displayName); private: explicit SideBarEventReceiver(QObject *parent = nullptr); diff --git a/src/plugins/filemanager/core/dfmplugin-sidebar/sidebar.cpp b/src/plugins/filemanager/core/dfmplugin-sidebar/sidebar.cpp index 3858f7a526..b35c7a1a7b 100644 --- a/src/plugins/filemanager/core/dfmplugin-sidebar/sidebar.cpp +++ b/src/plugins/filemanager/core/dfmplugin-sidebar/sidebar.cpp @@ -36,7 +36,10 @@ bool SideBar::start() qDebug() << "register dconfig failed: " << err; return false; } + + SideBarHelper::initSettingPane(); SideBarHelper::bindSettings(); + SideBarHelper::registCustomSettingItem(); return true; } diff --git a/src/plugins/filemanager/core/dfmplugin-sidebar/sidebar.h b/src/plugins/filemanager/core/dfmplugin-sidebar/sidebar.h index 370b16d6fa..1adf5f6220 100644 --- a/src/plugins/filemanager/core/dfmplugin-sidebar/sidebar.h +++ b/src/plugins/filemanager/core/dfmplugin-sidebar/sidebar.h @@ -29,6 +29,7 @@ class SideBar : public dpf::Plugin DPF_EVENT_REG_SLOT(slot_Item_Hidden) DPF_EVENT_REG_SLOT(slot_Item_TriggerEdit) DPF_EVENT_REG_SLOT(slot_Sidebar_UpdateSelection) + DPF_EVENT_REG_SLOT(slot_SidebarSetting_AddItem) // signal events DPF_EVENT_REG_SIGNAL(signal_Sidebar_Sorted) diff --git a/src/plugins/filemanager/core/dfmplugin-sidebar/utils/sidebarhelper.cpp b/src/plugins/filemanager/core/dfmplugin-sidebar/utils/sidebarhelper.cpp index acb9e730b5..efa807f224 100644 --- a/src/plugins/filemanager/core/dfmplugin-sidebar/utils/sidebarhelper.cpp +++ b/src/plugins/filemanager/core/dfmplugin-sidebar/utils/sidebarhelper.cpp @@ -12,10 +12,13 @@ #include "events/sidebareventreceiver.h" #include +#include +#include #include #include #include #include +#include #include #include #include @@ -23,8 +26,10 @@ #include +#include + #include -#include +#include DPSIDEBAR_USE_NAMESPACE DFMBASE_USE_NAMESPACE @@ -184,26 +189,40 @@ void SideBarHelper::updateSideBarSelection(quint64 winId) void SideBarHelper::bindSettings() { static const std::map kvs { - { "advance.items_in_sidebar.recent", "recent" }, - { "advance.items_in_sidebar.home", "home" }, - { "advance.items_in_sidebar.desktop", "desktop" }, - { "advance.items_in_sidebar.videos", "videos" }, - { "advance.items_in_sidebar.music", "music" }, - { "advance.items_in_sidebar.pictures", "pictures" }, - { "advance.items_in_sidebar.documents", "documents" }, - { "advance.items_in_sidebar.downloads", "downloads" }, - { "advance.items_in_sidebar.trash", "trash" }, - { "advance.items_in_sidebar.computer", "computer" }, - { "advance.items_in_sidebar.vault", "vault" }, - { "advance.items_in_sidebar.builtin", "builtin_disks" }, - { "advance.items_in_sidebar.loop", "loop_dev" }, - { "advance.items_in_sidebar.other_disks", "other_disks" }, - { "advance.items_in_sidebar.computers_in_lan", "computers_in_lan" }, - { "advance.items_in_sidebar.my_shares", "my_shares" }, - { "advance.items_in_sidebar.mounted_share_dirs", "mounted_share_dirs" }, - { "advance.items_in_sidebar.tags", "tags" } + // group 00_quick_access_splitter + { "01_advance.04_items_in_sidebar.01_recent", "recent" }, + { "01_advance.04_items_in_sidebar.02_home", "home" }, + { "01_advance.04_items_in_sidebar.03_desktop", "desktop" }, + { "01_advance.04_items_in_sidebar.04_videos", "videos" }, + { "01_advance.04_items_in_sidebar.05_music", "music" }, + { "01_advance.04_items_in_sidebar.06_pictures", "pictures" }, + { "01_advance.04_items_in_sidebar.07_documents", "documents" }, + { "01_advance.04_items_in_sidebar.08_downloads", "downloads" }, + { "01_advance.04_items_in_sidebar.09_trash", "trash" }, + + // group 10_partitions_splitter + { "01_advance.04_items_in_sidebar.11_computer", "computer" }, + // { "01_advance.04_items_in_sidebar.12_vault", "vault" }, + { "01_advance.04_items_in_sidebar.13_builtin", "builtin_disks" }, + { "01_advance.04_items_in_sidebar.14_loop", "loop_dev" }, + { "01_advance.04_items_in_sidebar.15_other_disks", "other_disks" }, + + // group 16_network_splitters + { "01_advance.04_items_in_sidebar.17_computers_in_lan", "computers_in_lan" }, + { "01_advance.04_items_in_sidebar.18_my_shares", "my_shares" }, + { "01_advance.04_items_in_sidebar.19_mounted_share_dirs", "mounted_share_dirs" }, + + // group 20_tag_splitter + { "01_advance.04_items_in_sidebar.21_tags", "tags" } }; + std::for_each(kvs.begin(), kvs.end(), [](std::pair pair) { + bindSetting(pair.first, pair.second); + }); +} + +void SideBarHelper::bindSetting(const QString &itemVisiableSettingKey, const QString &itemVisiableControlKey) +{ auto getter = [](const QString &key) { return hiddenRules().value(key, true); }; @@ -213,21 +232,89 @@ void SideBarHelper::bindSettings() DConfigManager::instance()->setValue(ConfigInfos::kConfName, ConfigInfos::kVisiableKey, curr); }; - auto bindConf = [getter, saver](const QString &settingKey, const QString &dconfKey) { - using namespace std; - using namespace std::placeholders; - SettingBackend::instance()->addSettingAccessor(settingKey, bind(getter, dconfKey), bind(saver, dconfKey, _1)); + auto bindConf = [&](const QString &itemVisiableSettingKey, const QString &itemVisiableControlKey) { + SettingBackend::instance()->addSettingAccessor(itemVisiableSettingKey, + std::bind(getter, itemVisiableControlKey), + std::bind(saver, itemVisiableControlKey, std::placeholders::_1)); }; - std::for_each(kvs.begin(), kvs.end(), [bindConf](std::pair pair) { - SettingBackend::instance()->addToSerialDataKey(pair.first); - bindConf(pair.first, pair.second); - }); + // FIXME(xust): i don't know what this function do, but seem work to solve the issue. + // commit: e634381afdb03f1f835e2e9f35d369ef782b0312 + // Bug: https://pms.uniontech.com/bug-view-156469.html + // figure it out later. + SettingBackend::instance()->addToSerialDataKey(itemVisiableSettingKey); + bindConf(itemVisiableSettingKey, itemVisiableControlKey); +} - if (DSysInfo::isCommunityEdition()) { - SettingDialog::setItemVisiable("advance.items_in_sidebar.vault", false); - qDebug() << "hide vault config in community edition."; - } +void SideBarHelper::initSettingPane() +{ + auto ins = SettingJsonGenerator::instance(); + ins->addGroup("01_advance.04_items_in_sidebar", "Items on sidebar pane"); + ins->addConfig("01_advance.04_items_in_sidebar.00_quick_access_splitter", + { { "key", "00_quick_access_splitter" }, + { "name", "Quick access" }, + { "type", "sidebar-splitter" } }); + ins->addCheckBoxConfig("01_advance.04_items_in_sidebar.01_recent", + "Recent"); + ins->addCheckBoxConfig("01_advance.04_items_in_sidebar.02_home", + "Home"); + ins->addCheckBoxConfig("01_advance.04_items_in_sidebar.03_desktop", + "Desktop"); + ins->addCheckBoxConfig("01_advance.04_items_in_sidebar.04_videos", + "Videos"); + ins->addCheckBoxConfig("01_advance.04_items_in_sidebar.05_music", + "Music"); + ins->addCheckBoxConfig("01_advance.04_items_in_sidebar.06_pictures", + "Pictures"); + ins->addCheckBoxConfig("01_advance.04_items_in_sidebar.07_documents", + "Documents"); + ins->addCheckBoxConfig("01_advance.04_items_in_sidebar.08_downloads", + "Downloads"); + ins->addCheckBoxConfig("01_advance.04_items_in_sidebar.09_trash", + "Trash"); + + ins->addConfig("01_advance.04_items_in_sidebar.10_partitions_splitter", + { { "key", "10_partitions_splitter" }, + { "name", "Partitions" }, + { "type", "sidebar-splitter" } }); + ins->addCheckBoxConfig("01_advance.04_items_in_sidebar.11_computer", + "Computer"); + // ins->addCheckBoxConfig("01_advance.04_items_in_sidebar.12_vault", + // "Vault"); + ins->addCheckBoxConfig("01_advance.04_items_in_sidebar.13_builtin", + "Built-in disks"); + ins->addCheckBoxConfig("01_advance.04_items_in_sidebar.14_loop", + "Loop partitions"); + ins->addCheckBoxConfig("01_advance.04_items_in_sidebar.15_other_disks", + "Mounted partitions and discs"); + + ins->addConfig("01_advance.04_items_in_sidebar.16_network_splitters", + { { "key", "16_network_splitters" }, + { "name", "Network" }, + { "type", "sidebar-splitter" } }); + ins->addCheckBoxConfig("01_advance.04_items_in_sidebar.17_computers_in_lan", + "Computers in LAN"); + ins->addCheckBoxConfig("01_advance.04_items_in_sidebar.18_my_shares", + "My shares"); + ins->addCheckBoxConfig("01_advance.04_items_in_sidebar.19_mounted_share_dirs", + "Mounted sharing folders"); + + ins->addConfig("01_advance.04_items_in_sidebar.20_tag_splitter", + { { "key", "20_tag_splitter" }, + { "name", "Tag" }, + { "type", "sidebar-splitter" } }); + ins->addCheckBoxConfig("01_advance.04_items_in_sidebar.21_tags", + "Added tags"); +} + +void SideBarHelper::registCustomSettingItem() +{ + CustomSettingItemRegister::instance()->registCustomSettingItemType("sidebar-splitter", + [](QObject *opt) -> QPair { + auto option = qobject_cast(opt); + auto lab = new QLabel(qApp->translate("QObject", option->name().toStdString().c_str())); + return qMakePair(lab, nullptr); + }); } QVariantMap SideBarHelper::hiddenRules() diff --git a/src/plugins/filemanager/core/dfmplugin-sidebar/utils/sidebarhelper.h b/src/plugins/filemanager/core/dfmplugin-sidebar/utils/sidebarhelper.h index f04a0c7e3d..c9942ee1d6 100644 --- a/src/plugins/filemanager/core/dfmplugin-sidebar/utils/sidebarhelper.h +++ b/src/plugins/filemanager/core/dfmplugin-sidebar/utils/sidebarhelper.h @@ -34,6 +34,9 @@ class SideBarHelper static void updateSideBarSelection(quint64 winId); static void bindSettings(); + static void bindSetting(const QString &itemVisiableSettingKey, const QString &itemVisiableControlKey); + static void initSettingPane(); + static void registCustomSettingItem(); static QVariantMap hiddenRules(); static QVariantMap groupExpandRules(); diff --git a/src/plugins/filemanager/dfmplugin-smbbrowser/smbbrowser.cpp b/src/plugins/filemanager/dfmplugin-smbbrowser/smbbrowser.cpp index 04f218325c..1b9f65308f 100644 --- a/src/plugins/filemanager/dfmplugin-smbbrowser/smbbrowser.cpp +++ b/src/plugins/filemanager/dfmplugin-smbbrowser/smbbrowser.cpp @@ -48,6 +48,8 @@ void SmbBrowser::initialize() dfmplugin_menu_util::menuSceneRegisterScene(SmbBrowserMenuCreator::name(), new SmbBrowserMenuCreator()); bindWindows(); + + smb_browser_utils::initSettingPane(); smb_browser_utils::bindSetting(); followEvents(); diff --git a/src/plugins/filemanager/dfmplugin-smbbrowser/utils/smbbrowserutils.cpp b/src/plugins/filemanager/dfmplugin-smbbrowser/utils/smbbrowserutils.cpp index c4415e0379..7ae61e822d 100644 --- a/src/plugins/filemanager/dfmplugin-smbbrowser/utils/smbbrowserutils.cpp +++ b/src/plugins/filemanager/dfmplugin-smbbrowser/utils/smbbrowserutils.cpp @@ -6,6 +6,7 @@ #include "displaycontrol/utilities/protocoldisplayutilities.h" #include +#include #include #include #include @@ -142,7 +143,7 @@ void bindSetting() static constexpr char kShowOfflineKey[] { "dfm.samba.permanent" }; DFMBASE_USE_NAMESPACE SettingBackend::instance()->addSettingAccessor( - "advance.mount.always_show_offline_remote_connection", + "01_advance.02_mount.03_always_show_offline_remote_connection", [] { return DConfigManager::instance()->value(kDefaultCfgPath, kShowOfflineKey); }, [](const QVariant &var) { DConfigManager::instance()->setValue(kDefaultCfgPath, kShowOfflineKey, var); }); } @@ -159,5 +160,11 @@ QMap &shareNodes() return nodes; } +void initSettingPane() +{ + dfmbase::SettingJsonGenerator::instance()->addCheckBoxConfig("01_advance.02_mount.03_always_show_offline_remote_connection", + "Keep showing the mounted Samba shares"); +} + } } diff --git a/src/plugins/filemanager/dfmplugin-smbbrowser/utils/smbbrowserutils.h b/src/plugins/filemanager/dfmplugin-smbbrowser/utils/smbbrowserutils.h index 3e8c0a7014..941bcb55ff 100644 --- a/src/plugins/filemanager/dfmplugin-smbbrowser/utils/smbbrowserutils.h +++ b/src/plugins/filemanager/dfmplugin-smbbrowser/utils/smbbrowserutils.h @@ -29,6 +29,7 @@ bool startService(const QString &service); void enableServiceAsync(); bool checkAndEnableService(const QString &service); +void initSettingPane(); // bind dconfig void bindSetting(); diff --git a/src/plugins/filemanager/dfmplugin-vault/utils/vaultvisiblemanager.cpp b/src/plugins/filemanager/dfmplugin-vault/utils/vaultvisiblemanager.cpp index f9e10560bf..5dddd7165f 100644 --- a/src/plugins/filemanager/dfmplugin-vault/utils/vaultvisiblemanager.cpp +++ b/src/plugins/filemanager/dfmplugin-vault/utils/vaultvisiblemanager.cpp @@ -19,6 +19,7 @@ #include "plugins/common/core/dfmplugin-menu/menu_eventinterface_helper.h" +#include #include #include #include @@ -116,6 +117,12 @@ void VaultVisibleManager::addVaultComputerMenu() dfmplugin_menu_util::menuSceneRegisterScene(VaultMenuSceneCreator::name(), new VaultMenuSceneCreator); } +void VaultVisibleManager::addSettingPaneItem() +{ + SettingJsonGenerator::instance()->addCheckBoxConfig("01_advance.04_items_in_sidebar.12_vault", + "Vault"); +} + void VaultVisibleManager::addSideBarVaultItem() { if (isVaultEnabled()) { @@ -130,6 +137,7 @@ void VaultVisibleManager::addSideBarVaultItem() { "Property_Key_CallbackItemClicked", QVariant::fromValue(cdCb) }, { "Property_Key_CallbackContextMenu", QVariant::fromValue(contextMenuCb) }, { "Property_Key_VisiableControl", "vault" }, + { "Property_Key_VisiableSettingItem", "01_advance.04_items_in_sidebar.12_vault" }, { "Property_Key_ReportName", "Vault" } }; diff --git a/src/plugins/filemanager/dfmplugin-vault/utils/vaultvisiblemanager.h b/src/plugins/filemanager/dfmplugin-vault/utils/vaultvisiblemanager.h index 1cac24674b..7a951579d3 100644 --- a/src/plugins/filemanager/dfmplugin-vault/utils/vaultvisiblemanager.h +++ b/src/plugins/filemanager/dfmplugin-vault/utils/vaultvisiblemanager.h @@ -17,9 +17,9 @@ class VaultVisibleManager : public QObject public: /*! - * \brief isVaultEnabled - * \return true vault is available, vice versa. - */ + * \brief isVaultEnabled + * \return true vault is available, vice versa. + */ bool isVaultEnabled(); void infoRegister(); void pluginServiceRegister(); @@ -32,6 +32,7 @@ public slots: void removeComputerVaultItem(); void onComputerRefresh(); void addVaultComputerMenu(); + void addSettingPaneItem(); public: static VaultVisibleManager *instance(); diff --git a/src/plugins/filemanager/dfmplugin-vault/vault.cpp b/src/plugins/filemanager/dfmplugin-vault/vault.cpp index 8fb1a3fa9c..d192efd756 100644 --- a/src/plugins/filemanager/dfmplugin-vault/vault.cpp +++ b/src/plugins/filemanager/dfmplugin-vault/vault.cpp @@ -28,6 +28,7 @@ void Vault::initialize() bool Vault::start() { VaultVisibleManager::instance()->pluginServiceRegister(); + VaultVisibleManager::instance()->addSettingPaneItem(); return true; }