aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gui/TabWidget.cpp131
-rw-r--r--gui/TabWidget.h66
-rw-r--r--gui/launcher.cpp7
-rw-r--r--gui/module.mk1
4 files changed, 205 insertions, 0 deletions
diff --git a/gui/TabWidget.cpp b/gui/TabWidget.cpp
new file mode 100644
index 0000000000..4b29bd2d7b
--- /dev/null
+++ b/gui/TabWidget.cpp
@@ -0,0 +1,131 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2002-2003 The ScummVM project
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Header$
+ */
+
+#include "stdafx.h"
+#include "common/util.h"
+#include "gui/TabWidget.h"
+#include "gui/dialog.h"
+#include "gui/newgui.h"
+
+enum {
+ kTabHeight = 14,
+
+ kTabLeftOffset = 4,
+ kTabSpacing = 2
+};
+
+TabWidget::TabWidget(GuiObject *boss, int x, int y, int w, int h)
+ : Widget(boss, x, y, w, h) {
+
+ _flags = WIDGET_ENABLED;
+ _type = kTabWidget;
+ _activeTab = -1;
+
+ _tabWidth = 50;
+
+ // TODO: Dummy for now
+ addTab("Tab 1");
+ addTab("Tab 2");
+ addTab("Tab 3");
+ setActiveTab(1);
+}
+
+int TabWidget::addTab(const String &title) {
+ // TODO
+ Tab newTab = { title, NULL };
+ _tabs.push_back(newTab);
+ return _tabs.size() - 1;
+}
+
+/*
+void TabWidget::removeTab(int tabID) {
+ // TODO
+}
+*/
+
+void TabWidget::setActiveTab(int tabID) {
+ assert(0 <= tabID && tabID < _tabs.size());
+ if (_activeTab != tabID) {
+ _activeTab = tabID;
+ _firstWidget = _tabs[tabID].firstWidget;
+ draw();
+ }
+}
+
+
+void TabWidget::handleMouseDown(int x, int y, int button, int clickCount) {
+ assert(y < kTabHeight);
+
+ // Determine which tab was clicked
+ int tabID = -1;
+ x -= kTabLeftOffset;
+ if (x >= 0 && x % (_tabWidth + kTabSpacing) < _tabWidth) {
+ tabID = x / (_tabWidth + kTabSpacing);
+ if (tabID >= _tabs.size())
+ tabID = -1;
+ }
+
+ // If a tab was clicked, switch to that pane
+ if (tabID >= 0) {
+ setActiveTab(tabID);
+ }
+}
+
+bool TabWidget::handleKeyDown(uint16 ascii, int keycode, int modifiers) {
+ // TODO: maybe there should be a way to switch between tabs
+ // using the keyboard? E.g. Alt-Shift-Left/Right-Arrow or something
+ // like that.
+ return Widget::handleKeyDown(ascii, keycode, modifiers);
+}
+
+
+void TabWidget::drawWidget(bool hilite) {
+ // TODO
+
+ NewGui *gui = &g_gui;
+
+ // Draw horizontal line
+ gui->hLine(_x+1, _y + kTabHeight - 2, _x + _w - 2, gui->_shadowcolor);
+
+ // Iterate over all tabs and draw them
+ int i, x = _x + kTabLeftOffset;
+ for (i = 0; i < _tabs.size(); ++i) {
+ NewGuiColor color = (i == _activeTab) ? gui->_color : gui->_shadowcolor;
+ gui->box(x, _y, _tabWidth, kTabHeight, color, color);
+ gui->drawString(_tabs[i].title, x, _y + 4, _tabWidth, gui->_textcolor, kTextAlignCenter);
+ x += _tabWidth + kTabSpacing;
+ }
+
+ // Draw more horizontal lines
+ gui->hLine(_x+1, _y + kTabHeight - 1, _x + _w - 2, gui->_color);
+ gui->hLine(_x+1, _y + _h - 2, _x + _w - 2, gui->_shadowcolor);
+ gui->hLine(_x+1, _y + _h - 1, _x + _w - 2, gui->_color);
+}
+
+
+Widget *TabWidget::findWidget(int x, int y) {
+ if (y < kTabHeight) {
+ // Click was in the tab area
+ return this;
+ } else {
+ // Iterate over all child widgets and find the one which was clicked
+ return Widget::findWidgetInChain(_firstWidget, x, y);
+ }
+}
diff --git a/gui/TabWidget.h b/gui/TabWidget.h
new file mode 100644
index 0000000000..76165e5b1b
--- /dev/null
+++ b/gui/TabWidget.h
@@ -0,0 +1,66 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2002-2003 The ScummVM project
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Header$
+ */
+
+#ifndef TABWIDGET_H
+#define TABWIDGET_H
+
+#include "widget.h"
+#include "common/str.h"
+#include "common/list.h"
+
+class TabWidget : public Widget {
+ typedef Common::String String;
+ struct Tab {
+ String title;
+ Widget *firstWidget;
+ };
+ typedef Common::List<Tab> TabList;
+protected:
+ int _activeTab;
+ TabList _tabs;
+ int _tabWidth;
+
+public:
+ TabWidget(GuiObject *boss, int x, int y, int w, int h);
+
+// use Dialog::releaseFocus() when changing to another tab
+
+// Problem: how to add items to a tab?
+// First off, widget should allow non-dialog bosses, (i.e. also other widgets)
+// Could add a common base class for Widgets and Dialogs.
+// Then you add tabs using the following method, which returns a unique ID
+ int addTab(const String &title);
+// Maybe we need to remove tabs again? Hm
+ //void removeTab(int tabID);
+// Setting the active tab:
+ void setActiveTab(int tabID);
+// setActiveTab changes the value of _firstWidget. This means Widgets added afterwards
+// will be added to the active tab.
+
+ virtual void handleMouseDown(int x, int y, int button, int clickCount);
+ virtual bool handleKeyDown(uint16 ascii, int keycode, int modifiers);
+
+protected:
+ virtual void drawWidget(bool hilite);
+
+ virtual Widget *findWidget(int x, int y);
+};
+
+#endif
diff --git a/gui/launcher.cpp b/gui/launcher.cpp
index ead4891d25..18b0e8a000 100644
--- a/gui/launcher.cpp
+++ b/gui/launcher.cpp
@@ -29,6 +29,7 @@
#include "gui/options.h"
#include "gui/EditTextWidget.h"
#include "gui/ListWidget.h"
+#include "gui/TabWidget.h"
#include "backends/fs/fs.h"
@@ -174,7 +175,13 @@ LauncherDialog::LauncherDialog(GameDetector &detector)
new ButtonWidget(this, x, _h - 24, width, 16, "Start", kStartCmd, 'S'); x += space + width;
// Add list with game titles
+#if 0
+ // HACK HACK HACK FIXME
+ new TabWidget(this, 0, 76, 320, 64);
+ _list = new ListWidget(this, 10, 28, 300, 46);
+#else
_list = new ListWidget(this, 10, 28, 300, 112);
+#endif
_list->setEditable(false);
_list->setNumberingMode(kListNumberingOff);
diff --git a/gui/module.mk b/gui/module.mk
index e04af24355..097deb8e93 100644
--- a/gui/module.mk
+++ b/gui/module.mk
@@ -14,6 +14,7 @@ MODULE_OBJS := \
gui/options.o \
gui/PopUpWidget.o \
gui/ScrollBarWidget.o \
+ gui/TabWidget.o \
gui/widget.o \
MODULE_DIRS += \