Added keyboard selection and navigation to checkbuttons (use space or

return key to toggle a selected checkbox).  Generally cleaned up
the CheckboxWidget class, so that it centers vertically based on
box/font size, and correctly determines its own size.

Added all P0/P1 info from 'tia' command to the TIA tab.  Some work
is still required on the NUSIZx registers, though.  I expect the
remainder of the TIA tab will be completed quickly, now that most
of the infrastructure is in place.  Still TODO is add methods to
TIADebug to enable/disable collisions.


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@720 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2005-08-16 18:34:12 +00:00
parent e48cc40e14
commit e0bdb3512f
16 changed files with 420 additions and 82 deletions

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: Debugger.cxx,v 1.82 2005-08-15 18:52:15 stephena Exp $ // $Id: Debugger.cxx,v 1.83 2005-08-16 18:34:12 stephena Exp $
//============================================================================ //============================================================================
#include "bspf.hxx" #include "bspf.hxx"
@ -341,13 +341,17 @@ const string Debugger::valueToString(int value, BaseFormat outputBase)
sprintf(rendered, "%5d", value); sprintf(rendered, "%5d", value);
break; break;
case kBASE_16_4:
sprintf(rendered, Debugger::to_hex_4(value));
break;
case kBASE_16: case kBASE_16:
default: default:
if(value < 0x100) if(value < 0x100)
sprintf(rendered, Debugger::to_hex_8(value)); sprintf(rendered, Debugger::to_hex_8(value));
else else
sprintf(rendered, Debugger::to_hex_16(value)); sprintf(rendered, Debugger::to_hex_16(value));
break; break;
} }
return string(rendered); return string(rendered);

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: DebuggerParser.hxx,v 1.40 2005-07-30 22:08:25 urchlay Exp $ // $Id: DebuggerParser.hxx,v 1.41 2005-08-16 18:34:12 stephena Exp $
//============================================================================ //============================================================================
#ifndef DEBUGGER_PARSER_HXX #ifndef DEBUGGER_PARSER_HXX
@ -27,6 +27,7 @@ struct Command;
typedef enum { typedef enum {
kBASE_16, kBASE_16,
kBASE_16_4,
kBASE_10, kBASE_10,
kBASE_2, kBASE_2,
kBASE_DEFAULT kBASE_DEFAULT

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: TIADebug.cxx,v 1.17 2005-08-15 18:52:15 stephena Exp $ // $Id: TIADebug.cxx,v 1.18 2005-08-16 18:34:12 stephena Exp $
//============================================================================ //============================================================================
#include "System.hxx" #include "System.hxx"
@ -78,8 +78,13 @@ DebuggerState& TIADebug::getState()
myState.pf.push_back(pf1()); myState.pf.push_back(pf1());
myState.pf.push_back(pf2()); myState.pf.push_back(pf2());
myState.refP0 = refP0(); myState.delP0 = vdelP0(); // Reflect and delay registers
myState.refP1 = refP1(); myState.delP1 = vdelP1(); myState.refP0 = refP0(); myState.vdelP0 = vdelP0();
myState.refP1 = refP1(); myState.vdelP1 = vdelP1();
// NUSIZ registers
myState.nusiz.push_back(nusiz0());
myState.nusiz.push_back(nusiz1());
return myState; return myState;
} }
@ -124,6 +129,15 @@ void TIADebug::saveOldState()
myOldState.pf.push_back(pf0()); myOldState.pf.push_back(pf0());
myOldState.pf.push_back(pf1()); myOldState.pf.push_back(pf1());
myOldState.pf.push_back(pf2()); myOldState.pf.push_back(pf2());
// Reflect and delay registers
myOldState.refP0 = refP0(); myOldState.vdelP0 = vdelP0();
myOldState.refP1 = refP1(); myOldState.vdelP1 = vdelP1();
// NUSIZ registers
myOldState.nusiz.push_back(nusiz0());
myOldState.nusiz.push_back(nusiz1());
} }
/* the set methods now use mySystem->poke(). This will save us the /* the set methods now use mySystem->poke(). This will save us the
@ -365,7 +379,7 @@ uInt8 TIADebug::nusiz0(int newVal)
if(newVal > -1) if(newVal > -1)
mySystem->poke(NUSIZ0, newVal); mySystem->poke(NUSIZ0, newVal);
return myTIA->myGRP0; return myTIA->myNUSIZ0;
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -374,7 +388,7 @@ uInt8 TIADebug::nusiz1(int newVal)
if(newVal > -1) if(newVal > -1)
mySystem->poke(NUSIZ1, newVal); mySystem->poke(NUSIZ1, newVal);
return myTIA->myGRP1; return myTIA->myNUSIZ1;
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -658,7 +672,7 @@ string TIADebug::state()
ret += " "; ret += " ";
ret += booleanWithLabel("reflect", state.refP0); ret += booleanWithLabel("reflect", state.refP0);
ret += " "; ret += " ";
ret += booleanWithLabel("delay", state.delP0); ret += booleanWithLabel("delay", state.vdelP0);
ret += "\n"; ret += "\n";
ret += "P1: GR="; ret += "P1: GR=";
@ -674,7 +688,7 @@ string TIADebug::state()
ret += " "; ret += " ";
ret += booleanWithLabel("reflect", state.refP1); ret += booleanWithLabel("reflect", state.refP1);
ret += " "; ret += " ";
ret += booleanWithLabel("delay", state.delP1); ret += booleanWithLabel("delay", state.vdelP1);
ret += "\n"; ret += "\n";
ret += "M0: "; ret += "M0: ";

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: TIADebug.hxx,v 1.15 2005-08-15 18:52:15 stephena Exp $ // $Id: TIADebug.hxx,v 1.16 2005-08-16 18:34:12 stephena Exp $
//============================================================================ //============================================================================
#ifndef TIA_DEBUG_HXX #ifndef TIA_DEBUG_HXX
@ -95,9 +95,10 @@ class TiaState : public DebuggerState
IntArray pos; IntArray pos;
IntArray hm; IntArray hm;
IntArray pf; IntArray pf;
IntArray nusiz;
bool refP0, delP0; bool refP0, vdelP0;
bool refP1, delP1; bool refP1, vdelP1;
}; };
class TIADebug : public DebuggerSystem class TIADebug : public DebuggerSystem

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: TiaInfoWidget.cxx,v 1.2 2005-08-10 12:23:42 stephena Exp $ // $Id: TiaInfoWidget.cxx,v 1.3 2005-08-16 18:34:12 stephena Exp $
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
@ -35,7 +35,7 @@ TiaInfoWidget::TiaInfoWidget(GuiObject* boss, int x, int y, int w, int h)
CommandSender(boss) CommandSender(boss)
{ {
int xpos = x, ypos = y, lwidth = 45; int xpos = x, ypos = y, lwidth = 45;
const GUI::Font& font = instance()->consoleFont(); const GUI::Font& font = instance()->font();
// Add frame info // Add frame info
xpos = x + 10; ypos = y + 10; xpos = x + 10; ypos = y + 10;
@ -53,11 +53,11 @@ TiaInfoWidget::TiaInfoWidget(GuiObject* boss, int x, int y, int w, int h)
myFrameCycles->setEditable(false); myFrameCycles->setEditable(false);
xpos = x + 20; ypos += kLineHeight + 5; xpos = x + 20; ypos += kLineHeight + 5;
myVSync = new CheckboxWidget(boss, xpos, ypos-3, 25, kLineHeight, "VSync", 0); myVSync = new CheckboxWidget(boss, font, xpos, ypos-3, "VSync", 0);
myVSync->setEditable(false); myVSync->setEditable(false);
xpos = x + 20; ypos += kLineHeight + 5; xpos = x + 20; ypos += kLineHeight + 5;
myVBlank = new CheckboxWidget(boss, xpos, ypos-3, 30, kLineHeight, "VBlank", 0); myVBlank = new CheckboxWidget(boss, font, xpos, ypos-3, "VBlank", 0);
myVBlank->setEditable(false); myVBlank->setEditable(false);
xpos = x + 10 + 100; ypos = y + 10; xpos = x + 10 + 100; ypos = y + 10;

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: TiaWidget.cxx,v 1.5 2005-08-15 18:52:15 stephena Exp $ // $Id: TiaWidget.cxx,v 1.6 2005-08-16 18:34:12 stephena Exp $
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
@ -34,10 +34,20 @@
// ID's for the various widgets // ID's for the various widgets
// We need ID's, since there are more than one of several types of widgets // We need ID's, since there are more than one of several types of widgets
enum { enum {
kRamID = 'TWra', kRamID,
kColorRegsID = 'TWcr', kColorRegsID,
kVSyncID = 'TWvs', kGRP0ID,
kVBlankID = 'TWvb' kGRP1ID,
kPosP0ID,
kPosP1ID,
kHMP0ID,
kHMP1ID,
kRefP0ID,
kRefP1ID,
kDelP0ID,
kDelP1ID,
kNusizP0ID,
kNusizP1ID
}; };
// Color registers // Color registers
@ -54,9 +64,10 @@ TiaWidget::TiaWidget(GuiObject* boss, int x, int y, int w, int h)
CommandSender(boss) CommandSender(boss)
{ {
const GUI::Font& font = instance()->consoleFont(); const GUI::Font& font = instance()->consoleFont();
const int fontWidth = font.getMaxCharWidth(),
fontHeight = font.getFontHeight(),
lineHeight = font.getLineHeight();
int xpos = 10, ypos = 25, lwidth = 4 * font.getMaxCharWidth(); int xpos = 10, ypos = 25, lwidth = 4 * font.getMaxCharWidth();
int fontHeight = font.getFontHeight(), lineHeight = font.getLineHeight();
int fontWidth = font.getMaxCharWidth();
StaticTextWidget* t; StaticTextWidget* t;
// Create a 16x1 grid holding byte values with labels // Create a 16x1 grid holding byte values with labels
@ -145,18 +156,7 @@ TiaWidget::TiaWidget(GuiObject* boss, int x, int y, int w, int h)
myCOLUBKColor = new ColorWidget(boss, xpos, ypos+2, 20, lineHeight - 4); myCOLUBKColor = new ColorWidget(boss, xpos, ypos+2, 20, lineHeight - 4);
myCOLUBKColor->setTarget(this); myCOLUBKColor->setTarget(this);
// P0 register info // Set the strings to be used in the grPx registers
xpos = 10; ypos += 2*lineHeight;
t = new StaticTextWidget(boss, xpos, ypos+2,
7*fontWidth, fontHeight,
"P0/ GR:", kTextAlignLeft);
t->setFont(font);
xpos += 7*fontWidth + 5;
myGRP0 = new ToggleBitWidget(boss, font, xpos, ypos, 8, 1);
myGRP0->setTarget(this);
addFocusWidget(myGRP0);
// Set the strings to be used in the PSRegister
// We only do this once because it's the state that changes, not the strings // We only do this once because it's the state that changes, not the strings
const char* offstr[] = { "0", "0", "0", "0", "0", "0", "0", "0" }; const char* offstr[] = { "0", "0", "0", "0", "0", "0", "0", "0" };
const char* onstr[] = { "1", "1", "1", "1", "1", "1", "1", "1" }; const char* onstr[] = { "1", "1", "1", "1", "1", "1", "1", "1" };
@ -166,7 +166,157 @@ TiaWidget::TiaWidget(GuiObject* boss, int x, int y, int w, int h)
off.push_back(offstr[i]); off.push_back(offstr[i]);
on.push_back(onstr[i]); on.push_back(onstr[i]);
} }
////////////////////////////
// P0 register info
////////////////////////////
// grP0
xpos = 10; ypos += 2*lineHeight;
t = new StaticTextWidget(boss, xpos, ypos+2,
7*fontWidth, fontHeight,
"P0/ GR:", kTextAlignLeft);
t->setFont(font);
xpos += 7*fontWidth + 5;
myGRP0 = new ToggleBitWidget(boss, font, xpos, ypos, 8, 1);
myGRP0->setList(off, on); myGRP0->setList(off, on);
myGRP0->setTarget(this);
myGRP0->setID(kGRP0ID);
addFocusWidget(myGRP0);
// posP0
xpos += myGRP0->getWidth() + 8;
t = new StaticTextWidget(boss, xpos, ypos+2,
4*fontWidth, fontHeight,
"Pos:", kTextAlignLeft);
t->setFont(font);
xpos += 4*fontWidth + 5;
myPosP0 = new DataGridWidget(boss, font, xpos, ypos,
1, 1, 2, 8, kBASE_16);
myPosP0->setTarget(this);
myPosP0->setID(kPosP0ID);
addFocusWidget(myPosP0);
// hmP0
xpos += myPosP0->getWidth() + 8;
t = new StaticTextWidget(boss, xpos, ypos+2,
3*fontWidth, fontHeight,
"HM:", kTextAlignLeft);
t->setFont(font);
xpos += 3*fontWidth + 5;
myHMP0 = new DataGridWidget(boss, font, xpos, ypos,
1, 1, 1, 4, kBASE_16_4);
myHMP0->setTarget(this);
myHMP0->setID(kHMP0ID);
addFocusWidget(myHMP0);
// P0 reflect and delay
xpos += myHMP0->getWidth() + 10;
myRefP0 = new CheckboxWidget(boss, font, xpos, ypos+1, "Reflect", kCheckActionCmd);
myRefP0->setFont(font);
myRefP0->setTarget(this);
myRefP0->setID(kRefP0ID);
addFocusWidget(myRefP0);
xpos += myRefP0->getWidth() + 10;
myDelP0 = new CheckboxWidget(boss, font, xpos, ypos+1, "Delay", kCheckActionCmd);
myDelP0->setFont(font);
myDelP0->setTarget(this);
myDelP0->setID(kDelP0ID);
addFocusWidget(myDelP0);
// NUSIZ0
xpos = 10 + lwidth; ypos += myGRP0->getHeight() + 2;
t = new StaticTextWidget(boss, xpos, ypos+2,
7*fontWidth, fontHeight,
"NUSIZ0:", kTextAlignLeft);
t->setFont(font);
xpos += 7*fontWidth + 5;
myNusiz0 = new DataGridWidget(boss, font, xpos, ypos,
1, 1, 1, 3, kBASE_16_4);
myNusiz0->setTarget(this);
myNusiz0->setID(kNusizP0ID);
addFocusWidget(myNusiz0);
xpos += myNusiz0->getWidth() + 5;
myNusiz0Text = new EditTextWidget(boss, xpos, ypos+1, 23*fontWidth, lineHeight, "");
myNusiz0Text->setFont(font);
myNusiz0Text->setEditable(false);
////////////////////////////
// P1 register info
////////////////////////////
// grP1
xpos = 10; ypos += 2*lineHeight;
t = new StaticTextWidget(boss, xpos, ypos+2,
7*fontWidth, fontHeight,
"P1/ GR:", kTextAlignLeft);
t->setFont(font);
xpos += 7*fontWidth + 5;
myGRP1 = new ToggleBitWidget(boss, font, xpos, ypos, 8, 1);
myGRP1->setList(off, on);
myGRP1->setTarget(this);
myGRP1->setID(kGRP1ID);
addFocusWidget(myGRP1);
// posP1
xpos += myGRP1->getWidth() + 8;
t = new StaticTextWidget(boss, xpos, ypos+2,
4*fontWidth, fontHeight,
"Pos:", kTextAlignLeft);
t->setFont(font);
xpos += 4*fontWidth + 5;
myPosP1 = new DataGridWidget(boss, font, xpos, ypos,
1, 1, 2, 8, kBASE_16);
myPosP1->setTarget(this);
myPosP1->setID(kPosP1ID);
addFocusWidget(myPosP1);
// hmP1
xpos += myPosP1->getWidth() + 8;
t = new StaticTextWidget(boss, xpos, ypos+2,
3*fontWidth, fontHeight,
"HM:", kTextAlignLeft);
t->setFont(font);
xpos += 3*fontWidth + 5;
myHMP1 = new DataGridWidget(boss, font, xpos, ypos,
1, 1, 1, 4, kBASE_16_4);
myHMP1->setTarget(this);
myHMP1->setID(kHMP1ID);
addFocusWidget(myHMP1);
// P1 reflect and delay
xpos += myHMP1->getWidth() + 10;
myRefP1 = new CheckboxWidget(boss, font, xpos, ypos+1, "Reflect", kCheckActionCmd);
myRefP1->setFont(font);
myRefP1->setTarget(this);
myRefP1->setID(kRefP1ID);
addFocusWidget(myRefP1);
xpos += myRefP1->getWidth() + 10;
myDelP1 = new CheckboxWidget(boss, font, xpos, ypos+1, "Delay", kCheckActionCmd);
myDelP1->setFont(font);
myDelP1->setTarget(this);
myDelP1->setID(kDelP1ID);
addFocusWidget(myDelP1);
// NUSIZ1
xpos = 10 + lwidth; ypos += myGRP1->getHeight() + 2;
t = new StaticTextWidget(boss, xpos, ypos+2,
7*fontWidth, fontHeight,
"NUSIZ1:", kTextAlignLeft);
t->setFont(font);
xpos += 7*fontWidth + 5;
myNusiz1 = new DataGridWidget(boss, font, xpos, ypos,
1, 1, 1, 3, kBASE_16_4);
myNusiz1->setTarget(this);
myNusiz1->setID(kNusizP1ID);
addFocusWidget(myNusiz1);
xpos += myNusiz1->getWidth() + 5;
myNusiz1Text = new EditTextWidget(boss, xpos, ypos+1, 23*fontWidth, lineHeight, "");
myNusiz1Text->setFont(font);
myNusiz1Text->setEditable(false);
} }
@ -178,13 +328,14 @@ TiaWidget::~TiaWidget()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void TiaWidget::handleCommand(CommandSender* sender, int cmd, int data, int id) void TiaWidget::handleCommand(CommandSender* sender, int cmd, int data, int id)
{ {
// We simply change the values in the ByteGridWidget // We simply change the values in the DataGridWidget
// It will then send the 'kDGItemDataChangedCmd' signal to change the actual // It will then send the 'kDGItemDataChangedCmd' signal to change the actual
// memory location // memory location
int addr, value; int addr, value;
string buf; string buf;
Debugger& dbg = instance()->debugger(); Debugger& dbg = instance()->debugger();
TIADebug& tia = dbg.tiaDebug();
switch(cmd) switch(cmd)
{ {
@ -195,13 +346,51 @@ void TiaWidget::handleCommand(CommandSender* sender, int cmd, int data, int id)
changeColorRegs(); changeColorRegs();
break; break;
case kPosP0ID:
tia.posP0(myPosP0->getSelectedValue());
break;
case kPosP1ID:
tia.posP1(myPosP1->getSelectedValue());
break;
case kHMP0ID:
tia.hmP0(myHMP0->getSelectedValue());
break;
case kHMP1ID:
tia.hmP1(myHMP1->getSelectedValue());
break;
case kNusizP0ID:
tia.nusiz0(myNusiz0->getSelectedValue());
myNusiz0Text->setEditString(tia.nusiz0String());
break;
case kNusizP1ID:
tia.nusiz1(myNusiz1->getSelectedValue());
myNusiz1Text->setEditString(tia.nusiz1String());
break;
default: default:
cerr << "TiaWidget DG changed\n"; cerr << "TiaWidget DG changed\n";
break; break;
} }
// FIXME - maybe issue a full reload, since changing one item can affect break;
// others in this tab??
// loadConfig(); case kTBItemDataChangedCmd:
switch(id)
{
case kGRP0ID:
value = convertBoolToInt(myGRP0->getState());
tia.grP0(value);
break;
case kGRP1ID:
value = convertBoolToInt(myGRP1->getState());
tia.grP1(value);
break;
}
break; break;
case kDGSelectionChangedCmd: case kDGSelectionChangedCmd:
@ -222,12 +411,20 @@ void TiaWidget::handleCommand(CommandSender* sender, int cmd, int data, int id)
case kCheckActionCmd: case kCheckActionCmd:
switch(id) switch(id)
{ {
case kVSyncID: case kRefP0ID:
cerr << "vsync toggled\n"; tia.refP0(myRefP0->getState() ? 1 : 0);
break; break;
case kVBlankID: case kRefP1ID:
cerr << "vblank toggled\n"; tia.refP1(myRefP1->getState() ? 1 : 0);
break;
case kDelP0ID:
tia.vdelP0(myDelP0->getState() ? 1 : 0);
break;
case kDelP1ID:
tia.vdelP1(myDelP1->getState() ? 1 : 0);
break; break;
} }
break; break;
@ -246,7 +443,7 @@ void TiaWidget::fillGrid()
{ {
IntArray alist; IntArray alist;
IntArray vlist; IntArray vlist;
BoolArray orig, changed; BoolArray orig, changed, grNew, grOld;
Debugger& dbg = instance()->debugger(); Debugger& dbg = instance()->debugger();
TIADebug& tia = dbg.tiaDebug(); TIADebug& tia = dbg.tiaDebug();
@ -278,8 +475,11 @@ void TiaWidget::fillGrid()
myCOLUPFColor->setColor(state.coluRegs[2]); myCOLUPFColor->setColor(state.coluRegs[2]);
myCOLUBKColor->setColor(state.coluRegs[3]); myCOLUBKColor->setColor(state.coluRegs[3]);
// GRP0 register ////////////////////////////
BoolArray grNew, grOld; // P0 register info
////////////////////////////
// grP0
grNew.clear(); grOld.clear();
convertCharToBool(grNew, state.gr[P0]); convertCharToBool(grNew, state.gr[P0]);
convertCharToBool(grOld, oldstate.gr[P0]); convertCharToBool(grOld, oldstate.gr[P0]);
@ -288,6 +488,49 @@ void TiaWidget::fillGrid()
changed.push_back(grNew[i] != grOld[i]); changed.push_back(grNew[i] != grOld[i]);
myGRP0->setState(grNew, changed); myGRP0->setState(grNew, changed);
// posP0
myPosP0->setList(0, state.pos[P0], state.pos[P0] != oldstate.pos[P0]);
// hmP0 register
myHMP0->setList(0, state.hm[P0], state.hm[P0] != oldstate.hm[P0]);
// refP0 & vdelP0
myRefP0->setState(state.refP0);
myDelP0->setState(state.vdelP0);
// NUSIZ0
myNusiz0->setList(0, state.nusiz[0], state.nusiz[0] != oldstate.nusiz[0]);
myNusiz0Text->setEditString(tia.nusiz0String());
////////////////////////////
// P1 register info
////////////////////////////
// grP1
grNew.clear(); grOld.clear();
convertCharToBool(grNew, state.gr[P1]);
convertCharToBool(grOld, oldstate.gr[P1]);
changed.clear();
for(unsigned int i = 0; i < 8; ++i)
changed.push_back(grNew[i] != grOld[i]);
myGRP1->setState(grNew, changed);
// posP1
myPosP1->setList(0, state.pos[P1], state.pos[P1] != oldstate.pos[P1]);
// hmP1 register
myHMP1->setList(0, state.hm[P1], state.hm[P1] != oldstate.hm[P1]);
// refP1 & vdelP1
myRefP1->setState(state.refP1);
myDelP1->setState(state.vdelP1);
// NUSIZ1
myNusiz1->setList(0, state.nusiz[1], state.nusiz[1] != oldstate.nusiz[1]);
myNusiz1Text->setEditString(tia.nusiz1String());
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -302,6 +545,20 @@ void TiaWidget::convertCharToBool(BoolArray& b, unsigned char value)
} }
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int TiaWidget::convertBoolToInt(const BoolArray& b)
{
unsigned int value = 0, size = b.size();
for(unsigned int i = 0; i < size; ++i)
{
if(b[i])
value |= 1<<(size-i-1);
}
return value;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void TiaWidget::changeColorRegs() void TiaWidget::changeColorRegs()
{ {

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: TiaWidget.hxx,v 1.3 2005-08-15 18:52:15 stephena Exp $ // $Id: TiaWidget.hxx,v 1.4 2005-08-16 18:34:12 stephena Exp $
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
@ -47,6 +47,7 @@ class TiaWidget : public Widget, public CommandSender
void fillGrid(); void fillGrid();
void changeColorRegs(); void changeColorRegs();
void convertCharToBool(BoolArray& b, unsigned char value); void convertCharToBool(BoolArray& b, unsigned char value);
int convertBoolToInt(const BoolArray& b);
private: private:
DataGridWidget* myRamGrid; DataGridWidget* myRamGrid;
@ -63,6 +64,22 @@ class TiaWidget : public Widget, public CommandSender
ToggleBitWidget* myGRP0; ToggleBitWidget* myGRP0;
ToggleBitWidget* myGRP1; ToggleBitWidget* myGRP1;
DataGridWidget* myPosP0;
DataGridWidget* myPosP1;
DataGridWidget* myHMP0;
DataGridWidget* myHMP1;
DataGridWidget* myNusiz0;
DataGridWidget* myNusiz1;
EditTextWidget* myNusiz0Text;
EditTextWidget* myNusiz1Text;
CheckboxWidget* myRefP0;
CheckboxWidget* myRefP1;
CheckboxWidget* myDelP0;
CheckboxWidget* myDelP1;
}; };
#endif #endif

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: AudioDialog.cxx,v 1.12 2005-08-10 12:23:42 stephena Exp $ // $Id: AudioDialog.cxx,v 1.13 2005-08-16 18:34:12 stephena Exp $
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
@ -45,6 +45,7 @@ AudioDialog::AudioDialog(OSystem* osystem, DialogContainer* parent,
int x, int y, int w, int h) int x, int y, int w, int h)
: Dialog(osystem, parent, x, y, w, h) : Dialog(osystem, parent, x, y, w, h)
{ {
const GUI::Font& font = instance()->font();
int yoff = 10, int yoff = 10,
xoff = 30, xoff = 30,
woff = _w - 80, woff = _w - 80,
@ -71,7 +72,7 @@ AudioDialog::AudioDialog(OSystem* osystem, DialogContainer* parent,
// Enable sound // Enable sound
new StaticTextWidget(this, xoff+8, yoff+3, 20, kLineHeight, "", kTextAlignLeft); new StaticTextWidget(this, xoff+8, yoff+3, 20, kLineHeight, "", kTextAlignLeft);
mySoundEnableCheckbox = new CheckboxWidget(this, xoff+28, yoff, woff - 14, kLineHeight, mySoundEnableCheckbox = new CheckboxWidget(this, font, xoff+28, yoff,
"Enable sound", kSoundEnableChanged); "Enable sound", kSoundEnableChanged);
yoff += kAudioRowHeight + 12; yoff += kAudioRowHeight + 12;

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: CheatCodeDialog.cxx,v 1.1 2005-08-05 02:28:22 urchlay Exp $ // $Id: CheatCodeDialog.cxx,v 1.2 2005-08-16 18:34:12 stephena Exp $
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
@ -38,11 +38,12 @@ CheatCodeDialog::CheatCodeDialog(OSystem* osystem, DialogContainer* parent,
int x, int y, int w, int h) int x, int y, int w, int h)
: Dialog(osystem, parent, x, y, w, h) : Dialog(osystem, parent, x, y, w, h)
{ {
const GUI::Font& font = instance()->font();
myTitle = new StaticTextWidget(this, 10, 5, w - 20, kFontHeight, "Cheat Codes", kTextAlignCenter); myTitle = new StaticTextWidget(this, 10, 5, w - 20, kFontHeight, "Cheat Codes", kTextAlignCenter);
addButton(w - (kButtonWidth + 10), h - 24, "Close", kCloseCmd, 'C'); addButton(w - (kButtonWidth + 10), h - 24, "Close", kCloseCmd, 'C');
addButton(w - (kButtonWidth + 10), h - 48, "Load", kLoadCmd, 'C'); addButton(w - (kButtonWidth + 10), h - 48, "Load", kLoadCmd, 'C');
myEnableCheat = new CheckboxWidget(this, 10, 20, kButtonWidth+10, kLineHeight, myEnableCheat = new CheckboxWidget(this, font, 10, 20, "Enabled", kEnableCheat);
"Enabled", kEnableCheat);
myEnableCheat->setState(false); myEnableCheat->setState(false);
myCheat = 0; myCheat = 0;
} }

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: DataGridWidget.cxx,v 1.23 2005-08-15 18:52:15 stephena Exp $ // $Id: DataGridWidget.cxx,v 1.24 2005-08-16 18:34:12 stephena Exp $
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
@ -126,7 +126,7 @@ void DataGridWidget::setList(const int a, const int v, const bool c)
alist.push_back(a); alist.push_back(a);
vlist.push_back(v); vlist.push_back(v);
changed.push_back(changed); changed.push_back(c);
setList(alist, vlist, changed); setList(alist, vlist, changed);
} }

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: LauncherOptionsDialog.cxx,v 1.9 2005-08-10 12:23:42 stephena Exp $ // $Id: LauncherOptionsDialog.cxx,v 1.10 2005-08-16 18:34:12 stephena Exp $
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
@ -36,6 +36,8 @@ LauncherOptionsDialog::LauncherOptionsDialog(
CommandSender(boss), CommandSender(boss),
myBrowser(NULL) myBrowser(NULL)
{ {
const GUI::Font& font = instance()->font();
const int vBorder = 4; const int vBorder = 4;
int yoffset; int yoffset;
@ -71,7 +73,7 @@ LauncherOptionsDialog::LauncherOptionsDialog(
yoffset += 18; yoffset += 18;
// Snapshot single or multiple saves // Snapshot single or multiple saves
mySnapSingleCheckbox = new CheckboxWidget(myTab, 30, yoffset, 80, kLineHeight, mySnapSingleCheckbox = new CheckboxWidget(myTab, font, 30, yoffset,
"Multiple snapshots"); "Multiple snapshots");
// Activate the first tab // Activate the first tab

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: ToggleBitWidget.hxx,v 1.4 2005-08-02 18:28:29 stephena Exp $ // $Id: ToggleBitWidget.hxx,v 1.5 2005-08-16 18:34:12 stephena Exp $
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
@ -46,6 +46,7 @@ class ToggleBitWidget : public Widget, public CommandSender
void setList(const StringList& off, const StringList& on); void setList(const StringList& off, const StringList& on);
void setState(const BoolArray& state, const BoolArray& changed); void setState(const BoolArray& state, const BoolArray& changed);
const BoolArray& getState() { return _stateList; }
bool getSelectedState() const { return _stateList[_selectedItem]; } bool getSelectedState() const { return _stateList[_selectedItem]; }
virtual void handleMouseDown(int x, int y, int button, int clickCount); virtual void handleMouseDown(int x, int y, int button, int clickCount);

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: VideoDialog.cxx,v 1.20 2005-08-10 12:23:42 stephena Exp $ // $Id: VideoDialog.cxx,v 1.21 2005-08-16 18:34:12 stephena Exp $
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
@ -44,6 +44,8 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent,
int x, int y, int w, int h) int x, int y, int w, int h)
: Dialog(osystem, parent, x, y, w, h) : Dialog(osystem, parent, x, y, w, h)
{ {
const GUI::Font& font = instance()->font();
int yoff = 10, int yoff = 10,
xoff = 2, xoff = 2,
woff = 110, woff = 110,
@ -120,11 +122,11 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent,
myZoomLabel->setFlags(WIDGET_CLEARBG); myZoomLabel->setFlags(WIDGET_CLEARBG);
yoff += kVideoRowHeight + 10; yoff += kVideoRowHeight + 10;
myFullscreenCheckbox = new CheckboxWidget(this, xoff + 5, yoff, woff - 14, kLineHeight, myFullscreenCheckbox = new CheckboxWidget(this, font, xoff + 5, yoff,
"Fullscreen mode"); "Fullscreen mode");
yoff += kVideoRowHeight + 4; yoff += kVideoRowHeight + 4;
myUseDeskResCheckbox = new CheckboxWidget(this, xoff + 5, yoff, woff - 14, kLineHeight, myUseDeskResCheckbox = new CheckboxWidget(this, font, xoff + 5, yoff,
"Desktop Res in FS"); "Desktop Res in FS");
yoff += kVideoRowHeight + 20; yoff += kVideoRowHeight + 20;

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: Widget.cxx,v 1.28 2005-08-11 19:12:39 stephena Exp $ // $Id: Widget.cxx,v 1.29 2005-08-16 18:34:12 stephena Exp $
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
@ -325,7 +325,8 @@ ButtonWidget::ButtonWidget(GuiObject *boss, int x, int y, int w, int h,
_cmd(cmd), _cmd(cmd),
_hotkey(hotkey) _hotkey(hotkey)
{ {
_flags = WIDGET_ENABLED | WIDGET_BORDER | WIDGET_CLEARBG; _flags = WIDGET_ENABLED | WIDGET_BORDER | WIDGET_CLEARBG |
WIDGET_RETAIN_FOCUS;
_type = kButtonWidget; _type = kButtonWidget;
} }
@ -376,14 +377,19 @@ static unsigned int checked_img[8] =
}; };
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CheckboxWidget::CheckboxWidget(GuiObject *boss, int x, int y, int w, int h, CheckboxWidget::CheckboxWidget(GuiObject *boss, const GUI::Font& font,
const string& label, int cmd, uInt8 hotkey) int x, int y, const string& label,
: ButtonWidget(boss, x, y, w, h, label, cmd, hotkey), int cmd, uInt8 hotkey)
_state(false), : ButtonWidget(boss, x, y, 16, 16, label, cmd, hotkey),
_editable(true) _state(false),
_editable(true)
{ {
_flags = WIDGET_ENABLED; _flags = WIDGET_ENABLED | WIDGET_RETAIN_FOCUS;
_type = kCheckboxWidget; _type = kCheckboxWidget;
setFont(font);
_w = font.getStringWidth(label) + 20;
_h = font.getFontHeight() < 14 ? 14 : font.getFontHeight();
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -398,6 +404,26 @@ void CheckboxWidget::handleMouseUp(int x, int y, int button, int clickCount)
} }
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool CheckboxWidget::handleKeyDown(int ascii, int keycode, int modifiers)
{
bool handled = false;
// (De)activate with space or return
switch(keycode)
{
case '\n': // enter/return
case '\r':
case ' ' : // space
// Simulate mouse event
handleMouseUp(0, 0, 1, 0);
handled = true;
break;
}
return handled;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckboxWidget::setState(bool state) void CheckboxWidget::setState(bool state)
{ {
@ -414,18 +440,27 @@ void CheckboxWidget::drawWidget(bool hilite)
{ {
FrameBuffer& fb = _boss->instance()->frameBuffer(); FrameBuffer& fb = _boss->instance()->frameBuffer();
// Depending on font size, either the font or box will need to be
// centered vertically
int box_yoff = 0, text_yoff = 0;
if(_h > 14) // center box
box_yoff = (_h - 14) / 2;
else // center text
text_yoff = (14 - _font->getFontHeight()) / 2;
// Draw the box // Draw the box
fb.box(_x, _y, 14, 14, kColor, kShadowColor); fb.box(_x, _y + box_yoff, 14, 14, kColor, kShadowColor);
// If checked, draw cross inside the box // If checked, draw cross inside the box
if(_state) if(_state)
fb.drawBitmap(checked_img, _x + 3, _y + 3, fb.drawBitmap(checked_img, _x + 3, _y + box_yoff + 3,
isEnabled() ? _color : kColor); isEnabled() ? _color : kColor);
else else
fb.fillRect(_x + 2, _y + 2, 10, 10, kBGColor); fb.fillRect(_x + 2, _y + box_yoff + 2, 10, 10, kBGColor);
// Finally draw the label // Finally draw the label
fb.drawString(_font, _label, _x + 20, _y + 3, _w, isEnabled() ? _color : kColor); fb.drawString(_font, _label, _x + 20, _y + text_yoff, _w,
isEnabled() ? _color : kColor);
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -13,7 +13,7 @@
// See the file "license" for information on usage and redistribution of // See the file "license" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES. // this file, and for a DISCLAIMER OF ALL WARRANTIES.
// //
// $Id: Widget.hxx,v 1.27 2005-08-10 12:23:42 stephena Exp $ // $Id: Widget.hxx,v 1.28 2005-08-16 18:34:12 stephena Exp $
// //
// Based on code from ScummVM - Scumm Interpreter // Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project // Copyright (C) 2002-2004 The ScummVM project
@ -71,7 +71,7 @@ enum {
This is the base class for all widgets. This is the base class for all widgets.
@author Stephen Anthony @author Stephen Anthony
@version $Id: Widget.hxx,v 1.27 2005-08-10 12:23:42 stephena Exp $ @version $Id: Widget.hxx,v 1.28 2005-08-16 18:34:12 stephena Exp $
*/ */
class Widget : public GuiObject class Widget : public GuiObject
{ {
@ -200,6 +200,8 @@ class ButtonWidget : public StaticTextWidget, public CommandSender
void handleMouseEntered(int button); void handleMouseEntered(int button);
void handleMouseLeft(int button); void handleMouseLeft(int button);
bool wantsFocus() { return true; };
protected: protected:
void drawWidget(bool hilite); void drawWidget(bool hilite);
@ -213,12 +215,13 @@ class ButtonWidget : public StaticTextWidget, public CommandSender
class CheckboxWidget : public ButtonWidget class CheckboxWidget : public ButtonWidget
{ {
public: public:
CheckboxWidget(GuiObject* boss, int x, int y, int w, int h, CheckboxWidget(GuiObject* boss, const GUI::Font& font, int x, int y,
const string& label, int cmd = 0, uInt8 hotkey = 0); const string& label, int cmd = 0, uInt8 hotkey = 0);
void handleMouseUp(int x, int y, int button, int clickCount); void handleMouseUp(int x, int y, int button, int clickCount);
virtual void handleMouseEntered(int button) {} virtual void handleMouseEntered(int button) {}
virtual void handleMouseLeft(int button) {} virtual void handleMouseLeft(int button) {}
virtual bool handleKeyDown(int ascii, int keycode, int modifiers);
void setEditable(bool editable) { _editable = editable; } void setEditable(bool editable) { _editable = editable; }

View File

@ -2,7 +2,6 @@ MODULE := src/gui
MODULE_OBJS := \ MODULE_OBJS := \
src/gui/AboutDialog.o \ src/gui/AboutDialog.o \
src/gui/AddrValueWidget.o \
src/gui/AudioDialog.o \ src/gui/AudioDialog.o \
src/gui/BrowserDialog.o \ src/gui/BrowserDialog.o \
src/gui/ColorWidget.o \ src/gui/ColorWidget.o \