diff --git a/stella/src/common/FrameBufferSoft.cxx b/stella/src/common/FrameBufferSoft.cxx index c45d30abd..9d0662297 100644 --- a/stella/src/common/FrameBufferSoft.cxx +++ b/stella/src/common/FrameBufferSoft.cxx @@ -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: FrameBufferSoft.cxx,v 1.32 2005-08-03 13:26:01 stephena Exp $ +// $Id: FrameBufferSoft.cxx,v 1.33 2005-08-04 22:59:38 stephena Exp $ //============================================================================ #include @@ -276,6 +276,7 @@ void FrameBufferSoft::postFrameUpdate() { // Now update all the rectangles at once SDL_UpdateRects(myScreen, myRectList->numRects(), myRectList->rects()); +// SDL_UpdateRect(myScreen, 0, 0, 0, 0); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/stella/src/debugger/Debugger.cxx b/stella/src/debugger/Debugger.cxx index ddb9c3421..2c5fd5798 100644 --- a/stella/src/debugger/Debugger.cxx +++ b/stella/src/debugger/Debugger.cxx @@ -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: Debugger.cxx,v 1.79 2005-07-30 22:08:24 urchlay Exp $ +// $Id: Debugger.cxx,v 1.80 2005-08-04 22:59:38 stephena Exp $ //============================================================================ #include "bspf.hxx" @@ -893,10 +893,6 @@ void Debugger::setStartState() { // Lock the bus each time the debugger is entered, so we don't disturb anything mySystem->lockDataBus(); - -// FIXME - do we want this to print each time? -// I think it was needed before because of some bugs I've fixed -// myPrompt->printPrompt(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -909,7 +905,7 @@ void Debugger::setQuitState() // sitting at a breakpoint/trap, this will get us past it. // Somehow this feels like a hack to me, but I don't know why // if(breakPoints->isSet(myCpuDebug->pc())) - mySystem->m6502().execute(1); + mySystem->m6502().execute(1); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -936,16 +932,35 @@ GUI::Rect Debugger::getTiaBounds() const return r; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +GUI::Rect Debugger::getRomBounds() const +{ + // The ROM area is the full area to the right of the tabs + GUI::Rect dialog = getDialogBounds(); + + int x1 = dialog.right - myOSystem->consoleFont().getMaxCharWidth() * 60; + int y1 = 0; + int x2 = dialog.right; + int y2 = dialog.bottom; + GUI::Rect r(x1, y1, x2, y2); + + return r; +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GUI::Rect Debugger::getStatusBounds() const { // The status area is the full area to the right of the TIA image - GUI::Rect dialog = getDialogBounds(); - GUI::Rect tia = getTiaBounds(); + // and left of the ROM area + GUI::Rect tia = getTiaBounds(); + GUI::Rect rom = getRomBounds(); + + int x1 = tia.right + 1; + int y1 = 0; + int x2 = rom.left - 1; + int y2 = tia.bottom; + GUI::Rect r(x1, y1, x2, y2); - GUI::Rect r(tia.width() + 1, 0, - dialog.width(), - tia.height()); return r; } @@ -955,10 +970,14 @@ GUI::Rect Debugger::getTabBounds() const // The tab area is the full area below the TIA image GUI::Rect dialog = getDialogBounds(); GUI::Rect tia = getTiaBounds(); + GUI::Rect rom = getRomBounds(); + + int x1 = 0; + int y1 = tia.bottom + 1; + int x2 = rom.left - 1; + int y2 = dialog.bottom; + GUI::Rect r(x1, y1, x2, y2); - GUI::Rect r(0, tia.height() + 1, - dialog.width(), - dialog.height()); return r; } diff --git a/stella/src/debugger/Debugger.hxx b/stella/src/debugger/Debugger.hxx index 7a0bbba70..6487daac2 100644 --- a/stella/src/debugger/Debugger.hxx +++ b/stella/src/debugger/Debugger.hxx @@ -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: Debugger.hxx,v 1.64 2005-08-01 22:33:12 stephena Exp $ +// $Id: Debugger.hxx,v 1.65 2005-08-04 22:59:38 stephena Exp $ //============================================================================ #ifndef DEBUGGER_HXX @@ -46,16 +46,16 @@ typedef ListFile::const_iterator ListIter; typedef map FunctionMap; -#if 0 +#if 1 enum { kDebuggerWidth = 1023, - kDebuggerLineHeight = 12, // based on the height of the console font + kDebuggerLineHeight = 15, // based on the height of the console font kDebuggerLines = 35, }; #else enum { kDebuggerWidth = 639, - kDebuggerLineHeight = 12, // based on the height of the console font + kDebuggerLineHeight = 15, // based on the height of the console font kDebuggerLines = 20, }; #endif @@ -82,7 +82,7 @@ typedef uInt16 (Debugger::*DEBUGGER_WORD_METHOD)(); for all debugging operations in Stella (parser, 6502 debugger, etc). @author Stephen Anthony - @version $Id: Debugger.hxx,v 1.64 2005-08-01 22:33:12 stephena Exp $ + @version $Id: Debugger.hxx,v 1.65 2005-08-04 22:59:38 stephena Exp $ */ class Debugger : public DialogContainer { @@ -286,8 +286,9 @@ class Debugger : public DialogContainer (takes mediasource into account) */ GUI::Rect getDialogBounds() const; - GUI::Rect getStatusBounds() const; GUI::Rect getTiaBounds() const; + GUI::Rect getRomBounds() const; + GUI::Rect getStatusBounds() const; GUI::Rect getTabBounds() const; /** @@ -359,7 +360,7 @@ class Debugger : public DialogContainer static Debugger* myStaticDebugger; - FunctionMap functions; + FunctionMap functions; }; #endif diff --git a/stella/src/gui/DebuggerDialog.cxx b/stella/src/gui/DebuggerDialog.cxx index f9d1b211b..ba6abb4b9 100644 --- a/stella/src/gui/DebuggerDialog.cxx +++ b/stella/src/gui/DebuggerDialog.cxx @@ -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.29 2005-08-03 13:26:02 stephena Exp $ +// $Id: DebuggerDialog.cxx,v 1.30 2005-08-04 22:59:38 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -51,6 +51,7 @@ DebuggerDialog::DebuggerDialog(OSystem* osystem, DialogContainer* parent, addTiaArea(); addTabArea(); addStatusArea(); + addRomArea(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -61,7 +62,6 @@ DebuggerDialog::~DebuggerDialog() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void DebuggerDialog::loadConfig() { -cerr << "DebuggerDialog::loadConfig()\n"; myTab->loadConfig(); myTiaInfo->loadConfig(); myTiaOutput->loadConfig(); @@ -130,31 +130,29 @@ void DebuggerDialog::addTiaArea() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void DebuggerDialog::addTabArea() { - const int vBorder = 4; - const int vWidth = _w - kButtonWidth - 20; - GUI::Rect r = instance()->debugger().getTabBounds(); + const int vBorder = 4; + const int widWidth = r.width() - vBorder; + const int widHeight = r.height() - 25; // FIXME - magic number/font height + // The tab widget - myTab = new TabWidget(this, r.left, r.top + vBorder, vWidth, - r.height() - vBorder); + myTab = new TabWidget(this, r.left, r.top + vBorder, + r.width(), r.height() - vBorder); // 1) The Prompt/console tab myTab->addTab("Prompt"); - myPrompt = new PromptWidget(myTab, 2, 2, vWidth - vBorder, - r.height() - 25); + myPrompt = new PromptWidget(myTab, 2, 2, widWidth, widHeight); myTab->setParentWidget(0, myPrompt, myPrompt); // 2) The CPU tab myTab->addTab("CPU"); - CpuWidget* cpu = new CpuWidget(myTab, 2, 2, vWidth - vBorder, - r.height() - 25); + CpuWidget* cpu = new CpuWidget(myTab, 2, 2, widWidth, widHeight); myTab->setParentWidget(1, cpu, cpu->activeWidget()); // 3) The RAM tab (part of RIOT) myTab->addTab("RAM"); - RamWidget* ram = new RamWidget(myTab, 2, 2, vWidth - vBorder, - r.height() - 25); + RamWidget* ram = new RamWidget(myTab, 2, 2, widWidth, widHeight); myTab->setParentWidget(2, ram, ram->activeWidget()); // 4) The input/output tab (part of RIOT) @@ -163,8 +161,7 @@ void DebuggerDialog::addTabArea() // 5) The TIA tab myTab->addTab("TIA"); - TiaWidget* tia = new TiaWidget(myTab, 2, 2, vWidth - vBorder, - r.height() - 25); + TiaWidget* tia = new TiaWidget(myTab, 2, 2, widWidth, widHeight); myTab->setParentWidget(4, tia, tia->activeWidget()); @@ -174,24 +171,11 @@ void DebuggerDialog::addTabArea() // 7) The Cheat tab myTab->addTab("Cheat"); - CheatWidget* cheat = new CheatWidget(myTab, 2, 2, - vWidth - vBorder, r.height() - 25); + CheatWidget* cheat = new CheatWidget(myTab, 2, 2, widWidth, widHeight); myTab->setParentWidget(6, cheat, cheat->activeWidget()); // Set active tab to prompt myTab->setActiveTab(0); - - // Add some buttons that are always shown, no matter which tab we're in - int yoff = r.top + vBorder + kTabHeight + 5; - addButton(vWidth + 10, yoff, "Step", kDDStepCmd, 0); - yoff += 22; - addButton(vWidth + 10, yoff, "Trace", kDDTraceCmd, 0); - yoff += 22; - addButton(vWidth + 10, yoff, "Scan +1", kDDSAdvCmd, 0); - yoff += 22; - addButton(vWidth + 10, yoff, "Frame +1", kDDAdvCmd, 0); - - addButton(vWidth + 10, r.bottom - 22 - 10, "Exit", kDDExitCmd, 0); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -201,6 +185,26 @@ void DebuggerDialog::addStatusArea() myTiaInfo = new TiaInfoWidget(this, r.left, r.top, r.width(), r.height()); } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void DebuggerDialog::addRomArea() +{ + GUI::Rect r = instance()->debugger().getRomBounds(); + + // Add some buttons that are always shown, no matter which tab we're in + // FIXME - these positions will definitely change + int xoff = r.right - 100; + int yoff = r.bottom - 150; + addButton(xoff, yoff, "Step", kDDStepCmd, 0); + yoff += 22; + addButton(xoff, yoff, "Trace", kDDTraceCmd, 0); + yoff += 22; + addButton(xoff, yoff, "Scan +1", kDDSAdvCmd, 0); + yoff += 22; + addButton(xoff, yoff, "Frame +1", kDDAdvCmd, 0); + + addButton(xoff, r.bottom - 22 - 10, "Exit", kDDExitCmd, 0); +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void DebuggerDialog::doStep() { diff --git a/stella/src/gui/DebuggerDialog.hxx b/stella/src/gui/DebuggerDialog.hxx index d9aa71bd4..b6924c085 100644 --- a/stella/src/gui/DebuggerDialog.hxx +++ b/stella/src/gui/DebuggerDialog.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: DebuggerDialog.hxx,v 1.14 2005-07-21 19:30:16 stephena Exp $ +// $Id: DebuggerDialog.hxx,v 1.15 2005-08-04 22:59:54 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -58,6 +58,7 @@ class DebuggerDialog : public Dialog void addTiaArea(); void addTabArea(); void addStatusArea(); + void addRomArea(); void doStep(); void doTrace(); diff --git a/stella/src/gui/Dialog.cxx b/stella/src/gui/Dialog.cxx index 999962066..15538c3f2 100644 --- a/stella/src/gui/Dialog.cxx +++ b/stella/src/gui/Dialog.cxx @@ -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: Dialog.cxx,v 1.23 2005-08-03 13:26:02 stephena Exp $ +// $Id: Dialog.cxx,v 1.24 2005-08-04 22:59:54 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -135,6 +135,9 @@ void Dialog::drawDialog() Widget* w = _firstWidget; Widget::setDirtyInChain(w); + // Tell the framebuffer this area is dirty + fb.addDirtyRect(_x, _y, _w, _h); + _dirty = false; } diff --git a/stella/src/gui/DialogContainer.cxx b/stella/src/gui/DialogContainer.cxx index 0c5b11e7a..7b0f73d52 100644 --- a/stella/src/gui/DialogContainer.cxx +++ b/stella/src/gui/DialogContainer.cxx @@ -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: DialogContainer.cxx,v 1.13 2005-08-01 22:33:15 stephena Exp $ +// $Id: DialogContainer.cxx,v 1.14 2005-08-04 22:59:54 stephena Exp $ //============================================================================ #include "OSystem.hxx" @@ -93,8 +93,8 @@ void DialogContainer::draw(bool fullrefresh) void DialogContainer::addDialog(Dialog* d) { myDialogStack.push(d); - myOSystem->frameBuffer().refreshTIA(); - myOSystem->frameBuffer().refreshOverlay(); + d->open(); + d->setDirty(); // Next update() will take care of drawing } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -103,6 +103,9 @@ void DialogContainer::removeDialog() if(!myDialogStack.empty()) { myDialogStack.pop(); + + // We need to redraw all underlying dialogs, since we don't know + // which ones were obscured myOSystem->frameBuffer().refreshTIA(); myOSystem->frameBuffer().refreshOverlay(); } diff --git a/stella/src/gui/InputTextDialog.cxx b/stella/src/gui/InputTextDialog.cxx index cc432334f..ce3667e1d 100644 --- a/stella/src/gui/InputTextDialog.cxx +++ b/stella/src/gui/InputTextDialog.cxx @@ -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: InputTextDialog.cxx,v 1.1 2005-08-04 16:31:24 stephena Exp $ +// $Id: InputTextDialog.cxx,v 1.2 2005-08-04 22:59:54 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -46,9 +46,8 @@ InputTextDialog::InputTextDialog(GuiObject* boss, const GUI::Font& font) // Calculate real dimensions _w = fontWidth * 30; _h = lineHeight * 6; -// FIXME - _x = 100;//(boss->getAbsX() - _w) / 2; - _y = 400;//(boss->getAbsY() - _h) / 2; + _x = (boss->getWidth() - _w) / 2; + _y = (boss->getHeight() - _h) / 2; xpos = 10; ypos = lineHeight; int lwidth = font.getStringWidth("Enter Data:"); @@ -63,6 +62,7 @@ InputTextDialog::InputTextDialog(GuiObject* boss, const GUI::Font& font) _w - xpos - 10, lineHeight, ""); _input->setFont(font); _input->clearFlags(WIDGET_TAB_NAVIGATE); + _input->receivedFocus(); xpos = 10; ypos = 2*lineHeight; _title = new StaticTextWidget(this, xpos, ypos, _w - 2*xpos, fontHeight, diff --git a/stella/src/gui/LauncherDialog.cxx b/stella/src/gui/LauncherDialog.cxx index f41c1f6d0..424a6dcf2 100644 --- a/stella/src/gui/LauncherDialog.cxx +++ b/stella/src/gui/LauncherDialog.cxx @@ -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: LauncherDialog.cxx,v 1.25 2005-07-05 15:25:44 stephena Exp $ +// $Id: LauncherDialog.cxx,v 1.26 2005-08-04 22:59:54 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -52,11 +52,16 @@ LauncherDialog::LauncherDialog(OSystem* osystem, DialogContainer* parent, myGameList(NULL), myProgressBar(NULL) { + const GUI::Font& font = instance()->font(); + const int fontWidth = font.getMaxCharWidth(), + fontHeight = font.getFontHeight(), + lineHeight = font.getLineHeight(); + // Show game name - new StaticTextWidget(this, 10, 8, 200, kLineHeight, + new StaticTextWidget(this, 10, 8, 200, fontHeight, "Select a game from the list ...", kTextAlignLeft); - myRomCount = new StaticTextWidget(this, _w - 100, 8, 90, kLineHeight, + myRomCount = new StaticTextWidget(this, _w - 100, 8, 90, fontHeight, "", kTextAlignRight); // Add four buttons at the bottom @@ -93,9 +98,9 @@ LauncherDialog::LauncherDialog(OSystem* osystem, DialogContainer* parent, myList->clearFlags(WIDGET_TAB_NAVIGATE); // Add note textwidget to show any notes for the currently selected ROM - new StaticTextWidget(this, 20, _h - 43, 30, 16, "Note:", kTextAlignLeft); - myNote = new StaticTextWidget(this, 50, _h - 43, w - 70, 16, - "", kTextAlignLeft); + new StaticTextWidget(this, 20, _h - 43, 30, fontHeight, "Note:", kTextAlignLeft); + myNote = new StaticTextWidget(this, 50, _h - 43, w - 70, fontHeight, + "", kTextAlignLeft); // Create the launcher options dialog, where you can change ROM // and snapshot paths @@ -224,13 +229,8 @@ void LauncherDialog::loadListFromDisk() // Create a progress dialog box to show the progress of processing // the ROMs, since this is usually a time-consuming operation - string message = "Loading ROM's from disk ..."; - int w = instance()->font().getStringWidth(message) + 20, - h = kLineHeight * 4; - int x = (_w - w) / 2, - y = (_h - h) / 2; - ProgressDialog progress(instance(), parent(), x, y, w, h); - progress.setMessage(message); + ProgressDialog progress(this, instance()->font(), + "Loading ROM's from disk ..."); progress.setRange(0, files.size() - 1, 10); // Create a entry for the GameList for each file diff --git a/stella/src/gui/ProgressDialog.cxx b/stella/src/gui/ProgressDialog.cxx index 60e4ca932..e69f08fe8 100644 --- a/stella/src/gui/ProgressDialog.cxx +++ b/stella/src/gui/ProgressDialog.cxx @@ -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: ProgressDialog.cxx,v 1.4 2005-08-01 22:33:15 stephena Exp $ +// $Id: ProgressDialog.cxx,v 1.5 2005-08-04 22:59:54 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -29,24 +29,41 @@ #include "bspf.hxx" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -ProgressDialog::ProgressDialog(OSystem* osystem, DialogContainer* parent, - int x, int y, int w, int h) - : Dialog(osystem, parent, x, y, w, h), +ProgressDialog::ProgressDialog(GuiObject* boss, const GUI::Font& font, + const string& message) + : Dialog(boss->instance(), boss->parent(), 0, 0, 16, 16), myMessage(NULL), mySlider(NULL), myStart(0), myFinish(0), myStep(0) { - myMessage = new StaticTextWidget(this, 0, 10, w, kLineHeight, "", kTextAlignCenter); + const int fontWidth = font.getMaxCharWidth(), + fontHeight = font.getFontHeight(), + lineHeight = font.getLineHeight(); + int xpos, ypos, lwidth; + + // Calculate real dimensions + lwidth = font.getStringWidth(message); + _w = lwidth + 2 * fontWidth; + _h = lineHeight * 5; + _x = (boss->getWidth() - _w) / 2; + _y = (boss->getHeight() - _h) / 2; + + xpos = fontWidth; ypos = lineHeight; + myMessage = new StaticTextWidget(this, xpos, ypos, lwidth, fontHeight, + message, kTextAlignCenter); myMessage->setColor(kTextColorEm); - mySlider = new SliderWidget(this, 10, 15 + kLineHeight, w - 20, kLineHeight, "", 0, 0); + + xpos = fontWidth; ypos += 2 * lineHeight; + mySlider = new SliderWidget(this, xpos, ypos, lwidth, lineHeight, "", 0, 0); mySlider->setMinValue(100); mySlider->setMaxValue(200); mySlider->setValue(100); // Prevents the slider from initially drawing // across the entire screen for a split-second - parent->addDialog(this); + parent()->addDialog(this); + instance()->frameBuffer().update(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -85,6 +102,6 @@ void ProgressDialog::setProgress(int progress) { myCurrentStep += myStep; mySlider->setValue(p); - instance()->frameBuffer().refreshOverlay(true); + instance()->frameBuffer().update(); } } diff --git a/stella/src/gui/ProgressDialog.hxx b/stella/src/gui/ProgressDialog.hxx index e1e919f32..7891e5a5b 100644 --- a/stella/src/gui/ProgressDialog.hxx +++ b/stella/src/gui/ProgressDialog.hxx @@ -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: ProgressDialog.hxx,v 1.1 2005-05-17 18:42:23 stephena Exp $ +// $Id: ProgressDialog.hxx,v 1.2 2005-08-04 22:59:54 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -22,19 +22,18 @@ #ifndef PROGRESS_DIALOG_HXX #define PROGRESS_DIALOG_HXX -class DialogContainer; class StaticTextWidget; class SliderWidget; -#include "OSystem.hxx" +#include "GuiObject.hxx" #include "bspf.hxx" class ProgressDialog : public Dialog { public: - ProgressDialog(OSystem* osystem, DialogContainer* parent, - int x, int y, int w, int h); - ~ProgressDialog(); + ProgressDialog(GuiObject* boss, const GUI::Font& font, + const string& message); + virtual ~ProgressDialog(); void setMessage(const string& message); void setRange(int begin, int end, int step);