Pass a project context to AssExportFilter::GetConfigDialogWindow so that export filters don't have to use things like AssFile::top and VideoContext::Get

Originally committed to SVN as r5629.
This commit is contained in:
Thomas Goyne 2011-09-28 19:46:53 +00:00
parent 9ce579e187
commit df100fb5a5
9 changed files with 41 additions and 34 deletions

View file

@ -46,8 +46,8 @@
class AssFile; class AssFile;
class AssExportFilter; class AssExportFilter;
class DialogExport;
class AssExporter; namespace agi { struct Context; }
/// DOCME /// DOCME
typedef std::list<AssExportFilter*> FilterList; typedef std::list<AssExportFilter*> FilterList;
@ -111,9 +111,12 @@ public:
virtual void ProcessSubs(AssFile *subs, wxWindow *parent_window=0)=0; virtual void ProcessSubs(AssFile *subs, wxWindow *parent_window=0)=0;
/// Draw setup controls /// Draw setup controls
virtual wxWindow *GetConfigDialogWindow(wxWindow *parent) { return 0; } /// @param parent Parent window to add controls to
/// @param c Project context
virtual wxWindow *GetConfigDialogWindow(wxWindow *parent, agi::Context *c) { return 0; }
/// Load settings to use from the configuration dialog /// Load settings to use from the configuration dialog
/// @param is_default If true use default settings instead /// @param is_default If true use default settings instead
virtual void LoadSettings(bool is_default) { } /// @param c Project context
virtual void LoadSettings(bool is_default, agi::Context *c) { }
}; };

View file

@ -39,6 +39,7 @@
#include "ass_export_filter.h" #include "ass_export_filter.h"
#include "ass_exporter.h" #include "ass_exporter.h"
#include "ass_file.h" #include "ass_file.h"
#include "include/aegisub/context.h"
static inline std::list<AssExportFilter*>::const_iterator filter_list_begin() { static inline std::list<AssExportFilter*>::const_iterator filter_list_begin() {
return AssExportFilterChain::GetFilterList()->begin(); return AssExportFilterChain::GetFilterList()->begin();
@ -48,8 +49,8 @@ static inline std::list<AssExportFilter*>::const_iterator filter_list_end() {
return AssExportFilterChain::GetFilterList()->end(); return AssExportFilterChain::GetFilterList()->end();
} }
AssExporter::AssExporter(AssFile *subs) AssExporter::AssExporter(agi::Context *c)
: original_subs(subs) : c(c)
, is_default(true) , is_default(true)
{ {
} }
@ -63,7 +64,7 @@ void AssExporter::DrawSettings(wxWindow *parent, wxSizer *target_sizer) {
// Make sure to construct static box sizer first, so it won't overlap // Make sure to construct static box sizer first, so it won't overlap
// the controls on wxMac. // the controls on wxMac.
wxSizer *box = new wxStaticBoxSizer(wxVERTICAL, parent, (*cur)->GetName()); wxSizer *box = new wxStaticBoxSizer(wxVERTICAL, parent, (*cur)->GetName());
wxWindow *window = (*cur)->GetConfigDialogWindow(parent); wxWindow *window = (*cur)->GetConfigDialogWindow(parent, c);
if (window) { if (window) {
box->Add(window, 0, wxEXPAND, 0); box->Add(window, 0, wxEXPAND, 0);
target_sizer->Add(box, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5); target_sizer->Add(box, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5);
@ -99,10 +100,10 @@ wxArrayString AssExporter::GetAllFilterNames() {
} }
AssFile *AssExporter::ExportTransform(wxWindow *export_dialog, bool copy) { AssFile *AssExporter::ExportTransform(wxWindow *export_dialog, bool copy) {
AssFile *subs = copy ? new AssFile(*original_subs) : original_subs; AssFile *subs = copy ? new AssFile(*c->ass) : c->ass;
for (filter_iterator cur = filters.begin(); cur != filters.end(); cur++) { for (filter_iterator cur = filters.begin(); cur != filters.end(); cur++) {
(*cur)->LoadSettings(is_default); (*cur)->LoadSettings(is_default, c);
(*cur)->ProcessSubs(subs, export_dialog); (*cur)->ProcessSubs(subs, export_dialog);
} }

View file

@ -45,6 +45,7 @@
class AssExportFilter; class AssExportFilter;
class AssFile; class AssFile;
namespace agi { struct Context; }
typedef std::list<AssExportFilter*> FilterList; typedef std::list<AssExportFilter*> FilterList;
@ -62,15 +63,15 @@ class AssExporter {
/// Filters which will be applied to the subtitles /// Filters which will be applied to the subtitles
FilterList filters; FilterList filters;
/// Input subtitle file /// Input context
AssFile *original_subs; agi::Context *c;
/// Have the config windows been created, or should filters simply use /// Have the config windows been created, or should filters simply use
/// their default settings /// their default settings
bool is_default; bool is_default;
public: public:
AssExporter(AssFile *subs); AssExporter(agi::Context *c);
~AssExporter(); ~AssExporter();
/// Get the names of all registered export filters /// Get the names of all registered export filters

View file

@ -47,7 +47,6 @@
#include "ass_attachment.h" #include "ass_attachment.h"
#include "ass_dialogue.h" #include "ass_dialogue.h"
#include "ass_exporter.h"
#include "ass_file.h" #include "ass_file.h"
#include "ass_override.h" #include "ass_override.h"
#include "ass_style.h" #include "ass_style.h"
@ -224,12 +223,6 @@ void AssFile::SaveMemory(std::vector<char> &dst,const wxString encoding) {
} }
} }
void AssFile::Export(wxString _filename) {
AssExporter exporter(this);
exporter.AddAutoFilters();
exporter.Export(_filename,"UTF-8");
}
bool AssFile::CanSave() { bool AssFile::CanSave() {
// ASS format? // ASS format?
wxString ext = filename.Lower().Right(4); wxString ext = filename.Lower().Right(4);

View file

@ -132,9 +132,6 @@ public:
/// @brief Save to a memory buffer. Used for subtitle providers which support it /// @brief Save to a memory buffer. Used for subtitle providers which support it
/// @param[out] dst Destination vector /// @param[out] dst Destination vector
void SaveMemory(std::vector<char> &dst,const wxString encoding=""); void SaveMemory(std::vector<char> &dst,const wxString encoding="");
/// @brief Saves exported copy, with effects applied
/// @param file Path to save to; file name is never set to this
void Export(wxString file);
/// Add file name to the MRU list /// Add file name to the MRU list
void AddToRecent(wxString file); void AddToRecent(wxString file);
/// Can the file be saved in its current format? /// Can the file be saved in its current format?

View file

@ -55,7 +55,7 @@
DialogExport::DialogExport(agi::Context *c) DialogExport::DialogExport(agi::Context *c)
: wxDialog(c->parent, -1, _("Export"), wxDefaultPosition, wxSize(200, 100), wxCAPTION | wxCLOSE_BOX, "Export") : wxDialog(c->parent, -1, _("Export"), wxDefaultPosition, wxSize(200, 100), wxCAPTION | wxCLOSE_BOX, "Export")
, c(c) , c(c)
, exporter(new AssExporter(c->ass)) , exporter(new AssExporter(c))
{ {
wxArrayString filters = exporter->GetAllFilterNames(); wxArrayString filters = exporter->GetAllFilterNames();
filter_list = new wxCheckListBox(this, -1, wxDefaultPosition, wxSize(200, 100), filters); filter_list = new wxCheckListBox(this, -1, wxDefaultPosition, wxSize(200, 100), filters);

View file

@ -52,11 +52,13 @@
#include "ass_file.h" #include "ass_file.h"
#include "ass_override.h" #include "ass_override.h"
#include "export_framerate.h" #include "export_framerate.h"
#include "include/aegisub/context.h"
#include "utils.h" #include "utils.h"
#include "video_context.h" #include "video_context.h"
AssTransformFramerateFilter::AssTransformFramerateFilter() AssTransformFramerateFilter::AssTransformFramerateFilter()
: AssExportFilter(_("Transform Framerate"), _("Transform subtitle times, including those in override tags, from an input framerate to an output framerate.\n\nThis is useful for converting regular time subtitles to VFRaC time subtitles for hardsubbing.\nIt can also be used to convert subtitles to a different speed video, such as NTSC to PAL speedup."), 1000) : AssExportFilter(_("Transform Framerate"), _("Transform subtitle times, including those in override tags, from an input framerate to an output framerate.\n\nThis is useful for converting regular time subtitles to VFRaC time subtitles for hardsubbing.\nIt can also be used to convert subtitles to a different speed video, such as NTSC to PAL speedup."), 1000)
, c(0)
, Input(0) , Input(0)
, Output(0) , Output(0)
{ {
@ -66,10 +68,10 @@ void AssTransformFramerateFilter::ProcessSubs(AssFile *subs, wxWindow *) {
TransformFrameRate(subs); TransformFrameRate(subs);
} }
wxWindow *AssTransformFramerateFilter::GetConfigDialogWindow(wxWindow *parent) { wxWindow *AssTransformFramerateFilter::GetConfigDialogWindow(wxWindow *parent, agi::Context *c) {
wxWindow *base = new wxPanel(parent, -1); wxWindow *base = new wxPanel(parent, -1);
LoadSettings(true); LoadSettings(true, c);
// Input sizer // Input sizer
wxSizer *InputSizer = new wxBoxSizer(wxHORIZONTAL); wxSizer *InputSizer = new wxBoxSizer(wxHORIZONTAL);
@ -130,13 +132,15 @@ wxWindow *AssTransformFramerateFilter::GetConfigDialogWindow(wxWindow *parent) {
} }
void AssTransformFramerateFilter::OnFpsFromVideo(wxCommandEvent &) { void AssTransformFramerateFilter::OnFpsFromVideo(wxCommandEvent &) {
InputFramerate->SetValue(wxString::Format("%g", VideoContext::Get()->FPS().FPS())); InputFramerate->SetValue(wxString::Format("%g", c->videoController->FPS().FPS()));
} }
void AssTransformFramerateFilter::LoadSettings(bool IsDefault) { void AssTransformFramerateFilter::LoadSettings(bool is_default, agi::Context *c) {
if (IsDefault) { this->c = c;
Input = &VideoContext::Get()->VFR_Input;
Output = &VideoContext::Get()->VFR_Output; if (is_default) {
Input = &c->videoController->VFR_Input;
Output = &c->videoController->VFR_Output;
} }
else { else {
double temp; double temp;
@ -148,7 +152,7 @@ void AssTransformFramerateFilter::LoadSettings(bool IsDefault) {
t2 = temp; t2 = temp;
Output = &t2; Output = &t2;
} }
else Output = &VideoContext::Get()->VFR_Output; else Output = &c->videoController->VFR_Output;
if (Reverse->IsChecked()) { if (Reverse->IsChecked()) {
std::swap(Input, Output); std::swap(Input, Output);

View file

@ -47,6 +47,7 @@ class wxTextCtrl;
/// @class AssTransformFramerateFilter /// @class AssTransformFramerateFilter
/// @brief Transform subtitle times, including those in override tags, from an input framerate to an output framerate /// @brief Transform subtitle times, including those in override tags, from an input framerate to an output framerate
class AssTransformFramerateFilter : public AssExportFilter { class AssTransformFramerateFilter : public AssExportFilter {
agi::Context *c;
AssDialogue *line; AssDialogue *line;
int newStart; int newStart;
int newEnd; int newEnd;
@ -92,6 +93,6 @@ public:
/// Constructor /// Constructor
AssTransformFramerateFilter(); AssTransformFramerateFilter();
void ProcessSubs(AssFile *subs, wxWindow *); void ProcessSubs(AssFile *subs, wxWindow *);
wxWindow *GetConfigDialogWindow(wxWindow *parent); wxWindow *GetConfigDialogWindow(wxWindow *parent, agi::Context *c);
void LoadSettings(bool IsDefault); void LoadSettings(bool is_default, agi::Context *c);
}; };

View file

@ -45,6 +45,7 @@
#include "ass_exporter.h" #include "ass_exporter.h"
#include "ass_file.h" #include "ass_file.h"
#include "compat.h" #include "compat.h"
#include "include/aegisub/context.h"
#include "include/aegisub/subtitles_provider.h" #include "include/aegisub/subtitles_provider.h"
#include "video_provider_manager.h" #include "video_provider_manager.h"
@ -86,7 +87,13 @@ std::tr1::shared_ptr<AegiVideoFrame> ThreadedFrameSource::ProcFrame(int frameNum
// other lines will probably not be viewed before the file changes // other lines will probably not be viewed before the file changes
// again), and if it's a different frame, export the entire file. // again), and if it's a different frame, export the entire file.
if (singleFrame == -1) { if (singleFrame == -1) {
AssExporter exporter(subs.get()); // This will crash if any of the export filters try to use
// anything but the subtitles, but that wouldn't be safe to
// do anyway
agi::Context c = { 0 };
c.ass = subs.get();
AssExporter exporter(&c);
exporter.AddAutoFilters(); exporter.AddAutoFilters();
exporter.ExportTransform(); exporter.ExportTransform();