diff options
Diffstat (limited to 'src/gui/widgets/windowcontainer.cpp')
-rw-r--r-- | src/gui/widgets/windowcontainer.cpp | 77 |
1 files changed, 77 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; +} |