From c8aa91aca12d5f6386c20da1526de390ff523ce7 Mon Sep 17 00:00:00 2001 From: Thorbjørn Lindeijer Date: Tue, 12 Mar 2024 13:24:42 +0100 Subject: Added UI debug drawing Shows outlines of visible widgets as well as highlighting modal focus, modal mouse focus and regular focus. Can currently only be toggled in the Debug window, so needs source code modification to be used during login sequence for now. --- src/gui/debugwindow.cpp | 9 ++++- src/gui/gui.cpp | 2 + src/gui/gui.h | 2 + src/gui/viewport.cpp | 2 +- src/gui/viewport.h | 4 +- src/gui/widgets/windowcontainer.cpp | 77 +++++++++++++++++++++++++++++++++++++ src/gui/widgets/windowcontainer.h | 12 ++++++ 7 files changed, 104 insertions(+), 4 deletions(-) diff --git a/src/gui/debugwindow.cpp b/src/gui/debugwindow.cpp index 047e4170..3c514191 100644 --- a/src/gui/debugwindow.cpp +++ b/src/gui/debugwindow.cpp @@ -25,6 +25,7 @@ #include "game.h" #include "particle.h" #include "map.h" +#include "gui.h" #include "gui/setup.h" #include "gui/viewport.h" @@ -138,6 +139,7 @@ public: mBeingPath = new CheckBox(_("Being path")); mMousePath = new CheckBox(_("Mouse path")); mBeingIds = new CheckBox(_("Being Ids")); + mGuiDebug = new CheckBox(_("GUI debug")); auto *specialsLabel = new Label(_("Specials:")); mSpecialNormal = new RadioButton(_("Normal"), "mapdebug"); @@ -156,6 +158,7 @@ public: place(0, 5, mBeingPath, 1); place(0, 6, mMousePath, 1); place(0, 7, mBeingIds, 1); + place(0, 8, mGuiDebug, 1); place(1, 0, specialsLabel, 1); place(1, 1, mSpecialNormal, 1); place(1, 2, mSpecial1, 1); @@ -173,6 +176,7 @@ public: mBeingPath->addActionListener(this); mMousePath->addActionListener(this); mBeingIds->addActionListener(this); + mGuiDebug->addActionListener(this); mSpecialNormal->addActionListener(this); mSpecial1->addActionListener(this); mSpecial2->addActionListener(this); @@ -204,7 +208,9 @@ public: if (mSpecial3->isSelected()) flags |= Map::DEBUG_SPECIAL3; - viewport->setShowDebugPath(flags); + viewport->setDebugFlags(flags); + + Gui::debugDraw = mGuiDebug->isSelected(); } private: @@ -215,6 +221,7 @@ private: CheckBox *mBeingPath; CheckBox *mMousePath; CheckBox *mBeingIds; + CheckBox *mGuiDebug; RadioButton *mSpecialNormal; RadioButton *mSpecial1; RadioButton *mSpecial2; diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index dd637170..93037db2 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -53,6 +53,8 @@ gcn::Font *boldFont = nullptr; // Mono font gcn::Font *monoFont = nullptr; +bool Gui::debugDraw; + Gui::Gui(Graphics *graphics) : mCustomCursorScale(graphics->getScale()) { diff --git a/src/gui/gui.h b/src/gui/gui.h index 62a0b3aa..1cba3fbc 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -116,6 +116,8 @@ class Gui final : public gcn::Gui, public EventListener */ void setCursorType(Cursor cursor); + static bool debugDraw; + protected: void handleMouseMoved(const gcn::MouseInput &mouseInput) override; void handleTextInput(const TextInput &textInput); diff --git a/src/gui/viewport.cpp b/src/gui/viewport.cpp index 10c4bc1a..f02d2973 100644 --- a/src/gui/viewport.cpp +++ b/src/gui/viewport.cpp @@ -607,7 +607,7 @@ void Viewport::updateCursorType() } } -void Viewport::setShowDebugPath(int debugFlags) +void Viewport::setDebugFlags(int debugFlags) { mDebugFlags = debugFlags; if (mMap) diff --git a/src/gui/viewport.h b/src/gui/viewport.h index 6ea74b5e..32d9bd5c 100644 --- a/src/gui/viewport.h +++ b/src/gui/viewport.h @@ -77,9 +77,9 @@ class Viewport : public WindowContainer, public gcn::MouseListener, void logic() override; /** - * Sets whether the path debug graphics are shown + * Sets which debug flags (see Map::DebugFlags) should be enabled. */ - void setShowDebugPath(int debugFlags); + void setDebugFlags(int debugFlags); /** * Handles mouse press on map. diff --git a/src/gui/widgets/windowcontainer.cpp b/src/gui/widgets/windowcontainer.cpp index 8cee550b..36f0998f 100644 --- a/src/gui/widgets/windowcontainer.cpp +++ b/src/gui/widgets/windowcontainer.cpp @@ -21,10 +21,13 @@ #include "gui/widgets/windowcontainer.h" +#include "gui/gui.h" #include "gui/widgets/window.h" #include "utils/dtor.h" +#include + WindowContainer *windowContainer = nullptr; void WindowContainer::logic() @@ -35,6 +38,14 @@ void WindowContainer::logic() gcn::Container::logic(); } +void WindowContainer::draw(gcn::Graphics *graphics) +{ + gcn::Container::draw(graphics); + + if (Gui::debugDraw) + debugDraw(graphics); +} + void WindowContainer::scheduleDelete(gcn::Widget *widget) { mDeathList.push_back(widget); @@ -47,3 +58,69 @@ void WindowContainer::adjustAfterResize(int oldScreenWidth, if (auto *window = dynamic_cast(widget)) window->adjustPositionAfterResize(oldScreenWidth, oldScreenHeight); } + +void WindowContainer::debugDraw(gcn::Graphics *graphics) +{ + auto focusHandler = _getFocusHandler(); + auto focused = focusHandler->getFocused(); + auto modalFocused = focusHandler->getModalFocused(); + auto modalMouseFocused = focusHandler->getModalMouseInputFocused(); + + for (auto widget : gcn::Widget::mWidgets) + { + if (!widgetIsVisible(widget)) + continue; + + int x; + int y; + widget->getAbsolutePosition(x, y); + + if (widget == modalMouseFocused) + { + graphics->setColor(gcn::Color(0, 255, 0, 128)); + graphics->fillRectangle(gcn::Rectangle(x, y, + widget->getWidth(), + widget->getHeight())); + } + + if (widget == modalFocused) + { + graphics->setColor(gcn::Color(255, 0, 0, 128)); + graphics->fillRectangle(gcn::Rectangle(x, y, + widget->getWidth(), + widget->getHeight())); + } + + if (widget == focused) + { + graphics->setColor(gcn::Color(255, 0, 0, 32)); + graphics->fillRectangle(gcn::Rectangle(x, y, + widget->getWidth(), + widget->getHeight())); + } + + graphics->setColor(gcn::Color(255, 0, 0)); + graphics->drawRectangle(gcn::Rectangle(x, y, + widget->getWidth(), + widget->getHeight())); + } +} + +/** + * Returns whether the widget is visible and part of the hierarchy. + */ +bool WindowContainer::widgetIsVisible(gcn::Widget *widget) +{ + if (!widget->isVisible()) + return false; + + while (widget) + { + if (widget == this) + return true; + + widget = widget->getParent(); + } + + return false; +} diff --git a/src/gui/widgets/windowcontainer.h b/src/gui/widgets/windowcontainer.h index 646e5d00..861839c9 100644 --- a/src/gui/widgets/windowcontainer.h +++ b/src/gui/widgets/windowcontainer.h @@ -39,6 +39,11 @@ class WindowContainer : public Container */ void logic() override; + /** + * Adds debug drawing. + */ + void draw(gcn::Graphics *graphics) override; + /** * Schedule a widget for deletion. It will be deleted at the start of * the next logic update. @@ -52,6 +57,13 @@ class WindowContainer : public Container void adjustAfterResize(int oldScreenWidth, int oldScreenHeight); private: + /** + * Draws the outlines of the container and all its children. + */ + void debugDraw(gcn::Graphics *graphics); + + bool widgetIsVisible(gcn::Widget *widget); + /** * List of widgets that are scheduled to be deleted. */ -- cgit v1.2.3-70-g09d2