diff --git a/aegisub/src/command/audio.cpp b/aegisub/src/command/audio.cpp index 3fb14f58f..cf4f6dabe 100644 --- a/aegisub/src/command/audio.cpp +++ b/aegisub/src/command/audio.cpp @@ -47,10 +47,9 @@ #include "../include/aegisub/context.h" #include "../options.h" #include "../selection_controller.h" +#include "../utils.h" #include "../video_context.h" -#include -#include #include namespace { @@ -87,16 +86,14 @@ struct audio_open : public Command { STR_HELP("Opens an audio file") void operator()(agi::Context *c) { + wxString str = _("Audio Formats") + " (*.aac,*.ac3,*.ape,*.dts,*.flac,*.m4a,*.mka,*.mp3,*.mp4,*.ogg,*.w64,*.wav,*.wma)|*.aac;*.ac3;*.ape;*.dts;*.flac;*.m4a;*.mka;*.mp3;*.mp4;*.ogg;*.w64;*.wav;*.wma|" + + _("Video Formats") + " (*.asf,*.avi,*.avs,*.d2v,*.m2ts,*.m4v,*.mkv,*.mov,*.mp4,*.mpeg,*.mpg,*.ogm,*.webm,*.wmv,*.ts)|*.asf;*.avi;*.avs;*.d2v;*.m2ts;*.m4v;*.mkv;*.mov;*.mp4;*.mpeg;*.mpg;*.ogm;*.webm;*.wmv;*.ts|" + + _("All Files") + " (*.*)|*.*"; + auto filename = OpenFileSelector(_("Open Audio File"), "Path/Last/Audio", "", "", str, c->parent); + if (filename.empty()) return; + try { - wxString path = to_wx(OPT_GET("Path/Last/Audio")->GetString()); - wxString str = _("Audio Formats") + " (*.aac,*.ac3,*.ape,*.dts,*.flac,*.m4a,*.mka,*.mp3,*.mp4,*.ogg,*.w64,*.wav,*.wma)|*.aac;*.ac3;*.ape;*.dts;*.flac;*.m4a;*.mka;*.mp3;*.mp4;*.ogg;*.w64;*.wav;*.wma|" - + _("Video Formats") + " (*.asf,*.avi,*.avs,*.d2v,*.m2ts,*.m4v,*.mkv,*.mov,*.mp4,*.mpeg,*.mpg,*.ogm,*.webm,*.wmv,*.ts)|*.asf;*.avi;*.avs;*.d2v;*.m2ts;*.m4v;*.mkv;*.mov;*.mp4;*.mpeg;*.mpg;*.ogm;*.webm;*.wmv;*.ts|" - + _("All Files") + " (*.*)|*.*"; - agi::fs::path filename = wxFileSelector(_("Open Audio File"),path,"","",str,wxFD_OPEN | wxFD_FILE_MUST_EXIST); - if (!filename.empty()) { - c->audioController->OpenAudio(filename); - OPT_SET("Path/Last/Audio")->SetString(filename.parent_path().string()); - } + c->audioController->OpenAudio(filename); } catch (agi::UserCancelException const&) { } catch (agi::Exception const& e) { @@ -224,7 +221,7 @@ struct audio_save_clip : public Command { } c->audioController->SaveClip( - from_wx(wxFileSelector(_("Save audio clip"), "", "", "wav", "", wxFD_SAVE|wxFD_OVERWRITE_PROMPT, c->parent)), + SaveFileSelector(_("Save audio clip"), "", "", "wav", "", c->parent), TimeRange(start, end)); } }; diff --git a/aegisub/src/command/keyframe.cpp b/aegisub/src/command/keyframe.cpp index 1075e8c49..dbb4cb512 100644 --- a/aegisub/src/command/keyframe.cpp +++ b/aegisub/src/command/keyframe.cpp @@ -40,11 +40,9 @@ #include "../include/aegisub/context.h" #include "../options.h" +#include "../utils.h" #include "../video_context.h" -#include -#include - namespace { using cmd::Command; /// @defgroup cmd-keyframed Keyframe commands. @@ -67,7 +65,6 @@ struct keyframe_close : public Command { } }; - /// Opens a keyframe list file. struct keyframe_open : public Command { CMD_NAME("keyframe/open") @@ -76,17 +73,14 @@ struct keyframe_open : public Command { STR_HELP("Opens a keyframe list file") void operator()(agi::Context *c) { - agi::fs::path filename = wxFileSelector( + auto filename = OpenFileSelector( _("Open keyframes file"), - to_wx(OPT_GET("Path/Last/Keyframes")->GetString()), - "" - ,".txt", + "Path/Last/Keyframes", "" ,".txt", _("All Supported Formats") + " (*.txt, *.pass, *.stats, *.log)|*.txt;*.pass;*.stats;*.log|" + _("All Files") + " (*.*)|*.*", - wxFD_FILE_MUST_EXIST | wxFD_OPEN); + c->parent); - if (filename.empty()) return; - OPT_SET("Path/Last/Keyframes")->SetString(filename.parent_path().string()); - c->videoController->LoadKeyframes(filename); + if (!filename.empty()) + c->videoController->LoadKeyframes(filename); } }; @@ -103,11 +97,9 @@ struct keyframe_save : public Command { } void operator()(agi::Context *c) { - std::string path = OPT_GET("Path/Last/Keyframes")->GetString(); - agi::fs::path filename = wxFileSelector(_("Save keyframes file"),to_wx(path),"","*.key.txt","Text files (*.txt)|*.txt",wxFD_OVERWRITE_PROMPT | wxFD_SAVE); - if (filename.empty()) return; - OPT_SET("Path/Last/Keyframes")->SetString(filename.parent_path().string()); - c->videoController->SaveKeyframes(filename); + auto filename = SaveFileSelector(_("Save keyframes file"), "Path/Last/Keyframes", "", "*.key.txt", "Text files (*.txt)|*.txt", c->parent); + if (!filename.empty()) + c->videoController->SaveKeyframes(filename); } }; } diff --git a/aegisub/src/command/subtitle.cpp b/aegisub/src/command/subtitle.cpp index 70011c37e..6381dfbcf 100644 --- a/aegisub/src/command/subtitle.cpp +++ b/aegisub/src/command/subtitle.cpp @@ -57,7 +57,6 @@ #include "../utils.h" #include "../video_context.h" -#include #include #include @@ -261,13 +260,7 @@ struct subtitle_open : public Command { STR_HELP("Opens a subtitles file") void operator()(agi::Context *c) { - std::string filename = from_wx(wxFileSelector( - _("Open subtitles file"), - to_wx(OPT_GET("Path/Last/Subtitles")->GetString()), - "","", - to_wx(SubtitleFormat::GetWildcards(0)), - wxFD_OPEN | wxFD_FILE_MUST_EXIST)); - + auto filename = OpenFileSelector(_("Open subtitles file"), "Path/Last/Subtitles", "","", SubtitleFormat::GetWildcards(0), c->parent); if (!filename.empty()) wxGetApp().frame->LoadSubtitles(filename); } @@ -294,14 +287,13 @@ struct subtitle_open_charset : public Command { STR_HELP("Opens a subtitles file with a specific charset") void operator()(agi::Context *c) { - wxString path = to_wx(OPT_GET("Path/Last/Subtitles")->GetString()); - wxString filename = wxFileSelector(_("Open subtitles file"),path,"","",to_wx(SubtitleFormat::GetWildcards(0)),wxFD_OPEN | wxFD_FILE_MUST_EXIST); + auto filename = OpenFileSelector(_("Open subtitles file"), "Path/Last/Subtitles", "","", SubtitleFormat::GetWildcards(0), c->parent); if (filename.empty()) return; wxString charset = wxGetSingleChoice(_("Choose charset code:"), _("Charset"), agi::charset::GetEncodingsList(), c->parent, -1, -1, true, 250, 200); if (charset.empty()) return; - wxGetApp().frame->LoadSubtitles(from_wx(filename), from_wx(charset)); + wxGetApp().frame->LoadSubtitles(filename, from_wx(charset)); } }; @@ -339,11 +331,9 @@ struct subtitle_properties : public Command { static void save_subtitles(agi::Context *c, agi::fs::path filename) { if (filename.empty()) { c->videoController->Stop(); - wxString path = to_wx(OPT_GET("Path/Last/Subtitles")->GetString()); - filename = wxFileSelector(_("Save subtitles file"), path, - c->ass->filename.stem().wstring() + L".ass", "ass", - "Advanced Substation Alpha (*.ass)|*.ass", - wxFD_SAVE | wxFD_OVERWRITE_PROMPT, c->parent); + filename = SaveFileSelector(_("Save subtitles file"), "Path/Last/Subtitles", + c->ass->filename.stem().string() + ".ass", "ass", + "Advanced Substation Alpha (*.ass)|*.ass", c->parent); if (filename.empty()) return; } diff --git a/aegisub/src/command/timecode.cpp b/aegisub/src/command/timecode.cpp index bc7feaa41..b5062279e 100644 --- a/aegisub/src/command/timecode.cpp +++ b/aegisub/src/command/timecode.cpp @@ -40,11 +40,9 @@ #include "../include/aegisub/context.h" #include "../options.h" +#include "../utils.h" #include "../video_context.h" -#include -#include - namespace { using cmd::Command; /// @defgroup cmd-timecode Timecode commands. @@ -76,13 +74,10 @@ struct timecode_open : public Command { STR_HELP("Opens a VFR timecodes v1 or v2 file") void operator()(agi::Context *c) { - wxString path = to_wx(OPT_GET("Path/Last/Timecodes")->GetString()); - wxString str = _("All Supported Formats") + " (*.txt)|*.txt|" + _("All Files") + " (*.*)|*.*"; - agi::fs::path filename = wxFileSelector(_("Open Timecodes File"),path,"","",str,wxFD_OPEN | wxFD_FILE_MUST_EXIST); - if (!filename.empty()) { + auto str = _("All Supported Formats") + " (*.txt)|*.txt|" + _("All Files") + " (*.*)|*.*"; + auto filename = OpenFileSelector(_("Open Timecodes File"), "Path/Last/Timecodes", "", "", str, c->parent); + if (!filename.empty()) c->videoController->LoadTimecodes(filename); - OPT_SET("Path/Last/Timecodes")->SetString(filename.parent_path().string()); - } } }; @@ -99,13 +94,10 @@ struct timecode_save : public Command { } void operator()(agi::Context *c) { - wxString path = to_wx(OPT_GET("Path/Last/Timecodes")->GetString()); - wxString str = _("All Supported Formats") + " (*.txt)|*.txt|" + _("All Files") + " (*.*)|*.*"; - agi::fs::path filename = wxFileSelector(_("Save Timecodes File"),path,"","",str,wxFD_SAVE | wxFD_OVERWRITE_PROMPT); - if (!filename.empty()) { + auto str = _("All Supported Formats") + " (*.txt)|*.txt|" + _("All Files") + " (*.*)|*.*"; + auto filename = SaveFileSelector(_("Save Timecodes File"), "Path/Last/Timecodes", "", "", str, c->parent); + if (!filename.empty()) c->videoController->SaveTimecodes(filename); - OPT_SET("Path/Last/Timecodes")->SetString(filename.parent_path().string()); - } } }; } diff --git a/aegisub/src/command/video.cpp b/aegisub/src/command/video.cpp index 9390db253..c3d5d5ed4 100644 --- a/aegisub/src/command/video.cpp +++ b/aegisub/src/command/video.cpp @@ -68,7 +68,6 @@ #include #include -#include #include #include @@ -559,9 +558,8 @@ struct video_jump_start : public validator_video_loaded { STR_HELP("Jumps the video to the start frame of current subtitle") void operator()(agi::Context *c) { - if (AssDialogue *active_line = c->selectionController->GetActiveLine()) { + if (AssDialogue *active_line = c->selectionController->GetActiveLine()) c->videoController->JumpToTime(active_line->Start); - } } }; @@ -573,14 +571,11 @@ struct video_open : public Command { STR_HELP("Opens a video file") void operator()(agi::Context *c) { - wxString path = to_wx(OPT_GET("Path/Last/Video")->GetString()); - wxString str = _("Video Formats") + " (*.asf,*.avi,*.avs,*.d2v,*.m2ts,*.m4v,*.mkv,*.mov,*.mp4,*.mpeg,*.mpg,*.ogm,*.webm,*.wmv,*.ts,*.y4m,*.yuv)|*.asf;*.avi;*.avs;*.d2v;*.m2ts;*.m4v;*.mkv;*.mov;*.mp4;*.mpeg;*.mpg;*.ogm;*.webm;*.wmv;*.ts;*.y4m;*.yuv|" - + _("All Files") + " (*.*)|*.*"; - agi::fs::path filename = wxFileSelector(_("Open video file"),path,"","",str,wxFD_OPEN | wxFD_FILE_MUST_EXIST); - if (!filename.empty()) { + auto str = _("Video Formats") + " (*.asf,*.avi,*.avs,*.d2v,*.m2ts,*.m4v,*.mkv,*.mov,*.mp4,*.mpeg,*.mpg,*.ogm,*.webm,*.wmv,*.ts,*.y4m,*.yuv)|*.asf;*.avi;*.avs;*.d2v;*.m2ts;*.m4v;*.mkv;*.mov;*.mp4;*.mpeg;*.mpg;*.ogm;*.webm;*.wmv;*.ts;*.y4m;*.yuv|" + + _("All Files") + " (*.*)|*.*"; + auto filename = OpenFileSelector(_("Open video file"), "Path/Last/Video", "", "", str, c->parent); + if (!filename.empty()) c->videoController->SetVideo(filename); - OPT_SET("Path/Last/Video")->SetString(filename.parent_path().string()); - } } }; diff --git a/aegisub/src/dialog_attachments.cpp b/aegisub/src/dialog_attachments.cpp index dbb7dd924..820297c14 100644 --- a/aegisub/src/dialog_attachments.cpp +++ b/aegisub/src/dialog_attachments.cpp @@ -37,8 +37,8 @@ #include "dialog_attachments.h" #include -#include #include +#include #include #include @@ -145,21 +145,19 @@ void DialogAttachments::OnExtract(wxCommandEvent &) { int i = listView->GetFirstSelected(); if (i == -1) return; - std::string path; + agi::fs::path path; bool fullPath = false; // Multiple or single? if (listView->GetNextSelected(i) != -1) - path = from_wx(wxDirSelector(_("Select the path to save the files to:"), to_wx(OPT_GET("Path/Fonts Collector Destination")->GetString()))) + "/"; + path = wxDirSelector(_("Select the path to save the files to:"), to_wx(OPT_GET("Path/Fonts Collector Destination")->GetString())); else { - path = from_wx(wxFileSelector( + path = SaveFileSelector( _("Select the path to save the file to:"), - to_wx(OPT_GET("Path/Fonts Collector Destination")->GetString()), - to_wx(((AssAttachment*)wxUIntToPtr(listView->GetItemData(i)))->GetFileName()), - ".ttf", - "Font Files (*.ttf)|*.ttf", - wxFD_SAVE | wxFD_OVERWRITE_PROMPT, - this)); + "Path/Fonts Collector Destination", + ((AssAttachment*)wxUIntToPtr(listView->GetItemData(i)))->GetFileName(), + ".ttf", "Font Files (*.ttf)|*.ttf", + this); fullPath = true; } if (path.empty()) return; @@ -167,7 +165,7 @@ void DialogAttachments::OnExtract(wxCommandEvent &) { // Loop through items in list while (i != -1) { AssAttachment *attach = (AssAttachment*)wxUIntToPtr(listView->GetItemData(i)); - attach->Extract(fullPath ? path : path + attach->GetFileName()); + attach->Extract(fullPath ? path : path/attach->GetFileName()); i = listView->GetNextSelected(i); } } diff --git a/aegisub/src/dialog_export.cpp b/aegisub/src/dialog_export.cpp index 61ec52e03..14c410330 100644 --- a/aegisub/src/dialog_export.cpp +++ b/aegisub/src/dialog_export.cpp @@ -43,6 +43,7 @@ #include "help_button.h" #include "libresrc/libresrc.h" #include "subtitle_format.h" +#include "utils.h" #include @@ -52,7 +53,6 @@ #include #include #include -#include #include #include #include @@ -162,7 +162,7 @@ DialogExport::~DialogExport() { void DialogExport::OnProcess(wxCommandEvent &) { if (!TransferDataFromWindow()) return; - auto filename = wxFileSelector(_("Export subtitles file"), "", "", "", to_wx(SubtitleFormat::GetWildcards(1)), wxFD_SAVE | wxFD_OVERWRITE_PROMPT, this); + auto filename = SaveFileSelector(_("Export subtitles file"), "", "", "", to_wx(SubtitleFormat::GetWildcards(1)), this); if (filename.empty()) return; for (size_t i = 0; i < filter_list->GetCount(); ++i) { @@ -173,7 +173,7 @@ void DialogExport::OnProcess(wxCommandEvent &) { try { wxBusyCursor busy; c->ass->SetScriptInfo("Export Encoding", from_wx(charset_list->GetStringSelection())); - exporter->Export(from_wx(filename), from_wx(charset_list->GetStringSelection()), this); + exporter->Export(filename, from_wx(charset_list->GetStringSelection()), this); } catch (agi::UserCancelException const&) { } diff --git a/aegisub/src/dialog_style_manager.cpp b/aegisub/src/dialog_style_manager.cpp index a5e729359..dca7f8587 100644 --- a/aegisub/src/dialog_style_manager.cpp +++ b/aegisub/src/dialog_style_manager.cpp @@ -60,7 +60,6 @@ #include #include -#include #include #include #include @@ -561,16 +560,12 @@ void DialogStyleManager::OnCurrentDelete() { } void DialogStyleManager::OnCurrentImport() { - // Get file name - wxString path = to_wx(OPT_GET("Path/Last/Subtitles")->GetString()); - wxString filename = wxFileSelector(_("Open subtitles file"), path, "", "", to_wx(SubtitleFormat::GetWildcards(0)), wxFD_OPEN | wxFD_FILE_MUST_EXIST); - if (!filename) return; - - OPT_SET("Path/Last/Subtitles")->SetString(from_wx(wxFileName(filename).GetPath())); + auto filename = OpenFileSelector(_("Open subtitles file"), "Path/Last/Subtitles", "", "", SubtitleFormat::GetWildcards(0), this); + if (filename.empty()) return; AssFile temp; try { - temp.Load(from_wx(filename)); + temp.Load(filename); } catch (agi::Exception const& err) { wxMessageBox(to_wx(err.GetChainedMessage()), "Error", wxOK | wxICON_ERROR | wxCENTER, this); @@ -581,7 +576,7 @@ void DialogStyleManager::OnCurrentImport() { } // Get styles - std::vector styles = temp.GetStyles(); + auto styles = temp.GetStyles(); if (styles.empty()) { wxMessageBox(_("The selected file has no available styles."), _("Error Importing Styles")); return; diff --git a/aegisub/src/utils.cpp b/aegisub/src/utils.cpp index f9951c608..fbfefac47 100644 --- a/aegisub/src/utils.cpp +++ b/aegisub/src/utils.cpp @@ -51,7 +51,7 @@ #include #include -#include +#include #include #include @@ -281,3 +281,21 @@ void AddFullScreenButton(wxWindow *) { } void SetFloatOnParent(wxWindow *) { } #endif +agi::fs::path FileSelector(wxString const& message, std::string const& option_name, std::string const& default_filename, std::string const& default_extension, wxString const& wildcard, int flags, wxWindow *parent) { + wxString path; + if (!option_name.empty()) + path = to_wx(OPT_GET(option_name)->GetString()); + agi::fs::path filename = wxFileSelector(message, path, to_wx(default_filename), to_wx(default_extension), wildcard, flags, parent).wx_str(); + if (!filename.empty() && !option_name.empty()) + OPT_SET(option_name)->SetString(filename.parent_path().string()); + return filename; +} + +agi::fs::path OpenFileSelector(wxString const& message, std::string const& option_name, std::string const& default_filename, std::string const& default_extension, wxString const& wildcard, wxWindow *parent) { + return FileSelector(message, option_name, default_filename, default_extension, wildcard, wxFD_OPEN | wxFD_FILE_MUST_EXIST, parent); +} + +agi::fs::path SaveFileSelector(wxString const& message, std::string const& option_name, std::string const& default_filename, std::string const& default_extension, wxString const& wildcard, wxWindow *parent) { + return FileSelector(message, option_name, default_filename, default_extension, wildcard, wxFD_SAVE | wxFD_OVERWRITE_PROMPT, parent); +} +