From 1cfbd4bb5a92ac0ee94b7186e46b6e21778e3266 Mon Sep 17 00:00:00 2001 From: skyjake Date: Sat, 17 Aug 2013 13:57:00 +0300 Subject: [PATCH] UI|Client|PopupWidget: Added method for setting anchor and opening direction Sets the anchor to the appropriate side of a rule rectangle. --- .../client/include/ui/widgets/popupwidget.h | 2 ++ doomsday/client/src/ui/widgets/menuwidget.cpp | 22 +++---------------- .../client/src/ui/widgets/popupwidget.cpp | 16 ++++++++++++++ 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/doomsday/client/include/ui/widgets/popupwidget.h b/doomsday/client/include/ui/widgets/popupwidget.h index fe27743338..bf8f573f14 100644 --- a/doomsday/client/include/ui/widgets/popupwidget.h +++ b/doomsday/client/include/ui/widgets/popupwidget.h @@ -48,6 +48,8 @@ class PopupWidget : public GuiWidget GuiWidget &content() const; + void setAnchorAndOpeningDirection(de::RuleRectangle const &rule, ui::Direction dir); + void setAnchor(de::Vector2i const &pos); void setAnchorX(int xPos); void setAnchorY(int yPos); diff --git a/doomsday/client/src/ui/widgets/menuwidget.cpp b/doomsday/client/src/ui/widgets/menuwidget.cpp index cf28c5282d..95a2581bc7 100644 --- a/doomsday/client/src/ui/widgets/menuwidget.cpp +++ b/doomsday/client/src/ui/widgets/menuwidget.cpp @@ -37,9 +37,9 @@ public ContextWidgetOrganizer::IWidgetFactory /** * Action owned by the button that represents a SubmenuItem. */ - struct SubmenuAction : public de::Action, - DENG2_OBSERVES(Widget, Deletion) + class SubmenuAction : public de::Action, DENG2_OBSERVES(Widget, Deletion) { + public: SubmenuAction(Instance *inst, ui::SubmenuItem const &parentItem) : d(inst), _submenu(parentItem) { @@ -75,23 +75,7 @@ public ContextWidgetOrganizer::IWidgetFactory GuiWidget *parent = d->organizer.itemWidget(_submenu); DENG2_ASSERT(parent != 0); - // Update the anchor of the submenu. - ui::Direction const dir = _submenu.openingDirection(); - if(dir == ui::Left || dir == ui::Right) - { - _widget->setAnchorY(parent->hitRule().top() + parent->hitRule().height() / 2); - - _widget->setAnchorX(dir == ui::Left? parent->hitRule().left() : - parent->hitRule().right()); - } - else if(dir == ui::Up || dir == ui::Down) - { - _widget->setAnchorX(parent->hitRule().left() + parent->hitRule().width() / 2); - - _widget->setAnchorY(dir == ui::Up? parent->hitRule().top() : - parent->hitRule().bottom()); - } - _widget->setOpeningDirection(dir); + _widget->setAnchorAndOpeningDirection(parent->hitRule(), _submenu.openingDirection()); d->openPopups.insert(_widget); _widget->audienceForClose += d; diff --git a/doomsday/client/src/ui/widgets/popupwidget.cpp b/doomsday/client/src/ui/widgets/popupwidget.cpp index 11db70aab5..8f618a5d3e 100644 --- a/doomsday/client/src/ui/widgets/popupwidget.cpp +++ b/doomsday/client/src/ui/widgets/popupwidget.cpp @@ -239,6 +239,22 @@ GuiWidget &PopupWidget::content() const return *d->content; } +void PopupWidget::setAnchorAndOpeningDirection(RuleRectangle const &rule, ui::Direction dir) +{ + if(dir == ui::Left || dir == ui::Right) + { + setAnchorY(rule.top() + rule.height() / 2); + setAnchorX(dir == ui::Left? rule.left() : rule.right()); + } + else if(dir == ui::Up || dir == ui::Down) + { + setAnchorX(rule.left() + rule.width() / 2); + setAnchorY(dir == ui::Up? rule.top() : rule.bottom()); + } + + setOpeningDirection(dir); +} + void PopupWidget::setAnchor(Vector2i const &pos) { setAnchor(Const(pos.x), Const(pos.y));