diff options
Diffstat (limited to 'src/gui/widgets')
-rw-r--r-- | src/gui/widgets/windowcontainer.cpp | 77 | ||||
-rw-r--r-- | src/gui/widgets/windowcontainer.h | 12 |
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; |