diff --git a/lib/libimhex/include/hex/ui/view.hpp b/lib/libimhex/include/hex/ui/view.hpp index 5d4290ad2..d2d8ba70a 100644 --- a/lib/libimhex/include/hex/ui/view.hpp +++ b/lib/libimhex/include/hex/ui/view.hpp @@ -85,15 +85,22 @@ namespace hex { */ [[nodiscard]] virtual View* getMenuItemInheritView() const { return nullptr; } - [[nodiscard]] virtual bool shouldStoreWindowState() const { return true; } - [[nodiscard]] const char *getIcon() const { return m_icon; } + [[nodiscard]] const UnlocalizedString& getUnlocalizedName() const; + [[nodiscard]] std::string getName() const; + + [[nodiscard]] virtual bool shouldStoreWindowState() const { return true; } [[nodiscard]] bool &getWindowOpenState(); [[nodiscard]] const bool &getWindowOpenState() const; - [[nodiscard]] const UnlocalizedString &getUnlocalizedName() const; - [[nodiscard]] std::string getName() const; + [[nodiscard]] bool isFocused() const { return m_focused; } + + [[nodiscard]] static std::string toWindowName(const UnlocalizedString &unlocalizedName); + [[nodiscard]] static const View* getLastFocusedView(); + static void discardNavigationRequests(); + + void bringToFront(); [[nodiscard]] bool didWindowJustOpen(); void setWindowJustOpened(bool state); @@ -102,21 +109,8 @@ namespace hex { void setWindowJustClosed(bool state); void trackViewState(); - - static void discardNavigationRequests(); - - [[nodiscard]] static std::string toWindowName(const UnlocalizedString &unlocalizedName); - - [[nodiscard]] bool isFocused() const { return m_focused; } - - /** - * @brief Used for focus handling. Don't use this directly - * @param focused Whether this view is focused - */ void setFocused(bool focused); - [[nodiscard]] static const View* getLastFocusedView(); - public: class Window; class Special; diff --git a/lib/libimhex/source/ui/view.cpp b/lib/libimhex/source/ui/view.cpp index e8becf468..bae4acfe3 100644 --- a/lib/libimhex/source/ui/view.cpp +++ b/lib/libimhex/source/ui/view.cpp @@ -82,6 +82,12 @@ namespace hex { ImGui::GetIO().ConfigFlags &= ~ImGuiConfigFlags_NavEnableKeyboard; } + void View::bringToFront() { + getWindowOpenState() = true; + TaskManager::doLater([this]{ ImGui::SetWindowFocus(toWindowName(getUnlocalizedName()).c_str()); }); + } + + std::string View::toWindowName(const UnlocalizedString &unlocalizedName) { return fmt::format("{}###{}", Lang(unlocalizedName), unlocalizedName.get()); } diff --git a/plugins/builtin/source/content/command_palette_commands.cpp b/plugins/builtin/source/content/command_palette_commands.cpp index ce528477e..5f0b95001 100644 --- a/plugins/builtin/source/content/command_palette_commands.cpp +++ b/plugins/builtin/source/content/command_palette_commands.cpp @@ -405,7 +405,7 @@ namespace hex::plugin::builtin { return result; }, [](auto input) { - return fmt::format("Provider: {}", input.data()); + return fmt::format("Data Source: {}", input.data()); }); ContentRegistry::CommandPaletteCommands::add( @@ -414,6 +414,27 @@ namespace hex::plugin::builtin { "hex.builtin.command.convert.desc", handleConversionCommand); + ContentRegistry::CommandPaletteCommands::addHandler( + ContentRegistry::CommandPaletteCommands::Type::SymbolCommand, + "+", + [](const auto &input) { + std::vector result; + + for (const auto &[unlocalizedName, view] : ContentRegistry::Views::impl::getEntries()) { + const auto name = Lang(unlocalizedName); + if (!hex::containsIgnoreCase(name, input)) + continue; + result.emplace_back(fmt::format("Focus {} View", name), [&view](const auto &) { + view->bringToFront(); + }); + } + + return result; + }, + [](auto input) { + return fmt::format("Focus {} View", input.data()); + }); + } } \ No newline at end of file