diff --git a/aegisub/src/preferences.cpp b/aegisub/src/preferences.cpp index 2c87b0c77..09cf6dae8 100644 --- a/aegisub/src/preferences.cpp +++ b/aegisub/src/preferences.cpp @@ -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); } diff --git a/aegisub/src/preferences_base.cpp b/aegisub/src/preferences_base.cpp index db45f0136..247c81fb5 100644 --- a/aegisub/src/preferences_base.cpp +++ b/aegisub/src/preferences_base.cpp @@ -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(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(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(cbx); + if (!cb) return; + + ctrl->Enable(!cb->IsChecked()); + cb->Bind(wxEVT_COMMAND_CHECKBOX_CLICKED, disabler(ctrl, false)); +} diff --git a/aegisub/src/preferences_base.h b/aegisub/src/preferences_base.h index c5afdab26..313e38add 100644 --- a/aegisub/src/preferences_base.h +++ b/aegisub/src/preferences_base.h @@ -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); };