From c752fba1c456f30c4c1306a3a0d522686e2f82fe Mon Sep 17 00:00:00 2001 From: WerWolv Date: Wed, 6 Jul 2022 10:21:02 +0200 Subject: [PATCH] ui: Added backdrop image when no views are open --- .../source/ui/imgui_imhex_extensions.cpp | 4 +- .../builtin/source/content/welcome_screen.cpp | 71 ++++++++++++------ resources/romfs/backdrop_dark.png | Bin 0 -> 6152 bytes resources/romfs/backdrop_light.png | Bin 0 -> 6044 bytes 4 files changed, 50 insertions(+), 25 deletions(-) create mode 100644 resources/romfs/backdrop_dark.png create mode 100644 resources/romfs/backdrop_light.png diff --git a/lib/libimhex/source/ui/imgui_imhex_extensions.cpp b/lib/libimhex/source/ui/imgui_imhex_extensions.cpp index d74f9808a..72e0fb4b7 100644 --- a/lib/libimhex/source/ui/imgui_imhex_extensions.cpp +++ b/lib/libimhex/source/ui/imgui_imhex_extensions.cpp @@ -334,8 +334,8 @@ namespace ImGui { glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); #if defined(GL_UNPACK_ROW_LENGTH) glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); diff --git a/plugins/builtin/source/content/welcome_screen.cpp b/plugins/builtin/source/content/welcome_screen.cpp index 47bb38f58..022bcf469 100644 --- a/plugins/builtin/source/content/welcome_screen.cpp +++ b/plugins/builtin/source/content/welcome_screen.cpp @@ -25,15 +25,14 @@ namespace hex::plugin::builtin { - static ImGui::Texture s_bannerTexture; - static std::string s_bannerTextureName; + static ImGui::Texture s_bannerTexture, s_backdropTexture; static std::list s_recentFilePaths; static std::fs::path s_safetyBackupPath; static std::string s_tipOfTheDay; - static void initDefaultLayout() { + [[maybe_unused]] static void loadDefaultLayout() { auto layouts = ContentRegistry::Interface::getLayouts(); if (!layouts.empty()) { @@ -50,6 +49,14 @@ namespace hex::plugin::builtin { } } + static bool isAnyViewOpen() { + const auto &views = ContentRegistry::Views::getEntries(); + return std::any_of(views.begin(), views.end(), + [](const std::pair &entry) { + return entry.second->getWindowOpenState(); + }); + } + static void drawPopups() { ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(), ImGuiCond_Appearing, ImVec2(0.5F, 0.5F)); ImGui::SetNextWindowSize(ImGui::GetMainViewport()->Size / 3, ImGuiCond_Appearing); @@ -280,8 +287,32 @@ namespace hex::plugin::builtin { drawPopups(); } + static void drawNoViewsBackground() { + if (isAnyViewOpen() && ImHexApi::Provider::isValid()) return; + + if (ImGui::Begin("ImHexDockSpace")) { + static char title[256]; + ImFormatString(title, IM_ARRAYSIZE(title), "%s/DockSpace_%08X", ImGui::GetCurrentWindow()->Name, ImGui::GetID("ImHexMainDock")); + if (ImGui::Begin(title)) { + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(10_scaled, 10_scaled)); + if (ImGui::BeginChild("NoViewsBackground", ImVec2(0, 0), false, ImGuiWindowFlags_AlwaysUseWindowPadding | ImGuiWindowFlags_NoScrollWithMouse)) { + auto imageSize = scaled(ImVec2(350, 350)); + auto pos = (ImGui::GetContentRegionAvail() - imageSize) / 2; + + ImGui::SetCursorPos(pos); + ImGui::Image(s_backdropTexture, imageSize); + } + ImGui::EndChild(); + ImGui::PopStyleVar(); + } + ImGui::End(); + } + ImGui::End(); + } + void createWelcomeScreen() { (void)EventManager::subscribe(drawWelcomeScreen); + (void)EventManager::subscribe(drawNoViewsBackground); (void)EventManager::subscribe([]() { { @@ -317,17 +348,14 @@ namespace hex::plugin::builtin { }); (void)EventManager::subscribe([](u32 theme) { - auto changeBannerTexture = [&](const char newTexture[]) { - if (s_bannerTextureName == newTexture) { - return; - } + auto changeTexture = [&](const std::string &path, const ImGui::Texture &texture) { + auto textureData = romfs::get(path); + auto oldTexture = texture; + auto newTexture = ImGui::LoadImageFromMemory(reinterpret_cast(textureData.data()), textureData.size()); - s_bannerTextureName = newTexture; - auto banner = romfs::get(newTexture); - auto oldBannerTexture = s_bannerTexture; - s_bannerTexture = ImGui::LoadImageFromMemory(reinterpret_cast(banner.data()), banner.size()); + if (oldTexture.valid()) { ImGui::UnloadImage(oldTexture); } - if (oldBannerTexture.valid()) { ImGui::UnloadImage(oldBannerTexture); } + return newTexture; }; switch (theme) { @@ -337,7 +365,8 @@ namespace hex::plugin::builtin { ImGui::StyleColorsDark(); ImGui::StyleCustomColorsDark(); ImPlot::StyleColorsDark(); - changeBannerTexture("banner_dark.png"); + s_bannerTexture = changeTexture("banner_dark.png", s_bannerTexture); + s_backdropTexture = changeTexture("backdrop_dark.png", s_backdropTexture); break; } @@ -346,7 +375,8 @@ namespace hex::plugin::builtin { ImGui::StyleColorsLight(); ImGui::StyleCustomColorsLight(); ImPlot::StyleColorsLight(); - changeBannerTexture("banner_light.png"); + s_bannerTexture = changeTexture("banner_light.png", s_bannerTexture); + s_backdropTexture = changeTexture("backdrop_light.png", s_backdropTexture); break; } @@ -355,7 +385,8 @@ namespace hex::plugin::builtin { ImGui::StyleColorsClassic(); ImGui::StyleCustomColorsClassic(); ImPlot::StyleColorsClassic(); - changeBannerTexture("banner_dark.png"); + s_bannerTexture = changeTexture("banner_dark.png", s_bannerTexture); + s_backdropTexture = changeTexture("backdrop_dark.png", s_backdropTexture); break; } @@ -403,14 +434,8 @@ namespace hex::plugin::builtin { }); EventManager::subscribe([](auto) { - const auto &views = ContentRegistry::Views::getEntries(); - bool anyViewOpen = std::any_of(views.begin(), views.end(), - [](const std::pair &entry) { - return entry.second->getWindowOpenState(); - }); - - if (!anyViewOpen) - initDefaultLayout(); + //if (!isAnyViewOpen()) + //loadDefaultLayout(); }); ContentRegistry::Interface::addMenuItem("hex.builtin.menu.file", 1075, [&] { diff --git a/resources/romfs/backdrop_dark.png b/resources/romfs/backdrop_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1018845f757de9c18c1b2a94b4acf0f56bd42863 GIT binary patch literal 6152 zcmeAS@N?(olHy`uVBq!ia0y~yU;#2&7&zE~RK2WrGXn!-OQy4PfTy#wLP1e}T4qiv z1B1rI+KILvhaF^&#s_=5uHq{bC_E7`SEr-P%1g96Vc{0hs8WNSU$|$PsA%f-HDw<> z*nf0YbNA+TeCwJNelR|I@np#hCDniWnp-+PKG-4u{+;c+dyGzt4~1;bmI*LD?Qt|Y z$!xn8TfCqPLv2TbThg+59{OnyEcd;8`1p0~l=RB^zl*%9$urOdF1(#WVYA|KPJB3bUJ@dHy^i+aZXCm=Oc+p8*dyeV&6Pzp^(3zyGZEb z8pYR}4pnw*^GFd)(%abDzDZ z-prU(gCd;;T%wa6v;S|te|J{vNltT35oRX+ZGR1!SjrpI?rz)PpS!z~>Bsy=?X_>$ zn>F0@zw|m+w}|CSKC}4sT;F@ldgToV)nkoR+&^6w;bML8w`ZRwJI@^^+w8pjwY78X z7$je1{baMSU~%i7viIG`ckj;K`)7Ok)qD2MrbP#LW%{iJMhjb#x4R3&e-K=-cll(X z2xoyuWHB%XuY)k7lg8`{pdfpRr>`sfGj>)!Qx1J+NuWA0R! z>|{|~+RG)i;nx8t0o&fa%P%->_|9<8;Z06(#Lb8!%s#JK-{>6o`;)1ZHhJdV=az@2 zC#FBUdvyxX@KG>KLLh3(&uKwkncpAX(V3Q?!Xi53-jo@4W-&9IJ!xs}U811WrO9w3 zn}tEzhQVTnr8vWld;x}>PYe$Np2aXE?0>kOS9!xp=7w5chF|`+g&s@|OFyO^yUB1M zE?7Sv7(jZP7!(*DBmj$)25@k3FfbhW@Z%OQxR7CR0E>aj8)T*cSdt0Z2%EO#=ZhrEgo+!nNln_vk9yU6f32l%(y{m(gB!+AymWB zo?Zrq1?M;f1dqA^lW)R;cEHHu5u>a=y(ryn;l612BZu#H-SW1 z7?eR2)FnT<=fuY&XRuq}>#{)gKQ!rG*mv>{50Hyumehm!ph!~yietteDQOn07P~Ph zqF1tw%$b39q5Io`A!2{W%T7(86pDHvACjtQ;TW_oK{6N&Cn2CoFDywgoRqMDsHKtN z3Jf4H2n;7ByMWb_;&M_9Cn+ovK(+6na0$>IL#+w}hg$>4;Y7Mz0j!p|2qGoQ2TOVy zj781`@nq$OU#>2OtPBhf>}$YHWa44~99s?GC?hU1z#51wi#QktwC985RO0-G6b?vw z2{K7BoP<~zj0ufkSb!BYFn|CeST?Mf^ZA5`14ytT-$famJVE`khN#NL-CLDF;$Y8S z5Wn{(sTZN|ORM>w2x(A|Jy_Ik+Q^Xbk%^(f*!UU~Sm;r^X#-HoVhiI}J8v8Rw)FJ( zFD|{mH+Q2TP}H=&p+iH>u;;$j^Be)$ps;HPn0XrP>&X$k zpb;O2vp*!ISR1$HFVdQ&MBb@04CrNTmS$7 literal 0 HcmV?d00001 diff --git a/resources/romfs/backdrop_light.png b/resources/romfs/backdrop_light.png new file mode 100644 index 0000000000000000000000000000000000000000..2167cdd1bc38d40976a37efd956d601745248ba5 GIT binary patch literal 6044 zcmeAS@N?(olHy`uVBq!ia0y~yU;#2&7&zE~RK2WrGXn!-OQy4PfTy#wLP1e}T4qiv z1B1rI+KILvhaF^&#s_=5uHq{bC_E7`SEr-P%1g96Vc{0hs8WNSU$|$PsA%f-HDw<> z*nf0YbNA+TeCwJNelR|I@np#hCDniWnp-+PKG-4u{+;c+dyGzt4~1;bmI*LD?Qt|Y z$!xn8TfCqPLv2TbThg+59{OnyEcd;8`1p0~l=RB^zl*%9$urOdF1(#WVYA|KPJB3bUJ@dHy^i+aZXCm=Oc+p8*dyeV&6Pzp^(3zyGZEb z8pYR}4pnw*^GFd)(%abDzDZ z-prU(gCd;;T%wa6v;S|te|J{vNltT35oRX+ZGR1!SjrpI?rz)PpS!z~>Bsy=?X_>$ zn>F0@zw|m+w}|CSKC}4sT;F@ldgToV)nkoR+&^6w;bML8w`ZRwJI@^^+w8pjwY78X z7$je1{baMSU~%i7viIG`ckj;K`)7Ok)qD2MrbP#LW%{iJMhjb#x4R3&e-K=-cll(X z2xoyuWHB%XuY)k7lg8`{pdfpRr>`sfGj=u(VVz^k)><(zh|ctMaSW-r_4f9~jZFpu zZGiTa^4}+FsuN$XloMkVM1Zp1zgD?ad4z6`8n4@x5gu!C=s!jSg zxEbb{GBNN~FzBR#*yccXC4){XnC-knve8+NVNN!Kfqm-HNh}QUAJdNIF+5mfsU8pX zn%*V`1%?DeCI$uvut$OUKEZEa88ZVTh${dV!^(63OM!|Bpw0)1p2n;|7L*GTL}#KK zmB8;gOOpenvH?UefSC$lCeSeqKv#hP9wrBa8vzvxAbBJs8o+#XJF$x@fYsu$9!UXl zCL-B`q?aI*6vK&gE|QfrG91aPL^4TmIX)9l2ZgRiBq{^7{LSDb>;g&2KS4!BNtw3u|7{l{PS=R7gZ_286_HMwKY4-O0<05lOP``}`tX8`ObLPS{@ zltE@fT~ZMa^c9e+01`t=&q&M$uoQ98slXrsGMG5U5Q9mIo&$W7OoD+HH~=xOz#%D& z4M5hD7JNVr4nT~{dZZX5$t6UYNPELc2@9}V2av;Ql1_ofI)Ka`V8cm>MOY34y4eBb zaKbJp!Eho?98DsifX5zKq$F;na3shiAr?oI2zp?lR!E@8Lsx+wZP+6hyC}L|e1;Q@ zXLJR$GMrEVV0Z%EVc5e0B1(ec_>94BC5;RxC7{7-NpU$ThGX|N9#L8uPC`JB7CBf0 z>j9UUa)Y5t<}wBbhA)q}f#l$52#z*MK~doVA|UN2QnJvn$@~rJp<8D$fjd$koJ@qk zp#e(95>w50RfHi5oV15$_2vn}6L>>p#o_LBXOQxkFCTmq7%D0l84jH5NoNEpDfoEU z_<%dxJ;zCDTnrJn7~Y(>aCQSH{R6E6^{=@N{`iIXFzDnnlx5D5R=(K-vhU|14UQcj zHuKld==&4En6Q!=7%754)BiCtFggI;F})rbR{~572ad{vY#jxIF$B_z*tIR|wmved P11AknS3j3^P6