summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThorbjørn Lindeijer <bjorn@lindeijer.nl>2024-03-12 13:24:42 +0100
committerThorbjørn Lindeijer <bjorn@lindeijer.nl>2024-04-08 21:02:34 +0200
commitc8aa91aca12d5f6386c20da1526de390ff523ce7 (patch)
treee0b6b4f24573e5b3f8b9e528e411dae6a3d38a5c
parent14dc8218eeebd1583e6bd3c49013b3e501f47228 (diff)
downloadmana-c8aa91aca12d5f6386c20da1526de390ff523ce7.tar.gz
mana-c8aa91aca12d5f6386c20da1526de390ff523ce7.tar.bz2
mana-c8aa91aca12d5f6386c20da1526de390ff523ce7.tar.xz
mana-c8aa91aca12d5f6386c20da1526de390ff523ce7.zip
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.
-rw-r--r--src/gui/debugwindow.cpp9
-rw-r--r--src/gui/gui.cpp2
-rw-r--r--src/gui/gui.h2
-rw-r--r--src/gui/viewport.cpp2
-rw-r--r--src/gui/viewport.h4
-rw-r--r--src/gui/widgets/windowcontainer.cpp77
-rw-r--r--src/gui/widgets/windowcontainer.h12
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 <guichan/focushandler.hpp>
+
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<Window*>(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
@@ -40,6 +40,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.
*/
@@ -53,6 +58,13 @@ class WindowContainer : public Container
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.
*/
std::list<gcn::Widget *> mDeathList;