mirror of
https://gitlab.com/mbunkus/mkvtoolnix.git
synced 2024-12-23 19:31:44 +00:00
Added parsing of mkvmerge's --capabilities output. Set some options depending on the capabilities.
This commit is contained in:
parent
84451bb7d9
commit
15ce684a73
224
src/mmg/mmg.cpp
224
src/mmg/mmg.cpp
@ -55,6 +55,7 @@ wxString mkvmerge_path;
|
||||
vector<wxString> last_settings;
|
||||
vector<wxString> last_chapters;
|
||||
vector<mmg_file_t> files;
|
||||
map<wxString, wxString, lt_wxString> capabilities;
|
||||
|
||||
wxString &
|
||||
break_line(wxString &line,
|
||||
@ -64,21 +65,22 @@ break_line(wxString &line,
|
||||
|
||||
for (i = 0, chars = 0; i < line.Length(); i++) {
|
||||
if (chars >= break_after) {
|
||||
if ((line[i] == ',') || (line[i] == '.') || (line[i] == '-')) {
|
||||
if ((line[i] == wxC(',')) || (line[i] == wxC('.')) ||
|
||||
(line[i] == wxC('-'))) {
|
||||
broken += line[i];
|
||||
broken += "\n";
|
||||
broken += wxS("\n");
|
||||
chars = 0;
|
||||
} else if (line[i] == ' ') {
|
||||
broken += "\n";
|
||||
} else if (line[i] == wxC(' ')) {
|
||||
broken += wxS("\n");
|
||||
chars = 0;
|
||||
} else if (line[i] == '(') {
|
||||
broken += "\n(";
|
||||
} else if (line[i] == wxC('(')) {
|
||||
broken += wxS("\n(");
|
||||
chars = 0;
|
||||
} else {
|
||||
broken += line[i];
|
||||
chars++;
|
||||
}
|
||||
} else if ((chars != 0) || (broken[i] != ' ')) {
|
||||
} else if ((chars != 0) || (broken[i] != wxC(' '))) {
|
||||
broken += line[i];
|
||||
chars++;
|
||||
}
|
||||
@ -93,11 +95,11 @@ extract_language_code(wxString source) {
|
||||
wxString copy;
|
||||
int pos;
|
||||
|
||||
if (source.Find("---") == 0)
|
||||
return "---";
|
||||
if (source.Find(wxS("---")) == 0)
|
||||
return wxS("---");
|
||||
|
||||
copy = source;
|
||||
if ((pos = copy.Find(" (")) >= 0)
|
||||
if ((pos = copy.Find(wxS(" ("))) >= 0)
|
||||
copy.Remove(pos);
|
||||
|
||||
return copy;
|
||||
@ -110,16 +112,16 @@ shell_escape(wxString source) {
|
||||
|
||||
for (i = 0; i < source.Length(); i++) {
|
||||
#if defined(SYS_UNIX) || defined(SYS_APPLE)
|
||||
if (source[i] == '"')
|
||||
escaped += "\\\"";
|
||||
else if (source[i] == '\\')
|
||||
escaped += "\\\\";
|
||||
if (source[i] == wxC('"'))
|
||||
escaped += wxS("\\\"");
|
||||
else if (source[i] == wxC('\\'))
|
||||
escaped += wxS("\\\\");
|
||||
#else
|
||||
if (source[i] == '"')
|
||||
if (source[i] == wxC('"'))
|
||||
;
|
||||
#endif
|
||||
else if ((source[i] == '\n') || (source[i] == '\r'))
|
||||
escaped += " ";
|
||||
else if ((source[i] == wxC('\n')) || (source[i] == wxC('\r')))
|
||||
escaped += wxS(" ");
|
||||
else
|
||||
escaped += source[i];
|
||||
}
|
||||
@ -133,8 +135,8 @@ no_cr(wxString source) {
|
||||
wxString escaped;
|
||||
|
||||
for (i = 0; i < source.Length(); i++) {
|
||||
if (source[i] == '\n')
|
||||
escaped += " ";
|
||||
if (source[i] == wxC('\n'))
|
||||
escaped += wxS(" ");
|
||||
else
|
||||
escaped += source[i];
|
||||
}
|
||||
@ -335,79 +337,80 @@ mmg_dialog::mmg_dialog(): wxFrame(NULL, -1, "mkvmerge GUI v" VERSION,
|
||||
mdlg = this;
|
||||
|
||||
file_menu = new wxMenu();
|
||||
file_menu->Append(ID_M_FILE_NEW, _T("&New\tCtrl-N"),
|
||||
_T("Start with empty settings"));
|
||||
file_menu->Append(ID_M_FILE_LOAD, _T("&Load settings\tCtrl-L"),
|
||||
_T("Load muxing settings from a file"));
|
||||
file_menu->Append(ID_M_FILE_SAVE, _T("&Save settings\tCtrl-S"),
|
||||
_T("Save muxing settings to a file"));
|
||||
file_menu->Append(ID_M_FILE_NEW, wxS("&New\tCtrl-N"),
|
||||
wxS("Start with empty settings"));
|
||||
file_menu->Append(ID_M_FILE_LOAD, wxS("&Load settings\tCtrl-L"),
|
||||
wxS("Load muxing settings from a file"));
|
||||
file_menu->Append(ID_M_FILE_SAVE, wxS("&Save settings\tCtrl-S"),
|
||||
wxS("Save muxing settings to a file"));
|
||||
file_menu->AppendSeparator();
|
||||
file_menu->Append(ID_M_FILE_SETOUTPUT, _T("Set &output file"),
|
||||
_T("Select the file you want to write to"));
|
||||
file_menu->Append(ID_M_FILE_SETOUTPUT, wxS("Set &output file"),
|
||||
wxS("Select the file you want to write to"));
|
||||
file_menu->AppendSeparator();
|
||||
file_menu->Append(ID_M_FILE_EXIT, _T("&Quit\tCtrl-Q"),
|
||||
_T("Quit the application"));
|
||||
file_menu->Append(ID_M_FILE_EXIT, wxS("&Quit\tCtrl-Q"),
|
||||
wxS("Quit the application"));
|
||||
|
||||
file_menu_sep = false;
|
||||
update_file_menu();
|
||||
|
||||
wxMenu *muxing_menu = new wxMenu();
|
||||
muxing_menu->Append(ID_M_MUXING_START,
|
||||
_T("Sta&rt muxing (run mkvmerge)\tCtrl-R"),
|
||||
_T("Run mkvmerge and start the muxing process"));
|
||||
wxS("Sta&rt muxing (run mkvmerge)\tCtrl-R"),
|
||||
wxS("Run mkvmerge and start the muxing process"));
|
||||
muxing_menu->Append(ID_M_MUXING_COPY_CMDLINE,
|
||||
_T("&Copy command line to clipboard"),
|
||||
_T("Copy the command line to the clipboard"));
|
||||
wxS("&Copy command line to clipboard"),
|
||||
wxS("Copy the command line to the clipboard"));
|
||||
muxing_menu->Append(ID_M_MUXING_SAVE_CMDLINE,
|
||||
_T("Sa&ve command line"),
|
||||
_T("Save the command line to a file"));
|
||||
wxS("Sa&ve command line"),
|
||||
wxS("Save the command line to a file"));
|
||||
muxing_menu->Append(ID_M_MUXING_CREATE_OPTIONFILE,
|
||||
_T("Create &option file"),
|
||||
_T("Save the command line to an option file "
|
||||
"that can be read by mkvmerge"));
|
||||
wxS("Create &option file"),
|
||||
wxS("Save the command line to an option file "
|
||||
"that can be read by mkvmerge"));
|
||||
|
||||
chapter_menu = new wxMenu();
|
||||
chapter_menu->Append(ID_M_CHAPTERS_NEW, _T("&New chapters"),
|
||||
_T("Create a new chapter file"));
|
||||
chapter_menu->Append(ID_M_CHAPTERS_LOAD, _T("&Load"),
|
||||
_T("Load a chapter file (simple/OGM format or XML "
|
||||
"format)"));
|
||||
chapter_menu->Append(ID_M_CHAPTERS_SAVE, _T("&Save"),
|
||||
_T("Save the current chapters to a XML file"));
|
||||
chapter_menu->Append(ID_M_CHAPTERS_SAVETOKAX, _T("Save to &Matroska file"),
|
||||
_T("Save the current chapters to an existing Matroska "
|
||||
"file"));
|
||||
chapter_menu->Append(ID_M_CHAPTERS_SAVEAS, _T("Save &as"),
|
||||
_T("Save the current chapters to a file with another "
|
||||
"name"));
|
||||
chapter_menu->Append(ID_M_CHAPTERS_NEW, wxS("&New chapters"),
|
||||
wxS("Create a new chapter file"));
|
||||
chapter_menu->Append(ID_M_CHAPTERS_LOAD, wxS("&Load"),
|
||||
wxS("Load a chapter file (simple/OGM format or XML "
|
||||
"format)"));
|
||||
chapter_menu->Append(ID_M_CHAPTERS_SAVE, wxS("&Save"),
|
||||
wxS("Save the current chapters to a XML file"));
|
||||
chapter_menu->Append(ID_M_CHAPTERS_SAVETOKAX, wxS("Save to &Matroska file"),
|
||||
wxS("Save the current chapters to an existing Matroska "
|
||||
"file"));
|
||||
chapter_menu->Append(ID_M_CHAPTERS_SAVEAS, wxS("Save &as"),
|
||||
wxS("Save the current chapters to a file with another "
|
||||
"name"));
|
||||
chapter_menu->AppendSeparator();
|
||||
chapter_menu->Append(ID_M_CHAPTERS_VERIFY, _T("&Verify"),
|
||||
_T("Verify the current chapter entries to see if there "
|
||||
"are any errors"));
|
||||
chapter_menu->Append(ID_M_CHAPTERS_VERIFY, wxS("&Verify"),
|
||||
wxS("Verify the current chapter entries to see if "
|
||||
"there are any errors"));
|
||||
chapter_menu->AppendSeparator();
|
||||
chapter_menu->Append(ID_M_CHAPTERS_SETDEFAULTS, _T("Set &default values"));
|
||||
chapter_menu->Append(ID_M_CHAPTERS_SETDEFAULTS, wxS("Set &default values"));
|
||||
chapter_menu_sep = false;
|
||||
update_chapter_menu();
|
||||
|
||||
wxMenu *window_menu = new wxMenu();
|
||||
window_menu->Append(ID_M_WINDOW_INPUT, _("&Input\tAlt-1"));
|
||||
window_menu->Append(ID_M_WINDOW_ATTACHMENTS, _("&Attachments\tAlt-2"));
|
||||
window_menu->Append(ID_M_WINDOW_GLOBAL, _("&Global options\tAlt-3"));
|
||||
window_menu->Append(ID_M_WINDOW_ADVANCED, _("A&dvanced\tAlt-4"));
|
||||
window_menu->Append(ID_M_WINDOW_SETTINGS, _("&Settings\tAlt-5"));
|
||||
window_menu->Append(ID_M_WINDOW_INPUT, wxS("&Input\tAlt-1"));
|
||||
window_menu->Append(ID_M_WINDOW_ATTACHMENTS, wxS("&Attachments\tAlt-2"));
|
||||
window_menu->Append(ID_M_WINDOW_GLOBAL, wxS("&Global options\tAlt-3"));
|
||||
window_menu->Append(ID_M_WINDOW_ADVANCED, wxS("A&dvanced\tAlt-4"));
|
||||
window_menu->Append(ID_M_WINDOW_SETTINGS, wxS("&Settings\tAlt-5"));
|
||||
window_menu->AppendSeparator();
|
||||
window_menu->Append(ID_M_WINDOW_CHAPTEREDITOR, _("&Chapter editor\tAlt-6"));
|
||||
window_menu->Append(ID_M_WINDOW_CHAPTEREDITOR,
|
||||
wxS("&Chapter editor\tAlt-6"));
|
||||
|
||||
wxMenu *help_menu = new wxMenu();
|
||||
help_menu->Append(ID_M_HELP_ABOUT, _T("&About\tF1"),
|
||||
_T("Show program information"));
|
||||
help_menu->Append(ID_M_HELP_ABOUT, wxS("&About\tF1"),
|
||||
wxS("Show program information"));
|
||||
|
||||
wxMenuBar *menu_bar = new wxMenuBar();
|
||||
menu_bar->Append(file_menu, _T("&File"));
|
||||
menu_bar->Append(muxing_menu, _T("&Muxing"));
|
||||
menu_bar->Append(chapter_menu, _T("&Chapter Editor"));
|
||||
menu_bar->Append(window_menu, _("&Window"));
|
||||
menu_bar->Append(help_menu, _T("&Help"));
|
||||
menu_bar->Append(file_menu, wxS("&File"));
|
||||
menu_bar->Append(muxing_menu, wxS("&Muxing"));
|
||||
menu_bar->Append(chapter_menu, wxS("&Chapter Editor"));
|
||||
menu_bar->Append(window_menu, wxS("&Window"));
|
||||
menu_bar->Append(help_menu, wxS("&Help"));
|
||||
SetMenuBar(menu_bar);
|
||||
|
||||
status_bar = new wxStatusBar(this, -1);
|
||||
@ -423,44 +426,44 @@ mmg_dialog::mmg_dialog(): wxFrame(NULL, -1, "mkvmerge GUI v" VERSION,
|
||||
notebook =
|
||||
new wxNotebook(panel, ID_NOTEBOOK, wxDefaultPosition, wxSize(500, 500),
|
||||
wxNB_TOP);
|
||||
settings_page = new tab_settings(notebook);
|
||||
input_page = new tab_input(notebook);
|
||||
attachments_page = new tab_attachments(notebook);
|
||||
global_page = new tab_global(notebook);
|
||||
advanced_page = new tab_advanced(notebook);
|
||||
settings_page = new tab_settings(notebook);
|
||||
chapter_editor_page = new tab_chapters(notebook, chapter_menu);
|
||||
|
||||
notebook->AddPage(input_page, _("Input"));
|
||||
notebook->AddPage(attachments_page, _("Attachments"));
|
||||
notebook->AddPage(global_page, _("Global"));
|
||||
notebook->AddPage(advanced_page, _("Advanced"));
|
||||
notebook->AddPage(settings_page, _("Settings"));
|
||||
notebook->AddPage(chapter_editor_page, _("Chapter Editor"));
|
||||
notebook->AddPage(input_page, wxS("Input"));
|
||||
notebook->AddPage(attachments_page, wxS("Attachments"));
|
||||
notebook->AddPage(global_page, wxS("Global"));
|
||||
notebook->AddPage(advanced_page, wxS("Advanced"));
|
||||
notebook->AddPage(settings_page, wxS("Settings"));
|
||||
notebook->AddPage(chapter_editor_page, wxS("Chapter Editor"));
|
||||
|
||||
bs_main->Add(notebook, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT, 5);
|
||||
|
||||
wxStaticBox *sb_low = new wxStaticBox(panel, -1, _("Output filename"));
|
||||
wxStaticBox *sb_low = new wxStaticBox(panel, -1, wxS("Output filename"));
|
||||
wxStaticBoxSizer *sbs_low = new wxStaticBoxSizer(sb_low, wxHORIZONTAL);
|
||||
bs_main->Add(sbs_low, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT, 5);
|
||||
|
||||
tc_output =
|
||||
new wxTextCtrl(panel, ID_TC_OUTPUT, _(""), wxDefaultPosition,
|
||||
new wxTextCtrl(panel, ID_TC_OUTPUT, wxS(""), wxDefaultPosition,
|
||||
wxSize(400, -1), 0);
|
||||
sbs_low->Add(tc_output, 0, wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT, 5);
|
||||
|
||||
b_browse_output =
|
||||
new wxButton(panel, ID_B_BROWSEOUTPUT, _("Browse"), wxDefaultPosition,
|
||||
new wxButton(panel, ID_B_BROWSEOUTPUT, wxS("Browse"), wxDefaultPosition,
|
||||
wxDefaultSize, 0);
|
||||
sbs_low->Add(b_browse_output, 0, wxALIGN_CENTER_VERTICAL | wxALL, 3);
|
||||
|
||||
sb_commandline =
|
||||
new wxStaticBox(panel, -1, _("Command line"));
|
||||
new wxStaticBox(panel, -1, wxS("Command line"));
|
||||
wxStaticBoxSizer *sbs_low2 =
|
||||
new wxStaticBoxSizer(sb_commandline, wxHORIZONTAL);
|
||||
bs_main->Add(sbs_low2, 0, wxALIGN_CENTER_HORIZONTAL | wxLEFT | wxRIGHT, 5);
|
||||
|
||||
tc_cmdline =
|
||||
new wxTextCtrl(panel, ID_TC_CMDLINE, _(""), wxDefaultPosition,
|
||||
new wxTextCtrl(panel, ID_TC_CMDLINE, wxS(""), wxDefaultPosition,
|
||||
wxSize(490, 50), wxTE_READONLY | wxTE_LINEWRAP |
|
||||
wxTE_MULTILINE);
|
||||
sbs_low2->Add(tc_cmdline, 0, wxALIGN_CENTER_VERTICAL | wxALL, 3);
|
||||
@ -468,12 +471,12 @@ mmg_dialog::mmg_dialog(): wxFrame(NULL, -1, "mkvmerge GUI v" VERSION,
|
||||
wxBoxSizer *bs_buttons = new wxBoxSizer(wxHORIZONTAL);
|
||||
|
||||
b_start_muxing =
|
||||
new wxButton(panel, ID_B_STARTMUXING, _("Sta&rt muxing"),
|
||||
new wxButton(panel, ID_B_STARTMUXING, wxS("Sta&rt muxing"),
|
||||
wxDefaultPosition, wxSize(130, -1));
|
||||
bs_buttons->Add(b_start_muxing, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 8);
|
||||
|
||||
b_copy_to_clipboard =
|
||||
new wxButton(panel, ID_B_COPYTOCLIPBOARD, _("&Copy to clipboard"),
|
||||
new wxButton(panel, ID_B_COPYTOCLIPBOARD, wxS("&Copy to clipboard"),
|
||||
wxDefaultPosition, wxSize(130, -1));
|
||||
bs_buttons->Add(10, 0);
|
||||
bs_buttons->Add(b_copy_to_clipboard, 0, wxALIGN_CENTER_HORIZONTAL | wxALL,
|
||||
@ -500,12 +503,12 @@ mmg_dialog::mmg_dialog(): wxFrame(NULL, -1, "mkvmerge GUI v" VERSION,
|
||||
"Error loading settings", wxOK | wxCENTER | wxICON_ERROR);
|
||||
else {
|
||||
#ifdef SYS_WINDOWS
|
||||
if ((file.Length() > 3) && (file.c_str()[1] != ':') &&
|
||||
(file.c_str()[0] != '\\'))
|
||||
file = wxGetCwd() + "\\" + file;
|
||||
if ((file.Length() > 3) && (file.c_str()[1] != wxC(':')) &&
|
||||
(file.c_str()[0] != wxC('\\')))
|
||||
file = wxGetCwd() + wxS("\\") + file;
|
||||
#else
|
||||
if ((file.Length() > 0) && (file.c_str()[0] != '/'))
|
||||
file = wxGetCwd() + "/" + file;
|
||||
if ((file.Length() > 0) && (file.c_str()[0] != wxC('/')))
|
||||
file = wxGetCwd() + wxS("/") + file;
|
||||
#endif
|
||||
load(file);
|
||||
}
|
||||
@ -516,8 +519,8 @@ void
|
||||
mmg_dialog::on_browse_output(wxCommandEvent &evt) {
|
||||
wxFileDialog dlg(NULL, "Choose an output file", last_open_dir,
|
||||
tc_output->GetValue().AfterLast(PSEP),
|
||||
_T("Matroska A/V files (*.mka;*.mkv)|*.mka;*.mkv|"
|
||||
ALLFILES), wxSAVE | wxOVERWRITE_PROMPT);
|
||||
wxS("Matroska A/V files (*.mka;*.mkv)|*.mka;*.mkv|"
|
||||
ALLFILES), wxSAVE | wxOVERWRITE_PROMPT);
|
||||
if(dlg.ShowModal() == wxID_OK) {
|
||||
last_open_dir = dlg.GetDirectory();
|
||||
tc_output->SetValue(dlg.GetPath());
|
||||
@ -566,7 +569,7 @@ mmg_dialog::on_file_new(wxCommandEvent &evt) {
|
||||
void
|
||||
mmg_dialog::on_file_load(wxCommandEvent &evt) {
|
||||
wxFileDialog dlg(NULL, "Choose an input file", last_open_dir, "",
|
||||
_T("mkvmerge GUI settings (*.mmg)|*.mmg|" ALLFILES),
|
||||
wxS("mkvmerge GUI settings (*.mmg)|*.mmg|" ALLFILES),
|
||||
wxOPEN);
|
||||
if(dlg.ShowModal() == wxID_OK) {
|
||||
if (!wxFileExists(dlg.GetPath()) || wxDirExists(dlg.GetPath())) {
|
||||
@ -611,7 +614,7 @@ mmg_dialog::load(wxString file_name) {
|
||||
void
|
||||
mmg_dialog::on_file_save(wxCommandEvent &evt) {
|
||||
wxFileDialog dlg(NULL, "Choose an output file", last_open_dir, "",
|
||||
_T("mkvmerge GUI settings (*.mmg)|*.mmg|" ALLFILES),
|
||||
wxS("mkvmerge GUI settings (*.mmg)|*.mmg|" ALLFILES),
|
||||
wxSAVE | wxOVERWRITE_PROMPT);
|
||||
if(dlg.ShowModal() == wxID_OK) {
|
||||
last_open_dir = dlg.GetDirectory();
|
||||
@ -709,8 +712,8 @@ mmg_dialog::on_run(wxCommandEvent &evt) {
|
||||
update_command_line();
|
||||
|
||||
if (tc_output->GetValue().Length() == 0) {
|
||||
wxMessageBox(_("You have not yet selected an output file."),
|
||||
_("mkvmerge GUI: error"), wxOK | wxCENTER | wxICON_ERROR);
|
||||
wxMessageBox(wxS("You have not yet selected an output file."),
|
||||
wxS("mkvmerge GUI: error"), wxOK | wxCENTER | wxICON_ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -734,19 +737,20 @@ mmg_dialog::on_run(wxCommandEvent &evt) {
|
||||
|
||||
void
|
||||
mmg_dialog::on_about(wxCommandEvent &evt) {
|
||||
wxMessageBox(_("mkvmerge GUI v" VERSION "\n"
|
||||
"This GUI was written by Moritz Bunkus <moritz@bunkus.org>\n"
|
||||
"Based on mmg by Florian Wagner <flo.wagner@gmx.de>\n"
|
||||
"mkvmerge GUI is licensed under the GPL.\n"
|
||||
"http://www.bunkus.org/videotools/mkvtoolnix/\n"
|
||||
"\n"
|
||||
"Help is available in form of tool tips and the HTML "
|
||||
"documentation\n"
|
||||
"for mkvmerge, mkvmerge.html. It can also be viewed online "
|
||||
"at\n"
|
||||
"http://www.bunkus.org/videotools/mkvtoolnix/doc/"
|
||||
"mkvmerge.html"),
|
||||
"About mkvmerge's GUI", wxOK | wxCENTER | wxICON_INFORMATION);
|
||||
wxMessageBox(wxS("mkvmerge GUI v" VERSION "\n"
|
||||
"This GUI was written by Moritz Bunkus <moritz@bunkus.org>"
|
||||
"\nBased on mmg by Florian Wagner <flo.wagner@gmx.de>\n"
|
||||
"mkvmerge GUI is licensed under the GPL.\n"
|
||||
"http://www.bunkus.org/videotools/mkvtoolnix/\n"
|
||||
"\n"
|
||||
"Help is available in form of tool tips and the HTML "
|
||||
"documentation\n"
|
||||
"for mkvmerge, mkvmerge.html. It can also be viewed online "
|
||||
"at\n"
|
||||
"http://www.bunkus.org/videotools/mkvtoolnix/doc/"
|
||||
"mkvmerge.html"),
|
||||
wxS("About mkvmerge's GUI"),
|
||||
wxOK | wxCENTER | wxICON_INFORMATION);
|
||||
}
|
||||
|
||||
void
|
||||
@ -1059,7 +1063,7 @@ mmg_dialog::update_command_line() {
|
||||
if (global_page->cob_chap_language->GetValue().Length() > 0) {
|
||||
clargs.Add("--chapter-language");
|
||||
clargs.Add(extract_language_code(global_page->
|
||||
cob_chap_language->GetValue()));
|
||||
cob_chap_language->GetValue()));
|
||||
}
|
||||
|
||||
if (global_page->cob_chap_charset->GetValue().Length() > 0) {
|
||||
@ -1272,7 +1276,8 @@ BEGIN_EVENT_TABLE(mmg_dialog, wxFrame)
|
||||
EVT_MENU(ID_M_WINDOW_CHAPTEREDITOR, mmg_dialog::on_window_selected)
|
||||
END_EVENT_TABLE();
|
||||
|
||||
bool mmg_app::OnInit() {
|
||||
bool
|
||||
mmg_app::OnInit() {
|
||||
wxConfigBase *cfg;
|
||||
uint32_t i;
|
||||
wxString k, v;
|
||||
@ -1305,7 +1310,8 @@ bool mmg_app::OnInit() {
|
||||
return true;
|
||||
}
|
||||
|
||||
int mmg_app::OnExit() {
|
||||
int
|
||||
mmg_app::OnExit() {
|
||||
wxString s;
|
||||
wxConfigBase *cfg;
|
||||
|
||||
|
@ -22,6 +22,7 @@
|
||||
#ifndef __MMG_H
|
||||
#define __MMG_H
|
||||
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
#include "os.h"
|
||||
@ -83,6 +84,11 @@ typedef struct {
|
||||
int style;
|
||||
} mmg_attachment_t;
|
||||
|
||||
struct lt_wxString {
|
||||
bool operator()(const wxString s1, const wxString s2) const {
|
||||
return s1.Cmp(s2) < 0;
|
||||
}
|
||||
};
|
||||
extern wxString last_open_dir;
|
||||
extern wxString mkvmerge_path;
|
||||
extern vector<wxString> last_settings;
|
||||
@ -92,6 +98,7 @@ extern vector<mmg_attachment_t> attachments;
|
||||
extern wxArrayString sorted_charsets;
|
||||
extern wxArrayString sorted_iso_codes;
|
||||
extern bool title_was_present;
|
||||
extern map<wxString, wxString, lt_wxString> capabilities;
|
||||
|
||||
wxString &break_line(wxString &line, int break_after = 80);
|
||||
wxString extract_language_code(wxString source);
|
||||
|
@ -50,68 +50,68 @@ tab_input::tab_input(wxWindow *parent):
|
||||
wxString language;
|
||||
wxArrayString popular_languages;
|
||||
|
||||
new wxStaticText(this, wxID_STATIC, _("Input files:"), wxPoint(5, 5),
|
||||
new wxStaticText(this, wxID_STATIC, wxS("Input files:"), wxPoint(5, 5),
|
||||
wxDefaultSize, 0);
|
||||
lb_input_files =
|
||||
new wxListBox(this, ID_LB_INPUTFILES, wxPoint(5, 24), wxSize(360, 60), 0);
|
||||
|
||||
b_add_file =
|
||||
new wxButton(this, ID_B_ADDFILE, _("add"), wxPoint(375, 24),
|
||||
new wxButton(this, ID_B_ADDFILE, wxS("add"), wxPoint(375, 24),
|
||||
wxSize(50, -1));
|
||||
b_remove_file =
|
||||
new wxButton(this, ID_B_REMOVEFILE, _("remove"), wxPoint(375, 56),
|
||||
new wxButton(this, ID_B_REMOVEFILE, wxS("remove"), wxPoint(375, 56),
|
||||
wxSize(50, -1));
|
||||
b_remove_file->Enable(false);
|
||||
b_file_up =
|
||||
new wxButton(this, ID_B_INPUTUP, _("up"), wxPoint(435, 24),
|
||||
new wxButton(this, ID_B_INPUTUP, wxS("up"), wxPoint(435, 24),
|
||||
wxSize(50, -1));
|
||||
b_file_up->Enable(false);
|
||||
b_file_down =
|
||||
new wxButton(this, ID_B_INPUTDOWN, _("down"), wxPoint(435, 56),
|
||||
new wxButton(this, ID_B_INPUTDOWN, wxS("down"), wxPoint(435, 56),
|
||||
wxSize(50, -1));
|
||||
b_file_down->Enable(false);
|
||||
|
||||
new wxStaticText(this, wxID_STATIC, _("File options:"), wxPoint(5, 90),
|
||||
new wxStaticText(this, wxID_STATIC, wxS("File options:"), wxPoint(5, 90),
|
||||
wxDefaultSize, 0);
|
||||
cb_no_chapters =
|
||||
new wxCheckBox(this, ID_CB_NOCHAPTERS, _("No chapters"),
|
||||
new wxCheckBox(this, ID_CB_NOCHAPTERS, wxS("No chapters"),
|
||||
wxPoint(90, 90 + YOFF2), wxDefaultSize, 0);
|
||||
cb_no_chapters->SetValue(false);
|
||||
cb_no_chapters->SetToolTip(_("Do not copy chapters from this file. Only "
|
||||
"applies to Matroska files."));
|
||||
cb_no_chapters->SetToolTip(wxS("Do not copy chapters from this file. Only "
|
||||
"applies to Matroska files."));
|
||||
cb_no_chapters->Enable(false);
|
||||
cb_no_attachments =
|
||||
new wxCheckBox(this, ID_CB_NOATTACHMENTS, _("No attachments"),
|
||||
new wxCheckBox(this, ID_CB_NOATTACHMENTS, wxS("No attachments"),
|
||||
wxPoint(195, 90 + YOFF2), wxDefaultSize, 0);
|
||||
cb_no_attachments->SetValue(false);
|
||||
cb_no_attachments->SetToolTip(_("Do not copy attachments from this file. "
|
||||
"Only applies to Matroska files."));
|
||||
cb_no_attachments->SetToolTip(wxS("Do not copy attachments from this file. "
|
||||
"Only applies to Matroska files."));
|
||||
cb_no_attachments->Enable(false);
|
||||
cb_no_tags =
|
||||
new wxCheckBox(this, ID_CB_NOTAGS, _("No tags"), wxPoint(315, 90 + YOFF2),
|
||||
wxDefaultSize, 0);
|
||||
new wxCheckBox(this, ID_CB_NOTAGS, wxS("No tags"),
|
||||
wxPoint(315, 90 + YOFF2), wxDefaultSize, 0);
|
||||
cb_no_tags->SetValue(false);
|
||||
cb_no_tags->SetToolTip(_("Do not copy tags from this file. Only "
|
||||
"applies to Matroska files."));
|
||||
cb_no_tags->SetToolTip(wxS("Do not copy tags from this file. Only "
|
||||
"applies to Matroska files."));
|
||||
cb_no_tags->Enable(false);
|
||||
|
||||
new wxStaticText(this, wxID_STATIC, _("Tracks:"), wxPoint(5, 110),
|
||||
new wxStaticText(this, wxID_STATIC, wxS("Tracks:"), wxPoint(5, 110),
|
||||
wxDefaultSize, 0);
|
||||
clb_tracks =
|
||||
new wxCheckListBox(this, ID_CLB_TRACKS, wxPoint(5, 130), wxSize(420, 100),
|
||||
0, NULL, 0);
|
||||
clb_tracks->Enable(false);
|
||||
b_track_up =
|
||||
new wxButton(this, ID_B_TRACKUP, _("up"), wxPoint(435, 130),
|
||||
new wxButton(this, ID_B_TRACKUP, wxS("up"), wxPoint(435, 130),
|
||||
wxSize(50, -1));
|
||||
b_track_up->Enable(false);
|
||||
b_track_down =
|
||||
new wxButton(this, ID_B_TRACKDOWN, _("down"), wxPoint(435, 162),
|
||||
new wxButton(this, ID_B_TRACKDOWN, wxS("down"), wxPoint(435, 162),
|
||||
wxSize(50, -1));
|
||||
b_track_down->Enable(false);
|
||||
new wxStaticText(this, wxID_STATIC, _("Track options:"), wxPoint(5, 235),
|
||||
new wxStaticText(this, wxID_STATIC, wxS("Track options:"), wxPoint(5, 235),
|
||||
wxDefaultSize, 0);
|
||||
new wxStaticText(this, wxID_STATIC, _("Language:"), wxPoint(5, 255),
|
||||
new wxStaticText(this, wxID_STATIC, wxS("Language:"), wxPoint(5, 255),
|
||||
wxDefaultSize, 0);
|
||||
|
||||
if (sorted_iso_codes.Count() == 0) {
|
||||
@ -149,62 +149,63 @@ tab_input::tab_input(wxWindow *parent):
|
||||
}
|
||||
|
||||
cob_language =
|
||||
new wxComboBox(this, ID_CB_LANGUAGE, _(""), wxPoint(90, 255 + YOFF),
|
||||
new wxComboBox(this, ID_CB_LANGUAGE, wxS(""), wxPoint(90, 255 + YOFF),
|
||||
wxSize(130, -1), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
|
||||
cob_language->SetToolTip(_("Language for this track. Select one of the "
|
||||
"ISO639-2 language codes."));
|
||||
cob_language->Append(_("none"));
|
||||
cob_language->SetToolTip(wxS("Language for this track. Select one of the "
|
||||
"ISO639-2 language codes."));
|
||||
cob_language->Append(wxS("none"));
|
||||
for (i = 0; i < sorted_iso_codes.Count(); i++)
|
||||
cob_language->Append(sorted_iso_codes[i]);
|
||||
|
||||
new wxStaticText(this, wxID_STATIC, _("Delay (in ms):"),
|
||||
new wxStaticText(this, wxID_STATIC, wxS("Delay (in ms):"),
|
||||
wxPoint(255, 255), wxDefaultSize, 0);
|
||||
tc_delay =
|
||||
new wxTextCtrl(this, ID_TC_DELAY, _(""), wxPoint(355, 255 + YOFF),
|
||||
new wxTextCtrl(this, ID_TC_DELAY, wxS(""), wxPoint(355, 255 + YOFF),
|
||||
wxSize(130, -1), 0);
|
||||
tc_delay->SetToolTip(_("Delay this track by a couple of ms. Can be "
|
||||
"negative. Only applies to audio and subtitle tracks."
|
||||
" Some audio formats cannot be delayed at the "
|
||||
"moment."));
|
||||
new wxStaticText(this, wxID_STATIC, _("Track name:"), wxPoint(5, 280),
|
||||
tc_delay->SetToolTip(wxS("Delay this track by a couple of ms. Can be "
|
||||
"negative. Only applies to audio and subtitle "
|
||||
"tracks. Some audio formats cannot be delayed at "
|
||||
"the moment."));
|
||||
new wxStaticText(this, wxID_STATIC, wxS("Track name:"), wxPoint(5, 280),
|
||||
wxDefaultSize, 0);
|
||||
tc_track_name =
|
||||
new wxTextCtrl(this, ID_TC_TRACKNAME, _(""), wxPoint(90, 280 + YOFF),
|
||||
new wxTextCtrl(this, ID_TC_TRACKNAME, wxS(""), wxPoint(90, 280 + YOFF),
|
||||
wxSize(130, -1), 0);
|
||||
tc_track_name->SetToolTip(_("Name for this track, e.g. \"director's "
|
||||
"comments\"."));
|
||||
new wxStaticText(this, wxID_STATIC, _("Stretch by:"), wxPoint(255, 280),
|
||||
tc_track_name->SetToolTip(wxS("Name for this track, e.g. \"director's "
|
||||
"comments\"."));
|
||||
new wxStaticText(this, wxID_STATIC, wxS("Stretch by:"), wxPoint(255, 280),
|
||||
wxDefaultSize, 0);
|
||||
tc_stretch =
|
||||
new wxTextCtrl(this, ID_TC_STRETCH, _(""), wxPoint(355, 280 + YOFF),
|
||||
new wxTextCtrl(this, ID_TC_STRETCH, wxS(""), wxPoint(355, 280 + YOFF),
|
||||
wxSize(130, -1), 0);
|
||||
tc_stretch->SetToolTip(_("Stretch the audio or subtitle track by a factor. "
|
||||
"This should be a positive floating point number. "
|
||||
"Not all formats can be stretched at the moment."));
|
||||
new wxStaticText(this, wxID_STATIC, _("Cues:"), wxPoint(5, 305),
|
||||
tc_stretch->SetToolTip(wxS("Stretch the audio or subtitle track by a "
|
||||
"factor. This should be a positive floating "
|
||||
"point number. Not all formats can be stretched "
|
||||
"at the moment."));
|
||||
new wxStaticText(this, wxID_STATIC, wxS("Cues:"), wxPoint(5, 305),
|
||||
wxDefaultSize, 0);
|
||||
|
||||
cob_cues =
|
||||
new wxComboBox(this, ID_CB_CUES, _(""), wxPoint(90, 305 + YOFF),
|
||||
new wxComboBox(this, ID_CB_CUES, wxS(""), wxPoint(90, 305 + YOFF),
|
||||
wxSize(130, -1), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
|
||||
cob_cues->SetToolTip(_("Selects for which blocks mkvmerge will produce "
|
||||
"index entries ( = cue entries). \"default\" is a "
|
||||
"good choice for almost all situations."));
|
||||
cob_cues->Append(_("default"));
|
||||
cob_cues->Append(_("only for I frames"));
|
||||
cob_cues->Append(_("for all frames"));
|
||||
cob_cues->Append(_("none"));
|
||||
new wxStaticText(this, wxID_STATIC, _("Subtitle charset:"),
|
||||
cob_cues->SetToolTip(wxS("Selects for which blocks mkvmerge will produce "
|
||||
"index entries ( = cue entries). \"default\" is a "
|
||||
"good choice for almost all situations."));
|
||||
cob_cues->Append(wxS("default"));
|
||||
cob_cues->Append(wxS("only for I frames"));
|
||||
cob_cues->Append(wxS("for all frames"));
|
||||
cob_cues->Append(wxS("none"));
|
||||
new wxStaticText(this, wxID_STATIC, wxS("Subtitle charset:"),
|
||||
wxPoint(255, 305 + YOFF), wxDefaultSize, 0);
|
||||
cob_sub_charset =
|
||||
new wxComboBox(this, ID_CB_SUBTITLECHARSET, _(""),
|
||||
new wxComboBox(this, ID_CB_SUBTITLECHARSET, wxS(""),
|
||||
wxPoint(355, 305 + YOFF), wxSize(130, -1), 0, NULL,
|
||||
wxCB_DROPDOWN | wxCB_READONLY);
|
||||
cob_sub_charset->SetToolTip(_("Selects the character set a subtitle file "
|
||||
"was written with. Only needed for non-UTF "
|
||||
"files that mkvmerge does not detect "
|
||||
"correctly."));
|
||||
cob_sub_charset->Append(_("default"));
|
||||
cob_sub_charset->SetToolTip(wxS("Selects the character set a subtitle file "
|
||||
"was written with. Only needed for non-UTF "
|
||||
"files that mkvmerge does not detect "
|
||||
"correctly."));
|
||||
cob_sub_charset->Append(wxS("default"));
|
||||
|
||||
if (sorted_charsets.Count() == 0) {
|
||||
for (i = 0; sub_charsets[i] != NULL; i++)
|
||||
@ -215,42 +216,46 @@ tab_input::tab_input(wxWindow *parent):
|
||||
for (i = 0; i < sorted_charsets.Count(); i++)
|
||||
cob_sub_charset->Append(sorted_charsets[i]);
|
||||
|
||||
new wxStaticText(this, -1, _("FourCC:"), wxPoint(5, 330),
|
||||
new wxStaticText(this, -1, wxS("FourCC:"), wxPoint(5, 330),
|
||||
wxDefaultSize, 0);
|
||||
cob_fourcc =
|
||||
new wxComboBox(this, ID_CB_FOURCC, _(""), wxPoint(90, 330 + YOFF),
|
||||
new wxComboBox(this, ID_CB_FOURCC, wxS(""), wxPoint(90, 330 + YOFF),
|
||||
wxSize(130, -1), 0, NULL, wxCB_DROPDOWN);
|
||||
cob_fourcc->Append("");
|
||||
cob_fourcc->Append("DIVX");
|
||||
cob_fourcc->Append("DIV3");
|
||||
cob_fourcc->Append("DX50");
|
||||
cob_fourcc->Append("XVID");
|
||||
cob_fourcc->SetToolTip(_T("Forces the FourCC of the video track to this "
|
||||
"value. Note that this only works for video "
|
||||
"tracks that use the AVI compatibility mode "
|
||||
"or for QuickTime video tracks. This option "
|
||||
"CANNOT be used to change Matroska's CodecID."));
|
||||
cob_fourcc->SetToolTip(wxS("Forces the FourCC of the video track to this "
|
||||
"value. Note that this only works for video "
|
||||
"tracks that use the AVI compatibility mode "
|
||||
"or for QuickTime video tracks. This option "
|
||||
"CANNOT be used to change Matroska's CodecID."));
|
||||
|
||||
new wxStaticText(this, -1, _("Compression:"), wxPoint(255, 330),
|
||||
new wxStaticText(this, -1, wxS("Compression:"), wxPoint(255, 330),
|
||||
wxDefaultSize, 0);
|
||||
cob_compression =
|
||||
new wxComboBox(this, ID_CB_COMPRESSION, _(""), wxPoint(355, 330 + YOFF),
|
||||
new wxComboBox(this, ID_CB_COMPRESSION, wxS(""), wxPoint(355, 330 + YOFF),
|
||||
wxSize(130, -1), 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
|
||||
cob_compression->Append("");
|
||||
cob_compression->Append("none");
|
||||
cob_compression->Append("zlib");
|
||||
cob_compression->SetToolTip(_T("Sets the compression used for VobSub "
|
||||
"subtitles. If nothing is chosen then the "
|
||||
"VobSubs will be automatically compressed "
|
||||
"with zlib. 'none' results is files that "
|
||||
"are a lot larger."));
|
||||
if (capabilities[wxS("BZ2")] == wxS("true"))
|
||||
cob_compression->Append("bz2");
|
||||
if (capabilities[wxS("LZO")] == wxS("true"))
|
||||
cob_compression->Append("lzo");
|
||||
cob_compression->SetToolTip(wxS("Sets the compression used for VobSub "
|
||||
"subtitles. If nothing is chosen then the "
|
||||
"VobSubs will be automatically compressed "
|
||||
"with zlib. 'none' results is files that "
|
||||
"are a lot larger."));
|
||||
|
||||
rb_aspect_ratio =
|
||||
new wxRadioButton(this, ID_RB_ASPECTRATIO, _("Aspect ratio:"),
|
||||
new wxRadioButton(this, ID_RB_ASPECTRATIO, wxS("Aspect ratio:"),
|
||||
wxPoint(5, 355), wxDefaultSize, wxRB_GROUP);
|
||||
rb_aspect_ratio->SetValue(true);
|
||||
cob_aspect_ratio =
|
||||
new wxComboBox(this, ID_CB_ASPECTRATIO, _(""), wxPoint(110, 355 + YOFF),
|
||||
new wxComboBox(this, ID_CB_ASPECTRATIO, wxS(""), wxPoint(110, 355 + YOFF),
|
||||
wxSize(110, -1), 0, NULL, wxCB_DROPDOWN);
|
||||
cob_aspect_ratio->Append("");
|
||||
cob_aspect_ratio->Append("4/3");
|
||||
@ -260,72 +265,73 @@ tab_input::tab_input(wxWindow *parent):
|
||||
cob_aspect_ratio->Append("2.00");
|
||||
cob_aspect_ratio->Append("2.21");
|
||||
cob_aspect_ratio->Append("2.35");
|
||||
cob_aspect_ratio->SetToolTip(_T("Sets the display aspect ratio of the track."
|
||||
" The format can be either 'a/b' in which "
|
||||
"case both numbers must be integer (e.g. "
|
||||
"16/9) or just a single floting point "
|
||||
"number 'f' (e.g. 2.35)."));
|
||||
cob_aspect_ratio->SetToolTip(wxS("Sets the display aspect ratio of the "
|
||||
"track. The format can be either 'a/b' in "
|
||||
"which case both numbers must be integer "
|
||||
"(e.g. 16/9) or just a single floting "
|
||||
"point number 'f' (e.g. 2.35)."));
|
||||
|
||||
new wxStaticText(this, wxID_STATIC, _("or"), wxPoint(220, 360),
|
||||
new wxStaticText(this, wxID_STATIC, wxS("or"), wxPoint(220, 360),
|
||||
wxSize(35, -1), wxALIGN_CENTER);
|
||||
|
||||
rb_display_dimensions =
|
||||
new wxRadioButton(this, ID_RB_DISPLAYDIMENSIONS,
|
||||
_("Display width/height:"), wxPoint(255, 355),
|
||||
wxS("Display width/height:"), wxPoint(255, 355),
|
||||
wxDefaultSize);
|
||||
rb_display_dimensions->SetValue(false);
|
||||
tc_display_width =
|
||||
new wxTextCtrl(this, ID_TC_DISPLAYWIDTH, "", wxPoint(405, 355 + YOFF),
|
||||
wxSize(35, -1));
|
||||
tc_display_width->SetToolTip(_T("Sets the display width of the track."
|
||||
"The height must be set as well, or this "
|
||||
"field will be ignored."));
|
||||
tc_display_width->SetToolTip(wxS("Sets the display width of the track."
|
||||
"The height must be set as well, or this "
|
||||
"field will be ignored."));
|
||||
new wxStaticText(this, wxID_STATIC, "x", wxPoint(440, 360),
|
||||
wxSize(10, -1), wxALIGN_CENTER);
|
||||
tc_display_height =
|
||||
new wxTextCtrl(this, ID_TC_DISPLAYHEIGHT, "", wxPoint(450, 355 + YOFF),
|
||||
wxSize(35, -1));
|
||||
tc_display_height->SetToolTip(_T("Sets the display height of the track."
|
||||
"The width must be set as well, or this "
|
||||
"field will be ignored."));
|
||||
tc_display_height->SetToolTip(wxS("Sets the display height of the track."
|
||||
"The width must be set as well, or this "
|
||||
"field will be ignored."));
|
||||
|
||||
cb_default =
|
||||
new wxCheckBox(this, ID_CB_MAKEDEFAULT, _("Make default track"),
|
||||
new wxCheckBox(this, ID_CB_MAKEDEFAULT, wxS("Make default track"),
|
||||
wxPoint(5, 380), wxSize(200, -1), 0);
|
||||
cb_default->SetValue(false);
|
||||
cb_default->SetToolTip(_("Make this track the default track for its type "
|
||||
"(audio, video, subtitles). Players should prefer "
|
||||
"tracks with the default track flag set."));
|
||||
cb_default->SetToolTip(wxS("Make this track the default track for its type "
|
||||
"(audio, video, subtitles). Players should "
|
||||
"prefer tracks with the default track flag "
|
||||
"set."));
|
||||
cb_aac_is_sbr =
|
||||
new wxCheckBox(this, ID_CB_AACISSBR, _("AAC is SBR/HE-AAC/AAC+"),
|
||||
new wxCheckBox(this, ID_CB_AACISSBR, wxS("AAC is SBR/HE-AAC/AAC+"),
|
||||
wxPoint(255, 380), wxSize(200, -1), 0);
|
||||
cb_aac_is_sbr->SetValue(false);
|
||||
cb_aac_is_sbr->SetToolTip(_("This track contains SBR AAC/HE-AAC/AAC+ data. "
|
||||
"Only needed for AAC input files, because SBR "
|
||||
"AAC cannot be detected automatically for "
|
||||
"these files. Not needed for AAC tracks read "
|
||||
"from MP4 or Matroska files."));
|
||||
cb_aac_is_sbr->SetToolTip(wxS("This track contains SBR AAC/HE-AAC/AAC+ data."
|
||||
" Only needed for AAC input files, because SBR"
|
||||
" AAC cannot be detected automatically for "
|
||||
"these files. Not needed for AAC tracks read "
|
||||
"from MP4 or Matroska files."));
|
||||
|
||||
new wxStaticText(this, wxID_STATIC, _("Tags:"), wxPoint(5, 405),
|
||||
new wxStaticText(this, wxID_STATIC, wxS("Tags:"), wxPoint(5, 405),
|
||||
wxDefaultSize, 0);
|
||||
tc_tags =
|
||||
new wxTextCtrl(this, ID_TC_TAGS, _(""), wxPoint(90, 405 + YOFF),
|
||||
new wxTextCtrl(this, ID_TC_TAGS, wxS(""), wxPoint(90, 405 + YOFF),
|
||||
wxSize(280, -1));
|
||||
b_browse_tags =
|
||||
new wxButton(this, ID_B_BROWSETAGS, _("Browse"), wxPoint(390, 405 + YOFF),
|
||||
wxDefaultSize, 0);
|
||||
new wxButton(this, ID_B_BROWSETAGS, wxS("Browse"),
|
||||
wxPoint(390, 405 + YOFF), wxDefaultSize, 0);
|
||||
|
||||
new wxStaticText(this, wxID_STATIC, _("Timecodes:"), wxPoint(5, 430),
|
||||
new wxStaticText(this, wxID_STATIC, wxS("Timecodes:"), wxPoint(5, 430),
|
||||
wxDefaultSize, 0);
|
||||
tc_timecodes =
|
||||
new wxTextCtrl(this, ID_TC_TIMECODES, _(""), wxPoint(90, 430 + YOFF),
|
||||
new wxTextCtrl(this, ID_TC_TIMECODES, wxS(""), wxPoint(90, 430 + YOFF),
|
||||
wxSize(280, -1));
|
||||
tc_timecodes->SetToolTip("mkvmerge can read and use timecodes from an "
|
||||
"external text file. This feature is a very "
|
||||
"advanced feature. Almost all users should leave "
|
||||
"this entry empty.");
|
||||
b_browse_timecodes =
|
||||
new wxButton(this, ID_B_BROWSE_TIMECODES, _("Browse"),
|
||||
new wxButton(this, ID_B_BROWSE_TIMECODES, wxS("Browse"),
|
||||
wxPoint(390, 430 + YOFF), wxDefaultSize, 0);
|
||||
b_browse_timecodes->SetToolTip("mkvmerge can read and use timecodes from an "
|
||||
"external text file. This feature is a very "
|
||||
@ -445,44 +451,46 @@ void tab_input::enable_ar_controls(mmg_track_t *track) {
|
||||
|
||||
void tab_input::on_add_file(wxCommandEvent &evt) {
|
||||
mmg_file_t file;
|
||||
wxString file_name, name, command, id, type, exact;
|
||||
wxString file_name, name, command, id, type, exact, media_files;
|
||||
wxArrayString output, errors;
|
||||
vector<wxString> args, pair;
|
||||
int result, pos;
|
||||
unsigned int i, k;
|
||||
|
||||
media_files = wxS("Media files (*.aac;*.ac3;*.ass;*.avi;*.dts;");
|
||||
if (capabilities[wxS("FLAC")] == wxS("true"))
|
||||
media_files += wxS("*.flac;*.idx;");
|
||||
media_files += wxS("*.m4a;*.mp2;*.mp3;*.mka;"
|
||||
"*.mkv;*.mov;*.mp4;*.ogm;*.ogg;"
|
||||
"*.ra;*.ram;*.rm;*.rmvb;*.rv;"
|
||||
"*.srt;*.ssa;"
|
||||
"*.wav)|"
|
||||
"*.aac;*.ac3;*.ass;*.avi;*.dts;*.flac;"
|
||||
"*.idx;*.mp2;*.mp3;*.mka;"
|
||||
"*.mkv;*.mov;"
|
||||
"*.mp4;*.ogm;*.ogg;"
|
||||
"*.ra;*.ram;*.rm;*.rmvb;*.rv;"
|
||||
"*.srt;*.ssa;*.wav|"
|
||||
"AAC (Advanced Audio Coding) (*.aac;*.m4a;*.mp4)|"
|
||||
"*.aac;*.m4a;*.mp4|"
|
||||
"A/52 (aka AC3) (*.ac3)|*.ac3|"
|
||||
"AVI (Audio/Video Interleaved) (*.avi)|*.avi|"
|
||||
"DTS (Digital Theater System) (*.dts)|*.dts|");
|
||||
if (capabilities[wxS("FLAC")] == wxS("true"))
|
||||
media_files += wxS("FLAC (Free Lossless Audio Codec) (*.flac;*.ogg)|"
|
||||
"*.flac;*.ogg|");
|
||||
media_files += wxS("MPEG audio files (*.mp2;*.mp3)|*.mp2;*.mp3|"
|
||||
"Matroska A/V files (*.mka;*.mkv)|*.mka;*.mkv|"
|
||||
"QuickTime/MP4 A/V (*.mov;*.mp4)|*.mov;*.mp4|"
|
||||
"Audio/Video embedded in OGG (*.ogg;*.ogm)|*.ogg;*.ogm|"
|
||||
"RealMedia Files (*.ra;*.ram;*.rm;*.rmvb;*.rv)|"
|
||||
"*.ra;*.ram;*.rm;*.rmvb;*.rv|"
|
||||
"SRT text subtitles (*.srt)|*.srt|"
|
||||
"SSA/ASS text subtitles (*.ssa;*.ass)|*.ssa;*.ass|"
|
||||
"VobSub subtitles (*.idx)|*.idx|"
|
||||
"WAVE (uncompressed PCM) (*.wav)|*.wav|" ALLFILES);
|
||||
wxFileDialog dlg(NULL, "Choose an input file", last_open_dir, "",
|
||||
_T("Media files (*.aac;*.ac3;*.ass;*.avi;*.dts;"
|
||||
"*.flac;*.idx;"
|
||||
"*.m4a;*.mp2;*.mp3;*.mka;"
|
||||
"*.mkv;*.mov;*.mp4;*.ogm;*.ogg;"
|
||||
"*.ra;*.ram;*.rm;*.rmvb;*.rv;"
|
||||
"*.srt;*.ssa;"
|
||||
"*.wav)|"
|
||||
"*.aac;*.ac3;*.ass;*.avi;*.dts;*.flac;"
|
||||
"*.idx;*.mp2;*.mp3;*.mka;"
|
||||
"*.mkv;*.mov;"
|
||||
"*.mp4;*.ogm;*.ogg;"
|
||||
"*.ra;*.ram;*.rm;*.rmvb;*.rv;"
|
||||
"*.srt;*.ssa;*.wav|"
|
||||
"AAC (Advanced Audio Coding) (*.aac;*.m4a;*.mp4)|"
|
||||
"*.aac;*.m4a;*.mp4|"
|
||||
"A/52 (aka AC3) (*.ac3)|*.ac3|"
|
||||
"AVI (Audio/Video Interleaved) (*.avi)|*.avi|"
|
||||
"DTS (Digital Theater System) (*.dts)|*.dts|"
|
||||
"FLAC (Free Lossless Audio Codec) (*.flac;*.ogg)|*.flac;"
|
||||
"*.ogg|"
|
||||
"MPEG audio files (*.mp2;*.mp3)|*.mp2;*.mp3|"
|
||||
"Matroska A/V files (*.mka;*.mkv)|*.mka;*.mkv|"
|
||||
"QuickTime/MP4 A/V (*.mov;*.mp4)|*.mov;*.mp4|"
|
||||
"Audio/Video embedded in OGG (*.ogg;*.ogm)|*.ogg;*.ogm|"
|
||||
"RealMedia Files (*.ra;*.ram;*.rm;*.rmvb;*.rv)|"
|
||||
"*.ra;*.ram;*.rm;*.rmvb;*.rv|"
|
||||
"SRT text subtitles (*.srt)|*.srt|"
|
||||
"SSA/ASS text subtitles (*.ssa;*.ass)|*.ssa;*.ass|"
|
||||
"VobSub subtitles (*.idx)|*.idx|"
|
||||
"WAVE (uncompressed PCM) (*.wav)|*.wav|" ALLFILES),
|
||||
wxOPEN);
|
||||
media_files, wxOPEN);
|
||||
|
||||
if(dlg.ShowModal() == wxID_OK) {
|
||||
last_open_dir = dlg.GetDirectory();
|
||||
@ -955,7 +963,7 @@ void tab_input::on_browse_tags(wxCommandEvent &evt) {
|
||||
return;
|
||||
|
||||
wxFileDialog dlg(NULL, "Choose a tag file", last_open_dir, "",
|
||||
_T("Tag files (*.xml;*.txt)|*.xml;*.txt|" ALLFILES),
|
||||
wxS("Tag files (*.xml;*.txt)|*.xml;*.txt|" ALLFILES),
|
||||
wxOPEN);
|
||||
if(dlg.ShowModal() == wxID_OK) {
|
||||
last_open_dir = dlg.GetDirectory();
|
||||
@ -969,7 +977,7 @@ void tab_input::on_browse_timecodes_clicked(wxCommandEvent &evt) {
|
||||
return;
|
||||
|
||||
wxFileDialog dlg(NULL, "Choose a timecodes file", last_open_dir, "",
|
||||
_T("Tag files (*.txt)|*.txt|" ALLFILES), wxOPEN);
|
||||
wxS("Tag files (*.txt)|*.txt|" ALLFILES), wxOPEN);
|
||||
if(dlg.ShowModal() == wxID_OK) {
|
||||
last_open_dir = dlg.GetDirectory();
|
||||
*(*files[selected_file].tracks)[selected_track].timecodes = dlg.GetPath();
|
||||
@ -1308,9 +1316,10 @@ bool tab_input::validate_settings() {
|
||||
s = t->delay->c_str();
|
||||
strip(s);
|
||||
if ((s.length() > 0) && !parse_int(s.c_str(), dummy_i)) {
|
||||
wxMessageBox(_("The delay setting for track nr. " + sid + " in "
|
||||
"file '" + *f->file_name + "' is invalid."),
|
||||
_("mkvmerge GUI: error"), wxOK | wxCENTER | wxICON_ERROR);
|
||||
wxMessageBox(wxS("The delay setting for track nr. " + sid + " in "
|
||||
"file '" + *f->file_name + "' is invalid."),
|
||||
wxS("mkvmerge GUI: error"),
|
||||
wxOK | wxCENTER | wxICON_ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -1326,10 +1335,10 @@ bool tab_input::validate_settings() {
|
||||
dot_present = true;
|
||||
i++;
|
||||
} else {
|
||||
wxMessageBox(_("The stretch setting for track nr. " + sid + " in "
|
||||
"file '" + *f->file_name + "' is invalid."),
|
||||
_("mkvmerge GUI: error"), wxOK | wxCENTER |
|
||||
wxICON_ERROR);
|
||||
wxMessageBox(wxS("The stretch setting for track nr. ") + sid +
|
||||
wxS(" in file '") + *f->file_name +
|
||||
wxS("' is invalid."), wxS("mkvmerge GUI: error"),
|
||||
wxOK | wxCENTER | wxICON_ERROR);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -1338,10 +1347,11 @@ bool tab_input::validate_settings() {
|
||||
s = t->fourcc->c_str();
|
||||
strip(s);
|
||||
if ((s.length() > 0) && (s.length() != 4)) {
|
||||
wxMessageBox(_("The FourCC setting for track nr. " + sid + " in "
|
||||
"file '" + *f->file_name + "' is not excatly four "
|
||||
"characters long."),
|
||||
_("mkvmerge GUI: error"), wxOK | wxCENTER | wxICON_ERROR);
|
||||
wxMessageBox(wxS("The FourCC setting for track nr. ") + sid +
|
||||
wxS(" in file '") + *f->file_name +
|
||||
wxS("' is not excatly four characters long."),
|
||||
wxS("mkvmerge GUI: error"),
|
||||
wxOK | wxCENTER | wxICON_ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -1381,9 +1391,9 @@ bool tab_input::validate_settings() {
|
||||
}
|
||||
|
||||
if (!ok) {
|
||||
wxMessageBox(_("The aspect ratio setting for track nr. " + sid +
|
||||
" in file '" + *f->file_name + "' is invalid."),
|
||||
_("mkvmerge GUI: error"), wxOK | wxCENTER |
|
||||
wxMessageBox(wxS("The aspect ratio setting for track nr. " + sid +
|
||||
" in file '" + *f->file_name + "' is invalid."),
|
||||
wxS("mkvmerge GUI: error"), wxOK | wxCENTER |
|
||||
wxICON_ERROR);
|
||||
return false;
|
||||
}
|
||||
@ -1392,9 +1402,9 @@ bool tab_input::validate_settings() {
|
||||
}
|
||||
|
||||
if (!tracks_selected) {
|
||||
wxMessageBox(_("You have not yet selected any input file and/or no "
|
||||
"tracks."),
|
||||
_("mkvmerge GUI: error"), wxOK | wxCENTER | wxICON_ERROR);
|
||||
wxMessageBox(wxS("You have not yet selected any input file and/or no "
|
||||
"tracks."),
|
||||
wxS("mkvmerge GUI: error"), wxOK | wxCENTER | wxICON_ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -35,76 +35,106 @@
|
||||
tab_settings::tab_settings(wxWindow *parent):
|
||||
wxPanel(parent, -1, wxDefaultPosition, wxSize(100, 400),
|
||||
wxTAB_TRAVERSAL) {
|
||||
new wxStaticBox(this, -1, _("mkvmrge executable"), wxPoint(10, 5),
|
||||
new wxStaticBox(this, -1, wxS("mkvmrge executable"), wxPoint(10, 5),
|
||||
wxSize(475, 50));
|
||||
tc_mkvmerge =
|
||||
new wxTextCtrl(this, ID_TC_MKVMERGE, _(""), wxPoint(15, 25),
|
||||
new wxTextCtrl(this, ID_TC_MKVMERGE, wxS(""), wxPoint(15, 25),
|
||||
wxSize(370, -1), wxTE_READONLY);
|
||||
|
||||
new wxButton(this, ID_B_BROWSEMKVMERGE, _("Browse"), wxPoint(395, 25),
|
||||
new wxButton(this, ID_B_BROWSEMKVMERGE, wxS("Browse"), wxPoint(395, 25),
|
||||
wxDefaultSize, 0);
|
||||
|
||||
new wxStaticBox(this, -1, _("About"), wxPoint(10, 350),
|
||||
new wxStaticBox(this, -1, wxS("About"), wxPoint(10, 350),
|
||||
wxSize(475, 104));
|
||||
new wxStaticBitmap(this, -1, wxBitmap(matroskalogo_big_xpm),
|
||||
wxPoint(20, 370), wxSize(64,64));
|
||||
new wxStaticText(this, wxID_STATIC,
|
||||
_("mkvmerge GUI v" VERSION "\n"
|
||||
"This GUI was written by Moritz Bunkus <moritz@"
|
||||
"bunkus.org>\n"
|
||||
"Based on mmg by Florian Wagner <flo.wagner@gmx.de>\n"
|
||||
"mkvmerge GUI is licensed under the GPL.\n"
|
||||
"http://www.bunkus.org/videotools/mkvtoolnix/"),
|
||||
wxS("mkvmerge GUI v" VERSION "\n"
|
||||
"This GUI was written by Moritz Bunkus <moritz@"
|
||||
"bunkus.org>\n"
|
||||
"Based on mmg by Florian Wagner <flo.wagner@gmx.de>\n"
|
||||
"mkvmerge GUI is licensed under the GPL.\n"
|
||||
"http://www.bunkus.org/videotools/mkvtoolnix/"),
|
||||
wxPoint(95, 360), wxDefaultSize, 0);
|
||||
|
||||
load_preferences();
|
||||
}
|
||||
|
||||
tab_settings::~tab_settings() {
|
||||
// delete wxConfigBase::Get();
|
||||
}
|
||||
|
||||
void tab_settings::on_browse(wxCommandEvent &evt) {
|
||||
wxFileDialog dlg(NULL, "Choose the mkvmerge executable",
|
||||
tc_mkvmerge->GetValue().BeforeLast(PSEP), "",
|
||||
void
|
||||
tab_settings::on_browse(wxCommandEvent &evt) {
|
||||
wxFileDialog dlg(NULL, wxS("Choose the mkvmerge executable"),
|
||||
tc_mkvmerge->GetValue().BeforeLast(PSEP), wxS(""),
|
||||
#ifdef SYS_WINDOWS
|
||||
_T("Executable files (*.exe)|*.exe|" ALLFILES),
|
||||
wxS("Executable files (*.exe)|*.exe|" ALLFILES),
|
||||
#else
|
||||
_T("All files (*)|*"),
|
||||
wxS("All files (*)|*"),
|
||||
#endif
|
||||
wxOPEN);
|
||||
if(dlg.ShowModal() == wxID_OK) {
|
||||
tc_mkvmerge->SetValue(dlg.GetPath());
|
||||
mkvmerge_path = dlg.GetPath();
|
||||
save_preferences();
|
||||
query_mkvmerge_capabilities();
|
||||
}
|
||||
}
|
||||
|
||||
void tab_settings::load_preferences() {
|
||||
void
|
||||
tab_settings::load_preferences() {
|
||||
wxConfig *cfg = (wxConfig *)wxConfigBase::Get();
|
||||
|
||||
cfg->SetPath("/GUI");
|
||||
if (!cfg->Read("mkvmerge_executable", &mkvmerge_path))
|
||||
mkvmerge_path = "mkvmerge";
|
||||
cfg->SetPath(wxS("/GUI"));
|
||||
if (!cfg->Read(wxS("mkvmerge_executable"), &mkvmerge_path))
|
||||
mkvmerge_path = wxS("mkvmerge");
|
||||
tc_mkvmerge->SetValue(mkvmerge_path);
|
||||
query_mkvmerge_capabilities();
|
||||
}
|
||||
|
||||
void tab_settings::save_preferences() {
|
||||
void
|
||||
tab_settings::save_preferences() {
|
||||
wxConfig *cfg = (wxConfig *)wxConfigBase::Get();
|
||||
cfg->Write("/GUI/mkvmerge_executable", tc_mkvmerge->GetValue());
|
||||
cfg->Write(wxS("/GUI/mkvmerge_executable"), tc_mkvmerge->GetValue());
|
||||
cfg->Flush();
|
||||
}
|
||||
|
||||
void tab_settings::save(wxConfigBase *cfg) {
|
||||
void
|
||||
tab_settings::save(wxConfigBase *cfg) {
|
||||
}
|
||||
|
||||
void tab_settings::load(wxConfigBase *cfg) {
|
||||
void
|
||||
tab_settings::load(wxConfigBase *cfg) {
|
||||
}
|
||||
|
||||
bool tab_settings::validate_settings() {
|
||||
bool
|
||||
tab_settings::validate_settings() {
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
tab_settings::query_mkvmerge_capabilities() {
|
||||
wxString tmp;
|
||||
wxArrayString output, errors;
|
||||
vector<wxString> parts;
|
||||
int result, i;
|
||||
|
||||
tmp = wxS("\"") + mkvmerge_path + wxS("\" --capabilities");
|
||||
result = wxExecute(tmp, output, errors);
|
||||
if (result == 0) {
|
||||
capabilities.clear();
|
||||
for (i = 0; i < output.Count(); i++) {
|
||||
tmp = output[i];
|
||||
strip(tmp);
|
||||
parts = split(tmp, "=", 2);
|
||||
if (parts.size() == 1)
|
||||
capabilities[parts[0]] = "true";
|
||||
else
|
||||
capabilities[parts[0]] = parts[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
IMPLEMENT_CLASS(tab_settings, wxPanel);
|
||||
BEGIN_EVENT_TABLE(tab_settings, wxPanel)
|
||||
EVT_BUTTON(ID_B_BROWSEMKVMERGE, tab_settings::on_browse)
|
||||
|
@ -44,6 +44,8 @@ public:
|
||||
void save(wxConfigBase *cfg);
|
||||
void load(wxConfigBase *cfg);
|
||||
bool validate_settings();
|
||||
|
||||
void query_mkvmerge_capabilities();
|
||||
};
|
||||
|
||||
#endif // __TAB_SETTINGS_H
|
||||
|
Loading…
Reference in New Issue
Block a user