Files
shweets-sim/src/state/select/characters.cpp
T
2026-07-04 00:15:26 -04:00

99 lines
3.3 KiB
C++

#include "characters.hpp"
#include "../../util/imgui/style.hpp"
#include "../../util/imgui/widget.hpp"
using namespace game::util;
namespace game::state::select
{
bool Characters::update(Resources& resources, int& characterIndex)
{
auto isRefreshed = false;
auto& style = ImGui::GetStyle();
auto viewport = ImGui::GetMainViewport();
auto size =
ImVec2(viewport->Size.x / 2.0f - style.WindowPadding.x, viewport->Size.y - (style.WindowPadding.y * 2.0f));
auto pos = ImVec2(viewport->Size.x / 2.0f, style.WindowPadding.y);
ImGui::SetNextWindowSize(size);
ImGui::SetNextWindowPos(pos);
if (ImGui::Begin("##Main Menu", nullptr,
ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse |
ImGuiWindowFlags_NoTitleBar))
{
if (ImGui::BeginTabBar("##Main Menu Bar"))
{
if (WIDGET_FX(ImGui::BeginTabItem("Characters")))
{
if (ImGui::BeginPopupContextWindow("characters-context", ImGuiPopupFlags_MouseButtonRight))
{
if (ImGui::MenuItem("Refresh"))
{
resources.characters_refresh();
characterIndex = resources.characterPreviews.empty()
? -1
: std::clamp(characterIndex, 0, (int)resources.characterPreviews.size() - 1);
isRefreshed = true;
}
ImGui::EndPopup();
}
auto cursorPos = ImGui::GetCursorPos();
auto cursorStartX = ImGui::GetCursorPosX();
auto buttonSize = ImVec2(ImGui::GetContentRegionAvail().x / 4, ImGui::GetContentRegionAvail().x / 4);
for (int i = 0; i < (int)resources.characterPreviews.size(); i++)
{
auto* character = resources.characterPreviews[i].root();
if (!character) continue;
ImGui::PushID(i);
ImGui::SetCursorPos(cursorPos);
imgui::style::color_set(character->color);
auto isSelected = i == characterIndex;
if (isSelected) ImGui::PushStyleColor(ImGuiCol_FrameBg, ImGui::GetStyleColorVec4(ImGuiCol_FrameBgHovered));
if (character->portrait.is_valid())
{
if (WIDGET_FX(ImGui::ImageButton(character->name.c_str(), character->portrait.texture.id, buttonSize)))
characterIndex = i;
}
else if (WIDGET_FX(ImGui::Button(character->name.c_str(), buttonSize)))
characterIndex = i;
if (isSelected) ImGui::PopStyleColor();
ImGui::SetItemTooltip("%s", character->name.c_str());
auto increment = ImGui::GetItemRectSize().x + ImGui::GetStyle().ItemSpacing.x;
cursorPos.x += increment;
if (cursorPos.x + increment > ImGui::GetContentRegionAvail().x)
{
cursorPos.x = cursorStartX;
cursorPos.y += increment;
}
ImGui::PopID();
imgui::style::color_set(resources.settings.root()->color);
}
ImGui::EndTabItem();
}
if (WIDGET_FX(ImGui::BeginTabItem("Settings")))
{
settingsMenu.update(resources);
ImGui::EndTabItem();
}
ImGui::EndTabBar();
}
ImGui::End();
}
return isRefreshed;
}
}