Disable the controls for mutally exclusive and unused options in the preferences dialog

Originally committed to SVN as r6519.
This commit is contained in:
Thomas Goyne 2012-02-28 01:22:40 +00:00
parent c4cba875b4
commit 70261b6466
3 changed files with 77 additions and 30 deletions

View File

@ -155,7 +155,7 @@ Audio::Audio(wxTreebook *book, Preferences *parent): OptionPage(book, parent, _(
wxArrayString choice_dtl(4, dtl_arr);
OptionChoice(general, _("Show inactive lines"), choice_dtl, "Audio/Inactive Lines Display Mode");
CellSkip(general);
OptionAdd(general, _("Include comments in inactive lines"), "Audio/Display/Draw/Inactive Comments");
OptionAdd(general, _("Include commented inactive lines"), "Audio/Display/Draw/Inactive Comments");
wxFlexGridSizer *display = PageSizer(_("Display Visual Options"));
OptionAdd(display, _("Selection background"), "Audio/Display/Draw/Selection Background");
@ -196,10 +196,12 @@ Video::Video(wxTreebook *book, Preferences *parent): OptionPage(book, parent, _(
OptionChoice(general, _("Screenshot save path"), scr_res, "Path/Screenshot");
wxFlexGridSizer *resolution = PageSizer(_("Script Resolution"));
OptionAdd(resolution, _("Use resolution of first video opened"), "Subtitle/Default Resolution/Auto");
wxControl *autocb = OptionAdd(resolution, _("Use resolution of first video opened"), "Subtitle/Default Resolution/Auto");
CellSkip(resolution);
OptionAdd(resolution, _("Default width"), "Subtitle/Default Resolution/Width");
OptionAdd(resolution, _("Default height"), "Subtitle/Default Resolution/Height");
DisableIfChecked(autocb,
OptionAdd(resolution, _("Default width"), "Subtitle/Default Resolution/Width"));
DisableIfChecked(autocb,
OptionAdd(resolution, _("Default height"), "Subtitle/Default Resolution/Height"));
const wxString cres_arr[3] = { _("Never"), _("Ask"), _("Always") };
wxArrayString choice_res(3, cres_arr);
@ -456,16 +458,17 @@ void Interface_Hotkeys::OnClearFilter(wxCommandEvent &) {
/// Backup preferences page
Backup::Backup(wxTreebook *book, Preferences *parent): OptionPage(book, parent, _("Backup")) {
wxFlexGridSizer *save = PageSizer(_("Automatic Save"));
OptionAdd(save, _("Enable"), "App/Auto/Save");
wxControl *cb = OptionAdd(save, _("Enable"), "App/Auto/Save");
CellSkip(save);
OptionAdd(save, _("Interval in seconds"), "App/Auto/Save Every Seconds", 1);
OptionBrowse(save, _("Path"), "Path/Auto/Save");
EnableIfChecked(cb,
OptionAdd(save, _("Interval in seconds"), "App/Auto/Save Every Seconds", 1));
OptionBrowse(save, _("Path"), "Path/Auto/Save", cb, true);
OptionAdd(save, _("Autosave after every change"), "App/Auto/Save on Every Change");
wxFlexGridSizer *backup = PageSizer(_("Automatic Backup"));
OptionAdd(backup, _("Enable"), "App/Auto/Backup");
cb = OptionAdd(backup, _("Enable"), "App/Auto/Backup");
CellSkip(backup);
OptionBrowse(backup, _("Path"), "Path/Auto/Backup");
OptionBrowse(backup, _("Path"), "Path/Auto/Backup", cb, true);
SetSizerAndFit(sizer);
}

View File

@ -48,13 +48,16 @@
#include "standard_paths.h"
#include "video_provider_manager.h"
#define OPTION_UPDATER(type, evttype, opt, body) \
class type { \
std::string name; \
Preferences *parent; \
public: \
type(std::string const& n, Preferences *p) : name(n), parent(p) {} \
void operator()(evttype& evt) { parent->SetOption(new agi::opt(name, body)); } \
#define OPTION_UPDATER(type, evttype, opt, body) \
class type { \
std::string name; \
Preferences *parent; \
public: \
type(std::string const& n, Preferences *p) : name(n), parent(p) { } \
void operator()(evttype& evt) { \
evt.Skip(); \
parent->SetOption(new agi::opt(name, body)); \
} \
}
OPTION_UPDATER(StringUpdater, wxCommandEvent, OptionValueString, STD_STR(evt.GetString()));
@ -69,12 +72,9 @@ public:
ColourUpdater(const char *n = "", Preferences *p = NULL) : name(n), parent(p) { }
void operator()(wxCommandEvent& evt) {
ColourButton *btn = static_cast<ColourButton*>(evt.GetClientData());
if (btn) {
if (btn)
parent->SetOption(new agi::OptionValueColour(name, STD_STR(btn->GetColour().GetAsString(wxC2S_CSS_SYNTAX))));
}
else {
evt.Skip();
}
evt.Skip();
}
};
@ -130,7 +130,7 @@ void OptionPage::CellSkip(wxFlexGridSizer *flex) {
flex->Add(new wxStaticText(this, -1, ""), wxSizerFlags().Border());
}
void OptionPage::OptionAdd(wxFlexGridSizer *flex, const wxString &name, const char *opt_name, double min, double max, double inc) {
wxControl *OptionPage::OptionAdd(wxFlexGridSizer *flex, const wxString &name, const char *opt_name, double min, double max, double inc) {
const agi::OptionValue *opt = OPT_GET(opt_name);
switch (opt->GetType()) {
@ -139,35 +139,35 @@ void OptionPage::OptionAdd(wxFlexGridSizer *flex, const wxString &name, const ch
flex->Add(cb, 1, wxEXPAND, 0);
cb->SetValue(opt->GetBool());
cb->Bind(wxEVT_COMMAND_CHECKBOX_CLICKED, BoolUpdater(opt_name, parent));
break;
return cb;
}
case agi::OptionValue::Type_Int: {
wxSpinCtrl *sc = new wxSpinCtrl(this, -1, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, min, max, opt->GetInt());
sc->Bind(wxEVT_COMMAND_SPINCTRL_UPDATED, IntUpdater(opt_name, parent));
Add(flex, name, sc);
break;
return sc;
}
case agi::OptionValue::Type_Double: {
wxSpinCtrlDouble *scd = new wxSpinCtrlDouble(this, -1, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, min, max, opt->GetDouble(), inc);
scd->Bind(wxEVT_COMMAND_SPINCTRL_UPDATED, DoubleUpdater(opt_name, parent));
Add(flex, name, scd);
break;
return scd;
}
case agi::OptionValue::Type_String: {
wxTextCtrl *text = new wxTextCtrl(this, -1 , lagi_wxString(opt->GetString()));
text->Bind(wxEVT_COMMAND_TEXT_UPDATED, StringUpdater(opt_name, parent));
Add(flex, name, text);
break;
return text;
}
case agi::OptionValue::Type_Colour: {
ColourButton *cb = new ColourButton(this, -1, wxSize(40,10), lagi_wxColour(opt->GetColour()));
cb->Bind(wxEVT_COMMAND_BUTTON_CLICKED, ColourUpdater(opt_name, parent));
Add(flex, name, cb);
break;
return cb;
}
default:
@ -213,7 +213,7 @@ wxFlexGridSizer* OptionPage::PageSizer(wxString name) {
return flex;
}
void OptionPage::OptionBrowse(wxFlexGridSizer *flex, const wxString &name, const char *opt_name) {
void OptionPage::OptionBrowse(wxFlexGridSizer *flex, const wxString &name, const char *opt_name, wxControl *enabler, bool do_enable) {
const agi::OptionValue *opt = OPT_GET(opt_name);
if (opt->GetType() != agi::OptionValue::Type_String)
@ -230,6 +230,17 @@ void OptionPage::OptionBrowse(wxFlexGridSizer *flex, const wxString &name, const
button_sizer->Add(browse, wxSizerFlags().Expand());
Add(flex, name, button_sizer);
if (enabler) {
if (do_enable) {
EnableIfChecked(enabler, text);
EnableIfChecked(enabler, browse);
}
else {
DisableIfChecked(enabler, text);
DisableIfChecked(enabler, browse);
}
}
}
void OptionPage::OptionFont(wxSizer *sizer, std::string opt_prefix) {
@ -252,3 +263,30 @@ void OptionPage::OptionFont(wxSizer *sizer, std::string opt_prefix) {
Add(sizer, _("Font Face"), button_sizer);
Add(sizer, _("Font Size"), font_size);
}
struct disabler {
wxControl *ctrl;
bool enable;
disabler(wxControl *ctrl, bool enable) : ctrl(ctrl), enable(enable) { }
void operator()(wxCommandEvent &evt) {
ctrl->Enable(!!evt.GetInt() == enable);
evt.Skip();
}
};
void OptionPage::EnableIfChecked(wxControl *cbx, wxControl *ctrl) {
wxCheckBox *cb = dynamic_cast<wxCheckBox*>(cbx);
if (!cb) return;
ctrl->Enable(cb->IsChecked());
cb->Bind(wxEVT_COMMAND_CHECKBOX_CLICKED, disabler(ctrl, true));
}
void OptionPage::DisableIfChecked(wxControl *cbx, wxControl *ctrl) {
wxCheckBox *cb = dynamic_cast<wxCheckBox*>(cbx);
if (!cb) return;
ctrl->Enable(!cb->IsChecked());
cb->Bind(wxEVT_COMMAND_CHECKBOX_CLICKED, disabler(ctrl, false));
}

View File

@ -37,9 +37,15 @@ public:
OptionPage(wxTreebook *book, Preferences *parent, wxString name, int style = PAGE_DEFAULT);
wxFlexGridSizer* PageSizer(wxString name);
void CellSkip(wxFlexGridSizer *flex);
void OptionAdd(wxFlexGridSizer *flex, const wxString &name, const char *opt_name, double min=0, double max=100, double inc=1);
wxControl *OptionAdd(wxFlexGridSizer *flex, const wxString &name, const char *opt_name, double min=0, double max=100, double inc=1);
void OptionChoice(wxFlexGridSizer *flex, const wxString &name, const wxArrayString &choices, const char *opt_name);
void OptionBrowse(wxFlexGridSizer *flex, const wxString &name, const char *opt_name);
void OptionBrowse(wxFlexGridSizer *flex, const wxString &name, const char *opt_name, wxControl *enabler = 0, bool do_enable = false);
void OptionFont(wxSizer *sizer, std::string opt_prefix);
/// Enable ctrl only when cbx is checked
void EnableIfChecked(wxControl *cbx, wxControl *ctrl);
/// Enable ctrl only when cbx is not checked
void DisableIfChecked(wxControl *cbx, wxControl *ctrl);
};