aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gui/TabWidget.cpp19
-rw-r--r--gui/TabWidget.h2
-rw-r--r--gui/dialog.cpp4
-rw-r--r--gui/object.h8
-rw-r--r--gui/widget.cpp17
-rw-r--r--gui/widget.h5
6 files changed, 41 insertions, 14 deletions
diff --git a/gui/TabWidget.cpp b/gui/TabWidget.cpp
index 4b29bd2d7b..a55cc72638 100644
--- a/gui/TabWidget.cpp
+++ b/gui/TabWidget.cpp
@@ -42,16 +42,23 @@ TabWidget::TabWidget(GuiObject *boss, int x, int y, int w, int h)
// TODO: Dummy for now
addTab("Tab 1");
+ new ButtonWidget(this, 10, 20, kButtonWidth, 16, "Foo", 0, 0);
addTab("Tab 2");
+ new ButtonWidget(this, 20, 30, kButtonWidth, 16, "Bar", 0, 0);
addTab("Tab 3");
- setActiveTab(1);
+ new PushButtonWidget(this, 30, 10, kButtonWidth, 16, "Qux", 0, 0);
+}
+
+int16 TabWidget::getChildY() const {
+ return getAbsY() + kTabHeight;
}
int TabWidget::addTab(const String &title) {
// TODO
Tab newTab = { title, NULL };
_tabs.push_back(newTab);
- return _tabs.size() - 1;
+ setActiveTab(_tabs.size() - 1);
+ return _activeTab;
}
/*
@@ -63,9 +70,12 @@ void TabWidget::removeTab(int tabID) {
void TabWidget::setActiveTab(int tabID) {
assert(0 <= tabID && tabID < _tabs.size());
if (_activeTab != tabID) {
+ // Exchange the widget lists, and switch to the new tab
+ if (_activeTab != -1)
+ _tabs[_activeTab].firstWidget = _firstWidget;
_activeTab = tabID;
_firstWidget = _tabs[tabID].firstWidget;
- draw();
+ _boss->draw();
}
}
@@ -95,7 +105,6 @@ bool TabWidget::handleKeyDown(uint16 ascii, int keycode, int modifiers) {
return Widget::handleKeyDown(ascii, keycode, modifiers);
}
-
void TabWidget::drawWidget(bool hilite) {
// TODO
@@ -126,6 +135,6 @@ Widget *TabWidget::findWidget(int x, int y) {
return this;
} else {
// Iterate over all child widgets and find the one which was clicked
- return Widget::findWidgetInChain(_firstWidget, x, y);
+ return Widget::findWidgetInChain(_firstWidget, x, y - kTabHeight);
}
}
diff --git a/gui/TabWidget.h b/gui/TabWidget.h
index 76165e5b1b..1f71fe2063 100644
--- a/gui/TabWidget.h
+++ b/gui/TabWidget.h
@@ -40,6 +40,8 @@ protected:
public:
TabWidget(GuiObject *boss, int x, int y, int w, int h);
+ virtual int16 getChildY() const;
+
// use Dialog::releaseFocus() when changing to another tab
// Problem: how to add items to a tab?
diff --git a/gui/dialog.cpp b/gui/dialog.cpp
index ffa0b191e8..65c1e62c06 100644
--- a/gui/dialog.cpp
+++ b/gui/dialog.cpp
@@ -97,7 +97,6 @@ void Dialog::draw() {
}
void Dialog::drawDialog() {
- Widget *w = _firstWidget;
if (!isVisible())
return;
@@ -105,11 +104,14 @@ void Dialog::drawDialog() {
g_gui.blendRect(_x, _y, _w, _h, g_gui._bgcolor);
g_gui.box(_x, _y, _w, _h, g_gui._color, g_gui._shadowcolor);
+ // Draw all children
+ Widget *w = _firstWidget;
while (w) {
w->draw();
w = w->_next;
}
+ // Flag the draw area as dirty
g_gui.addDirtyRect(_x, _y, _w, _h);
}
diff --git a/gui/object.h b/gui/object.h
index 8393acf671..f842a708f8 100644
--- a/gui/object.h
+++ b/gui/object.h
@@ -60,13 +60,17 @@ protected:
public:
GuiObject(int x, int y, int w, int h) : _x(x), _y(y), _w(w), _h(h), _firstWidget(0) { }
- virtual bool isVisible() const = 0;
-
virtual int16 getAbsX() const { return _x; }
virtual int16 getAbsY() const { return _y; }
+ virtual int16 getChildX() const { return getAbsX(); }
+ virtual int16 getChildY() const { return getAbsY(); }
virtual uint16 getWidth() const { return _w; }
virtual uint16 getHeight() const { return _h; }
+ virtual bool isVisible() const = 0;
+
+ virtual void draw() = 0;
+
protected:
virtual void releaseFocus() = 0;
};
diff --git a/gui/widget.cpp b/gui/widget.cpp
index 2a337b9dd2..2e7a502b08 100644
--- a/gui/widget.cpp
+++ b/gui/widget.cpp
@@ -38,10 +38,12 @@ void Widget::draw() {
if (!isVisible() || !_boss->isVisible())
return;
+
+ int oldX = _x, oldY = _y;
// Account for our relative position in the dialog
- _x += _boss->getAbsX();
- _y += _boss->getAbsY();
+ _x = getAbsX();
+ _y = getAbsY();
// Clear background (unless alpha blending is enabled)
if (_flags & WIDGET_CLEARBG)
@@ -74,8 +76,15 @@ void Widget::draw() {
// Flag the draw area as dirty
gui->addDirtyRect(_x, _y, _w, _h);
- _x -= _boss->getAbsX();
- _y -= _boss->getAbsY();
+ _x = oldX;
+ _y = oldY;
+
+ // Draw all children
+ Widget *w = _firstWidget;
+ while (w) {
+ w->draw();
+ w = w->_next;
+ }
}
Widget *Widget::findWidgetInChain(Widget *w, int x, int y) {
diff --git a/gui/widget.h b/gui/widget.h
index 11722aacac..d6da1a5229 100644
--- a/gui/widget.h
+++ b/gui/widget.h
@@ -79,8 +79,8 @@ public:
Widget(GuiObject *boss, int x, int y, int w, int h);
virtual ~Widget() {}
- virtual int16 getAbsX() const { return _x + _boss->getAbsX(); }
- virtual int16 getAbsY() const { return _y + _boss->getAbsY(); }
+ virtual int16 getAbsX() const { return _x + _boss->getChildX(); }
+ virtual int16 getAbsY() const { return _y + _boss->getChildY(); }
virtual void handleMouseDown(int x, int y, int button, int clickCount) {}
virtual void handleMouseUp(int x, int y, int button, int clickCount) {}
@@ -91,6 +91,7 @@ public:
virtual bool handleKeyDown(uint16 ascii, int keycode, int modifiers) { return false; } // Return true if the event was handled
virtual bool handleKeyUp(uint16 ascii, int keycode, int modifiers) { return false; } // Return true if the event was handled
virtual void handleTickle() {}
+
void draw();
void receivedFocus() { _hasFocus = true; receivedFocusWidget(); }
void lostFocus() { _hasFocus = false; lostFocusWidget(); }