diff --git a/aegisub/build/aegisub_vs2008/aegisub_vs2008.vcproj b/aegisub/build/aegisub_vs2008/aegisub_vs2008.vcproj
index 0a84db7a5..12868ea65 100644
--- a/aegisub/build/aegisub_vs2008/aegisub_vs2008.vcproj
+++ b/aegisub/build/aegisub_vs2008/aegisub_vs2008.vcproj
@@ -1251,6 +1251,18 @@
RelativePath="..\..\src\preferences.cpp"
>
+
+
+
+
+
+
{
-public:
-
- enum Style {
- PAGE_DEFAULT = 0x00000000,
- PAGE_SCROLL = 0x00000001,
- PAGE_SUB = 0x00000002
- };
-
- wxSizer *sizer;
-
- OptionPage(wxTreebook *book, wxString name, int style = PAGE_DEFAULT):
- wxScrolled(book, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL) {
-
- if (style & PAGE_SUB) {
- book->AddSubPage(this, name, true);
- } else {
- book->AddPage(this, name, true);
- }
-
- if (style & PAGE_SCROLL) {
- SetScrollbars(0, 20, 0, 50);
- } else {
- SetScrollbars(0, 0, 0, 0);
- }
-
- sizer = new wxBoxSizer(wxVERTICAL);
- }
-
- ~OptionPage() {}
-
- void CellSkip(wxFlexGridSizer *&flex) {
- flex->Add(new wxStaticText(this, wxID_ANY , wxEmptyString), 0, wxALL, 5);
- }
-
- void OptionAdd(wxFlexGridSizer *&flex, const wxString &name, const char *opt_name, double min=0, double max=100, double inc=1) {
-
- agi::OptionValue *opt = OPT_GET(opt_name);
-
- int type = opt->GetType();
-
- switch (type) {
-
- case agi::OptionValue::Type_Bool: {
- wxCheckBox *cb = new wxCheckBox(this, wxID_ANY, name);
- flex->Add(cb, 1, wxEXPAND, 0);
- cb->SetValue(opt->GetBool());
- break;
- }
-
- case agi::OptionValue::Type_Int:
- case agi::OptionValue::Type_Double: {
- flex->Add(new wxStaticText(this, wxID_ANY, name), 1, wxALIGN_CENTRE_VERTICAL);
- wxSpinCtrlDouble *scd = new wxSpinCtrlDouble(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, min, max, opt->GetInt(), inc);
- flex->Add(scd);
-
- break;
- }
-
- case agi::OptionValue::Type_String: {
- flex->Add(new wxStaticText(this, wxID_ANY, name), 1, wxALIGN_CENTRE_VERTICAL);
- wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY , lagi_wxString(opt->GetString()), wxDefaultPosition, wxDefaultSize);
- flex->Add(text, 1, wxEXPAND);
- break;
- }
-
- case agi::OptionValue::Type_Colour: {
- flex->Add(new wxStaticText(this, wxID_ANY, name), 1, wxALIGN_CENTRE_VERTICAL);
- flex->Add(new ColourButton(this, wxID_ANY, wxSize(40,10), lagi_wxColour(opt->GetColour())));
- break;
- }
-
- default:
- throw PreferenceNotSupported("Unsupported type");
- }
- }
-
-
- void OptionChoice(wxFlexGridSizer *&flex, const wxString &name, const wxArrayString &choices, const char *opt_name) {
- agi::OptionValue *opt = OPT_GET(opt_name);
-
- int type = opt->GetType();
- wxString selection;
-
- switch (type) {
- case agi::OptionValue::Type_Int: {
- selection = choices.Item(opt->GetInt());
- break;
- }
- case agi::OptionValue::Type_String: {
- selection.assign(opt->GetString());
- break;
- }
- default:
- throw PreferenceNotSupported("Unsupported type");
- }
-
- flex->Add(new wxStaticText(this, wxID_ANY, name), 1, wxALIGN_CENTRE_VERTICAL);
- wxComboBox *cb = new wxComboBox(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, choices, wxCB_READONLY | wxCB_DROPDOWN);
- cb->SetValue(selection);
- flex->Add(cb, 1, wxEXPAND, 0);
- }
-
-
- wxFlexGridSizer* PageSizer(wxString name) {
- wxSizer *tmp_sizer = new wxStaticBoxSizer(wxHORIZONTAL, this, name);
- sizer->Add(tmp_sizer, 0,wxEXPAND, 5);
- wxFlexGridSizer *flex = new wxFlexGridSizer(2,5,5);
- flex->AddGrowableCol(0,1);
- tmp_sizer->Add(flex, 1, wxEXPAND, 5);
- sizer->AddSpacer(8);
- return flex;
- }
-
-
- void OptionBrowse(wxFlexGridSizer *&flex, const wxString &name, BrowseType browse_type, const char *opt_name) {
-
- agi::OptionValue *opt = OPT_GET(opt_name);
-
- if (opt->GetType() != agi::OptionValue::Type_String)
- throw PreferenceIncorrectType("Option must be agi::OptionValue::Type_String for BrowseButton.");
-
- flex->Add(new wxStaticText(this, wxID_ANY, name), 1, wxALIGN_CENTRE_VERTICAL);
-
- wxFlexGridSizer *button_flex = new wxFlexGridSizer(2,5,5);
- button_flex->AddGrowableCol(0,1);
- flex->Add(button_flex, 1, wxEXPAND, 5);
-
- wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY , opt->GetString(), wxDefaultPosition, wxDefaultSize);
- button_flex->Add(text, 1, wxEXPAND);
- BrowseButton *browse = new BrowseButton(this, wxID_ANY, wxEmptyString, browse_type);
- browse->Bind(text);
- button_flex->Add(browse, 1, wxEXPAND);
- }
-};
-
-
-void Preferences::OnOK(wxCommandEvent &event) {
- EndModal(0);
-}
-
-
-void Preferences::OnApply(wxCommandEvent &event) {
-}
-
-
-void Preferences::OnCancel(wxCommandEvent &event) {
- EndModal(0);
-}
-
+#include "preferences_base.h"
/// General preferences page
-class General: public OptionPage {
-public:
- General(wxTreebook *book): OptionPage(book, _("General")) {
+General::General(wxTreebook *book): OptionPage(book, _("General")) {
- wxFlexGridSizer *startup = PageSizer(_("Startup"));
- OptionAdd(startup, _("Check for updates"), "App/Splash");
- OptionAdd(startup, _("Show Splash Screen"), "App/Splash");
+ wxFlexGridSizer *startup = PageSizer(_("Startup"));
+ OptionAdd(startup, _("Check for updates"), "App/Splash");
+ OptionAdd(startup, _("Show Splash Screen"), "App/Splash");
- wxFlexGridSizer *recent = PageSizer(_("Recently Used Lists"));
- OptionAdd(recent, _("Files"), "Limits/MRU");
- OptionAdd(recent, _("Find/Replace"), "Limits/Find Replace");
- sizer->AddSpacer(15);
+ wxFlexGridSizer *recent = PageSizer(_("Recently Used Lists"));
+ OptionAdd(recent, _("Files"), "Limits/MRU");
+ OptionAdd(recent, _("Find/Replace"), "Limits/Find Replace");
+ sizer->AddSpacer(15);
- wxFlexGridSizer *undo = PageSizer(_("Undo / Redo Settings"));
- OptionAdd(undo, _("Undo Levels"), "Limits/MRU");
+ wxFlexGridSizer *undo = PageSizer(_("Undo / Redo Settings"));
+ OptionAdd(undo, _("Undo Levels"), "Limits/MRU");
- SetSizerAndFit(sizer);
- }
-};
+ SetSizerAndFit(sizer);
+}
/// Subtitles preferences page
-class Subtitles: public OptionPage {
-public:
- Subtitles(wxTreebook *book): OptionPage(book, _("Subtitles")) {
+Subtitles::Subtitles(wxTreebook *book): OptionPage(book, _("Subtitles")) {
- wxFlexGridSizer *general = PageSizer(_("Options"));
- OptionAdd(general, _("Enable call tips"), "App/Call Tips");
- OptionAdd(general, _("Enable syntax highlighting"), "Subtitle/Highlight/Syntax");
- OptionAdd(general, _("Link commiting of times"), "Subtitle/Edit Box/Link Time Boxes Commit");
- OptionAdd(general, _("Overwrite-Insertion in time boxes"), "Subtitle/Time Edit/Insert Mode");
+ wxFlexGridSizer *general = PageSizer(_("Options"));
+ OptionAdd(general, _("Enable call tips"), "App/Call Tips");
+ OptionAdd(general, _("Enable syntax highlighting"), "Subtitle/Highlight/Syntax");
+ OptionAdd(general, _("Link commiting of times"), "Subtitle/Edit Box/Link Time Boxes Commit");
+ OptionAdd(general, _("Overwrite-Insertion in time boxes"), "Subtitle/Time Edit/Insert Mode");
- wxFlexGridSizer *grid = PageSizer(_("Grid"));
- OptionAdd(grid, _("Allow grid to take focus"), "Subtitle/Grid/Focus Allow");
- OptionAdd(grid, _("Highlight visible subtitles"), "Subtitle/Grid/Highlight Subtitles in Frame");
+ wxFlexGridSizer *grid = PageSizer(_("Grid"));
+ OptionAdd(grid, _("Allow grid to take focus"), "Subtitle/Grid/Focus Allow");
+ OptionAdd(grid, _("Highlight visible subtitles"), "Subtitle/Grid/Highlight Subtitles in Frame");
- SetSizerAndFit(sizer);
- }
-};
+ SetSizerAndFit(sizer);
+}
/// Audio preferences page
-class Audio: public OptionPage {
-public:
- Audio(wxTreebook *book): OptionPage(book, _("Audio")) {
+Audio::Audio(wxTreebook *book): OptionPage(book, _("Audio")) {
- wxFlexGridSizer *general = PageSizer(_("Options"));
- OptionAdd(general, _("Grab times from line upon selection"), "Audio/Grab Times on Select");
- OptionAdd(general, _("Default mouse wheel to zoom"), "Audio/Wheel Default to Zoom");
- OptionAdd(general, _("Lock scroll on cursor"), "Audio/Lock Scroll on Cursor");
- OptionAdd(general, _("Snap to keyframes"), "Audio/Display/Snap/Keyframes");
- OptionAdd(general, _("Snap to adjacent lines"), "Audio/Display/Snap/Other Lines");
- OptionAdd(general, _("Auto-focus on mouse over"), "Audio/Auto/Focus");
- OptionAdd(general, _("Play audio when stepping in video"), "Audio/Plays When Stepping Video");
- CellSkip(general);
- OptionAdd(general, _("Default timing length"), "Timing/Default Duration", 0, 36000);
- OptionAdd(general, _("Default lead-in length"), "Audio/Lead/IN", 0, 36000);
- OptionAdd(general, _("Default lead-out length"), "Audio/Lead/OUT", 0, 36000);
+ wxFlexGridSizer *general = PageSizer(_("Options"));
+ OptionAdd(general, _("Grab times from line upon selection"), "Audio/Grab Times on Select");
+ OptionAdd(general, _("Default mouse wheel to zoom"), "Audio/Wheel Default to Zoom");
+ OptionAdd(general, _("Lock scroll on cursor"), "Audio/Lock Scroll on Cursor");
+ OptionAdd(general, _("Snap to keyframes"), "Audio/Display/Snap/Keyframes");
+ OptionAdd(general, _("Snap to adjacent lines"), "Audio/Display/Snap/Other Lines");
+ OptionAdd(general, _("Auto-focus on mouse over"), "Audio/Auto/Focus");
+ OptionAdd(general, _("Play audio when stepping in video"), "Audio/Plays When Stepping Video");
+ CellSkip(general);
+ OptionAdd(general, _("Default timing length"), "Timing/Default Duration", 0, 36000);
+ OptionAdd(general, _("Default lead-in length"), "Audio/Lead/IN", 0, 36000);
+ OptionAdd(general, _("Default lead-out length"), "Audio/Lead/OUT", 0, 36000);
- const wxString dtl_arr[3] = { _("Don't show"), _("Show previous"), _("Show all") };
- wxArrayString choice_dtl(3, dtl_arr);
- OptionChoice(general, _("Show inactive lines"), choice_dtl, "Audio/Inactive Lines Display Mode");
- OptionAdd(general, _("Start-marker drag sensitivity"), "Audio/Start Drag Sensitivity", 1, 15);
+ const wxString dtl_arr[3] = { _("Don't show"), _("Show previous"), _("Show all") };
+ wxArrayString choice_dtl(3, dtl_arr);
+ OptionChoice(general, _("Show inactive lines"), choice_dtl, "Audio/Inactive Lines Display Mode");
+ OptionAdd(general, _("Start-marker drag sensitivity"), "Audio/Start Drag Sensitivity", 1, 15);
- wxFlexGridSizer *display = PageSizer(_("Display Visual Options"));
- OptionAdd(display, _("Secondary lines"), "Audio/Display/Draw/Secondary Lines");
- OptionAdd(display, _("Selection background"), "Audio/Display/Draw/Selection Background");
- OptionAdd(display, _("Timeline"), "Audio/Display/Draw/Timeline");
- OptionAdd(display, _("Cursor time"), "Audio/Display/Draw/Cursor Time");
- OptionAdd(display, _("Keyframes"), "Audio/Display/Draw/Keyframes");
- OptionAdd(display, _("Video position"), "Audio/Display/Draw/Video Position");
+ wxFlexGridSizer *display = PageSizer(_("Display Visual Options"));
+ OptionAdd(display, _("Secondary lines"), "Audio/Display/Draw/Secondary Lines");
+ OptionAdd(display, _("Selection background"), "Audio/Display/Draw/Selection Background");
+ OptionAdd(display, _("Timeline"), "Audio/Display/Draw/Timeline");
+ OptionAdd(display, _("Cursor time"), "Audio/Display/Draw/Cursor Time");
+ OptionAdd(display, _("Keyframes"), "Audio/Display/Draw/Keyframes");
+ OptionAdd(display, _("Video position"), "Audio/Display/Draw/Video Position");
- SetSizerAndFit(sizer);
- }
-};
+ SetSizerAndFit(sizer);
+}
/// Video preferences page
-class Video: public OptionPage {
-public:
- Video(wxTreebook *book): OptionPage(book, _("Video")) {
+Video::Video(wxTreebook *book): OptionPage(book, _("Video")) {
- wxFlexGridSizer *general = PageSizer(_("Options"));
- OptionAdd(general, _("Show keyframes in slider"), "Video/Slider/Show Keyframes");
- OptionAdd(general, _("Always show visual tools"), "Tool/Visual/Always Show");
+ wxFlexGridSizer *general = PageSizer(_("Options"));
+ OptionAdd(general, _("Show keyframes in slider"), "Video/Slider/Show Keyframes");
+ OptionAdd(general, _("Always show visual tools"), "Tool/Visual/Always Show");
- const wxString cres_arr[3] = { _("Never"), _("Ask"), _("Always") };
- wxArrayString choice_res(3, cres_arr);
- OptionChoice(general, _("Match video resolution on open"), choice_res, "Video/Check Script Res");
+ const wxString cres_arr[3] = { _("Never"), _("Ask"), _("Always") };
+ wxArrayString choice_res(3, cres_arr);
+ OptionChoice(general, _("Match video resolution on open"), choice_res, "Video/Check Script Res");
- const wxString czoom_arr[24] = { _T("12.5%"), _T("25%"), _T("37.5%"), _T("50%"), _T("62.5%"), _T("75%"), _T("87.5%"), _T("100%"), _T("112.5%"), _T("125%"), _T("137.5%"), _T("150%"), _T("162.5%"), _T("175%"), _T("187.5%"), _T("200%"), _T("212.5%"), _T("225%"), _T("237.5%"), _T("250%"), _T("262.5%"), _T("275%"), _T("287.5%"), _T("300%") };
- wxArrayString choice_zoom(24, czoom_arr);
- OptionChoice(general, _("Default Zoom"), choice_zoom, "Video/Default Zoom");
+ const wxString czoom_arr[24] = { _T("12.5%"), _T("25%"), _T("37.5%"), _T("50%"), _T("62.5%"), _T("75%"), _T("87.5%"), _T("100%"), _T("112.5%"), _T("125%"), _T("137.5%"), _T("150%"), _T("162.5%"), _T("175%"), _T("187.5%"), _T("200%"), _T("212.5%"), _T("225%"), _T("237.5%"), _T("250%"), _T("262.5%"), _T("275%"), _T("287.5%"), _T("300%") };
+ wxArrayString choice_zoom(24, czoom_arr);
+ OptionChoice(general, _("Default Zoom"), choice_zoom, "Video/Default Zoom");
- OptionAdd(general, _("Fast jump step in frames"), "Video/Slider/Fast Jump Step");
+ OptionAdd(general, _("Fast jump step in frames"), "Video/Slider/Fast Jump Step");
- const wxString cscr_arr[3] = { _("?video"), _("?script"), _(".") };
- wxArrayString scr_res(3, cscr_arr);
- OptionChoice(general, _("Screenshot save path"), scr_res, "Path/Screenshot");
+ const wxString cscr_arr[3] = { _("?video"), _("?script"), _(".") };
+ wxArrayString scr_res(3, cscr_arr);
+ OptionChoice(general, _("Screenshot save path"), scr_res, "Path/Screenshot");
- SetSizerAndFit(sizer);
- }
-};
+ SetSizerAndFit(sizer);
+}
/// Interface preferences page
-class Interface: public OptionPage {
-public:
- Interface(wxTreebook *book): OptionPage(book, _("Interface")) {
+Interface::Interface(wxTreebook *book): OptionPage(book, _("Interface")) {
- wxFlexGridSizer *grid = PageSizer(_("Subtitle Grid"));
- OptionBrowse(grid, _("Font face"), BROWSE_FONT, "Subtitle/Grid/Font Face");
- OptionAdd(grid, _("Font size"), "Subtitle/Grid/Font Size", 3, 42);
+ wxFlexGridSizer *grid = PageSizer(_("Subtitle Grid"));
+ OptionBrowse(grid, _("Font face"), BROWSE_FONT, "Subtitle/Grid/Font Face");
+ OptionAdd(grid, _("Font size"), "Subtitle/Grid/Font Size", 3, 42);
- OptionAdd(grid, _("Hide overrides symbol"), "Subtitle/Grid/Hide Overrides Char");
+ OptionAdd(grid, _("Hide overrides symbol"), "Subtitle/Grid/Hide Overrides Char");
- SetSizerAndFit(sizer);
- }
-};
+ SetSizerAndFit(sizer);
+}
/// Interface Colours preferences subpage
-class Interface_Colours: public OptionPage {
-public:
- Interface_Colours(wxTreebook *book): OptionPage(book, _("Colours"), PAGE_SCROLL|PAGE_SUB) {
+Interface_Colours::Interface_Colours(wxTreebook *book): OptionPage(book, _("Colours"), PAGE_SCROLL|PAGE_SUB) {
- wxFlexGridSizer *general = PageSizer(_("General"));
- OptionAdd(general, _("Modified Background"), "Colour/Background/Modified");
+ wxFlexGridSizer *general = PageSizer(_("General"));
+ OptionAdd(general, _("Modified Background"), "Colour/Background/Modified");
- wxFlexGridSizer *audio = PageSizer(_("Audio Display"));
- OptionAdd(audio, _("Play cursor"), "Colour/Audio Display/Play Cursor");
- OptionAdd(audio, _("Background"), "Colour/Audio Display/Background/Background");
- OptionAdd(audio, _("Selection background"), "Colour/Audio Display/Background/Selection");
- OptionAdd(audio, _("Selection background modified"), "Colour/Audio Display/Background/Selection Modified");
- OptionAdd(audio, _("Seconds boundaries"), "Colour/Audio Display/Seconds Boundaries");
- OptionAdd(audio, _("Waveform"), "Colour/Audio Display/Waveform");
- OptionAdd(audio, _("Waveform selected"), "Colour/Audio Display/Waveform Selected");
- OptionAdd(audio, _("Waveform Modified"), "Colour/Audio Display/Waveform Modified");
- OptionAdd(audio, _("Waveform Inactive"), "Colour/Audio Display/Waveform Inactive");
- OptionAdd(audio, _("Line boundary start"), "Colour/Audio Display/Line boundary Start");
- OptionAdd(audio, _("Line boundary end"), "Colour/Audio Display/Line boundary End");
- OptionAdd(audio, _("Line boundary inactive line"), "Colour/Audio Display/Line Boundary Inactive Line");
- OptionAdd(audio, _("Syllable text"), "Colour/Audio Display/Syllable Text");
- OptionAdd(audio, _("Syllable boundaries"), "Colour/Audio Display/Syllable Boundaries");
+ wxFlexGridSizer *audio = PageSizer(_("Audio Display"));
+ OptionAdd(audio, _("Play cursor"), "Colour/Audio Display/Play Cursor");
+ OptionAdd(audio, _("Background"), "Colour/Audio Display/Background/Background");
+ OptionAdd(audio, _("Selection background"), "Colour/Audio Display/Background/Selection");
+ OptionAdd(audio, _("Selection background modified"), "Colour/Audio Display/Background/Selection Modified");
+ OptionAdd(audio, _("Seconds boundaries"), "Colour/Audio Display/Seconds Boundaries");
+ OptionAdd(audio, _("Waveform"), "Colour/Audio Display/Waveform");
+ OptionAdd(audio, _("Waveform selected"), "Colour/Audio Display/Waveform Selected");
+ OptionAdd(audio, _("Waveform Modified"), "Colour/Audio Display/Waveform Modified");
+ OptionAdd(audio, _("Waveform Inactive"), "Colour/Audio Display/Waveform Inactive");
+ OptionAdd(audio, _("Line boundary start"), "Colour/Audio Display/Line boundary Start");
+ OptionAdd(audio, _("Line boundary end"), "Colour/Audio Display/Line boundary End");
+ OptionAdd(audio, _("Line boundary inactive line"), "Colour/Audio Display/Line Boundary Inactive Line");
+ OptionAdd(audio, _("Syllable text"), "Colour/Audio Display/Syllable Text");
+ OptionAdd(audio, _("Syllable boundaries"), "Colour/Audio Display/Syllable Boundaries");
- wxFlexGridSizer *syntax = PageSizer(_("Syntax Highlighting"));
- OptionAdd(syntax, _("Normal"), "Colour/Subtitle/Syntax/Normal");
- OptionAdd(syntax, _("Brackets"), "Colour/Subtitle/Syntax/Brackets");
- OptionAdd(syntax, _("Slashes and Parentheses"), "Colour/Subtitle/Syntax/Slashes");
- OptionAdd(syntax, _("Tags"), "Colour/Subtitle/Syntax/Highlight Tags");
- OptionAdd(syntax, _("Parameters"), "Colour/Subtitle/Syntax/Parameters");
- OptionAdd(syntax, _("Error"), "Colour/Subtitle/Syntax/Error");
- OptionAdd(syntax, _("Error Background"), "Colour/Subtitle/Syntax/Background/Error");
- OptionAdd(syntax, _("Line Break"), "Colour/Subtitle/Syntax/Line Break");
- OptionAdd(syntax, _("Karaoke templates"), "Colour/Subtitle/Syntax/Karaoke Template");
+ wxFlexGridSizer *syntax = PageSizer(_("Syntax Highlighting"));
+ OptionAdd(syntax, _("Normal"), "Colour/Subtitle/Syntax/Normal");
+ OptionAdd(syntax, _("Brackets"), "Colour/Subtitle/Syntax/Brackets");
+ OptionAdd(syntax, _("Slashes and Parentheses"), "Colour/Subtitle/Syntax/Slashes");
+ OptionAdd(syntax, _("Tags"), "Colour/Subtitle/Syntax/Highlight Tags");
+ OptionAdd(syntax, _("Parameters"), "Colour/Subtitle/Syntax/Parameters");
+ OptionAdd(syntax, _("Error"), "Colour/Subtitle/Syntax/Error");
+ OptionAdd(syntax, _("Error Background"), "Colour/Subtitle/Syntax/Background/Error");
+ OptionAdd(syntax, _("Line Break"), "Colour/Subtitle/Syntax/Line Break");
+ OptionAdd(syntax, _("Karaoke templates"), "Colour/Subtitle/Syntax/Karaoke Template");
- wxFlexGridSizer *grid = PageSizer(_("Subtitle Grid"));
- OptionAdd(grid, _("Standard foreground"), "Colour/Subtitle Grid/Standard");
- OptionAdd(grid, _("Standard background"), "Colour/Subtitle Grid/Background/Background");
- OptionAdd(grid, _("Selection foreground"), "Colour/Subtitle Grid/Selection");
- OptionAdd(grid, _("Selection background"), "Colour/Subtitle Grid/Background/Selection");
- OptionAdd(grid, _("Comment background"), "Colour/Subtitle Grid/Background/Comment");
- OptionAdd(grid, _("Selected comment background"), "Colour/Subtitle Grid/Background/Selected Comment");
- OptionAdd(grid, _("Left Column"), "Colour/Subtitle Grid/Left Column");
- OptionAdd(grid, _("Active Line Border"), "Colour/Subtitle Grid/Active Border");
- OptionAdd(grid, _("Lines"), "Colour/Subtitle Grid/Lines");
+ wxFlexGridSizer *grid = PageSizer(_("Subtitle Grid"));
+ OptionAdd(grid, _("Standard foreground"), "Colour/Subtitle Grid/Standard");
+ OptionAdd(grid, _("Standard background"), "Colour/Subtitle Grid/Background/Background");
+ OptionAdd(grid, _("Selection foreground"), "Colour/Subtitle Grid/Selection");
+ OptionAdd(grid, _("Selection background"), "Colour/Subtitle Grid/Background/Selection");
+ OptionAdd(grid, _("Comment background"), "Colour/Subtitle Grid/Background/Comment");
+ OptionAdd(grid, _("Selected comment background"), "Colour/Subtitle Grid/Background/Selected Comment");
+ OptionAdd(grid, _("Left Column"), "Colour/Subtitle Grid/Left Column");
+ OptionAdd(grid, _("Active Line Border"), "Colour/Subtitle Grid/Active Border");
+ OptionAdd(grid, _("Lines"), "Colour/Subtitle Grid/Lines");
- SetSizerAndFit(sizer);
- }
-};
+ SetSizerAndFit(sizer);
+}
/// Interface Hotkeys preferences subpage
-class Interface_Hotkeys: public OptionPage {
-public:
- Interface_Hotkeys(wxTreebook *book): OptionPage(book, _("Hotkeys"), PAGE_SUB) {
+Interface_Hotkeys::Interface_Hotkeys(wxTreebook *book): OptionPage(book, _("Hotkeys"), PAGE_SUB) {
- wxFlexGridSizer *hotkeys = PageSizer(_("Hotkeys"));
- hotkeys->Add(new wxStaticText(this, wxID_ANY, _T("To be added after hotkey rewrite.")), 0, wxALL, 5);
- SetSizerAndFit(sizer);
- }
-};
+ wxFlexGridSizer *hotkeys = PageSizer(_("Hotkeys"));
+ hotkeys->Add(new wxStaticText(this, wxID_ANY, _T("To be added after hotkey rewrite.")), 0, wxALL, 5);
+ SetSizerAndFit(sizer);
+}
-/// Paths preferences page
-class Paths: public OptionPage {
-public:
- Paths(wxTreebook *book): OptionPage(book, _("Paths")) {
+/// Paths preferences page class Paths: public OptionPage { public:
+Paths::Paths(wxTreebook *book): OptionPage(book, _("Paths")) {
- wxFlexGridSizer *general = PageSizer(_("General"));
- general->Add(new wxStaticText(this, wxID_ANY, _T("TBD..")), 0, wxALL, 5);
+ wxFlexGridSizer *general = PageSizer(_("General"));
+ general->Add(new wxStaticText(this, wxID_ANY, _T("TBD..")), 0, wxALL, 5);
- SetSizerAndFit(sizer);
- }
-};
+ SetSizerAndFit(sizer);
+}
/// File Associations preferences page
-class File_Associations: public OptionPage {
-public:
- File_Associations(wxTreebook *book): OptionPage(book, _("File Associations")) {
+File_Associations::File_Associations(wxTreebook *book): OptionPage(book, _("File Associations")) {
- wxFlexGridSizer *assoc = PageSizer(_("General"));
- assoc->Add(new wxStaticText(this, wxID_ANY, _T("TBD..")), 0, wxALL, 5);
+ wxFlexGridSizer *assoc = PageSizer(_("General"));
+ assoc->Add(new wxStaticText(this, wxID_ANY, _T("TBD..")), 0, wxALL, 5);
- SetSizerAndFit(sizer);
- }
-};
+ SetSizerAndFit(sizer);
+}
/// Backup preferences page
-class Backup: public OptionPage {
-public:
- Backup(wxTreebook *book): OptionPage(book, _("Backup")) {
- wxFlexGridSizer *save = PageSizer(_("Automatic Save"));
- OptionAdd(save, _("Enable"), "App/Auto/Backup");
- CellSkip(save);
- OptionAdd(save, _("Interval in seconds."), "App/Auto/Save Every Seconds");
- OptionBrowse(save, _("Path"), BROWSE_FOLDER, "Path/Auto/Save");
+Backup::Backup(wxTreebook *book): OptionPage(book, _("Backup")) {
+ wxFlexGridSizer *save = PageSizer(_("Automatic Save"));
+ OptionAdd(save, _("Enable"), "App/Auto/Backup");
+ CellSkip(save);
+ OptionAdd(save, _("Interval in seconds."), "App/Auto/Save Every Seconds");
+ OptionBrowse(save, _("Path"), BROWSE_FOLDER, "Path/Auto/Save");
- wxFlexGridSizer *backup = PageSizer(_("Automatic Backup"));
- CellSkip(backup);
- OptionAdd(backup, _("Enable"), "App/Auto/Backup");
- OptionBrowse(backup, _("Path"), BROWSE_FOLDER, "Path/Auto/Backup");
+ wxFlexGridSizer *backup = PageSizer(_("Automatic Backup"));
+ CellSkip(backup);
+ OptionAdd(backup, _("Enable"), "App/Auto/Backup");
+ OptionBrowse(backup, _("Path"), BROWSE_FOLDER, "Path/Auto/Backup");
- SetSizerAndFit(sizer);
- }
-};
+ SetSizerAndFit(sizer);
+}
/// Automation preferences page
-class Automation: public OptionPage {
-public:
- Automation(wxTreebook *book): OptionPage(book, _("Automation")) {
- wxFlexGridSizer *general = PageSizer(_("General"));
+Automation::Automation(wxTreebook *book): OptionPage(book, _("Automation")) {
+ wxFlexGridSizer *general = PageSizer(_("General"));
- OptionAdd(general, _("Base path"), "Path/Automation/Base");
- OptionAdd(general, _("Include path"), "Path/Automation/Include");
- OptionAdd(general, _("Auto-load path"), "Path/Automation/Autoload");
+ OptionAdd(general, _("Base path"), "Path/Automation/Base");
+ OptionAdd(general, _("Include path"), "Path/Automation/Include");
+ OptionAdd(general, _("Auto-load path"), "Path/Automation/Autoload");
- const wxString tl_arr[6] = { _("Fatal"), _("Error"), _("Warning"), _("Hint"), _("Debug"), _("Trace") };
- wxArrayString tl_choice(6, tl_arr);
- OptionChoice(general, _("Trace level"), tl_choice, "Automation/Trace Level");
+ const wxString tl_arr[6] = { _("Fatal"), _("Error"), _("Warning"), _("Hint"), _("Debug"), _("Trace") };
+ wxArrayString tl_choice(6, tl_arr);
+ OptionChoice(general, _("Trace level"), tl_choice, "Automation/Trace Level");
- const wxString tp_arr[3] = { _("Normal"), _("Below Normal (recommended)"), _("Lowest") };
- wxArrayString tp_choice(3, tp_arr);
- OptionChoice(general, _("Thread priority"), tp_choice, "Automation/Lua/Thread Priority");
+ const wxString tp_arr[3] = { _("Normal"), _("Below Normal (recommended)"), _("Lowest") };
+ wxArrayString tp_choice(3, tp_arr);
+ OptionChoice(general, _("Thread priority"), tp_choice, "Automation/Lua/Thread Priority");
- const wxString ar_arr[4] = { _("No scripts"), _("Subtitle-local scripts"), _("Global autoload scripts"), _("All scripts") };
- wxArrayString ar_choice(4, ar_arr);
- OptionChoice(general, _("Autoreload on Export"), ar_choice, "Automation/Autoreload Mode");
+ const wxString ar_arr[4] = { _("No scripts"), _("Subtitle-local scripts"), _("Global autoload scripts"), _("All scripts") };
+ wxArrayString ar_choice(4, ar_arr);
+ OptionChoice(general, _("Autoreload on Export"), ar_choice, "Automation/Autoreload Mode");
- SetSizerAndFit(sizer);
- }
-};
+ SetSizerAndFit(sizer);
+}
/// Advanced preferences page
-class Advanced: public OptionPage {
-public:
- Advanced(wxTreebook *book): OptionPage(book, _("Advanced")) {
- wxFlexGridSizer *general = PageSizer(_("General"));
+Advanced::Advanced(wxTreebook *book): OptionPage(book, _("Advanced")) {
+ wxFlexGridSizer *general = PageSizer(_("General"));
- wxStaticText *warning = new wxStaticText(this, wxID_ANY ,_("Changing these settings might result in bugs and/or crashes. Do not touch these unless you know what you're doing."));
- warning->SetFont(wxFont(12, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD));
- sizer->Fit(this);
- warning->Wrap(400);
- general->Add(warning, 0, wxALL, 5);
+ wxStaticText *warning = new wxStaticText(this, wxID_ANY ,_("Changing these settings might result in bugs and/or crashes. Do not touch these unless you know what you're doing."));
+ warning->SetFont(wxFont(12, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD));
+ sizer->Fit(this);
+ warning->Wrap(400);
+ general->Add(warning, 0, wxALL, 5);
- SetSizerAndFit(sizer);
- }
-};
+ SetSizerAndFit(sizer);
+}
/// Advanced Interface preferences subpage
-class Advanced_Interface: public OptionPage {
-public:
- Advanced_Interface(wxTreebook *book): OptionPage(book, _("Backup"), PAGE_SUB) {
- wxFlexGridSizer *interface_ = PageSizer(_("Interface"));
+Advanced_Interface::Advanced_Interface(wxTreebook *book): OptionPage(book, _("Backup"), PAGE_SUB) {
+ wxFlexGridSizer *interface_ = PageSizer(_("Interface"));
- interface_->Add(new wxStaticText(this, wxID_ANY, _T("TBD..")), 0, wxALL, 5);
+ interface_->Add(new wxStaticText(this, wxID_ANY, _T("TBD..")), 0, wxALL, 5);
- SetSizerAndFit(sizer);
- }
-};
+ SetSizerAndFit(sizer);
+}
/// Advanced Audio preferences subpage
-class Advanced_Audio: public OptionPage {
-public:
- Advanced_Audio(wxTreebook *book): OptionPage(book, _("Audio"), PAGE_SUB) {
- wxFlexGridSizer *expert = PageSizer(_("Expert"));
+Advanced_Audio::Advanced_Audio(wxTreebook *book): OptionPage(book, _("Audio"), PAGE_SUB) {
+ wxFlexGridSizer *expert = PageSizer(_("Expert"));
- wxArrayString ap_choice = AudioProviderFactoryManager::GetFactoryList();
- OptionChoice(expert, _("Audio provider"), ap_choice, "Audio/Provider");
+ wxArrayString ap_choice = AudioProviderFactoryManager::GetFactoryList();
+ OptionChoice(expert, _("Audio provider"), ap_choice, "Audio/Provider");
- wxArrayString apl_choice = AudioPlayerFactoryManager::GetFactoryList();
- OptionChoice(expert, _("Audio player"), apl_choice, "Audio/Player");
+ wxArrayString apl_choice = AudioPlayerFactoryManager::GetFactoryList();
+ OptionChoice(expert, _("Audio player"), apl_choice, "Audio/Player");
- wxFlexGridSizer *cache = PageSizer(_("Cache"));
- const wxString ct_arr[3] = { _("None (NOT RECOMMENDED)"), _("RAM"), _("Hard Disk") };
- wxArrayString ct_choice(3, ct_arr);
- OptionChoice(cache, _("Cache type"), ct_choice, "Audio/Cache/Type");
+ wxFlexGridSizer *cache = PageSizer(_("Cache"));
+ const wxString ct_arr[3] = { _("None (NOT RECOMMENDED)"), _("RAM"), _("Hard Disk") };
+ wxArrayString ct_choice(3, ct_arr);
+ OptionChoice(cache, _("Cache type"), ct_choice, "Audio/Cache/Type");
- OptionBrowse(cache, _("Path"), BROWSE_FOLDER, "Audio/Cache/HD/Location");
- OptionAdd(cache, _("File name"), "Audio/Cache/HD/Name");
+ OptionBrowse(cache, _("Path"), BROWSE_FOLDER, "Audio/Cache/HD/Location");
+ OptionAdd(cache, _("File name"), "Audio/Cache/HD/Name");
- wxFlexGridSizer *spectrum = PageSizer(_("Spectrum"));
+ wxFlexGridSizer *spectrum = PageSizer(_("Spectrum"));
- OptionAdd(spectrum, _("Cutoff"), "Audio/Renderer/Spectrum/Cutoff");
+ OptionAdd(spectrum, _("Cutoff"), "Audio/Renderer/Spectrum/Cutoff");
- const wxString sq_arr[4] = { _("Regular quality"), _("Better quality"), _("High quality"), _("Insane quality") };
- wxArrayString sq_choice(4, sq_arr);
- OptionChoice(spectrum, _("Quality"), sq_choice, "Audio/Renderer/Spectrum/Quality");
+ const wxString sq_arr[4] = { _("Regular quality"), _("Better quality"), _("High quality"), _("Insane quality") };
+ wxArrayString sq_choice(4, sq_arr);
+ OptionChoice(spectrum, _("Quality"), sq_choice, "Audio/Renderer/Spectrum/Quality");
- OptionAdd(spectrum, _("Cache memory max (MB)"), "Audio/Renderer/Spectrum/Memory Max", 2, 1024);
+ OptionAdd(spectrum, _("Cache memory max (MB)"), "Audio/Renderer/Spectrum/Memory Max", 2, 1024);
#if defined(WIN32) || defined(SHOW_ALL)
- wxFlexGridSizer *windows = PageSizer(_("Windows Specific"));
- const wxString adm_arr[3] = { _T("ConvertToMono"), _T("GetLeftChannel"), _T("GetRightChannel") };
- wxArrayString adm_choice(3, adm_arr);
- OptionChoice(windows, _("Avisynth down-mixer"), adm_choice, "Audio/Downmixer");
+ wxFlexGridSizer *windows = PageSizer(_("Windows Specific"));
+ const wxString adm_arr[3] = { _T("ConvertToMono"), _T("GetLeftChannel"), _T("GetRightChannel") };
+ wxArrayString adm_choice(3, adm_arr);
+ OptionChoice(windows, _("Avisynth down-mixer"), adm_choice, "Audio/Downmixer");
#endif
- SetSizerAndFit(sizer);
- }
-};
+ SetSizerAndFit(sizer);
+}
/// Advanced Video preferences subpage
-class Advanced_Video: public OptionPage {
-public:
- Advanced_Video(wxTreebook *book): OptionPage(book, _("Video")) {
- wxFlexGridSizer *expert = PageSizer(_("Expert"));
+Advanced_Video::Advanced_Video(wxTreebook *book): OptionPage(book, _("Video")) {
+ wxFlexGridSizer *expert = PageSizer(_("Expert"));
- wxArrayString vp_choice = VideoProviderFactoryManager::GetFactoryList();
- OptionChoice(expert, _("Video provider"), vp_choice, "Video/Provider");
+ wxArrayString vp_choice = VideoProviderFactoryManager::GetFactoryList();
+ OptionChoice(expert, _("Video provider"), vp_choice, "Video/Provider");
- wxArrayString sp_choice = SubtitlesProviderFactoryManager::GetFactoryList();
- OptionChoice(expert, _("Subtitle provider"), sp_choice, "Subtitle/Provider");
+ wxArrayString sp_choice = SubtitlesProviderFactoryManager::GetFactoryList();
+ OptionChoice(expert, _("Subtitle provider"), sp_choice, "Subtitle/Provider");
#if defined(WIN32) || defined(SHOW_ALL)
- wxFlexGridSizer *windows = PageSizer(_("Windows Specific"));
- OptionAdd(windows, _("Allow pre-2.56a Avisynth"), "Provider/Avisynth/Allow Ancient");
- CellSkip(windows);
- OptionAdd(windows, _("Avisynth memory limit"), "Provider/Avisynth/Memory Max");
+ wxFlexGridSizer *windows = PageSizer(_("Windows Specific"));
+ OptionAdd(windows, _("Allow pre-2.56a Avisynth"), "Provider/Avisynth/Allow Ancient");
+ CellSkip(windows);
+ OptionAdd(windows, _("Avisynth memory limit"), "Provider/Avisynth/Memory Max");
#endif
- SetSizerAndFit(sizer);
- }
-};
-
-
-Preferences::Preferences(wxWindow *parent): wxDialog(parent, -1, _("Preferences"), wxDefaultPosition, wxSize(-1, 500)) {
-// SetIcon(BitmapToIcon(GETIMAGE(options_button_24)));
-
- book = new wxTreebook(this, -1, wxDefaultPosition, wxDefaultSize);
- general = new General(book);
- subtitles = new Subtitles(book);
- audio = new Audio(book);
- video = new Video(book);
- interface_ = new Interface(book);
- interface_colours = new Interface_Colours(book);
- interface_hotkeys = new Interface_Hotkeys(book);
- paths = new Paths(book);
- file_associations = new File_Associations(book);
- backup = new Backup(book);
- automation = new Automation(book);
- advanced = new Advanced(book);
- advanced_interface = new Advanced_Interface(book);
- advanced_audio = new Advanced_Audio(book);
- advanced_video = new Advanced_Video(book);
-
- book->Fit();
-
- /// @todo Save the last page and start with that page on next launch.
- book->ChangeSelection(0);
-
- // Bottom Buttons
- wxStdDialogButtonSizer *stdButtonSizer = new wxStdDialogButtonSizer();
- stdButtonSizer->AddButton(new wxButton(this,wxID_OK));
- stdButtonSizer->AddButton(new wxButton(this,wxID_CANCEL));
- stdButtonSizer->AddButton(new wxButton(this,wxID_APPLY));
- stdButtonSizer->Realize();
- wxSizer *buttonSizer = new wxBoxSizer(wxHORIZONTAL);
- wxButton *defaultButton = new wxButton(this,2342,_("Restore Defaults"));
- buttonSizer->Add(defaultButton,0,wxEXPAND);
- buttonSizer->AddStretchSpacer(1);
- buttonSizer->Add(stdButtonSizer,0,wxEXPAND);
-
-
- // Main Sizer
- wxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);
- mainSizer->Add(book, 1 ,wxEXPAND | wxALL, 5);
- mainSizer->Add(buttonSizer,0,wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM,5);
- SetSizerAndFit(mainSizer);
- this->SetMinSize(wxSize(-1, 500));
- this->SetMaxSize(wxSize(-1, 500));
- CenterOnParent();
-
-
-
+ SetSizerAndFit(sizer);
}
-
-Preferences::~Preferences() {
-}
-
-
-BEGIN_EVENT_TABLE(Preferences, wxDialog)
- EVT_BUTTON(wxID_OK, Preferences::OnOK)
- EVT_BUTTON(wxID_CANCEL, Preferences::OnCancel)
- EVT_BUTTON(wxID_APPLY, Preferences::OnApply)
-END_EVENT_TABLE()
diff --git a/aegisub/src/preferences_base.cpp b/aegisub/src/preferences_base.cpp
new file mode 100644
index 000000000..7b3094bdc
--- /dev/null
+++ b/aegisub/src/preferences_base.cpp
@@ -0,0 +1,253 @@
+// Copyright (c) 2010, Amar Takhar
+//
+// Permission to use, copy, modify, and distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+//
+// $Id$
+
+/// @file preferences_base.cpp
+/// @brief Base preferences dialogue classes
+/// @ingroup configuration_ui
+
+
+#ifndef AGI_PRE
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#endif
+
+#include
+
+#include "colour_button.h"
+#include "compat.h"
+#include "libresrc/libresrc.h"
+#include "preferences.h"
+#include "main.h"
+#include "subtitles_provider_manager.h"
+#include "video_provider_manager.h"
+#include "audio_player_manager.h"
+#include "audio_provider_manager.h"
+
+#include "preferences_base.h"
+
+/// Define make all platform-specific options visible in a single view.
+#define SHOW_ALL 1
+
+DEFINE_BASE_EXCEPTION_NOINNER(PreferencesError, agi::Exception)
+DEFINE_SIMPLE_EXCEPTION_NOINNER(PreferenceIncorrectType, PreferencesError, "preferences/incorrect_type")
+DEFINE_SIMPLE_EXCEPTION_NOINNER(PreferenceNotSupported, PreferencesError, "preferences/not_supported")
+
+
+
+OptionPage::OptionPage(wxTreebook *book, wxString name, int style):
+ wxScrolled(book, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxVSCROLL) {
+
+ if (style & PAGE_SUB) {
+ book->AddSubPage(this, name, true);
+ } else {
+ book->AddPage(this, name, true);
+ }
+
+ if (style & PAGE_SCROLL) {
+ SetScrollbars(0, 20, 0, 50);
+ } else {
+ SetScrollbars(0, 0, 0, 0);
+ }
+
+ sizer = new wxBoxSizer(wxVERTICAL);
+}
+
+OptionPage::~OptionPage() {}
+
+void OptionPage::CellSkip(wxFlexGridSizer *&flex) {
+ flex->Add(new wxStaticText(this, wxID_ANY , wxEmptyString), 0, wxALL, 5);
+}
+
+void OptionPage::OptionAdd(wxFlexGridSizer *&flex, const wxString &name, const char *opt_name, double min, double max, double inc) {
+
+ agi::OptionValue *opt = OPT_GET(opt_name);
+
+ int type = opt->GetType();
+
+ switch (type) {
+
+ case agi::OptionValue::Type_Bool: {
+ wxCheckBox *cb = new wxCheckBox(this, wxID_ANY, name);
+ flex->Add(cb, 1, wxEXPAND, 0);
+ cb->SetValue(opt->GetBool());
+ break;
+ }
+
+ case agi::OptionValue::Type_Int:
+ case agi::OptionValue::Type_Double: {
+ flex->Add(new wxStaticText(this, wxID_ANY, name), 1, wxALIGN_CENTRE_VERTICAL);
+ wxSpinCtrlDouble *scd = new wxSpinCtrlDouble(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, min, max, opt->GetInt(), inc);
+ flex->Add(scd);
+
+ break;
+ }
+
+ case agi::OptionValue::Type_String: {
+ flex->Add(new wxStaticText(this, wxID_ANY, name), 1, wxALIGN_CENTRE_VERTICAL);
+ wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY , lagi_wxString(opt->GetString()), wxDefaultPosition, wxDefaultSize);
+ flex->Add(text, 1, wxEXPAND);
+ break;
+ }
+
+ case agi::OptionValue::Type_Colour: {
+ flex->Add(new wxStaticText(this, wxID_ANY, name), 1, wxALIGN_CENTRE_VERTICAL);
+ flex->Add(new ColourButton(this, wxID_ANY, wxSize(40,10), lagi_wxColour(opt->GetColour())));
+ break;
+ }
+
+ default:
+ throw PreferenceNotSupported("Unsupported type");
+ }
+}
+
+
+void OptionPage::OptionChoice(wxFlexGridSizer *&flex, const wxString &name, const wxArrayString &choices, const char *opt_name) {
+ agi::OptionValue *opt = OPT_GET(opt_name);
+
+ int type = opt->GetType();
+ wxString selection;
+
+ switch (type) {
+ case agi::OptionValue::Type_Int: {
+ selection = choices.Item(opt->GetInt());
+ break;
+ }
+ case agi::OptionValue::Type_String: {
+ selection.assign(opt->GetString());
+ break;
+ }
+ default:
+ throw PreferenceNotSupported("Unsupported type");
+ }
+
+ flex->Add(new wxStaticText(this, wxID_ANY, name), 1, wxALIGN_CENTRE_VERTICAL);
+ wxComboBox *cb = new wxComboBox(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, choices, wxCB_READONLY | wxCB_DROPDOWN);
+ cb->SetValue(selection);
+ flex->Add(cb, 1, wxEXPAND, 0);
+}
+
+
+wxFlexGridSizer* OptionPage::PageSizer(wxString name) {
+ wxSizer *tmp_sizer = new wxStaticBoxSizer(wxHORIZONTAL, this, name);
+ sizer->Add(tmp_sizer, 0,wxEXPAND, 5);
+ wxFlexGridSizer *flex = new wxFlexGridSizer(2,5,5);
+ flex->AddGrowableCol(0,1);
+ tmp_sizer->Add(flex, 1, wxEXPAND, 5);
+ sizer->AddSpacer(8);
+ return flex;
+}
+
+
+void OptionPage::OptionBrowse(wxFlexGridSizer *&flex, const wxString &name, BrowseType browse_type, const char *opt_name) {
+
+ agi::OptionValue *opt = OPT_GET(opt_name);
+
+ if (opt->GetType() != agi::OptionValue::Type_String)
+ throw PreferenceIncorrectType("Option must be agi::OptionValue::Type_String for BrowseButton.");
+
+ flex->Add(new wxStaticText(this, wxID_ANY, name), 1, wxALIGN_CENTRE_VERTICAL);
+
+ wxFlexGridSizer *button_flex = new wxFlexGridSizer(2,5,5);
+ button_flex->AddGrowableCol(0,1);
+ flex->Add(button_flex, 1, wxEXPAND, 5);
+
+ wxTextCtrl *text = new wxTextCtrl(this, wxID_ANY , opt->GetString(), wxDefaultPosition, wxDefaultSize);
+ button_flex->Add(text, 1, wxEXPAND);
+ BrowseButton *browse = new BrowseButton(this, wxID_ANY, wxEmptyString, browse_type);
+ browse->Bind(text);
+ button_flex->Add(browse, 1, wxEXPAND);
+}
+
+
+void Preferences::OnOK(wxCommandEvent &event) {
+ EndModal(0);
+}
+
+
+void Preferences::OnApply(wxCommandEvent &event) {
+}
+
+
+void Preferences::OnCancel(wxCommandEvent &event) {
+ EndModal(0);
+}
+
+Preferences::Preferences(wxWindow *parent): wxDialog(parent, -1, _("Preferences"), wxDefaultPosition, wxSize(-1, 500)) {
+// SetIcon(BitmapToIcon(GETIMAGE(options_button_24)));
+
+ book = new wxTreebook(this, -1, wxDefaultPosition, wxDefaultSize);
+ general = new General(book);
+ subtitles = new Subtitles(book);
+ audio = new Audio(book);
+ video = new Video(book);
+ interface_ = new Interface(book);
+ interface_colours = new Interface_Colours(book);
+ interface_hotkeys = new Interface_Hotkeys(book);
+ paths = new Paths(book);
+ file_associations = new File_Associations(book);
+ backup = new Backup(book);
+ automation = new Automation(book);
+ advanced = new Advanced(book);
+ advanced_interface = new Advanced_Interface(book);
+ advanced_audio = new Advanced_Audio(book);
+ advanced_video = new Advanced_Video(book);
+
+ book->Fit();
+
+ /// @todo Save the last page and start with that page on next launch.
+ book->ChangeSelection(0);
+
+ // Bottom Buttons
+ wxStdDialogButtonSizer *stdButtonSizer = new wxStdDialogButtonSizer();
+ stdButtonSizer->AddButton(new wxButton(this,wxID_OK));
+ stdButtonSizer->AddButton(new wxButton(this,wxID_CANCEL));
+ stdButtonSizer->AddButton(new wxButton(this,wxID_APPLY));
+ stdButtonSizer->Realize();
+ wxSizer *buttonSizer = new wxBoxSizer(wxHORIZONTAL);
+ wxButton *defaultButton = new wxButton(this,2342,_("Restore Defaults"));
+ buttonSizer->Add(defaultButton,0,wxEXPAND);
+ buttonSizer->AddStretchSpacer(1);
+ buttonSizer->Add(stdButtonSizer,0,wxEXPAND);
+
+
+ // Main Sizer
+ wxSizer *mainSizer = new wxBoxSizer(wxVERTICAL);
+ mainSizer->Add(book, 1 ,wxEXPAND | wxALL, 5);
+ mainSizer->Add(buttonSizer,0,wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM,5);
+ SetSizerAndFit(mainSizer);
+ this->SetMinSize(wxSize(-1, 500));
+ this->SetMaxSize(wxSize(-1, 500));
+ CenterOnParent();
+
+
+
+}
+
+Preferences::~Preferences() {
+}
+
+
+BEGIN_EVENT_TABLE(Preferences, wxDialog)
+ EVT_BUTTON(wxID_OK, Preferences::OnOK)
+ EVT_BUTTON(wxID_CANCEL, Preferences::OnCancel)
+ EVT_BUTTON(wxID_APPLY, Preferences::OnApply)
+END_EVENT_TABLE()
diff --git a/aegisub/src/preferences_base.h b/aegisub/src/preferences_base.h
new file mode 100644
index 000000000..98a89a3a6
--- /dev/null
+++ b/aegisub/src/preferences_base.h
@@ -0,0 +1,62 @@
+// Copyright (c) 2010, Amar Takhar
+//
+// Permission to use, copy, modify, and distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+//
+// $Id$
+
+/// @file preferences_base.h
+/// @brief Base preferences dialogue classes
+/// @see preferences_base.cpp
+/// @ingroup configuration_ui
+
+class OptionPage: public wxScrolled {
+public:
+ enum Style {
+ PAGE_DEFAULT = 0x00000000,
+ PAGE_SCROLL = 0x00000001,
+ PAGE_SUB = 0x00000002
+ };
+
+ wxSizer *sizer;
+
+ OptionPage(wxTreebook *book, wxString name, int style = PAGE_DEFAULT);
+ ~OptionPage();
+
+ 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);
+ void OptionChoice(wxFlexGridSizer *&flex, const wxString &name, const wxArrayString &choices, const char *opt_name);
+ void OptionBrowse(wxFlexGridSizer *&flex, const wxString &name, BrowseType browse_type, const char *opt_name);
+};
+
+#define CLASS_PAGE(name) \
+ class name: public OptionPage { \
+ public: \
+ name(wxTreebook *book); \
+ };
+
+CLASS_PAGE(General)
+CLASS_PAGE(Subtitles)
+CLASS_PAGE(Audio)
+CLASS_PAGE(Video)
+CLASS_PAGE(Interface)
+CLASS_PAGE(Interface_Colours)
+CLASS_PAGE(Interface_Hotkeys)
+CLASS_PAGE(Paths)
+CLASS_PAGE(File_Associations)
+CLASS_PAGE(Backup)
+CLASS_PAGE(Automation)
+CLASS_PAGE(Advanced)
+CLASS_PAGE(Advanced_Interface)
+CLASS_PAGE(Advanced_Audio)
+CLASS_PAGE(Advanced_Video)