stella/src/gui/VideoDialog.cxx

694 lines
24 KiB
C++

//============================================================================
//
// SSSS tt lll lll
// SS SS tt ll ll
// SS tttttt eeee ll ll aaaa
// SSSS tt ee ee ll ll aa
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
// SS SS tt ee ll ll aa aa
// SSSS ttt eeeee llll llll aaaaa
//
// Copyright (c) 1995-2018 by Bradford W. Mott, Stephen Anthony
// and the Stella Team
//
// See the file "License.txt" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//============================================================================
#include "bspf.hxx"
#include "Control.hxx"
#include "Dialog.hxx"
#include "Menu.hxx"
#include "OSystem.hxx"
#include "EditTextWidget.hxx"
#include "PopUpWidget.hxx"
#include "Console.hxx"
#include "TIA.hxx"
#include "Settings.hxx"
#include "Widget.hxx"
#include "Font.hxx"
#include "TabWidget.hxx"
#include "NTSCFilter.hxx"
#include "TIASurface.hxx"
#include "VideoDialog.hxx"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
VideoDialog::VideoDialog(OSystem& osystem, DialogContainer& parent,
const GUI::Font& font, int max_w, int max_h)
: Dialog(osystem, parent)
{
const int VGAP = 4;
const int VBORDER = 8;
const int HBORDER = 8;
const int lineHeight = font.getLineHeight(),
fontWidth = font.getMaxCharWidth(),
fontHeight = font.getFontHeight(),
buttonWidth = font.getStringWidth("Defaults") + 20,
buttonHeight = font.getLineHeight() + 4;
int xpos, ypos, tabID;
int lwidth = font.getStringWidth("NTSC Aspect "),
pwidth = font.getStringWidth("XXXXxXXXX"),
swidth = 69;
WidgetArray wid;
VariantList items;
// Set real dimensions
_w = std::min(52 * fontWidth + 10, max_w);
_h = std::min(16 * (lineHeight + VGAP) + 14, max_h);
// The tab widget
xpos = 2; ypos = 4;
myTab = new TabWidget(this, font, xpos, ypos, _w - 2*xpos, _h - buttonHeight - 20);
addTabWidget(myTab);
xpos = HBORDER; ypos = VBORDER;
//////////////////////////////////////////////////////////
// 1) General options
tabID = myTab->addTab(" General ");
// Video renderer
myRenderer = new PopUpWidget(myTab, font, xpos, ypos, pwidth, lineHeight,
instance().frameBuffer().supportedRenderers(),
"Renderer ", lwidth);
wid.push_back(myRenderer);
ypos += lineHeight + VGAP;
// TIA filters (will be dynamically filled later)
myTIAZoom = new PopUpWidget(myTab, font, xpos, ypos, pwidth,
lineHeight, items, "TIA Zoom ", lwidth);
wid.push_back(myTIAZoom);
ypos += lineHeight + VGAP;
// TIA Palette
items.clear();
VarList::push_back(items, "Standard", "standard");
VarList::push_back(items, "Z26", "z26");
VarList::push_back(items, "User", "user");
myTIAPalette = new PopUpWidget(myTab, font, xpos, ypos, pwidth,
lineHeight, items, "TIA Palette ", lwidth);
wid.push_back(myTIAPalette);
ypos += lineHeight + VGAP;
// TIA interpolation
items.clear();
VarList::push_back(items, "Linear", "linear");
VarList::push_back(items, "Nearest", "nearest");
myTIAInterpolate = new PopUpWidget(myTab, font, xpos, ypos, pwidth, lineHeight,
items, "TIA Inter ", lwidth);
wid.push_back(myTIAInterpolate);
ypos += lineHeight + VGAP;
// Timing to use between frames
items.clear();
VarList::push_back(items, "Sleep", "sleep");
VarList::push_back(items, "Busy-wait", "busy");
myFrameTiming = new PopUpWidget(myTab, font, xpos, ypos, pwidth, lineHeight,
items, "Timing (*) ", lwidth);
wid.push_back(myFrameTiming);
ypos += lineHeight + VGAP;
// Aspect ratio (NTSC mode)
myNAspectRatio =
new SliderWidget(myTab, font, xpos, ypos-1, pwidth, lineHeight,
"NTSC Aspect ", lwidth, kNAspectRatioChanged);
myNAspectRatio->setMinValue(80); myNAspectRatio->setMaxValue(120);
wid.push_back(myNAspectRatio);
myNAspectRatioLabel =
new StaticTextWidget(myTab, font, xpos + myNAspectRatio->getWidth() + 4,
ypos + 1, fontWidth * 3, fontHeight, "", TextAlign::Left);
ypos += lineHeight + VGAP;
// Aspect ratio (PAL mode)
myPAspectRatio =
new SliderWidget(myTab, font, xpos, ypos-1, pwidth, lineHeight,
"PAL Aspect ", lwidth, kPAspectRatioChanged);
myPAspectRatio->setMinValue(80); myPAspectRatio->setMaxValue(120);
wid.push_back(myPAspectRatio);
myPAspectRatioLabel =
new StaticTextWidget(myTab, font, xpos + myPAspectRatio->getWidth() + 4,
ypos + 1, fontWidth * 3, fontHeight, "", TextAlign::Left);
ypos += lineHeight + VGAP;
// Framerate
myFrameRate =
new SliderWidget(myTab, font, xpos, ypos-1, pwidth, lineHeight,
"Framerate ", lwidth, kFrameRateChanged);
myFrameRate->setMinValue(0); myFrameRate->setMaxValue(900);
myFrameRate->setStepValue(10);
wid.push_back(myFrameRate);
myFrameRateLabel =
new StaticTextWidget(myTab, font, xpos + myFrameRate->getWidth() + 4,
ypos + 1, fontWidth * 4, fontHeight, "", TextAlign::Left);
// Add message concerning usage
const GUI::Font& infofont = instance().frameBuffer().infoFont();
ypos = myTab->getHeight() - 5 - fontHeight - infofont.getFontHeight() - 10;
new StaticTextWidget(myTab, infofont, 10, ypos,
font.getStringWidth("(*) Requires application restart"), fontHeight,
"(*) Requires application restart", TextAlign::Left);
// Move over to the next column
xpos += myNAspectRatio->getWidth() + myNAspectRatioLabel->getWidth() + 30;
ypos = VBORDER;
// Fullscreen
myFullscreen = new CheckboxWidget(myTab, font, xpos, ypos, "Fullscreen");
wid.push_back(myFullscreen);
ypos += lineHeight + VGAP;
// FS stretch
myUseStretch = new CheckboxWidget(myTab, font, xpos, ypos, "Fullscreen Fill");
wid.push_back(myUseStretch);
ypos += lineHeight + VGAP;
// Use sync to vblank
myUseVSync = new CheckboxWidget(myTab, font, xpos, ypos, "VSync");
wid.push_back(myUseVSync);
ypos += (lineHeight + VGAP) * 2;
// Skip progress load bars for SuperCharger ROMs
// Doesn't really belong here, but I couldn't find a better place for it
myFastSCBios = new CheckboxWidget(myTab, font, xpos, ypos, "Fast SC/AR BIOS");
wid.push_back(myFastSCBios);
ypos += lineHeight + VGAP;
// Show UI messages onscreen
myUIMessages = new CheckboxWidget(myTab, font, xpos, ypos, "Show UI messages");
wid.push_back(myUIMessages);
ypos += lineHeight + VGAP;
// Center window (in windowed mode)
myCenter = new CheckboxWidget(myTab, font, xpos, ypos, "Center window");
wid.push_back(myCenter);
ypos += lineHeight + VGAP;
// Use multi-threading
myUseThreads = new CheckboxWidget(myTab, font, xpos, ypos, "Use multi-threading");
wid.push_back(myUseThreads);
// Add items for tab 0
addToFocusList(wid, myTab, tabID);
//////////////////////////////////////////////////////////
// 2) TV effects options
wid.clear();
tabID = myTab->addTab(" TV Effects ");
xpos = HBORDER;
ypos = VBORDER;
// TV Mode
items.clear();
VarList::push_back(items, "Disabled", NTSCFilter::PRESET_OFF);
VarList::push_back(items, "Composite", NTSCFilter::PRESET_COMPOSITE);
VarList::push_back(items, "S-Video", NTSCFilter::PRESET_SVIDEO);
VarList::push_back(items, "RGB", NTSCFilter::PRESET_RGB);
VarList::push_back(items, "Bad adjust", NTSCFilter::PRESET_BAD);
VarList::push_back(items, "Custom", NTSCFilter::PRESET_CUSTOM);
lwidth = font.getStringWidth("TV Mode ");
pwidth = font.getStringWidth("Bad adjust");
myTVMode =
new PopUpWidget(myTab, font, xpos, ypos, pwidth, lineHeight,
items, "TV Mode ", lwidth, kTVModeChanged);
wid.push_back(myTVMode);
ypos += lineHeight + VGAP;
// Custom adjustables (using macro voodoo)
xpos += 8+1; ypos += 0;
pwidth = lwidth;
lwidth = font.getStringWidth("Saturation ");
#define CREATE_CUSTOM_SLIDERS(obj, desc) \
myTV ## obj = \
new SliderWidget(myTab, font, xpos, ypos-1, pwidth, lineHeight, \
desc, lwidth, kTV ## obj ##Changed); \
myTV ## obj->setMinValue(0); myTV ## obj->setMaxValue(100); \
wid.push_back(myTV ## obj); \
myTV ## obj ## Label = \
new StaticTextWidget(myTab, font, xpos+myTV ## obj->getWidth()+4, \
ypos+1, fontWidth*3, fontHeight, "", TextAlign::Left);\
ypos += lineHeight + VGAP;
pwidth = swidth;
CREATE_CUSTOM_SLIDERS(Contrast, "Contrast ");
CREATE_CUSTOM_SLIDERS(Bright, "Brightness ");
CREATE_CUSTOM_SLIDERS(Hue, "Hue ");
CREATE_CUSTOM_SLIDERS(Satur, "Saturation ");
CREATE_CUSTOM_SLIDERS(Gamma, "Gamma ");
CREATE_CUSTOM_SLIDERS(Sharp, "Sharpness ");
CREATE_CUSTOM_SLIDERS(Res, "Resolution ");
CREATE_CUSTOM_SLIDERS(Artifacts, "Artifacts ");
CREATE_CUSTOM_SLIDERS(Fringe, "Fringing ");
CREATE_CUSTOM_SLIDERS(Bleed, "Bleeding ");
xpos += myTVContrast->getWidth() + myTVContrastLabel->getWidth() + 36;
ypos = VBORDER;
lwidth = font.getStringWidth("Intensity ");
pwidth = font.getMaxCharWidth() * 6;
// TV Phosphor effect
items.clear();
VarList::push_back(items, "Always", "always");
VarList::push_back(items, "Per-ROM", "byrom");
myTVPhosphor = new PopUpWidget(myTab, font, xpos, ypos,
font.getStringWidth("Per-ROM"), lineHeight, items,
"TV Phosphor ", font.getStringWidth("TV Phosphor "));
ypos += lineHeight + VGAP;
// TV Phosphor default level
xpos += 8-8+16;
pwidth = swidth;
CREATE_CUSTOM_SLIDERS(PhosLevel, "Default ");
ypos += 6;
// Scanline intensity and interpolation
xpos -= 8+8;
myTVScanLabel =
new StaticTextWidget(myTab, font, xpos, ypos, font.getStringWidth("Scanline settings"),
fontHeight, "Scanline settings", TextAlign::Left);
ypos += lineHeight;
xpos += 8+8;
CREATE_CUSTOM_SLIDERS(ScanIntense, "Intensity ");
myTVScanInterpolate = new CheckboxWidget(myTab, font, xpos, ypos,
"Interpolation");
wid.push_back(myTVScanInterpolate);
ypos += lineHeight + 6;
// Adjustable presets
xpos -= 8+8;
int cloneWidth = font.getStringWidth("Clone Bad Adjust") + 20;
#define CREATE_CLONE_BUTTON(obj, desc) \
myClone ## obj = \
new ButtonWidget(myTab, font, xpos, ypos, cloneWidth, buttonHeight,\
desc, kClone ## obj ##Cmd); \
wid.push_back(myClone ## obj); \
ypos += lineHeight + 4 + VGAP
ypos += VGAP;
CREATE_CLONE_BUTTON(Composite, "Clone Composite");
CREATE_CLONE_BUTTON(Svideo, "Clone S-Video");
CREATE_CLONE_BUTTON(RGB, "Clone RGB");
CREATE_CLONE_BUTTON(Bad, "Clone Bad Adjust");
CREATE_CLONE_BUTTON(Custom, "Revert");
// Add items for tab 2
addToFocusList(wid, myTab, tabID);
// Activate the first tab
myTab->setActiveTab(0);
// Add Defaults, OK and Cancel buttons
wid.clear();
ButtonWidget* b;
b = new ButtonWidget(this, font, 10, _h - buttonHeight - 10,
buttonWidth, buttonHeight, "Defaults", GuiObject::kDefaultsCmd);
wid.push_back(b);
addOKCancelBGroup(wid, font);
addBGroupToFocusList(wid);
// Disable certain functions when we know they aren't present
#ifndef WINDOWED_SUPPORT
myFullscreen->clearFlags(WIDGET_ENABLED);
myCenter->clearFlags(WIDGET_ENABLED);
#endif
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::loadConfig()
{
// Renderer settings
myRenderer->setSelected(instance().settings().getString("video"), "default");
// TIA Filter
// These are dynamically loaded, since they depend on the size of
// the desktop and which renderer we're using
const VariantList& items = instance().frameBuffer().supportedTIAZoomLevels();
myTIAZoom->addItems(items);
myTIAZoom->setSelected(instance().settings().getString("tia.zoom"), "3");
// TIA Palette
myTIAPalette->setSelected(
instance().settings().getString("palette"), "standard");
// TIA interpolation
const string& tia_inter = instance().settings().getBool("tia.inter") ?
"linear" : "nearest";
myTIAInterpolate->setSelected(tia_inter, "nearest");
// Wait between frames
myFrameTiming->setSelected(
instance().settings().getString("timing"), "sleep");
// Aspect ratio setting (NTSC and PAL)
myNAspectRatio->setValue(instance().settings().getInt("tia.aspectn"));
myNAspectRatioLabel->setLabel(instance().settings().getString("tia.aspectn"));
myPAspectRatio->setValue(instance().settings().getInt("tia.aspectp"));
myPAspectRatioLabel->setLabel(instance().settings().getString("tia.aspectp"));
// Framerate (0 or -1 means automatic framerate calculation)
int rate = instance().settings().getInt("framerate");
myFrameRate->setValue(rate < 0 ? 0 : rate);
myFrameRateLabel->setLabel(rate <= 0 ? "Auto" :
instance().settings().getString("framerate"));
// Fullscreen
myFullscreen->setState(instance().settings().getBool("fullscreen"));
// Fullscreen stretch setting
myUseStretch->setState(instance().settings().getBool("tia.fsfill"));
// Use sync to vertical blank
myUseVSync->setState(instance().settings().getBool("vsync"));
// Show UI messages
myUIMessages->setState(instance().settings().getBool("uimessages"));
// Center window
myCenter->setState(instance().settings().getBool("center"));
// Fast loading of Supercharger BIOS
myFastSCBios->setState(instance().settings().getBool("fastscbios"));
// Multi-threaded rendering
myUseThreads->setState(instance().settings().getBool("threads"));
// TV Mode
myTVMode->setSelected(
instance().settings().getString("tv.filter"), "0");
int preset = instance().settings().getInt("tv.filter");
handleTVModeChange(NTSCFilter::Preset(preset));
// TV Custom adjustables
loadTVAdjustables(NTSCFilter::PRESET_CUSTOM);
// TV phosphor mode
myTVPhosphor->setSelected(
instance().settings().getString("tv.phosphor"), "byrom");
// TV phosphor blend
myTVPhosLevel->setValue(instance().settings().getInt("tv.phosblend"));
myTVPhosLevelLabel->setLabel(instance().settings().getString("tv.phosblend"));
// TV scanline intensity and interpolation
myTVScanIntense->setValue(instance().settings().getInt("tv.scanlines"));
myTVScanIntenseLabel->setLabel(instance().settings().getString("tv.scanlines"));
myTVScanInterpolate->setState(instance().settings().getBool("tv.scaninter"));
myTab->loadConfig();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::saveConfig()
{
// Renderer setting
instance().settings().setValue("video",
myRenderer->getSelectedTag().toString());
// TIA Filter
instance().settings().setValue("tia.zoom",
myTIAZoom->getSelectedTag().toString());
instance().frameBuffer().setZoomMode(instance().settings().getInt("tia.zoom"));
// TIA Palette
instance().settings().setValue("palette",
myTIAPalette->getSelectedTag().toString());
// Wait between frames
instance().settings().setValue("timing",
myFrameTiming->getSelectedTag().toString());
// TIA interpolation
instance().settings().setValue("tia.inter",
myTIAInterpolate->getSelectedTag().toString() == "linear" ? true : false);
// Aspect ratio setting (NTSC and PAL)
instance().settings().setValue("tia.aspectn", myNAspectRatioLabel->getLabel());
instance().settings().setValue("tia.aspectp", myPAspectRatioLabel->getLabel());
// Framerate
int f = myFrameRate->getValue();
instance().settings().setValue("framerate", f);
if(instance().hasConsole())
{
// Make sure auto-frame calculation is only enabled when necessary
instance().console().tia().enableAutoFrame(f <= 0);
instance().console().setFramerate(float(f));
}
// Fullscreen
instance().settings().setValue("fullscreen", myFullscreen->getState());
// Fullscreen stretch setting
instance().settings().setValue("tia.fsfill", myUseStretch->getState());
// Use sync to vertical blank
instance().settings().setValue("vsync", myUseVSync->getState());
// Show UI messages
instance().settings().setValue("uimessages", myUIMessages->getState());
// Center window
instance().settings().setValue("center", myCenter->getState());
// Fast loading of Supercharger BIOS
instance().settings().setValue("fastscbios", myFastSCBios->getState());
// Multi-threaded rendering
instance().settings().setValue("threads", myUseThreads->getState());
if(instance().hasConsole())
instance().frameBuffer().tiaSurface().ntsc().enableThreading(myUseThreads->getState());
// TV Mode
instance().settings().setValue("tv.filter",
myTVMode->getSelectedTag().toString());
// TV Custom adjustables
NTSCFilter::Adjustable adj;
adj.hue = myTVHue->getValue();
adj.saturation = myTVSatur->getValue();
adj.contrast = myTVContrast->getValue();
adj.brightness = myTVBright->getValue();
adj.sharpness = myTVSharp->getValue();
adj.gamma = myTVGamma->getValue();
adj.resolution = myTVRes->getValue();
adj.artifacts = myTVArtifacts->getValue();
adj.fringing = myTVFringe->getValue();
adj.bleed = myTVBleed->getValue();
instance().frameBuffer().tiaSurface().ntsc().setCustomAdjustables(adj);
// TV phosphor mode
instance().settings().setValue("tv.phosphor",
myTVPhosphor->getSelectedTag().toString());
// TV phosphor blend
instance().settings().setValue("tv.phosblend", myTVPhosLevelLabel->getLabel());
Properties::setDefault(Display_PPBlend, myTVPhosLevelLabel->getLabel());
// TV scanline intensity and interpolation
instance().settings().setValue("tv.scanlines", myTVScanIntenseLabel->getLabel());
instance().settings().setValue("tv.scaninter", myTVScanInterpolate->getState());
// Finally, issue a complete framebuffer re-initialization
instance().createFrameBuffer();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::setDefaults()
{
switch(myTab->getActiveTab())
{
case 0: // General
{
myRenderer->setSelectedIndex(0);
myTIAZoom->setSelected("3", "");
myTIAPalette->setSelected("standard", "");
myFrameTiming->setSelected("sleep", "");
myTIAInterpolate->setSelected("nearest", "");
myNAspectRatio->setValue(90);
myNAspectRatioLabel->setLabel("91");
myPAspectRatio->setValue(100);
myPAspectRatioLabel->setLabel("109");
myFrameRate->setValue(0);
myFrameRateLabel->setLabel("Auto");
myFullscreen->setState(false);
myUseStretch->setState(true);
myUseVSync->setState(true);
myUIMessages->setState(true);
myCenter->setState(false);
myFastSCBios->setState(true);
myUseThreads->setState(false);
break;
}
case 1: // TV effects
{
myTVMode->setSelected("0", "0");
// TV phosphor mode
myTVPhosphor->setSelected("byrom", "byrom");
// TV phosphor blend
myTVPhosLevel->setValue(50);
myTVPhosLevelLabel->setLabel("50");
// TV scanline intensity and interpolation
myTVScanIntense->setValue(25);
myTVScanIntenseLabel->setLabel("25");
myTVScanInterpolate->setState(true);
// Make sure that mutually-exclusive items are not enabled at the same time
handleTVModeChange(NTSCFilter::PRESET_OFF);
loadTVAdjustables(NTSCFilter::PRESET_CUSTOM);
break;
}
}
_dirty = true;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::handleTVModeChange(NTSCFilter::Preset preset)
{
bool enable = preset == NTSCFilter::PRESET_CUSTOM;
bool scanenable = preset != NTSCFilter::PRESET_OFF;
myTVSharp->setEnabled(enable);
myTVSharpLabel->setEnabled(enable);
myTVHue->setEnabled(enable);
myTVHueLabel->setEnabled(enable);
myTVRes->setEnabled(enable);
myTVResLabel->setEnabled(enable);
myTVArtifacts->setEnabled(enable);
myTVArtifactsLabel->setEnabled(enable);
myTVFringe->setEnabled(enable);
myTVFringeLabel->setEnabled(enable);
myTVBleed->setEnabled(enable);
myTVBleedLabel->setEnabled(enable);
myTVBright->setEnabled(enable);
myTVBrightLabel->setEnabled(enable);
myTVContrast->setEnabled(enable);
myTVContrastLabel->setEnabled(enable);
myTVSatur->setEnabled(enable);
myTVSaturLabel->setEnabled(enable);
myTVGamma->setEnabled(enable);
myTVGammaLabel->setEnabled(enable);
myCloneComposite->setEnabled(enable);
myCloneSvideo->setEnabled(enable);
myCloneRGB->setEnabled(enable);
myCloneBad->setEnabled(enable);
myCloneCustom->setEnabled(enable);
myTVScanLabel->setEnabled(scanenable);
myTVScanIntense->setEnabled(scanenable);
myTVScanIntenseLabel->setEnabled(scanenable);
myTVScanInterpolate->setEnabled(scanenable);
_dirty = true;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::loadTVAdjustables(NTSCFilter::Preset preset)
{
NTSCFilter::Adjustable adj;
instance().frameBuffer().tiaSurface().ntsc().getAdjustables(
adj, NTSCFilter::Preset(preset));
myTVSharp->setValue(adj.sharpness);
myTVSharpLabel->setValue(adj.sharpness);
myTVHue->setValue(adj.hue);
myTVHueLabel->setValue(adj.hue);
myTVRes->setValue(adj.resolution);
myTVResLabel->setValue(adj.resolution);
myTVArtifacts->setValue(adj.artifacts);
myTVArtifactsLabel->setValue(adj.artifacts);
myTVFringe->setValue(adj.fringing);
myTVFringeLabel->setValue(adj.fringing);
myTVBleed->setValue(adj.bleed);
myTVBleedLabel->setValue(adj.bleed);
myTVBright->setValue(adj.brightness);
myTVBrightLabel->setValue(adj.brightness);
myTVContrast->setValue(adj.contrast);
myTVContrastLabel->setValue(adj.contrast);
myTVSatur->setValue(adj.saturation);
myTVSaturLabel->setValue(adj.saturation);
myTVGamma->setValue(adj.gamma);
myTVGammaLabel->setValue(adj.gamma);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void VideoDialog::handleCommand(CommandSender* sender, int cmd,
int data, int id)
{
switch(cmd)
{
case GuiObject::kOKCmd:
saveConfig();
close();
break;
case GuiObject::kDefaultsCmd:
setDefaults();
break;
case kNAspectRatioChanged:
myNAspectRatioLabel->setValue(myNAspectRatio->getValue());
break;
case kPAspectRatioChanged:
myPAspectRatioLabel->setValue(myPAspectRatio->getValue());
break;
case kFrameRateChanged:
if(myFrameRate->getValue() == 0)
myFrameRateLabel->setLabel("Auto");
else
myFrameRateLabel->setValue(myFrameRate->getValue());
break;
case kTVModeChanged:
handleTVModeChange(NTSCFilter::Preset(myTVMode->getSelectedTag().toInt()));
break;
case kTVSharpChanged: myTVSharpLabel->setValue(myTVSharp->getValue());
break;
case kTVHueChanged: myTVHueLabel->setValue(myTVHue->getValue());
break;
case kTVResChanged: myTVResLabel->setValue(myTVRes->getValue());
break;
case kTVArtifactsChanged: myTVArtifactsLabel->setValue(myTVArtifacts->getValue());
break;
case kTVFringeChanged: myTVFringeLabel->setValue(myTVFringe->getValue());
break;
case kTVBleedChanged: myTVBleedLabel->setValue(myTVBleed->getValue());
break;
case kTVBrightChanged: myTVBrightLabel->setValue(myTVBright->getValue());
break;
case kTVContrastChanged: myTVContrastLabel->setValue(myTVContrast->getValue());
break;
case kTVSaturChanged: myTVSaturLabel->setValue(myTVSatur->getValue());
break;
case kTVGammaChanged: myTVGammaLabel->setValue(myTVGamma->getValue());
break;
case kTVPhosLevelChanged: myTVPhosLevelLabel->setValue(myTVPhosLevel->getValue());
break;
case kTVScanIntenseChanged: myTVScanIntenseLabel->setValue(myTVScanIntense->getValue());
break;
case kCloneCompositeCmd: loadTVAdjustables(NTSCFilter::PRESET_COMPOSITE);
break;
case kCloneSvideoCmd: loadTVAdjustables(NTSCFilter::PRESET_SVIDEO);
break;
case kCloneRGBCmd: loadTVAdjustables(NTSCFilter::PRESET_RGB);
break;
case kCloneBadCmd: loadTVAdjustables(NTSCFilter::PRESET_BAD);
break;
case kCloneCustomCmd: loadTVAdjustables(NTSCFilter::PRESET_CUSTOM);
break;
default:
Dialog::handleCommand(sender, cmd, data, 0);
break;
}
}