From 4aa314b3abd614213fd154f02319c3ef08e48b30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Blome?= <43345275+ssmid@users.noreply.github.com> Date: Fri, 25 Nov 2022 10:47:11 +0100 Subject: [PATCH] feat: Added quick "save project" action (#826) * add quick -save project- action * translation for -save project as- added * removed machine translations; header file name extension fixed * moved openProject() for consistency --- .../include/hex/api/project_file_manager.hpp | 2 ++ .../source/api/project_file_manager.cpp | 6 ++++ plugins/builtin/CMakeLists.txt | 1 + .../include/content/global_actions.hpp | 7 ++++ .../builtin/source/content/global_actions.cpp | 35 +++++++++++++++++++ .../source/content/main_menu_items.cpp | 24 ++++--------- plugins/builtin/source/content/shortcuts.cpp | 11 ++++++ plugins/builtin/source/lang/de_DE.cpp | 3 +- plugins/builtin/source/lang/en_US.cpp | 3 +- plugins/builtin/source/lang/it_IT.cpp | 3 +- plugins/builtin/source/lang/ja_JP.cpp | 3 +- plugins/builtin/source/lang/ko_KR.cpp | 3 +- plugins/builtin/source/lang/pt_BR.cpp | 3 +- plugins/builtin/source/lang/zh_CN.cpp | 3 +- plugins/builtin/source/lang/zh_TW.cpp | 3 +- 15 files changed, 85 insertions(+), 25 deletions(-) create mode 100644 plugins/builtin/include/content/global_actions.hpp create mode 100644 plugins/builtin/source/content/global_actions.cpp diff --git a/lib/libimhex/include/hex/api/project_file_manager.hpp b/lib/libimhex/include/hex/api/project_file_manager.hpp index ebb21f921..17eafde8b 100644 --- a/lib/libimhex/include/hex/api/project_file_manager.hpp +++ b/lib/libimhex/include/hex/api/project_file_manager.hpp @@ -33,6 +33,8 @@ namespace hex { static bool load(const std::fs::path &filePath); static bool store(std::optional filePath = std::nullopt); + static bool hasPath(); + static void registerHandler(const Handler &handler) { getHandlers().push_back(handler); } diff --git a/lib/libimhex/source/api/project_file_manager.cpp b/lib/libimhex/source/api/project_file_manager.cpp index 5785758cb..bb968fd04 100644 --- a/lib/libimhex/source/api/project_file_manager.cpp +++ b/lib/libimhex/source/api/project_file_manager.cpp @@ -113,9 +113,15 @@ namespace hex { tar.write(MetadataPath, metadataContent); } + ProjectFile::s_currProjectPath = filePath.value(); + ImHexApi::Provider::resetDirty(); return result; } + bool ProjectFile::hasPath() { + return !ProjectFile::s_currProjectPath.empty(); + } + } \ No newline at end of file diff --git a/plugins/builtin/CMakeLists.txt b/plugins/builtin/CMakeLists.txt index 98bcafcd2..377c4c091 100644 --- a/plugins/builtin/CMakeLists.txt +++ b/plugins/builtin/CMakeLists.txt @@ -24,6 +24,7 @@ add_library(${PROJECT_NAME} SHARED source/content/events.cpp source/content/hashes.cpp source/content/shortcuts.cpp + source/content/global_actions.cpp source/content/providers/file_provider.cpp source/content/providers/gdb_provider.cpp diff --git a/plugins/builtin/include/content/global_actions.hpp b/plugins/builtin/include/content/global_actions.hpp new file mode 100644 index 000000000..751ff0565 --- /dev/null +++ b/plugins/builtin/include/content/global_actions.hpp @@ -0,0 +1,7 @@ +#pragma once + +namespace hex::plugin::builtin { + void openProject(); + void saveProject(); + void saveProjectAs(); +} diff --git a/plugins/builtin/source/content/global_actions.cpp b/plugins/builtin/source/content/global_actions.cpp new file mode 100644 index 000000000..7e8e49631 --- /dev/null +++ b/plugins/builtin/source/content/global_actions.cpp @@ -0,0 +1,35 @@ + +#include +#include + + +namespace hex::plugin::builtin { + + void openProject() { + fs::openFileBrowser(fs::DialogMode::Open, { {"Project File", "hexproj"} }, + [](const auto &path) { + if (!ProjectFile::load(path)) { + View::showErrorPopup("hex.builtin.popup.error.project.load"_lang); + } + }); + } + + void saveProject() { + if (!ProjectFile::store()) { + View::showErrorPopup("hex.builtin.popup.error.project.save"_lang); + } + } + + void saveProjectAs() { + fs::openFileBrowser(fs::DialogMode::Save, { {"Project File", "hexproj"} }, + [](std::fs::path path) { + if (path.extension() != ".hexproj") { + path.replace_extension(".hexproj"); + } + + if (!ProjectFile::store(path)) { + View::showErrorPopup("hex.builtin.popup.error.project.save"_lang); + } + }); + } +} diff --git a/plugins/builtin/source/content/main_menu_items.cpp b/plugins/builtin/source/content/main_menu_items.cpp index 8fa298446..67784a158 100644 --- a/plugins/builtin/source/content/main_menu_items.cpp +++ b/plugins/builtin/source/content/main_menu_items.cpp @@ -8,6 +8,7 @@ #include #include #include +#include "content/global_actions.hpp" namespace hex::plugin::builtin { @@ -73,26 +74,15 @@ namespace hex::plugin::builtin { bool taskRunning = TaskManager::getRunningTaskCount() > 0; if (ImGui::MenuItem("hex.builtin.menu.file.open_project"_lang, "", false, !taskRunning)) { - fs::openFileBrowser(fs::DialogMode::Open, { {"Project File", "hexproj"} - }, - [](const auto &path) { - if (!ProjectFile::load(path)) { - View::showErrorPopup("hex.builtin.popup.error.project.load"_lang); - } - }); + openProject(); } - if (ImGui::MenuItem("hex.builtin.menu.file.save_project"_lang, "", false, providerValid && provider->isWritable())) { - fs::openFileBrowser(fs::DialogMode::Save, { {"Project File", "hexproj"} }, - [](std::fs::path path) { - if (path.extension() != ".hexproj") { - path.replace_extension(".hexproj"); - } + if (ImGui::MenuItem("hex.builtin.menu.file.save_project"_lang, "ALT + S", false, providerValid && provider->isWritable() && ProjectFile::hasPath())) { + saveProject(); + } - if (!ProjectFile::store(path)) { - View::showErrorPopup("hex.builtin.popup.error.project.save"_lang); - } - }); + if (ImGui::MenuItem("hex.builtin.menu.file.save_project_as"_lang, "ALT + SHIFT + S", false, providerValid && provider->isWritable())) { + saveProjectAs(); } }); diff --git a/plugins/builtin/source/content/shortcuts.cpp b/plugins/builtin/source/content/shortcuts.cpp index 8e9061255..61b718eff 100644 --- a/plugins/builtin/source/content/shortcuts.cpp +++ b/plugins/builtin/source/content/shortcuts.cpp @@ -2,6 +2,7 @@ #include #include +#include "content/global_actions.hpp" namespace hex::plugin::builtin { @@ -32,6 +33,16 @@ namespace hex::plugin::builtin { ImHexApi::Provider::remove(provider, true); } }); + + // Save project + ShortcutManager::addGlobalShortcut(ALT + Keys::S, [] { + saveProject(); + }); + + // Save project as... + ShortcutManager::addGlobalShortcut(ALT + SHIFT + Keys::S, [] { + saveProjectAs(); + }); } } \ No newline at end of file diff --git a/plugins/builtin/source/lang/de_DE.cpp b/plugins/builtin/source/lang/de_DE.cpp index a8a24b6cd..5d3bbfd1d 100644 --- a/plugins/builtin/source/lang/de_DE.cpp +++ b/plugins/builtin/source/lang/de_DE.cpp @@ -163,7 +163,8 @@ namespace hex::plugin::builtin { { "hex.builtin.menu.file.reload_file", "Datei neu laden" }, { "hex.builtin.menu.file.quit", "ImHex Beenden" }, { "hex.builtin.menu.file.open_project", "Projekt öffnen..." }, - { "hex.builtin.menu.file.save_project", "Projekt speichern..." }, + { "hex.builtin.menu.file.save_project", "Projekt speichern" }, + { "hex.builtin.menu.file.save_project_as", "Projekt speichern unter..." }, { "hex.builtin.menu.file.import", "Importieren..." }, { "hex.builtin.menu.file.import.base64", "Base64 Datei" }, { "hex.builtin.menu.file.import.base64.popup.import_error", "Datei ist nicht in einem korrekten Base64 Format!" }, diff --git a/plugins/builtin/source/lang/en_US.cpp b/plugins/builtin/source/lang/en_US.cpp index 2b26d69a0..559c9cbe5 100644 --- a/plugins/builtin/source/lang/en_US.cpp +++ b/plugins/builtin/source/lang/en_US.cpp @@ -165,7 +165,8 @@ namespace hex::plugin::builtin { { "hex.builtin.menu.file.reload_file", "Reload File" }, { "hex.builtin.menu.file.quit", "Quit ImHex" }, { "hex.builtin.menu.file.open_project", "Open Project..." }, - { "hex.builtin.menu.file.save_project", "Save Project..." }, + { "hex.builtin.menu.file.save_project", "Save Project" }, + { "hex.builtin.menu.file.save_project_as", "Save Project As..." }, { "hex.builtin.menu.file.import", "Import..." }, { "hex.builtin.menu.file.import.base64", "Base64 File" }, { "hex.builtin.menu.file.import.base64.popup.import_error", "File is not in a valid Base64 format!" }, diff --git a/plugins/builtin/source/lang/it_IT.cpp b/plugins/builtin/source/lang/it_IT.cpp index 94bd93c37..c1ed2f784 100644 --- a/plugins/builtin/source/lang/it_IT.cpp +++ b/plugins/builtin/source/lang/it_IT.cpp @@ -164,7 +164,8 @@ namespace hex::plugin::builtin { //{ "hex.builtin.menu.file.reload_file", "Reload File" }, { "hex.builtin.menu.file.quit", "Uscita ImHex" }, { "hex.builtin.menu.file.open_project", "Apri un Progetto..." }, - { "hex.builtin.menu.file.save_project", "Salva Progetto..." }, + { "hex.builtin.menu.file.save_project", "Salva Progetto" }, + //{ "hex.builtin.menu.file.save_project_as", "Save Project As..." }, { "hex.builtin.menu.file.import", "Importa..." }, { "hex.builtin.menu.file.import.base64", "Base64 File" }, //{ "hex.builtin.menu.file.import.base64.popup.import_error", "File is not in a valid Base64 format!" }, diff --git a/plugins/builtin/source/lang/ja_JP.cpp b/plugins/builtin/source/lang/ja_JP.cpp index 1bfbdcc98..8e707a28a 100644 --- a/plugins/builtin/source/lang/ja_JP.cpp +++ b/plugins/builtin/source/lang/ja_JP.cpp @@ -164,7 +164,8 @@ namespace hex::plugin::builtin { //{ "hex.builtin.menu.file.reload_file", "Reload File" }, { "hex.builtin.menu.file.quit", "ImHexを終了" }, { "hex.builtin.menu.file.open_project", "プロジェクトを開く…" }, - { "hex.builtin.menu.file.save_project", "プロジェクトを保存…" }, + { "hex.builtin.menu.file.save_project", "プロジェクトを保存" }, + //{ "hex.builtin.menu.file.save_project_as", "Save Project As..." }, { "hex.builtin.view.hex_editor.menu.file.load_encoding_file", "カスタムエンコードを読み込む…" }, { "hex.builtin.menu.file.import", "インポート…" }, { "hex.builtin.menu.file.import.base64", "Base64ファイル" }, diff --git a/plugins/builtin/source/lang/ko_KR.cpp b/plugins/builtin/source/lang/ko_KR.cpp index 3f03f6252..34e53697d 100644 --- a/plugins/builtin/source/lang/ko_KR.cpp +++ b/plugins/builtin/source/lang/ko_KR.cpp @@ -164,7 +164,8 @@ namespace hex::plugin::builtin { //{ "hex.builtin.menu.file.reload_file", "Reload File" }, { "hex.builtin.menu.file.quit", "ImHex 종료하기" }, { "hex.builtin.menu.file.open_project", "프로젝트 열기..." }, - { "hex.builtin.menu.file.save_project", "프로젝트 저장..." }, + { "hex.builtin.menu.file.save_project", "프로젝트 저장" }, + //{ "hex.builtin.menu.file.save_project_as", "Save Project As..." }, { "hex.builtin.menu.file.import", "가져오기..." }, { "hex.builtin.menu.file.import.base64", "Base64 파일" }, { "hex.builtin.menu.file.import.base64.popup.import_error", "파일이 올바른 Base64 형식이 아닙니다!" }, diff --git a/plugins/builtin/source/lang/pt_BR.cpp b/plugins/builtin/source/lang/pt_BR.cpp index 43bce37ab..e628d25ae 100644 --- a/plugins/builtin/source/lang/pt_BR.cpp +++ b/plugins/builtin/source/lang/pt_BR.cpp @@ -164,7 +164,8 @@ namespace hex::plugin::builtin { //{ "hex.builtin.menu.file.reload_file", "Reload File" }, { "hex.builtin.menu.file.quit", "Sair do ImHex" }, { "hex.builtin.menu.file.open_project", "Abrir Projeto..." }, - { "hex.builtin.menu.file.save_project", "Salvar Projeto..." }, + { "hex.builtin.menu.file.save_project", "Salvar Projeto" }, + //{ "hex.builtin.menu.file.save_project_as", "Save Project As..." }, { "hex.builtin.menu.file.import", "Importar..." }, { "hex.builtin.menu.file.import.base64", "Arquivo Base64" }, { "hex.builtin.menu.file.import.base64.popup.import_error", "Esse arquivo não é baseado em um formato Base64 valido!" }, diff --git a/plugins/builtin/source/lang/zh_CN.cpp b/plugins/builtin/source/lang/zh_CN.cpp index c187bb266..81edebd66 100644 --- a/plugins/builtin/source/lang/zh_CN.cpp +++ b/plugins/builtin/source/lang/zh_CN.cpp @@ -164,7 +164,8 @@ namespace hex::plugin::builtin { { "hex.builtin.menu.file.reload_file", "重新加载文件" }, { "hex.builtin.menu.file.quit", "退出 ImHex" }, { "hex.builtin.menu.file.open_project", "打开项目..." }, - { "hex.builtin.menu.file.save_project", "保存项目..." }, + { "hex.builtin.menu.file.save_project", "保存项目" }, + //{ "hex.builtin.menu.file.save_project_as", "Save Project As..." }, { "hex.builtin.menu.file.import", "导入..." }, { "hex.builtin.menu.file.import.base64", "Base64 文件" }, { "hex.builtin.menu.file.import.base64.popup.import_error", "文件不是有效的 Base64 格式!" }, diff --git a/plugins/builtin/source/lang/zh_TW.cpp b/plugins/builtin/source/lang/zh_TW.cpp index 6c5fc2087..e7fef8814 100644 --- a/plugins/builtin/source/lang/zh_TW.cpp +++ b/plugins/builtin/source/lang/zh_TW.cpp @@ -164,7 +164,8 @@ namespace hex::plugin::builtin { { "hex.builtin.menu.file.reload_file", "重新載入檔案" }, { "hex.builtin.menu.file.quit", "退出 ImHex" }, { "hex.builtin.menu.file.open_project", "開啟專案..." }, - { "hex.builtin.menu.file.save_project", "儲存專案..." }, + { "hex.builtin.menu.file.save_project", "儲存專案" }, + //{ "hex.builtin.menu.file.save_project_as", "Save Project As..." }, { "hex.builtin.menu.file.import", "匯入..." }, { "hex.builtin.menu.file.import.base64", "Base64 檔案" }, { "hex.builtin.menu.file.import.base64.popup.import_error", "檔案並非有效的 Base64 格式!" },