GUI: Add method to know if a widget contains a given widget

This commit is contained in:
Thierry Crozat 2017-04-06 21:50:16 +01:00
parent 47d339509f
commit 91125bcbcd
8 changed files with 41 additions and 0 deletions

View File

@ -175,6 +175,15 @@ Widget *Widget::findWidgetInChain(Widget *w, const char *name) {
return 0;
}
bool Widget::containsWidgetInChain(Widget *w, Widget *search) {
while (w) {
if (w == search || w->containsWidget(search))
return true;
w = w->_next;
}
return false;
}
void Widget::setEnabled(bool e) {
if ((_flags & WIDGET_ENABLED) != e) {
if (e)
@ -837,6 +846,10 @@ ContainerWidget::~ContainerWidget() {
}
}
bool ContainerWidget::containsWidget(Widget *w) const {
return containsWidgetInChain(_firstWidget, w);
}
Widget *ContainerWidget::findWidget(int x, int y) {
return findWidgetInChain(_firstWidget, x, y);
}

View File

@ -107,6 +107,7 @@ private:
public:
static Widget *findWidgetInChain(Widget *start, int x, int y);
static Widget *findWidgetInChain(Widget *start, const char *name);
static bool containsWidgetInChain(Widget *start, Widget *search);
public:
Widget(GuiObject *boss, int x, int y, int w, int h, const char *tooltip = 0);
@ -158,6 +159,8 @@ public:
const Common::String &getTooltip() const { return _tooltip; }
void setTooltip(const Common::String &tooltip) { _tooltip = tooltip; }
virtual bool containsWidget(Widget *) const { return false; }
protected:
void updateState(int oldFlags, int newFlags);
@ -388,6 +391,7 @@ public:
ContainerWidget(GuiObject *boss, const Common::String &name);
~ContainerWidget();
virtual bool containsWidget(Widget *) const;
virtual Widget *findWidget(int x, int y);
virtual void removeWidget(Widget *widget);
protected:

View File

@ -101,6 +101,12 @@ ListWidget::~ListWidget() {
delete[] _textWidth;
}
bool ListWidget::containsWidget(Widget *w) const {
if (w == _scrollBar || _scrollBar->containsWidget(w))
return true;
return false;
}
Widget *ListWidget::findWidget(int x, int y) {
if (x >= _w - _scrollBarWidth)
return _scrollBar;

View File

@ -89,6 +89,7 @@ public:
ListWidget(Dialog *boss, int x, int y, int w, int h, const char *tooltip = 0, uint32 cmd = 0);
virtual ~ListWidget();
virtual bool containsWidget(Widget *) const;
virtual Widget *findWidget(int x, int y);
void setList(const StringArray &list, const ColorList *colors = 0);

View File

@ -144,6 +144,12 @@ void ScrollContainerWidget::drawWidget() {
g_gui.theme()->drawDialogBackgroundClip(Common::Rect(_x, _y, _x + _w, _y + getHeight() - 1), getBossClipRect(), ThemeEngine::kDialogBackgroundDefault);
}
bool ScrollContainerWidget::containsWidget(Widget *w) const {
if (w == _verticalScroll || _verticalScroll->containsWidget(w))
return true;
return containsWidgetInChain(_firstWidget, w);
}
Widget *ScrollContainerWidget::findWidget(int x, int y) {
if (_verticalScroll->isVisible() && x >= _w - _verticalScroll->getWidth())
return _verticalScroll;

View File

@ -46,6 +46,8 @@ public:
virtual void handleCommand(CommandSender *sender, uint32 cmd, uint32 data);
virtual void reflowLayout();
virtual bool containsWidget(Widget *) const;
protected:
// We overload getChildY to make sure child widgets are positioned correctly.
// Essentially this compensates for the space taken up by the tab title header.

View File

@ -334,6 +334,13 @@ void TabWidget::draw() {
}
}
bool TabWidget::containsWidget(Widget *w) const {
if (w == _navLeft || w == _navRight || _navLeft->containsWidget(w) || _navRight->containsWidget(w))
return true;
return containsWidgetInChain(_firstWidget, w);
}
Widget *TabWidget::findWidget(int x, int y) {
if (y < _tabHeight) {
if (_navButtonsVisible) {

View File

@ -107,6 +107,8 @@ public:
virtual int getFirstVisible() const;
virtual void setFirstVisible(int tabID, bool adjustIfRoom = false);
virtual bool containsWidget(Widget *) const;
virtual void reflowLayout();
virtual void draw();