added simple message dialog
svn-id: r5020
This commit is contained in:
parent
522ee88b62
commit
58e5e0069f
10 changed files with 198 additions and 33 deletions
|
@ -14,7 +14,7 @@ COMMON_OBJS = common/config-file.o common/engine.o common/file.o \
|
||||||
common/timer.o common/util.o
|
common/timer.o common/util.o
|
||||||
|
|
||||||
GUI_OBJS = gui/gui.o gui/newgui.o gui/widget.o gui/dialog.o gui/ListWidget.o \
|
GUI_OBJS = gui/gui.o gui/newgui.o gui/widget.o gui/dialog.o gui/ListWidget.o \
|
||||||
gui/ScrollBarWidget.o
|
gui/ScrollBarWidget.o gui/message.o
|
||||||
|
|
||||||
SCUMM_OBJS = scumm/actor.o scumm/akos.o scumm/boxes.o scumm/bundle.o \
|
SCUMM_OBJS = scumm/actor.o scumm/akos.o scumm/boxes.o scumm/bundle.o \
|
||||||
scumm/costume.o scumm/debug.o scumm/debugrl.o scumm/gfx.o scumm/imuse.o \
|
scumm/costume.o scumm/debug.o scumm/debugrl.o scumm/gfx.o scumm/imuse.o \
|
||||||
|
|
|
@ -22,19 +22,27 @@
|
||||||
#include "str.h"
|
#include "str.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
|
|
||||||
# pragma warning( disable : 4068 ) // unknown pragmas
|
# pragma warning( disable : 4068 ) // unknown pragmas
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
namespace ScummVM {
|
namespace ScummVM {
|
||||||
|
|
||||||
String::String(const char *str)
|
String::String(const char *str, int len)
|
||||||
{
|
{
|
||||||
_refCount = new int(1);
|
_refCount = new int(1);
|
||||||
if (str) {
|
if (str) {
|
||||||
|
if (len)
|
||||||
|
_capacity = _len = len;
|
||||||
|
else
|
||||||
_capacity = _len = resStrLen(str);
|
_capacity = _len = resStrLen(str);
|
||||||
_str = (char *)calloc(1, _capacity+1);
|
_str = (char *)calloc(1, _capacity+1);
|
||||||
memcpy(_str, str, _len+1);
|
memcpy(_str, str, _len);
|
||||||
|
_str[_len] = 0;
|
||||||
} else {
|
} else {
|
||||||
_capacity = _len = 0;
|
_capacity = _len = 0;
|
||||||
_str = 0;
|
_str = 0;
|
||||||
|
|
43
common/str.h
43
common/str.h
|
@ -33,7 +33,7 @@ namespace ScummVM {
|
||||||
Only constructor: ConstString(const char *ptr)
|
Only constructor: ConstString(const char *ptr)
|
||||||
Then whenever you now use "const String &" in a parameter, use "const ConstString &"
|
Then whenever you now use "const String &" in a parameter, use "const ConstString &"
|
||||||
instead (mayhaps make a typedef even). Thus, parameters are passed w/o
|
instead (mayhaps make a typedef even). Thus, parameters are passed w/o
|
||||||
causing a free/malloc. Then only for permenant storage, when we assign it to a
|
causing a free/malloc. Then only for permanent storage, when we assign it to a
|
||||||
real String object, will a malloc be issued (to this end, make String aware of
|
real String object, will a malloc be issued (to this end, make String aware of
|
||||||
ConstString ?!?
|
ConstString ?!?
|
||||||
*/
|
*/
|
||||||
|
@ -46,7 +46,7 @@ protected:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ConstString() : _str(0), _len(0) {}
|
ConstString() : _str(0), _len(0) {}
|
||||||
ConstString(const char *str) : _str((char*)str) { _len = str ? strlen(str) : 0; }
|
ConstString(const char *str, int len = 0) : _str((char*)str) { _len = str ? (len ? len : strlen(str)) : 0; }
|
||||||
virtual ~ConstString() {}
|
virtual ~ConstString() {}
|
||||||
|
|
||||||
bool operator ==(const ConstString& x) const;
|
bool operator ==(const ConstString& x) const;
|
||||||
|
@ -58,6 +58,12 @@ public:
|
||||||
bool operator >(const ConstString& x) const;
|
bool operator >(const ConstString& x) const;
|
||||||
bool operator >=(const ConstString& x) const;
|
bool operator >=(const ConstString& x) const;
|
||||||
|
|
||||||
|
char operator [](int idx) const
|
||||||
|
{
|
||||||
|
assert(_str && idx >= 0 && idx < _len);
|
||||||
|
return _str[idx];
|
||||||
|
}
|
||||||
|
|
||||||
const char *c_str() const { return _str; }
|
const char *c_str() const { return _str; }
|
||||||
int size() const { return _len; }
|
int size() const { return _len; }
|
||||||
|
|
||||||
|
@ -71,17 +77,33 @@ protected:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
String() : _capacity(0) { _refCount = new int(1); }
|
String() : _capacity(0) { _refCount = new int(1); }
|
||||||
String(const char *str);
|
String(const char *str, int len = 0);
|
||||||
String(const ConstString &str);
|
String(const ConstString &str);
|
||||||
String(const String &str);
|
String(const String &str);
|
||||||
virtual ~String();
|
virtual ~String();
|
||||||
|
|
||||||
String& operator =(const char* str);
|
String& operator =(const char* str);
|
||||||
|
// TODO - We should use RTTI here - that is, not real C++ RTTI but some magic
|
||||||
|
// constant in each string object. We want to be able to optimize the case when
|
||||||
|
// a real 'String' object is passed to a function as a ConstString obj and then
|
||||||
|
// assigned to a 'String' object
|
||||||
String& operator =(const String& str);
|
String& operator =(const String& str);
|
||||||
String& operator +=(const char* str);
|
String& operator +=(const char* str);
|
||||||
String& operator +=(const String& str);
|
String& operator +=(const String& str);
|
||||||
String& operator +=(char c);
|
String& operator +=(char c);
|
||||||
|
|
||||||
|
char operator [](int idx) const
|
||||||
|
{
|
||||||
|
assert(_str && idx >= 0 && idx < _len);
|
||||||
|
return _str[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
char &operator [](int idx)
|
||||||
|
{
|
||||||
|
assert(_str && idx >= 0 && idx < _len);
|
||||||
|
return _str[idx];
|
||||||
|
}
|
||||||
|
|
||||||
void deleteLastChar();
|
void deleteLastChar();
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
|
@ -99,8 +121,19 @@ public:
|
||||||
void push_back(const char* str)
|
void push_back(const char* str)
|
||||||
{
|
{
|
||||||
ensureCapacity(_size + 1);
|
ensureCapacity(_size + 1);
|
||||||
_data[_size] = str;
|
_data[_size++] = str;
|
||||||
_size++;
|
}
|
||||||
|
|
||||||
|
void push_back(const ConstString& str)
|
||||||
|
{
|
||||||
|
ensureCapacity(_size + 1);
|
||||||
|
_data[_size++] = str;
|
||||||
|
}
|
||||||
|
|
||||||
|
void push_back(const String& str)
|
||||||
|
{
|
||||||
|
ensureCapacity(_size + 1);
|
||||||
|
_data[_size++] = str;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -32,11 +32,6 @@ enum {
|
||||||
kListNumberingOne = 1
|
kListNumberingOne = 1
|
||||||
};
|
};
|
||||||
|
|
||||||
// Height of a signle entry line
|
|
||||||
enum {
|
|
||||||
kLineHeight = 11
|
|
||||||
};
|
|
||||||
|
|
||||||
// Some special commands
|
// Some special commands
|
||||||
enum {
|
enum {
|
||||||
kListItemDoubleClickedCmd = 'LIdb', // 'data' will be item index
|
kListItemDoubleClickedCmd = 'LIdb', // 'data' will be item index
|
||||||
|
|
73
gui/message.cpp
Normal file
73
gui/message.cpp
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
/* 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 "message.h"
|
||||||
|
#include "newgui.h"
|
||||||
|
|
||||||
|
#include "common/list.h"
|
||||||
|
|
||||||
|
|
||||||
|
MessageDialog::MessageDialog(NewGui *gui, const String &message)
|
||||||
|
: Dialog(gui, 30, 20, 260, 124)
|
||||||
|
{
|
||||||
|
// First, determine the size the dialog needs. For this we have to break
|
||||||
|
// down the string into lines, and taking the maximum of their widths.
|
||||||
|
// Using this, and accounting for the space the button(s) need, we can set
|
||||||
|
// the real size of the dialog
|
||||||
|
ScummVM::StringList lines;
|
||||||
|
String tmp;
|
||||||
|
const char *str = message.c_str();
|
||||||
|
const char *start = str;
|
||||||
|
int lineWidth, maxlineWidth = 0;
|
||||||
|
|
||||||
|
while (*str) {
|
||||||
|
if (*str == '\n') {
|
||||||
|
tmp = String(start, str - start);
|
||||||
|
lines.push_back(tmp);
|
||||||
|
lineWidth = _gui->getStringWidth(tmp);
|
||||||
|
if (maxlineWidth < lineWidth)
|
||||||
|
maxlineWidth = lineWidth;
|
||||||
|
start = str + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
++str;
|
||||||
|
}
|
||||||
|
if (*start) {
|
||||||
|
tmp = String(start, str - start);
|
||||||
|
lines.push_back(tmp);
|
||||||
|
lineWidth = _gui->getStringWidth(tmp);
|
||||||
|
if (maxlineWidth < lineWidth)
|
||||||
|
maxlineWidth = lineWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO - we should probably check for over/underflows here
|
||||||
|
_w = maxlineWidth + 20;
|
||||||
|
_h = lines.size() * kLineHeight + 30;
|
||||||
|
_x = (320 - _w) / 2;
|
||||||
|
|
||||||
|
for (int i = 0; i < lines.size(); i++) {
|
||||||
|
new StaticTextWidget(this, 10, 10+i*kLineHeight, maxlineWidth, kLineHeight,
|
||||||
|
lines[i], kTextAlignCenter);
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME - the vertical position has to be adjusted
|
||||||
|
addButton((_w - 54)/2, _h - 20, 54, 16, "OK", kCloseCmd, '\n'); // Confirm dialog
|
||||||
|
}
|
35
gui/message.h
Normal file
35
gui/message.h
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
/* 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 MESSAGE_DIALOG_H
|
||||||
|
#define MESSAGE_DIALOG_H
|
||||||
|
|
||||||
|
#include "dialog.h"
|
||||||
|
#include "common/str.h"
|
||||||
|
|
||||||
|
class MessageDialog : public Dialog {
|
||||||
|
typedef ScummVM::String String;
|
||||||
|
public:
|
||||||
|
MessageDialog(NewGui *gui, const String &message);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -401,11 +401,12 @@ void NewGui::drawChar(const char chr, int xx, int yy, int16 color)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int NewGui::getStringWidth(const char *str)
|
int NewGui::getStringWidth(const String &str)
|
||||||
{
|
{
|
||||||
int space = 0;
|
int space = 0;
|
||||||
while (*str)
|
|
||||||
space += getCharWidth(*str++);
|
for (int i = 0; i < str.size(); ++i)
|
||||||
|
space += getCharWidth(str[i]);
|
||||||
return space;
|
return space;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -414,17 +415,17 @@ int NewGui::getCharWidth(char c)
|
||||||
return guifont[c+6];
|
return guifont[c+6];
|
||||||
}
|
}
|
||||||
|
|
||||||
void NewGui::drawString(const char *str, int x, int y, int w, int16 color, int align)
|
void NewGui::drawString(const String &str, int x, int y, int w, int16 color, int align)
|
||||||
{
|
{
|
||||||
int width = getStringWidth(str);
|
int width = getStringWidth(str);
|
||||||
if (align == kTextAlignCenter)
|
if (align == kTextAlignCenter)
|
||||||
x = x + (w - width - 1)/2;
|
x = x + (w - width - 1)/2;
|
||||||
else if (align == kTextAlignRight)
|
else if (align == kTextAlignRight)
|
||||||
x = x + w - width;
|
x = x + w - width;
|
||||||
while (*str) {
|
|
||||||
drawChar(*str, x, y, color);
|
for (int i = 0; i < str.size(); ++i) {
|
||||||
x += getCharWidth(*str);
|
drawChar(str[i], x, y, color);
|
||||||
str++;
|
x += getCharWidth(str[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
13
gui/newgui.h
13
gui/newgui.h
|
@ -23,12 +23,20 @@
|
||||||
|
|
||||||
#include "scummsys.h"
|
#include "scummsys.h"
|
||||||
#include "system.h" // For events
|
#include "system.h" // For events
|
||||||
|
#include "common/str.h"
|
||||||
|
|
||||||
class Dialog;
|
class Dialog;
|
||||||
|
|
||||||
#define hline(x, y, x2, color) line(x, y, x2, y, color);
|
#define hline(x, y, x2, color) line(x, y, x2, y, color);
|
||||||
#define vline(x, y, y2, color) line(x, y, x, y2, color);
|
#define vline(x, y, y2, color) line(x, y, x, y2, color);
|
||||||
|
|
||||||
|
// Height of a single text line
|
||||||
|
enum {
|
||||||
|
kLineHeight = 11
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Text alignment modes for drawString()
|
||||||
enum {
|
enum {
|
||||||
kTextAlignLeft,
|
kTextAlignLeft,
|
||||||
kTextAlignCenter,
|
kTextAlignCenter,
|
||||||
|
@ -59,6 +67,7 @@ public:
|
||||||
// This class hopefully will replace the old Gui class completly one day
|
// This class hopefully will replace the old Gui class completly one day
|
||||||
class NewGui {
|
class NewGui {
|
||||||
friend class Dialog;
|
friend class Dialog;
|
||||||
|
typedef ScummVM::String String;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// Main entry for the GUI: this will start an event loop that keeps running
|
// Main entry for the GUI: this will start an event loop that keeps running
|
||||||
|
@ -123,9 +132,9 @@ public:
|
||||||
void frameRect(int x, int y, int w, int h, int16 color);
|
void frameRect(int x, int y, int w, int h, int16 color);
|
||||||
void addDirtyRect(int x, int y, int w, int h);
|
void addDirtyRect(int x, int y, int w, int h);
|
||||||
void drawChar(char c, int x, int y, int16 color);
|
void drawChar(char c, int x, int y, int16 color);
|
||||||
int getStringWidth(const char *str);
|
int getStringWidth(const String &str);
|
||||||
int getCharWidth(char c);
|
int getCharWidth(char c);
|
||||||
void drawString(const char *str, int x, int y, int w, int16 color, int align = kTextAlignLeft);
|
void drawString(const String &str, int x, int y, int w, int16 color, int align = kTextAlignLeft);
|
||||||
|
|
||||||
void drawBitmap(uint32 bitmap[8], int x, int y, int16 color);
|
void drawBitmap(uint32 bitmap[8], int x, int y, int16 color);
|
||||||
};
|
};
|
||||||
|
|
|
@ -63,16 +63,13 @@ public:
|
||||||
AboutDialog(NewGui *gui, Scumm *scumm);
|
AboutDialog(NewGui *gui, Scumm *scumm);
|
||||||
};
|
};
|
||||||
|
|
||||||
class SoundDialog;
|
|
||||||
class KeysDialog;
|
|
||||||
class MiscDialog;
|
|
||||||
|
|
||||||
class OptionsDialog : public ScummDialog {
|
class OptionsDialog : public ScummDialog {
|
||||||
protected:
|
protected:
|
||||||
AboutDialog *_aboutDialog;
|
Dialog *_aboutDialog;
|
||||||
SoundDialog *_soundDialog;
|
Dialog *_soundDialog;
|
||||||
KeysDialog *_keysDialog;
|
Dialog *_keysDialog;
|
||||||
MiscDialog *_miscDialog;
|
Dialog *_miscDialog;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
OptionsDialog(NewGui *gui, Scumm *scumm);
|
OptionsDialog(NewGui *gui, Scumm *scumm);
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include "gameDetector.h"
|
#include "gameDetector.h"
|
||||||
#include "gui/gui.h"
|
#include "gui/gui.h"
|
||||||
#include "gui/newgui.h"
|
#include "gui/newgui.h"
|
||||||
|
#include "gui/message.h"
|
||||||
#include "object.h"
|
#include "object.h"
|
||||||
#include "resource.h"
|
#include "resource.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
@ -936,8 +937,21 @@ void Scumm::runDialog(Dialog *dialog)
|
||||||
|
|
||||||
void Scumm::pauseDialog()
|
void Scumm::pauseDialog()
|
||||||
{
|
{
|
||||||
if (!_pauseDialog)
|
if (!_pauseDialog) {
|
||||||
|
#if 1
|
||||||
|
// HACK HACK
|
||||||
|
const char *message = "This demonstrates MessageDialog's abilities.\n"
|
||||||
|
"For example it supports multi line text.\n"
|
||||||
|
" \n"
|
||||||
|
"Well, not much more right now, really :-)\n"
|
||||||
|
"And there are still some bugs in it, too\n"
|
||||||
|
" "; // <- FIXME: This is needed due to a bug...
|
||||||
|
_pauseDialog = new MessageDialog(_newgui, message);
|
||||||
|
#else
|
||||||
_pauseDialog = new PauseDialog(_newgui, this);
|
_pauseDialog = new PauseDialog(_newgui, this);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
runDialog(_pauseDialog);
|
runDialog(_pauseDialog);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue