diff --git a/aegisub/src/ass_export_filter.cpp b/aegisub/src/ass_export_filter.cpp index c4ba3a45f..8514fc9f0 100644 --- a/aegisub/src/ass_export_filter.cpp +++ b/aegisub/src/ass_export_filter.cpp @@ -44,12 +44,11 @@ #include "ass_file.h" #include "utils.h" -AssExportFilter::AssExportFilter(wxString const& name, wxString const& description, int priority) +AssExportFilter::AssExportFilter(wxString const& name, wxString const& description, int priority, bool auto_apply) : name(name) , priority(priority) -, autoExporter(false) -, hidden(false) , description(description) +, auto_apply(auto_apply) { } @@ -57,44 +56,45 @@ void AssExportFilterChain::Register(AssExportFilter *filter) { // Remove pipes from name filter->name.Replace("|", ""); - FilterList::iterator begin = GetFilterList()->begin(); - FilterList::iterator end = GetFilterList()->end(); + int filter_copy = 1; + wxString name = filter->name; + // Find a unique name + while (GetFilter(name)) + name = wxString::Format("%s (%d)", filter->name, filter_copy++); - int filter_copy = 0; - wxString tmpnam = filter->name; - if (false) { -try_new_name: - tmpnam = wxString::Format("%s (%d)", filter->name, filter_copy); - } - - // Check if name exists - for (FilterList::iterator cur=begin;cur!=end;cur++) { - if ((*cur)->name == tmpnam) { - // Instead of just failing and making a big noise about it, let multiple filters share name, but append something to the later arrivals -jfs - filter_copy++; - goto try_new_name; - } - } - - filter->name = tmpnam; + filter->name = name; // Look for place to insert + FilterList::iterator begin = filters()->begin(); + FilterList::iterator end = filters()->end(); while (begin != end && (*begin)->priority >= filter->priority) ++begin; - GetFilterList()->insert(begin, filter); + filters()->insert(begin, filter); } void AssExportFilterChain::Unregister(AssExportFilter *filter) { - if (find(GetFilterList()->begin(), GetFilterList()->end(), filter) == GetFilterList()->end()) + if (find(filters()->begin(), filters()->end(), filter) == filters()->end()) throw wxString::Format("Unregister export filter: name \"%s\" is not registered.", filter->name); - GetFilterList()->remove(filter); + filters()->remove(filter); } -FilterList *AssExportFilterChain::GetFilterList() { +FilterList *AssExportFilterChain::filters() { static FilterList instance; return &instance; } -void AssExportFilterChain::Clear() { - delete_clear(*GetFilterList()); +const FilterList *AssExportFilterChain::GetFilterList() { + return filters(); +} + +void AssExportFilterChain::Clear() { + delete_clear(*filters()); +} + +AssExportFilter *AssExportFilterChain::GetFilter(wxString const& name) { + for (FilterList::iterator it = filters()->begin(); it != filters()->end(); ++it) { + if ((*it)->name == name) + return *it; + } + return 0; } diff --git a/aegisub/src/ass_export_filter.h b/aegisub/src/ass_export_filter.h index 4fdc38d8c..01803e9b0 100644 --- a/aegisub/src/ass_export_filter.h +++ b/aegisub/src/ass_export_filter.h @@ -58,10 +58,7 @@ typedef std::list FilterList; /// /// DOCME class AssExportFilterChain { - friend class AssExporter; - - /// Get the singleton instance - static FilterList *GetFilterList(); + static FilterList *filters(); public: /// Register an export filter static void Register(AssExportFilter *filter); @@ -69,6 +66,11 @@ public: static void Unregister(AssExportFilter *filter); /// Unregister and delete all export filters static void Clear(); + /// Get a filter by name or NULL if it doesn't exist + static AssExportFilter *GetFilter(wxString const& name); + + /// Get the list of registered filters + static const FilterList *GetFilterList(); }; /// DOCME @@ -77,7 +79,8 @@ public: /// /// DOCME class AssExportFilter { - friend class AssExporter; + /// The filter chain needs to be able to muck around with filter names when + /// they're registered to avoid duplicates friend class AssExportFilterChain; /// This filter's name @@ -86,27 +89,31 @@ class AssExportFilter { /// Higher priority = run earlier int priority; -protected: - /// Should this filter be used when sending subtitles to the subtitle provider - bool autoExporter; - - /// Should this filter be hidden from the user - bool hidden; - /// User-visible description of this filter wxString description; + /// Should this filter be automatically applied when sending subtitles to + /// the renderer and exporting to non-ASS formats + bool auto_apply; + public: - AssExportFilter(wxString const& name, wxString const& description, int priority = 0); + AssExportFilter(wxString const& name, wxString const& description, int priority = 0, bool auto_apply = false); virtual ~AssExportFilter() { }; - const wxString& GetDescription() const { return description; } + wxString const& GetName() const { return name; } + wxString const& GetDescription() const { return description; } + bool GetAutoApply() const { return auto_apply; } /// Process subtitles - virtual void ProcessSubs(AssFile *subs, wxWindow *export_dialog=0)=0; + /// @param subs Subtitles to process + /// @param parent_window Window to use as the parent if the filter wishes + /// to open a progress dialog + virtual void ProcessSubs(AssFile *subs, wxWindow *parent_window=0)=0; + /// Draw setup controls virtual wxWindow *GetConfigDialogWindow(wxWindow *parent) { return 0; } - /// Config dialog is done - extract data now. - virtual void LoadSettings(bool IsDefault) { } -}; + /// Load settings to use from the configuration dialog + /// @param is_default If true use default settings instead + virtual void LoadSettings(bool is_default) { } +}; diff --git a/aegisub/src/ass_exporter.cpp b/aegisub/src/ass_exporter.cpp index 647553239..5e6ebb2b1 100644 --- a/aegisub/src/ass_exporter.cpp +++ b/aegisub/src/ass_exporter.cpp @@ -39,41 +39,36 @@ #include "ass_export_filter.h" #include "ass_exporter.h" #include "ass_file.h" -#include "frame_main.h" -/// @brief Constructor -/// @param subs -/// -AssExporter::AssExporter (AssFile *subs) { - OriginalSubs = subs; - IsDefault = true; +static inline std::list::const_iterator filter_list_begin() { + return AssExportFilterChain::GetFilterList()->begin(); +} + +static inline std::list::const_iterator filter_list_end() { + return AssExportFilterChain::GetFilterList()->end(); +} + +AssExporter::AssExporter(AssFile *subs) +: original_subs(subs) +, is_default(true) +{ } -/// @brief Destructor -/// AssExporter::~AssExporter () { } -/// @brief Draw control settings -/// @param parent -/// @param AddTo -/// -void AssExporter::DrawSettings(wxWindow *parent,wxSizer *AddTo) { - IsDefault = false; - wxWindow *window; - wxSizer *box; - FilterList::iterator begin = AssExportFilterChain::GetFilterList()->begin(); - FilterList::iterator end = AssExportFilterChain::GetFilterList()->end(); - for (FilterList::iterator cur=begin;cur!=end;cur++) { +void AssExporter::DrawSettings(wxWindow *parent, wxSizer *target_sizer) { + is_default = false; + for (filter_iterator cur = filter_list_begin(); cur != filter_list_end(); ++cur) { // Make sure to construct static box sizer first, so it won't overlap // the controls on wxMac. - box = new wxStaticBoxSizer(wxVERTICAL,parent,(*cur)->name); - window = (*cur)->GetConfigDialogWindow(parent); + wxSizer *box = new wxStaticBoxSizer(wxVERTICAL, parent, (*cur)->GetName()); + wxWindow *window = (*cur)->GetConfigDialogWindow(parent); if (window) { - box->Add(window,0,wxEXPAND,0); - AddTo->Add(box,0,wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM,5); - AddTo->Show(box,false); - Sizers[(*cur)->name] = box; + box->Add(window, 0, wxEXPAND, 0); + target_sizer->Add(box, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5); + target_sizer->Show(box, false); + Sizers[(*cur)->GetName()] = box; } else { delete box; @@ -81,101 +76,53 @@ void AssExporter::DrawSettings(wxWindow *parent,wxSizer *AddTo) { } } -/// @brief Add filter to chain -/// @param name -/// -void AssExporter::AddFilter(wxString name) { - // Get filter - AssExportFilter *filter = NULL; - FilterList::iterator begin = AssExportFilterChain::GetFilterList()->begin(); - FilterList::iterator end = AssExportFilterChain::GetFilterList()->end(); - for (FilterList::iterator cur=begin;cur!=end;cur++) { - if ((*cur)->name == name) { - filter = *cur; - break; - } - } +void AssExporter::AddFilter(wxString const& name) { + AssExportFilter *filter = AssExportFilterChain::GetFilter(name); - // Check if (!filter) throw wxString::Format("Filter not found: %s", name); - // Add to list - Filters.push_back(filter); + filters.push_back(filter); } -/// @brief Adds all autoexporting filters to chain -/// void AssExporter::AddAutoFilters() { - FilterList::iterator begin = AssExportFilterChain::GetFilterList()->begin(); - FilterList::iterator end = AssExportFilterChain::GetFilterList()->end(); - for (FilterList::iterator cur=begin;cur!=end;cur++) { - if ((*cur)->autoExporter) { - Filters.push_back(*cur); - } + for (filter_iterator it = filter_list_begin(); it != filter_list_end(); ++it) { + if ((*it)->GetAutoApply()) + filters.push_back(*it); } } -/// @brief Get name of all filters -/// @return -/// wxArrayString AssExporter::GetAllFilterNames() { wxArrayString names; - FilterList::iterator begin = AssExportFilterChain::GetFilterList()->begin(); - FilterList::iterator end = AssExportFilterChain::GetFilterList()->end(); - for (FilterList::iterator cur=begin;cur!=end;cur++) { - if (!(*cur)->hidden) names.Add((*cur)->name); - } + transform(filter_list_begin(), filter_list_end(), + std::back_inserter(names), std::mem_fun(&AssExportFilter::GetName)); return names; } -/// @brief Transform for export -/// @param export_dialog -/// @return -/// -AssFile *AssExporter::ExportTransform(wxWindow *export_dialog,bool copy) { - // Copy - AssFile *Subs = copy ? new AssFile(*OriginalSubs) : OriginalSubs; +AssFile *AssExporter::ExportTransform(wxWindow *export_dialog, bool copy) { + AssFile *subs = copy ? new AssFile(*original_subs) : original_subs; - // Run filters - for (FilterList::iterator cur=Filters.begin();cur!=Filters.end();cur++) { - (*cur)->LoadSettings(IsDefault); - (*cur)->ProcessSubs(Subs, export_dialog); + for (filter_iterator cur = filters.begin(); cur != filters.end(); cur++) { + (*cur)->LoadSettings(is_default); + (*cur)->ProcessSubs(subs, export_dialog); } - // Done - return Subs; + return subs; } -/// @brief Export -/// @param filename -/// @param charset -/// @param export_dialog -/// -void AssExporter::Export(wxString filename, wxString charset, wxWindow *export_dialog) { - std::auto_ptr Subs(ExportTransform(export_dialog,true)); - Subs->Save(filename,false,false,charset); +void AssExporter::Export(wxString const& filename, wxString const& charset, wxWindow *export_dialog) { + std::auto_ptr subs(ExportTransform(export_dialog, true)); + subs->Save(filename, false, false, charset); } -/// @brief Get window associated with name -/// @param name -/// @return -/// -wxSizer *AssExporter::GetSettingsSizer(wxString name) { - SizerMap::iterator pos = Sizers.find(name); - if (pos == Sizers.end()) return NULL; - else return pos->second; +wxSizer *AssExporter::GetSettingsSizer(wxString const& name) { + std::map::iterator pos = Sizers.find(name); + if (pos == Sizers.end()) return 0; + return pos->second; } -/// @brief Get description of filter -/// @param name -/// -wxString AssExporter::GetDescription(wxString name) { - FilterList::iterator begin = AssExportFilterChain::GetFilterList()->begin(); - FilterList::iterator end = AssExportFilterChain::GetFilterList()->end(); - for (FilterList::iterator cur=begin;cur!=end;cur++) { - if ((*cur)->name == name) { - return (*cur)->GetDescription(); - } - } +wxString const& AssExporter::GetDescription(wxString const& name) { + AssExportFilter *filter = AssExportFilterChain::GetFilter(name); + if (filter) + return filter->GetDescription(); throw wxString::Format("Filter not found: %s", name); } diff --git a/aegisub/src/ass_exporter.h b/aegisub/src/ass_exporter.h index d6c270a82..5d208d8c9 100644 --- a/aegisub/src/ass_exporter.h +++ b/aegisub/src/ass_exporter.h @@ -34,11 +34,6 @@ /// @ingroup export /// - - - -/////////// -// Headers #ifndef AGI_PRE #include #include @@ -48,58 +43,68 @@ #include #endif - -////////////// -// Prototypes class AssExportFilter; class AssFile; - - -/// DOCME typedef std::list FilterList; -/// DOCME -typedef std::map SizerMap; - - - /// DOCME /// @class AssExporter /// @brief DOCME /// /// DOCME class AssExporter { -private: + typedef FilterList::const_iterator filter_iterator; - /// DOCME - SizerMap Sizers; + /// Sizers for configuration panels + std::map Sizers; - /// DOCME - FilterList Filters; + /// Filters which will be applied to the subtitles + FilterList filters; - /// DOCME - AssFile *OriginalSubs; + /// Input subtitle file + AssFile *original_subs; - /// DOCME - bool IsDefault; + /// Have the config windows been created, or should filters simply use + /// their default settings + bool is_default; public: AssExporter(AssFile *subs); ~AssExporter(); + /// Get the names of all registered export filters wxArrayString GetAllFilterNames(); - void AddFilter(wxString name); + + /// Add the named filter to the list of filters to be run + /// @throws wxString if filter is not found + void AddFilter(wxString const& name); + + /// Add all export filters which have indicated they should apply in + /// non-transform contexts void AddAutoFilters(); - void DrawSettings(wxWindow *parent,wxSizer *AddTo); - void Export(wxString file, wxString charset, wxWindow *export_dialog=NULL); - AssFile *ExportTransform(wxWindow *export_dialog=NULL,bool copy=false); - wxSizer *GetSettingsSizer(wxString name); - /// @brief DOCME - /// - AssFile *GetOriginalSubs() { return OriginalSubs; } - wxString GetDescription(wxString name); + /// Run all added export filters + /// @param parent_window Parent window the filters should use when opening dialogs + /// @param copy Should the file be copied rather than transformed in-place? + /// @return The new subtitle file (which is the old one if copy is false) + AssFile *ExportTransform(wxWindow *parent_window = 0, bool copy = false); + + /// Apply selected export filters and save with the given charset + /// @param file Target filename + /// @param charset Target charset + /// @param parent_window Parent window the filters should use when opening dialogs + void Export(wxString const& file, wxString const& charset, wxWindow *parent_window= 0); + + /// Add configuration panels for all registered filters to the target sizer + /// @param parent Parent window for controls + /// @param target_sizer Sizer to add configuration panels to + void DrawSettings(wxWindow *parent, wxSizer *target_sizer); + + /// Get the sizer created by DrawSettings for a specific filter + wxSizer *GetSettingsSizer(wxString const& name); + + /// Get the description of the named export filter + /// @throws wxString if filter is not found + wxString const& GetDescription(wxString const& name); }; - - diff --git a/aegisub/src/command/tool.cpp b/aegisub/src/command/tool.cpp index b0f9d477b..1b4f3d835 100644 --- a/aegisub/src/command/tool.cpp +++ b/aegisub/src/command/tool.cpp @@ -86,7 +86,7 @@ struct tool_export : public Command { void operator()(agi::Context *c) { c->videoController->Stop(); - DialogExport(c->parent, c->ass).ShowModal(); + DialogExport(c).ShowModal(); } }; diff --git a/aegisub/src/dialog_export.cpp b/aegisub/src/dialog_export.cpp index 604c2b20c..96e73d5b3 100644 --- a/aegisub/src/dialog_export.cpp +++ b/aegisub/src/dialog_export.cpp @@ -44,297 +44,185 @@ #include #endif +#include "dialog_export.h" + #include "ass_exporter.h" #include "ass_file.h" +#include "include/aegisub/context.h" #include "charset_conv.h" -#include "dialog_export.h" #include "help_button.h" - -/// @brief Constructor -/// @param parent -/// -DialogExport::DialogExport (wxWindow *parent, AssFile *subs) -: wxDialog (parent, -1, _("Export"), wxDefaultPosition, wxSize(200,100), wxCAPTION | wxCLOSE_BOX, "Export") +DialogExport::DialogExport(agi::Context *c) +: wxDialog(c->parent, -1, _("Export"), wxDefaultPosition, wxSize(200, 100), wxCAPTION | wxCLOSE_BOX, "Export") +, c(c) +, exporter(new AssExporter(c->ass)) { - // Filter list - wxSizer *TopSizer = new wxStaticBoxSizer(wxVERTICAL,this,_("Filters")); - Export = new AssExporter(subs); - wxArrayString filters = Export->GetAllFilterNames(); - FilterList = new wxCheckListBox(this, Filter_List_Box, wxDefaultPosition, wxSize(200,100), filters); + wxArrayString filters = exporter->GetAllFilterNames(); + filter_list = new wxCheckListBox(this, -1, wxDefaultPosition, wxSize(200, 100), filters); + filter_list->Bind(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, &DialogExport::OnCheck, this); + filter_list->Bind(wxEVT_COMMAND_LISTBOX_SELECTED, &DialogExport::OnChange, this); // Get selected filters - wxString selected = Export->GetOriginalSubs()->GetScriptInfo("Export filters"); + wxString selected = c->ass->GetScriptInfo("Export filters"); wxStringTokenizer token(selected, "|"); - int n = 0; while (token.HasMoreTokens()) { wxString cur = token.GetNextToken(); - if (!cur.IsEmpty()) { - n++; - for (unsigned int i=0;iGetCount();i++) { - if (FilterList->GetString(i) == cur) { - FilterList->Check(i); - break; - } - } + if (!cur.empty()) { + int idx = filters.Index(cur); + if (idx != wxNOT_FOUND) + filter_list->Check(idx); } } - // No filters listed on header, select all - /*if (n == 0) { - for (unsigned int i=0;iGetCount();i++) { - FilterList->Check(i); - } - }*/ + wxButton *btn_up = new wxButton(this, -1, _("Move up"), wxDefaultPosition, wxSize(90, -1)); + wxButton *btn_down = new wxButton(this, -1, _("Move down"), wxDefaultPosition, wxSize(90, -1)); + wxButton *btn_all = new wxButton(this, -1, _("Select all"), wxDefaultPosition, wxSize(80, -1)); + wxButton *btn_none = new wxButton(this, -1, _("Select none"), wxDefaultPosition, wxSize(80, -1)); - // Top buttons - wxSizer *TopButtons = new wxBoxSizer(wxHORIZONTAL); - TopButtons->Add(new wxButton(this,Button_Move_Up,_("Move up"),wxDefaultPosition,wxSize(90,-1)),1,wxEXPAND | wxRIGHT,0); - TopButtons->Add(new wxButton(this,Button_Move_Down,_("Move down"),wxDefaultPosition,wxSize(90,-1)),1,wxEXPAND | wxRIGHT,5); - TopButtons->Add(new wxButton(this,Button_Select_All,_("Select all"),wxDefaultPosition,wxSize(80,-1)),1,wxEXPAND | wxRIGHT,0); - TopButtons->Add(new wxButton(this,Button_Select_None,_("Select none"),wxDefaultPosition,wxSize(80,-1)),1,wxEXPAND | wxRIGHT,0); + btn_up->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &DialogExport::OnMoveUp, this); + btn_down->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &DialogExport::OnMoveDown, this); + btn_all->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &DialogExport::OnSelectAll, this); + btn_none->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &DialogExport::OnSelectNone, this); - // Description field - Description = new wxTextCtrl(this, -1, "", wxDefaultPosition, wxSize(200,60), wxTE_MULTILINE | wxTE_READONLY); + wxSizer *top_buttons = new wxBoxSizer(wxHORIZONTAL); + top_buttons->Add(btn_up, wxSizerFlags(1).Expand()); + top_buttons->Add(btn_down, wxSizerFlags(1).Expand().Border(wxRIGHT)); + top_buttons->Add(btn_all, wxSizerFlags(1).Expand()); + top_buttons->Add(btn_none, wxSizerFlags(1).Expand()); + + filter_description = new wxTextCtrl(this, -1, "", wxDefaultPosition, wxSize(200, 60), wxTE_MULTILINE | wxTE_READONLY); // Charset dropdown list wxStaticText *charset_list_label = new wxStaticText(this, -1, _("Text encoding:")); - CharsetList = new wxChoice(this, Charset_List_Box, wxDefaultPosition, wxDefaultSize, agi::charset::GetEncodingsList()); + charset_list = new wxChoice(this, -1, wxDefaultPosition, wxDefaultSize, agi::charset::GetEncodingsList()); wxSizer *charset_list_sizer = new wxBoxSizer(wxHORIZONTAL); - charset_list_sizer->Add(charset_list_label, 0, wxALIGN_CENTER | wxRIGHT, 5); - charset_list_sizer->Add(CharsetList, 1, wxEXPAND); - if (!CharsetList->SetStringSelection(Export->GetOriginalSubs()->GetScriptInfo("Export Encoding"))) { - CharsetList->SetStringSelection("Unicode (UTF-8)"); - } + charset_list_sizer->Add(charset_list_label, wxSizerFlags().Center().Border(wxRIGHT)); + charset_list_sizer->Add(charset_list, wxSizerFlags(1).Expand()); + if (!charset_list->SetStringSelection(c->ass->GetScriptInfo("Export Encoding"))) + charset_list->SetStringSelection("Unicode (UTF-8)"); - // Top sizer - TopSizer->Add(FilterList,1,wxEXPAND,0); - TopSizer->Add(TopButtons,0,wxEXPAND,0); - TopSizer->Add(Description,0,wxEXPAND | wxTOP,5); - TopSizer->Add(charset_list_sizer, 0, wxEXPAND | wxTOP, 5); + wxSizer *top_sizer = new wxStaticBoxSizer(wxVERTICAL, this, _("Filters")); + top_sizer->Add(filter_list, wxSizerFlags(1).Expand()); + top_sizer->Add(top_buttons, wxSizerFlags(0).Expand()); + top_sizer->Add(filter_description, wxSizerFlags(0).Expand().Border(wxTOP)); + top_sizer->Add(charset_list_sizer, wxSizerFlags(0).Expand().Border(wxTOP)); - // Button sizer - wxStdDialogButtonSizer *ButtonSizer = new wxStdDialogButtonSizer(); - wxButton *process = new wxButton(this,Button_Process,_("Export...")); - ButtonSizer->AddButton(process); - ButtonSizer->AddButton(new wxButton(this,wxID_CANCEL)); - ButtonSizer->AddButton(new HelpButton(this,"Export")); - ButtonSizer->SetAffirmativeButton(process); - ButtonSizer->Realize(); + wxStdDialogButtonSizer *btn_sizer = CreateStdDialogButtonSizer(wxOK | wxCANCEL | wxHELP); + btn_sizer->GetAffirmativeButton()->SetLabelText(_("Export...")); + btn_sizer->GetAffirmativeButton()->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &DialogExport::OnProcess, this); + btn_sizer->GetHelpButton()->Bind(wxEVT_COMMAND_BUTTON_CLICKED, std::tr1::bind(&HelpButton::OpenPage, "Export")); - // Draw stuff sizer - HorizSizer = new wxBoxSizer(wxHORIZONTAL); - OptionsSizer = new wxBoxSizer(wxVERTICAL); - Export->DrawSettings(this,OptionsSizer); - HorizSizer->Add(TopSizer,0,wxEXPAND | wxLEFT | wxTOP | wxBOTTOM,5); - HorizSizer->Add(OptionsSizer,1,wxEXPAND | wxTOP | wxRIGHT | wxBOTTOM,5); + wxSizer *horz_sizer = new wxBoxSizer(wxHORIZONTAL); + opt_sizer = new wxBoxSizer(wxVERTICAL); + exporter->DrawSettings(this, opt_sizer); + horz_sizer->Add(top_sizer, wxSizerFlags().Expand().Border(wxALL & ~wxRIGHT)); + horz_sizer->Add(opt_sizer, wxSizerFlags(1).Expand().Border(wxALL & ~wxLEFT)); - // Main sizer - MainSizer = new wxBoxSizer(wxVERTICAL); - MainSizer->Add(HorizSizer,1,wxEXPAND,0); - MainSizer->Add(ButtonSizer,0,wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM,5); - MainSizer->SetSizeHints(this); - SetSizer(MainSizer); + wxSizer *main_sizer = new wxBoxSizer(wxVERTICAL); + main_sizer->Add(horz_sizer, wxSizerFlags(1).Expand()); + main_sizer->Add(btn_sizer, wxSizerFlags().Expand().Border(wxALL & ~wxTOP)); + SetSizerAndFit(main_sizer); RefreshOptions(); CenterOnParent(); } - - -/// @brief Destructor -/// DialogExport::~DialogExport() { - // Set script info data - int n = 0; wxString infoList; - for (unsigned int i=0;iGetCount();i++) { - if (FilterList->IsChecked(i)) { - infoList += FilterList->GetString(i) + "|"; - n++; - } + for (size_t i = 0; i < filter_list->GetCount(); ++i) { + if (filter_list->IsChecked(i)) + infoList += filter_list->GetString(i) + "|"; } - if (n > 0) infoList = infoList.Left(infoList.Length()-1); - Export->GetOriginalSubs()->SetScriptInfo("Export filters",infoList); - - // Delete exporter - if (Export) delete Export; - Export = NULL; + if (!infoList.empty()) infoList.RemoveLast(); + c->ass->SetScriptInfo("Export filters", infoList); } - - -/// @brief Refresh displaying of options -/// -void DialogExport::RefreshOptions() { - int num = FilterList->GetCount(); - for (int i=0;iGetSettingsSizer(FilterList->GetString(i)); - if (sizer) OptionsSizer->Show(sizer,FilterList->IsChecked(i)?1:0,true); - } - Layout(); - MainSizer->Fit(this); -} - - -/////////////// -// Event table -BEGIN_EVENT_TABLE(DialogExport,wxDialog) - EVT_BUTTON(Button_Process,DialogExport::OnProcess) - EVT_BUTTON(Button_Move_Up,DialogExport::OnMoveUp) - EVT_BUTTON(Button_Move_Down,DialogExport::OnMoveDown) - EVT_BUTTON(Button_Select_All,DialogExport::OnSelectAll) - EVT_BUTTON(Button_Select_None,DialogExport::OnSelectNone) - EVT_CHECKLISTBOX(Filter_List_Box,DialogExport::OnCheck) - EVT_LISTBOX(Filter_List_Box, DialogExport::OnChange) -END_EVENT_TABLE() - - - -/// @brief Process start -/// @param event -/// @return -/// -void DialogExport::OnProcess(wxCommandEvent &event) { - // Get destination - wxString filename = wxFileSelector(_("Export subtitles file"),"","","",AssFile::GetWildcardList(2),wxFD_SAVE | wxFD_OVERWRITE_PROMPT,this); +void DialogExport::OnProcess(wxCommandEvent &) { + wxString filename = wxFileSelector(_("Export subtitles file"), "", "", "", AssFile::GetWildcardList(2), wxFD_SAVE | wxFD_OVERWRITE_PROMPT, this); if (filename.empty()) return; - // Add filters - for (unsigned int i=0;iGetCount();i++) { - if (FilterList->IsChecked(i)) { - Export->AddFilter(FilterList->GetString(i)); - } + for (size_t i = 0; i < filter_list->GetCount(); ++i) { + if (filter_list->IsChecked(i)) + exporter->AddFilter(filter_list->GetString(i)); } - // Export try { wxBusyCursor busy; - Export->GetOriginalSubs()->SetScriptInfo("Export Encoding", CharsetList->GetStringSelection()); - Export->Export(filename, CharsetList->GetStringSelection(), this); + c->ass->SetScriptInfo("Export Encoding", charset_list->GetStringSelection()); + exporter->Export(filename, charset_list->GetStringSelection(), this); } catch (const char *error) { - wxString err(error); - wxMessageBox(err, "Error exporting subtitles", wxOK | wxICON_ERROR, this); + wxMessageBox(error, "Error exporting subtitles", wxOK | wxICON_ERROR, this); } - catch (const agi::charset::ConvError& err) { + catch (wxString const& error) { + wxMessageBox(error, "Error exporting subtitles", wxOK | wxICON_ERROR, this); + } + catch (agi::Exception const& err) { wxMessageBox(err.GetMessage(), "Error exporting subtitles", wxOK | wxICON_ERROR, this); } catch (...) { wxMessageBox("Unknown error", "Error exporting subtitles", wxOK | wxICON_ERROR, this); } - // Close dialog EndModal(0); } - - -/// @brief Checked or unchecked item -/// @param event -/// -void DialogExport::OnCheck(wxCommandEvent &event) { - int n = event.GetInt(); - wxSizer *sizer = Export->GetSettingsSizer(FilterList->GetString(n)); - if (sizer) MainSizer->Show(sizer,FilterList->IsChecked(n)?1:0,true); - Layout(); - MainSizer->Fit(this); +void DialogExport::OnCheck(wxCommandEvent &) { + RefreshOptions(); } - - -/// @brief Changed item -/// @param event -/// -void DialogExport::OnChange(wxCommandEvent &event) { - int n = FilterList->GetSelection(); +void DialogExport::OnChange(wxCommandEvent &) { + int n = filter_list->GetSelection(); if (n != wxNOT_FOUND) { - wxString name = FilterList->GetString(n); - //Description->SetValue(wxGetTranslation(Export->GetDescription(name))); - Description->SetValue(Export->GetDescription(name)); + wxString name = filter_list->GetString(n); + filter_description->SetValue(exporter->GetDescription(name)); } } +// Swap the items at idx and idx + 1 +static void swap(wxCheckListBox *list, int idx, int sel_dir) { + if (idx < 0 || idx + 1 == list->GetCount()) return; - -/// @brief Move up -/// @param event -/// @return -/// -void DialogExport::OnMoveUp(wxCommandEvent &event) { - int pos = FilterList->GetSelection(); - if (pos <= 0) return; - FilterList->Freeze(); - wxString tempname = FilterList->GetString(pos); - bool tempval = FilterList->IsChecked(pos); - FilterList->SetString(pos,FilterList->GetString(pos-1)); - FilterList->Check(pos,FilterList->IsChecked(pos-1)); - FilterList->SetString(pos-1,tempname); - FilterList->Check(pos-1,tempval); - FilterList->SetSelection(pos-1); - FilterList->Thaw(); + list->Freeze(); + wxString tempname = list->GetString(idx); + bool tempval = list->IsChecked(idx); + list->SetString(idx, list->GetString(idx + 1)); + list->Check(idx, list->IsChecked(idx + 1)); + list->SetString(idx + 1, tempname); + list->Check(idx + 1, tempval); + list->SetSelection(idx + sel_dir); + list->Thaw(); } - - -/// @brief Move down -/// @param event -/// @return -/// -void DialogExport::OnMoveDown(wxCommandEvent &event) { - int pos = FilterList->GetSelection(); - int n = FilterList->GetCount(); - if (pos == n-1 || pos == -1) return; - FilterList->Freeze(); - wxString tempname = FilterList->GetString(pos); - bool tempval = FilterList->IsChecked(pos); - FilterList->SetString(pos,FilterList->GetString(pos+1)); - FilterList->Check(pos,FilterList->IsChecked(pos+1)); - FilterList->SetString(pos+1,tempname); - FilterList->Check(pos+1,tempval); - FilterList->SetSelection(pos+1); - FilterList->Thaw(); +void DialogExport::OnMoveUp(wxCommandEvent &) { + swap(filter_list, filter_list->GetSelection() - 1, 0); } +void DialogExport::OnMoveDown(wxCommandEvent &) { + swap(filter_list, filter_list->GetSelection(), 1); +} +void DialogExport::OnSelectAll(wxCommandEvent &) { + SetAll(true); +} -/// @brief Select all -/// @param event -/// -void DialogExport::OnSelectAll(wxCommandEvent &event) { - Freeze(); - FilterList->Freeze(); - for (unsigned int i=0;iGetCount();i++) { - FilterList->Check(i,true); - wxSizer *sizer = Export->GetSettingsSizer(FilterList->GetString(i)); - if (sizer) MainSizer->Show(sizer,true,true); +void DialogExport::OnSelectNone(wxCommandEvent &) { + SetAll(false); +} + +void DialogExport::SetAll(bool new_value) { + filter_list->Freeze(); + for (size_t i = 0; i < filter_list->GetCount(); ++i) + filter_list->Check(i, new_value); + filter_list->Thaw(); + + RefreshOptions(); +} + +void DialogExport::RefreshOptions() { + for (size_t i = 0; i < filter_list->GetCount(); ++i) { + if (wxSizer *sizer = exporter->GetSettingsSizer(filter_list->GetString(i))) + opt_sizer->Show(sizer, filter_list->IsChecked(i), true); } - - // Update dialog Layout(); - MainSizer->Fit(this); - FilterList->Thaw(); - Thaw(); + GetSizer()->Fit(this); } - - - -/// @brief Select none -/// @param event -/// -void DialogExport::OnSelectNone(wxCommandEvent &event) { - Freeze(); - FilterList->Freeze(); - for (unsigned int i=0;iGetCount();i++) { - FilterList->Check(i,false); - wxSizer *sizer = Export->GetSettingsSizer(FilterList->GetString(i)); - if (sizer) MainSizer->Show(sizer,false,true); - } - - // Update dialog - FilterList->Thaw(); - Thaw(); - Layout(); - MainSizer->Fit(this); -} - - diff --git a/aegisub/src/dialog_export.h b/aegisub/src/dialog_export.h index 35db5fb40..1b1c4f39a 100644 --- a/aegisub/src/dialog_export.h +++ b/aegisub/src/dialog_export.h @@ -34,11 +34,6 @@ /// @ingroup export /// - - - -/////////// -// Headers #ifndef AGI_PRE #include @@ -51,16 +46,10 @@ #include #endif +#include -/// DOCME -typedef std::map SizerMap; - - -////////////// -// Prototypes class AssExporter; - - +namespace agi { struct Context; } /// DOCME /// @class DialogExport @@ -68,73 +57,37 @@ class AssExporter; /// /// DOCME class DialogExport : public wxDialog { -private: + agi::Context *c; + + /// The export transform engine + agi::scoped_ptr exporter; + + /// The description of the currently selected export filter + wxTextCtrl *filter_description; + + /// A list of all registered export filters + wxCheckListBox *filter_list; + + /// A list of available target charsets + wxChoice *charset_list; /// DOCME - AssExporter *Export; + wxSizer *opt_sizer; - /// DOCME - SizerMap SetupMap; + void OnProcess(wxCommandEvent &); + void OnMoveUp(wxCommandEvent &); + void OnMoveDown(wxCommandEvent &); + void OnSelectAll(wxCommandEvent &); + void OnSelectNone(wxCommandEvent &); + void OnCheck(wxCommandEvent &); + void OnChange(wxCommandEvent &); - /// DOCME - wxTextCtrl *Description; - - /// DOCME - wxCheckListBox *FilterList; - - /// DOCME - wxChoice *CharsetList; - - /// DOCME - wxSizer *MainSizer; - - /// DOCME - wxSizer *HorizSizer; - - /// DOCME - wxSizer *OptionsSizer; - - void OnProcess(wxCommandEvent &event); - void OnMoveUp(wxCommandEvent &event); - void OnMoveDown(wxCommandEvent &event); - void OnSelectAll(wxCommandEvent &event); - void OnSelectNone(wxCommandEvent &event); - void OnCheck(wxCommandEvent &event); - void OnChange(wxCommandEvent &event); + /// Set all the checkboxes + void SetAll(bool new_value); + /// Update which options sizers are shown void RefreshOptions(); public: - DialogExport(wxWindow *parent, AssFile *subs); + DialogExport(agi::Context *c); ~DialogExport(); - - DECLARE_EVENT_TABLE() }; - - -/////// -// IDs -enum { - - /// DOCME - Button_Process = 1400, - - /// DOCME - Button_Move_Up, - - /// DOCME - Button_Move_Down, - - /// DOCME - Button_Select_All, - - /// DOCME - Button_Select_None, - - /// DOCME - Filter_List_Box, - - /// DOCME - Charset_List_Box -}; - - diff --git a/aegisub/src/export_clean_info.h b/aegisub/src/export_clean_info.h index cff6c450d..4c07037fd 100644 --- a/aegisub/src/export_clean_info.h +++ b/aegisub/src/export_clean_info.h @@ -44,6 +44,6 @@ /// DOCME class AssTransformCleanInfoFilter : public AssExportFilter { public: - void ProcessSubs(AssFile *subs, wxWindow *export_dialog); + void ProcessSubs(AssFile *subs, wxWindow *); AssTransformCleanInfoFilter(); }; diff --git a/aegisub/src/export_fixstyle.cpp b/aegisub/src/export_fixstyle.cpp index 7e4971c92..7775890ea 100644 --- a/aegisub/src/export_fixstyle.cpp +++ b/aegisub/src/export_fixstyle.cpp @@ -49,7 +49,6 @@ AssFixStylesFilter::AssFixStylesFilter() : AssExportFilter(_("Fix Styles"), _("Fixes styles by replacing any style that isn't available on file with Default."), -5000) { - autoExporter = true; } void AssFixStylesFilter::ProcessSubs(AssFile *subs, wxWindow *) { diff --git a/aegisub/src/export_fixstyle.h b/aegisub/src/export_fixstyle.h index 07a17076b..5994331a6 100644 --- a/aegisub/src/export_fixstyle.h +++ b/aegisub/src/export_fixstyle.h @@ -44,8 +44,6 @@ /// DOCME class AssFixStylesFilter : public AssExportFilter { public: - void ProcessSubs(AssFile *subs, wxWindow *export_dialog); + void ProcessSubs(AssFile *subs, wxWindow *); AssFixStylesFilter(); }; - - diff --git a/aegisub/src/export_framerate.cpp b/aegisub/src/export_framerate.cpp index 7024f6523..de356b775 100644 --- a/aegisub/src/export_framerate.cpp +++ b/aegisub/src/export_framerate.cpp @@ -62,7 +62,7 @@ AssTransformFramerateFilter::AssTransformFramerateFilter() { } -void AssTransformFramerateFilter::ProcessSubs(AssFile *subs, wxWindow *export_dialog) { +void AssTransformFramerateFilter::ProcessSubs(AssFile *subs, wxWindow *) { TransformFrameRate(subs); } diff --git a/aegisub/src/export_framerate.h b/aegisub/src/export_framerate.h index 3b81ca9fd..d8b7fec5c 100644 --- a/aegisub/src/export_framerate.h +++ b/aegisub/src/export_framerate.h @@ -91,7 +91,7 @@ class AssTransformFramerateFilter : public AssExportFilter { public: /// Constructor AssTransformFramerateFilter(); - void ProcessSubs(AssFile *subs, wxWindow *export_dialog); + void ProcessSubs(AssFile *subs, wxWindow *); wxWindow *GetConfigDialogWindow(wxWindow *parent); void LoadSettings(bool IsDefault); };