mirror of https://github.com/stella-emu/stella.git
My first stab at adding features to the GUI: Added shortcut keys for the
Inv, Neg, etc. buttons on the RAM tab. Also added Undo and Revert buttons to the RAM tab. Undo undoes your last change only (and does not undo an undo). Revert reverts RAM to the state it was in when the user entered the RAM tab. These buttons are disabled when they're not useful. git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@605 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
parent
a1fb0b5057
commit
c4d5f9d54b
|
@ -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: DataGridWidget.cxx,v 1.7 2005-07-03 00:53:59 stephena Exp $
|
||||
// $Id: DataGridWidget.cxx,v 1.8 2005-07-03 21:14:42 urchlay Exp $
|
||||
//
|
||||
// Based on code from ScummVM - Scumm Interpreter
|
||||
// Copyright (C) 2002-2004 The ScummVM project
|
||||
|
@ -28,6 +28,7 @@
|
|||
#include "Debugger.hxx"
|
||||
#include "FrameBuffer.hxx"
|
||||
#include "DataGridWidget.hxx"
|
||||
#include "RamWidget.hxx"
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
DataGridWidget::DataGridWidget(GuiObject* boss, int x, int y, int cols, int rows,
|
||||
|
@ -76,9 +77,9 @@ void DataGridWidget::setList(const AddrList& alist, const ValueList& vlist,
|
|||
_valueStringList.clear();
|
||||
_changedList.clear();
|
||||
|
||||
_addrList = alist;
|
||||
_valueList = vlist;
|
||||
_changedList = changed;
|
||||
_addrList = alist;
|
||||
_valueList = vlist;
|
||||
_changedList = changed;
|
||||
|
||||
// An efficiency thing
|
||||
string temp;
|
||||
|
@ -268,6 +269,61 @@ bool DataGridWidget::handleKeyDown(int ascii, int keycode, int modifiers)
|
|||
default:
|
||||
handled = false;
|
||||
}
|
||||
|
||||
// handle ASCII codes if no keycodes matched.
|
||||
// These really should only send commands if _selectedItem
|
||||
// is a RamWidget, but other widgets may implement these
|
||||
// commands someday (the CPU tab in particular should).
|
||||
if(!handled) switch(ascii) {
|
||||
case 'n': // negate
|
||||
sendCommand(kRNegateCmd, _selectedItem);
|
||||
dirty = true;
|
||||
handled = true;
|
||||
break;
|
||||
|
||||
case 'i': // invert
|
||||
case '!':
|
||||
sendCommand(kRInvertCmd, _selectedItem);
|
||||
dirty = true;
|
||||
handled = true;
|
||||
break;
|
||||
|
||||
case '-': // decrement
|
||||
sendCommand(kRDecCmd, _selectedItem);
|
||||
dirty = true;
|
||||
handled = true;
|
||||
break;
|
||||
|
||||
case '+': // increment
|
||||
case '=':
|
||||
sendCommand(kRIncCmd, _selectedItem);
|
||||
dirty = true;
|
||||
handled = true;
|
||||
break;
|
||||
|
||||
case '<': // shift left
|
||||
case ',':
|
||||
sendCommand(kRShiftLCmd, _selectedItem);
|
||||
dirty = true;
|
||||
handled = true;
|
||||
break;
|
||||
|
||||
case '>': // shift right
|
||||
case '.':
|
||||
sendCommand(kRShiftRCmd, _selectedItem);
|
||||
dirty = true;
|
||||
handled = true;
|
||||
break;
|
||||
|
||||
case 'z': // zero
|
||||
sendCommand(kRZeroCmd, _selectedItem);
|
||||
dirty = true;
|
||||
handled = true;
|
||||
break;
|
||||
|
||||
default:
|
||||
handled = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (dirty)
|
||||
|
@ -440,3 +496,4 @@ bool DataGridWidget::tryInsertChar(char c, int pos)
|
|||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -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: RamWidget.cxx,v 1.12 2005-07-03 00:53:59 stephena Exp $
|
||||
// $Id: RamWidget.cxx,v 1.13 2005-07-03 21:14:42 urchlay Exp $
|
||||
//
|
||||
// Based on code from ScummVM - Scumm Interpreter
|
||||
// Copyright (C) 2002-2004 The ScummVM project
|
||||
|
@ -32,16 +32,6 @@
|
|||
|
||||
#include "RamWidget.hxx"
|
||||
|
||||
enum {
|
||||
kRZeroCmd = 'RWze',
|
||||
kRInvertCmd = 'RWiv',
|
||||
kRNegateCmd = 'RWng',
|
||||
kRIncCmd = 'RWic',
|
||||
kRDecCmd = 'RWdc',
|
||||
kRShiftLCmd = 'RWls',
|
||||
kRShiftRCmd = 'RWrs'
|
||||
};
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RamWidget::RamWidget(GuiObject* boss, int x, int y, int w, int h)
|
||||
: Widget(boss, x, y, w, h),
|
||||
|
@ -52,6 +42,7 @@ RamWidget::RamWidget(GuiObject* boss, int x, int y, int w, int h)
|
|||
int lwidth = 30;
|
||||
const int vWidth = _w - kButtonWidth - 20, space = 6, buttonw = 24;
|
||||
const GUI::Font& font = instance()->consoleFont();
|
||||
_oldValueList = new ValueList;
|
||||
|
||||
// Create a 16x8 grid holding byte values (16 x 8 = 128 RAM bytes) with labels
|
||||
myRamGrid = new DataGridWidget(boss, xpos+lwidth + 5, ypos, 16, 8, 2, 0xff, kBASE_16);
|
||||
|
@ -120,6 +111,16 @@ RamWidget::RamWidget(GuiObject* boss, int x, int y, int w, int h)
|
|||
b = new ButtonWidget(boss, xpos, ypos, buttonw, 16, "<<", kRShiftLCmd, 0);
|
||||
b->setTarget(this);
|
||||
|
||||
ypos += 16 + space;
|
||||
// keep a pointer to this one, it gets disabled/enabled
|
||||
myUndoButton = b = new ButtonWidget(boss, xpos, ypos, buttonw*2+10, 16, "Undo", kUndoCmd, 0);
|
||||
b->setTarget(this);
|
||||
|
||||
ypos += 16 + space;
|
||||
// keep a pointer to this one, it gets disabled/enabled
|
||||
myRevertButton = b = new ButtonWidget(boss, xpos, ypos, buttonw*2+10, 16, "Revert", kRevertCmd, 0);
|
||||
b->setTarget(this);
|
||||
|
||||
xpos = vWidth + 30 + 10; ypos = 20;
|
||||
// b = new ButtonWidget(boss, xpos, ypos, buttonw, 16, "", kRCmd, 0);
|
||||
// b->setTarget(this);
|
||||
|
@ -140,6 +141,7 @@ RamWidget::RamWidget(GuiObject* boss, int x, int y, int w, int h)
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
RamWidget::~RamWidget()
|
||||
{
|
||||
delete _oldValueList;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
@ -152,15 +154,22 @@ void RamWidget::handleCommand(CommandSender* sender, int cmd, int data)
|
|||
unsigned char byte;
|
||||
const char* buf;
|
||||
|
||||
Debugger& dbg = instance()->debugger();
|
||||
|
||||
switch(cmd)
|
||||
{
|
||||
case kDGItemDataChangedCmd:
|
||||
addr = myRamGrid->getSelectedAddr();
|
||||
value = myRamGrid->getSelectedValue();
|
||||
|
||||
myUndoAddress = addr;
|
||||
myUndoValue = dbg.readRAM(addr - kRamStart);
|
||||
|
||||
instance()->debugger().writeRAM(addr - kRamStart, value);
|
||||
myDecValue->setEditString(instance()->debugger().valueToString(value, kBASE_10));
|
||||
myBinValue->setEditString(instance()->debugger().valueToString(value, kBASE_2));
|
||||
myRevertButton->setFlags(WIDGET_ENABLED);
|
||||
myUndoButton->setFlags(WIDGET_ENABLED);
|
||||
break;
|
||||
|
||||
case kDGSelectionChangedCmd:
|
||||
|
@ -214,6 +223,19 @@ void RamWidget::handleCommand(CommandSender* sender, int cmd, int data)
|
|||
byte >>= 1;
|
||||
myRamGrid->setSelectedValue((int)byte);
|
||||
break;
|
||||
|
||||
case kRevertCmd:
|
||||
for(unsigned int i = 0; i < kRamSize; i++)
|
||||
dbg.writeRAM(i, (*_oldValueList)[i]);
|
||||
fillGrid(true);
|
||||
break;
|
||||
|
||||
case kUndoCmd:
|
||||
dbg.writeRAM(myUndoAddress - kRamStart, myUndoValue);
|
||||
myUndoButton->clearFlags(WIDGET_ENABLED);
|
||||
fillGrid(false);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
// TODO - dirty rect, or is it necessary here?
|
||||
|
@ -223,23 +245,31 @@ void RamWidget::handleCommand(CommandSender* sender, int cmd, int data)
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void RamWidget::loadConfig()
|
||||
{
|
||||
fillGrid();
|
||||
fillGrid(true);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void RamWidget::fillGrid()
|
||||
void RamWidget::fillGrid(bool updateOld)
|
||||
{
|
||||
AddrList alist;
|
||||
ValueList vlist;
|
||||
BoolArray changed;
|
||||
|
||||
if(updateOld) _oldValueList->clear();
|
||||
|
||||
Debugger& dbg = instance()->debugger();
|
||||
for(unsigned int i = 0; i < kRamSize; i++)
|
||||
{
|
||||
alist.push_back(kRamStart + i);
|
||||
vlist.push_back(dbg.readRAM(i));
|
||||
if(updateOld) _oldValueList->push_back(dbg.readRAM(i));
|
||||
changed.push_back(dbg.ramChanged(i));
|
||||
}
|
||||
|
||||
myRamGrid->setList(alist, vlist, changed);
|
||||
if(updateOld)
|
||||
{
|
||||
myRevertButton->clearFlags(WIDGET_ENABLED);
|
||||
myUndoButton->clearFlags(WIDGET_ENABLED);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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: RamWidget.hxx,v 1.4 2005-06-22 18:30:44 stephena Exp $
|
||||
// $Id: RamWidget.hxx,v 1.5 2005-07-03 21:14:42 urchlay Exp $
|
||||
//
|
||||
// Based on code from ScummVM - Scumm Interpreter
|
||||
// Copyright (C) 2002-2004 The ScummVM project
|
||||
|
@ -26,11 +26,23 @@ class GuiObject;
|
|||
class ButtonWidget;
|
||||
class StaticTextWidget;
|
||||
class EditTextWidget;
|
||||
class DataGridWidget;
|
||||
|
||||
#include "Array.hxx"
|
||||
#include "Widget.hxx"
|
||||
#include "Command.hxx"
|
||||
#include "DataGridWidget.hxx"
|
||||
|
||||
enum {
|
||||
kRZeroCmd = 'RWze',
|
||||
kRInvertCmd = 'RWiv',
|
||||
kRNegateCmd = 'RWng',
|
||||
kRIncCmd = 'RWic',
|
||||
kRDecCmd = 'RWdc',
|
||||
kRShiftLCmd = 'RWls',
|
||||
kRShiftRCmd = 'RWrs',
|
||||
kUndoCmd = 'RWud',
|
||||
kRevertCmd = 'RWrv'
|
||||
};
|
||||
|
||||
|
||||
class RamWidget : public Widget, public CommandSender
|
||||
|
@ -45,15 +57,22 @@ class RamWidget : public Widget, public CommandSender
|
|||
void loadConfig();
|
||||
|
||||
private:
|
||||
void fillGrid();
|
||||
void fillGrid(bool updateOld);
|
||||
|
||||
private:
|
||||
int myUndoAddress;
|
||||
int myUndoValue;
|
||||
|
||||
Widget* myActiveWidget;
|
||||
|
||||
DataGridWidget* myRamGrid;
|
||||
EditTextWidget* myBinValue;
|
||||
EditTextWidget* myDecValue;
|
||||
EditTextWidget* myLabel;
|
||||
ButtonWidget *myRevertButton;
|
||||
ButtonWidget *myUndoButton;
|
||||
|
||||
ValueList *_oldValueList;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue