summaryrefslogtreecommitdiff
path: root/src/gui/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/widgets')
-rw-r--r--src/gui/widgets/windowcontainer.cpp77
-rw-r--r--src/gui/widgets/windowcontainer.h12
2 files changed, 89 insertions, 0 deletions
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;