Added InputTextDialog, which can pop up and allow one to enter data.

This is a space-saving measure, so that input boxes don't have to
be onscreen until they're needed (and go away otherwise).

Partially ported CheatWidget to use an InputTextWidget.  I'm not
doing any more work on CheatWidget, since it's going to disappear
(will be integrated directly into RamWidget).


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@710 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2005-08-04 16:31:24 +00:00
parent 655c1b5257
commit a18ea23d86
6 changed files with 218 additions and 26 deletions

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: CheatWidget.cxx,v 1.1 2005-08-01 22:33:12 stephena Exp $
// $Id: CheatWidget.cxx,v 1.2 2005-08-04 16:31:23 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -29,19 +29,23 @@
#include "Widget.hxx"
#include "EditNumWidget.hxx"
#include "AddrValueWidget.hxx"
#include "InputTextDialog.hxx"
#include "CheatWidget.hxx"
enum {
kSearchCmd = 'CSEA',
kCmpCmd = 'CCMP',
kRestartCmd = 'CRST'
kSearchCmd = 'CSEA',
kCmpCmd = 'CCMP',
kRestartCmd = 'CRST',
kSValEntered = 'CSVE',
kCValEntered = 'CCVE'
};
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CheatWidget::CheatWidget(GuiObject* boss, int x, int y, int w, int h)
: Widget(boss, x, y, w, h),
CommandSender(boss)
CommandSender(boss),
myInputBox(NULL)
{
const int border = 20;
const int bwidth = 50;
@ -91,6 +95,9 @@ CheatWidget::CheatWidget(GuiObject* boss, int x, int y, int w, int h)
myResultsList = new AddrValueWidget(boss, xpos, ypos, 100, 75, 0xff);
myResultsList->setFont(instance()->consoleFont());
myResultsList->setTarget(this);
myInputBox = new InputTextDialog(boss, instance()->consoleFont());
myInputBox->setTarget(this);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -98,6 +105,8 @@ CheatWidget::~CheatWidget()
{
mySearchArray.clear();
myCompareArray.clear();
delete myInputBox;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -106,17 +115,43 @@ void CheatWidget::handleCommand(CommandSender* sender, int cmd, int data, int id
switch(cmd)
{
case kSearchCmd:
doSearch();
myInputBox->setEditString("");
myInputBox->setTitle("");
myInputBox->setEmitSignal(kSValEntered);
parent()->addDialog(myInputBox);
break;
case kCmpCmd:
doCompare();
myInputBox->setEditString("");
myInputBox->setTitle("");
myInputBox->setEmitSignal(kCValEntered);
parent()->addDialog(myInputBox);
break;
case kRestartCmd:
doRestart();
break;
case kSValEntered:
{
const string& result = doSearch(myInputBox->getResult());
if(result != "")
myInputBox->setTitle(result);
else
parent()->removeDialog();
break;
}
case kCValEntered:
{
const string& result = doCompare(myInputBox->getResult());
if(result != "")
myInputBox->setTitle(result);
else
parent()->removeDialog();
break;
}
case kAVItemDataChangedCmd:
int addr = myResultsList->getSelectedAddr() - kRamStart;
int value = myResultsList->getSelectedValue();
@ -126,11 +161,10 @@ void CheatWidget::handleCommand(CommandSender* sender, int cmd, int data, int id
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheatWidget::doSearch()
const string CheatWidget::doSearch(const string& str)
{
bool comparisonSearch = true;
string str = myEditBox->getEditString();
if(str.length() == 0)
{
// An empty field means return all memory locations
@ -139,8 +173,7 @@ void CheatWidget::doSearch()
else if(str.find_first_of("+-", 0) != string::npos)
{
// Don't accept these characters here, only in compare
myResult->setLabel("Invalid input +|-");
return;
return "Invalid input +|-";
}
int searchVal = instance()->debugger().stringToValue(str);
@ -190,28 +223,25 @@ void CheatWidget::doSearch()
// Finally, show the search results in the list
fillResultsList();
return "";
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheatWidget::doCompare()
const string CheatWidget::doCompare(const string& str)
{
bool comparitiveSearch = false;
int searchVal = 0;
string str = myEditBox->getEditString();
if(str.length() == 0)
{
myResult->setLabel("Enter an absolute or comparitive value");
return;
}
return "Enter an absolute or comparitive value";
// Do some pre-processing on the string
string::size_type pos = str.find_first_of("+-", 0);
if(pos > 0 && pos != string::npos)
{
// Only accept '+' or '-' at the start of the string
myResult->setLabel("Input must be [+|-]NUM");
return;
return "Input must be [+|-]NUM";
}
if(str[0] == '+' || str[0] == '-')
@ -220,8 +250,9 @@ void CheatWidget::doCompare()
if(str[0] == '-')
negative = true;
str.erase(0, 1); // remove the operator
searchVal = instance()->debugger().stringToValue(str);
string tmp = str;
tmp.erase(0, 1); // remove the operator
searchVal = instance()->debugger().stringToValue(tmp);
if(negative)
searchVal = -searchVal;
@ -276,6 +307,8 @@ void CheatWidget::doCompare()
// Finally, show the search results in the list
fillResultsList();
return "";
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: CheatWidget.hxx,v 1.1 2005-08-01 22:33:12 stephena Exp $
// $Id: CheatWidget.hxx,v 1.2 2005-08-04 16:31:24 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -27,6 +27,7 @@ class ButtonWidget;
class StaticTextWidget;
class EditNumWidget;
class AddrValueWidget;
class InputTextDialog;
#include "Array.hxx"
#include "Widget.hxx"
@ -55,8 +56,8 @@ class CheatWidget : public Widget, public CommandSender
void handleCommand(CommandSender* sender, int cmd, int data, int id);
private:
void doSearch();
void doCompare();
const string doSearch(const string& str);
const string doCompare(const string& str);
void doRestart();
void fillResultsList();
@ -72,6 +73,8 @@ class CheatWidget : public Widget, public CommandSender
ButtonWidget* myRestartButton;
AddrValueWidget* myResultsList;
InputTextDialog* myInputBox;
};
#endif

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: EditableWidget.cxx,v 1.8 2005-08-01 22:33:15 stephena Exp $
// $Id: EditableWidget.cxx,v 1.9 2005-08-04 16:31:24 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -173,7 +173,7 @@ void EditableWidget::drawCaret()
x += getCaretOffset();
x += getAbsX();
x += _x;
y += _y;
FrameBuffer& fb = _boss->instance()->frameBuffer();

View File

@ -0,0 +1,101 @@
//============================================================================
//
// SSSS tt lll lll
// SS SS tt ll ll
// SS tttttt eeee ll ll aaaa
// SSSS tt ee ee ll ll aa
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
// SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa
//
// Copyright (c) 1995-2005 by Bradford W. Mott and the Stella team
//
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: InputTextDialog.cxx,v 1.1 2005-08-04 16:31:24 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
//============================================================================
#include "OSystem.hxx"
#include "Widget.hxx"
#include "EditNumWidget.hxx"
#include "Dialog.hxx"
#include "GuiObject.hxx"
#include "GuiUtils.hxx"
#include "InputTextDialog.hxx"
#include "bspf.hxx"
enum {
kAcceptCmd = 'ACPT'
};
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
InputTextDialog::InputTextDialog(GuiObject* boss, const GUI::Font& font)
: Dialog(boss->instance(), boss->parent(), 0, 0, 16, 16),
CommandSender(boss)
{
const int fontWidth = font.getMaxCharWidth(),
fontHeight = font.getFontHeight(),
lineHeight = font.getLineHeight();
int xpos, ypos;
// Calculate real dimensions
_w = fontWidth * 30;
_h = lineHeight * 6;
// FIXME
_x = 100;//(boss->getAbsX() - _w) / 2;
_y = 400;//(boss->getAbsY() - _h) / 2;
xpos = 10; ypos = lineHeight;
int lwidth = font.getStringWidth("Enter Data:");
StaticTextWidget* t =
new StaticTextWidget(this, xpos, ypos,
lwidth, fontHeight,
"Enter Data:", kTextAlignLeft);
t->setFont(font);
xpos += lwidth + fontWidth;
_input = new EditNumWidget(this, xpos, ypos,
_w - xpos - 10, lineHeight, "");
_input->setFont(font);
_input->clearFlags(WIDGET_TAB_NAVIGATE);
xpos = 10; ypos = 2*lineHeight;
_title = new StaticTextWidget(this, xpos, ypos, _w - 2*xpos, fontHeight,
"", kTextAlignCenter);
#ifndef MAC_OSX
addButton(_w - 2 * (kButtonWidth + 10), _h - 24, "OK", kAcceptCmd, 0);
addButton(_w - (kButtonWidth+10), _h - 24, "Cancel", kCloseCmd, 0);
#else
addButton(_w - 2 * (kButtonWidth + 10), _h - 24, "Cancel", kCloseCmd, 0);
addButton(_w - (kButtonWidth+10), _h - 24, "OK", kAcceptCmd, 0);
#endif
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void InputTextDialog::handleCommand(CommandSender* sender, int cmd,
int data, int id)
{
switch (cmd)
{
case kAcceptCmd:
{
// Send a signal to the calling class that a selection has been made
// Since we aren't derived from a widget, we don't have a 'data' or 'id'
if(_cmd)
sendCommand(_cmd, 0, 0);
// We don't close, but leave the parent to do it
// If the data isn't valid, the parent may wait until it is
break;
}
default:
Dialog::handleCommand(sender, cmd, data, 0);
break;
}
}

View File

@ -0,0 +1,54 @@
//============================================================================
//
// SSSS tt lll lll
// SS SS tt ll ll
// SS tttttt eeee ll ll aaaa
// SSSS tt ee ee ll ll aa
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
// SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa
//
// Copyright (c) 1995-2005 by Bradford W. Mott and the Stella team
//
// See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id: InputTextDialog.hxx,v 1.1 2005-08-04 16:31:24 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
//============================================================================
#ifndef INPUT_TEXT_DIALOG_HXX
#define INPUT_TEXT_DIALOG_HXX
class GuiObject;
class StaticTextWidget;
class EditNumWidget;
#include "Dialog.hxx"
#include "Command.hxx"
#include "bspf.hxx"
class InputTextDialog : public Dialog, public CommandSender
{
public:
InputTextDialog(GuiObject* boss, const GUI::Font& font);
const string& getResult() { return _input->getEditString(); }
void setEditString(const string& str) { _input->setEditString(str); }
void setTitle(const string& title) { _title->setLabel(title); }
void setEmitSignal(int cmd) { _cmd = cmd; }
protected:
virtual void handleCommand(CommandSender* sender, int cmd, int data, int id);
private:
StaticTextWidget* _title;
EditNumWidget* _input;
int _cmd;
};
#endif

View File

@ -18,6 +18,7 @@ MODULE_OBJS := \
src/gui/GameInfoDialog.o \
src/gui/GameList.o \
src/gui/HelpDialog.o \
src/gui/InputTextDialog.o \
src/gui/Launcher.o \
src/gui/LauncherDialog.o \
src/gui/LauncherOptionsDialog.o \