From 7a4541dac7314ca1d2cd674b85df27d59d8645fb Mon Sep 17 00:00:00 2001 From: WerWolv Date: Sat, 30 Jul 2022 21:25:18 +0200 Subject: [PATCH] ui: Change the provider selector from a dropdown to a tab bar --- lib/libimhex/source/api/imhex_api.cpp | 2 +- main/source/init/splash_window.cpp | 2 +- main/source/window/window.cpp | 11 +++----- .../source/content/main_menu_items.cpp | 2 +- plugins/builtin/source/content/ui_items.cpp | 25 ++++++++++++------- .../content/views/view_disassembler.cpp | 4 --- .../source/content/views/view_hex_editor.cpp | 6 +++++ 7 files changed, 28 insertions(+), 24 deletions(-) diff --git a/lib/libimhex/source/api/imhex_api.cpp b/lib/libimhex/source/api/imhex_api.cpp index e76dd5de8..c292ab11f 100644 --- a/lib/libimhex/source/api/imhex_api.cpp +++ b/lib/libimhex/source/api/imhex_api.cpp @@ -229,7 +229,7 @@ namespace hex { if (Task::getRunningTaskCount() > 0) return; - if (index < s_providers.size()) { + if (index < s_providers.size() && s_currentProvider != index) { auto oldProvider = get(); s_currentProvider = index; EventManager::post(oldProvider, get()); diff --git a/main/source/init/splash_window.cpp b/main/source/init/splash_window.cpp index 9c6deaba2..2192609af 100644 --- a/main/source/init/splash_window.cpp +++ b/main/source/init/splash_window.cpp @@ -185,7 +185,7 @@ namespace hex::init { ImHexApi::System::impl::setGlobalScale(meanScale); ImHexApi::System::impl::setNativeScale(meanScale); - log::info("Native scaling set to: {:.1}", meanScale); + log::info("Native scaling set to: {:.1f}", meanScale); } glfwSetWindowSize(this->m_window, 640_scaled, 400_scaled); diff --git a/main/source/window/window.cpp b/main/source/window/window.cpp index 476bdc19b..6293b74cf 100644 --- a/main/source/window/window.cpp +++ b/main/source/window/window.cpp @@ -227,16 +227,11 @@ namespace hex { ImGui::Separator(); ImGui::SetCursorPosX(8); for (const auto &callback : ContentRegistry::Interface::getFooterItems()) { - auto prevIdx = drawList->_VtxCurrentIdx; callback(); - auto currIdx = drawList->_VtxCurrentIdx; - // Only draw separator if something was actually drawn - if (prevIdx != currIdx) { - ImGui::SameLine(); - ImGui::SeparatorEx(ImGuiSeparatorFlags_Vertical); - ImGui::SameLine(); - } + ImGui::SameLine(); + ImGui::SeparatorEx(ImGuiSeparatorFlags_Vertical); + ImGui::SameLine(); } { diff --git a/plugins/builtin/source/content/main_menu_items.cpp b/plugins/builtin/source/content/main_menu_items.cpp index f141b3bf6..aa527e328 100644 --- a/plugins/builtin/source/content/main_menu_items.cpp +++ b/plugins/builtin/source/content/main_menu_items.cpp @@ -45,7 +45,7 @@ namespace hex::plugin::builtin { bool providerValid = ImHexApi::Provider::isValid(); bool taskRunning = Task::getRunningTaskCount() > 0; - if (ImGui::MenuItem("hex.builtin.menu.file.close"_lang, "", false, providerValid && !taskRunning)) { + if (ImGui::MenuItem("hex.builtin.menu.file.close"_lang, "CTRL + W", false, providerValid && !taskRunning)) { EventManager::post(); ImHexApi::Provider::remove(ImHexApi::Provider::get()); } diff --git a/plugins/builtin/source/content/ui_items.cpp b/plugins/builtin/source/content/ui_items.cpp index 1b8d814bd..7ab7d48ec 100644 --- a/plugins/builtin/source/content/ui_items.cpp +++ b/plugins/builtin/source/content/ui_items.cpp @@ -297,26 +297,33 @@ namespace hex::plugin::builtin { ImGui::SeparatorEx(ImGuiSeparatorFlags_Vertical); ImGui::Spacing(); + ImGui::Spacing(); + ImGui::Spacing(); // Provider switcher ImGui::BeginDisabled(!providerValid || tasksRunning); { auto &providers = ImHexApi::Provider::getProviders(); - std::string preview; - if (ImHexApi::Provider::isValid()) - preview = ImHexApi::Provider::get()->getName(); - - ImGui::SetNextItemWidth(200_scaled); - if (ImGui::BeginCombo("", preview.c_str())) { + ImGui::PushStyleColor(ImGuiCol_TabActive, ImGui::GetColorU32(ImGuiCol_MenuBarBg)); + ImGui::PushStyleColor(ImGuiCol_TabUnfocusedActive, ImGui::GetColorU32(ImGuiCol_MenuBarBg)); + auto providerSelectorVisible = ImGui::BeginTabBar("provider_switcher", ImGuiTabBarFlags_FittingPolicyScroll | ImGuiTabBarFlags_Reorderable); + ImGui::PopStyleColor(2); + if (providerSelectorVisible) { for (size_t i = 0; i < providers.size(); i++) { - if (ImGui::Selectable(providers[i]->getName().c_str())) { + bool open = true; + if (ImGui::BeginTabItem(providers[i]->getName().c_str(), &open)) { ImHexApi::Provider::setCurrentProvider(i); + ImGui::EndTabItem(); + } + + if (!open) { + ImHexApi::Provider::remove(providers[i]); + break; } } - - ImGui::EndCombo(); + ImGui::EndTabBar(); } } ImGui::EndDisabled(); diff --git a/plugins/builtin/source/content/views/view_disassembler.cpp b/plugins/builtin/source/content/views/view_disassembler.cpp index 2f4cde3be..b6902b6fd 100644 --- a/plugins/builtin/source/content/views/view_disassembler.cpp +++ b/plugins/builtin/source/content/views/view_disassembler.cpp @@ -11,10 +11,6 @@ using namespace std::literals::string_literals; namespace hex::plugin::builtin { ViewDisassembler::ViewDisassembler() : View("hex.builtin.view.disassembler.name") { - EventManager::subscribe(this, [this]() { - this->disassemble(); - }); - EventManager::subscribe(this, [this](Region region) { if (this->m_shouldMatchSelection) { if (region.address == size_t(-1)) { diff --git a/plugins/builtin/source/content/views/view_hex_editor.cpp b/plugins/builtin/source/content/views/view_hex_editor.cpp index 3d8fe72d8..1a1c18910 100644 --- a/plugins/builtin/source/content/views/view_hex_editor.cpp +++ b/plugins/builtin/source/content/views/view_hex_editor.cpp @@ -1250,6 +1250,12 @@ namespace hex::plugin::builtin { }); }); + // Close file + ShortcutManager::addGlobalShortcut(CTRL + Keys::W, [] { + EventManager::post(); + ImHexApi::Provider::remove(ImHexApi::Provider::get()); + }); + // Undo / Redo ShortcutManager::addShortcut(this, CTRL + Keys::Z, [] { if (ImHexApi::Provider::isValid())