aboutsummaryrefslogtreecommitdiff
path: root/gui
diff options
context:
space:
mode:
authorMax Horn2002-07-05 16:56:53 +0000
committerMax Horn2002-07-05 16:56:53 +0000
commit84cafcc64a7ae6b62112c917c063f616dba0efe4 (patch)
tree7416be2ad50f5c00e8bf98e6f9794855ed330d91 /gui
parent7bfaa15f151ab4f4b4a5b9a09d109651e389db2a (diff)
downloadscummvm-rg350-84cafcc64a7ae6b62112c917c063f616dba0efe4.tar.gz
scummvm-rg350-84cafcc64a7ae6b62112c917c063f616dba0efe4.tar.bz2
scummvm-rg350-84cafcc64a7ae6b62112c917c063f616dba0efe4.zip
new experimental GUI code
svn-id: r4463
Diffstat (limited to 'gui')
-rw-r--r--gui/dialog.cpp145
-rw-r--r--gui/dialog.h83
-rw-r--r--gui/widget.cpp99
-rw-r--r--gui/widget.h89
4 files changed, 416 insertions, 0 deletions
diff --git a/gui/dialog.cpp b/gui/dialog.cpp
new file mode 100644
index 0000000000..2cdc1f4380
--- /dev/null
+++ b/gui/dialog.cpp
@@ -0,0 +1,145 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2002 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 "dialog.h"
+#include "widget.h"
+#include "newgui.h"
+
+void Dialog::draw()
+{
+ Widget *w = _firstWidget;
+
+ _gui->clearArea(_x, _y, _w, _h);
+ _gui->box(_x, _y, _w, _h);
+
+ while (w) {
+ w->draw();
+ w = w->_next;
+ }
+}
+
+void Dialog::handleClick(int x, int y, int button)
+{
+ Widget *w = findWidget(x - _x, y - _y);
+ if (w)
+ w->handleClick(button);
+}
+
+/*
+ * Determine the widget at location (x,y) if any. Assumes the coordinates are
+ * in the local coordinate system, i.e. relative to the top left of the dialog.
+ */
+Widget* Dialog::findWidget(int x, int y)
+{
+ Widget *w = _firstWidget;
+ while (w) {
+ // Stop as soon as we find a fidget that contains (x,y)
+ if (x >= w->_x && x <= w->_x + w->_w && y >= w->_y && y <= w->_y + w->_h)
+ break;
+ w = w->_next;
+ }
+ return w;
+}
+
+void Dialog::close()
+{
+ // FIXME - this code should be inside the Gui class, and should be
+ // extended to support nested dialogs.
+ _gui->restoreState();
+ _gui->_active = false;
+ _gui->_activeDialog = 0;
+}
+
+void Dialog::addResText(int x, int y, int w, int h, int resID)
+{
+ // Get the string
+ const char *str = _gui->queryString(resID);
+ if (!str)
+ str = "Dummy!";
+ new StaticTextWidget(this, x, y, w, h, str);
+}
+
+void Dialog::addButton(int x, int y, int w, int h, char hotkey, const char *label, uint32 cmd)
+{
+ new ButtonWidget(this, x, y, w, h, label, cmd);
+ // TODO - handle hotkey
+}
+
+void Dialog::addButton(int x, int y, int w, int h, char hotkey, int resID, uint32 cmd)
+{
+ // Get the string
+ const char *label = _gui->queryString(resID);
+ if (!label)
+ label = "Dummy!";
+ addButton(x, y, w, h, hotkey, label, cmd);
+}
+
+#pragma mark -
+
+enum {
+ kSaveCmd = 'SAVE',
+ kLoadCmd = 'LOAD',
+ kPlayCmd = 'PLAY',
+ kOptionsCmd = 'OPTN',
+ kQuitCmd = 'QUIT'
+};
+
+SaveLoadDialog::SaveLoadDialog(NewGui *gui)
+ : Dialog(gui, 30, 20, 260, 124)
+{
+ addResText(10, 7, 240, 16, 1);
+// addResText(10, 7, 240, 16, 2);
+// addResText(10, 7, 240, 16, 3);
+
+ addButton(200, 20, 54, 16, 'S', 4, kSaveCmd); // Save
+ addButton(200, 40, 54, 16, 'L', 5, kLoadCmd); // Load
+ addButton(200, 60, 54, 16, 'P', 6, kPlayCmd); // Play
+ addButton(200, 80, 54, 16, 'O', 17, kOptionsCmd); // Options
+ addButton(200, 100, 54, 16, 'Q', 8, kQuitCmd); // Quit
+}
+
+void SaveLoadDialog::handleCommand(uint32 cmd)
+{
+ switch(cmd) {
+ case kSaveCmd:
+ break;
+ case kLoadCmd:
+ break;
+ case kPlayCmd:
+ close();
+ break;
+ case kOptionsCmd:
+ break;
+ case kQuitCmd:
+ exit(1);
+ break;
+ }
+}
+
+
+#pragma mark -
+
+
+PauseDialog::PauseDialog(NewGui *gui)
+ : Dialog(gui, 50, 80, 220, 16)
+{
+ addResText(2, 2, 220, 16, 10);
+}
diff --git a/gui/dialog.h b/gui/dialog.h
new file mode 100644
index 0000000000..424af5cebb
--- /dev/null
+++ b/gui/dialog.h
@@ -0,0 +1,83 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2002 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 DIALOG_H
+#define DIALOG_H
+
+#include "scummsys.h"
+
+
+class Widget;
+class NewGui;
+
+class Dialog {
+ friend class Widget;
+ friend class StaticTextWidget;
+protected:
+ NewGui *_gui;
+ Widget *_firstWidget;
+ int16 _x, _y;
+ uint16 _w, _h;
+public:
+ Dialog(NewGui *gui, int x, int y, int w, int h)
+ : _gui(gui), _firstWidget(0), _x(x), _y(y), _w(w), _h(h)
+ {}
+
+ virtual void draw();
+
+ //virtual void handleIdle(); // Called periodically
+ virtual void handleClick(int x, int y, int button);
+ virtual void handleKey(char key, int modifiers) // modifiers = alt/shift/ctrl etc.
+ { if (key == 27) close(); }
+ virtual void handleCommand(uint32 cmd)
+ {}
+
+protected:
+ Widget* findWidget(int x, int y); // Find the widget at pos x,y if any
+ void close();
+
+ void addResText(int x, int y, int w, int h, int resID);
+ void addButton(int x, int y, int w, int h, char hotkey, const char *label, uint32 cmd);
+ void addButton(int x, int y, int w, int h, char hotkey, int resID, uint32 cmd);
+};
+
+class SaveLoadDialog : public Dialog {
+public:
+ SaveLoadDialog(NewGui *gui);
+
+ virtual void handleCommand(uint32 cmd);
+};
+
+class PauseDialog : public Dialog {
+public:
+ PauseDialog(NewGui *gui);
+
+ virtual void handleClick(int x, int y, int button)
+ { close(); }
+ virtual void handleKey(char key, int modifiers)
+ {
+ if (key == 32)
+ close();
+ else
+ Dialog::handleKey(key, modifiers);
+ }
+};
+
+#endif
diff --git a/gui/widget.cpp b/gui/widget.cpp
new file mode 100644
index 0000000000..6168eca278
--- /dev/null
+++ b/gui/widget.cpp
@@ -0,0 +1,99 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2002 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 "widget.h"
+#include "dialog.h"
+#include "newgui.h"
+
+
+Widget::Widget(Dialog *boss, int x, int y, int w, int h)
+ : _boss(boss), _x(x), _y(y), _w(w), _h(h), _id(0), _flags(0)
+{
+ // Insert into the widget list of the boss
+ _next = _boss->_firstWidget;
+ _boss->_firstWidget = this;
+}
+
+void Widget::draw()
+{
+ if (_flags & WIDGET_INVISIBLE)
+ return;
+
+ // Account for our relative position in the dialog
+ _x += _boss->_x;
+ _y += _boss->_y;
+
+ // Clear background
+ if (_flags & WIDGET_CLEARBG)
+ _boss->_gui->clearArea(_x, _y, _w, _h);
+
+ // Draw border
+ if (_flags & WIDGET_BORDER) {
+ _boss->_gui->box(_x, _y, _w, _h);
+ _x += 4;
+ _y += 4;
+ }
+
+ // Now perform the actual widget draw
+ drawWidget(false);
+
+ if (_flags & WIDGET_BORDER) {
+ _x -= 4;
+ _y -= 4;
+ }
+
+ // Restore x/y
+ _x -= _boss->_x;
+ _y -= _boss->_y;
+}
+
+
+#pragma mark -
+
+
+StaticTextWidget::StaticTextWidget(Dialog *boss, int x, int y, int w, int h, const char *text)
+ : Widget(boss, x, y, w, h)
+{
+ // FIXME - maybe we should make a real copy of the string?
+ _text = text;
+}
+
+void StaticTextWidget::drawWidget(bool hilite)
+{
+ NewGui *gui = _boss->_gui;
+ gui->drawString(_text, _x, _y, _w, hilite ? gui->_textcolorhi : gui->_textcolor);
+}
+
+
+#pragma mark -
+
+
+ButtonWidget::ButtonWidget(Dialog *boss, int x, int y, int w, int h, const char *label, uint32 cmd)
+ : StaticTextWidget(boss, x, y, w, h, label), _cmd(cmd), _hotkey(0)
+{
+ _flags = WIDGET_ENABLED | WIDGET_BORDER /* | WIDGET_CLEARBG */;
+}
+
+void ButtonWidget::handleClick(int button)
+{
+ if (_flags & WIDGET_ENABLED)
+ _boss->handleCommand(_cmd);
+}
diff --git a/gui/widget.h b/gui/widget.h
new file mode 100644
index 0000000000..30b0b6c431
--- /dev/null
+++ b/gui/widget.h
@@ -0,0 +1,89 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2002 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 WIDGET_H
+#define WIDGET_H
+
+#include "scummsys.h"
+
+
+class Dialog;
+
+enum {
+ WIDGET_ENABLED = 1 << 0,
+ WIDGET_INVISIBLE = 1 << 1,
+ WIDGET_BORDER = 1 << 2,
+ WIDGET_CLEARBG = 1 << 3,
+ WIDGET_WANT_TICKLE = 1 << 4,
+};
+
+/* Widget */
+class Widget {
+friend class Dialog;
+protected:
+ Dialog *_boss;
+ Widget *_next;
+ int16 _x, _y;
+ uint16 _w, _h;
+ uint16 _id;
+ int _flags;
+public:
+ Widget(Dialog *boss, int x, int y, int w, int h);
+
+ virtual void handleClick(int button) {}
+ void draw();
+
+ void setFlags(int flags) { _flags |= flags; }
+ void clearFlags(int flags) { _flags &= ~flags; }
+ int getFlags() const { return _flags; }
+
+protected:
+ virtual void drawWidget(bool hilite) {}
+};
+
+
+/* StaticTextWidget */
+class StaticTextWidget : public Widget {
+protected:
+ const char *_text;
+public:
+ StaticTextWidget(Dialog *boss, int x, int y, int w, int h, const char *text);
+ void setText(const char *text);
+ const char *getText();
+
+protected:
+ void drawWidget(bool hilite);
+};
+
+
+/* ButtonWidget */
+class ButtonWidget : public StaticTextWidget {
+protected:
+ uint8 _hotkey;
+ uint32 _cmd;
+public:
+ ButtonWidget(Dialog *boss, int x, int y, int w, int h, const char *label, uint32 cmd);
+ void setCmd(uint32 cmd);
+ uint32 getCmd();
+ void handleClick(int button);
+};
+
+
+#endif