From d5f323a2cd01de05d40a0dec73f5f47197ac8008 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Wed, 28 Feb 2024 22:10:48 +0100 Subject: [PATCH] feat: Allow workspaces to be deleted the same way as layouts Fixed #1576 --- lib/external/libwolv | 2 +- .../include/hex/api/layout_manager.hpp | 8 ++- .../include/hex/api/workspace_manager.hpp | 8 ++- lib/libimhex/source/api/layout_manager.cpp | 17 ++++- lib/libimhex/source/api/workspace_manager.cpp | 67 +++++++++++++++++-- .../auto_extract/workspaces/default.hexws | 3 +- .../auto_extract/workspaces/minimal.hexws | 3 +- .../source/content/main_menu_items.cpp | 26 ++++--- plugins/builtin/source/content/workspaces.cpp | 18 +---- 9 files changed, 113 insertions(+), 39 deletions(-) diff --git a/lib/external/libwolv b/lib/external/libwolv index 2ddf59630..07298e868 160000 --- a/lib/external/libwolv +++ b/lib/external/libwolv @@ -1 +1 @@ -Subproject commit 2ddf596306a99f8c1312979b038a019fd72f12b0 +Subproject commit 07298e868d7face8c92db734bd7d8a13a5d5b4f8 diff --git a/lib/libimhex/include/hex/api/layout_manager.hpp b/lib/libimhex/include/hex/api/layout_manager.hpp index 68f837df7..d77f433a4 100644 --- a/lib/libimhex/include/hex/api/layout_manager.hpp +++ b/lib/libimhex/include/hex/api/layout_manager.hpp @@ -46,7 +46,13 @@ namespace hex { * @brief Get a list of all layouts * @return List of all added layouts */ - static std::vector getLayouts(); + static const std::vector &getLayouts(); + + /** + * @brief Removes the layout with the given name + * @param name Name of the layout + */ + static void removeLayout(const std::string &name); /** * @brief Handles loading of layouts if needed diff --git a/lib/libimhex/include/hex/api/workspace_manager.hpp b/lib/libimhex/include/hex/api/workspace_manager.hpp index a255e1eac..608df2d9c 100644 --- a/lib/libimhex/include/hex/api/workspace_manager.hpp +++ b/lib/libimhex/include/hex/api/workspace_manager.hpp @@ -13,18 +13,22 @@ namespace hex { struct Workspace { std::string layout; std::fs::path path; + bool builtin; }; static void createWorkspace(const std::string &name, const std::string &layout = ""); static void switchWorkspace(const std::string &name); static void importFromFile(const std::fs::path &path); - static bool exportToFile(std::fs::path path = {}, std::string workspaceName = {}); + static bool exportToFile(std::fs::path path = {}, std::string workspaceName = {}, bool builtin = false); + + static void removeWorkspace(const std::string &name); static const auto& getWorkspaces() { return *s_workspaces; } static const auto& getCurrentWorkspace() { return s_currentWorkspace; } static void reset(); + static void reload(); static void process(); @@ -32,7 +36,7 @@ namespace hex { WorkspaceManager() = default; static AutoReset> s_workspaces; - static decltype(s_workspaces)::Type::iterator s_currentWorkspace, s_previousWorkspace; + static decltype(s_workspaces)::Type::iterator s_currentWorkspace, s_previousWorkspace, s_workspaceToRemove; }; } \ No newline at end of file diff --git a/lib/libimhex/source/api/layout_manager.cpp b/lib/libimhex/source/api/layout_manager.cpp index eb15b8171..4a9f0ce42 100644 --- a/lib/libimhex/source/api/layout_manager.cpp +++ b/lib/libimhex/source/api/layout_manager.cpp @@ -64,10 +64,25 @@ namespace hex { } - std::vector LayoutManager::getLayouts() { + const std::vector& LayoutManager::getLayouts() { return s_layouts; } + void LayoutManager::removeLayout(const std::string& name) { + for (const auto &layout : *s_layouts) { + if (layout.name == name) { + if (wolv::io::File(layout.path, wolv::io::File::Mode::Write).remove()) { + log::info("Removed layout '{}'", name); + LayoutManager::reload(); + } else { + log::error("Failed to remove layout '{}'", name); + } + return; + } + } + } + + void LayoutManager::closeAllViews() { for (const auto &[name, view] : ContentRegistry::Views::impl::getEntries()) view->getWindowOpenState() = false; diff --git a/lib/libimhex/source/api/workspace_manager.cpp b/lib/libimhex/source/api/workspace_manager.cpp index 645977d47..849778689 100644 --- a/lib/libimhex/source/api/workspace_manager.cpp +++ b/lib/libimhex/source/api/workspace_manager.cpp @@ -9,22 +9,28 @@ #include #include +#include namespace hex { AutoReset> WorkspaceManager::s_workspaces; decltype(WorkspaceManager::s_workspaces)::Type::iterator WorkspaceManager::s_currentWorkspace = s_workspaces->end(); decltype(WorkspaceManager::s_workspaces)::Type::iterator WorkspaceManager::s_previousWorkspace = s_workspaces->end(); + decltype(WorkspaceManager::s_workspaces)::Type::iterator WorkspaceManager::s_workspaceToRemove = s_workspaces->end(); void WorkspaceManager::createWorkspace(const std::string& name, const std::string &layout) { s_currentWorkspace = s_workspaces->insert_or_assign(name, Workspace { - .layout = layout.empty() ? LayoutManager::saveToString() : layout, - .path = {} + .layout = layout.empty() ? LayoutManager::saveToString() : layout, + .path = {}, + .builtin = false }).first; - for (const auto &path : fs::getDefaultPaths(fs::ImHexPath::Workspaces)) { - if (exportToFile(path / (name + ".hexws"))) + for (const auto &workspaceFolder : fs::getDefaultPaths(fs::ImHexPath::Workspaces)) { + const auto workspacePath = workspaceFolder / (name + ".hexws"); + if (exportToFile(workspacePath)) { + s_currentWorkspace->second.path = workspacePath; break; + } } } @@ -37,6 +43,9 @@ namespace hex { } void WorkspaceManager::importFromFile(const std::fs::path& path) { + if (std::ranges::any_of(*s_workspaces, [path](const auto &pair) { return pair.second.path == path; })) + return; + wolv::io::File file(path, wolv::io::File::Mode::Read); if (!file.isValid()) { log::error("Failed to load workspace from file '{}'", path.string()); @@ -50,10 +59,12 @@ namespace hex { const std::string name = json["name"]; std::string layout = json["layout"]; + const bool builtin = json.value("builtin", false); (*s_workspaces)[name] = Workspace { .layout = std::move(layout), - .path = path + .path = path, + .builtin = builtin }; } catch (nlohmann::json::exception &e) { log::error("Failed to load workspace from file '{}': {}", path.string(), e.what()); @@ -61,7 +72,7 @@ namespace hex { } } - bool WorkspaceManager::exportToFile(std::fs::path path, std::string workspaceName) { + bool WorkspaceManager::exportToFile(std::fs::path path, std::string workspaceName, bool builtin) { if (path.empty()) { if (s_currentWorkspace == s_workspaces->end()) return false; @@ -80,22 +91,46 @@ namespace hex { nlohmann::json json; json["name"] = workspaceName; json["layout"] = LayoutManager::saveToString(); + json["builtin"] = builtin; file.writeString(json.dump(4)); return true; } + void WorkspaceManager::removeWorkspace(const std::string& name) { + for (const auto &[workspaceName, workspace] : *s_workspaces) { + if (workspaceName == name) { + log::info("{}", wolv::util::toUTF8String(workspace.path)); + if (wolv::io::File(workspace.path, wolv::io::File::Mode::Write).remove()) { + log::info("Removed workspace '{}'", name); + + switchWorkspace(s_workspaces->begin()->first); + s_workspaces->erase(workspaceName); + } else { + log::error("Failed to remove workspace '{}'", name); + } + return; + } + } + } + void WorkspaceManager::process() { if (s_previousWorkspace != s_currentWorkspace) { + log::info("Updating workspace"); if (s_previousWorkspace != s_workspaces->end()) - exportToFile(s_previousWorkspace->second.path, s_previousWorkspace->first); + exportToFile(s_previousWorkspace->second.path, s_previousWorkspace->first, s_previousWorkspace->second.builtin); LayoutManager::closeAllViews(); ImGui::LoadIniSettingsFromMemory(s_currentWorkspace->second.layout.c_str()); s_previousWorkspace = s_currentWorkspace; + + if (s_workspaceToRemove != s_workspaces->end()) { + s_workspaces->erase(s_workspaceToRemove); + s_workspaceToRemove = s_workspaces->end(); + } } } @@ -106,6 +141,24 @@ namespace hex { s_previousWorkspace = s_workspaces->end(); } + void WorkspaceManager::reload() { + WorkspaceManager::reset(); + + for (const auto &defaultPath : fs::getDefaultPaths(fs::ImHexPath::Workspaces)) { + for (const auto &entry : std::fs::directory_iterator(defaultPath)) { + if (!entry.is_regular_file()) + continue; + + const auto &path = entry.path(); + if (path.extension() != ".hexws") + continue; + + WorkspaceManager::importFromFile(path); + } + } + } + + } diff --git a/plugins/builtin/romfs/auto_extract/workspaces/default.hexws b/plugins/builtin/romfs/auto_extract/workspaces/default.hexws index e452615c0..87c4ff62f 100644 --- a/plugins/builtin/romfs/auto_extract/workspaces/default.hexws +++ b/plugins/builtin/romfs/auto_extract/workspaces/default.hexws @@ -1,4 +1,5 @@ { "layout": "[Window][ImHexDockSpace]\nPos=0,19\nSize=1393,765\nCollapsed=0\n\n[Window][Debug##Default]\nPos=0,55\nSize=400,400\nCollapsed=0\n\n[Window][###hex.builtin.view.settings.name]\nPos=346,191\nSize=700,400\nCollapsed=0\n\n[Window][Question]\nPos=496,338\nSize=400,105\nCollapsed=0\n\n[Window][Welcome Screen]\nPos=0,37\nSize=1393,728\nCollapsed=0\n\n[Window][###hex.builtin.view.hex_editor.name]\nPos=0,38\nSize=619,468\nCollapsed=0\nDockId=0x00000007,0\n\n[Window][###hex.builtin.view.data_inspector.name]\nPos=621,38\nSize=124,468\nCollapsed=0\nDockId=0x00000008,0\n\n[Window][###hex.builtin.view.pattern_data.name]\nPos=0,508\nSize=745,252\nCollapsed=0\nDockId=0x00000006,0\n\n[Window][###hex.builtin.view.pattern_editor.name]\nPos=747,38\nSize=646,722\nCollapsed=0\nDockId=0x00000009,0\n\n[Window][###hex.hashes.view.hashes.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000009,4\n\n[Window][###hex.builtin.view.find.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000009,3\n\n[Window][###hex.builtin.view.bookmarks.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000009,2\n\n[Window][###hex.builtin.view.information.name]\nPos=-1889,-120\nSize=510,420\nCollapsed=0\n\n[Window][###hex.yara_rules.view.yara.name]\nPos=720,38\nSize=560,660\nCollapsed=0\n\n[Window][###hex.builtin.view.store.name]\nViewportPos=564,236\nViewportId=0xB51F9C4A\nSize=900,700\nCollapsed=0\n\n[Window][###hex.diffing.view.diff.name]\nPos=1372,38\nSize=1188,1333\nCollapsed=0\nDockId=0x00000009,1\n\n[Window][###hex.builtin.view.provider_settings.load_popup]\nPos=585,322\nSize=314,208\nCollapsed=0\n\n[Window][###hex.builtin.view.patches.name]\nPos=-1889,-120\nSize=510,420\nCollapsed=0\n\n[Window][###hex.builtin.view.data_processor.name]\nPos=747,38\nSize=646,722\nCollapsed=0\nDockId=0x00000009,1\n\n[Window][###hex.builtin.view.tools.name]\nPos=849,268\nSize=431,430\nCollapsed=0\nDockId=0x0000000A,0\n\n[Window][###hex.builtin.view.theme_manager.name]\nPos=391,302\nSize=469,400\nCollapsed=0\n\n[Window][###hex.builtin.tools.invariant_multiplication]\nPos=-1826,300\nSize=600,232\nCollapsed=0\n\n[Window][###hex.builtin.tools.regex_replacer]\nPos=-2091,104\nSize=600,305\nCollapsed=0\n\n[Window][###hex.builtin.tools.calc]\nPos=-1811,118\nSize=600,402\nCollapsed=0\n\n[Window][###hex.builtin.tools.permissions]\nPos=423,296\nSize=600,220\nCollapsed=0\n\n[Window][###hex.builtin.view.help.about.name]\nPos=377,193\nSize=677,400\nCollapsed=0\n\n[Window][###hex.builtin.view.constants.name]\nPos=419,-124\nSize=652,660\nCollapsed=0\n\n[Window][###hex.disassembler.view.disassembler.name]\nPos=1004,-204\nSize=1336,1320\nCollapsed=0\n\n[Window][##achievement_unlocked]\nPos=1093,0\nSize=200,55\nCollapsed=0\n\n[Window][hex.builtin.popup.blocking_task.title]\nPos=506,305\nSize=20,40\nCollapsed=0\n\n[Window][Waiting for Tasks]\nPos=60,60\nSize=16,35\nCollapsed=0\n\n[Window][Restore lost data]\nPos=555,349\nSize=283,84\nCollapsed=0\n\n[Window][Error]\nPos=440,301\nSize=400,118\nCollapsed=0\n\n[Window][###hex.builtin.view.highlight_rules.name]\nViewportPos=724,217\nViewportId=0x31C07F88\nSize=700,400\nCollapsed=0\n\n[Window][SideBarWindow]\nPos=19,37\nSize=660,1345\nCollapsed=0\n\n[Window][SideBarWindow/##Content_53A061AE]\nIsChild=1\nSize=644,1329\n\n[Window][Choose file]\nPos=382,131\nSize=516,458\nCollapsed=0\n\n[Window][###hex.builtin.view.logs.name]\nPos=60,60\nSize=549,466\nCollapsed=0\n\n[Window][###hex.builtin.view.achievements.name]\nPos=60,60\nSize=800,600\nCollapsed=0\n\n[Window][hex.builtin.welcome.start.recent.auto_backups]\nPos=580,365\nSize=233,52\nCollapsed=0\n\n[Window][Auto Backups]\nPos=580,331\nSize=233,120\nCollapsed=0\n\n[Window][hex.builtin.popup.create_workspace.title]\nPos=496,325\nSize=400,132\nCollapsed=0\n\n[Table][0x6A4694E4,3]\nRefScale=13\nColumn 0 Sort=0v\n\n[Table][0x7EE28D79,8]\nRefScale=13\nColumn 0 Width=13\nColumn 1 Weight=1.0000\nColumn 2 Weight=1.0000\nColumn 3 Weight=1.0000 Sort=0v\nColumn 4 Weight=1.0000\nColumn 5 Weight=1.0000\nColumn 6 Weight=1.0000\nColumn 7 Weight=1.0000\n\n[Table][0x6190819E,3]\nColumn 0 Weight=1.0000\nColumn 1 Weight=1.0000\nColumn 2 Weight=1.0000\n\n[Docking][Data]\nDockSpace ID=0x81A8BB71 Window=0xF9B0A590 Pos=225,133 Size=1393,722 Split=X\n DockNode ID=0x00000001 Parent=0x81A8BB71 SizeRef=1370,0 Split=Y\n DockNode ID=0x00000005 Parent=0x00000001 SizeRef=0,825 Split=X Selected=0x5708C63F\n DockNode ID=0x00000007 Parent=0x00000005 SizeRef=1140,701 Selected=0x5708C63F\n DockNode ID=0x00000008 Parent=0x00000005 SizeRef=228,701 Selected=0xFBA7A393\n DockNode ID=0x00000006 Parent=0x00000001 SizeRef=0,444 Selected=0x7AD1CDDD\n DockNode ID=0x00000002 Parent=0x81A8BB71 SizeRef=1188,0 Split=X\n DockNode ID=0x00000003 Parent=0x00000002 SizeRef=12,0\n DockNode ID=0x00000004 Parent=0x00000002 SizeRef=52,0 Split=Y Selected=0xCACA884B\n DockNode ID=0x00000009 Parent=0x00000004 SizeRef=420,228 Selected=0xCACA884B\n DockNode ID=0x0000000A Parent=0x00000004 SizeRef=420,430 Selected=0x1F041AD3\n\n[ImHex][General]\nhex.builtin.view.achievements.name=0\nhex.builtin.view.bookmarks.name=0\nhex.builtin.view.command_palette.name=0\nhex.builtin.view.constants.name=0\nhex.builtin.view.data_inspector.name=1\nhex.builtin.view.data_processor.name=1\nhex.diffing.view.diff.name=0\nhex.disassembler.view.disassembler.name=0\nhex.builtin.view.find.name=0\nhex.hashes.view.hashes.name=0\nhex.builtin.view.help.about.name=0\nhex.builtin.view.hex_editor.name=1\nhex.builtin.view.highlight_rules.name=0\nhex.builtin.view.information.name=0\nhex.builtin.view.logs.name=0\nhex.builtin.view.patches.name=0\nhex.builtin.view.pattern_data.name=1\nhex.builtin.view.pattern_editor.name=1\nhex.builtin.view.provider_settings.name=0\nhex.builtin.view.settings.name=0\nhex.builtin.view.store.name=0\nhex.builtin.view.theme_manager.name=0\nhex.builtin.view.tools.name=0\nhex.yara_rules.view.yara.name=0\nhex.windows.view.tty_console.name=0\nhex.builtin.tools.demangler=0\nhex.builtin.tools.ascii_table=0\nhex.builtin.tools.regex_replacer=0\nhex.builtin.tools.color=0\nhex.builtin.tools.calc=0\nhex.builtin.tools.graphing=0\nhex.builtin.tools.base_converter=0\nhex.builtin.tools.byte_swapper=0\nhex.builtin.tools.permissions=0\nhex.builtin.tools.wiki_explain=0\nhex.builtin.tools.file_tools=0\nhex.builtin.tools.ieee754=0\nhex.builtin.tools.invariant_multiplication=0\nhex.builtin.tools.tcp_client_server=0\nhex.builtin.tools.euclidean_algorithm=0\n\n", - "name": "Default" + "name": "Default", + "builtin": true } \ No newline at end of file diff --git a/plugins/builtin/romfs/auto_extract/workspaces/minimal.hexws b/plugins/builtin/romfs/auto_extract/workspaces/minimal.hexws index 3a3fbfb73..aaf14d535 100644 --- a/plugins/builtin/romfs/auto_extract/workspaces/minimal.hexws +++ b/plugins/builtin/romfs/auto_extract/workspaces/minimal.hexws @@ -1,4 +1,5 @@ { "layout": "[Window][ImHexDockSpace]\nPos=0,19\nSize=600,783\nCollapsed=0\n\n[Window][Debug##Default]\nPos=0,55\nSize=400,400\nCollapsed=0\n\n[Window][###hex.builtin.view.settings.name]\nPos=259,200\nSize=700,400\nCollapsed=0\n\n[Window][Question]\nPos=496,338\nSize=400,105\nCollapsed=0\n\n[Window][Welcome Screen]\nPos=0,37\nSize=1393,728\nCollapsed=0\n\n[Window][###hex.builtin.view.hex_editor.name]\nPos=0,38\nSize=600,740\nCollapsed=0\nDockId=0x00000007,0\n\n[Window][###hex.builtin.view.data_inspector.name]\nPos=1142,76\nSize=553,980\nCollapsed=0\nDockId=0x00000008,0\n\n[Window][###hex.builtin.view.pattern_data.name]\nPos=0,1058\nSize=1695,445\nCollapsed=0\nDockId=0x00000006,0\n\n[Window][###hex.builtin.view.pattern_editor.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000004,0\n\n[Window][###hex.hashes.view.hashes.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000004,4\n\n[Window][###hex.builtin.view.find.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000004,3\n\n[Window][###hex.builtin.view.bookmarks.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000004,2\n\n[Window][###hex.builtin.view.information.name]\nPos=-1889,-120\nSize=510,420\nCollapsed=0\n\n[Window][###hex.yara_rules.view.yara.name]\nPos=720,38\nSize=560,660\nCollapsed=0\n\n[Window][###hex.builtin.view.store.name]\nPos=562,201\nSize=900,700\nCollapsed=0\n\n[Window][###hex.diffing.view.diff.name]\nPos=1233,38\nSize=687,1021\nCollapsed=0\n\n[Window][###hex.builtin.view.provider_settings.load_popup]\nPos=585,322\nSize=314,208\nCollapsed=0\n\n[Window][###hex.builtin.view.patches.name]\nPos=-1889,-120\nSize=510,420\nCollapsed=0\n\n[Window][###hex.builtin.view.data_processor.name]\nPos=1697,76\nSize=863,1427\nCollapsed=0\nDockId=0x00000004,1\n\n[Window][###hex.builtin.view.tools.name]\nViewportPos=952,218\nViewportId=0x9B385D8A\nSize=1306,1600\nCollapsed=0\n\n[Window][###hex.builtin.view.theme_manager.name]\nPos=391,302\nSize=469,400\nCollapsed=0\n\n[Window][###hex.builtin.tools.invariant_multiplication]\nPos=-1826,300\nSize=600,232\nCollapsed=0\n\n[Window][###hex.builtin.tools.regex_replacer]\nPos=-2091,104\nSize=600,305\nCollapsed=0\n\n[Window][###hex.builtin.tools.calc]\nPos=-1811,118\nSize=600,402\nCollapsed=0\n\n[Window][###hex.builtin.tools.permissions]\nPos=423,296\nSize=600,220\nCollapsed=0\n\n[Window][###hex.builtin.view.help.about.name]\nPos=214,201\nSize=600,350\nCollapsed=0\n\n[Window][###hex.builtin.view.constants.name]\nPos=419,-124\nSize=652,660\nCollapsed=0\n\n[Window][###hex.disassembler.view.disassembler.name]\nPos=1004,-204\nSize=1336,1320\nCollapsed=0\n\n[Window][##achievement_unlocked]\nPos=1093,0\nSize=200,55\nCollapsed=0\n\n[Window][hex.builtin.popup.blocking_task.title]\nPos=506,305\nSize=20,40\nCollapsed=0\n\n[Window][Waiting for Tasks]\nPos=60,60\nSize=16,35\nCollapsed=0\n\n[Window][Restore lost data]\nPos=555,349\nSize=283,84\nCollapsed=0\n\n[Window][Error]\nPos=440,301\nSize=400,118\nCollapsed=0\n\n[Window][###hex.builtin.view.highlight_rules.name]\nViewportPos=724,217\nViewportId=0x31C07F88\nSize=700,400\nCollapsed=0\n\n[Window][SideBarWindow]\nPos=19,37\nSize=660,1345\nCollapsed=0\n\n[Window][SideBarWindow/##Content_53A061AE]\nIsChild=1\nSize=644,1329\n\n[Window][Choose file]\nPos=382,131\nSize=516,458\nCollapsed=0\n\n[Window][###hex.builtin.view.logs.name]\nPos=60,60\nSize=549,466\nCollapsed=0\n\n[Window][###hex.builtin.view.achievements.name]\nPos=60,60\nSize=800,600\nCollapsed=0\n\n[Window][hex.builtin.welcome.start.recent.auto_backups]\nPos=580,365\nSize=233,52\nCollapsed=0\n\n[Window][Auto Backups]\nPos=580,331\nSize=233,120\nCollapsed=0\n\n[Window][hex.builtin.popup.create_workspace.title]\nPos=100,334\nSize=400,132\nCollapsed=0\n\n[Table][0x6A4694E4,3]\nRefScale=13\nColumn 0 Sort=0v\n\n[Table][0x7EE28D79,8]\nRefScale=13\nColumn 0 Width=13\nColumn 1 Weight=1.0000\nColumn 2 Weight=1.0000\nColumn 3 Weight=1.0000 Sort=0v\nColumn 4 Weight=1.0000\nColumn 5 Weight=1.0000\nColumn 6 Weight=1.0000\nColumn 7 Weight=1.0000\n\n[Table][0x6190819E,3]\nColumn 0 Weight=1.0000\nColumn 1 Weight=1.0000\nColumn 2 Weight=1.0000\n\n[Docking][Data]\nDockSpace ID=0x81A8BB71 Window=0xF9B0A590 Pos=220,131 Size=600,740 Split=X\n DockNode ID=0x00000001 Parent=0x81A8BB71 SizeRef=847,0 Split=Y\n DockNode ID=0x00000005 Parent=0x00000001 SizeRef=0,44 Split=X Selected=0x5708C63F\n DockNode ID=0x00000007 Parent=0x00000005 SizeRef=1140,701 Selected=0x5708C63F\n DockNode ID=0x00000008 Parent=0x00000005 SizeRef=553,701 Selected=0xFBA7A393\n DockNode ID=0x00000006 Parent=0x00000001 SizeRef=0,20 Selected=0x7AD1CDDD\n DockNode ID=0x00000002 Parent=0x81A8BB71 SizeRef=431,0 Split=X\n DockNode ID=0x00000003 Parent=0x00000002 SizeRef=12,0\n DockNode ID=0x00000004 Parent=0x00000002 SizeRef=52,0 Selected=0xCACA884B\n\n[ImHex][General]\nhex.builtin.view.achievements.name=0\nhex.builtin.view.bookmarks.name=0\nhex.builtin.view.command_palette.name=0\nhex.builtin.view.constants.name=0\nhex.builtin.view.data_inspector.name=0\nhex.builtin.view.data_processor.name=0\nhex.diffing.view.diff.name=0\nhex.disassembler.view.disassembler.name=0\nhex.builtin.view.find.name=0\nhex.hashes.view.hashes.name=0\nhex.builtin.view.help.about.name=0\nhex.builtin.view.hex_editor.name=1\nhex.builtin.view.highlight_rules.name=0\nhex.builtin.view.information.name=0\nhex.builtin.view.logs.name=0\nhex.builtin.view.patches.name=0\nhex.builtin.view.pattern_data.name=0\nhex.builtin.view.pattern_editor.name=0\nhex.builtin.view.provider_settings.name=0\nhex.builtin.view.settings.name=0\nhex.builtin.view.store.name=0\nhex.builtin.view.theme_manager.name=0\nhex.builtin.view.tools.name=0\nhex.yara_rules.view.yara.name=0\nhex.windows.view.tty_console.name=0\nhex.builtin.tools.demangler=0\nhex.builtin.tools.ascii_table=0\nhex.builtin.tools.regex_replacer=0\nhex.builtin.tools.color=0\nhex.builtin.tools.calc=0\nhex.builtin.tools.graphing=0\nhex.builtin.tools.base_converter=0\nhex.builtin.tools.byte_swapper=0\nhex.builtin.tools.permissions=0\nhex.builtin.tools.wiki_explain=0\nhex.builtin.tools.file_tools=0\nhex.builtin.tools.ieee754=0\nhex.builtin.tools.invariant_multiplication=0\nhex.builtin.tools.tcp_client_server=0\nhex.builtin.tools.euclidean_algorithm=0\n\n", - "name": "Minimal" + "name": "Minimal", + "builtin": true } \ No newline at end of file diff --git a/plugins/builtin/source/content/main_menu_items.cpp b/plugins/builtin/source/content/main_menu_items.cpp index 13b0834ba..c2514583d 100644 --- a/plugins/builtin/source/content/main_menu_items.cpp +++ b/plugins/builtin/source/content/main_menu_items.cpp @@ -573,8 +573,6 @@ namespace hex::plugin::builtin { static void createLayoutMenu() { LayoutManager::reload(); - ContentRegistry::Interface::registerMainMenuItem("hex.builtin.menu.workspace", 4000); - ContentRegistry::Interface::addMenuItemSubMenu({ "hex.builtin.menu.workspace", "hex.builtin.menu.workspace.layout" }, ICON_VS_LAYOUT, 1050, []{}, ImHexApi::Provider::isValid); ContentRegistry::Interface::addMenuItem({ "hex.builtin.menu.workspace", "hex.builtin.menu.workspace.layout", "hex.builtin.menu.workspace.layout.save" }, 1100, Shortcut::None, [] { @@ -600,12 +598,12 @@ namespace hex::plugin::builtin { } } - bool shift = ImGui::GetIO().KeyShift; + bool shiftPressed = ImGui::GetIO().KeyShift; for (auto &[name, path] : LayoutManager::getLayouts()) { - if (ImGui::MenuItem(hex::format("{}{}", name, shift ? " " ICON_VS_X : "").c_str(), "", false, ImHexApi::Provider::isValid())) { - if (shift) { - wolv::io::fs::remove(path); - LayoutManager::reload(); + if (ImGui::MenuItem(hex::format("{}{}", name, shiftPressed ? " " ICON_VS_X : "").c_str(), "", false, ImHexApi::Provider::isValid())) { + if (shiftPressed) { + LayoutManager::removeLayout(name); + break; } else { LayoutManager::load(path); } @@ -615,6 +613,8 @@ namespace hex::plugin::builtin { } static void createWorkspaceMenu() { + ContentRegistry::Interface::registerMainMenuItem("hex.builtin.menu.workspace", 4000); + createLayoutMenu(); ContentRegistry::Interface::addMenuItemSeparator({ "hex.builtin.menu.workspace" }, 3000); @@ -627,11 +627,19 @@ namespace hex::plugin::builtin { ContentRegistry::Interface::addMenuItemSubMenu({ "hex.builtin.menu.workspace" }, 3200, [] { const auto &workspaces = WorkspaceManager::getWorkspaces(); + + bool shiftPressed = ImGui::GetIO().KeyShift; for (auto it = workspaces.begin(); it != workspaces.end(); ++it) { const auto &[name, workspace] = *it; - if (ImGui::MenuItem(name.c_str(), "", it == WorkspaceManager::getCurrentWorkspace(), ImHexApi::Provider::isValid())) { - WorkspaceManager::switchWorkspace(name); + bool canRemove = shiftPressed && !workspace.builtin; + if (ImGui::MenuItem(hex::format("{}{}", name, canRemove ? " " ICON_VS_X : "").c_str(), "", it == WorkspaceManager::getCurrentWorkspace(), ImHexApi::Provider::isValid())) { + if (canRemove) { + WorkspaceManager::removeWorkspace(name); + break; + } else { + WorkspaceManager::switchWorkspace(name); + } } } }); diff --git a/plugins/builtin/source/content/workspaces.cpp b/plugins/builtin/source/content/workspaces.cpp index d78315cb0..57cf1eb05 100644 --- a/plugins/builtin/source/content/workspaces.cpp +++ b/plugins/builtin/source/content/workspaces.cpp @@ -7,23 +7,9 @@ namespace hex::plugin::builtin { void loadWorkspaces() { - WorkspaceManager::reset(); - - for (const auto &defaultPath : fs::getDefaultPaths(fs::ImHexPath::Workspaces)) { - for (const auto &entry : std::fs::directory_iterator(defaultPath)) { - if (!entry.is_regular_file()) - continue; - - const auto &path = entry.path(); - if (path.extension() != ".hexws") - continue; - - WorkspaceManager::importFromFile(path); - } - } - - std::string currentWorkspace = ContentRegistry::Settings::read("hex.builtin.setting.general", "hex.builtin.setting.general.curr_workspace", "Default"); + WorkspaceManager::reload(); + auto currentWorkspace = ContentRegistry::Settings::read("hex.builtin.setting.general", "hex.builtin.setting.general.curr_workspace", "Default"); TaskManager::doLater([currentWorkspace] { WorkspaceManager::switchWorkspace(currentWorkspace); });