More work on CheckListWidget. This widget now sends signals when it

need to be refilled or a line has been (un)checked.  Also, checked
lines are now shown correctly (scrolling the list scrolls the
checkboxes as well).

Added two different styles to CheckboxWidget.  The first is as before,
but the new one doesn't draw the surrounding box and fills with a
solid color instead of using 'X'.  Methods have been added to
set/unset drawing of the surrounding box, and change to doing a fill
vs using the 'X'.


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@735 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2005-08-23 18:32:51 +00:00
parent bd1f058b13
commit 9f15fa0d00
11 changed files with 211 additions and 53 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: RomWidget.cxx,v 1.2 2005-08-22 18:17:10 stephena Exp $
// $Id: RomWidget.cxx,v 1.3 2005-08-23 18:32:51 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -35,6 +35,7 @@ RomWidget::RomWidget(GuiObject* boss, const GUI::Font& font, int x, int y)
myRomList = new CheckListWidget(boss, font, x, y, w, h);
myRomList->setTarget(this);
myRomList->setStyle(kSolidFill);
addFocusWidget(myRomList);
// Calculate real dimensions
@ -50,11 +51,27 @@ RomWidget::~RomWidget()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void RomWidget::handleCommand(CommandSender* sender, int cmd, int data, int id)
{
switch(cmd)
{
case kListScrolledCmd:
cerr << "data invalidated; refill list\n";
break;
case kListItemChecked:
cerr << "(un)set a breakpoint at address " << data << endl;
break;
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void RomWidget::loadConfig()
{
/* FIXME
We need logic here to only fill the grid at startup and when
bankswitching. At other times, we receive 'kListScrolledCmd'
command, which means the current romlist view is invalid and
should be filled with new data.
*/
cerr << "RomWidget::loadConfig()\n";
fillGrid();
myRomList->setDirty(); myRomList->draw();
@ -64,13 +81,16 @@ cerr << "RomWidget::loadConfig()\n";
void RomWidget::fillGrid()
{
StringList l;
BoolArray b;
for(int i = 0; i < 100; ++i)
for(int i = 0; i < 50; ++i)
{
ostringstream tmp;
tmp << "Test line " << i;
l.push_back(tmp.str());
b.push_back(false);
}
myRomList->setList(l);
myRomList->setList(l, b);
}

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: FrameBuffer.cxx,v 1.60 2005-08-11 21:57:30 stephena Exp $
// $Id: FrameBuffer.cxx,v 1.61 2005-08-23 18:32:51 stephena Exp $
//============================================================================
#include <sstream>
@ -226,7 +226,7 @@ void FrameBuffer::update()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void FrameBuffer::refresh(bool now)
{
cerr << "refreshTIA() " << myNumRedraws++ << endl;
// cerr << "refreshTIA() " << myNumRedraws++ << endl;
theRedrawTIAIndicator = true;
if(now)
{

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: CheckListWidget.cxx,v 1.3 2005-08-22 19:27:59 stephena Exp $
// $Id: CheckListWidget.cxx,v 1.4 2005-08-23 18:32:51 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -30,12 +30,17 @@ CheckListWidget::CheckListWidget(GuiObject* boss, const GUI::Font& font,
{
int ypos = _y + 2;
// rowheight is determined by largest item on a line
_rowHeight = MAX(_rowHeight, CheckboxWidget::boxSize());
// Create a CheckboxWidget for each row in the list
CheckboxWidget* t;
while((int)_checkList.size() < _rows)
for(int i = 0; i < _rows; ++i)
{
t = new CheckboxWidget(boss, font, _x + 2, ypos, "", kCheckActionCmd);
t->setTarget(this);
t->setID(i);
t->holdFocus(false);
ypos += _rowHeight;
_checkList.push_back(t);
@ -47,6 +52,54 @@ CheckListWidget::~CheckListWidget()
{
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckListWidget::setStyle(CheckStyle style)
{
for(unsigned int i = 0; i < _checkList.size(); ++i)
{
if(style == kXFill)
{
_checkList[i]->drawBox(true);
_checkList[i]->setFill(false);
}
else if(style == kSolidFill)
{
_checkList[i]->drawBox(false);
_checkList[i]->setFill(true, kTextColorEm);
}
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckListWidget::setList(const StringList& list, const BoolArray& state)
{
_list = list;
_stateList = state;
assert(_list.size() == _stateList.size());
// Enable all checkboxes
for(int i = 0; i < _rows; ++i)
_checkList[i]->setFlags(WIDGET_ENABLED);
// Then turn off any extras
if((int)_stateList.size() < _rows)
for(int i = _stateList.size(); i < _rows; ++i)
_checkList[i]->clearFlags(WIDGET_ENABLED);
ListWidget::recalc();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckListWidget::setLine(int line, const string& str, const bool& state)
{
if(line >= (int)_list.size())
return;
_list[line] = str;
_stateList[line] = state;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckListWidget::drawWidget(bool hilite)
{
@ -66,11 +119,11 @@ void CheckListWidget::drawWidget(bool hilite)
// Draw the list items
for (i = 0, pos = _currentPos; i < _rows && pos < len; i++, pos++)
{
// Draw checkboxes for correct lines (takes scrolling into account)
_checkList[i]->setState(_stateList[pos]);
_checkList[i]->setDirty();
_checkList[i]->draw();
// const OverlayColor textColor = (_selectedItem == pos && _editMode)
// ? kColor : kTextColor;
const int y = _y + 2 + _rowHeight * i;
GUI::Rect r(getEditRect());
@ -124,3 +177,25 @@ GUI::Rect CheckListWidget::getEditRect() const
return r;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckListWidget::handleCommand(CommandSender* sender, int cmd,
int data, int id)
{
switch(cmd)
{
case kCheckActionCmd:
{
// Figure out which line has been checked
int line = _currentPos + id;
_stateList[line] = bool(data);
// Let the boss know about it
sendCommand(kListItemChecked, line, _id);
break;
}
default:
ListWidget::handleCommand(sender, cmd, data, id);
}
}

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: CheckListWidget.hxx,v 1.3 2005-08-22 19:27:59 stephena Exp $
// $Id: CheckListWidget.hxx,v 1.4 2005-08-23 18:32:51 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -31,6 +31,11 @@ enum {
kListItemChecked = 'LIct' // checkbox toggled on current line
};
enum CheckStyle {
kXFill,
kSolidFill
};
typedef GUI::Array<CheckboxWidget*> CheckboxArray;
@ -42,6 +47,12 @@ class CheckListWidget : public ListWidget
int x, int y, int w, int h);
virtual ~CheckListWidget();
void setStyle(CheckStyle style);
void setList(const StringList& list, const BoolArray& state);
void setLine(int line, const string& str, const bool& state);
void handleCommand(CommandSender* sender, int cmd, int data, int id);
protected:
void drawWidget(bool hilite);
GUI::Rect getEditRect() const;

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.35 2005-08-22 13:53:23 stephena Exp $
// $Id: DebuggerDialog.cxx,v 1.36 2005-08-23 18:32:51 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -63,7 +63,6 @@ DebuggerDialog::~DebuggerDialog()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void DebuggerDialog::loadConfig()
{
cerr << " ==> DebuggerDialog::loadConfig()\n";
myTab->loadConfig();
myTiaInfo->loadConfig();
myTiaOutput->loadConfig();

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: ListWidget.cxx,v 1.27 2005-08-22 18:17:10 stephena Exp $
// $Id: ListWidget.cxx,v 1.28 2005-08-23 18:32:51 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -82,24 +82,9 @@ void ListWidget::setSelected(int item)
_currentPos = _selectedItem - _rows / 2;
scrollToCurrent();
setDirty(); draw();
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void ListWidget::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 ListWidget::scrollTo(int item)
{
@ -116,6 +101,20 @@ void ListWidget::scrollTo(int item)
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void ListWidget::recalc()
{
int size = _list.size();
if (_currentPos >= size)
_currentPos = size - 1;
if (_currentPos < 0)
_currentPos = 0;
_selectedItem = -1;
_editMode = false;
scrollBarRecalc();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void ListWidget::scrollBarRecalc()
{
@ -169,7 +168,6 @@ void ListWidget::handleMouseUp(int x, int y, int button, int clickCount)
void ListWidget::handleMouseWheel(int x, int y, int direction)
{
_scrollBar->handleMouseWheel(x, y, direction);
setDirty(); draw();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -198,7 +196,6 @@ bool ListWidget::handleKeyDown(int ascii, int keycode, int modifiers)
return true;
bool handled = true;
bool dirty = false;
int oldSelectedItem = _selectedItem;
if (!_editMode && isalnum((char)ascii))
@ -230,7 +227,6 @@ bool ListWidget::handleKeyDown(int ascii, int keycode, int modifiers)
}
newSelectedItem++;
}
scrollToCurrent();
}
else if (_editMode)
{
@ -248,10 +244,7 @@ bool ListWidget::handleKeyDown(int ascii, int keycode, int modifiers)
{
// override continuous enter keydown
if (_editable && (_currentKeyDown != '\n' && _currentKeyDown != '\r'))
{
dirty = true;
startEditMode();
}
else
sendCommand(kListItemActivatedCmd, _selectedItem, _id);
}
@ -290,17 +283,14 @@ bool ListWidget::handleKeyDown(int ascii, int keycode, int modifiers)
default:
handled = false;
}
scrollToCurrent();
}
if (_selectedItem != oldSelectedItem)
{
sendCommand(kListSelectionChangedCmd, _selectedItem, _id);
// also draw scrollbar
_scrollBar->draw();
scrollToCurrent();
setDirty(); draw();
sendCommand(kListSelectionChangedCmd, _selectedItem, _id);
}
_currentKeyDown = keycode;
@ -331,6 +321,9 @@ void ListWidget::handleCommand(CommandSender* sender, int cmd, int data, int id)
{
_currentPos = data;
setDirty(); draw();
// Let boss know the list has scrolled
sendCommand(kListScrolledCmd, _currentPos, _id);
}
break;
}
@ -339,16 +332,20 @@ void ListWidget::handleCommand(CommandSender* sender, int cmd, int data, int id)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void ListWidget::scrollToCurrent()
{
bool scrolled = false;
// Only do something if the current item is not in our view port
if (_selectedItem < _currentPos)
{
// it's above our view
_currentPos = _selectedItem;
scrolled = true;
}
else if (_selectedItem >= _currentPos + _rows )
{
// it's below our view
_currentPos = _selectedItem - _rows + 1;
scrolled = true;
}
if (_currentPos < 0 || _rows > (int)_list.size())
@ -358,6 +355,11 @@ void ListWidget::scrollToCurrent()
_scrollBar->_currentPos = _currentPos;
_scrollBar->recalc();
setDirty(); draw();
if(scrolled)
sendCommand(kListScrolledCmd, _currentPos, _id);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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: ListWidget.hxx,v 1.10 2005-08-22 18:17:10 stephena Exp $
// $Id: ListWidget.hxx,v 1.11 2005-08-23 18:32:51 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -36,7 +36,8 @@ enum {
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
kListSelectionChangedCmd = 'Lsch', // selection changed - 'data' will be item index
kListScrolledCmd = 'Lscl' // list scrolled - 'data' will be current position
};
/** ListWidget */
@ -50,7 +51,6 @@ class ListWidget : public EditableWidget
int getSelected() const { return _selectedItem; }
void setSelected(int item);
void setList(const StringList& list);
const StringList& getList() const { return _list; }
const string& getSelectedString() const { return _list[_selectedItem]; }
@ -73,6 +73,7 @@ class ListWidget : public EditableWidget
virtual GUI::Rect getEditRect() const = 0;
int findItem(int x, int y) const;
void recalc();
void scrollBarRecalc();
void abortEditMode();

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: StringListWidget.cxx,v 1.1 2005-08-22 23:09:13 stephena Exp $
// $Id: StringListWidget.cxx,v 1.2 2005-08-23 18:32:51 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -36,6 +36,15 @@ StringListWidget::~StringListWidget()
{
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void StringListWidget::setList(const StringList& list)
{
_list = list;
ListWidget::recalc();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void StringListWidget::drawWidget(bool hilite)
{
FrameBuffer& fb = _boss->instance()->frameBuffer();

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: StringListWidget.hxx,v 1.1 2005-08-22 23:09:13 stephena Exp $
// $Id: StringListWidget.hxx,v 1.2 2005-08-23 18:32:51 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -38,6 +38,7 @@ class StringListWidget : public ListWidget
int x, int y, int w, int h);
virtual ~StringListWidget();
void setList(const StringList& list);
void setNumberingMode(NumberingMode numberingMode) { _numberingMode = numberingMode; }
protected:

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.cxx,v 1.31 2005-08-22 18:17:10 stephena Exp $
// $Id: Widget.cxx,v 1.32 2005-08-23 18:32:51 stephena Exp $
//
// Based on code from ScummVM - Scumm Interpreter
// Copyright (C) 2002-2004 The ScummVM project
@ -381,7 +381,11 @@ CheckboxWidget::CheckboxWidget(GuiObject *boss, const GUI::Font& font,
int cmd)
: ButtonWidget(boss, x, y, 16, 16, label, cmd, 0),
_state(false),
_editable(true)
_editable(true),
_holdFocus(true),
_fillRect(false),
_drawBox(true),
_fillColor(kColor)
{
_flags = WIDGET_ENABLED | WIDGET_RETAIN_FOCUS;
_type = kCheckboxWidget;
@ -426,6 +430,28 @@ bool CheckboxWidget::handleKeyDown(int ascii, int keycode, int modifiers)
return handled;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool CheckboxWidget::wantsFocus()
{
if(!_holdFocus)
return false;
else
return _editable;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckboxWidget::setEditable(bool editable)
{
_holdFocus = _editable = editable;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckboxWidget::setFill(bool fill, OverlayColor color)
{
_fillRect = fill;
_fillColor = color;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CheckboxWidget::setState(bool state)
{
@ -451,12 +477,18 @@ void CheckboxWidget::drawWidget(bool hilite)
text_yoff = (14 - _font->getFontHeight()) / 2;
// Draw the box
if(_drawBox)
fb.box(_x, _y + box_yoff, 14, 14, kColor, kShadowColor);
// If checked, draw cross inside the box
if(_state)
{
if(_fillRect)
fb.fillRect(_x + 2, _y + box_yoff + 2, 10, 10, _fillColor);
else
fb.drawBitmap(checked_img, _x + 3, _y + box_yoff + 3,
isEnabled() ? _color : kColor);
}
else
fb.fillRect(_x + 2, _y + box_yoff + 2, 10, 10, kBGColor);

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.33 2005-08-22 19:27:59 stephena Exp $
// $Id: Widget.hxx,v 1.34 2005-08-23 18:32:51 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.33 2005-08-22 19:27:59 stephena Exp $
@version $Id: Widget.hxx,v 1.34 2005-08-23 18:32:51 stephena Exp $
*/
class Widget : public GuiObject
{
@ -221,9 +221,12 @@ class CheckboxWidget : public ButtonWidget
virtual void handleMouseLeft(int button) {}
virtual bool handleKeyDown(int ascii, int keycode, int modifiers);
bool wantsFocus() { return _editable; };
bool wantsFocus();
void holdFocus(bool status) { _holdFocus = status; }
void setEditable(bool editable) { _editable = editable; }
void setEditable(bool editable);
void setFill(bool fill, OverlayColor color = kColor);
void drawBox(bool draw) { _drawBox = draw; }
void setState(bool state);
void toggleState() { setState(!_state); }
@ -237,6 +240,11 @@ class CheckboxWidget : public ButtonWidget
protected:
bool _state;
bool _editable;
bool _holdFocus;
bool _fillRect;
bool _drawBox;
OverlayColor _fillColor;
};