diff --git a/lib/libimhex/include/hex/helpers/debugging.hpp b/lib/libimhex/include/hex/helpers/debugging.hpp index 599ba7383..2778a623d 100644 --- a/lib/libimhex/include/hex/helpers/debugging.hpp +++ b/lib/libimhex/include/hex/helpers/debugging.hpp @@ -29,9 +29,9 @@ namespace hex::dbg { if constexpr (std::same_as) { ImGui::Checkbox(name.data(), &variable); } else if constexpr (std::integral || std::floating_point) { - ImGui::InputScalar(name.data(), ImGuiExt::getImGuiDataType(), &variable); + ImGui::DragScalar(name.data(), ImGuiExt::getImGuiDataType(), &variable); } else if constexpr (std::same_as) { - ImGui::InputFloat2(name.data(), &variable.x); + ImGui::DragFloat2(name.data(), &variable.x); } else if constexpr (std::same_as) { ImGui::InputText(name.data(), variable); } else if constexpr (std::same_as) { diff --git a/plugins/builtin/source/content/welcome_screen.cpp b/plugins/builtin/source/content/welcome_screen.cpp index f80aa227f..e6d9ff5d2 100644 --- a/plugins/builtin/source/content/welcome_screen.cpp +++ b/plugins/builtin/source/content/welcome_screen.cpp @@ -3,7 +3,6 @@ #include #include #include -#include #include #include #include @@ -11,6 +10,7 @@ #include #include #include +#include #include @@ -159,212 +159,176 @@ namespace hex::plugin::builtin { } void drawWelcomeScreenContentFull() { - const auto availableSpace = ImGui::GetContentRegionAvail(); + const ImVec2 margin = scaled({ 30, 20 }); - ImGui::Image(s_bannerTexture, s_bannerTexture.getSize() / (2 * (1.0F / ImHexApi::System::getGlobalScale()))); - - ImGui::PushStyleColor(ImGuiCol_ChildBg, ImGui::GetStyleColorVec4(ImGuiCol_PopupBg)); - ON_SCOPE_EXIT { ImGui::PopStyleColor(); }; - ImGui::Indent(); - if (ImGui::BeginTable("Welcome Left", 1, ImGuiTableFlags_NoBordersInBody, ImVec2(availableSpace.x / 2, 0))) { - - ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetTextLineHeightWithSpacing() * 3); + ImGui::SetCursorPos(margin); + if (ImGui::BeginTable("Welcome Outer", 1, ImGuiTableFlags_None, ImGui::GetContentRegionAvail() - margin)) { + ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::Image(s_bannerTexture, s_bannerTexture.getSize() / (1.5F * (1.0F / ImHexApi::System::getGlobalScale()))); - ImGui::PushTextWrapPos(ImGui::GetCursorPosX() + std::min(450_scaled, availableSpace.x / 2 - 50_scaled)); + ImGui::PushTextWrapPos(500_scaled); ImGuiExt::TextFormattedWrapped("A Hex Editor for Reverse Engineers, Programmers and people who value their retinas when working at 3 AM."); ImGui::PopTextWrapPos(); - ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetTextLineHeightWithSpacing() * 6); + ImGui::NewLine(); + ImGui::NewLine(); + ImGui::NewLine(); + + ImGui::PushStyleColor(ImGuiCol_ChildBg, ImGui::GetStyleColorVec4(ImGuiCol_PopupBg)); + ON_SCOPE_EXIT { ImGui::PopStyleColor(); }; + + ImGui::TableNextRow(); ImGui::TableNextColumn(); + const auto availableSpace = ImGui::GetContentRegionAvail(); + if (ImGui::BeginTable("Welcome Left", 1, ImGuiTableFlags_NoBordersInBody, ImVec2(availableSpace.x / 2, 0))) { + ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetTextLineHeightWithSpacing() * 6); + ImGui::TableNextColumn(); - static bool otherProvidersVisible = false; - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 5_scaled); + static bool otherProvidersVisible = false; + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 5_scaled); - { - auto startPos = ImGui::GetCursorPos(); - ImGuiExt::BeginSubWindow("hex.builtin.welcome.header.start"_lang, ImVec2(), ImGuiChildFlags_AutoResizeX); { - if (ImGuiExt::IconHyperlink(ICON_VS_NEW_FILE, "hex.builtin.welcome.start.create_file"_lang)) { - auto newProvider = hex::ImHexApi::Provider::createProvider("hex.builtin.provider.mem_file", true); - if (newProvider != nullptr && !newProvider->open()) - hex::ImHexApi::Provider::remove(newProvider); - else - EventProviderOpened::post(newProvider); + auto startPos = ImGui::GetCursorPos(); + ImGuiExt::BeginSubWindow("hex.builtin.welcome.header.start"_lang, ImVec2(), ImGuiChildFlags_AutoResizeX); + { + if (ImGuiExt::IconHyperlink(ICON_VS_NEW_FILE, "hex.builtin.welcome.start.create_file"_lang)) { + auto newProvider = hex::ImHexApi::Provider::createProvider("hex.builtin.provider.mem_file", true); + if (newProvider != nullptr && !newProvider->open()) + hex::ImHexApi::Provider::remove(newProvider); + else + EventProviderOpened::post(newProvider); + } + if (ImGuiExt::IconHyperlink(ICON_VS_GO_TO_FILE, "hex.builtin.welcome.start.open_file"_lang)) + RequestOpenWindow::post("Open File"); + if (ImGuiExt::IconHyperlink(ICON_VS_NOTEBOOK, "hex.builtin.welcome.start.open_project"_lang)) + RequestOpenWindow::post("Open Project"); + if (ImGuiExt::IconHyperlink(ICON_VS_TELESCOPE, "hex.builtin.welcome.start.open_other"_lang)) + otherProvidersVisible = !otherProvidersVisible; } - if (ImGuiExt::IconHyperlink(ICON_VS_GO_TO_FILE, "hex.builtin.welcome.start.open_file"_lang)) - RequestOpenWindow::post("Open File"); - if (ImGuiExt::IconHyperlink(ICON_VS_NOTEBOOK, "hex.builtin.welcome.start.open_project"_lang)) - RequestOpenWindow::post("Open Project"); - if (ImGuiExt::IconHyperlink(ICON_VS_TELESCOPE, "hex.builtin.welcome.start.open_other"_lang)) - otherProvidersVisible = !otherProvidersVisible; + ImGuiExt::EndSubWindow(); + auto endPos = ImGui::GetCursorPos(); + + if (otherProvidersVisible) { + ImGui::SameLine(0, 2_scaled); + ImGui::SetCursorPos(ImGui::GetCursorPos() + ImVec2(0, (endPos - startPos).y / 2)); + ImGui::TextUnformatted(ICON_VS_ARROW_RIGHT); + ImGui::SameLine(0, 2_scaled); + + ImGuiExt::BeginSubWindow("hex.builtin.welcome.start.open_other"_lang, ImVec2(200_scaled, ImGui::GetTextLineHeightWithSpacing() * 6), ImGuiChildFlags_AutoResizeX); + for (const auto &unlocalizedProviderName : ContentRegistry::Provider::impl::getEntries()) { + if (ImGuiExt::Hyperlink(Lang(unlocalizedProviderName))) { + ImHexApi::Provider::createProvider(unlocalizedProviderName); + otherProvidersVisible = false; + } + } + ImGuiExt::EndSubWindow(); + } + } + + // Draw recent entries + ImGui::Dummy({}); + recent::draw(); + + if (ImHexApi::System::getInitArguments().contains("update-available")) { + ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetTextLineHeightWithSpacing() * 5); + ImGui::TableNextColumn(); + ImGuiExt::UnderlinedText("hex.builtin.welcome.header.update"_lang); + { + if (ImGuiExt::DescriptionButton("hex.builtin.welcome.update.title"_lang, hex::format("hex.builtin.welcome.update.desc"_lang, ImHexApi::System::getInitArguments()["update-available"]).c_str(), ImVec2(ImGui::GetContentRegionAvail().x * 0.8F, 0))) + ImHexApi::System::updateImHex(ImHexApi::System::UpdateType::Stable); + } + } + + ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetTextLineHeightWithSpacing() * 6); + ImGui::TableNextColumn(); + + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 5_scaled); + ImGuiExt::BeginSubWindow("hex.builtin.welcome.header.help"_lang, ImVec2(), ImGuiChildFlags_AutoResizeX); + { + if (ImGuiExt::IconHyperlink(ICON_VS_GITHUB, "hex.builtin.welcome.help.repo"_lang)) hex::openWebpage("hex.builtin.welcome.help.repo.link"_lang); + if (ImGuiExt::IconHyperlink(ICON_VS_ORGANIZATION, "hex.builtin.welcome.help.gethelp"_lang)) hex::openWebpage("hex.builtin.welcome.help.gethelp.link"_lang); + if (ImGuiExt::IconHyperlink(ICON_VS_COMMENT_DISCUSSION, "hex.builtin.welcome.help.discord"_lang)) hex::openWebpage("hex.builtin.welcome.help.discord.link"_lang); } ImGuiExt::EndSubWindow(); - auto endPos = ImGui::GetCursorPos(); - if (otherProvidersVisible) { - ImGui::SameLine(0, 2_scaled); - ImGui::SetCursorPos(ImGui::GetCursorPos() + ImVec2(0, (endPos - startPos).y / 2)); - ImGui::TextUnformatted(ICON_VS_ARROW_RIGHT); - ImGui::SameLine(0, 2_scaled); + ImGui::EndTable(); + } + ImGui::SameLine(); + if (ImGui::BeginTable("Welcome Right", 1, ImGuiTableFlags_NoBordersInBody, ImVec2(availableSpace.x / 2, 0))) { + ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetTextLineHeightWithSpacing() * 5); + ImGui::TableNextColumn(); - ImGuiExt::BeginSubWindow("hex.builtin.welcome.start.open_other"_lang, ImVec2(200_scaled, ImGui::GetTextLineHeightWithSpacing() * 6), ImGuiChildFlags_AutoResizeX); - for (const auto &unlocalizedProviderName : ContentRegistry::Provider::impl::getEntries()) { - if (ImGuiExt::Hyperlink(Lang(unlocalizedProviderName))) { - ImHexApi::Provider::createProvider(unlocalizedProviderName); - otherProvidersVisible = false; + auto windowPadding = ImGui::GetStyle().WindowPadding.x * 3; + + ImGuiExt::BeginSubWindow("hex.builtin.welcome.header.customize"_lang, ImVec2(ImGui::GetContentRegionAvail().x - windowPadding, 0), ImGuiChildFlags_AutoResizeX); + { + if (ImGuiExt::DescriptionButton("hex.builtin.welcome.customize.settings.title"_lang, "hex.builtin.welcome.customize.settings.desc"_lang, ImVec2(ImGui::GetContentRegionAvail().x, 0))) + RequestOpenWindow::post("Settings"); + } + ImGuiExt::EndSubWindow(); + ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetTextLineHeightWithSpacing() * 5); + ImGui::TableNextColumn(); + + ImGuiExt::BeginSubWindow("hex.builtin.welcome.header.learn"_lang, ImVec2(ImGui::GetContentRegionAvail().x - windowPadding, 0), ImGuiChildFlags_AutoResizeX); + { + const auto size = ImVec2(ImGui::GetContentRegionAvail().x, 0); + if (ImGuiExt::DescriptionButton("hex.builtin.welcome.learn.latest.title"_lang, "hex.builtin.welcome.learn.latest.desc"_lang, size)) + hex::openWebpage("hex.builtin.welcome.learn.latest.link"_lang); + if (ImGuiExt::DescriptionButton("hex.builtin.welcome.learn.imhex.title"_lang, "hex.builtin.welcome.learn.imhex.desc"_lang, size)) { + AchievementManager::unlockAchievement("hex.builtin.achievement.starting_out", "hex.builtin.achievement.starting_out.docs.name"); + hex::openWebpage("hex.builtin.welcome.learn.imhex.link"_lang); + } + if (ImGuiExt::DescriptionButton("hex.builtin.welcome.learn.pattern.title"_lang, "hex.builtin.welcome.learn.pattern.desc"_lang, size)) + hex::openWebpage("hex.builtin.welcome.learn.pattern.link"_lang); + if (ImGuiExt::DescriptionButton("hex.builtin.welcome.learn.plugins.title"_lang, "hex.builtin.welcome.learn.plugins.desc"_lang, size)) + hex::openWebpage("hex.builtin.welcome.learn.plugins.link"_lang); + + if (auto [unlocked, total] = AchievementManager::getProgress(); unlocked != total) { + if (ImGuiExt::DescriptionButtonProgress("hex.builtin.welcome.learn.achievements.title"_lang, "hex.builtin.welcome.learn.achievements.desc"_lang, float(unlocked) / float(total), size)) { + RequestOpenWindow::post("Achievements"); } } + } + ImGuiExt::EndSubWindow(); + + auto extraWelcomeScreenEntries = ContentRegistry::Interface::impl::getWelcomeScreenEntries(); + if (!extraWelcomeScreenEntries.empty()) { + ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetTextLineHeightWithSpacing() * 5); + ImGui::TableNextColumn(); + + ImGuiExt::BeginSubWindow("hex.builtin.welcome.header.various"_lang, ImVec2(ImGui::GetContentRegionAvail().x - windowPadding, 0)); + { + for (const auto &callback : extraWelcomeScreenEntries) + callback(); + } ImGuiExt::EndSubWindow(); } - } - // Draw recent entries - ImGui::Dummy({}); - recent::draw(); + if (s_infoBannerTexture.isValid()) { + static bool hovered = false; - if (ImHexApi::System::getInitArguments().contains("update-available")) { - ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetTextLineHeightWithSpacing() * 5); - ImGui::TableNextColumn(); - ImGuiExt::UnderlinedText("hex.builtin.welcome.header.update"_lang); - { - if (ImGuiExt::DescriptionButton("hex.builtin.welcome.update.title"_lang, hex::format("hex.builtin.welcome.update.desc"_lang, ImHexApi::System::getInitArguments()["update-available"]).c_str(), ImVec2(ImGui::GetContentRegionAvail().x * 0.8F, 0))) - ImHexApi::System::updateImHex(ImHexApi::System::UpdateType::Stable); - } - } + ImGui::PushStyleColor(ImGuiCol_Border, ImGui::GetStyleColorVec4(hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Border)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); + ImGuiExt::BeginSubWindow("hex.builtin.welcome.header.info"_lang, ImVec2(), ImGuiChildFlags_AutoResizeX); + { + const auto height = 80_scaled; + ImGui::Image(s_infoBannerTexture, ImVec2(height * s_infoBannerTexture.getAspectRatio(), height)); + hovered = ImGui::IsItemHovered(); - ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetTextLineHeightWithSpacing() * 6); - ImGui::TableNextColumn(); - - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 5_scaled); - ImGuiExt::BeginSubWindow("hex.builtin.welcome.header.help"_lang, ImVec2(), ImGuiChildFlags_AutoResizeX); - { - if (ImGuiExt::IconHyperlink(ICON_VS_GITHUB, "hex.builtin.welcome.help.repo"_lang)) hex::openWebpage("hex.builtin.welcome.help.repo.link"_lang); - if (ImGuiExt::IconHyperlink(ICON_VS_ORGANIZATION, "hex.builtin.welcome.help.gethelp"_lang)) hex::openWebpage("hex.builtin.welcome.help.gethelp.link"_lang); - if (ImGuiExt::IconHyperlink(ICON_VS_COMMENT_DISCUSSION, "hex.builtin.welcome.help.discord"_lang)) hex::openWebpage("hex.builtin.welcome.help.discord.link"_lang); - } - ImGuiExt::EndSubWindow(); - - ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetTextLineHeightWithSpacing() * 5); - ImGui::TableNextColumn(); - - ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); - ImGuiExt::BeginSubWindow("hex.builtin.welcome.header.plugins"_lang, ImVec2(ImGui::GetContentRegionAvail().x * 0.8F, 0), ImGuiChildFlags_AutoResizeX); - { - const auto &plugins = PluginManager::getPlugins(); - - if (!plugins.empty()) { - if (ImGui::BeginTable("plugins", 4, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_ScrollY | ImGuiTableFlags_SizingFixedFit, ImVec2(0, ImGui::GetTextLineHeightWithSpacing() * 5))) { - ImGui::TableSetupScrollFreeze(0, 1); - ImGui::TableSetupColumn("hex.builtin.welcome.plugins.plugin"_lang); - ImGui::TableSetupColumn("hex.builtin.welcome.plugins.author"_lang); - ImGui::TableSetupColumn("hex.builtin.welcome.plugins.desc"_lang, ImGuiTableColumnFlags_WidthStretch, 0.5); - ImGui::TableSetupColumn("##loaded", ImGuiTableColumnFlags_WidthFixed, ImGui::GetTextLineHeight()); - - ImGui::TableHeadersRow(); - - ImGuiListClipper clipper; - clipper.Begin(plugins.size()); - - while (clipper.Step()) { - for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) { - const auto &plugin = plugins[i]; - - ImGui::TableNextRow(); - ImGui::TableNextColumn(); - ImGui::TextUnformatted(plugin.getPluginName().c_str()); - ImGui::TableNextColumn(); - ImGui::TextUnformatted(plugin.getPluginAuthor().c_str()); - ImGui::TableNextColumn(); - ImGui::TextUnformatted(plugin.getPluginDescription().c_str()); - ImGui::TableNextColumn(); - ImGui::TextUnformatted(plugin.isLoaded() ? ICON_VS_CHECK : ICON_VS_CLOSE); - } + if (ImGui::IsItemClicked()) { + hex::openWebpage(ImHexApiURL + hex::format("/info/{}/link", hex::toLower(ImHexApi::System::getOSName()))); } - - clipper.End(); - - ImGui::EndTable(); } + ImGuiExt::EndSubWindow(); + ImGui::PopStyleVar(); + ImGui::PopStyleColor(); + } + + + ImGui::EndTable(); } - ImGuiExt::EndSubWindow(); - ImGui::PopStyleVar(); - - ImGui::EndTable(); - } - ImGui::SameLine(); - if (ImGui::BeginTable("Welcome Right", 1, ImGuiTableFlags_NoBordersInBody, ImVec2(availableSpace.x / 2, 0))) { - ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetTextLineHeightWithSpacing() * 5); - ImGui::TableNextColumn(); - - auto windowPadding = ImGui::GetStyle().WindowPadding.x * 3; - - ImGuiExt::BeginSubWindow("hex.builtin.welcome.header.customize"_lang, ImVec2(ImGui::GetContentRegionAvail().x - windowPadding, 0), ImGuiChildFlags_AutoResizeX); - { - if (ImGuiExt::DescriptionButton("hex.builtin.welcome.customize.settings.title"_lang, "hex.builtin.welcome.customize.settings.desc"_lang, ImVec2(ImGui::GetContentRegionAvail().x, 0))) - RequestOpenWindow::post("Settings"); - } - ImGuiExt::EndSubWindow(); - ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetTextLineHeightWithSpacing() * 5); - ImGui::TableNextColumn(); - - ImGuiExt::BeginSubWindow("hex.builtin.welcome.header.learn"_lang, ImVec2(ImGui::GetContentRegionAvail().x - windowPadding, 0), ImGuiChildFlags_AutoResizeX); - { - const auto size = ImVec2(ImGui::GetContentRegionAvail().x, 0); - if (ImGuiExt::DescriptionButton("hex.builtin.welcome.learn.latest.title"_lang, "hex.builtin.welcome.learn.latest.desc"_lang, size)) - hex::openWebpage("hex.builtin.welcome.learn.latest.link"_lang); - if (ImGuiExt::DescriptionButton("hex.builtin.welcome.learn.imhex.title"_lang, "hex.builtin.welcome.learn.imhex.desc"_lang, size)) { - AchievementManager::unlockAchievement("hex.builtin.achievement.starting_out", "hex.builtin.achievement.starting_out.docs.name"); - hex::openWebpage("hex.builtin.welcome.learn.imhex.link"_lang); - } - if (ImGuiExt::DescriptionButton("hex.builtin.welcome.learn.pattern.title"_lang, "hex.builtin.welcome.learn.pattern.desc"_lang, size)) - hex::openWebpage("hex.builtin.welcome.learn.pattern.link"_lang); - if (ImGuiExt::DescriptionButton("hex.builtin.welcome.learn.plugins.title"_lang, "hex.builtin.welcome.learn.plugins.desc"_lang, size)) - hex::openWebpage("hex.builtin.welcome.learn.plugins.link"_lang); - - if (auto [unlocked, total] = AchievementManager::getProgress(); unlocked != total) { - if (ImGuiExt::DescriptionButtonProgress("hex.builtin.welcome.learn.achievements.title"_lang, "hex.builtin.welcome.learn.achievements.desc"_lang, float(unlocked) / float(total), size)) { - RequestOpenWindow::post("Achievements"); - } - } - } - ImGuiExt::EndSubWindow(); - - auto extraWelcomeScreenEntries = ContentRegistry::Interface::impl::getWelcomeScreenEntries(); - if (!extraWelcomeScreenEntries.empty()) { - ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetTextLineHeightWithSpacing() * 5); - ImGui::TableNextColumn(); - - ImGuiExt::BeginSubWindow("hex.builtin.welcome.header.various"_lang, ImVec2(ImGui::GetContentRegionAvail().x - windowPadding, 0)); - { - for (const auto &callback : extraWelcomeScreenEntries) - callback(); - } - ImGuiExt::EndSubWindow(); - } - - if (s_infoBannerTexture.isValid()) { - static bool hovered = false; - - ImGui::PushStyleColor(ImGuiCol_Border, ImGui::GetStyleColorVec4(hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Border)); - ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); - ImGuiExt::BeginSubWindow("hex.builtin.welcome.header.info"_lang, ImVec2(), ImGuiChildFlags_AutoResizeX); - { - const auto height = 80_scaled; - ImGui::Image(s_infoBannerTexture, ImVec2(height * s_infoBannerTexture.getAspectRatio(), height)); - hovered = ImGui::IsItemHovered(); - - if (ImGui::IsItemClicked()) { - hex::openWebpage(ImHexApiURL + hex::format("/info/{}/link", hex::toLower(ImHexApi::System::getOSName()))); - } - } - ImGuiExt::EndSubWindow(); - ImGui::PopStyleVar(); - ImGui::PopStyleColor(); - - } - ImGui::EndTable(); }