impr: Refactor init logic
This commit is contained in:
parent
a315ecb831
commit
7ad7ea061c
@ -74,7 +74,7 @@ namespace hex::init {
|
||||
ImGuiExt::Texture splashBackgroundTexture;
|
||||
ImGuiExt::Texture splashTextTexture;
|
||||
std::future<bool> tasksSucceeded;
|
||||
std::array<Highlight, 3> highlights;
|
||||
std::array<Highlight, 4> highlights;
|
||||
float progressLerp = 0.0F;
|
||||
};
|
||||
|
||||
|
71
main/gui/romfs/splash_colors.json
Normal file
71
main/gui/romfs/splash_colors.json
Normal file
@ -0,0 +1,71 @@
|
||||
[
|
||||
{
|
||||
"name": "Default Colors",
|
||||
"colors": [
|
||||
"random",
|
||||
"random",
|
||||
"random"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Christmas",
|
||||
"colors": [
|
||||
"#d3011a",
|
||||
"#00843b"
|
||||
],
|
||||
"time": {
|
||||
"start": [ 12, 24 ],
|
||||
"end": [ 12, 26 ]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Pride",
|
||||
"colors": [
|
||||
"#5dcefa",
|
||||
"#f6a6b9",
|
||||
"#fdfdfd"
|
||||
],
|
||||
"time": {
|
||||
"start": [ 6, 1 ],
|
||||
"end": [ 6, 1 ]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Pride",
|
||||
"colors": [
|
||||
"#e40001",
|
||||
"#fe8a00",
|
||||
"#fdec00",
|
||||
"#007d22",
|
||||
"#004bfe",
|
||||
"#740585"
|
||||
],
|
||||
"time": {
|
||||
"start": [ 6, 1 ],
|
||||
"end": [ 6, 1 ]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Pride",
|
||||
"colors": [
|
||||
"#fb0073",
|
||||
"#b24b98",
|
||||
"#0134ab"
|
||||
],
|
||||
"time": {
|
||||
"start": [ 6, 1 ],
|
||||
"end": [ 6, 1 ]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "UA",
|
||||
"colors": [
|
||||
"#005bbc",
|
||||
"#ffd600"
|
||||
],
|
||||
"time": {
|
||||
"start": [ 2, 20 ],
|
||||
"end": [ 2, 20 ]
|
||||
}
|
||||
}
|
||||
]
|
@ -7,6 +7,7 @@
|
||||
#include <hex/helpers/utils.hpp>
|
||||
#include <hex/helpers/fmt.hpp>
|
||||
#include <hex/helpers/logger.hpp>
|
||||
#include <fmt/chrono.h>
|
||||
|
||||
#include <romfs/romfs.hpp>
|
||||
|
||||
@ -24,7 +25,8 @@
|
||||
#include <future>
|
||||
#include <numeric>
|
||||
#include <random>
|
||||
|
||||
#include <ranges>
|
||||
#include <nlohmann/json.hpp>
|
||||
|
||||
using namespace std::literals::chrono_literals;
|
||||
|
||||
@ -78,6 +80,65 @@ namespace hex::init {
|
||||
glfwSetWindowPos(window, monitorX + (mode->width - windowWidth) / 2, monitorY + (mode->height - windowHeight) / 2);
|
||||
}
|
||||
|
||||
static ImColor getHighlightColor(u32 index) {
|
||||
static auto highlightConfig = nlohmann::json::parse(romfs::get("splash_colors.json").string());
|
||||
static std::list<nlohmann::json> selectedConfigs;
|
||||
|
||||
if (selectedConfigs.empty()) {
|
||||
const auto now = []{
|
||||
const auto now = std::chrono::system_clock::now();
|
||||
const auto time = std::chrono::system_clock::to_time_t(now);
|
||||
|
||||
return fmt::localtime(time);
|
||||
}();
|
||||
|
||||
for (const auto &colorConfig : highlightConfig) {
|
||||
if (!colorConfig.contains("time"))
|
||||
selectedConfigs.push_back(colorConfig);
|
||||
else {
|
||||
const auto &time = colorConfig["time"];
|
||||
const auto &start = time["start"];
|
||||
const auto &end = time["end"];
|
||||
|
||||
if ((now.tm_mon + 1) >= start[0] && (now.tm_mon + 1) <= end[0]) {
|
||||
if (now.tm_mday >= start[1] && now.tm_mday <= end[1]) {
|
||||
selectedConfigs.push_back(colorConfig);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Remove the default color theme if there's another one available
|
||||
if (selectedConfigs.size() != 1)
|
||||
selectedConfigs.erase(selectedConfigs.begin());
|
||||
}
|
||||
|
||||
std::mt19937 random(std::random_device{}());
|
||||
|
||||
static const auto &selectedConfig = *std::next(selectedConfigs.begin(), random() % selectedConfigs.size());
|
||||
|
||||
const auto colorString = selectedConfig["colors"][index % selectedConfig["colors"].size()].get<std::string>();
|
||||
|
||||
log::debug("Using '{}' highlight color theme", selectedConfig["name"].get<std::string>());
|
||||
if (colorString == "random") {
|
||||
float r, g, b;
|
||||
ImGui::ColorConvertHSVtoRGB(
|
||||
float(random() % 360) / 100.0F,
|
||||
float(25 + random() % 70) / 100.0F,
|
||||
float(85 + random() % 10) / 100.0F,
|
||||
r, g, b);
|
||||
|
||||
return { r, g, b, 0x50 / 255.0F };
|
||||
} else if (colorString.starts_with("#")) {
|
||||
u32 color = std::strtoul(colorString.substr(1).c_str(), nullptr, 16);
|
||||
|
||||
return ImColor((color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF, 0x50);
|
||||
} else {
|
||||
log::error("Invalid color string '{}'", colorString);
|
||||
return { 0xFF, 0x00, 0xFF, 0xFF };
|
||||
}
|
||||
}
|
||||
|
||||
void WindowSplash::createTask(const Task& task) {
|
||||
auto runTask = [&, task] {
|
||||
try {
|
||||
@ -453,28 +514,18 @@ namespace hex::init {
|
||||
std::exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
std::mt19937 rng(std::random_device{}());
|
||||
|
||||
u32 lastPos = 0;
|
||||
u32 lastCount = 0;
|
||||
for (auto &highlight : this->highlights) {
|
||||
u32 newPos = lastPos + lastCount + (rng() % 40);
|
||||
for (const auto &[index, highlight] : this->highlights | std::views::enumerate) {
|
||||
u32 newPos = lastPos + lastCount + (rng() % 35);
|
||||
u32 newCount = (rng() % 7) + 3;
|
||||
highlight.start.x = float(newPos % 13);
|
||||
highlight.start.y = float(newPos / 13);
|
||||
highlight.count = newCount;
|
||||
|
||||
{
|
||||
float r, g, b;
|
||||
ImGui::ColorConvertHSVtoRGB(
|
||||
(rng() % 360) / 100.0F,
|
||||
(25 + rng() % 70) / 100.0F,
|
||||
(85 + rng() % 10) / 100.0F,
|
||||
r, g, b);
|
||||
highlight.color = ImColor(r, g, b, 0x50 / 255.0F);
|
||||
}
|
||||
highlight.color = getHighlightColor(index);
|
||||
|
||||
lastPos = newPos;
|
||||
lastCount = newCount;
|
||||
|
@ -14,8 +14,64 @@
|
||||
#include <romfs/romfs.hpp>
|
||||
#include <wolv/utils/string.hpp>
|
||||
|
||||
#include <complex>
|
||||
|
||||
namespace hex::plugin::builtin {
|
||||
|
||||
class PopupEE : public Popup<PopupEE> {
|
||||
public:
|
||||
PopupEE() : Popup("Se" /* Not going to */ "cr" /* make it that easy */ "et") {
|
||||
|
||||
}
|
||||
|
||||
void drawContent() override {
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
ImVec2 size = scaled({ 320, 180 });
|
||||
ImGui::InvisibleButton("canvas", size);
|
||||
ImVec2 p0 = ImGui::GetItemRectMin();
|
||||
ImVec2 p1 = ImGui::GetItemRectMax();
|
||||
|
||||
ImDrawList* drawList = ImGui::GetWindowDrawList();
|
||||
drawList->PushClipRect(p0, p1);
|
||||
|
||||
ImVec4 mouseData;
|
||||
mouseData.x = (io.MousePos.x - p0.x) / size.x;
|
||||
mouseData.y = (io.MousePos.y - p0.y) / size.y;
|
||||
mouseData.z = io.MouseDownDuration[0];
|
||||
mouseData.w = io.MouseDownDuration[1];
|
||||
|
||||
fx(drawList, p0, p1, size, mouseData, float(ImGui::GetTime()));
|
||||
}
|
||||
|
||||
void fx(ImDrawList* drawList, ImVec2 startPos, ImVec2 endPos, ImVec2, ImVec4, float t) {
|
||||
const float CircleRadius = 5_scaled;
|
||||
const float Gap = 1_scaled;
|
||||
|
||||
constexpr static auto func = [](u32 x, u32 y, float t) {
|
||||
return std::sin(t - std::sqrt(std::pow((x - 14), 2) + std::pow((y - 8), 2)));
|
||||
};
|
||||
|
||||
float x = startPos.x + CircleRadius + Gap;
|
||||
u32 ix = 0;
|
||||
while (x < endPos.x) {
|
||||
float y = startPos.y + CircleRadius + Gap;
|
||||
u32 iy = 0;
|
||||
while (y < endPos.y) {
|
||||
const float result = func(ix, iy, t);
|
||||
const float radius = CircleRadius * std::abs(result);
|
||||
const auto color = result < 0 ? ImColor(0xFF, 0, 0, 0xFF) : ImColor(0xFF, 0xFF, 0xFF, 0xFF);
|
||||
drawList->AddCircleFilled(ImVec2(x, y), radius, color);
|
||||
|
||||
y += CircleRadius * 2 + Gap;
|
||||
iy += 1;
|
||||
}
|
||||
|
||||
x += CircleRadius * 2 + Gap;
|
||||
ix += 1;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
ViewAbout::ViewAbout() : View::Modal("hex.builtin.view.help.about.name") {
|
||||
// Add "About" menu item to the help menu
|
||||
ContentRegistry::Interface::addMenuItem({ "hex.builtin.menu.help", "hex.builtin.view.help.about.name" }, 1000, Shortcut::None, [this] {
|
||||
@ -36,8 +92,7 @@ namespace hex::plugin::builtin {
|
||||
}
|
||||
|
||||
|
||||
void ViewAbout::drawAboutMainPage()
|
||||
{
|
||||
void ViewAbout::drawAboutMainPage() {
|
||||
// Draw main about table
|
||||
if (ImGui::BeginTable("about_table", 2, ImGuiTableFlags_SizingFixedFit)) {
|
||||
ImGui::TableNextRow();
|
||||
@ -48,9 +103,16 @@ namespace hex::plugin::builtin {
|
||||
this->m_logoTexture = ImGuiExt::Texture(romfs::get("assets/common/logo.png").span(), ImGuiExt::Texture::Filter::Linear);
|
||||
|
||||
ImGui::Image(this->m_logoTexture, scaled({ 100, 100 }));
|
||||
if (ImGui::IsItemHovered() && ImGui::IsItemClicked()) {
|
||||
if (ImGui::IsItemClicked()) {
|
||||
this->m_clickCount += 1;
|
||||
}
|
||||
|
||||
if (this->m_clickCount >= (2 * 3 + 4)) {
|
||||
this->getWindowOpenState() = false;
|
||||
PopupEE::open();
|
||||
this->m_clickCount = 0;
|
||||
}
|
||||
|
||||
ImGui::TableNextColumn();
|
||||
|
||||
ImGuiExt::BeginSubWindow("Build Information", ImVec2(0, 0), ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY);
|
||||
|
Loading…
Reference in New Issue
Block a user