mirror of https://github.com/stella-emu/stella.git
Made the Debugger dialog use a TabWidget again, instead of it being another
Dialog. This was necessary since it seems Dialogs can't contain other dialogs in the GUI core. Added keyboard navigation to the TabWidget class. For now, it's only enabled for the Debugger. Ctrl-Tab/Shift-Ctrl-Tab switches to the next/previous tab (respectively), and Tab/Shift-Tab switches to the next/previous widget in the current tab. There's still a bit of work to do, but the infrastructure is there. That's it, I'm taking the night off, because this deceptively simple concept has taken about a day to implement ... git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@479 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
parent
c988604949
commit
4ee8ee8cd7
|
@ -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: makefile,v 1.89 2005-06-09 04:31:44 urchlay Exp $
|
## $Id: makefile,v 1.90 2005-06-10 17:46:05 stephena Exp $
|
||||||
##============================================================================
|
##============================================================================
|
||||||
|
|
||||||
##============================================================================
|
##============================================================================
|
||||||
|
@ -160,7 +160,7 @@ GUI_OBJS = Font.o Menu.o Launcher.o Debugger.o \
|
||||||
EventMappingDialog.o GameInfoDialog.o HelpDialog.o AboutDialog.o \
|
EventMappingDialog.o GameInfoDialog.o HelpDialog.o AboutDialog.o \
|
||||||
LauncherDialog.o LauncherOptionsDialog.o BrowserDialog.o GameList.o \
|
LauncherDialog.o LauncherOptionsDialog.o BrowserDialog.o GameList.o \
|
||||||
ProgressDialog.o \
|
ProgressDialog.o \
|
||||||
DebuggerDialog.o PromptDialog.o
|
DebuggerDialog.o PromptWidget.o
|
||||||
|
|
||||||
CORE_OBJS = Booster.o Cart.o Cart2K.o Cart3F.o Cart4K.o CartAR.o CartDPC.o \
|
CORE_OBJS = Booster.o Cart.o Cart2K.o Cart3F.o Cart4K.o CartAR.o CartDPC.o \
|
||||||
CartE0.o CartE7.o CartF4.o CartF4SC.o CartF6.o CartF6SC.o \
|
CartE0.o CartE7.o CartF4.o CartF4SC.o CartF6.o CartF6SC.o \
|
||||||
|
@ -453,8 +453,8 @@ ProgressDialog.o: $(GUI)/ProgressDialog.cxx $(GUI)/ProgressDialog.hxx
|
||||||
DebuggerDialog.o: $(GUI)/DebuggerDialog.cxx $(GUI)/DebuggerDialog.hxx
|
DebuggerDialog.o: $(GUI)/DebuggerDialog.cxx $(GUI)/DebuggerDialog.hxx
|
||||||
$(CXX) -c $(FLAGS) $(OPTIONS) $(LDFLAGS) $(GUI)/DebuggerDialog.cxx
|
$(CXX) -c $(FLAGS) $(OPTIONS) $(LDFLAGS) $(GUI)/DebuggerDialog.cxx
|
||||||
|
|
||||||
PromptDialog.o: $(GUI)/PromptDialog.cxx $(GUI)/PromptDialog.hxx
|
PromptWidget.o: $(GUI)/PromptWidget.cxx $(GUI)/PromptWidget.hxx
|
||||||
$(CXX) -c $(FLAGS) $(OPTIONS) $(LDFLAGS) $(GUI)/PromptDialog.cxx
|
$(CXX) -c $(FLAGS) $(OPTIONS) $(LDFLAGS) $(GUI)/PromptWidget.cxx
|
||||||
|
|
||||||
DebuggerParser.o: $(COMMON)/DebuggerParser.cxx $(COMMON)/DebuggerParser.hxx
|
DebuggerParser.o: $(COMMON)/DebuggerParser.cxx $(COMMON)/DebuggerParser.hxx
|
||||||
$(CXX) -c $(FLAGS) $(OPTIONS) $(LDFLAGS) $(COMMON)/DebuggerParser.cxx
|
$(CXX) -c $(FLAGS) $(OPTIONS) $(LDFLAGS) $(COMMON)/DebuggerParser.cxx
|
||||||
|
|
|
@ -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: OSystem.cxx,v 1.23 2005-06-08 18:45:08 stephena Exp $
|
// $Id: OSystem.cxx,v 1.24 2005-06-10 17:46:06 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
@ -88,6 +88,9 @@ OSystem::OSystem()
|
||||||
#ifdef DEVELOPER_SUPPORT
|
#ifdef DEVELOPER_SUPPORT
|
||||||
myFeatures += "Debugger";
|
myFeatures += "Debugger";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// When we first start Stella, no GUI widget is active
|
||||||
|
GuiObject::resetActiveWidget();
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
|
@ -13,149 +13,110 @@
|
||||||
// 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: DebuggerDialog.cxx,v 1.6 2005-06-09 20:09:22 stephena Exp $
|
// $Id: DebuggerDialog.cxx,v 1.7 2005-06-10 17:46:06 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
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#include "DialogContainer.hxx"
|
#include "TabWidget.hxx"
|
||||||
#include "PromptDialog.hxx"
|
#include "ListWidget.hxx"
|
||||||
|
#include "PromptWidget.hxx"
|
||||||
#include "DebuggerDialog.hxx"
|
#include "DebuggerDialog.hxx"
|
||||||
|
|
||||||
enum {
|
|
||||||
kPromptCmd = 'PRMT',
|
|
||||||
kCpuCmd = 'CPU ',
|
|
||||||
kRamCmd = 'RAM ',
|
|
||||||
kRomCmd = 'ROM ',
|
|
||||||
kTiaCmd = 'TIA ',
|
|
||||||
kCodeCmd = 'CODE'
|
|
||||||
};
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
DebuggerDialog::DebuggerDialog(OSystem* osystem, DialogContainer* parent,
|
DebuggerDialog::DebuggerDialog(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),
|
||||||
myPromptDialog(NULL),
|
myTab(NULL)
|
||||||
myCpuDialog(NULL),
|
|
||||||
myRamDialog(NULL),
|
|
||||||
myRomDialog(NULL),
|
|
||||||
myTiaDialog(NULL),
|
|
||||||
myCodeDialog(NULL)
|
|
||||||
{
|
{
|
||||||
const int border = 5;
|
const int vBorder = 4;
|
||||||
const int space = 5;
|
int yoffset;
|
||||||
const int width = 40;
|
|
||||||
int xpos = border;
|
|
||||||
|
|
||||||
// Add a row of buttons for the various debugger operations
|
// The tab widget
|
||||||
new ButtonWidget(this, xpos, border, width, 16, "Prompt", kPromptCmd, 0);
|
myTab = new TabWidget(this, 0, vBorder, _w, _h - vBorder - 1);
|
||||||
xpos += space + width;
|
|
||||||
new ButtonWidget(this, xpos, border, width, 16, "CPU", kCpuCmd, 0);
|
|
||||||
xpos += space + width;
|
|
||||||
new ButtonWidget(this, xpos, border, width, 16, "RAM", kRamCmd, 0);
|
|
||||||
xpos += space + width;
|
|
||||||
new ButtonWidget(this, xpos, border, width, 16, "ROM", kRomCmd, 0);
|
|
||||||
xpos += space + width;
|
|
||||||
new ButtonWidget(this, xpos, border, width, 16, "TIA", kTiaCmd, 0);
|
|
||||||
xpos += space + width;
|
|
||||||
new ButtonWidget(this, xpos, border, width, 16, "Code", kCodeCmd, 0);
|
|
||||||
xpos += space + width;
|
|
||||||
|
|
||||||
const int xoff = border;
|
// 1) The Prompt/console tab
|
||||||
const int yoff = border + 16 + 2;
|
myTab->addTab("Prompt");
|
||||||
|
yoffset = vBorder;
|
||||||
|
|
||||||
// Create the debugger dialog boxes
|
PromptWidget* prompt = new PromptWidget(myTab, 2, 2,
|
||||||
myPromptDialog = new PromptDialog(osystem, parent, x + xoff, y + yoff,
|
_w - vBorder, _h - 25);
|
||||||
w - xoff - 2, h - yoff - 3);
|
myTab->setActiveWidget(0, prompt);
|
||||||
|
|
||||||
|
// 2) The CPU tab
|
||||||
|
myTab->addTab("CPU");
|
||||||
|
yoffset = vBorder;
|
||||||
|
|
||||||
|
///////////////////// FIXME - just testing, will be removed
|
||||||
|
ListWidget* myList = new ListWidget(myTab, 10, 24, 100, _h - 24 - 26 - 10 - 10);
|
||||||
|
myList->setEditable(false);
|
||||||
|
myList->setNumberingMode(kListNumberingOff);
|
||||||
|
|
||||||
|
StringList l;
|
||||||
|
for (int i = 0; i < 10; ++i)
|
||||||
|
l.push_back("TESTING!!!");
|
||||||
|
myList->setList(l);
|
||||||
|
|
||||||
|
ListWidget* myList2 = new ListWidget(myTab, 150, 24, 100, _h - 24 - 26 - 10 - 10);
|
||||||
|
myList2->setEditable(false);
|
||||||
|
myList2->setNumberingMode(kListNumberingOff);
|
||||||
|
|
||||||
|
StringList l2;
|
||||||
|
for (int i = 0; i < 10; ++i)
|
||||||
|
l2.push_back("TESTING AGAIN!!!");
|
||||||
|
myList2->setList(l2);
|
||||||
|
|
||||||
|
ListWidget* myList3 = new ListWidget(myTab, 300, 24, 100, _h - 24 - 26 - 10 - 10);
|
||||||
|
myList3->setEditable(false);
|
||||||
|
myList3->setNumberingMode(kListNumberingOff);
|
||||||
|
|
||||||
|
StringList l3;
|
||||||
|
for (int i = 0; i < 10; ++i)
|
||||||
|
l3.push_back("CPU_TESTING!!!");
|
||||||
|
myList3->setList(l3);
|
||||||
|
|
||||||
|
myTab->setActiveWidget(1, myList);
|
||||||
|
/////////////////////////////
|
||||||
|
|
||||||
|
// 3) The RAM tab
|
||||||
|
myTab->addTab("RAM");
|
||||||
|
yoffset = vBorder;
|
||||||
|
|
||||||
|
|
||||||
|
// 4) The ROM tab
|
||||||
|
myTab->addTab("ROM");
|
||||||
|
yoffset = vBorder;
|
||||||
|
|
||||||
|
|
||||||
|
// 5) The TIA tab
|
||||||
|
myTab->addTab("TIA");
|
||||||
|
yoffset = vBorder;
|
||||||
|
|
||||||
|
|
||||||
|
// 6) The RAM tab
|
||||||
|
myTab->addTab("Code");
|
||||||
|
yoffset = vBorder;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Set active tab to prompt
|
||||||
|
myTab->setActiveTab(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
DebuggerDialog::~DebuggerDialog()
|
DebuggerDialog::~DebuggerDialog()
|
||||||
{
|
{
|
||||||
delete myPromptDialog;
|
|
||||||
/*
|
|
||||||
delete myCpuDialog;
|
|
||||||
delete myRamDialog;
|
|
||||||
delete myRomDialog;
|
|
||||||
delete myTiaDialog;
|
|
||||||
delete myCodeDialog;
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
void DebuggerDialog::addButtons(GuiObject* boss)
|
|
||||||
{
|
|
||||||
// This is a terrible hack, but it does seem to work ...
|
|
||||||
const int border = 5;
|
|
||||||
const int space = 5;
|
|
||||||
const int width = 40;
|
|
||||||
int xpos = border;
|
|
||||||
|
|
||||||
// Add a row of buttons for the various debugger operations
|
|
||||||
new ButtonWidget(boss, xpos, border, width, 16, "Prompt", kPromptCmd, 0);
|
|
||||||
xpos += space + width;
|
|
||||||
new ButtonWidget(boss, xpos, border, width, 16, "CPU", kCpuCmd, 0);
|
|
||||||
xpos += space + width;
|
|
||||||
new ButtonWidget(boss, xpos, border, width, 16, "RAM", kRamCmd, 0);
|
|
||||||
xpos += space + width;
|
|
||||||
new ButtonWidget(boss, xpos, border, width, 16, "ROM", kRomCmd, 0);
|
|
||||||
xpos += space + width;
|
|
||||||
new ButtonWidget(boss, xpos, border, width, 16, "TIA", kTiaCmd, 0);
|
|
||||||
xpos += space + width;
|
|
||||||
new ButtonWidget(boss, xpos, border, width, 16, "Code", kCodeCmd, 0);
|
|
||||||
xpos += space + width;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void DebuggerDialog::loadConfig()
|
void DebuggerDialog::loadConfig()
|
||||||
{
|
{
|
||||||
// Auto-select the command prompt
|
|
||||||
parent()->addDialog(myPromptDialog);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void DebuggerDialog::handleCommand(CommandSender* sender, int cmd, int data)
|
void DebuggerDialog::handleKeyDown(int ascii, int keycode, int modifiers)
|
||||||
{
|
{
|
||||||
switch (cmd)
|
myTab->handleKeyDown(ascii, keycode, modifiers);
|
||||||
{
|
|
||||||
case kPromptCmd:
|
|
||||||
parent()->reStack();
|
|
||||||
parent()->addDialog(myPromptDialog);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case kCpuCmd:
|
|
||||||
parent()->reStack();
|
|
||||||
// parent()->addDialog(myCpuDialog);
|
|
||||||
cerr << "kCpuCmd\n";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case kRamCmd:
|
|
||||||
parent()->reStack();
|
|
||||||
// parent()->addDialog(myRamDialog);
|
|
||||||
cerr << "kRamCmd\n";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case kRomCmd:
|
|
||||||
parent()->reStack();
|
|
||||||
// parent()->addDialog(myRomDialog);
|
|
||||||
cerr << "kRomCmd\n";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case kTiaCmd:
|
|
||||||
parent()->reStack();
|
|
||||||
// parent()->addDialog(myTiaDialog);
|
|
||||||
cerr << "kTiaCmd\n";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case kCodeCmd:
|
|
||||||
parent()->reStack();
|
|
||||||
// parent()->addDialog(myCodeDialog);
|
|
||||||
cerr << "kCodeCmd\n";
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
Dialog::handleCommand(sender, cmd, data);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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: DebuggerDialog.hxx,v 1.4 2005-06-09 19:04:59 stephena Exp $
|
// $Id: DebuggerDialog.hxx,v 1.5 2005-06-10 17:46:06 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
|
||||||
|
@ -24,12 +24,7 @@
|
||||||
|
|
||||||
class OSystem;
|
class OSystem;
|
||||||
class DialogContainer;
|
class DialogContainer;
|
||||||
class PromptDialog;
|
class TabWidget;
|
||||||
class CpuDialog;
|
|
||||||
class RamDialog;
|
|
||||||
class RomDialog;
|
|
||||||
class TiaDialog;
|
|
||||||
class CodeDialog;
|
|
||||||
|
|
||||||
#include "Dialog.hxx"
|
#include "Dialog.hxx"
|
||||||
|
|
||||||
|
@ -41,18 +36,10 @@ class DebuggerDialog : public Dialog
|
||||||
~DebuggerDialog();
|
~DebuggerDialog();
|
||||||
|
|
||||||
virtual void loadConfig();
|
virtual void loadConfig();
|
||||||
virtual void handleCommand(CommandSender* sender, int cmd, int data);
|
virtual void handleKeyDown(int ascii, int keycode, int modifiers);
|
||||||
|
|
||||||
void addButtons(GuiObject* boss);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// The debugger dialogs
|
TabWidget* myTab;
|
||||||
PromptDialog* myPromptDialog;
|
|
||||||
CpuDialog* myCpuDialog;
|
|
||||||
RamDialog* myRamDialog;
|
|
||||||
RomDialog* myRomDialog;
|
|
||||||
TiaDialog* myTiaDialog;
|
|
||||||
CodeDialog* myCodeDialog;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -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: Dialog.cxx,v 1.18 2005-05-26 18:56:58 stephena Exp $
|
// $Id: Dialog.cxx,v 1.19 2005-06-10 17:46:06 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
|
||||||
|
@ -280,14 +280,6 @@ void Dialog::handleJoyUp(int stick, int button)
|
||||||
_focusedWidget->handleJoyUp(stick, button);
|
_focusedWidget->handleJoyUp(stick, button);
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
void Dialog::handleTickle()
|
|
||||||
{
|
|
||||||
// Focused widget receives tickle notifications
|
|
||||||
if(_focusedWidget && _focusedWidget->getFlags() & WIDGET_WANT_TICKLE)
|
|
||||||
_focusedWidget->handleTickle();
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void Dialog::handleCommand(CommandSender* sender, int cmd, int data)
|
void Dialog::handleCommand(CommandSender* sender, int cmd, int data)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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: Dialog.hxx,v 1.15 2005-05-26 15:43:44 stephena Exp $
|
// $Id: Dialog.hxx,v 1.16 2005-06-10 17:46:06 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 @@ class DialogContainer;
|
||||||
This is the base class for all dialog boxes.
|
This is the base class for all dialog boxes.
|
||||||
|
|
||||||
@author Stephen Anthony
|
@author Stephen Anthony
|
||||||
@version $Id: Dialog.hxx,v 1.15 2005-05-26 15:43:44 stephena Exp $
|
@version $Id: Dialog.hxx,v 1.16 2005-06-10 17:46:06 stephena Exp $
|
||||||
*/
|
*/
|
||||||
class Dialog : public GuiObject
|
class Dialog : public GuiObject
|
||||||
{
|
{
|
||||||
|
@ -61,7 +61,6 @@ class Dialog : public GuiObject
|
||||||
virtual void draw();
|
virtual void draw();
|
||||||
void releaseFocus();
|
void releaseFocus();
|
||||||
|
|
||||||
virtual void handleTickle(); // Called periodically (in every guiloop() )
|
|
||||||
virtual void handleKeyDown(int ascii, int keycode, int modifiers);
|
virtual void handleKeyDown(int ascii, int keycode, int modifiers);
|
||||||
virtual void handleKeyUp(int ascii, int keycode, int modifiers);
|
virtual void handleKeyUp(int ascii, int keycode, int modifiers);
|
||||||
virtual void handleMouseDown(int x, int y, int button, int clickCount);
|
virtual void handleMouseDown(int x, int y, int button, int clickCount);
|
||||||
|
|
|
@ -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: GuiObject.hxx,v 1.9 2005-05-21 16:12:13 stephena Exp $
|
// $Id: GuiObject.hxx,v 1.10 2005-06-10 17:46:06 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
|
||||||
|
@ -33,7 +33,7 @@ class Widget;
|
||||||
This is the base class for all GUI objects/widgets.
|
This is the base class for all GUI objects/widgets.
|
||||||
|
|
||||||
@author Stephen Anthony
|
@author Stephen Anthony
|
||||||
@version $Id: GuiObject.hxx,v 1.9 2005-05-21 16:12:13 stephena Exp $
|
@version $Id: GuiObject.hxx,v 1.10 2005-06-10 17:46:06 stephena Exp $
|
||||||
*/
|
*/
|
||||||
class GuiObject : public CommandReceiver
|
class GuiObject : public CommandReceiver
|
||||||
{
|
{
|
||||||
|
@ -68,6 +68,8 @@ class GuiObject : public CommandReceiver
|
||||||
virtual bool isVisible() const = 0;
|
virtual bool isVisible() const = 0;
|
||||||
virtual void draw() = 0;
|
virtual void draw() = 0;
|
||||||
|
|
||||||
|
static void resetActiveWidget() { _activeWidget = NULL; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
OSystem* myOSystem;
|
OSystem* myOSystem;
|
||||||
DialogContainer* myParent;
|
DialogContainer* myParent;
|
||||||
|
@ -76,6 +78,7 @@ class GuiObject : public CommandReceiver
|
||||||
int _w, _h;
|
int _w, _h;
|
||||||
|
|
||||||
Widget* _firstWidget;
|
Widget* _firstWidget;
|
||||||
|
static Widget* _activeWidget;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void releaseFocus() = 0;
|
virtual void releaseFocus() = 0;
|
||||||
|
|
|
@ -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: GuiUtils.hxx,v 1.9 2005-06-07 01:14:39 stephena Exp $
|
// $Id: GuiUtils.hxx,v 1.10 2005-06-10 17:46:06 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
|
||||||
|
@ -29,7 +29,7 @@
|
||||||
Probably not very neat, but at least it works ...
|
Probably not very neat, but at least it works ...
|
||||||
|
|
||||||
@author Stephen Anthony
|
@author Stephen Anthony
|
||||||
@version $Id: GuiUtils.hxx,v 1.9 2005-06-07 01:14:39 stephena Exp $
|
@version $Id: GuiUtils.hxx,v 1.10 2005-06-10 17:46:06 stephena Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define kLineHeight 12
|
#define kLineHeight 12
|
||||||
|
@ -48,12 +48,13 @@ enum OverlayColor {
|
||||||
|
|
||||||
// The commands generated by various widgets
|
// The commands generated by various widgets
|
||||||
enum {
|
enum {
|
||||||
kOKCmd = 'OK ',
|
kOKCmd = 'OK ',
|
||||||
kCloseCmd = 'CLOS',
|
kCloseCmd = 'CLOS',
|
||||||
kNextCmd = 'NEXT',
|
kNextCmd = 'NEXT',
|
||||||
kPrevCmd = 'PREV',
|
kPrevCmd = 'PREV',
|
||||||
kDefaultsCmd = 'DEFA',
|
kDefaultsCmd = 'DEFA',
|
||||||
kSetPositionCmd = 'SETP',
|
kSetPositionCmd = 'SETP',
|
||||||
|
kActiveWidgetCmd = 'ACTW',
|
||||||
kRendererChanged,
|
kRendererChanged,
|
||||||
kAspectRatioChanged,
|
kAspectRatioChanged,
|
||||||
kFrameRateChanged,
|
kFrameRateChanged,
|
||||||
|
|
|
@ -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: LauncherDialog.cxx,v 1.20 2005-06-08 18:45:09 stephena Exp $
|
// $Id: LauncherDialog.cxx,v 1.21 2005-06-10 17:46:06 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
|
||||||
|
@ -97,6 +97,7 @@ LauncherDialog::LauncherDialog(OSystem* osystem, DialogContainer* parent,
|
||||||
myList = new ListWidget(this, 10, 24, _w - 20, _h - 24 - 26 - 10 - 10);
|
myList = new ListWidget(this, 10, 24, _w - 20, _h - 24 - 26 - 10 - 10);
|
||||||
myList->setEditable(false);
|
myList->setEditable(false);
|
||||||
myList->setNumberingMode(kListNumberingOff);
|
myList->setNumberingMode(kListNumberingOff);
|
||||||
|
myList->clearFlags(WIDGET_TAB_NAVIGATE);
|
||||||
|
|
||||||
// Add note textwidget to show any notes for the currently selected ROM
|
// Add note textwidget to show any notes for the currently selected ROM
|
||||||
new StaticTextWidget(this, 20, _h - 43, 30, 16, "Note:", kTextAlignLeft);
|
new StaticTextWidget(this, 20, _h - 43, 30, 16, "Note:", kTextAlignLeft);
|
||||||
|
|
|
@ -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: ListWidget.cxx,v 1.13 2005-06-09 20:09:23 stephena Exp $
|
// $Id: ListWidget.cxx,v 1.14 2005-06-10 17:46:06 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,7 +36,8 @@ ListWidget::ListWidget(GuiObject* boss, int x, int y, int w, int h)
|
||||||
: Widget(boss, x, y, w - kScrollBarWidth, h),
|
: Widget(boss, x, y, w - kScrollBarWidth, h),
|
||||||
CommandSender(boss)
|
CommandSender(boss)
|
||||||
{
|
{
|
||||||
_flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS;
|
_flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS |
|
||||||
|
WIDGET_TAB_NAVIGATE;
|
||||||
_type = kListWidget;
|
_type = kListWidget;
|
||||||
_numberingMode = kListNumberingOne;
|
_numberingMode = kListNumberingOne;
|
||||||
_entriesPerPage = (_h - 2) / kLineHeight;
|
_entriesPerPage = (_h - 2) / kLineHeight;
|
||||||
|
@ -138,6 +139,10 @@ void ListWidget::handleMouseDown(int x, int y, int button, int clickCount)
|
||||||
{
|
{
|
||||||
if (isEnabled())
|
if (isEnabled())
|
||||||
{
|
{
|
||||||
|
// A click indicated this widget has been selected
|
||||||
|
// It should receive focus (because it has the WIDGET_TAB_NAVIGATE property)
|
||||||
|
receivedFocus();
|
||||||
|
|
||||||
int oldSelectedItem = _selectedItem;
|
int oldSelectedItem = _selectedItem;
|
||||||
_selectedItem = (y - 1) / kLineHeight + _currentPos;
|
_selectedItem = (y - 1) / kLineHeight + _currentPos;
|
||||||
if (_selectedItem > (int)_list.size() - 1)
|
if (_selectedItem > (int)_list.size() - 1)
|
||||||
|
|
|
@ -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: PromptDialog.cxx,v 1.9 2005-06-09 20:09:23 stephena Exp $
|
// $Id: PromptWidget.cxx,v 1.1 2005-06-10 17:46:06 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
|
||||||
|
@ -26,7 +26,7 @@
|
||||||
#include "Debugger.hxx"
|
#include "Debugger.hxx"
|
||||||
#include "DebuggerDialog.hxx"
|
#include "DebuggerDialog.hxx"
|
||||||
|
|
||||||
#include "PromptDialog.hxx"
|
#include "PromptWidget.hxx"
|
||||||
|
|
||||||
#define PROMPT "> "
|
#define PROMPT "> "
|
||||||
|
|
||||||
|
@ -39,10 +39,14 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
PromptDialog::PromptDialog(OSystem* osystem, DialogContainer* parent,
|
PromptWidget::PromptWidget(GuiObject* boss, int x, int y, int w, int h)
|
||||||
int x, int y, int w, int h)
|
: Widget(boss, x, y, w - kScrollBarWidth, h),
|
||||||
: Dialog(osystem, parent, x, y, w, h)
|
CommandSender(boss)
|
||||||
{
|
{
|
||||||
|
_flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS |
|
||||||
|
WIDGET_TAB_NAVIGATE;
|
||||||
|
_type = kPromptWidget;
|
||||||
|
|
||||||
_kConsoleCharWidth = instance()->consoleFont().getMaxCharWidth();
|
_kConsoleCharWidth = instance()->consoleFont().getMaxCharWidth();
|
||||||
_kConsoleLineHeight = instance()->consoleFont().getFontHeight() + 2;
|
_kConsoleLineHeight = instance()->consoleFont().getFontHeight() + 2;
|
||||||
|
|
||||||
|
@ -58,7 +62,8 @@ PromptDialog::PromptDialog(OSystem* osystem, DialogContainer* parent,
|
||||||
_firstLineInBuffer = 0;
|
_firstLineInBuffer = 0;
|
||||||
|
|
||||||
// Add scrollbar
|
// Add scrollbar
|
||||||
_scrollBar = new ScrollBarWidget(this, _w - kScrollBarWidth - 1, 0, kScrollBarWidth, _h);
|
_scrollBar = new ScrollBarWidget(boss, _x + _w, _y, kScrollBarWidth, _h);
|
||||||
|
|
||||||
_scrollBar->setTarget(this);
|
_scrollBar->setTarget(this);
|
||||||
|
|
||||||
// Init History
|
// Init History
|
||||||
|
@ -74,27 +79,19 @@ PromptDialog::PromptDialog(OSystem* osystem, DialogContainer* parent,
|
||||||
string version = string("Stella version ") + STELLA_VERSION + "\n";
|
string version = string("Stella version ") + STELLA_VERSION + "\n";
|
||||||
print(version.c_str());
|
print(version.c_str());
|
||||||
print("Debugger is ready\n");
|
print("Debugger is ready\n");
|
||||||
|
print(PROMPT);
|
||||||
|
_promptStartPos = _promptEndPos = _currentPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
PromptDialog::~PromptDialog()
|
PromptWidget::~PromptWidget()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::loadConfig()
|
void PromptWidget::drawWidget(bool hilite)
|
||||||
{
|
{
|
||||||
if (_promptStartPos == -1)
|
FrameBuffer& fb = _boss->instance()->frameBuffer();
|
||||||
{
|
|
||||||
print(PROMPT);
|
|
||||||
_promptStartPos = _promptEndPos = _currentPos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
void PromptDialog::drawDialog()
|
|
||||||
{
|
|
||||||
FrameBuffer& fb = instance()->frameBuffer();
|
|
||||||
|
|
||||||
// Fill the background
|
// Fill the background
|
||||||
fb.fillRect(_x, _y, _w, _h, kBGColor);
|
fb.fillRect(_x, _y, _w, _h, kBGColor);
|
||||||
|
@ -127,15 +124,24 @@ void PromptDialog::drawDialog()
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::handleMouseWheel(int x, int y, int direction)
|
void PromptWidget::handleMouseDown(int x, int y, int button, int clickCount)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
_scrollBar->handleMouseDown(x, y, button, clickCount);
|
||||||
|
cerr << "PromptWidget::handleMouseDown\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void PromptWidget::handleMouseWheel(int x, int y, int direction)
|
||||||
{
|
{
|
||||||
_scrollBar->handleMouseWheel(x, y, direction);
|
_scrollBar->handleMouseWheel(x, y, direction);
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::handleKeyDown(int ascii, int keycode, int modifiers)
|
bool PromptWidget::handleKeyDown(int ascii, int keycode, int modifiers)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
bool handled = true;
|
||||||
|
|
||||||
switch (keycode)
|
switch (keycode)
|
||||||
{
|
{
|
||||||
|
@ -185,34 +191,6 @@ void PromptDialog::handleKeyDown(int ascii, int keycode, int modifiers)
|
||||||
instance()->frameBuffer().refresh();
|
instance()->frameBuffer().refresh();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#if 0 // FIXME - this may not be included in the 2.0 release
|
|
||||||
case 9: // tab
|
|
||||||
{
|
|
||||||
if (_completionCallbackProc)
|
|
||||||
{
|
|
||||||
int len = _currentPos - _promptStartPos;
|
|
||||||
assert(len >= 0);
|
|
||||||
char *str = new char[len + 1];
|
|
||||||
|
|
||||||
// Copy the user input to str
|
|
||||||
for (i = 0; i < len; i++)
|
|
||||||
str[i] = buffer(_promptStartPos + i);
|
|
||||||
str[len] = '\0';
|
|
||||||
|
|
||||||
char *completion = 0;
|
|
||||||
if ((*_completionCallbackProc)(this, str, completion, _callbackRefCon))
|
|
||||||
{
|
|
||||||
insertIntoPrompt(completion);
|
|
||||||
scrollToCurrent();
|
|
||||||
draw();
|
|
||||||
instance()->frameBuffer().refresh();
|
|
||||||
delete[] completion;
|
|
||||||
}
|
|
||||||
delete[] str;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
case 127:
|
case 127:
|
||||||
killChar(+1);
|
killChar(+1);
|
||||||
draw();
|
draw();
|
||||||
|
@ -317,12 +295,16 @@ void PromptDialog::handleKeyDown(int ascii, int keycode, int modifiers)
|
||||||
putchar(ascii);
|
putchar(ascii);
|
||||||
scrollToCurrent();
|
scrollToCurrent();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
handled = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return handled;
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::insertIntoPrompt(const char* str)
|
void PromptWidget::insertIntoPrompt(const char* str)
|
||||||
{
|
{
|
||||||
unsigned int l = strlen(str);
|
unsigned int l = strlen(str);
|
||||||
|
|
||||||
|
@ -337,7 +319,7 @@ void PromptDialog::insertIntoPrompt(const char* str)
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::handleCommand(CommandSender* sender, int cmd, int data)
|
void PromptWidget::handleCommand(CommandSender* sender, int cmd, int data)
|
||||||
{
|
{
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
|
@ -354,7 +336,7 @@ void PromptDialog::handleCommand(CommandSender* sender, int cmd, int data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::specialKeys(int keycode)
|
void PromptWidget::specialKeys(int keycode)
|
||||||
{
|
{
|
||||||
bool handled = false;
|
bool handled = false;
|
||||||
|
|
||||||
|
@ -399,7 +381,7 @@ void PromptDialog::specialKeys(int keycode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::killChar(int direction)
|
void PromptWidget::killChar(int direction)
|
||||||
{
|
{
|
||||||
if(direction == -1) // Delete previous character (backspace)
|
if(direction == -1) // Delete previous character (backspace)
|
||||||
{
|
{
|
||||||
|
@ -431,7 +413,7 @@ void PromptDialog::killChar(int direction)
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::killLine(int direction)
|
void PromptWidget::killLine(int direction)
|
||||||
{
|
{
|
||||||
if(direction == -1) // erase from current position to beginning of line
|
if(direction == -1) // erase from current position to beginning of line
|
||||||
{
|
{
|
||||||
|
@ -450,7 +432,7 @@ void PromptDialog::killLine(int direction)
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::killLastWord()
|
void PromptWidget::killLastWord()
|
||||||
{
|
{
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
bool space = true;
|
bool space = true;
|
||||||
|
@ -476,7 +458,7 @@ void PromptDialog::killLastWord()
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::addToHistory(const char *str)
|
void PromptWidget::addToHistory(const char *str)
|
||||||
{
|
{
|
||||||
strcpy(_history[_historyIndex], str);
|
strcpy(_history[_historyIndex], str);
|
||||||
_historyIndex = (_historyIndex + 1) % kHistorySize;
|
_historyIndex = (_historyIndex + 1) % kHistorySize;
|
||||||
|
@ -487,7 +469,7 @@ void PromptDialog::addToHistory(const char *str)
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::historyScroll(int direction)
|
void PromptWidget::historyScroll(int direction)
|
||||||
{
|
{
|
||||||
if (_historySize == 0)
|
if (_historySize == 0)
|
||||||
return;
|
return;
|
||||||
|
@ -534,7 +516,7 @@ void PromptDialog::historyScroll(int direction)
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::nextLine()
|
void PromptWidget::nextLine()
|
||||||
{
|
{
|
||||||
int line = _currentPos / _lineWidth;
|
int line = _currentPos / _lineWidth;
|
||||||
if (line == _scrollLine)
|
if (line == _scrollLine)
|
||||||
|
@ -548,7 +530,7 @@ void PromptDialog::nextLine()
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
// Call this (at least) when the current line changes or when a new line is added
|
// Call this (at least) when the current line changes or when a new line is added
|
||||||
void PromptDialog::updateScrollBuffer()
|
void PromptWidget::updateScrollBuffer()
|
||||||
{
|
{
|
||||||
int lastchar = MAX(_promptEndPos, _currentPos);
|
int lastchar = MAX(_promptEndPos, _currentPos);
|
||||||
int line = lastchar / _lineWidth;
|
int line = lastchar / _lineWidth;
|
||||||
|
@ -571,7 +553,7 @@ void PromptDialog::updateScrollBuffer()
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
int PromptDialog::printf(const char *format, ...)
|
int PromptWidget::printf(const char *format, ...)
|
||||||
{
|
{
|
||||||
va_list argptr;
|
va_list argptr;
|
||||||
|
|
||||||
|
@ -582,7 +564,7 @@ int PromptDialog::printf(const char *format, ...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
int PromptDialog::vprintf(const char *format, va_list argptr)
|
int PromptWidget::vprintf(const char *format, va_list argptr)
|
||||||
{
|
{
|
||||||
char buf[2048];
|
char buf[2048];
|
||||||
|
|
||||||
|
@ -596,7 +578,7 @@ int PromptDialog::vprintf(const char *format, va_list argptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::putchar(int c)
|
void PromptWidget::putchar(int c)
|
||||||
{
|
{
|
||||||
putcharIntern(c);
|
putcharIntern(c);
|
||||||
|
|
||||||
|
@ -605,7 +587,7 @@ void PromptDialog::putchar(int c)
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::putcharIntern(int c)
|
void PromptWidget::putcharIntern(int c)
|
||||||
{
|
{
|
||||||
if (c == '\n')
|
if (c == '\n')
|
||||||
nextLine();
|
nextLine();
|
||||||
|
@ -622,13 +604,13 @@ void PromptDialog::putcharIntern(int c)
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::print(string str) // laziness/convenience method
|
void PromptWidget::print(string str) // laziness/convenience method
|
||||||
{
|
{
|
||||||
print(str.c_str());
|
print(str.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::print(const char *str)
|
void PromptWidget::print(const char *str)
|
||||||
{
|
{
|
||||||
while (*str)
|
while (*str)
|
||||||
putcharIntern(*str++);
|
putcharIntern(*str++);
|
||||||
|
@ -638,9 +620,9 @@ void PromptDialog::print(const char *str)
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::drawCaret()
|
void PromptWidget::drawCaret()
|
||||||
{
|
{
|
||||||
FrameBuffer& fb = instance()->frameBuffer();
|
FrameBuffer& fb = _boss->instance()->frameBuffer();
|
||||||
|
|
||||||
int line = _currentPos / _lineWidth;
|
int line = _currentPos / _lineWidth;
|
||||||
|
|
||||||
|
@ -654,11 +636,11 @@ void PromptDialog::drawCaret()
|
||||||
|
|
||||||
char c = buffer(_currentPos);
|
char c = buffer(_currentPos);
|
||||||
fb.fillRect(x, y, _kConsoleCharWidth, _kConsoleLineHeight, kTextColor);
|
fb.fillRect(x, y, _kConsoleCharWidth, _kConsoleLineHeight, kTextColor);
|
||||||
fb.drawChar(instance()->consoleFont(), c, x, y + 2, kBGColor);
|
fb.drawChar(_boss->instance()->consoleFont(), c, x, y + 2, kBGColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void PromptDialog::scrollToCurrent()
|
void PromptWidget::scrollToCurrent()
|
||||||
{
|
{
|
||||||
int line = _promptEndPos / _lineWidth;
|
int line = _promptEndPos / _lineWidth;
|
||||||
|
|
|
@ -13,21 +13,23 @@
|
||||||
// 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: PromptDialog.hxx,v 1.7 2005-06-09 20:09:23 stephena Exp $
|
// $Id: PromptWidget.hxx,v 1.1 2005-06-10 17:46:06 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
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#ifndef PROMPT_DIALOG_HXX
|
#ifndef PROMPT_WIDGET_HXX
|
||||||
#define PROMPT_DIALOG_HXX
|
#define PROMPT_WIDGET_HXX
|
||||||
|
|
||||||
class CommandSender;
|
|
||||||
class DialogContainer;
|
|
||||||
class ScrollBarWidget;
|
class ScrollBarWidget;
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include "Dialog.hxx"
|
|
||||||
|
#include "GuiObject.hxx"
|
||||||
|
#include "Widget.hxx"
|
||||||
|
#include "Command.hxx"
|
||||||
|
#include "bspf.hxx"
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
kBufferSize = 32768,
|
kBufferSize = 32768,
|
||||||
|
@ -36,12 +38,11 @@ enum {
|
||||||
kHistorySize = 20
|
kHistorySize = 20
|
||||||
};
|
};
|
||||||
|
|
||||||
class PromptDialog : public Dialog
|
class PromptWidget : public Widget, public CommandSender
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PromptDialog(OSystem* osystem, DialogContainer* parent,
|
PromptWidget(GuiObject* boss, int x, int y, int w, int h);
|
||||||
int x, int y, int w, int h);
|
virtual ~PromptWidget();
|
||||||
virtual ~PromptDialog();
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
int printf(const char *format, ...);
|
int printf(const char *format, ...);
|
||||||
|
@ -52,7 +53,7 @@ class PromptDialog : public Dialog
|
||||||
protected:
|
protected:
|
||||||
inline char &buffer(int idx) { return _buffer[idx % kBufferSize]; }
|
inline char &buffer(int idx) { return _buffer[idx % kBufferSize]; }
|
||||||
|
|
||||||
void drawDialog();
|
void drawWidget(bool hilite);
|
||||||
void drawCaret();
|
void drawCaret();
|
||||||
void putcharIntern(int c);
|
void putcharIntern(int c);
|
||||||
void insertIntoPrompt(const char *str);
|
void insertIntoPrompt(const char *str);
|
||||||
|
@ -72,11 +73,10 @@ class PromptDialog : public Dialog
|
||||||
void addToHistory(const char *str);
|
void addToHistory(const char *str);
|
||||||
void historyScroll(int direction);
|
void historyScroll(int direction);
|
||||||
|
|
||||||
private:
|
void handleMouseDown(int x, int y, int button, int clickCount);
|
||||||
void handleMouseWheel(int x, int y, int direction);
|
void handleMouseWheel(int x, int y, int direction);
|
||||||
void handleKeyDown(int ascii, int keycode, int modifiers);
|
bool handleKeyDown(int ascii, int keycode, int modifiers);
|
||||||
void handleCommand(CommandSender* sender, int cmd, int data);
|
void handleCommand(CommandSender* sender, int cmd, int data);
|
||||||
void loadConfig();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
char _buffer[kBufferSize];
|
char _buffer[kBufferSize];
|
|
@ -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: ScrollBarWidget.cxx,v 1.5 2005-05-21 16:12:13 stephena Exp $
|
// $Id: ScrollBarWidget.cxx,v 1.6 2005-06-10 17:46:06 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
|
||||||
|
@ -192,27 +192,6 @@ void ScrollBarWidget::handleMouseMoved(int x, int y, int button)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
void ScrollBarWidget::handleTickle() {
|
|
||||||
/*
|
|
||||||
// FIXME/TODO - this code is supposed to allow for "click-repeat" (like key repeat),
|
|
||||||
// i.e. if you click on one of the arrows and keep clicked, it will scroll
|
|
||||||
// continuously. However, just like key repeat, this requires two delays:
|
|
||||||
// First an "initial" delay that has to pass before repeating starts (otherwise
|
|
||||||
// it is near to impossible to achieve single clicks). Secondly, a repeat delay
|
|
||||||
// that determines how often per second a click is simulated.
|
|
||||||
int old_pos = _currentPos;
|
|
||||||
|
|
||||||
if (_draggingPart == kUpArrowPart)
|
|
||||||
_currentPos--;
|
|
||||||
else if (_draggingPart == kDownArrowPart)
|
|
||||||
_currentPos++;
|
|
||||||
|
|
||||||
// Make sure that _currentPos is still inside the bounds
|
|
||||||
checkBounds(old_pos);
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void ScrollBarWidget::checkBounds(int old_pos)
|
void ScrollBarWidget::checkBounds(int old_pos)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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: ScrollBarWidget.hxx,v 1.2 2005-05-13 18:28:06 stephena Exp $
|
// $Id: ScrollBarWidget.hxx,v 1.3 2005-06-10 17:46:06 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
|
||||||
|
@ -49,7 +49,6 @@ class ScrollBarWidget : public Widget, public CommandSender
|
||||||
virtual void handleMouseMoved(int x, int y, int button);
|
virtual void handleMouseMoved(int x, int y, int button);
|
||||||
virtual void handleMouseEntered(int button) { setFlags(WIDGET_HILITED); }
|
virtual void handleMouseEntered(int button) { setFlags(WIDGET_HILITED); }
|
||||||
virtual void handleMouseLeft(int button) { clearFlags(WIDGET_HILITED); _part = kNoPart; draw(); }
|
virtual void handleMouseLeft(int button) { clearFlags(WIDGET_HILITED); _part = kNoPart; draw(); }
|
||||||
virtual void handleTickle();
|
|
||||||
|
|
||||||
// FIXME - this should be private, but then we also have to add accessors
|
// FIXME - this should be private, but then we also have to add accessors
|
||||||
// for _numEntries, _entriesPerPage and _currentPos. This again leads to the question:
|
// for _numEntries, _entriesPerPage and _currentPos. This again leads to the question:
|
||||||
|
|
|
@ -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: TabWidget.cxx,v 1.3 2005-06-08 18:45:09 stephena Exp $
|
// $Id: TabWidget.cxx,v 1.4 2005-06-10 17:46:06 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,6 +35,9 @@ enum {
|
||||||
kTabPadding = 3
|
kTabPadding = 3
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
Widget* GuiObject::_activeWidget;
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
TabWidget::TabWidget(GuiObject *boss, int x, int y, int w, int h)
|
TabWidget::TabWidget(GuiObject *boss, int x, int y, int w, int h)
|
||||||
: Widget(boss, x, y, w, h),
|
: Widget(boss, x, y, w, h),
|
||||||
|
@ -54,6 +57,7 @@ TabWidget::~TabWidget()
|
||||||
{
|
{
|
||||||
delete _tabs[i].firstWidget;
|
delete _tabs[i].firstWidget;
|
||||||
_tabs[i].firstWidget = 0;
|
_tabs[i].firstWidget = 0;
|
||||||
|
// _tabs[i].activeWidget is deleted elsewhere
|
||||||
}
|
}
|
||||||
_tabs.clear();
|
_tabs.clear();
|
||||||
}
|
}
|
||||||
|
@ -71,6 +75,7 @@ int TabWidget::addTab(const string& title)
|
||||||
Tab newTab;
|
Tab newTab;
|
||||||
newTab.title = title;
|
newTab.title = title;
|
||||||
newTab.firstWidget = NULL;
|
newTab.firstWidget = NULL;
|
||||||
|
newTab.activeWidget = NULL;
|
||||||
|
|
||||||
_tabs.push_back(newTab);
|
_tabs.push_back(newTab);
|
||||||
|
|
||||||
|
@ -102,13 +107,74 @@ void TabWidget::setActiveTab(int tabID)
|
||||||
_tabs[_activeTab].firstWidget = _firstWidget;
|
_tabs[_activeTab].firstWidget = _firstWidget;
|
||||||
|
|
||||||
_activeTab = tabID;
|
_activeTab = tabID;
|
||||||
_firstWidget = _tabs[tabID].firstWidget;
|
_firstWidget = _tabs[tabID].firstWidget;
|
||||||
_boss->draw();
|
|
||||||
|
|
||||||
|
// If a widget has been activated elsewhere and it belongs to the
|
||||||
|
// current view, use it. Otherwise use the default.
|
||||||
|
if(_activeWidget && isWidgetInChain(_firstWidget, _activeWidget))
|
||||||
|
_tabs[tabID].activeWidget = _activeWidget;
|
||||||
|
else
|
||||||
|
_activeWidget = _tabs[tabID].activeWidget;
|
||||||
|
|
||||||
|
// Make sure this widget receives focus, and that the other widgets
|
||||||
|
// in the tabview lose focus
|
||||||
|
if(_activeWidget)
|
||||||
|
_activeWidget->receivedFocus();
|
||||||
|
|
||||||
|
_boss->draw();
|
||||||
_boss->instance()->frameBuffer().refresh();
|
_boss->instance()->frameBuffer().refresh();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void TabWidget::cycleTab(int direction)
|
||||||
|
{
|
||||||
|
int tabID = _activeTab;
|
||||||
|
|
||||||
|
// Don't do anything if no tabs have been defined
|
||||||
|
if(tabID == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(direction == -1) // Go to the previous tab, wrap around at beginning
|
||||||
|
{
|
||||||
|
tabID--;
|
||||||
|
if(tabID == -1)
|
||||||
|
tabID = (int)_tabs.size() - 1;
|
||||||
|
}
|
||||||
|
else if(direction == 1) // Go to the next tab, wrap around at end
|
||||||
|
{
|
||||||
|
tabID++;
|
||||||
|
if(tabID == (int)_tabs.size())
|
||||||
|
tabID = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finally, select the active tab
|
||||||
|
setActiveTab(tabID);
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void TabWidget::cycleWidget(int direction)
|
||||||
|
{
|
||||||
|
// Don't do anything if no tabs have been defined
|
||||||
|
if(_activeTab == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(direction == -1)
|
||||||
|
Widget::setPrevInChain(_tabs[_activeTab].firstWidget,
|
||||||
|
_tabs[_activeTab].activeWidget);
|
||||||
|
else if(direction == +1)
|
||||||
|
Widget::setNextInChain(_tabs[_activeTab].firstWidget,
|
||||||
|
_tabs[_activeTab].activeWidget);
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void TabWidget::setActiveWidget(int tabID, Widget* widID)
|
||||||
|
{
|
||||||
|
assert(0 <= tabID && tabID < (int)_tabs.size());
|
||||||
|
_tabs[tabID].activeWidget = widID;
|
||||||
|
widID->receivedFocus();
|
||||||
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void TabWidget::handleMouseDown(int x, int y, int button, int clickCount)
|
void TabWidget::handleMouseDown(int x, int y, int button, int clickCount)
|
||||||
{
|
{
|
||||||
|
@ -132,10 +198,53 @@ void TabWidget::handleMouseDown(int x, int y, int button, int clickCount)
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
bool TabWidget::handleKeyDown(int ascii, int keycode, int modifiers)
|
bool TabWidget::handleKeyDown(int ascii, int keycode, int modifiers)
|
||||||
{
|
{
|
||||||
// TODO: maybe there should be a way to switch between tabs
|
// Test for TAB character
|
||||||
// using the keyboard? E.g. Alt-Shift-Left/Right-Arrow or something
|
// Ctrl-Tab selects next tab
|
||||||
// like that.
|
// Shift-Ctrl-Tab selects previous tab
|
||||||
return Widget::handleKeyDown(ascii, keycode, modifiers);
|
// Tab sets next widget in current tab
|
||||||
|
// Shift-Tab sets previous widget in current tab
|
||||||
|
if(keycode == 9) // tab key
|
||||||
|
{
|
||||||
|
if(_boss->instance()->eventHandler().kbdControl(modifiers))
|
||||||
|
{
|
||||||
|
if(_boss->instance()->eventHandler().kbdShift(modifiers))
|
||||||
|
cycleTab(-1);
|
||||||
|
else
|
||||||
|
cycleTab(+1);
|
||||||
|
}
|
||||||
|
else if(_boss->instance()->eventHandler().kbdShift(modifiers))
|
||||||
|
cycleWidget(-1);
|
||||||
|
else
|
||||||
|
cycleWidget(+1);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (_activeWidget)
|
||||||
|
return _activeWidget->handleKeyDown(ascii, keycode, modifiers);
|
||||||
|
else
|
||||||
|
return Widget::handleKeyDown(ascii, keycode, modifiers);
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void TabWidget::handleCommand(CommandSender* sender, int cmd, int data)
|
||||||
|
{
|
||||||
|
switch(cmd)
|
||||||
|
{
|
||||||
|
case kActiveWidgetCmd:
|
||||||
|
if(_activeWidget && isWidgetInChain(_firstWidget, _activeWidget))
|
||||||
|
{
|
||||||
|
_tabs[_activeTab].activeWidget = _activeWidget;
|
||||||
|
Widget::setFocusForChain(_firstWidget, _activeWidget);
|
||||||
|
|
||||||
|
// Make sure the changes are shown onscreen
|
||||||
|
_boss->instance()->frameBuffer().refresh();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
sendCommand(cmd, data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
|
@ -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: TabWidget.hxx,v 1.3 2005-06-02 21:37:33 stephena Exp $
|
// $Id: TabWidget.hxx,v 1.4 2005-06-10 17:46:07 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
|
||||||
|
@ -33,6 +33,7 @@ class TabWidget : public Widget, public CommandSender
|
||||||
struct Tab {
|
struct Tab {
|
||||||
string title;
|
string title;
|
||||||
Widget* firstWidget;
|
Widget* firstWidget;
|
||||||
|
Widget* activeWidget;
|
||||||
};
|
};
|
||||||
typedef GUI::Array<Tab> TabList;
|
typedef GUI::Array<Tab> TabList;
|
||||||
|
|
||||||
|
@ -53,15 +54,18 @@ class TabWidget : public Widget, public CommandSender
|
||||||
//void removeTab(int tabID);
|
//void removeTab(int tabID);
|
||||||
// Setting the active tab:
|
// Setting the active tab:
|
||||||
void setActiveTab(int tabID);
|
void setActiveTab(int tabID);
|
||||||
|
void cycleTab(int direction);
|
||||||
|
void cycleWidget(int direction);
|
||||||
// setActiveTab changes the value of _firstWidget. This means Widgets added afterwards
|
// setActiveTab changes the value of _firstWidget. This means Widgets added afterwards
|
||||||
// will be added to the active tab.
|
// will be added to the active tab.
|
||||||
|
void setActiveWidget(int tabID, Widget* widID);
|
||||||
|
|
||||||
virtual void handleMouseDown(int x, int y, int button, int clickCount);
|
virtual void handleMouseDown(int x, int y, int button, int clickCount);
|
||||||
virtual bool handleKeyDown(int ascii, int keycode, int modifiers);
|
virtual bool handleKeyDown(int ascii, int keycode, int modifiers);
|
||||||
|
virtual void handleCommand(CommandSender* sender, int cmd, int data);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void drawWidget(bool hilite);
|
virtual void drawWidget(bool hilite);
|
||||||
|
|
||||||
virtual Widget *findWidget(int x, int y);
|
virtual Widget *findWidget(int x, int y);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -72,7 +76,6 @@ class TabWidget : public Widget, public CommandSender
|
||||||
private:
|
private:
|
||||||
void box(int x, int y, int width, int height,
|
void box(int x, int y, int width, int height,
|
||||||
OverlayColor colorA, OverlayColor colorB, bool omitBottom);
|
OverlayColor colorA, OverlayColor colorB, bool omitBottom);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -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.12 2005-06-08 18:45:09 stephena Exp $
|
// $Id: Widget.cxx,v 1.13 2005-06-10 17:46:07 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
|
||||||
|
@ -29,6 +29,8 @@
|
||||||
#include "GuiUtils.hxx"
|
#include "GuiUtils.hxx"
|
||||||
#include "Widget.hxx"
|
#include "Widget.hxx"
|
||||||
|
|
||||||
|
//FIXMEstatic int COUNT = 0;
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Widget::Widget(GuiObject* boss, int x, int y, int w, int h)
|
Widget::Widget(GuiObject* boss, int x, int y, int w, int h)
|
||||||
: GuiObject(boss->instance(), boss->parent(), x, y, w, h),
|
: GuiObject(boss->instance(), boss->parent(), x, y, w, h),
|
||||||
|
@ -106,6 +108,33 @@ void Widget::draw()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void Widget::receivedFocus()
|
||||||
|
{
|
||||||
|
if(_hasFocus)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_hasFocus = true;
|
||||||
|
receivedFocusWidget();
|
||||||
|
|
||||||
|
// Only signal a new active widget if the widget has defined that capability
|
||||||
|
// We only care about widgets with WIDGET_TAB_NAVIGATE property
|
||||||
|
if(getFlags() & WIDGET_TAB_NAVIGATE)
|
||||||
|
{
|
||||||
|
_activeWidget = this;
|
||||||
|
_boss->handleCommand(NULL, kActiveWidgetCmd, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* FIXME
|
||||||
|
void Widget::lostFocus()
|
||||||
|
{
|
||||||
|
_hasFocus = false;
|
||||||
|
lostFocusWidget();
|
||||||
|
|
||||||
|
if(getFlags() & WIDGET_TAB_NAVIGATE)
|
||||||
|
cerr << "lost focus: " << this << endl;
|
||||||
|
}
|
||||||
|
*/
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Widget* Widget::findWidgetInChain(Widget *w, int x, int y)
|
Widget* Widget::findWidgetInChain(Widget *w, int x, int y)
|
||||||
{
|
{
|
||||||
|
@ -123,6 +152,169 @@ Widget* Widget::findWidgetInChain(Widget *w, int x, int y)
|
||||||
return w;
|
return w;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
bool Widget::isWidgetInChain(Widget* w, Widget* find)
|
||||||
|
{
|
||||||
|
bool found = false;
|
||||||
|
|
||||||
|
while(w)
|
||||||
|
{
|
||||||
|
// Stop as soon as we find the widget
|
||||||
|
if(w == find)
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
w = w->_next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void Widget::setFocusForChain(Widget* w, Widget* hasFocus)
|
||||||
|
{
|
||||||
|
if(!hasFocus)
|
||||||
|
return;
|
||||||
|
|
||||||
|
while(w)
|
||||||
|
{
|
||||||
|
if(w != hasFocus)
|
||||||
|
w->lostFocus();
|
||||||
|
|
||||||
|
w = w->_next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void Widget::setPrevInChain(Widget* start, Widget* hasFocus)
|
||||||
|
{
|
||||||
|
if(!start)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// We search the array in circular fashion until the 'end' is reached
|
||||||
|
Widget* w = hasFocus;
|
||||||
|
Widget* active = NULL;
|
||||||
|
|
||||||
|
if(w) // start from 'hasFocus'
|
||||||
|
{
|
||||||
|
w = w->_next;
|
||||||
|
while(w)
|
||||||
|
{
|
||||||
|
if(w->getFlags() & WIDGET_TAB_NAVIGATE)
|
||||||
|
{
|
||||||
|
active = w;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
w = w->_next;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we haven't found an active widget by now, start searching from
|
||||||
|
// the beginning of the list
|
||||||
|
if(!active)
|
||||||
|
{
|
||||||
|
w = start;
|
||||||
|
while(w != hasFocus)
|
||||||
|
{
|
||||||
|
if(w->getFlags() & WIDGET_TAB_NAVIGATE)
|
||||||
|
{
|
||||||
|
active = w;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
w = w->_next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // start from the beginning, since no widget currently has focus
|
||||||
|
{
|
||||||
|
w = start;
|
||||||
|
while(w)
|
||||||
|
{
|
||||||
|
if(w->getFlags() & WIDGET_TAB_NAVIGATE)
|
||||||
|
{
|
||||||
|
active = w;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
w = w->_next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// At this point, we *should* have an active widget
|
||||||
|
if(active)
|
||||||
|
active->receivedFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void Widget::setNextInChain(Widget* start, Widget* hasFocus)
|
||||||
|
{
|
||||||
|
if(!start)
|
||||||
|
return;
|
||||||
|
// FIXME - get this working
|
||||||
|
cerr << "--------------------------------\nWidget list:\n";
|
||||||
|
Widget* w1 = start;
|
||||||
|
while(w1)
|
||||||
|
{
|
||||||
|
if(w1->getFlags() & WIDGET_TAB_NAVIGATE)
|
||||||
|
{
|
||||||
|
cerr << w1 << endl;
|
||||||
|
}
|
||||||
|
w1 = w1->_next;
|
||||||
|
}
|
||||||
|
cerr << "\n--------------------------------\n";
|
||||||
|
|
||||||
|
|
||||||
|
// We search the array in circular fashion until the 'end' is reached
|
||||||
|
Widget* w = hasFocus;
|
||||||
|
Widget* active = NULL;
|
||||||
|
|
||||||
|
if(w) // start from 'hasFocus'
|
||||||
|
{
|
||||||
|
w = w->_next;
|
||||||
|
while(w)
|
||||||
|
{
|
||||||
|
if(w->getFlags() & WIDGET_TAB_NAVIGATE)
|
||||||
|
{
|
||||||
|
active = w;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
w = w->_next;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we haven't found an active widget by now, start searching from
|
||||||
|
// the beginning of the list
|
||||||
|
if(!active)
|
||||||
|
{
|
||||||
|
w = start;
|
||||||
|
while(w != hasFocus)
|
||||||
|
{
|
||||||
|
if(w->getFlags() & WIDGET_TAB_NAVIGATE)
|
||||||
|
{
|
||||||
|
active = w;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
w = w->_next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // start from the beginning, since no widget currently has focus
|
||||||
|
{
|
||||||
|
w = start;
|
||||||
|
while(w)
|
||||||
|
{
|
||||||
|
if(w->getFlags() & WIDGET_TAB_NAVIGATE)
|
||||||
|
{
|
||||||
|
active = w;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
w = w->_next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// At this point, we *should* have an active widget
|
||||||
|
if(active)
|
||||||
|
active->receivedFocus();
|
||||||
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
StaticTextWidget::StaticTextWidget(GuiObject *boss, int x, int y, int w, int h,
|
StaticTextWidget::StaticTextWidget(GuiObject *boss, int x, int y, int w, int h,
|
||||||
const string& text, TextAlignment align)
|
const string& text, TextAlignment align)
|
||||||
|
|
|
@ -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.14 2005-06-08 18:45:09 stephena Exp $
|
// $Id: Widget.hxx,v 1.15 2005-06-10 17:46:07 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
|
||||||
|
@ -29,6 +29,7 @@ class Dialog;
|
||||||
#include "OSystem.hxx"
|
#include "OSystem.hxx"
|
||||||
#include "FrameBuffer.hxx"
|
#include "FrameBuffer.hxx"
|
||||||
#include "GuiObject.hxx"
|
#include "GuiObject.hxx"
|
||||||
|
#include "GuiUtils.hxx"
|
||||||
#include "bspf.hxx"
|
#include "bspf.hxx"
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -38,7 +39,7 @@ enum {
|
||||||
WIDGET_BORDER = 1 << 3,
|
WIDGET_BORDER = 1 << 3,
|
||||||
WIDGET_INV_BORDER = 1 << 4,
|
WIDGET_INV_BORDER = 1 << 4,
|
||||||
WIDGET_CLEARBG = 1 << 5,
|
WIDGET_CLEARBG = 1 << 5,
|
||||||
WIDGET_WANT_TICKLE = 1 << 7,
|
WIDGET_TAB_NAVIGATE = 1 << 7,
|
||||||
WIDGET_TRACK_MOUSE = 1 << 8,
|
WIDGET_TRACK_MOUSE = 1 << 8,
|
||||||
WIDGET_RETAIN_FOCUS = 1 << 9
|
WIDGET_RETAIN_FOCUS = 1 << 9
|
||||||
};
|
};
|
||||||
|
@ -52,7 +53,8 @@ enum {
|
||||||
kListWidget = 'LIST',
|
kListWidget = 'LIST',
|
||||||
kScrollBarWidget = 'SCRB',
|
kScrollBarWidget = 'SCRB',
|
||||||
kPopUpWidget = 'POPU',
|
kPopUpWidget = 'POPU',
|
||||||
kTabWidget = 'TABW'
|
kTabWidget = 'TABW',
|
||||||
|
kPromptWidget = 'PROM'
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -64,7 +66,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.14 2005-06-08 18:45:09 stephena Exp $
|
@version $Id: Widget.hxx,v 1.15 2005-06-10 17:46:07 stephena Exp $
|
||||||
*/
|
*/
|
||||||
class Widget : public GuiObject
|
class Widget : public GuiObject
|
||||||
{
|
{
|
||||||
|
@ -87,11 +89,11 @@ class Widget : public GuiObject
|
||||||
virtual bool handleKeyUp(int ascii, int keycode, int modifiers) { return false; }
|
virtual bool handleKeyUp(int ascii, int keycode, int modifiers) { return false; }
|
||||||
virtual void handleJoyDown(int stick, int button) {}
|
virtual void handleJoyDown(int stick, int button) {}
|
||||||
virtual void handleJoyUp(int stick, int button) {}
|
virtual void handleJoyUp(int stick, int button) {}
|
||||||
virtual void handleTickle() {}
|
|
||||||
|
|
||||||
void draw();
|
void draw();
|
||||||
void receivedFocus() { _hasFocus = true; receivedFocusWidget(); }
|
void receivedFocus();
|
||||||
void lostFocus() { _hasFocus = false; lostFocusWidget(); }
|
void lostFocus() { _hasFocus = false; lostFocusWidget(); }
|
||||||
|
|
||||||
virtual bool wantsFocus() { return false; };
|
virtual bool wantsFocus() { return false; };
|
||||||
|
|
||||||
void setFlags(int flags) { _flags |= flags;
|
void setFlags(int flags) { _flags |= flags;
|
||||||
|
@ -136,6 +138,20 @@ class Widget : public GuiObject
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static Widget* findWidgetInChain(Widget* start, int x, int y);
|
static Widget* findWidgetInChain(Widget* start, int x, int y);
|
||||||
|
|
||||||
|
/** Determine if 'find' is in the chain pointed to by 'start' */
|
||||||
|
static bool isWidgetInChain(Widget* start, Widget* find);
|
||||||
|
|
||||||
|
/** Widget 'hasFocus' has focus, make all other widgets in chain lose focus */
|
||||||
|
static void setFocusForChain(Widget* start, Widget* hasFocus);
|
||||||
|
|
||||||
|
/** Select previous widget in chain with WIDGET_TAB_NOTIFY property to have
|
||||||
|
focus, starting from 'hasFocus' */
|
||||||
|
static void setPrevInChain(Widget* start, Widget* hasFocus);
|
||||||
|
|
||||||
|
/** Select next widget in chain with WIDGET_TAB_NOTIFY property to have
|
||||||
|
focus, starting from 'hasFocus' */
|
||||||
|
static void setNextInChain(Widget* start, Widget* hasFocus);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue