[Scummvm-git-logs] scummvm master -> 78561ca94de80f00c6a65c77944ea8e3acd6e7cb

criezy criezy at scummvm.org
Thu Apr 6 22:57:11 CEST 2017


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
91125bcbcd GUI: Add method to know if a widget contains a given widget
78561ca94d GUI: Fix access to deleted widget after rebuilding a dialog


Commit: 91125bcbcd3cf9c0de9818f341a55f0e7f7b595c
    https://github.com/scummvm/scummvm/commit/91125bcbcd3cf9c0de9818f341a55f0e7f7b595c
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2017-04-06T21:55:28+01:00

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

Changed paths:
    gui/widget.cpp
    gui/widget.h
    gui/widgets/list.cpp
    gui/widgets/list.h
    gui/widgets/scrollcontainer.cpp
    gui/widgets/scrollcontainer.h
    gui/widgets/tab.cpp
    gui/widgets/tab.h


diff --git a/gui/widget.cpp b/gui/widget.cpp
index 850fad0..4b84e19 100644
--- a/gui/widget.cpp
+++ b/gui/widget.cpp
@@ -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);
 }
diff --git a/gui/widget.h b/gui/widget.h
index e9343f2..0da071e 100644
--- a/gui/widget.h
+++ b/gui/widget.h
@@ -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:
diff --git a/gui/widgets/list.cpp b/gui/widgets/list.cpp
index f6e5c67..48d181e 100644
--- a/gui/widgets/list.cpp
+++ b/gui/widgets/list.cpp
@@ -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;
diff --git a/gui/widgets/list.h b/gui/widgets/list.h
index 1abb2b8..44366be 100644
--- a/gui/widgets/list.h
+++ b/gui/widgets/list.h
@@ -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);
diff --git a/gui/widgets/scrollcontainer.cpp b/gui/widgets/scrollcontainer.cpp
index 9a77927..7c5ab61 100644
--- a/gui/widgets/scrollcontainer.cpp
+++ b/gui/widgets/scrollcontainer.cpp
@@ -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;
diff --git a/gui/widgets/scrollcontainer.h b/gui/widgets/scrollcontainer.h
index c2d4737..9366a0b 100644
--- a/gui/widgets/scrollcontainer.h
+++ b/gui/widgets/scrollcontainer.h
@@ -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.
diff --git a/gui/widgets/tab.cpp b/gui/widgets/tab.cpp
index 9bf9527..e2e3e72 100644
--- a/gui/widgets/tab.cpp
+++ b/gui/widgets/tab.cpp
@@ -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) {
diff --git a/gui/widgets/tab.h b/gui/widgets/tab.h
index a1a5e06..fe5e4d8 100644
--- a/gui/widgets/tab.h
+++ b/gui/widgets/tab.h
@@ -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();


Commit: 78561ca94de80f00c6a65c77944ea8e3acd6e7cb
    https://github.com/scummvm/scummvm/commit/78561ca94de80f00c6a65c77944ea8e3acd6e7cb
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2017-04-06T21:55:28+01:00

Commit Message:
GUI: Fix access to deleted widget after rebuilding a dialog

The issue was with the focus or mouse widget as it may not be a
direct child of the dialog (it may for example be a child of the tab
widget in the options dialog) and removing a widget was not
resetting the mouse of focus widget if that widget was not a
direct child.

Changed paths:
    gui/dialog.cpp


diff --git a/gui/dialog.cpp b/gui/dialog.cpp
index 523227a..d0e5755 100644
--- a/gui/dialog.cpp
+++ b/gui/dialog.cpp
@@ -361,11 +361,11 @@ Widget *Dialog::findWidget(const char *name) {
 }
 
 void Dialog::removeWidget(Widget *del) {
-	if (del == _mouseWidget)
+	if (del == _mouseWidget || del->containsWidget(_mouseWidget))
 		_mouseWidget = NULL;
-	if (del == _focusedWidget)
+	if (del == _focusedWidget || del->containsWidget(_focusedWidget))
 		_focusedWidget = NULL;
-	if (del == _dragWidget)
+	if (del == _dragWidget || del->containsWidget(_dragWidget))
 		_dragWidget = NULL;
 
 	GuiObject::removeWidget(del);





More information about the Scummvm-git-logs mailing list