mirror of https://github.com/stella-emu/stella.git
Change YStart and Display widgets in GameInfoDialog to be sliders
instead of textboxes. This allows to eliminate error checking, since the widget will only allow sane values. Added YStart/Display min/max variables to FrameManager, and refactor for other parts of the codebase to use these variables.
This commit is contained in:
parent
6c33dda9dd
commit
bf1ff1aae0
|
@ -486,7 +486,7 @@ void Console::changeYStart(int direction)
|
||||||
|
|
||||||
if(direction == +1) // increase YStart
|
if(direction == +1) // increase YStart
|
||||||
{
|
{
|
||||||
if(ystart >= 64)
|
if(ystart >= FrameManager::maxYStart)
|
||||||
{
|
{
|
||||||
myOSystem.frameBuffer().showMessage("YStart at maximum");
|
myOSystem.frameBuffer().showMessage("YStart at maximum");
|
||||||
return;
|
return;
|
||||||
|
@ -495,7 +495,7 @@ void Console::changeYStart(int direction)
|
||||||
}
|
}
|
||||||
else if(direction == -1) // decrease YStart
|
else if(direction == -1) // decrease YStart
|
||||||
{
|
{
|
||||||
if(ystart == 0)
|
if(ystart == FrameManager::minYStart-1)
|
||||||
{
|
{
|
||||||
myOSystem.frameBuffer().showMessage("YStart at minimum");
|
myOSystem.frameBuffer().showMessage("YStart at minimum");
|
||||||
return;
|
return;
|
||||||
|
@ -510,6 +510,9 @@ void Console::changeYStart(int direction)
|
||||||
|
|
||||||
ostringstream val;
|
ostringstream val;
|
||||||
val << ystart;
|
val << ystart;
|
||||||
|
if(ystart == FrameManager::minYStart-1)
|
||||||
|
myOSystem.frameBuffer().showMessage("YStart autodetected");
|
||||||
|
else
|
||||||
myOSystem.frameBuffer().showMessage("YStart " + val.str());
|
myOSystem.frameBuffer().showMessage("YStart " + val.str());
|
||||||
myProperties.set(Display_YStart, val.str());
|
myProperties.set(Display_YStart, val.str());
|
||||||
}
|
}
|
||||||
|
@ -523,8 +526,7 @@ void Console::changeHeight(int direction)
|
||||||
if(direction == +1) // increase Height
|
if(direction == +1) // increase Height
|
||||||
{
|
{
|
||||||
height++;
|
height++;
|
||||||
if (height < 210) height = 210;
|
if(height > FrameManager::maxViewableHeight || height > dheight)
|
||||||
if(height > 256 || height > dheight)
|
|
||||||
{
|
{
|
||||||
myOSystem.frameBuffer().showMessage("Height at maximum");
|
myOSystem.frameBuffer().showMessage("Height at maximum");
|
||||||
return;
|
return;
|
||||||
|
@ -533,7 +535,7 @@ void Console::changeHeight(int direction)
|
||||||
else if(direction == -1) // decrease Height
|
else if(direction == -1) // decrease Height
|
||||||
{
|
{
|
||||||
height--;
|
height--;
|
||||||
if(height < 210) height = 0;
|
if(height < FrameManager::minViewableHeight) height = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return;
|
return;
|
||||||
|
@ -551,12 +553,12 @@ void Console::changeHeight(int direction)
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void Console::setTIAProperties()
|
void Console::setTIAProperties()
|
||||||
{
|
{
|
||||||
// TODO - query these values directly from the TIA if value is 'AUTO'
|
|
||||||
uInt32 ystart = atoi(myProperties.get(Display_YStart).c_str());
|
uInt32 ystart = atoi(myProperties.get(Display_YStart).c_str());
|
||||||
if(ystart > 64) ystart = 64;
|
if(ystart != 0)
|
||||||
|
ystart = BSPF::clamp(ystart, FrameManager::minYStart, FrameManager::maxYStart);
|
||||||
uInt32 height = atoi(myProperties.get(Display_Height).c_str());
|
uInt32 height = atoi(myProperties.get(Display_Height).c_str());
|
||||||
if(height < 210 && height != 0) height = 210;
|
if(height != 0)
|
||||||
else if(height > 256) height = 256;
|
height = BSPF::clamp(height, FrameManager::minViewableHeight, FrameManager::maxViewableHeight);
|
||||||
|
|
||||||
myTIA->autodetectTvMode(false);
|
myTIA->autodetectTvMode(false);
|
||||||
|
|
||||||
|
|
|
@ -654,7 +654,7 @@ void FrameBuffer::setAvailableVidModes(uInt32 baseWidth, uInt32 baseHeight)
|
||||||
|
|
||||||
// Figure our the smallest zoom level we can use
|
// Figure our the smallest zoom level we can use
|
||||||
uInt32 firstZoom = 2;
|
uInt32 firstZoom = 2;
|
||||||
if(myDesktopSize.w < 640 || myDesktopSize.h < 480)
|
if(myDesktopSize.w < kFBMinW || myDesktopSize.h < kFBMinH)
|
||||||
firstZoom = 1;
|
firstZoom = 1;
|
||||||
for(uInt32 zoom = firstZoom; zoom <= maxZoom; ++zoom)
|
for(uInt32 zoom = firstZoom; zoom <= maxZoom; ++zoom)
|
||||||
{
|
{
|
||||||
|
|
|
@ -33,6 +33,7 @@ namespace GUI {
|
||||||
#include "Variant.hxx"
|
#include "Variant.hxx"
|
||||||
#include "FBSurface.hxx"
|
#include "FBSurface.hxx"
|
||||||
#include "TIASurface.hxx"
|
#include "TIASurface.hxx"
|
||||||
|
#include "FrameManager.hxx"
|
||||||
#include "bspf.hxx"
|
#include "bspf.hxx"
|
||||||
|
|
||||||
// Return values for initialization of framebuffer window
|
// Return values for initialization of framebuffer window
|
||||||
|
@ -129,7 +130,7 @@ class FrameBuffer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
enum {
|
enum {
|
||||||
kTIAMinW = 320u, kTIAMinH = 210u,
|
kTIAMinW = 320u, kTIAMinH = FrameManager::minViewableHeight,
|
||||||
kFBMinW = 640u, kFBMinH = 480u
|
kFBMinW = 640u, kFBMinH = 480u
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -441,7 +441,7 @@ bool OSystem::createLauncher(const string& startdir)
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
string OSystem::getROMInfo(const FilesystemNode& romfile)
|
string OSystem::getROMInfo(const FilesystemNode& romfile)
|
||||||
{
|
{
|
||||||
string md5, type, id, result = "";
|
string md5, type, id;
|
||||||
unique_ptr<Console> console;
|
unique_ptr<Console> console;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -454,8 +454,7 @@ string OSystem::getROMInfo(const FilesystemNode& romfile)
|
||||||
return buf.str();
|
return buf.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
result = getROMInfo(*console);
|
return getROMInfo(*console);
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
|
@ -194,7 +194,7 @@ void Properties::writeQuotedString(ostream& out, const string& s)
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
bool Properties::operator == (const Properties& properties) const
|
bool Properties::operator==(const Properties& properties) const
|
||||||
{
|
{
|
||||||
for(int i = 0; i < LastPropType; ++i)
|
for(int i = 0; i < LastPropType; ++i)
|
||||||
if(myProperties[i] != properties.myProperties[i])
|
if(myProperties[i] != properties.myProperties[i])
|
||||||
|
@ -204,13 +204,13 @@ bool Properties::operator == (const Properties& properties) const
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
bool Properties::operator != (const Properties& properties) const
|
bool Properties::operator!=(const Properties& properties) const
|
||||||
{
|
{
|
||||||
return !(*this == properties);
|
return !(*this == properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Properties& Properties::operator = (const Properties& properties)
|
Properties& Properties::operator=(const Properties& properties)
|
||||||
{
|
{
|
||||||
// Do the assignment only if this isn't a self assignment
|
// Do the assignment only if this isn't a self assignment
|
||||||
if(this != &properties)
|
if(this != &properties)
|
||||||
|
|
|
@ -84,8 +84,9 @@ class FrameManager : public Serializable
|
||||||
string name() const override { return "TIA_FrameManager"; }
|
string name() const override { return "TIA_FrameManager"; }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
static constexpr uInt32 frameBufferHeight = 320;
|
static constexpr uInt32 frameBufferHeight = 320;
|
||||||
|
static constexpr uInt32 minYStart = 1, maxYStart = 64;
|
||||||
|
static constexpr uInt32 minViewableHeight = 210, maxViewableHeight = 256;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include "Props.hxx"
|
#include "Props.hxx"
|
||||||
#include "PropsSet.hxx"
|
#include "PropsSet.hxx"
|
||||||
#include "TabWidget.hxx"
|
#include "TabWidget.hxx"
|
||||||
|
#include "FrameManager.hxx"
|
||||||
#include "Widget.hxx"
|
#include "Widget.hxx"
|
||||||
|
|
||||||
#include "GameInfoDialog.hxx"
|
#include "GameInfoDialog.hxx"
|
||||||
|
@ -317,16 +318,27 @@ GameInfoDialog::GameInfoDialog(
|
||||||
ypos += lineHeight + 5;
|
ypos += lineHeight + 5;
|
||||||
new StaticTextWidget(myTab, font, xpos, ypos+1, lwidth, fontHeight,
|
new StaticTextWidget(myTab, font, xpos, ypos+1, lwidth, fontHeight,
|
||||||
"YStart:", kTextAlignLeft);
|
"YStart:", kTextAlignLeft);
|
||||||
myYStart = new EditTextWidget(myTab, font, xpos+lwidth, ypos,
|
|
||||||
4*fontWidth, fontHeight, "");
|
myYStart = new SliderWidget(myTab, font, xpos+lwidth, ypos, 8*fontWidth, lineHeight,
|
||||||
|
"", 0, kYStartChanged);
|
||||||
|
myYStart->setMinValue(FrameManager::minYStart-1);
|
||||||
|
myYStart->setMaxValue(FrameManager::maxYStart);
|
||||||
wid.push_back(myYStart);
|
wid.push_back(myYStart);
|
||||||
|
myYStartLabel = new StaticTextWidget(myTab, font, xpos+lwidth+myYStart->getWidth() + 4,
|
||||||
|
ypos+1, 5*fontWidth, fontHeight, "", kTextAlignLeft);
|
||||||
|
myYStartLabel->setFlags(WIDGET_CLEARBG);
|
||||||
|
|
||||||
ypos += lineHeight + 5;
|
ypos += lineHeight + 5;
|
||||||
new StaticTextWidget(myTab, font, xpos, ypos+1, lwidth, fontHeight,
|
new StaticTextWidget(myTab, font, xpos, ypos+1, lwidth, fontHeight,
|
||||||
"Height:", kTextAlignLeft);
|
"Height:", kTextAlignLeft);
|
||||||
myHeight = new EditTextWidget(myTab, font, xpos+lwidth, ypos,
|
myHeight = new SliderWidget(myTab, font, xpos+lwidth, ypos, 8*fontWidth, lineHeight,
|
||||||
4*fontWidth, fontHeight, "");
|
"", 0, kHeightChanged);
|
||||||
|
myHeight->setMinValue(FrameManager::minViewableHeight-1);
|
||||||
|
myHeight->setMaxValue(FrameManager::maxViewableHeight);
|
||||||
wid.push_back(myHeight);
|
wid.push_back(myHeight);
|
||||||
|
myHeightLabel = new StaticTextWidget(myTab, font, xpos+lwidth+myHeight->getWidth() + 4,
|
||||||
|
ypos+1, 5*fontWidth, fontHeight, "", kTextAlignLeft);
|
||||||
|
myHeightLabel->setFlags(WIDGET_CLEARBG);
|
||||||
|
|
||||||
ypos += lineHeight + 5;
|
ypos += lineHeight + 5;
|
||||||
pwidth = font.getStringWidth("Yes");
|
pwidth = font.getStringWidth("Yes");
|
||||||
|
@ -462,8 +474,14 @@ void GameInfoDialog::loadView()
|
||||||
|
|
||||||
// Display properties
|
// Display properties
|
||||||
myFormat->setSelected(myGameProperties.get(Display_Format), "AUTO");
|
myFormat->setSelected(myGameProperties.get(Display_Format), "AUTO");
|
||||||
myYStart->setText(myGameProperties.get(Display_YStart));
|
|
||||||
myHeight->setText(myGameProperties.get(Display_Height));
|
const string& ystart = myGameProperties.get(Display_YStart);
|
||||||
|
myYStart->setValue(atoi(ystart.c_str()));
|
||||||
|
myYStartLabel->setLabel(ystart == "0" ? "Auto" : ystart);
|
||||||
|
|
||||||
|
const string& height = myGameProperties.get(Display_Height);
|
||||||
|
myHeight->setValue(atoi(height.c_str()));
|
||||||
|
myHeightLabel->setLabel(height == "0" ? "Auto" : height);
|
||||||
|
|
||||||
const string& phos = myGameProperties.get(Display_Phosphor);
|
const string& phos = myGameProperties.get(Display_Phosphor);
|
||||||
myPhosphor->setSelected(phos, "NO");
|
myPhosphor->setSelected(phos, "NO");
|
||||||
|
@ -516,8 +534,9 @@ void GameInfoDialog::saveConfig()
|
||||||
|
|
||||||
// Display properties
|
// Display properties
|
||||||
myGameProperties.set(Display_Format, myFormat->getSelectedTag().toString());
|
myGameProperties.set(Display_Format, myFormat->getSelectedTag().toString());
|
||||||
myGameProperties.set(Display_YStart, myYStart->getText());
|
myGameProperties.set(Display_YStart, myYStartLabel->getLabel());
|
||||||
myGameProperties.set(Display_Height, myHeight->getText());
|
myGameProperties.set(Display_Height, myHeightLabel->getLabel() == "Auto" ? "0" :
|
||||||
|
myHeightLabel->getLabel());
|
||||||
myGameProperties.set(Display_Phosphor, myPhosphor->getSelectedTag().toString());
|
myGameProperties.set(Display_Phosphor, myPhosphor->getSelectedTag().toString());
|
||||||
myGameProperties.set(Display_PPBlend, myPPBlendLabel->getLabel());
|
myGameProperties.set(Display_PPBlend, myPPBlendLabel->getLabel());
|
||||||
|
|
||||||
|
@ -577,6 +596,20 @@ void GameInfoDialog::handleCommand(CommandSender* sender, int cmd,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case kYStartChanged:
|
||||||
|
if(myYStart->getValue() == FrameManager::minYStart-1)
|
||||||
|
myYStartLabel->setLabel("Auto");
|
||||||
|
else
|
||||||
|
myYStartLabel->setValue(myYStart->getValue());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kHeightChanged:
|
||||||
|
if(myHeight->getValue() == FrameManager::minViewableHeight-1)
|
||||||
|
myHeightLabel->setLabel("Auto");
|
||||||
|
else
|
||||||
|
myHeightLabel->setValue(myHeight->getValue());
|
||||||
|
break;
|
||||||
|
|
||||||
case kPPBlendChanged:
|
case kPPBlendChanged:
|
||||||
myPPBlendLabel->setValue(myPPBlend->getValue());
|
myPPBlendLabel->setValue(myPPBlend->getValue());
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -77,8 +77,10 @@ class GameInfoDialog : public Dialog, public CommandSender
|
||||||
|
|
||||||
// Display properties
|
// Display properties
|
||||||
PopUpWidget* myFormat;
|
PopUpWidget* myFormat;
|
||||||
EditTextWidget* myYStart;
|
SliderWidget* myYStart;
|
||||||
EditTextWidget* myHeight;
|
StaticTextWidget* myYStartLabel;
|
||||||
|
SliderWidget* myHeight;
|
||||||
|
StaticTextWidget* myHeightLabel;
|
||||||
PopUpWidget* myPhosphor;
|
PopUpWidget* myPhosphor;
|
||||||
SliderWidget* myPPBlend;
|
SliderWidget* myPPBlend;
|
||||||
StaticTextWidget* myPPBlendLabel;
|
StaticTextWidget* myPPBlendLabel;
|
||||||
|
@ -87,6 +89,8 @@ class GameInfoDialog : public Dialog, public CommandSender
|
||||||
kLeftCChanged = 'LCch',
|
kLeftCChanged = 'LCch',
|
||||||
kRightCChanged = 'RCch',
|
kRightCChanged = 'RCch',
|
||||||
kMRangeChanged = 'MRch',
|
kMRangeChanged = 'MRch',
|
||||||
|
kYStartChanged = 'YSch',
|
||||||
|
kHeightChanged = 'HTch',
|
||||||
kPhosphorChanged = 'PPch',
|
kPhosphorChanged = 'PPch',
|
||||||
kPPBlendChanged = 'PBch',
|
kPPBlendChanged = 'PBch',
|
||||||
kMCtrlChanged = 'MCch'
|
kMCtrlChanged = 'MCch'
|
||||||
|
|
|
@ -28,7 +28,8 @@ RomInfoWidget::RomInfoWidget(GuiObject* boss, const GUI::Font& font,
|
||||||
: Widget(boss, font, x, y, w, h),
|
: Widget(boss, font, x, y, w, h),
|
||||||
mySurfaceIsValid(false),
|
mySurfaceIsValid(false),
|
||||||
myHaveProperties(false),
|
myHaveProperties(false),
|
||||||
myAvail(w > 400 ? GUI::Size(640, 512) : GUI::Size(320, 256))
|
myAvail(w > 400 ? GUI::Size(640, FrameManager::maxViewableHeight*2) :
|
||||||
|
GUI::Size(320, FrameManager::maxViewableHeight))
|
||||||
{
|
{
|
||||||
_flags = WIDGET_ENABLED;
|
_flags = WIDGET_ENABLED;
|
||||||
_bgcolor = _bgcolorhi = kWidColor;
|
_bgcolor = _bgcolorhi = kWidColor;
|
||||||
|
@ -75,7 +76,7 @@ void RomInfoWidget::parseProperties()
|
||||||
// only draw certain parts of it
|
// only draw certain parts of it
|
||||||
if(mySurface == nullptr)
|
if(mySurface == nullptr)
|
||||||
{
|
{
|
||||||
mySurface = instance().frameBuffer().allocateSurface(320*2, 256*2);
|
mySurface = instance().frameBuffer().allocateSurface(320*2, FrameManager::maxViewableHeight*2);
|
||||||
mySurface->attributes().smoothing = true;
|
mySurface->attributes().smoothing = true;
|
||||||
mySurface->applyAttributes();
|
mySurface->applyAttributes();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue