diff --git a/plugins/builtin/include/content/views/view_bookmarks.hpp b/plugins/builtin/include/content/views/view_bookmarks.hpp index 4aeb4da55..107d2b13d 100644 --- a/plugins/builtin/include/content/views/view_bookmarks.hpp +++ b/plugins/builtin/include/content/views/view_bookmarks.hpp @@ -14,6 +14,11 @@ namespace hex::plugin::builtin { void drawContent() override; + private: + static bool importBookmarks(prv::Provider *provider, const nlohmann::json &json); + static bool exportBookmarks(prv::Provider *provider, nlohmann::json &json); + + void registerMenuItems(); private: std::string m_currFilter; }; diff --git a/plugins/builtin/source/content/main_menu_items.cpp b/plugins/builtin/source/content/main_menu_items.cpp index 4ce2d701b..22f57b1e6 100644 --- a/plugins/builtin/source/content/main_menu_items.cpp +++ b/plugins/builtin/source/content/main_menu_items.cpp @@ -251,15 +251,6 @@ namespace hex::plugin::builtin { provider->redo(); }); - ContentRegistry::Interface::addMenuItem("hex.builtin.menu.edit", 1050, [&] { - bool providerValid = ImHexApi::Provider::isValid(); - auto selection = ImHexApi::HexEditor::getSelection(); - - if (ImGui::MenuItem("hex.builtin.menu.edit.bookmark"_lang, nullptr, false, selection.has_value() && providerValid)) { - ImHexApi::Bookmarks::add(selection->getStartAddress(), selection->getSize(), {}, {}); - } - }); - } static void createViewMenu() { diff --git a/plugins/builtin/source/content/views/view_bookmarks.cpp b/plugins/builtin/source/content/views/view_bookmarks.cpp index 6332019d4..7521c6ffe 100644 --- a/plugins/builtin/source/content/views/view_bookmarks.cpp +++ b/plugins/builtin/source/content/views/view_bookmarks.cpp @@ -1,8 +1,10 @@ #include "content/views/view_bookmarks.hpp" +#include #include #include #include +#include #include #include @@ -107,55 +109,20 @@ namespace hex::plugin::builtin { return true; auto data = nlohmann::json::parse(fileContent.begin(), fileContent.end()); - if (!data.contains("bookmarks")) - return false; - - auto &bookmarks = ProviderExtraData::get(provider).bookmarks; - bookmarks.clear(); - for (const auto &bookmark : data["bookmarks"]) { - if (!bookmark.contains("name") || !bookmark.contains("comment") || !bookmark.contains("color") || !bookmark.contains("region") || !bookmark.contains("locked")) - continue; - - const auto ®ion = bookmark["region"]; - if (!region.contains("address") || !region.contains("size")) - continue; - - bookmarks.push_back({ - .region = { region["address"], region["size"] }, - .name = bookmark["name"], - .comment = bookmark["comment"], - .color = bookmark["color"], - .locked = bookmark["locked"] - }); - } - - return true; + ProviderExtraData::get(provider).bookmarks.clear(); + return ViewBookmarks::importBookmarks(provider, data); }, .store = [](prv::Provider *provider, const std::fs::path &basePath, Tar &tar) -> bool { nlohmann::json data; - data["bookmarks"] = nlohmann::json::array(); - size_t index = 0; - for (const auto &bookmark : ProviderExtraData::get(provider).bookmarks) { - data["bookmarks"][index] = { - { "name", bookmark.name }, - { "comment", bookmark.comment }, - { "color", bookmark.color }, - { "region", { - { "address", bookmark.region.address }, - { "size", bookmark.region.size } - } - }, - { "locked", bookmark.locked } - }; - index++; - } - + bool result = ViewBookmarks::exportBookmarks(provider, data); tar.write(basePath, data.dump(4)); - return true; + return result; } }); + + this->registerMenuItems(); } ViewBookmarks::~ViewBookmarks() { @@ -300,4 +267,82 @@ namespace hex::plugin::builtin { ImGui::End(); } + bool ViewBookmarks::importBookmarks(prv::Provider *provider, const nlohmann::json &json) { + if (!json.contains("bookmarks")) + return false; + + auto &bookmarks = ProviderExtraData::get(provider).bookmarks; + for (const auto &bookmark : json["bookmarks"]) { + if (!bookmark.contains("name") || !bookmark.contains("comment") || !bookmark.contains("color") || !bookmark.contains("region") || !bookmark.contains("locked")) + continue; + + const auto ®ion = bookmark["region"]; + if (!region.contains("address") || !region.contains("size")) + continue; + + bookmarks.push_back({ + .region = { region["address"], region["size"] }, + .name = bookmark["name"], + .comment = bookmark["comment"], + .color = bookmark["color"], + .locked = bookmark["locked"] + }); + } + + return true; + } + + bool ViewBookmarks::exportBookmarks(prv::Provider *provider, nlohmann::json &json) { + json["bookmarks"] = nlohmann::json::array(); + size_t index = 0; + for (const auto &bookmark : ProviderExtraData::get(provider).bookmarks) { + json["bookmarks"][index] = { + { "name", bookmark.name }, + { "comment", bookmark.comment }, + { "color", bookmark.color }, + { "region", { + { "address", bookmark.region.address }, + { "size", bookmark.region.size } + } + }, + { "locked", bookmark.locked } + }; + index++; + } + + return true; + } + + void ViewBookmarks::registerMenuItems() { + ContentRegistry::Interface::addMenuItem("hex.builtin.menu.edit", 1050, [&] { + bool providerValid = ImHexApi::Provider::isValid(); + auto selection = ImHexApi::HexEditor::getSelection(); + + if (ImGui::MenuItem("hex.builtin.menu.edit.bookmark.create"_lang, nullptr, false, selection.has_value() && providerValid)) { + ImHexApi::Bookmarks::add(selection->getStartAddress(), selection->getSize(), {}, {}); + } + }); + + ContentRegistry::Interface::addMenuItem("hex.builtin.menu.file", 4000, [&] { + bool providerValid = ImHexApi::Provider::isValid(); + auto selection = ImHexApi::HexEditor::getSelection(); + + if (ImGui::MenuItem("hex.builtin.menu.file.bookmark.import"_lang, nullptr, false, selection.has_value() && providerValid)) { + fs::openFileBrowser(fs::DialogMode::Open, { { "Bookmarks File", "hexbm"} }, [&](const std::fs::path &path) { + try { + importBookmarks(ImHexApi::Provider::get(), nlohmann::json::parse(fs::File(path, fs::File::Mode::Read).readString())); + } catch (...) { } + }); + } + if (ImGui::MenuItem("hex.builtin.menu.file.bookmark.export"_lang, nullptr, false, selection.has_value() && providerValid)) { + fs::openFileBrowser(fs::DialogMode::Save, { { "Bookmarks File", "hexbm"} }, [&](const std::fs::path &path) { + nlohmann::json json; + exportBookmarks(ImHexApi::Provider::get(), json); + + fs::File(path, fs::File::Mode::Create).write(json.dump(4)); + }); + } + }); + } + } \ 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 64b5eb356..55e9f8512 100644 --- a/plugins/builtin/source/lang/de_DE.cpp +++ b/plugins/builtin/source/lang/de_DE.cpp @@ -122,11 +122,13 @@ namespace hex::plugin::builtin { { "hex.builtin.menu.file.export.ips", "IPS Patch" }, { "hex.builtin.menu.file.export.ips32", "IPS32 Patch" }, { "hex.builtin.menu.file.export.base64.popup.export_error", "File is not in a valid Base64 format!" }, + { "hex.builtin.menu.file.bookmark.import", "Lesezeichen importieren" }, + { "hex.builtin.menu.file.bookmark.export", "Lesezeichen exportieren" }, { "hex.builtin.menu.edit", "Bearbeiten" }, { "hex.builtin.menu.edit.undo", "Rückgängig" }, { "hex.builtin.menu.edit.redo", "Wiederholen" }, - { "hex.builtin.menu.edit.bookmark", "Lesezeichen erstellen" }, + { "hex.builtin.menu.edit.bookmark.create", "Lesezeichen erstellen" }, { "hex.builtin.menu.view", "Ansicht" }, { "hex.builtin.menu.layout", "Layout" }, diff --git a/plugins/builtin/source/lang/en_US.cpp b/plugins/builtin/source/lang/en_US.cpp index f9bf7e061..e08617049 100644 --- a/plugins/builtin/source/lang/en_US.cpp +++ b/plugins/builtin/source/lang/en_US.cpp @@ -124,12 +124,14 @@ namespace hex::plugin::builtin { { "hex.builtin.menu.file.export.ips", "IPS Patch" }, { "hex.builtin.menu.file.export.ips32", "IPS32 Patch" }, { "hex.builtin.menu.file.export.base64.popup.export_error", "File is not in a valid Base64 format!" }, - { "hex.builtin.menu.file.export.popup.create", "Cannot export data. Failed to create file!" }, + { "hex.builtin.menu.file.export.popup.create", "Cannot export data. Failed to create file!" }, + { "hex.builtin.menu.file.bookmark.import", "Import bookmarks" }, + { "hex.builtin.menu.file.bookmark.export", "Export bookmarks" }, { "hex.builtin.menu.edit", "Edit" }, { "hex.builtin.menu.edit.undo", "Undo" }, { "hex.builtin.menu.edit.redo", "Redo" }, - { "hex.builtin.menu.edit.bookmark", "Create bookmark" }, + { "hex.builtin.menu.edit.bookmark.create", "Create bookmark" }, { "hex.builtin.menu.view", "View" }, { "hex.builtin.menu.layout", "Layout" }, diff --git a/plugins/builtin/source/lang/it_IT.cpp b/plugins/builtin/source/lang/it_IT.cpp index e26723ec9..c250c7bd9 100644 --- a/plugins/builtin/source/lang/it_IT.cpp +++ b/plugins/builtin/source/lang/it_IT.cpp @@ -124,11 +124,13 @@ namespace hex::plugin::builtin { { "hex.builtin.menu.file.export.ips32", "IPS32 Patch" }, //{ "hex.builtin.menu.file.export.base64.popup.export_error", "File is not in a valid Base64 format!" }, //{ "hex.builtin.menu.file.export.popup.create", "Cannot export data. Failed to create file!" }, + //{ "hex.builtin.menu.file.bookmark.import", "Import bookmarks" }, + //{ "hex.builtin.menu.file.bookmark.export", "Export bookmarks" }, { "hex.builtin.menu.edit", "Modifica" }, { "hex.builtin.menu.edit.undo", "Annulla" }, { "hex.builtin.menu.edit.redo", "Ripeti" }, - { "hex.builtin.menu.edit.bookmark", "Crea segnalibro" }, + { "hex.builtin.menu.edit.bookmark.create", "Crea segnalibro" }, { "hex.builtin.menu.view", "Vista" }, { "hex.builtin.menu.layout", "Layout" }, diff --git a/plugins/builtin/source/lang/ja_JP.cpp b/plugins/builtin/source/lang/ja_JP.cpp index f0b27ec5d..7c8cb4206 100644 --- a/plugins/builtin/source/lang/ja_JP.cpp +++ b/plugins/builtin/source/lang/ja_JP.cpp @@ -124,11 +124,13 @@ namespace hex::plugin::builtin { { "hex.builtin.menu.file.export.ips32", "IPS32パッチ" }, { "hex.builtin.menu.file.export.base64.popup.export_error", "有効なBase64形式ではありません。" }, { "hex.builtin.menu.file.export.popup.create", "データをエクスポートできません。\nファイルの作成に失敗しました。" }, + //{ "hex.builtin.menu.file.bookmark.import", "Import bookmarks" }, + //{ "hex.builtin.menu.file.bookmark.export", "Export bookmarks" }, { "hex.builtin.menu.edit", "編集" }, { "hex.builtin.menu.edit.undo", "元に戻す" }, { "hex.builtin.menu.edit.redo", "やり直す" }, - { "hex.builtin.menu.edit.bookmark", "ブックマークを作成" }, + { "hex.builtin.menu.edit.bookmark.create", "ブックマークを作成" }, { "hex.builtin.menu.view", "表示" }, { "hex.builtin.menu.layout", "レイアウト" }, diff --git a/plugins/builtin/source/lang/pt_BR.cpp b/plugins/builtin/source/lang/pt_BR.cpp index ba8bf3969..e1634620b 100644 --- a/plugins/builtin/source/lang/pt_BR.cpp +++ b/plugins/builtin/source/lang/pt_BR.cpp @@ -123,11 +123,13 @@ namespace hex::plugin::builtin { { "hex.builtin.menu.file.export.ips32", "IPS32 Patch" }, { "hex.builtin.menu.file.export.base64.popup.export_error", "Esse arquivo não é baseado em um formato Base64 valido!" }, { "hex.builtin.menu.file.export.popup.create", "Não é possível exportar os dados. Falha ao criar arquivo!" }, + //{ "hex.builtin.menu.file.bookmark.import", "Import bookmarks" }, + //{ "hex.builtin.menu.file.bookmark.export", "Export bookmarks" }, { "hex.builtin.menu.edit", "Editar" }, { "hex.builtin.menu.edit.undo", "Desfazer" }, { "hex.builtin.menu.edit.redo", "Refazer" }, - { "hex.builtin.menu.edit.bookmark", "Criar Marcador" }, + { "hex.builtin.menu.edit.bookmark.create", "Criar Marcador" }, { "hex.builtin.menu.view", "Exibir" }, { "hex.builtin.menu.layout", "Layout" }, diff --git a/plugins/builtin/source/lang/zh_CN.cpp b/plugins/builtin/source/lang/zh_CN.cpp index 3082e2985..f60d3edd4 100644 --- a/plugins/builtin/source/lang/zh_CN.cpp +++ b/plugins/builtin/source/lang/zh_CN.cpp @@ -123,11 +123,13 @@ namespace hex::plugin::builtin { { "hex.builtin.menu.file.export.ips32", "IPS32 补丁" }, { "hex.builtin.menu.file.export.base64.popup.export_error", "文件不是有效的 Base64 格式!" }, { "hex.builtin.menu.file.export.popup.create", "无法导出文件。文件创建失败!" }, + //{ "hex.builtin.menu.file.bookmark.import", "Import bookmarks" }, + //{ "hex.builtin.menu.file.bookmark.export", "Export bookmarks" }, { "hex.builtin.menu.edit", "编辑" }, { "hex.builtin.menu.edit.undo", "撤销" }, { "hex.builtin.menu.edit.redo", "重做" }, - { "hex.builtin.menu.edit.bookmark", "添加书签" }, + { "hex.builtin.menu.edit.bookmark.create", "添加书签" }, { "hex.builtin.menu.view", "视图" }, { "hex.builtin.menu.layout", "布局" }, diff --git a/plugins/builtin/source/lang/zh_TW.cpp b/plugins/builtin/source/lang/zh_TW.cpp index 9adf6e377..950bbe9f0 100644 --- a/plugins/builtin/source/lang/zh_TW.cpp +++ b/plugins/builtin/source/lang/zh_TW.cpp @@ -123,11 +123,13 @@ namespace hex::plugin::builtin { { "hex.builtin.menu.file.export.ips32", "IPS32 修補檔案" }, { "hex.builtin.menu.file.export.base64.popup.export_error", "檔案並非有效的 Base64 格式!" }, { "hex.builtin.menu.file.export.popup.create", "無法匯出資料。無法建立檔案!" }, + //{ "hex.builtin.menu.file.bookmark.import", "Import bookmarks" }, + //{ "hex.builtin.menu.file.bookmark.export", "Export bookmarks" }, { "hex.builtin.menu.edit", "編輯" }, { "hex.builtin.menu.edit.undo", "復原" }, { "hex.builtin.menu.edit.redo", "取消復原" }, - { "hex.builtin.menu.edit.bookmark", "建立書籤" }, + { "hex.builtin.menu.edit.bookmark.create", "建立書籤" }, { "hex.builtin.menu.view", "檢視" }, { "hex.builtin.menu.layout", "版面配置" },