reddog: window improvements, added "welcome" message

This commit is contained in:
Hyper 2025-01-13 00:43:14 +00:00
parent 72a0a17e3a
commit 4ab26a1696
9 changed files with 179 additions and 62 deletions

View file

@ -167,6 +167,7 @@ set(SWA_UI_CXX_SOURCES
"ui/reddog/windows/counter_window.cpp"
"ui/reddog/windows/exports_window.cpp"
"ui/reddog/windows/view_window.cpp"
"ui/reddog/windows/welcome_window.cpp"
"ui/reddog/windows/window_list.cpp"
"ui/reddog/reddog_controls.cpp"
"ui/reddog/reddog_manager.cpp"

View file

@ -231,85 +231,121 @@ void Reddog::Window::DrawFrame()
drawList->AddText({ cmnIconMax.x + 5, windowPos.y + 4 }, colTitleText, Name);
ImVec2 closeButtonMin = { windowPos.x + windowSize.x - cmnSize - 4, windowPos.y + 3 };
float controlsWidth = 0;
float controlsMargin = 4;
ImVec2 closeButtonMin = { windowPos.x + windowSize.x - cmnSize - controlsMargin, windowPos.y + 3 };
ImVec2 closeButtonMax = { closeButtonMin.x + cmnSize, closeButtonMin.y + cmnSize };
ImGui::SetCursorScreenPos(closeButtonMin);
ImGui::InvisibleButton("##CloseButton", { cmnSize, cmnSize });
bool isCloseButtonActive = ImGui::IsItemActive();
if (isCloseButtonActive)
if (IsCloseVisible)
{
drawList->AddImage(g_upButtonClose2.get(), closeButtonMin, closeButtonMax);
m_isCloseButtonPressed = true;
}
else
{
drawList->AddImage(g_upButtonClose1.get(), closeButtonMin, closeButtonMax);
controlsWidth += closeButtonMax.x - closeButtonMin.x + controlsMargin;
if (m_isCloseButtonPressed && m_pIsVisible)
ImGui::SetCursorScreenPos(closeButtonMin);
ImGui::InvisibleButton("##CloseButton", { cmnSize, cmnSize });
bool isCloseButtonActive = ImGui::IsItemActive();
if (isCloseButtonActive)
{
*m_pIsVisible = !*m_pIsVisible;
m_isCloseButtonPressed = false;
drawList->AddImage(g_upButtonClose2.get(), closeButtonMin, closeButtonMax);
m_isCloseButtonPressed = true;
}
else
{
drawList->AddImage(g_upButtonClose1.get(), closeButtonMin, closeButtonMax);
if (m_isCloseButtonPressed && m_pIsVisible)
{
*m_pIsVisible = !*m_pIsVisible;
m_isCloseButtonPressed = false;
}
}
}
ImVec2 minimumButtonMin = { closeButtonMin.x - cmnSize - 4, windowPos.y + 3 };
ImVec2 minimumButtonMin = { closeButtonMin.x - cmnSize - controlsMargin, windowPos.y + 3 };
ImVec2 minimumButtonMax = { minimumButtonMin.x + cmnSize, minimumButtonMin.y + cmnSize };
ImGui::SetCursorScreenPos(minimumButtonMin);
ImGui::InvisibleButton("##MinimumButton", { cmnSize, cmnSize });
bool isMinimumButtonActive = ImGui::IsItemActive();
if (isMinimumButtonActive)
if (IsMinimumVisible)
{
drawList->AddImage(g_upButtonMinimum2.get(), minimumButtonMin, minimumButtonMax);
m_isMinimumButtonPressed = true;
}
else
{
drawList->AddImage(g_upButtonMinimum1.get(), minimumButtonMin, minimumButtonMax);
controlsWidth += minimumButtonMax.x - minimumButtonMin.x + controlsMargin;
if (m_isMinimumButtonPressed)
ImGui::SetCursorScreenPos(minimumButtonMin);
ImGui::InvisibleButton("##MinimumButton", { cmnSize, cmnSize });
bool isMinimumButtonActive = ImGui::IsItemActive();
if (isMinimumButtonActive)
{
IsMinimum = !IsMinimum;
drawList->AddImage(g_upButtonMinimum2.get(), minimumButtonMin, minimumButtonMax);
m_isMinimumButtonPressed = true;
}
else
{
drawList->AddImage(g_upButtonMinimum1.get(), minimumButtonMin, minimumButtonMax);
if (IsMinimum)
if (m_isMinimumButtonPressed)
{
m_preMinimumWindowSize = windowSize;
ImGui::SetWindowSize(ImWindow, { windowSize.x, MIN_WINDOW_SIZE });
SetMinimum(!IsMinimum);
m_isMinimumButtonPressed = false;
}
else
{
ImGui::SetWindowSize(ImWindow, { windowSize.x, m_preMinimumWindowSize.y });
}
m_isMinimumButtonPressed = false;
}
}
ImVec2 pinButtonMin = { minimumButtonMin.x - cmnSize - 4, windowPos.y + 3 };
ImVec2 pinButtonMin = { minimumButtonMin.x - cmnSize - controlsMargin, windowPos.y + 3 };
ImVec2 pinButtonMax = { pinButtonMin.x + cmnSize, pinButtonMin.y + cmnSize };
ImGui::SetCursorScreenPos(pinButtonMin);
ImGui::InvisibleButton("##PinButton", { cmnSize, cmnSize });
bool isPinButtonActive = ImGui::IsItemActive();
if (isPinButtonActive)
if (IsPinVisible)
{
drawList->AddImage(g_upButtonPin2.get(), pinButtonMin, pinButtonMax);
m_isPinButtonPressed = true;
}
else
{
drawList->AddImage(g_upButtonPin1.get(), pinButtonMin, pinButtonMax);
controlsWidth += pinButtonMax.x - pinButtonMin.x + controlsMargin;
if (m_isPinButtonPressed)
ImGui::SetCursorScreenPos(pinButtonMin);
ImGui::InvisibleButton("##PinButton", { cmnSize, cmnSize });
bool isPinButtonActive = ImGui::IsItemActive();
if (isPinButtonActive)
{
IsPinned = !IsPinned;
m_isPinButtonPressed = false;
drawList->AddImage(g_upButtonPin2.get(), pinButtonMin, pinButtonMax);
m_isPinButtonPressed = true;
}
else
{
drawList->AddImage(g_upButtonPin1.get(), pinButtonMin, pinButtonMax);
if (m_isPinButtonPressed)
{
IsPinned = !IsPinned;
m_isPinButtonPressed = false;
}
}
}
ImVec2 titleBarMin = { windowPos.x, windowPos.y };
ImVec2 titleBarMax = { windowPos.x + windowSize.x - controlsWidth, windowPos.y + titleBarHeight };
if (ImGui::IsMouseHoveringRect(titleBarMin, titleBarMax, false))
{
if (IsMinimumVisible && ImGui::IsMouseDoubleClicked(0))
SetMinimum(!IsMinimum);
}
}
}
void Reddog::Window::SetMinimum(bool isMinimum)
{
IsMinimum = isMinimum;
if (!ImWindow)
return;
auto windowSize = ImWindow->Size;
if (IsMinimum)
{
m_preMinimumWindowSize = windowSize;
ImGui::SetWindowSize(ImWindow, { windowSize.x, MIN_WINDOW_SIZE });
}
else
{
ImGui::SetWindowSize(ImWindow, { windowSize.x, m_preMinimumWindowSize.y });
}
}
@ -338,13 +374,32 @@ bool Reddog::Window::Begin(bool* pIsVisible)
if ((Flags & eWindowFlags_NoResize) != 0)
flags |= ImGuiWindowFlags_NoResize;
if (m_preBegin)
m_preBegin();
bool result = ImGui::Begin(Name, m_pIsVisible, flags);
if (m_postBegin)
m_postBegin();
if (result && *m_pIsVisible)
{
ImWindow = ImGui::GetCurrentWindow();
IsFocused = ImGui::IsWindowFocused();
if ((Flags & eWindowFlags_Centre) != 0 && !m_isSetCentre)
{
auto viewport = ImGui::GetMainViewport();
auto windowPos = ImGui::GetWindowPos();
auto pos = ImVec2((viewport->Size.x / 2) - (ImWindow->Size.x / 2), (viewport->Size.y / 2) - (ImWindow->Size.y / 2));
ImGui::SetWindowPos(pos);
}
// Keep centring window until it has been moved.
if (ImGui::IsMouseDragging(0) && ImGui::IsWindowHovered())
m_isSetCentre = true;
if (m_isSetVisible)
{
ImGui::SetWindowFocus();
@ -361,6 +416,13 @@ bool Reddog::Window::Begin(bool* pIsVisible)
void Reddog::Window::End()
{
if (m_preEnd)
m_preEnd();
ImGui::End();
if (m_postEnd)
m_postEnd();
EndStyle();
}

View file

@ -6,10 +6,11 @@ namespace Reddog
{
enum EWindowFlags : uint32_t
{
eWindowFlags_None = 0,
eWindowFlags_NoTitleBar = 1 << 0,
eWindowFlags_NoResize = 1 << 1,
eWindowFlags_NoListEntry = 1 << 2
eWindowFlags_None = 0,
eWindowFlags_NoTitleBar = 1 << 0,
eWindowFlags_NoResize = 1 << 1,
eWindowFlags_NoListEntry = 1 << 2,
eWindowFlags_Centre = 1 << 3
};
class IWindow
@ -27,7 +28,9 @@ namespace Reddog
private:
bool* m_pIsVisible{ nullptr };
bool m_isSetCentre{};
bool m_isSetVisible{};
bool m_isCloseButtonPressed{};
bool m_isMinimumButtonPressed{};
bool m_isPinButtonPressed{};
@ -46,10 +49,18 @@ namespace Reddog
float m_maxWidth{ FLT_MAX };
float m_maxHeight{ FLT_MAX };
std::function<void()> m_preBegin{ nullptr };
std::function<void()> m_postBegin{ nullptr };
std::function<void()> m_preEnd{ nullptr };
std::function<void()> m_postEnd{ nullptr };
public:
const char* Name{ "(null)" };
EWindowFlags Flags{ eWindowFlags_None };
bool IsFocused{ true };
bool IsCloseVisible{ true };
bool IsMinimumVisible{ true };
bool IsPinVisible{ true };
bool IsMinimum{};
bool IsPinned{ true };
bool IsVisible{};
@ -78,6 +89,7 @@ namespace Reddog
End();
}
void SetMinimum(bool isMinimum);
void SetVisible(bool isVisible = true);
bool Begin(bool* pIsVisible = nullptr);
void End();

View file

@ -2,7 +2,7 @@
#include <ui/reddog/reddog_controls.h>
#include <user/config.h>
static ExportsWindow g_window{ "Exports" };
static ExportsWindow g_window;
void ExportsWindow::Draw()
{

View file

@ -5,7 +5,11 @@
class ExportsWindow : public Reddog::Window
{
public:
using Reddog::Window::Window;
ExportsWindow() : Window()
{
Name = "Exports";
Flags = Reddog::eWindowFlags_NoResize;
}
void Draw() override;
};

View file

@ -2,12 +2,12 @@
#include <api/SWA.h>
#include <gpu/video.h>
#include <kernel/memory.h>
#include <ui/reddog/reddog_controls.h>
#include <ui/reddog/debug_draw.h>
#include <ui/reddog/reddog_controls.h>
#include <ui/game_window.h>
#include <user/config.h>
static ViewWindow g_window{ "View" };
static ViewWindow g_window;
void ViewWindow::Draw()
{
@ -46,6 +46,7 @@ void ViewWindow::Draw()
Reddog::Checkbox("Render Event Collision", SWA::SGlobals::ms_IsTriggerRender);
Reddog::Checkbox("Render Object Collision", SWA::SGlobals::ms_IsObjectCollisionRender);
Reddog::Checkbox("Render Stage Collision", SWA::SGlobals::ms_IsCollisionRender);
ImGui::TextColored({ 1, 0, 0, 1 }, "* Requires stage restart.");
Reddog::Separator();

View file

@ -5,7 +5,11 @@
class ViewWindow : public Reddog::Window
{
public:
using Reddog::Window::Window;
ViewWindow() : Window()
{
Name = "View";
Flags = Reddog::eWindowFlags_NoResize;
}
void Draw() override;
};

View file

@ -0,0 +1,13 @@
#include "welcome_window.h"
static WelcomeWindow g_window;
void WelcomeWindow::Draw()
{
if (Begin())
{
ImGui::TextColored({ 1, 0, 0, 1 }, "!!! ATTENTION !!!");
ImGui::Text("For development use only.\nAny changes made here may cause unexpected behaviour.\nUse at your own risk!");
}
End();
}

View file

@ -0,0 +1,20 @@
#pragma once
#include <ui/game_window.h>
#include <ui/reddog/reddog_window.h>
class WelcomeWindow : public Reddog::Window
{
public:
WelcomeWindow() : Window()
{
Name = "Welcome";
Flags = (Reddog::EWindowFlags)(Reddog::eWindowFlags_NoResize | Reddog::eWindowFlags_NoListEntry | Reddog::eWindowFlags_Centre);
IsMinimumVisible = false;
IsPinVisible = false;
IsPinned = false;
IsVisible = true;
}
void Draw() override;
};