99 lines
3.3 KiB
C++
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;
|
|
}
|
|
}
|