[Scummvm-cvs-logs] CVS: scummvm/gui ListWidget.cpp,NONE,1.1 ListWidget.h,NONE,1.1 dialog.cpp,1.14,1.15 widget.cpp,1.12,1.13 widget.h,1.9,1.10

Max Horn fingolfin at users.sourceforge.net
Wed Jul 10 15:50:11 CEST 2002


Update of /cvsroot/scummvm/scummvm/gui
In directory usw-pr-cvs1:/tmp/cvs-serv31676/gui

Modified Files:
	dialog.cpp widget.cpp widget.h 
Added Files:
	ListWidget.cpp ListWidget.h 
Log Message:
added prototype ListWidget (doesn't do anything yet, only serves to demo how it might look); renamed various NewGui methods and added frameRect method; made NewGui use our 'own' GUI colors (no worries if you don't like them, this is just an experiment); StaticTextWidget now clones its label (preventing problems when a game was loaded, thus invalidating string locations in memory)

--- NEW FILE: ListWidget.cpp ---
/* 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: /cvsroot/scummvm/scummvm/gui/ListWidget.cpp,v 1.1 2002/07/10 22:49:41 fingolfin Exp $
 */

#include "stdafx.h"
#include "ListWidget.h"
#include "dialog.h"
#include "newgui.h"


/*
 * Some thoughts:
 * - We should split out the scrollbar into a seperate widget. This will
 *   simplify the drawing & mouse handling considerably, but also requires
 *   us to come up with a way to couple both widgets (shouldn't be to hard)
 * - Write a class to encapsulate the data instead of using std::list<string>.
 *   How exactly this will look and what it does has yet to be determined.
 * - The handleKey method of widgets is currently never called, code for that has
 *   to be added to dialog.cpp
 * - ...
 */


// Height of one entry
#define	LINE_HEIGHT		10


// Up/down arrow for the scrollbar
static uint32 up_arrow[8] = {
	0x00000000,
	0x00000000,
	0x00001000,
	0x00001000,
	0x00011100,
	0x00011100,
	0x00110110,
	0x00100010,
};

static uint32 down_arrow[8] = {
	0x00000000,
	0x00000000,
	0x00100010,
	0x00110110,
	0x00011100,
	0x00011100,
	0x00001000,
	0x00001000,
};

ListWidget::ListWidget(Dialog *boss, int x, int y, int w, int h)
	: Widget(boss, x, y, w, h)
{
	_flags = WIDGET_ENABLED | WIDGET_TRACK_MOUSE | WIDGET_CLEARBG;
	_type = kListWidget;
}

ListWidget::~ListWidget()
{
}

void ListWidget::handleClick(int button)
{
	if (_flags & WIDGET_ENABLED) {
	}
}

void ListWidget::handleMouseMoved(int x, int y, int state)
{
}


void ListWidget::handleKey(char key, int modifiers)
{
}

void ListWidget::drawWidget(bool hilite)
{
	NewGui *gui = _boss->getGui();
	int		rightX = _x + _w - 1;
	int		leftX = rightX - 8;
	int		bottomY = _y + _h;
	
	gui->frameRect(leftX, _y, 9, _h, gui->_shadowcolor);
	
	// Up arrow
	gui->fillRect(leftX, _y, 9, 10, gui->_bgcolor);
	gui->frameRect(leftX, _y, 9, 10, gui->_color);
	gui->drawBitmap(up_arrow, leftX, _y, gui->_textcolor);

	// Down arrow
	gui->fillRect(leftX, bottomY - 9, 9, 10, gui->_bgcolor);
	gui->frameRect(leftX, bottomY - 9, 9, 10, gui->_color);
	gui->drawBitmap(down_arrow, leftX, bottomY - 9, gui->_textcolor);

	// Slider
	// FIXME - determine slider position and size. This depends on:
	// * the number of entries/page
	// * total number of entries
	// * current scroll position (i.e. idx of "first" visible entry
	gui->fillRect(leftX, _y+20, 9, 4, gui->_textcolor);
	gui->frameRect(leftX, _y+20, 9, 4, gui->_color);
	
	// Now draw the list items
	// FIXME - this is just a temporary demo hack
	gui->drawString("1. A simple game", _x+1, _y+1, _w - 10, gui->_textcolor);
	gui->drawString("2. This space for rent", _x+1, _y+1 + LINE_HEIGHT, _w - 10, gui->_textcolorhi);
	gui->drawString("3. To be or not to be", _x+1, _y+1 + LINE_HEIGHT*2, _w - 10, gui->_textcolor);
}

--- NEW FILE: ListWidget.h ---
/* 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: /cvsroot/scummvm/scummvm/gui/ListWidget.h,v 1.1 2002/07/10 22:49:41 fingolfin Exp $
 */

#ifndef LISTWIDGET_H
#define LISTWIDGET_H

#include "widget.h"

// FIXME - use own list class later, this is for rapid development
#include <string>
#include <vector>
typedef	std::vector<std::string>	StringList;


enum {
	kListNumberingOff	= -1,
	kListNumberingZero	= 0,
	kListNumberingOne	= 1
};

/* ListWidget */
class ListWidget : public Widget {
protected:
	StringList	_list;
	bool		_editable;
	int			_numberingMode;
	int			_currentPos;
	
public:
	ListWidget(Dialog *boss, int x, int y, int w, int h);
	virtual ~ListWidget();
	
	void setList(const StringList& list)	{ _list = list; }
	const StringList& getList()	const		{ return _list; }
	
	void setNumberingMode(int numberingMode)	{ _numberingMode = numberingMode; }
	
	virtual void handleClick(int button);
	virtual void handleMouseMoved(int x, int y, int button);
	virtual void handleKey(char key, int modifiers);

protected:
	void drawWidget(bool hilite);
};

#endif

Index: dialog.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gui/dialog.cpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- dialog.cpp	10 Jul 2002 16:49:45 -0000	1.14
+++ dialog.cpp	10 Jul 2002 22:49:41 -0000	1.15
@@ -21,9 +21,10 @@
 #include <ctype.h>
 
 #include "stdafx.h"
+#include "newgui.h"
 #include "dialog.h"
 #include "widget.h"
-#include "newgui.h"
+#include "ListWidget.h"
 
 Dialog::~Dialog()
 {
@@ -37,14 +38,14 @@
 		_screenBuf = new byte[320*200];
 	
 	// Draw the fixed parts of the dialog: background and border.
-	_gui->blendArea(_x, _y, _w, _h, _gui->_bgcolor);
+	_gui->blendRect(_x, _y, _w, _h, _gui->_bgcolor);
 	_gui->box(_x, _y, _w, _h);
 
 	// Draw a bgcolor rectangle for all widgets which have WIDGET_CLEARBG set. 
 	Widget *w = _firstWidget;
 	while (w) {
 		if (w->_flags & WIDGET_CLEARBG)
-			_gui->fillArea(_x + w->_x, _y + w->_y, w->_w, w->_h, _gui->_bgcolor);
+			_gui->fillRect(_x + w->_x, _y + w->_y, w->_w, w->_h, _gui->_bgcolor);
 		// FIXME - should we also draw borders here if WIDGET_BORDER is set?
 		w = w->_next;
 	}
@@ -68,10 +69,10 @@
 	if (_screenBuf) {
 		_gui->blitFrom(_screenBuf, _x, _y, _w, _h); 
 	} else {
-		_gui->fillArea(_x, _y, _w, _h, _gui->_bgcolor);
+		_gui->fillRect(_x, _y, _w, _h, _gui->_bgcolor);
 		_gui->box(_x, _y, _w, _h);
 	}
-	_gui->setAreaDirty(_x, _y, _w, _h);
+	_gui->addDirtyRect(_x, _y, _w, _h);
 
 	while (w) {
 		w->draw();
@@ -102,6 +103,10 @@
 		}
 		w = w->_next;
 	}
+	
+	// TODO - introduce the notion of a "focused" widget which receives
+	// key events (by calling its handleKey method). Required for editfields
+	// and also for an editable list widget.
 }
 
 void Dialog::handleMouseMoved(int x, int y, int button)
@@ -194,10 +199,13 @@
 	addButton(200, 100, 54, 16, RES_STRING(8), kQuitCmd, 'Q');	// Quit
 	
 	// FIXME - test
-	new CheckboxWidget(this, 50, 20, 100, 16, "Toggle me", 0);
+	new CheckboxWidget(this, 10, 20, 90, 16, "Toggle me", 0);
 
 	// FIXME - test
-	new SliderWidget(this, 50, 50, 100, 16, "Volume", 0);
+	new SliderWidget(this, 110, 20, 80, 16, "Volume", 0);
+	
+	// FIXME - test
+	new ListWidget(this, 10, 40, 180, 70);
 }
 
 void SaveLoadDialog::handleCommand(uint32 cmd)

Index: widget.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gui/widget.cpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- widget.cpp	10 Jul 2002 16:49:45 -0000	1.12
+++ widget.cpp	10 Jul 2002 22:49:41 -0000	1.13
@@ -45,7 +45,7 @@
 
 	// Clear background (unless alpha blending is enabled)
 	if (_flags & WIDGET_CLEARBG && !_boss->_screenBuf)
-		gui->fillArea(_x, _y, _w, _h, gui->_bgcolor);
+		gui->fillRect(_x, _y, _w, _h, gui->_bgcolor);
 
 	// Draw border
 	if (_flags & WIDGET_BORDER) {
@@ -58,7 +58,7 @@
 	drawWidget(_flags & WIDGET_HILITED);
 	
 	// Flag the draw area as dirty
-	gui->setAreaDirty(_x, _y, _w, _h);
+	gui->addDirtyRect(_x, _y, _w, _h);
 
 	// Restore x/y
 	if (_flags & WIDGET_BORDER) {
@@ -74,11 +74,31 @@
 
 
 StaticTextWidget::StaticTextWidget(Dialog *boss, int x, int y, int w, int h, const char *text)
-	: Widget (boss, x, y, w, h)
+	: Widget (boss, x, y, w, h), _text(0)
 {
-	// FIXME - maybe we should make a real copy of the string?
-	_text = text;
 	_type = kStaticTextWidget;
+	setText(text);
+}
+
+StaticTextWidget::~StaticTextWidget()
+{
+	if (_text) {
+		free(_text);
+		_text = 0;
+	}
+}
+
+void StaticTextWidget::setText(const char *text)
+{
+	// Free old text if any
+	if (_text)
+		free(_text);
+
+	// Duplicate new text
+	if (text)
+		_text = strdup(text);
+	else
+		_text = 0;
 }
 
 void StaticTextWidget::drawWidget(bool hilite)
@@ -148,7 +168,7 @@
 	if (_state)
 		gui->drawBitmap(checked_img, _x + 3, _y + 3, gui->_textcolor);
 	else
-		gui->fillArea(_x + 2, _y + 2, 10, 10, gui->_bgcolor);
+		gui->fillRect(_x + 2, _y + 2, 10, 10, gui->_bgcolor);
 	
 	// Finally draw the label
 	gui->drawString(_text, _x + 20, _y + 3, _w, gui->_textcolor);
@@ -163,6 +183,17 @@
 	_type = kSliderWidget;
 }
 
+void SliderWidget::handleMouseMoved(int x, int y, int state) { 
+	if (state == 1) {
+		int newvalue = x * 100 / _w;
+
+		if (newvalue != _value) {
+			_value = newvalue; 
+			draw();
+		}
+	}
+}
+
 void SliderWidget::drawWidget(bool hilite)
 {
 	NewGui *gui = _boss->getGui();
@@ -172,21 +203,10 @@
 	
 	// Remove old 'bar' if necessary
 	if (_value != _old_value) {
-		gui->fillArea(_x + 2 + ((_w - 5) * _old_value / 100), _y + 2, 2, _h - 4, gui->_bgcolor);
+		gui->fillRect(_x + 2 + ((_w - 5) * _old_value / 100), _y + 2, 2, _h - 4, gui->_bgcolor);
 		_old_value = _value;
 	}
 
 	// Draw the 'bar'
-	gui->fillArea(_x + 2 + ((_w - 5) * _value / 100), _y + 2, 2, _h - 4, hilite ? gui->_textcolorhi : gui->_textcolor);
-}
-
-void SliderWidget::handleMouseMoved(int x, int y, int state) { 
-	if (state == 1) {
-		int newvalue = x * 100 / _w;
-
-		if (newvalue != _value) {
-			_value = newvalue; 
-			draw();
-		}
-	}
+	gui->fillRect(_x + 2 + ((_w - 5) * _value / 100), _y + 2, 2, _h - 4, hilite ? gui->_textcolorhi : gui->_textcolor);
 }

Index: widget.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/gui/widget.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- widget.h	8 Jul 2002 22:11:47 -0000	1.9
+++ widget.h	10 Jul 2002 22:49:41 -0000	1.10
@@ -40,7 +40,8 @@
 	kStaticTextWidget	= 'TEXT',
 	kButtonWidget		= 'BTTN',
 	kCheckboxWidget		= 'CHKB',
-	kSliderWidget		= 'SLDE'
+	kSliderWidget		= 'SLDE',
+	kListWidget			= 'LIST'
 };
 
 /* Widget */
@@ -56,11 +57,13 @@
 	int			_flags;
 public:
 	Widget(Dialog *boss, int x, int y, int w, int h);
+	virtual ~Widget() {}
 
-	virtual void handleClick(int button)		{}
-	virtual void handleMouseEntered(int button)	{}
-	virtual void handleMouseLeft(int button)	{}
+	virtual void handleClick(int button) {}
+	virtual void handleMouseEntered(int button) {}
+	virtual void handleMouseLeft(int button) {}
 	virtual void handleMouseMoved(int x, int y, int button) {}
+	virtual void handleKey(char key, int modifiers) {}
 	void draw();
 
 	void setFlags(int flags)	{ _flags |= flags; }
@@ -75,11 +78,12 @@
 /* StaticTextWidget */
 class StaticTextWidget : public Widget {
 protected:
-	const char	*_text;
+	char	*_text;
 public:
 	StaticTextWidget(Dialog *boss, int x, int y, int w, int h, const char *text);
+	~StaticTextWidget();
 	void setText(const char *text);
-	const char *getText();
+	const char *getText() const	{ return _text; }
 
 protected:
 	void drawWidget(bool hilite);
@@ -95,7 +99,7 @@
 public:
 	ButtonWidget(Dialog *boss, int x, int y, int w, int h, const char *label, uint32 cmd = 0, uint8 hotkey = 0);
 	void setCmd(uint32 cmd)	{ _cmd = cmd; }
-	uint32 getCmd()			{ return _cmd; }
+	uint32 getCmd() const	{ return _cmd; }
 
 	void handleClick(int button);
 	void handleMouseEntered(int button)	{ setFlags(WIDGET_HILITED); draw(); }
@@ -109,7 +113,7 @@
 public:
 	CheckboxWidget(Dialog *boss, int x, int y, int w, int h, const char *label, uint32 cmd = 0, uint8 hotkey = 0);
 	void setState(bool state)	{ _state = state; }
-	bool getState()				{ return _state; }
+	bool getState() const		{ return _state; }
 
 	void handleClick(int button);
 	virtual void handleMouseEntered(int button)	{}
@@ -126,14 +130,13 @@
 public:
 	SliderWidget(Dialog *boss, int x, int y, int w, int h, const char *label, uint32 cmd = 0, uint8 hotkey = 0);
 	void setValue(uint8 value)	{ _value = value; }
-	uint8 getValue()			{ return _value; }
+	uint8 getValue() const		{ return _value; }
 
 	void handleMouseMoved(int x, int y, int button);
 
 protected:
 	void drawWidget(bool hilite);
 };
-
 
 
 #endif





More information about the Scummvm-git-logs mailing list