First rough pass at adding RomWidget support. It will make use of

CheckListWidget, but that widget is not yet complete either.  Eventually
the CheckListWidget will derive from ListWidget, and the RomWidget
will contain context menus, etc.  For now, it doesn't do anything :)


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@731 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2005-08-22 13:53:23 +00:00
parent e4172891d9
commit 8089f652a5
10 changed files with 721 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: RamWidget.cxx,v 1.9 2005-08-12 17:12:43 stephena Exp $
// $Id: RamWidget.cxx,v 1.10 2005-08-22 13:53:23 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -141,8 +141,8 @@ RamWidget::RamWidget(GuiObject* boss, const GUI::Font& font, int x, int y)
myBinValue->setEditable(false);
// Inputbox which will pop up when searching RAM
xpos = x + lwidth + 20; ypos = y + 2*lineHeight - 5;
myInputBox = new InputTextDialog(boss, font, xpos, ypos);
myInputBox = new InputTextDialog(boss, font,
x + lwidth + 20, y + 2*lineHeight - 5);
myInputBox->setTarget(this);
// Start with these buttons disabled
@ -151,7 +151,7 @@ RamWidget::RamWidget(GuiObject* boss, const GUI::Font& font, int x, int y)
// Calculate real dimensions
_w = lwidth + myRamGrid->getWidth();
_h = ypos + 2*lineHeight - y;
_h = ypos + lineHeight - y;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -0,0 +1,72 @@
//============================================================================
//
// 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: RomWidget.cxx,v 1.1 2005-08-22 13:53:23 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
//============================================================================
#include <sstream>
#include "GuiObject.hxx"
#include "CheckListWidget.hxx"
#include "RomWidget.hxx"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
RomWidget::RomWidget(GuiObject* boss, const GUI::Font& font, int x, int y)
: Widget(boss, x, y, 16, 16),
CommandSender(boss)
{
myRomList = new CheckListWidget(boss, font, x, y, 58, 31);
myRomList->setTarget(this);
addFocusWidget(myRomList);
// Calculate real dimensions
_w = myRomList->getWidth();
_h = myRomList->getHeight();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
RomWidget::~RomWidget()
{
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void RomWidget::handleCommand(CommandSender* sender, int cmd, int data, int id)
{
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void RomWidget::loadConfig()
{
cerr << "RomWidget::loadConfig()\n";
fillGrid();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void RomWidget::fillGrid()
{
StringList l;
for(int i = 0; i < 100; ++i)
{
ostringstream tmp;
tmp << "Test line " << i;
l.push_back(tmp.str());
}
myRomList->setList(l);
}

View File

@ -0,0 +1,50 @@
//============================================================================
//
// 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: RomWidget.hxx,v 1.1 2005-08-22 13:53:23 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
//============================================================================
#ifndef ROM_WIDGET_HXX
#define ROM_WIDGET_HXX
class GuiObject;
class CheckListWidget;
#include "Array.hxx"
#include "Widget.hxx"
#include "Command.hxx"
class RomWidget : public Widget, public CommandSender
{
public:
RomWidget(GuiObject* boss, const GUI::Font& font, int x, int y);
virtual ~RomWidget();
void handleCommand(CommandSender* sender, int cmd, int data, int id);
void loadConfig();
private:
void fillGrid();
private:
CheckListWidget* myRomList;
};
#endif

View File

@ -47,6 +47,7 @@ MODULE_OBJS := \
src/debugger/CpuWidget.o \
src/debugger/PromptWidget.o \
src/debugger/RamWidget.o \
src/debugger/RomWidget.o \
src/debugger/TiaWidget.o
MODULE_DIRS += \

View File

@ -0,0 +1,457 @@
//============================================================================
//
// 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: CheckListWidget.cxx,v 1.1 2005-08-22 13:53:23 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
//============================================================================
#include <cctype>
#include <algorithm>
#include "OSystem.hxx"
#include "Widget.hxx"
#include "ScrollBarWidget.hxx"
#include "Dialog.hxx"
#include "FrameBuffer.hxx"
#include "CheckListWidget.hxx"
#include "bspf.hxx"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CheckListWidget::CheckListWidget(GuiObject* boss, const GUI::Font& font,
int x, int y, int cols, int rows)
: EditableWidget(boss, x, y, 16, 16)
{
_flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS;
setFont(font);
_cols = cols;
_rows = rows;
_colWidth = font.getMaxCharWidth();
_rowHeight = font.getLineHeight();
_w = _cols * _colWidth - kScrollBarWidth;
_h = _rows * _rowHeight + 2;
_editMode = false;
_currentPos = 0;
_selectedItem = -1;
_scrollBar = new ScrollBarWidget(boss, _x + _w, _y, kScrollBarWidth, _h);
_scrollBar->setTarget(this);
_currentKeyDown = 0;
_quickSelectTime = 0;
// The item is selected, thus _bgcolor is used to draw the caret and
// _textcolorhi to erase it
_caretInverse = true;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CheckListWidget::~CheckListWidget()
{
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckListWidget::setSelected(int item)
{
assert(item >= -1 && item < (int)_list.size());
if (isEnabled() && _selectedItem != item)
{
if (_editMode)
abortEditMode();
_selectedItem = item;
sendCommand(kListSelectionChangedCmd, _selectedItem, _id);
_currentPos = _selectedItem - _rows / 2;
scrollToCurrent();
setDirty(); draw();
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckListWidget::setList(const StringList& list)
{
int size = list.size();
_list = list;
if (_currentPos >= size)
_currentPos = size - 1;
if (_currentPos < 0)
_currentPos = 0;
_selectedItem = -1;
_editMode = false;
scrollBarRecalc();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckListWidget::scrollTo(int item)
{
int size = _list.size();
if (item >= size)
item = size - 1;
if (item < 0)
item = 0;
if (_currentPos != item)
{
_currentPos = item;
scrollBarRecalc();
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckListWidget::scrollBarRecalc()
{
_scrollBar->_numEntries = _list.size();
_scrollBar->_entriesPerPage = _rows;
_scrollBar->_currentPos = _currentPos;
_scrollBar->recalc();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckListWidget::handleMouseDown(int x, int y, int button, int clickCount)
{
if (!isEnabled())
return;
// First check whether the selection changed
int newSelectedItem;
newSelectedItem = findItem(x, y);
if (newSelectedItem > (int)_list.size() - 1)
newSelectedItem = -1;
if (_selectedItem != newSelectedItem)
{
if (_editMode)
abortEditMode();
_selectedItem = newSelectedItem;
sendCommand(kListSelectionChangedCmd, _selectedItem, _id);
setDirty(); draw();
}
// TODO: Determine where inside the string the user clicked and place the
// caret accordingly. See _editScrollOffset and EditTextWidget::handleMouseDown.
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckListWidget::handleMouseUp(int x, int y, int button, int clickCount)
{
// If this was a double click and the mouse is still over the selected item,
// send the double click command
if (clickCount == 2 && (_selectedItem == findItem(x, y)))
{
sendCommand(kListItemDoubleClickedCmd, _selectedItem, _id);
// Start edit mode
if(_editable && !_editMode)
startEditMode();
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckListWidget::handleMouseWheel(int x, int y, int direction)
{
_scrollBar->handleMouseWheel(x, y, direction);
setDirty(); draw();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int CheckListWidget::findItem(int x, int y) const
{
return (y - 1) / _rowHeight + _currentPos;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
static bool matchingCharsIgnoringCase(string s, string pattern)
{
// Make the strings uppercase so we can compare them
transform(s.begin(), s.end(), s.begin(), (int(*)(int)) toupper);
transform(pattern.begin(), pattern.end(), pattern.begin(), (int(*)(int)) toupper);
// Make sure that if the pattern is found, it occurs at the start of 's'
return (s.find(pattern, 0) == string::size_type(0));
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool CheckListWidget::handleKeyDown(int ascii, int keycode, int modifiers)
{
// Ignore all mod keys
if(instance()->eventHandler().kbdControl(modifiers) ||
instance()->eventHandler().kbdAlt(modifiers))
return true;
bool handled = true;
bool dirty = false;
int oldSelectedItem = _selectedItem;
if (!_editMode && isalnum((char)ascii))
{
// Quick selection mode: Go to first list item starting with this key
// (or a substring accumulated from the last couple key presses).
// Only works in a useful fashion if the list entries are sorted.
// TODO: Maybe this should be off by default, and instead we add a
// method "enableQuickSelect()" or so ?
int time = instance()->getTicks() / 1000;
if (_quickSelectTime < time)
_quickSelectStr = (char)ascii;
else
_quickSelectStr += (char)ascii;
_quickSelectTime = time + 300;
// FIXME: This is bad slow code (it scans the list linearly each time a
// key is pressed); it could be much faster. Only of importance if we have
// quite big lists to deal with -- so for now we can live with this lazy
// implementation :-)
int newSelectedItem = 0;
for (StringList::const_iterator i = _list.begin(); i != _list.end(); ++i)
{
const bool match = matchingCharsIgnoringCase(*i, _quickSelectStr);
if (match)
{
_selectedItem = newSelectedItem;
break;
}
newSelectedItem++;
}
scrollToCurrent();
}
else if (_editMode)
{
// Class EditableWidget handles all text editing related key presses for us
handled = EditableWidget::handleKeyDown(ascii, keycode, modifiers);
}
else
{
// not editmode
switch (keycode)
{
case '\n': // enter/return
case '\r':
if (_selectedItem >= 0)
{
// override continuous enter keydown
if (_editable && (_currentKeyDown != '\n' && _currentKeyDown != '\r'))
{
dirty = true;
startEditMode();
}
else
sendCommand(kListItemActivatedCmd, _selectedItem, _id);
}
break;
case 256+17: // up arrow
if (_selectedItem > 0)
_selectedItem--;
break;
case 256+18: // down arrow
if (_selectedItem < (int)_list.size() - 1)
_selectedItem++;
break;
case 256+24: // pageup
_selectedItem -= _rows - 1;
if (_selectedItem < 0)
_selectedItem = 0;
break;
case 256+25: // pagedown
_selectedItem += _rows - 1;
if (_selectedItem >= (int)_list.size() )
_selectedItem = _list.size() - 1;
break;
case 256+22: // home
_selectedItem = 0;
break;
case 256+23: // end
_selectedItem = _list.size() - 1;
break;
default:
handled = false;
}
scrollToCurrent();
}
if (_selectedItem != oldSelectedItem)
{
sendCommand(kListSelectionChangedCmd, _selectedItem, _id);
// also draw scrollbar
_scrollBar->draw();
setDirty(); draw();
}
_currentKeyDown = keycode;
return handled;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool CheckListWidget::handleKeyUp(int ascii, int keycode, int modifiers)
{
if (keycode == _currentKeyDown)
_currentKeyDown = 0;
return true;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckListWidget::lostFocusWidget()
{
_editMode = false;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckListWidget::handleCommand(CommandSender* sender, int cmd, int data, int id)
{
switch (cmd)
{
case kSetPositionCmd:
if (_currentPos != (int)data)
{
_currentPos = data;
setDirty(); draw();
}
break;
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckListWidget::drawWidget(bool hilite)
{
//cerr << "CheckListWidget::drawWidget\n";
FrameBuffer& fb = _boss->instance()->frameBuffer();
int i, pos, len = _list.size();
string buffer;
int deltax;
// Draw a thin frame around the list.
fb.hLine(_x, _y, _x + _w - 1, kColor);
fb.hLine(_x, _y + _h - 1, _x + _w - 1, kShadowColor);
fb.vLine(_x, _y, _y + _h - 1, kColor);
// Draw the list items
for (i = 0, pos = _currentPos; i < _rows && pos < len; i++, pos++)
{
const OverlayColor textColor = (_selectedItem == pos && _editMode)
? kColor : kTextColor;
const int y = _y + 2 + _rowHeight * i;
// Draw the selected item inverted, on a highlighted background.
if (_selectedItem == pos)
{
if (_hasFocus && !_editMode)
fb.fillRect(_x + 1, _y + 1 + _rowHeight * i, _w - 1, _rowHeight, kTextColorHi);
else
fb.frameRect(_x + 1, _y + 1 + _rowHeight * i, _w - 1, _rowHeight, kTextColorHi);
}
GUI::Rect r(getEditRect());
if (_selectedItem == pos && _editMode)
{
buffer = _editString;
adjustOffset();
deltax = -_editScrollOffset;
fb.drawString(_font, buffer, _x + r.left, y, r.width(), kTextColor,
kTextAlignLeft, deltax, false);
}
else
{
buffer = _list[pos];
deltax = 0;
fb.drawString(_font, buffer, _x + r.left, y, r.width(), kTextColor);
}
}
// Only draw the caret while editing, and if it's in the current viewport
if(_editMode && (_selectedItem >= _scrollBar->_currentPos) &&
(_selectedItem < _scrollBar->_currentPos + _rows))
drawCaret();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
GUI::Rect CheckListWidget::getEditRect() const
{
GUI::Rect r(2, 1, _w - 2 , _rowHeight);
const int offset = (_selectedItem - _currentPos) * _rowHeight;
r.top += offset;
r.bottom += offset;
return r;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckListWidget::scrollToCurrent()
{
// Only do something if the current item is not in our view port
if (_selectedItem < _currentPos)
{
// it's above our view
_currentPos = _selectedItem;
}
else if (_selectedItem >= _currentPos + _rows)
{
// it's below our view
_currentPos = _selectedItem - _rows + 1;
}
if (_currentPos < 0 || _rows > (int)_list.size())
_currentPos = 0;
else if (_currentPos + _rows > (int)_list.size())
_currentPos = _list.size() - _rows;
_scrollBar->_currentPos = _currentPos;
_scrollBar->recalc();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckListWidget::startEditMode()
{
if (_editable && !_editMode && _selectedItem >= 0)
{
_editMode = true;
setEditString(_list[_selectedItem]);
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckListWidget::endEditMode()
{
if (!_editMode)
return;
// send a message that editing finished with a return/enter key press
_editMode = false;
_list[_selectedItem] = _editString;
sendCommand(kListItemDataChangedCmd, _selectedItem, _id);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckListWidget::abortEditMode()
{
// undo any changes made
assert(_selectedItem >= 0);
_editMode = false;
}

View File

@ -0,0 +1,105 @@
//============================================================================
//
// 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: CheckListWidget.hxx,v 1.1 2005-08-22 13:53:23 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
//============================================================================
#ifndef CHECK_LIST_WIDGET_HXX
#define CHECK_LIST_WIDGET_HXX
#include "GuiObject.hxx"
#include "Widget.hxx"
#include "Command.hxx"
#include "StringList.hxx"
#include "EditableWidget.hxx"
#include "Rect.hxx"
class ScrollBarWidget;
// Some special commands
enum {
kListItemChecked = 'LIct',
kListItemDoubleClickedCmd = 'LIdb', // double click on item - 'data' will be item index
kListItemActivatedCmd = 'LIac', // item activated by return/enter - 'data' will be item index
kListItemDataChangedCmd = 'LIch', // item data changed - 'data' will be item index
kListSelectionChangedCmd = 'Lsch' // selection changed - 'data' will be item index
};
/* CheckListWidget */
class CheckListWidget : public EditableWidget
{
public:
CheckListWidget(GuiObject* boss, const GUI::Font& font,
int x, int y, int cols, int rows);
virtual ~CheckListWidget();
void setList(const StringList& list);
const StringList& getList() const { return _list; }
int getSelected() const { return _selectedItem; }
void setSelected(int item);
const string& getSelectedString() const { return _list[_selectedItem]; }
void scrollTo(int item);
virtual void handleMouseDown(int x, int y, int button, int clickCount);
virtual void handleMouseUp(int x, int y, int button, int clickCount);
virtual void handleMouseWheel(int x, int y, int direction);
virtual bool handleKeyDown(int ascii, int keycode, int modifiers);
virtual bool handleKeyUp(int ascii, int keycode, int modifiers);
virtual void handleCommand(CommandSender* sender, int cmd, int data, int id);
virtual bool wantsFocus() { return true; }
void startEditMode();
void endEditMode();
protected:
void drawWidget(bool hilite);
int findItem(int x, int y) const;
void scrollBarRecalc();
void abortEditMode();
GUI::Rect getEditRect() const;
void lostFocusWidget();
void scrollToCurrent();
protected:
int _rows;
int _cols;
int _rowHeight;
int _colWidth;
int _currentPos;
int _selectedItem;
StringList _list;
BoolArray _checkList;
bool _editMode;
ScrollBarWidget* _scrollBar;
int _currentKeyDown;
string _backupString;
string _quickSelectStr;
int _quickSelectTime;
};
#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: DebuggerDialog.cxx,v 1.34 2005-08-11 21:57:30 stephena Exp $
// $Id: DebuggerDialog.cxx,v 1.35 2005-08-22 13:53:23 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -27,6 +27,7 @@
#include "PromptWidget.hxx"
#include "CpuWidget.hxx"
#include "RamWidget.hxx"
#include "RomWidget.hxx"
#include "TiaWidget.hxx"
#include "DataGridOpsWidget.hxx"
#include "Rect.hxx"
@ -68,6 +69,7 @@ cerr << " ==> DebuggerDialog::loadConfig()\n";
myTiaOutput->loadConfig();
myCpu->loadConfig();
myRam->loadConfig();
myRom->loadConfig();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -168,6 +170,8 @@ void DebuggerDialog::addStatusArea()
{
GUI::Rect r = instance()->debugger().getStatusBounds();
myTiaInfo = new TiaInfoWidget(this, r.left, r.top, r.width(), r.height());
// FIXME - remove width and height from TiaInfo, let it figure out its
// own dimensions
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -176,36 +180,37 @@ void DebuggerDialog::addRomArea()
GUI::Rect r = instance()->debugger().getRomBounds();
int xpos, ypos;
xpos = r.left + 10; ypos = 10;
xpos = r.left + 10; ypos = 10;
myCpu = new CpuWidget(this, instance()->consoleFont(), xpos, ypos);
addToFocusList(myCpu->getFocusList());
xpos = r.left + 10; ypos += myCpu->getHeight() + 10;
xpos = r.left + 10; ypos += myCpu->getHeight() + 10;
myRam = new RamWidget(this, instance()->consoleFont(), xpos, ypos);
addToFocusList(myRam->getFocusList());
xpos = r.left + 10 + myCpu->getWidth() + 20; ypos = 20;
DataGridOpsWidget* ops = new DataGridOpsWidget(this, xpos, ypos);
xpos = r.left + 10 + myCpu->getWidth() + 20;
DataGridOpsWidget* ops = new DataGridOpsWidget(this, xpos, 20);
ops->setEnabled(false);
int buttonX = r.right - kButtonWidth - 5, buttonY = r.top + 5;
addButton(buttonX, buttonY, "Step", kDDStepCmd, 0);
buttonY += 22;
addButton(buttonX, buttonY, "Trace", kDDTraceCmd, 0);
buttonY += 22;
addButton(buttonX, buttonY, "Scan +1", kDDSAdvCmd, 0);
buttonY += 22;
addButton(buttonX, buttonY, "Frame +1", kDDAdvCmd, 0);
buttonY += 22;
addButton(buttonX, buttonY, "Exit", kDDExitCmd, 0);
xpos = r.left + 10; ypos += myRam->getHeight() + 15;
myRom = new RomWidget(this, instance()->consoleFont(), xpos, ypos);
addToFocusList(myRom->getFocusList());
// Add the DataGridOpsWidget to any widgets which contain a
// DataGridWidget which we want controlled
myCpu->setOpsWidget(ops);
myRam->setOpsWidget(ops);
// Add some buttons that are always shown, no matter which tab we're in
// FIXME - these positions will definitely change
xpos = r.right - 100; ypos = r.bottom - 150;
addButton(xpos, ypos, "Step", kDDStepCmd, 0);
ypos += 22;
addButton(xpos, ypos, "Trace", kDDTraceCmd, 0);
ypos += 22;
addButton(xpos, ypos, "Scan +1", kDDSAdvCmd, 0);
ypos += 22;
addButton(xpos, ypos, "Frame +1", kDDAdvCmd, 0);
addButton(xpos, r.bottom - 22 - 10, "Exit", kDDExitCmd, 0);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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: DebuggerDialog.hxx,v 1.16 2005-08-10 12:23:42 stephena Exp $
// $Id: DebuggerDialog.hxx,v 1.17 2005-08-22 13:53:23 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -27,6 +27,7 @@ class OSystem;
class DialogContainer;
class CpuWidget;
class RamWidget;
class RomWidget;
class TabWidget;
class TiaInfoWidget;
class TiaOutputWidget;
@ -57,6 +58,7 @@ class DebuggerDialog : public Dialog
TiaOutputWidget* myTiaOutput;
CpuWidget* myCpu;
RamWidget* myRam;
RomWidget* myRom;
private:
void addTiaArea();

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: Widget.hxx,v 1.30 2005-08-19 15:05:09 stephena Exp $
// $Id: Widget.hxx,v 1.31 2005-08-22 13:53:23 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -71,7 +71,7 @@ enum {
This is the base class for all widgets.
@author Stephen Anthony
@version $Id: Widget.hxx,v 1.30 2005-08-19 15:05:09 stephena Exp $
@version $Id: Widget.hxx,v 1.31 2005-08-22 13:53:23 stephena Exp $
*/
class Widget : public GuiObject
{
@ -231,6 +231,8 @@ class CheckboxWidget : public ButtonWidget
void toggleState() { setState(!_state); }
bool getState() const { return _state; }
static int boxWidth() { return 14; }
protected:
void drawWidget(bool hilite);

View File

@ -4,6 +4,7 @@ MODULE_OBJS := \
src/gui/AboutDialog.o \
src/gui/AudioDialog.o \
src/gui/BrowserDialog.o \
src/gui/CheckListWidget.o \
src/gui/ColorWidget.o \
src/gui/CheatCodeDialog.o \
src/gui/DataGridWidget.o \