293 lines
9.2 KiB
C++
293 lines
9.2 KiB
C++
//
|
|
// Copyright 2005 The Android Open Source Project
|
|
//
|
|
// Preferences modal dialog.
|
|
//
|
|
|
|
// For compilers that support precompilation, include "wx/wx.h".
|
|
#include "wx/wxprec.h"
|
|
// Otherwise, include all standard headers
|
|
#ifndef WX_PRECOMP
|
|
# include "wx/wx.h"
|
|
#endif
|
|
|
|
#include "PrefsDialog.h"
|
|
#include "Preferences.h"
|
|
#include "MyApp.h"
|
|
#include "Resource.h"
|
|
|
|
BEGIN_EVENT_TABLE(PrefsDialog, wxDialog)
|
|
END_EVENT_TABLE()
|
|
|
|
/*
|
|
* Constructor.
|
|
*/
|
|
PrefsDialog::PrefsDialog(wxWindow* parent)
|
|
: wxDialog(parent, IDD_PREFS, wxT("Preferences"), wxDefaultPosition,
|
|
wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER ),
|
|
mAutoPowerOn(false),
|
|
mGammaCorrection(1.0),
|
|
mEnableSound(true),
|
|
mEnableFakeCamera(true),
|
|
mLogLevel(0)
|
|
{
|
|
LoadPreferences();
|
|
CreateControls();
|
|
}
|
|
|
|
/*
|
|
* Destructor. Not much to do.
|
|
*/
|
|
PrefsDialog::~PrefsDialog()
|
|
{
|
|
}
|
|
|
|
/*
|
|
* Create all of the pages and add them to the notebook.
|
|
*/
|
|
void PrefsDialog::CreateControls(void)
|
|
{
|
|
wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL);
|
|
wxBoxSizer* okCancelSizer = new wxBoxSizer(wxHORIZONTAL);
|
|
mNotebook.Create(this, wxID_ANY);
|
|
wxPanel* page;
|
|
|
|
/* pages added to notebook are owned by notebook */
|
|
page = CreateSimulatorPage(&mNotebook);
|
|
mNotebook.AddPage(page, wxT("Simulator"), true); // selected page
|
|
page = CreateRuntimePage(&mNotebook);
|
|
mNotebook.AddPage(page, wxT("Runtime"), false);
|
|
|
|
wxButton* cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel"),
|
|
wxDefaultPosition, wxDefaultSize, 0);
|
|
okCancelSizer->Add(cancel, 0, wxALL | wxALIGN_RIGHT, kInterSpacing);
|
|
|
|
wxButton* ok = new wxButton(this, wxID_OK, wxT("&OK"),
|
|
wxDefaultPosition, wxDefaultSize, 0);
|
|
okCancelSizer->Add(ok, 0, wxALL | wxALIGN_RIGHT, kInterSpacing);
|
|
|
|
mainSizer->Add(&mNotebook, 1, wxEXPAND);
|
|
mainSizer->Add(okCancelSizer, 0, wxALIGN_RIGHT);
|
|
|
|
SetSizer(mainSizer);
|
|
|
|
mainSizer->Fit(this); // shrink-to-fit
|
|
mainSizer->SetSizeHints(this); // define minimum size
|
|
}
|
|
|
|
/*
|
|
* Load preferences from config file
|
|
*/
|
|
void PrefsDialog::LoadPreferences(void)
|
|
{
|
|
Preferences* pPrefs = ((MyApp*)wxTheApp)->GetPrefs();
|
|
assert(pPrefs != NULL);
|
|
|
|
/*
|
|
* Load preferences.
|
|
*/
|
|
mConfigFile = ((MyApp*)wxTheApp)->GetConfigFileName();
|
|
|
|
pPrefs->GetDouble("gamma", &mGammaCorrection);
|
|
pPrefs->GetString("debugger", /*ref*/ mDebugger);
|
|
pPrefs->GetString("valgrinder", /*ref*/ mValgrinder);
|
|
pPrefs->GetBool("auto-power-on", &mAutoPowerOn);
|
|
pPrefs->GetBool("enable-sound", &mEnableSound);
|
|
pPrefs->GetBool("enable-fake-camera", &mEnableFakeCamera);
|
|
}
|
|
|
|
/*
|
|
* Transfer data from our members to the window controls.
|
|
*
|
|
* First we have to pull the data out of the preferences database.
|
|
* Anything that hasn't already been added with a default value will
|
|
* be given a default here, which may or may not match the default
|
|
* behavior elsewhere. The best solution to this is to define the
|
|
* default when the preferences file is created or read, so that we're
|
|
* never left guessing here.
|
|
*/
|
|
bool PrefsDialog::TransferDataToWindow(void)
|
|
{
|
|
/*
|
|
* Do standard dialog setup.
|
|
*/
|
|
wxTextCtrl* configFileName = (wxTextCtrl*) FindWindow(IDC_SPREFS_CONFIG_NAME);
|
|
wxTextCtrl* debugger = (wxTextCtrl*) FindWindow(IDC_SPREFS_DEBUGGER);
|
|
wxTextCtrl* valgrinder = (wxTextCtrl*) FindWindow(IDC_SPREFS_VALGRINDER);
|
|
wxCheckBox* autoPowerOn = (wxCheckBox*) FindWindow(IDC_SPREFS_AUTO_POWER_ON);
|
|
wxCheckBox* enableSound = (wxCheckBox*) FindWindow(IDC_RPREFS_ENABLE_SOUND);
|
|
wxCheckBox* enableFakeCamera = (wxCheckBox*) FindWindow(IDC_RPREFS_ENABLE_FAKE_CAMERA);
|
|
|
|
wxTextCtrl* gamma = (wxTextCtrl*) FindWindow(IDC_RPREFS_GAMMA);
|
|
|
|
configFileName->SetValue(mConfigFile);
|
|
debugger->SetValue(mDebugger);
|
|
valgrinder->SetValue(mValgrinder);
|
|
autoPowerOn->SetValue(mAutoPowerOn);
|
|
enableSound->SetValue(mEnableSound);
|
|
enableFakeCamera->SetValue(mEnableFakeCamera);
|
|
|
|
wxString tmpStr;
|
|
tmpStr.Printf(wxT("%.3f"), mGammaCorrection);
|
|
gamma->SetValue(tmpStr);
|
|
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
* Transfer and validate data from the window controls.
|
|
*
|
|
* This doesn't get called if the user cancels out of the dialog.
|
|
*/
|
|
bool PrefsDialog::TransferDataFromControls(void)
|
|
{
|
|
/*
|
|
* Do standard dialog export.
|
|
*
|
|
* We should error-check all of these.
|
|
*/
|
|
// configName is read-only, don't need it here
|
|
wxTextCtrl* debugger = (wxTextCtrl*) FindWindow(IDC_SPREFS_DEBUGGER);
|
|
wxTextCtrl* valgrinder = (wxTextCtrl*) FindWindow(IDC_SPREFS_VALGRINDER);
|
|
wxCheckBox* autoPowerOn = (wxCheckBox*) FindWindow(IDC_SPREFS_AUTO_POWER_ON);
|
|
wxCheckBox* enableSound = (wxCheckBox*) FindWindow(IDC_RPREFS_ENABLE_SOUND);
|
|
wxCheckBox* enableFakeCamera = (wxCheckBox*) FindWindow(IDC_RPREFS_ENABLE_FAKE_CAMERA);
|
|
|
|
wxTextCtrl* gamma = (wxTextCtrl*) FindWindow(IDC_RPREFS_GAMMA);
|
|
|
|
mDebugger = debugger->GetValue();
|
|
mValgrinder = valgrinder->GetValue();
|
|
mAutoPowerOn = autoPowerOn->GetValue();
|
|
mEnableSound = enableSound->GetValue();
|
|
mEnableFakeCamera = enableFakeCamera->GetValue();
|
|
|
|
wxString tmpStr;
|
|
tmpStr = gamma->GetValue();
|
|
bool toDouble = tmpStr.ToDouble(&mGammaCorrection); // returns 0.0 on err; use strtof()?
|
|
|
|
if (!toDouble || mGammaCorrection <= 0.0 || mGammaCorrection > 2.0) {
|
|
wxMessageBox(wxT("Bad value for gamma -- must be > 0.0 and <= 2.0"),
|
|
wxT("Hoser"), wxOK, this);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
* Transfer preferences to config file
|
|
*/
|
|
bool PrefsDialog::TransferDataFromWindow(void)
|
|
{
|
|
Preferences* pPrefs = ((MyApp*)wxTheApp)->GetPrefs();
|
|
assert(pPrefs != NULL);
|
|
|
|
/*
|
|
* Grab the information from the controls and save in member field
|
|
*/
|
|
|
|
if (!TransferDataFromControls())
|
|
return false;
|
|
|
|
pPrefs->SetString("debugger", mDebugger.ToAscii());
|
|
pPrefs->SetString("valgrinder", mValgrinder.ToAscii());
|
|
pPrefs->SetBool("auto-power-on", mAutoPowerOn);
|
|
pPrefs->SetBool("enable-sound", mEnableSound);
|
|
pPrefs->SetBool("enable-fake-camera", mEnableFakeCamera);
|
|
|
|
pPrefs->SetDouble("gamma", mGammaCorrection);
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
/*
|
|
* Create the Simulator Preferences page.
|
|
*/
|
|
wxPanel* PrefsDialog::CreateSimulatorPage(wxBookCtrlBase* parent)
|
|
{
|
|
wxPanel* panel = new wxPanel(parent);
|
|
|
|
wxStaticText* configNameDescr = new wxStaticText(panel, wxID_STATIC,
|
|
wxT("Config file:"));
|
|
wxTextCtrl* configName = new wxTextCtrl(panel, IDC_SPREFS_CONFIG_NAME,
|
|
wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_READONLY);
|
|
// make it visibly different; unfortunately this kills scroll, copy&paste
|
|
configName->Enable(false);
|
|
|
|
wxStaticText* debuggerDescr = new wxStaticText(panel, wxID_STATIC,
|
|
wxT("Debugger:"));
|
|
wxTextCtrl* debugger = new wxTextCtrl(panel, IDC_SPREFS_DEBUGGER);
|
|
|
|
wxStaticText* valgrinderDescr = new wxStaticText(panel, wxID_STATIC,
|
|
wxT("Valgrind:"));
|
|
wxTextCtrl* valgrinder = new wxTextCtrl(panel, IDC_SPREFS_VALGRINDER);
|
|
|
|
wxCheckBox* autoPowerOn = new wxCheckBox(panel, IDC_SPREFS_AUTO_POWER_ON,
|
|
wxT("Boot runtime when simulator starts"));
|
|
|
|
wxBoxSizer* sizerPanel = new wxBoxSizer(wxVERTICAL);
|
|
sizerPanel->Add(kMinWidth, kEdgeSpacing); // forces minimum width
|
|
sizerPanel->Add(configNameDescr);
|
|
sizerPanel->Add(configName, 0, wxEXPAND);
|
|
sizerPanel->AddSpacer(kInterSpacing);
|
|
sizerPanel->AddSpacer(kInterSpacing);
|
|
sizerPanel->Add(debuggerDescr);
|
|
sizerPanel->Add(debugger, 0, wxEXPAND);
|
|
sizerPanel->AddSpacer(kInterSpacing);
|
|
sizerPanel->Add(valgrinderDescr);
|
|
sizerPanel->Add(valgrinder, 0, wxEXPAND);
|
|
sizerPanel->AddSpacer(kInterSpacing);
|
|
sizerPanel->Add(autoPowerOn);
|
|
sizerPanel->AddSpacer(kInterSpacing);
|
|
|
|
wxBoxSizer* horizIndent = new wxBoxSizer(wxHORIZONTAL);
|
|
horizIndent->AddSpacer(kEdgeSpacing);
|
|
horizIndent->Add(sizerPanel, wxSHAPED);
|
|
horizIndent->AddSpacer(kEdgeSpacing);
|
|
panel->SetSizer(horizIndent);
|
|
|
|
return panel;
|
|
}
|
|
|
|
/*
|
|
* Create the Runtime Preferences page.
|
|
*/
|
|
wxPanel* PrefsDialog::CreateRuntimePage(wxBookCtrlBase* parent)
|
|
{
|
|
wxPanel* panel = new wxPanel(parent);
|
|
|
|
wxStaticText* gammaStrDescr = new wxStaticText(panel, wxID_STATIC,
|
|
wxT("Gamma correction:"));
|
|
wxTextCtrl* gammaStr = new wxTextCtrl(panel, IDC_RPREFS_GAMMA);
|
|
|
|
wxBoxSizer* gammaSizer = new wxBoxSizer(wxHORIZONTAL);
|
|
gammaSizer->Add(gammaStrDescr, 0, wxALIGN_CENTER_VERTICAL);
|
|
gammaSizer->AddSpacer(kInterSpacing);
|
|
gammaSizer->Add(gammaStr);
|
|
|
|
wxBoxSizer* sizerPanel = new wxBoxSizer(wxVERTICAL);
|
|
sizerPanel->Add(kMinWidth, kEdgeSpacing); // forces minimum width
|
|
sizerPanel->Add(gammaSizer);
|
|
sizerPanel->AddSpacer(kInterSpacing);
|
|
|
|
wxCheckBox* enableSound = new wxCheckBox(panel, IDC_RPREFS_ENABLE_SOUND,
|
|
wxT("Enable Sound"));
|
|
sizerPanel->AddSpacer(kInterSpacing);
|
|
sizerPanel->Add(enableSound);
|
|
|
|
wxCheckBox* enableFakeCamera = new wxCheckBox(panel, IDC_RPREFS_ENABLE_FAKE_CAMERA,
|
|
wxT("Enable Fake Camera"));
|
|
sizerPanel->AddSpacer(kInterSpacing);
|
|
sizerPanel->Add(enableFakeCamera);
|
|
|
|
wxBoxSizer* horizIndent = new wxBoxSizer(wxHORIZONTAL);
|
|
horizIndent->AddSpacer(kEdgeSpacing);
|
|
horizIndent->Add(sizerPanel, wxEXPAND);
|
|
horizIndent->AddSpacer(kEdgeSpacing);
|
|
panel->SetSizer(horizIndent);
|
|
|
|
return panel;
|
|
}
|
|
|