impr: Various rendering performance improvements

This commit is contained in:
WerWolv
2025-09-17 20:46:15 +02:00
parent d9aaef29d2
commit 98369600c3
7 changed files with 62 additions and 35 deletions

View File

@@ -320,19 +320,23 @@ namespace hex::plugin::builtin::recent {
}
}
ImGui::PushID(recentEntry.getHash());
// Detect right click on recent provider
std::string popupID = fmt::format("RecentEntryMenu.{}", recentEntry.getHash());
constexpr static auto PopupID = "RecentEntryMenu";
if (ImGui::IsMouseReleased(1) && ImGui::IsItemHovered()) {
ImGui::OpenPopup(popupID.c_str());
ImGui::OpenPopup(PopupID);
}
if (ImGui::BeginPopup(popupID.c_str())) {
if (ImGui::BeginPopup(PopupID)) {
if (ImGui::MenuItemEx("hex.ui.common.remove"_lang, ICON_VS_REMOVE)) {
shouldRemove = true;
}
ImGui::EndPopup();
}
ImGui::PopID();
// Handle deletion from vector and on disk
if (shouldRemove) {
wolv::io::fs::remove(recentEntry.entryFilePath);

View File

@@ -26,6 +26,7 @@
#include <GLFW/glfw3.h>
#include <random>
#include <unordered_set>
namespace hex::plugin::builtin {
@@ -311,40 +312,44 @@ namespace hex::plugin::builtin {
}
}
bool isMenuItemVisible(const ContentRegistry::UserInterface::impl::MenuItem &menuItem) {
const auto lastFocusedView = View::getLastFocusedView();
if (lastFocusedView == nullptr && menuItem.view != nullptr) {
bool isMenuItemVisible(const View *lastFocusedView, const ContentRegistry::UserInterface::impl::MenuItem &menuItem) {
if (!menuItem.view)
return true;
if (!lastFocusedView)
return menuItem.shortcut.has(ShowOnWelcomeScreen);
}
if (lastFocusedView != nullptr && menuItem.view != nullptr) {
if (menuItem.view != lastFocusedView && menuItem.view != lastFocusedView->getMenuItemInheritView()) {
return false;
}
}
return true;
return menuItem.view == lastFocusedView || menuItem.view == lastFocusedView->getMenuItemInheritView();
}
std::set<UnlocalizedString> getVisibleMainMenus() {
std::set<UnlocalizedString> result;
for (auto &[priority, menuItem] : ContentRegistry::UserInterface::impl::getMenuItems()) {
if (isMenuItemVisible(menuItem)) {
result.emplace(menuItem.unlocalizedNames.front());
}
}
static std::set<UnlocalizedString> result;
const auto lastFocusedView = View::getLastFocusedView();
static std::optional<const View*> prevLastFocusedView;
if (lastFocusedView == prevLastFocusedView)
return result;
prevLastFocusedView = lastFocusedView;
result.clear();
for (const auto &[priority, menuItem] : ContentRegistry::UserInterface::impl::getMenuItems()) {
if (result.contains(menuItem.unlocalizedNames.front())) [[likely]]
continue;
if (isMenuItemVisible(lastFocusedView, menuItem))
result.insert(menuItem.unlocalizedNames.front());
}
return result;
}
void populateMenu(const UnlocalizedString &menuName) {
const auto lastFocusedView = View::getLastFocusedView();
for (auto &[priority, menuItem] : ContentRegistry::UserInterface::impl::getMenuItems()) {
if (!menuName.empty()) {
if (menuItem.unlocalizedNames[0] != menuName)
continue;
}
if (!isMenuItemVisible(menuItem)) {
if (!isMenuItemVisible(lastFocusedView, menuItem)) {
continue;
}