diff options
author | saturneric <[email protected]> | 2025-04-16 22:38:40 +0000 |
---|---|---|
committer | saturneric <[email protected]> | 2025-04-16 22:38:40 +0000 |
commit | 72d98ff183bcedd05c5a996fccaa0544cb4ac309 (patch) | |
tree | eb7ce626d3bf4243c9efe3f23bba6ec830f59a5b /src | |
parent | fix: solve CI build dependencies (diff) | |
download | GpgFrontend-72d98ff183bcedd05c5a996fccaa0544cb4ac309.tar.gz GpgFrontend-72d98ff183bcedd05c5a996fccaa0544cb4ac309.zip |
feat: switch text-based model to workspace-based model
Diffstat (limited to 'src')
32 files changed, 241 insertions, 144 deletions
diff --git a/src/core/function/gpg/GpgBasicOperator.cpp b/src/core/function/gpg/GpgBasicOperator.cpp index 43917db3..2f624b60 100644 --- a/src/core/function/gpg/GpgBasicOperator.cpp +++ b/src/core/function/gpg/GpgBasicOperator.cpp @@ -30,7 +30,7 @@ #include <gpg-error.h> -#include "core/GpgModel.h" +#include "core/model/GpgData.h" #include "core/model/GpgDecryptResult.h" #include "core/model/GpgEncryptResult.h" #include "core/model/GpgSignResult.h" diff --git a/src/core/function/gpg/GpgKeyImportExporter.cpp b/src/core/function/gpg/GpgKeyImportExporter.cpp index 08e67748..f42c84ce 100644 --- a/src/core/function/gpg/GpgKeyImportExporter.cpp +++ b/src/core/function/gpg/GpgKeyImportExporter.cpp @@ -28,7 +28,7 @@ #include "GpgKeyImportExporter.h" -#include "core/GpgModel.h" +#include "core/model/GpgData.h" #include "core/model/GpgImportInformation.h" #include "core/utils/AsyncUtils.h" #include "core/utils/GpgUtils.h" diff --git a/src/core/function/gpg/GpgKeyManager.cpp b/src/core/function/gpg/GpgKeyManager.cpp index a2c53975..9f43d03d 100644 --- a/src/core/function/gpg/GpgKeyManager.cpp +++ b/src/core/function/gpg/GpgKeyManager.cpp @@ -28,10 +28,10 @@ #include "GpgKeyManager.h" -#include "core/GpgModel.h" #include "core/function/gpg/GpgAutomatonHandler.h" #include "core/function/gpg/GpgBasicOperator.h" #include "core/function/gpg/GpgKeyGetter.h" +#include "core/model/GpgData.h" #include "core/utils/GpgUtils.h" namespace GpgFrontend { diff --git a/src/core/function/gpg/GpgUIDOperator.cpp b/src/core/function/gpg/GpgUIDOperator.cpp index a951fa6f..e34d224a 100644 --- a/src/core/function/gpg/GpgUIDOperator.cpp +++ b/src/core/function/gpg/GpgUIDOperator.cpp @@ -28,8 +28,8 @@ #include "GpgUIDOperator.h" -#include "core/GpgModel.h" #include "core/function/gpg/GpgAutomatonHandler.h" +#include "core/model/GpgData.h" #include "core/utils/GpgUtils.h" namespace GpgFrontend { diff --git a/src/core/model/GpgKey.cpp b/src/core/model/GpgKey.cpp index 1a7b7961..6241fd20 100644 --- a/src/core/model/GpgKey.cpp +++ b/src/core/model/GpgKey.cpp @@ -128,13 +128,13 @@ auto GpgKey::PrimaryKeyLength() const -> unsigned int { return key_ref_->subkeys->length; } -auto GpgKey::IsHasEncrCap() const -> bool { return key_ref_->can_encrypt; } +auto GpgKey::IsHasEncrCap() const -> bool { return IsHasActualEncrCap(); } -auto GpgKey::IsHasSignCap() const -> bool { return key_ref_->can_sign; } +auto GpgKey::IsHasSignCap() const -> bool { return IsHasActualSignCap(); } -auto GpgKey::IsHasCertCap() const -> bool { return key_ref_->can_certify; } +auto GpgKey::IsHasCertCap() const -> bool { return IsHasActualCertCap(); } -auto GpgKey::IsHasAuthCap() const -> bool { return key_ref_->can_authenticate; } +auto GpgKey::IsHasAuthCap() const -> bool { return IsHasActualAuthCap(); } auto GpgKey::IsHasCardKey() const -> bool { auto sub_keys = SubKeys(); diff --git a/src/core/utils/IOUtils.cpp b/src/core/utils/IOUtils.cpp index 39f00d19..6a195e73 100644 --- a/src/core/utils/IOUtils.cpp +++ b/src/core/utils/IOUtils.cpp @@ -28,7 +28,6 @@ #include "IOUtils.h" -#include "core/GpgModel.h" #include "core/utils/FilesystemUtils.h" namespace GpgFrontend { diff --git a/src/test/core/GpgCoreTestBasicOpera.cpp b/src/test/core/GpgCoreTestBasicOpera.cpp index 3e188478..316b65a3 100644 --- a/src/test/core/GpgCoreTestBasicOpera.cpp +++ b/src/test/core/GpgCoreTestBasicOpera.cpp @@ -27,7 +27,6 @@ */ #include "GpgCoreTest.h" -#include "core/GpgModel.h" #include "core/function/gpg/GpgBasicOperator.h" #include "core/function/gpg/GpgKeyGetter.h" #include "core/function/result_analyse/GpgDecryptResultAnalyse.h" diff --git a/src/ui/dialog/KeyGroupManageDialog.cpp b/src/ui/dialog/KeyGroupManageDialog.cpp index 88892ada..d7b9b3d3 100644 --- a/src/ui/dialog/KeyGroupManageDialog.cpp +++ b/src/ui/dialog/KeyGroupManageDialog.cpp @@ -87,6 +87,9 @@ KeyGroupManageDialog::KeyGroupManageDialog( ui_->addButton->setDisabled(true); ui_->removeButton->setDisabled(true); + ui_->keyGroupTipLabel->setText(tr("Key(s) in Key Group: ")); + ui_->keyDBTipLabel->setText(tr("Key(s) in Key Dayabase: ")); + QTimer::singleShot(200, [=]() { slot_notify_invalid_key_ids(); }); this->setModal(true); diff --git a/src/ui/dialog/SignersPicker.cpp b/src/ui/dialog/SignersPicker.cpp index 94a8f8df..f8bce07b 100644 --- a/src/ui/dialog/SignersPicker.cpp +++ b/src/ui/dialog/SignersPicker.cpp @@ -28,7 +28,6 @@ #include "SignersPicker.h" -#include "core/GpgModel.h" #include "ui/widgets/KeyList.h" namespace GpgFrontend::UI { diff --git a/src/ui/dialog/controller/GnuPGControllerDialog.cpp b/src/ui/dialog/controller/GnuPGControllerDialog.cpp index 0ad1a6ca..5dacae65 100644 --- a/src/ui/dialog/controller/GnuPGControllerDialog.cpp +++ b/src/ui/dialog/controller/GnuPGControllerDialog.cpp @@ -28,7 +28,6 @@ #include "GnuPGControllerDialog.h" -#include "core/GpgModel.h" #include "core/function/GlobalSettingStation.h" #include "core/model/SettingsObject.h" #include "core/module/ModuleManager.h" diff --git a/src/ui/dialog/controller/SmartCardControllerDialog.cpp b/src/ui/dialog/controller/SmartCardControllerDialog.cpp index 6cc1f324..b48d49af 100644 --- a/src/ui/dialog/controller/SmartCardControllerDialog.cpp +++ b/src/ui/dialog/controller/SmartCardControllerDialog.cpp @@ -46,6 +46,23 @@ SmartCardControllerDialog::SmartCardControllerDialog(QWidget* parent) channel_(kGpgFrontendDefaultChannel) { ui_->setupUi(this); + ui_->smartCardLabel->setText(tr("Smart Card(s):")); + ui_->keyStubLabel->setText(tr("Key Stub(s) in Key Database(s):")); + + ui_->cNameButton->setText(tr("Change Name")); + ui_->cLangButton->setText(tr("Change Language")); + ui_->cGenderButton->setText(tr("Change Gender")); + ui_->cLoginDataButton->setText(tr("Change Login Data")); + ui_->cPubKeyURLButton->setText(tr("Change Public Key URL")); + ui_->cPINButton->setText(tr("Change PIN")); + ui_->cAdminPINButton->setText(tr("Change Admin PIN")); + ui_->cResetCodeButton->setText(tr("Change Reset Code")); + ui_->fetchButton->setText(tr("Fetch")); + ui_->restartGpgAgentButton->setText(tr("Restart All Gpg-Agents")); + ui_->refreshButton->setText(tr("Refresh")); + + ui_->operationGroupBox->setTitle(tr("Operations")); + for (const auto& key_db : GetGpgKeyDatabaseInfos()) { ui_->keyDBIndexComboBox->insertItem( key_db.channel, QString("%1: %2").arg(key_db.channel).arg(key_db.name)); @@ -117,6 +134,8 @@ SmartCardControllerDialog::SmartCardControllerDialog(QWidget* parent) connect(timer_, &QTimer::timeout, this, &SmartCardControllerDialog::slot_listen_smart_card_changes); timer_->start(3000); + + setWindowTitle(tr("Smart Card Controller")); } void SmartCardControllerDialog::select_smart_card_by_serial_number( @@ -383,7 +402,7 @@ void SmartCardControllerDialog::slot_listen_smart_card_changes() { } void SmartCardControllerDialog::slot_disable_controllers(bool disable) { - ui_->groupBox->setDisabled(disable); + ui_->operationGroupBox->setDisabled(disable); ui_->keyDBIndexComboBox->setDisabled(disable); ui_->cardKeysTreeView->setDisabled(disable); } diff --git a/src/ui/dialog/details/VerifyDetailsDialog.cpp b/src/ui/dialog/details/VerifyDetailsDialog.cpp index e833ea01..abdf596f 100644 --- a/src/ui/dialog/details/VerifyDetailsDialog.cpp +++ b/src/ui/dialog/details/VerifyDetailsDialog.cpp @@ -28,7 +28,6 @@ #include "VerifyDetailsDialog.h" -#include "core/GpgModel.h" #include "ui/widgets/VerifyKeyDetailBox.h" namespace GpgFrontend::UI { diff --git a/src/ui/dialog/import_export/KeyServerImportDialog.cpp b/src/ui/dialog/import_export/KeyServerImportDialog.cpp index 8e01bd4b..ad80f1a1 100644 --- a/src/ui/dialog/import_export/KeyServerImportDialog.cpp +++ b/src/ui/dialog/import_export/KeyServerImportDialog.cpp @@ -28,7 +28,6 @@ #include "KeyServerImportDialog.h" -#include "core/GpgModel.h" #include "core/function/GlobalSettingStation.h" #include "core/function/gpg/GpgKeyImportExporter.h" #include "core/model/SettingsObject.h" diff --git a/src/ui/dialog/key_generate/KeyGenerateDialog.cpp b/src/ui/dialog/key_generate/KeyGenerateDialog.cpp index a12db246..0a2dbe1a 100644 --- a/src/ui/dialog/key_generate/KeyGenerateDialog.cpp +++ b/src/ui/dialog/key_generate/KeyGenerateDialog.cpp @@ -28,7 +28,6 @@ #include "KeyGenerateDialog.h" -#include "core/GpgModel.h" #include "core/function/GlobalSettingStation.h" #include "core/function/gpg/GpgKeyOpera.h" #include "core/typedef/GpgTypedef.h" diff --git a/src/ui/dialog/keypair_details/KeyDetailsDialog.cpp b/src/ui/dialog/keypair_details/KeyDetailsDialog.cpp index 273d3316..340820da 100644 --- a/src/ui/dialog/keypair_details/KeyDetailsDialog.cpp +++ b/src/ui/dialog/keypair_details/KeyDetailsDialog.cpp @@ -28,7 +28,6 @@ #include "KeyDetailsDialog.h" -#include "core/GpgModel.h" #include "ui/UISignalStation.h" #include "ui/dialog/keypair_details/KeyPairDetailTab.h" #include "ui/dialog/keypair_details/KeyPairOperaTab.h" diff --git a/src/ui/dialog/keypair_details/KeyPairDetailTab.cpp b/src/ui/dialog/keypair_details/KeyPairDetailTab.cpp index b5a6c1d2..72a9a7c8 100644 --- a/src/ui/dialog/keypair_details/KeyPairDetailTab.cpp +++ b/src/ui/dialog/keypair_details/KeyPairDetailTab.cpp @@ -58,7 +58,6 @@ KeyPairDetailTab::KeyPairDetailTab(int channel, GpgKeyPtr key, QWidget* parent) key_id_var_label_->setTextInteractionFlags(Qt::TextSelectableByMouse); usage_var_label_ = new QLabel(); - actual_usage_var_label_ = new QLabel(); owner_trust_var_label_ = new QLabel(); key_size_var_label_ = new QLabel(); @@ -84,13 +83,12 @@ KeyPairDetailTab::KeyPairDetailTab(int channel, GpgKeyPtr key, QWidget* parent) vbox_kd->addWidget(new QLabel(tr("Algorithm") + ": "), 1, 0); vbox_kd->addWidget(new QLabel(tr("Algorithm Detail") + ": "), 2, 0); vbox_kd->addWidget(new QLabel(tr("Key Size") + ": "), 3, 0); - vbox_kd->addWidget(new QLabel(tr("Nominal Usage") + ": "), 4, 0); - vbox_kd->addWidget(new QLabel(tr("Actual Usage") + ": "), 5, 0); - vbox_kd->addWidget(new QLabel(tr("Owner Trust Level") + ": "), 6, 0); - vbox_kd->addWidget(new QLabel(tr("Create Date (Local Time)") + ": "), 7, 0); - vbox_kd->addWidget(new QLabel(tr("Expires on (Local Time)") + ": "), 8, 0); - vbox_kd->addWidget(new QLabel(tr("Last Update (Local Time)") + ": "), 9, 0); - vbox_kd->addWidget(new QLabel(tr("Primary Key Existence") + ": "), 10, 0); + vbox_kd->addWidget(new QLabel(tr("Usage") + ": "), 4, 0); + vbox_kd->addWidget(new QLabel(tr("Owner Trust Level") + ": "), 5, 0); + vbox_kd->addWidget(new QLabel(tr("Create Date (Local Time)") + ": "), 6, 0); + vbox_kd->addWidget(new QLabel(tr("Expires on (Local Time)") + ": "), 7, 0); + vbox_kd->addWidget(new QLabel(tr("Last Update (Local Time)") + ": "), 8, 0); + vbox_kd->addWidget(new QLabel(tr("Primary Key Existence") + ": "), 9, 0); key_id_var_label_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); vbox_kd->addWidget(key_id_var_label_, 0, 1, 1, 1); @@ -98,12 +96,11 @@ KeyPairDetailTab::KeyPairDetailTab(int channel, GpgKeyPtr key, QWidget* parent) vbox_kd->addWidget(algorithm_detail_var_label_, 2, 1, 1, 2); vbox_kd->addWidget(key_size_var_label_, 3, 1, 1, 2); vbox_kd->addWidget(usage_var_label_, 4, 1, 1, 2); - vbox_kd->addWidget(actual_usage_var_label_, 5, 1, 1, 2); - vbox_kd->addWidget(owner_trust_var_label_, 6, 1, 1, 2); - vbox_kd->addWidget(created_var_label_, 7, 1, 1, 2); - vbox_kd->addWidget(expire_var_label_, 8, 1, 1, 2); - vbox_kd->addWidget(last_update_var_label_, 9, 1, 1, 2); - vbox_kd->addWidget(primary_key_exist_var_label_, 10, 1, 1, 2); + vbox_kd->addWidget(owner_trust_var_label_, 5, 1, 1, 2); + vbox_kd->addWidget(created_var_label_, 6, 1, 1, 2); + vbox_kd->addWidget(expire_var_label_, 7, 1, 1, 2); + vbox_kd->addWidget(last_update_var_label_, 8, 1, 1, 2); + vbox_kd->addWidget(primary_key_exist_var_label_, 9, 1, 1, 2); auto* copy_key_id_button = new QPushButton(tr("Copy")); copy_key_id_button->setFlat(true); @@ -219,24 +216,6 @@ void KeyPairDetailTab::slot_refresh_key_info() { if (key_->IsHasAuthCap()) usage_steam << tr("Auth") << " "; usage_var_label_->setText(usage_steam.readAll()); - - QString buffer_2; - QTextStream actual_usage_steam(&buffer_2); - - if (key_->IsHasActualCertCap()) { - actual_usage_steam << tr("Certificate") << " "; - } - if (key_->IsHasActualEncrCap()) { - actual_usage_steam << tr("Encrypt") << " "; - } - if (key_->IsHasActualSignCap()) { - actual_usage_steam << tr("Sign") << " "; - } - if (key_->IsHasActualAuthCap()) { - actual_usage_steam << tr("Auth") << " "; - } - - actual_usage_var_label_->setText(actual_usage_steam.readAll()); owner_trust_var_label_->setText(key_->OwnerTrust()); QString key_size_val; diff --git a/src/ui/dialog/keypair_details/KeyPairDetailTab.h b/src/ui/dialog/keypair_details/KeyPairDetailTab.h index d388a4af..e5ddbb83 100644 --- a/src/ui/dialog/keypair_details/KeyPairDetailTab.h +++ b/src/ui/dialog/keypair_details/KeyPairDetailTab.h @@ -90,7 +90,6 @@ class KeyPairDetailTab : public QWidget { QLabel* key_id_var_label_; ///< Label containing the keys keyid QLabel* fingerprint_var_label_; ///< Label containing the keys fingerprint QLabel* usage_var_label_; - QLabel* actual_usage_var_label_; QLabel* primary_key_exist_var_label_; QLabel* owner_trust_var_label_; diff --git a/src/ui/dialog/keypair_details/KeyPairUIDTab.h b/src/ui/dialog/keypair_details/KeyPairUIDTab.h index ecae16b5..32f6883f 100644 --- a/src/ui/dialog/keypair_details/KeyPairUIDTab.h +++ b/src/ui/dialog/keypair_details/KeyPairUIDTab.h @@ -28,8 +28,7 @@ #pragma once -#include "core/GpgModel.h" -#include "ui/GpgFrontendUI.h" +#include "core/typedef/GpgTypedef.h" namespace GpgFrontend::UI { diff --git a/src/ui/dialog/settings/SettingsDialog.cpp b/src/ui/dialog/settings/SettingsDialog.cpp index 79910229..ee2e12c6 100644 --- a/src/ui/dialog/settings/SettingsDialog.cpp +++ b/src/ui/dialog/settings/SettingsDialog.cpp @@ -29,7 +29,6 @@ #include "SettingsDialog.h" #include "core/GpgConstants.h" -#include "core/GpgModel.h" #include "ui/dialog/settings/SettingsAppearance.h" #include "ui/dialog/settings/SettingsGeneral.h" #include "ui/dialog/settings/SettingsKeyServer.h" diff --git a/src/ui/dialog/settings/SettingsGeneral.cpp b/src/ui/dialog/settings/SettingsGeneral.cpp index 73d8bccd..12024a4c 100644 --- a/src/ui/dialog/settings/SettingsGeneral.cpp +++ b/src/ui/dialog/settings/SettingsGeneral.cpp @@ -29,7 +29,6 @@ #include "SettingsGeneral.h" #include "SettingsDialog.h" -#include "core/GpgModel.h" #include "core/function/GlobalSettingStation.h" #include "ui_GeneralSettings.h" diff --git a/src/ui/function/GpgOperaHelper.cpp b/src/ui/function/GpgOperaHelper.cpp index 50269b90..91bc6c38 100644 --- a/src/ui/function/GpgOperaHelper.cpp +++ b/src/ui/function/GpgOperaHelper.cpp @@ -28,7 +28,6 @@ #include "GpgOperaHelper.h" -#include "core/GpgModel.h" #include "core/function/gpg/GpgFileOpera.h" #include "core/function/result_analyse/GpgDecryptResultAnalyse.h" #include "core/function/result_analyse/GpgEncryptResultAnalyse.h" diff --git a/src/ui/main_window/MainWindow.cpp b/src/ui/main_window/MainWindow.cpp index e17dacca..104f54d8 100644 --- a/src/ui/main_window/MainWindow.cpp +++ b/src/ui/main_window/MainWindow.cpp @@ -28,7 +28,6 @@ #include "MainWindow.h" -#include "core/function/CacheManager.h" #include "core/function/GlobalSettingStation.h" #include "core/model/SettingsObject.h" #include "core/module/ModuleManager.h" @@ -138,17 +137,12 @@ void MainWindow::Init() noexcept { restore_settings(); - edit_->CurTextPage()->setFocus(); - info_board_->AssociateTabWidget(edit_->TabWidget()); // check update if needed check_update_at_startup(); - // recover unsaved page from cache if it exists - recover_editor_unsaved_pages_from_cache(); - - slot_update_operations_menu_by_checked_keys(~0); + slot_switch_menu_control_mode(0); // check if need to open wizard window if (GetSettings().value("wizard/show_wizard", true).toBool()) { @@ -210,6 +204,7 @@ void MainWindow::restore_settings() { icon_style_ = appearance.tool_bar_button_style; import_button_->setToolButtonStyle(icon_style_); + workspace_button_->setToolButtonStyle(icon_style_); this->setToolButtonStyle(icon_style_); // icons ize @@ -217,40 +212,8 @@ void MainWindow::restore_settings() { QSize(appearance.tool_bar_icon_width, appearance.tool_bar_icon_height)); import_button_->setIconSize( QSize(appearance.tool_bar_icon_width, appearance.tool_bar_icon_height)); -} - -void MainWindow::recover_editor_unsaved_pages_from_cache() { - auto json_data = - CacheManager::GetInstance().LoadDurableCache("editor_unsaved_pages"); - - if (json_data.isEmpty() || !json_data.isArray()) { - return; - } - - bool first = true; - - auto unsaved_page_array = json_data.array(); - for (const auto& value_ref : unsaved_page_array) { - if (!value_ref.isObject()) continue; - auto unsaved_page_json = value_ref.toObject(); - - if (!unsaved_page_json.contains("title") || - !unsaved_page_json.contains("content")) { - continue; - } - - auto title = unsaved_page_json["title"].toString(); - auto content = unsaved_page_json["content"].toString(); - - LOG_D() << "restoring tab, title: " << title; - - if (first) { - edit_->SlotCloseTab(); - first = false; - } - - edit_->SlotNewTabWithContent(title, content); - } + workspace_button_->setIconSize( + QSize(appearance.tool_bar_icon_width, appearance.tool_bar_icon_height)); } void MainWindow::close_attachment_dock() { diff --git a/src/ui/main_window/MainWindow.h b/src/ui/main_window/MainWindow.h index d89356aa..15fb9fb1 100644 --- a/src/ui/main_window/MainWindow.h +++ b/src/ui/main_window/MainWindow.h @@ -537,6 +537,12 @@ class MainWindow : public GeneralMainWindow { */ void slot_popup_menu_by_key_list(QContextMenuEvent* event, KeyTable*); + /** + * @brief + * + */ + void slot_open_file_tab_with_directory(); + private: /** * @details Create actions for the main-menu and the context-menu of the @@ -580,11 +586,6 @@ class MainWindow : public GeneralMainWindow { void restore_settings(); /** - * @details - */ - void recover_editor_unsaved_pages_from_cache(); - - /** * @brief Create a action object * * @param id @@ -692,6 +693,7 @@ class MainWindow : public GeneralMainWindow { QMenu* key_menu_{}; ///< Submenu for key-operations QMenu* view_menu_{}; ///< Submenu for view operations QMenu* import_key_menu_{}; ///< Submenu for import operations + QMenu* workspace_menu_{}; QToolBar* crypt_tool_bar_{}; ///< Toolbar holding crypt actions QToolBar* file_tool_bar_{}; ///< Toolbar holding file actions @@ -701,6 +703,7 @@ class MainWindow : public GeneralMainWindow { QToolBar* key_tool_bar_{}; ///< Toolbar holding key operations QToolButton* import_button_{}; ///< Tool button for import dropdown menu in toolbar + QToolButton* workspace_button_{}; QDockWidget* key_list_dock_{}; ///< Encrypt Dock QDockWidget* attachment_dock_{}; ///< Attachment Dock QDockWidget* info_board_dock_{}; @@ -709,8 +712,8 @@ class MainWindow : public GeneralMainWindow { QAction* new_email_tab_act_{}; ///< Action to create email tab QAction* switch_tab_up_act_{}; ///< Action to switch tab up QAction* switch_tab_down_act_{}; ///< Action to switch tab down - QAction* open_act_{}; ///< Action to open file QAction* browser_act_{}; ///< Action to open file browser + QAction* browser_dir_act_{}; ///< Action to open file browser QAction* save_act_{}; ///< Action to save file QAction* save_as_act_{}; ///< Action to save file as QAction* print_act_{}; ///< Action to print @@ -724,7 +727,6 @@ class MainWindow : public GeneralMainWindow { QAction* verify_act_{}; ///< Action to verify text QAction* import_key_from_edit_act_{}; ///< Action to import key from edit QAction* clean_double_line_breaks_act_{}; ///< Action to remove double - ///< line breaks QAction* gnupg_controller_open_act_{}; ///< QAction* module_controller_open_act_{}; ///< diff --git a/src/ui/main_window/MainWindowSlotUI.cpp b/src/ui/main_window/MainWindowSlotUI.cpp index 49958c9f..e0a72ed1 100644 --- a/src/ui/main_window/MainWindowSlotUI.cpp +++ b/src/ui/main_window/MainWindowSlotUI.cpp @@ -60,6 +60,10 @@ void MainWindow::slot_open_key_management() { void MainWindow::slot_open_file_tab() { edit_->SlotNewFileBrowserTab(); } +void MainWindow::slot_open_file_tab_with_directory() { + edit_->SlotNewFileBrowserTabWithDirectory(); +} + void MainWindow::slot_switch_menu_control_mode(int index) { auto disable = false; if (index == -1) disable = true; @@ -96,6 +100,9 @@ void MainWindow::slot_switch_menu_control_mode(int index) { if (edit_->CurFilePage() != nullptr) { auto* file_page = edit_->CurFilePage(); emit file_page->SignalCurrentTabChanged(); + } else { + operations_menu_mask_ = ~0; + slot_update_operations_menu_by_checked_keys(operations_menu_mask_); } } diff --git a/src/ui/main_window/MainWindowUI.cpp b/src/ui/main_window/MainWindowUI.cpp index 41463b7a..14045c49 100644 --- a/src/ui/main_window/MainWindowUI.cpp +++ b/src/ui/main_window/MainWindowUI.cpp @@ -41,20 +41,22 @@ namespace GpgFrontend::UI { void MainWindow::create_actions() { new_tab_act_ = create_action( - "new_tab", tr("New"), ":/icons/misc_doc.png", tr("Open a new file"), + "new_tab", tr("New Text"), ":/icons/misc_doc.png", tr("Open a new file"), {QKeySequence(Qt::CTRL | Qt::Key_N), QKeySequence(Qt::CTRL | Qt::Key_T)}); connect(new_tab_act_, &QAction::triggered, edit_, &TextEdit::SlotNewTab); - open_act_ = create_action("open", tr("Open..."), ":/icons/fileopen.png", - tr("Open an existing file"), {QKeySequence::Open}); - connect(open_act_, &QAction::triggered, edit_, &TextEdit::SlotOpen); - - browser_act_ = create_action( - "file_browser", tr("File Panel"), ":/icons/file-operator.png", - tr("Open a file panel"), {QKeySequence(Qt::CTRL | Qt::Key_B)}); + browser_act_ = + create_action("file_browser", tr("Open File"), + ":/icons/file-operator.png", tr("Open a file panel")); connect(browser_act_, &QAction::triggered, this, &MainWindow::slot_open_file_tab); + browser_dir_act_ = create_action( + "file_browser_dir", tr("Open Directory"), ":/icons/file-operator.png", + tr("Open a file panel"), {QKeySequence(Qt::CTRL | Qt::Key_B)}); + connect(browser_dir_act_, &QAction::triggered, this, + &MainWindow::slot_open_file_tab_with_directory); + save_act_ = create_action("save", tr("Save File"), ":/icons/filesave.png", tr("Save the current File"), {QKeySequence::Save}); connect(save_act_, &QAction::triggered, edit_, &TextEdit::SlotSave); @@ -412,9 +414,12 @@ void MainWindow::create_menus() { file_menu_->addAction(new_email_tab_act_); } - file_menu_->addAction(browser_act_); - file_menu_->addAction(open_act_); file_menu_->addSeparator(); + workspace_menu_ = file_menu_->addMenu(tr("Workspace")); + workspace_menu_->addAction(browser_act_); + workspace_menu_->addAction(browser_dir_act_); + file_menu_->addSeparator(); + file_menu_->addAction(save_act_); file_menu_->addAction(save_as_act_); file_menu_->addSeparator(); @@ -493,14 +498,24 @@ void MainWindow::create_menus() { void MainWindow::create_tool_bars() { file_tool_bar_ = addToolBar(tr("File")); file_tool_bar_->setObjectName("fileToolBar"); + + // add dropdown menu for workspace + workspace_button_ = new QToolButton(); + workspace_button_->setMenu(workspace_menu_); + workspace_button_->setPopupMode(QToolButton::InstantPopup); + workspace_button_->setIcon(QIcon(":/icons/workspace.png")); + workspace_button_->setToolTip(tr("Open Workspace...")); + workspace_button_->setText(tr("Workspace")); + + file_tool_bar_->addWidget(workspace_button_); + file_tool_bar_->addSeparator(); + file_tool_bar_->addAction(new_tab_act_); if (Module::IsModuleActivate(kEmailModuleID)) { file_tool_bar_->addAction(new_email_tab_act_); } - file_tool_bar_->addAction(open_act_); - file_tool_bar_->addAction(browser_act_); view_menu_->addAction(file_tool_bar_->toggleViewAction()); crypt_tool_bar_ = addToolBar(tr("Operations")); diff --git a/src/ui/widgets/FilePage.cpp b/src/ui/widgets/FilePage.cpp index 605ae1d2..95dbfac9 100644 --- a/src/ui/widgets/FilePage.cpp +++ b/src/ui/widgets/FilePage.cpp @@ -28,7 +28,6 @@ #include "ui/widgets/FilePage.h" -#include "core/GpgModel.h" #include "core/function/GlobalSettingStation.h" #include "ui/UISignalStation.h" #include "ui/main_window/MainWindow.h" diff --git a/src/ui/widgets/FileTreeView.cpp b/src/ui/widgets/FileTreeView.cpp index 86411d79..8ebd7274 100644 --- a/src/ui/widgets/FileTreeView.cpp +++ b/src/ui/widgets/FileTreeView.cpp @@ -36,17 +36,15 @@ namespace GpgFrontend::UI { FileTreeView::FileTreeView(QWidget* parent, const QString& target_path) - : QTreeView(parent) { - dir_model_ = new QFileSystemModel(this); - dir_model_->setRootPath(target_path.isEmpty() ? QDir::currentPath() - : target_path); + : QTreeView(parent), dir_model_(new QFileSystemModel(this)) { dir_model_->setFilter(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot); + dir_model_->setRootPath(QDir::homePath()); + current_path_ = dir_model_->rootPath(); this->setModel(dir_model_); this->setColumnWidth(0, 320); this->sortByColumn(0, Qt::AscendingOrder); this->setSortingEnabled(true); - current_path_ = dir_model_->rootPath(); slot_create_popup_menu(); this->setContextMenuPolicy(Qt::CustomContextMenu); @@ -60,6 +58,43 @@ FileTreeView::FileTreeView(QWidget* parent, const QString& target_path) &FileTreeView::slot_adjust_column_widths); connect(dir_model_, &QFileSystemModel::dataChanged, this, &FileTreeView::slot_adjust_column_widths); + + LOG_D() << "try to open target path:" << target_path; + + QFileInfo info(target_path); + QString effective_path; + + if (info.exists()) { + effective_path = + info.isFile() ? info.absolutePath() : info.absoluteFilePath(); + } else { + effective_path = QDir::currentPath(); + } + + LOG_D() << "effective path:" << effective_path; + + dir_model_->setRootPath(effective_path); + current_path_ = dir_model_->rootPath(); + QModelIndex root_index = dir_model_->index(current_path_); + + if (root_index.isValid()) { + QPointer<FileTreeView> self(this); + this->setRootIndex(root_index); + QTimer::singleShot(200, [=]() { + if (self != nullptr && info.isFile()) { + self->setCurrentIndex(dir_model_->index(info.absoluteFilePath())); + self->expand(currentIndex().parent()); + self->scrollTo(currentIndex(), QAbstractItemView::PositionAtCenter); + self->selectionModel()->select( + currentIndex(), + QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); + } + }); + } else { + LOG_W() << "invalid path, fallback to current dir."; + current_path_ = QDir::currentPath(); + this->setRootIndex(dir_model_->index(current_path_)); + } } void FileTreeView::selectionChanged(const QItemSelection& selected, @@ -424,10 +459,10 @@ void FileTreeView::slot_compress_files() {} void FileTreeView::paintEvent(QPaintEvent* event) { QTreeView::paintEvent(event); - if (!initial_resize_done_) { - slot_adjust_column_widths(); - initial_resize_done_ = true; - } + // if (!initial_resize_done_) { + // slot_adjust_column_widths(); + // initial_resize_done_ = true; + // } } void FileTreeView::mousePressEvent(QMouseEvent* event) { diff --git a/src/ui/widgets/InfoBoardWidget.cpp b/src/ui/widgets/InfoBoardWidget.cpp index bb5b00bc..8bc2b1b1 100644 --- a/src/ui/widgets/InfoBoardWidget.cpp +++ b/src/ui/widgets/InfoBoardWidget.cpp @@ -28,7 +28,6 @@ #include "ui/widgets/InfoBoardWidget.h" -#include "core/GpgModel.h" #include "core/model/SettingsObject.h" #include "ui/UISignalStation.h" #include "ui/struct/settings_object/AppearanceSO.h" diff --git a/src/ui/widgets/TextEdit.cpp b/src/ui/widgets/TextEdit.cpp index 842bb9d6..5cb5d269 100644 --- a/src/ui/widgets/TextEdit.cpp +++ b/src/ui/widgets/TextEdit.cpp @@ -31,7 +31,7 @@ #include <QtPrintSupport> #include <cstddef> -#include "core/GpgModel.h" +#include "core/function/CacheManager.h" #include "ui/dialog/QuitDialog.h" #include "ui/widgets/HelpPage.h" #include "ui/widgets/TextEditTabWidget.h" @@ -40,9 +40,6 @@ namespace GpgFrontend::UI { TextEdit::TextEdit(QWidget* parent) : QWidget(parent) { tab_widget_ = new TextEditTabWidget(this); - tab_widget_->setMovable(true); - tab_widget_->setTabsClosable(true); - tab_widget_->setDocumentMode(true); auto* layout = new QVBoxLayout; layout->addWidget(tab_widget_); @@ -52,8 +49,12 @@ TextEdit::TextEdit(QWidget* parent) : QWidget(parent) { connect(tab_widget_, &QTabWidget::tabCloseRequested, this, &TextEdit::slot_remove_tab); - SlotNewTab(); + setAcceptDrops(false); + + SlotNewDefaultFileBrowserTab(); + + slot_restore_unsaved_tabs(); } void TextEdit::SlotNewTab() { tab_widget_->SlotNewTab(); } @@ -68,12 +69,22 @@ void TextEdit::SlotNewHelpTab(const QString& title, const QString& path) const { tab_widget_->setCurrentIndex(tab_widget_->count() - 1); } +void TextEdit::SlotNewDefaultFileBrowserTab() { + tab_widget_->SlotOpenDefaultPath(); +} + void TextEdit::SlotNewFileBrowserTab() { - auto const target_directory = QFileDialog::getExistingDirectory( - this, tr("Open Directory"), QDir::home().path(), - QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); - if (target_directory.isEmpty()) return; - tab_widget_->SlotOpenDirectory(target_directory); + auto const target_path = + QFileDialog::getOpenFileUrl(this, tr("Open File"), QDir::home().path()); + if (target_path.isEmpty()) return; + tab_widget_->SlotOpenPath(target_path.path()); +} + +void TextEdit::SlotNewFileBrowserTabWithDirectory() { + auto const target_path = QFileDialog::getExistingDirectory( + this, tr("Open File"), QDir::home().path()); + if (target_path.isEmpty()) return; + tab_widget_->SlotOpenPath(target_path); } void TextEdit::SlotOpenFile(const QString& path) { @@ -628,4 +639,30 @@ auto TextEdit::CurEMailPage() const -> EMailEditorPage* { void TextEdit::SlotNewEMailTab() { tab_widget_->SlotNewEMailTab(); } +void TextEdit::slot_restore_unsaved_tabs() { + auto json_data = + CacheManager::GetInstance().LoadDurableCache("editor_unsaved_pages"); + + if (json_data.isEmpty() || !json_data.isArray()) { + return; + } + + auto unsaved_page_array = json_data.array(); + for (const auto& value_ref : unsaved_page_array) { + if (!value_ref.isObject()) continue; + auto unsaved_page_json = value_ref.toObject(); + + if (!unsaved_page_json.contains("title") || + !unsaved_page_json.contains("content")) { + continue; + } + + auto title = unsaved_page_json["title"].toString(); + auto content = unsaved_page_json["content"].toString(); + + LOG_D() << "restoring tab, title: " << title; + + SlotNewTabWithContent(title, content); + } +} } // namespace GpgFrontend::UI diff --git a/src/ui/widgets/TextEdit.h b/src/ui/widgets/TextEdit.h index d37e01ce..f994cb1a 100644 --- a/src/ui/widgets/TextEdit.h +++ b/src/ui/widgets/TextEdit.h @@ -193,11 +193,23 @@ class TextEdit : public QWidget { void SlotNewHelpTab(const QString& title, const QString& path) const; /** + * @brief + * + */ + void SlotNewDefaultFileBrowserTab(); + + /** * New File Tab to do file operation */ void SlotNewFileBrowserTab(); /** + * @brief + * + */ + void SlotNewFileBrowserTabWithDirectory(); + + /** * @details put a * in front of current tabs title, if current textedit is * modified */ @@ -312,7 +324,15 @@ class TextEdit : public QWidget { */ void slot_remove_tab(int index); + /** + * @brief + * + */ + void slot_restore_unsaved_tabs(); + private: + TextEditTabWidget* tab_widget_; ///< widget containing the tabs of the editor + /** * @details return just a filename stripped of a whole path * @@ -327,8 +347,6 @@ class TextEdit : public QWidget { * @param askToSave */ auto maybe_save_current_tab(bool askToSave) -> bool; - - TextEditTabWidget* tab_widget_; ///< widget containing the tabs of the editor }; } // namespace GpgFrontend::UI diff --git a/src/ui/widgets/TextEditTabWidget.cpp b/src/ui/widgets/TextEditTabWidget.cpp index 11400f1f..f13d8392 100644 --- a/src/ui/widgets/TextEditTabWidget.cpp +++ b/src/ui/widgets/TextEditTabWidget.cpp @@ -39,6 +39,12 @@ namespace GpgFrontend::UI { TextEditTabWidget::TextEditTabWidget(QWidget* parent) : QTabWidget(parent) { setAcceptDrops(true); + setMovable(true); + setTabsClosable(true); + setDocumentMode(true); + setUsesScrollButtons(true); + setElideMode(Qt::ElideRight); + tabBar()->setExpanding(false); } void TextEditTabWidget::dragEnterEvent(QDragEnterEvent* event) { @@ -97,7 +103,7 @@ void TextEditTabWidget::dropEvent(QDropEvent* event) { .arg(file_info.fileName())); continue; } - SlotOpenDirectory(file_info.absoluteFilePath()); + SlotOpenPath(file_info.absoluteFilePath()); } } @@ -160,6 +166,8 @@ void TextEditTabWidget::SlotOpenEMLFile(const QString& path) { } void TextEditTabWidget::SlotShowModified() { + if (CurTextPage() == nullptr) return; + // get current tab int index = this->currentIndex(); QString title = this->tabText(index).trimmed(); @@ -253,6 +261,7 @@ void TextEditTabWidget::SlotNewTab() { auto* page = new PlainTextEditorPage(); auto index = this->addTab(page, header); this->setTabIcon(index, QIcon(":/icons/file.png")); + this->setTabToolTip(index, header); this->setCurrentIndex(this->count() - 1); page->GetTextPage()->setFocus(); connect(page->GetTextPage()->document(), &QTextDocument::modificationChanged, @@ -268,6 +277,7 @@ void TextEditTabWidget::SlotNewEMailTab() { auto index = this->addTab(page, header); this->setTabIcon(index, QIcon(":/icons/email.png")); this->setCurrentIndex(this->count() - 1); + this->setTabToolTip(index, header); page->GetTextPage()->setFocus(); connect(page->GetTextPage(), &QPlainTextEdit::textChanged, this, @@ -291,7 +301,6 @@ void TextEditTabWidget::SlotNewTabWithContent(QString title, auto* page = new PlainTextEditorPage(); auto index = this->addTab(page, header); this->setTabIcon(index, QIcon(":/icons/file.png")); - this->setCurrentIndex(this->count() - 1); page->GetTextPage()->setFocus(); connect(page->GetTextPage()->document(), &QTextDocument::modificationChanged, this, &TextEditTabWidget::SlotShowModified); @@ -302,10 +311,21 @@ void TextEditTabWidget::SlotNewTabWithContent(QString title, page->GetTextPage()->document()->setPlainText(content); } -void TextEditTabWidget::SlotOpenDirectory(const QString& target_directory) { - auto* page = new FilePage(qobject_cast<QWidget*>(parent()), target_directory); +void TextEditTabWidget::SlotOpenDefaultPath() { + auto* page = + new FilePage(qobject_cast<QWidget*>(parent()), QDir::currentPath()); + auto index = this->addTab(page, QString()); + this->setTabIcon(index, QIcon(":/icons/workspace.png")); + this->setTabText(index, tr("Default Workspace")); + this->setCurrentIndex(this->count() - 1); + page->SlotGoPath(); +} + +void TextEditTabWidget::SlotOpenPath(const QString& target_path) { + auto* page = new FilePage(qobject_cast<QWidget*>(parent()), target_path); auto index = this->addTab(page, QString()); - this->setTabIcon(index, QIcon(":/icons/file-browser.png")); + this->setTabIcon(index, QIcon(":/icons/workspace.png")); + this->setTabToolTip(index, target_path); this->setCurrentIndex(this->count() - 1); connect(page, &FilePage::SignalPathChanged, this, &TextEditTabWidget::slot_file_page_path_changed); @@ -322,7 +342,9 @@ void TextEditTabWidget::slot_file_page_path_changed(const QString& path) { } else { m_path = t_path; } + this->setTabText(index, m_path); + this->setTabToolTip(index, t_path); emit UISignalStation::GetInstance() -> SignalMainWindowUpdateBasicOperaMenu( 0); diff --git a/src/ui/widgets/TextEditTabWidget.h b/src/ui/widgets/TextEditTabWidget.h index 9df2d6ab..ed6a0b50 100644 --- a/src/ui/widgets/TextEditTabWidget.h +++ b/src/ui/widgets/TextEditTabWidget.h @@ -90,6 +90,12 @@ class TextEditTabWidget : public QTabWidget { void SlotNewTabWithContent(QString title, const QString& content); /** + * @brief + * + */ + void SlotOpenDefaultPath(); + + /** * @details Adds a new tab with opening file by path */ void SlotOpenFile(const QString& path); @@ -105,7 +111,7 @@ class TextEditTabWidget : public QTabWidget { * @brief * */ - void SlotOpenDirectory(const QString& target_directory); + void SlotOpenPath(const QString& target_path); /** * @details put a * in front of current tabs title, if current textedit is @@ -146,6 +152,12 @@ class TextEditTabWidget : public QTabWidget { int count_page_ = 0; int text_page_data_modified_count_ = 0; + /** + * @brief + * + * @param full_file_name + * @return QString + */ static auto stripped_name(const QString& full_file_name) -> QString; }; |