X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Ftools%2Fdvdomatic.cc;h=52e551d2ae99d9158f41fd6a51d334b1d3438f9b;hb=0d3f5aae5b99832b7c5d55f32f5bccb365caa3fd;hp=7a96555674e16eb05635931e1e08a04265d4402a;hpb=9f861f06506d0b1b50172f0defadc5bff3f76871;p=dcpomatic.git diff --git a/src/tools/dvdomatic.cc b/src/tools/dvdomatic.cc index 7a9655567..52e551d2a 100644 --- a/src/tools/dvdomatic.cc +++ b/src/tools/dvdomatic.cc @@ -19,17 +19,21 @@ #include #include -#include "gtk/film_viewer.h" -#include "gtk/film_editor.h" -#ifndef DVDOMATIC_DISABLE_PLAYER -#include "gtk/film_player.h" +#ifdef __WXMSW__ +#include #endif -#include "gtk/job_manager_view.h" -#include "gtk/config_dialog.h" -#include "gtk/gpl.h" -#include "gtk/job_wrapper.h" -#include "gtk/dvd_title_dialog.h" -#include "gtk/gtk_util.h" +#include +#include +#include +#include "wx/film_viewer.h" +#include "wx/film_editor.h" +#include "wx/job_manager_view.h" +#include "wx/config_dialog.h" +#include "wx/job_wrapper.h" +#include "wx/wx_util.h" +#include "wx/new_film_dialog.h" +#include "wx/properties_dialog.h" +#include "wx/wx_ui_signaller.h" #include "lib/film.h" #include "lib/format.h" #include "lib/config.h" @@ -37,345 +41,483 @@ #include "lib/util.h" #include "lib/scaler.h" #include "lib/exceptions.h" +#include "lib/version.h" +#include "lib/ui_signaller.h" +#include "lib/log.h" + +using std::cout; +using std::string; +using std::wstring; +using std::stringstream; +using std::map; +using std::make_pair; +using std::exception; +using boost::shared_ptr; -using namespace std; -using namespace boost; - -static Gtk::Window* window = 0; -static FilmViewer* film_viewer = 0; static FilmEditor* film_editor = 0; -#ifndef DVDOMATIC_DISABLE_PLAYER -static FilmPlayer* film_player = 0; -#endif -static Film* film = 0; +static FilmViewer* film_viewer = 0; +static shared_ptr film; +static std::string log_level; +static std::string film_to_load; +static wxMenu* jobs_menu = 0; +static wxLocale* locale = 0; static void set_menu_sensitivity (); -class FilmChangedDialog : public Gtk::MessageDialog +class FilmChangedDialog { public: FilmChangedDialog () - : Gtk::MessageDialog ("", false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE) { - stringstream s; - s << "Save changes to film \"" << film->name() << "\" before closing?"; - set_message (s.str ()); - add_button ("Close _without saving", Gtk::RESPONSE_NO); - add_button ("_Cancel", Gtk::RESPONSE_CANCEL); - add_button ("_Save", Gtk::RESPONSE_YES); + _dialog = new wxMessageDialog ( + 0, + std_to_wx (String::compose ("Save changes to film \"%1\" before closing?", film->name())), + _("Film changed"), + wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION + ); + } + + ~FilmChangedDialog () + { + _dialog->Destroy (); + } + + int run () + { + return _dialog->ShowModal (); } + +private: + wxMessageDialog* _dialog; }; -bool + +void maybe_save_then_delete_film () { if (!film) { - return false; + return; } if (film->dirty ()) { FilmChangedDialog d; switch (d.run ()) { - case Gtk::RESPONSE_CANCEL: - return true; - case Gtk::RESPONSE_YES: + case wxID_NO: + break; + case wxID_YES: film->write_metadata (); break; - case Gtk::RESPONSE_NO: - return false; } } - delete film; - film = 0; - return false; + film.reset (); } +enum Sensitivity { + ALWAYS, + NEEDS_FILM +}; + +map menu_items; + void -file_new () +add_item (wxMenu* menu, wxString text, int id, Sensitivity sens) { - Gtk::FileChooserDialog c (*window, "New Film", Gtk::FILE_CHOOSER_ACTION_CREATE_FOLDER); - c.add_button ("_Cancel", Gtk::RESPONSE_CANCEL); - c.add_button ("C_reate", Gtk::RESPONSE_ACCEPT); - - int const r = c.run (); - if (r == Gtk::RESPONSE_ACCEPT) { - if (maybe_save_then_delete_film ()) { - return; - } - film = new Film (c.get_filename ()); -#if BOOST_FILESYSTEM_VERSION == 3 - film->set_name (filesystem::path (c.get_filename().c_str()).filename().generic_string()); -#else - film->set_name (filesystem::path (c.get_filename().c_str()).filename()); -#endif - film_viewer->set_film (film); - film_editor->set_film (film); - set_menu_sensitivity (); - } + wxMenuItem* item = menu->Append (id, text); + menu_items.insert (make_pair (item, sens)); } void -file_open () +set_menu_sensitivity () { - Gtk::FileChooserDialog c (*window, "Open Film", Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER); - c.add_button ("_Cancel", Gtk::RESPONSE_CANCEL); - c.add_button ("_Open", Gtk::RESPONSE_ACCEPT); - - int const r = c.run (); - if (r == Gtk::RESPONSE_ACCEPT) { - if (maybe_save_then_delete_film ()) { - return; + for (map::iterator i = menu_items.begin(); i != menu_items.end(); ++i) { + if (i->second == NEEDS_FILM) { + i->first->Enable (film != 0); + } else { + i->first->Enable (true); } - film = new Film (c.get_filename ()); - film_viewer->set_film (film); - film_editor->set_film (film); - set_menu_sensitivity (); } } -void -file_save () -{ - film->write_metadata (); -} +enum { + ID_file_new = 1, + ID_file_open, + ID_file_save, + ID_file_properties, + ID_file_quit, + ID_edit_preferences, + ID_jobs_make_dcp, + ID_jobs_send_dcp_to_tms, + ID_jobs_show_dcp, + ID_jobs_examine_content, + ID_help_about +}; void -file_quit () +setup_menu (wxMenuBar* m) { - if (maybe_save_then_delete_film ()) { - return; - } - - Gtk::Main::quit (); + wxMenu* file = new wxMenu; + add_item (file, _("New..."), ID_file_new, ALWAYS); + add_item (file, _("&Open..."), ID_file_open, ALWAYS); + file->AppendSeparator (); + add_item (file, _("&Save"), ID_file_save, NEEDS_FILM); + file->AppendSeparator (); + add_item (file, _("&Properties..."), ID_file_properties, NEEDS_FILM); + file->AppendSeparator (); + add_item (file, _("&Quit"), ID_file_quit, ALWAYS); + + wxMenu* edit = new wxMenu; + add_item (edit, _("&Preferences..."), ID_edit_preferences, ALWAYS); + + jobs_menu = new wxMenu; + add_item (jobs_menu, _("&Make DCP"), ID_jobs_make_dcp, NEEDS_FILM); + add_item (jobs_menu, _("&Send DCP to TMS"), ID_jobs_send_dcp_to_tms, NEEDS_FILM); + add_item (jobs_menu, _("S&how DCP"), ID_jobs_show_dcp, NEEDS_FILM); + jobs_menu->AppendSeparator (); + add_item (jobs_menu, _("&Examine content"), ID_jobs_examine_content, NEEDS_FILM); + + wxMenu* help = new wxMenu; + add_item (help, _("About"), ID_help_about, ALWAYS); + + m->Append (file, _(_("&File"))); + m->Append (edit, _(_("&Edit"))); + m->Append (jobs_menu, _(_("&Jobs"))); + m->Append (help, _(_("&Help"))); } -void -edit_preferences () +bool +window_closed (wxCommandEvent &) { - ConfigDialog d; - d.run (); - Config::instance()->write (); + maybe_save_then_delete_film (); + return false; } -void -jobs_make_dcp () +class Frame : public wxFrame { - JobWrapper::make_dcp (film, true); -} +public: + Frame (wxString const & title) + : wxFrame (NULL, -1, title) + { + wxMenuBar* bar = new wxMenuBar; + setup_menu (bar); + SetMenuBar (bar); + + Connect (ID_file_new, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::file_new)); + Connect (ID_file_open, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::file_open)); + Connect (ID_file_save, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::file_save)); + Connect (ID_file_properties, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::file_properties)); + Connect (ID_file_quit, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::file_quit)); + Connect (ID_edit_preferences, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::edit_preferences)); + Connect (ID_jobs_make_dcp, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::jobs_make_dcp)); + Connect (ID_jobs_send_dcp_to_tms, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::jobs_send_dcp_to_tms)); + Connect (ID_jobs_show_dcp, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::jobs_show_dcp)); + Connect (ID_jobs_examine_content, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::jobs_examine_content)); + Connect (ID_help_about, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::help_about)); + + Connect (wxID_ANY, wxEVT_MENU_OPEN, wxMenuEventHandler (Frame::menu_opened)); + + wxPanel* panel = new wxPanel (this); + wxSizer* s = new wxBoxSizer (wxHORIZONTAL); + s->Add (panel, 1, wxEXPAND); + SetSizer (s); + + film_editor = new FilmEditor (film, panel); + film_viewer = new FilmViewer (film, panel); + JobManagerView* job_manager_view = new JobManagerView (panel); + + _top_sizer = new wxBoxSizer (wxHORIZONTAL); + _top_sizer->Add (film_editor, 0, wxALL, 6); + _top_sizer->Add (film_viewer, 1, wxEXPAND | wxALL, 6); + + wxBoxSizer* main_sizer = new wxBoxSizer (wxVERTICAL); + main_sizer->Add (_top_sizer, 2, wxEXPAND | wxALL, 6); + main_sizer->Add (job_manager_view, 1, wxEXPAND | wxALL, 6); + panel->SetSizer (main_sizer); -void -jobs_make_dcp_from_existing_transcode () -{ - JobWrapper::make_dcp (film, false); -} + set_menu_sensitivity (); -void -jobs_copy_from_dvd () -{ - try { - DVDTitleDialog d; - if (d.run () != Gtk::RESPONSE_OK) { + /* XXX: calling these here is a bit of a hack */ + film_editor->setup_visibility (); + + film_editor->FileChanged.connect (bind (&Frame::file_changed, this, _1)); + if (film) { + file_changed (film->directory ()); + } else { + file_changed (""); + } + + set_film (); + + film_editor->Connect (wxID_ANY, wxEVT_SIZE, wxSizeEventHandler (Frame::film_editor_sized), 0, this); + } + +private: + + void film_editor_sized (wxSizeEvent &) + { + static bool in_layout = false; + if (!in_layout) { + in_layout = true; + _top_sizer->Layout (); + in_layout = false; + } + } + + void menu_opened (wxMenuEvent& ev) + { + if (ev.GetMenu() != jobs_menu) { return; } - film->copy_from_dvd (); - } catch (DVDError& e) { - error_dialog (e.what ()); + + bool const have_dcp = film && film->have_dcp(); + jobs_menu->Enable (ID_jobs_send_dcp_to_tms, have_dcp); + jobs_menu->Enable (ID_jobs_show_dcp, have_dcp); } -} -void -jobs_send_dcp_to_tms () -{ - film->send_dcp_to_tms (); -} + void set_film () + { + film_viewer->set_film (film); + film_editor->set_film (film); + set_menu_sensitivity (); + } -void -jobs_examine_content () -{ - film->examine_content (); -} + void file_changed (string f) + { + stringstream s; + s << _("DVD-o-matic"); + if (!f.empty ()) { + s << " - " << f; + } + + SetTitle (std_to_wx (s.str())); + } + + void file_new (wxCommandEvent &) + { + NewFilmDialog* d = new NewFilmDialog (this); + int const r = d->ShowModal (); + + if (r == wxID_OK) { + + if (boost::filesystem::exists (d->get_path())) { + error_dialog (this, wxString::Format (_("The directory %s already exists."), d->get_path().c_str())); + return; + } + + maybe_save_then_delete_film (); + film.reset (new Film (d->get_path (), false)); + film->log()->set_level (log_level); + film->set_name (boost::filesystem::path (d->get_path()).filename().generic_string()); + set_film (); + } + + d->Destroy (); + } -void -help_about () -{ - Gtk::AboutDialog d; - d.set_name ("DVD-o-matic"); - d.set_version (DVDOMATIC_VERSION); - - stringstream s; - s << "DCP generation from arbitrary formats\n\n" - << "Using " << dependency_version_summary() << "\n"; - d.set_comments (s.str ()); - - vector authors; - authors.push_back ("Carl Hetherington"); - authors.push_back ("Terrence Meiczinger"); - authors.push_back ("Paul Davis"); - d.set_authors (authors); - - d.set_website ("http://carlh.net/software/dvdomatic"); - d.set_license (gpl); + void file_open (wxCommandEvent &) + { + wxDirDialog* c = new wxDirDialog (this, _("Select film to open"), wxStandardPaths::Get().GetDocumentsDir(), wxDEFAULT_DIALOG_STYLE | wxDD_DIR_MUST_EXIST); + int const r = c->ShowModal (); + + if (r == wxID_OK) { + maybe_save_then_delete_film (); + try { + film.reset (new Film (wx_to_std (c->GetPath ()))); + film->log()->set_level (log_level); + set_film (); + } catch (std::exception& e) { + wxString p = c->GetPath (); + wxCharBuffer b = p.ToUTF8 (); + error_dialog (this, wxString::Format (_("Could not open film at %s (%s)"), p.data(), e.what())); + } + } + + c->Destroy (); + } + + void file_save (wxCommandEvent &) + { + film->write_metadata (); + } + + void file_properties (wxCommandEvent &) + { + PropertiesDialog* d = new PropertiesDialog (this, film); + d->ShowModal (); + d->Destroy (); + } - d.run (); -} + void file_quit (wxCommandEvent &) + { + maybe_save_then_delete_film (); + Close (true); + } -enum Sensitivity { - ALWAYS, - NEEDS_FILM -}; + void edit_preferences (wxCommandEvent &) + { + ConfigDialog* d = new ConfigDialog (this); + d->ShowModal (); + d->Destroy (); + Config::instance()->write (); + } -map menu_items; + void jobs_make_dcp (wxCommandEvent &) + { + JobWrapper::make_dcp (this, film); + } -void -add_item (Gtk::Menu_Helpers::MenuList& items, string text, sigc::slot0 handler, Sensitivity sens) -{ - items.push_back (Gtk::Menu_Helpers::MenuElem (text, handler)); - menu_items.insert (make_pair (&items.back(), sens)); -} + void jobs_send_dcp_to_tms (wxCommandEvent &) + { + film->send_dcp_to_tms (); + } -void -set_menu_sensitivity () -{ - for (map::iterator i = menu_items.begin(); i != menu_items.end(); ++i) { - if (i->second == NEEDS_FILM) { - i->first->set_sensitive (film != 0); + void jobs_show_dcp (wxCommandEvent &) + { +#ifdef __WXMSW__ + string d = film->directory(); + wstring w; + w.assign (d.begin(), d.end()); + ShellExecute (0, L"open", w.c_str(), 0, 0, SW_SHOWDEFAULT); +#else + int r = system ("which nautilus"); + if (WEXITSTATUS (r) == 0) { + system (string ("nautilus " + film->directory()).c_str ()); } else { - i->first->set_sensitive (true); + int r = system ("which konqueror"); + if (WEXITSTATUS (r) == 0) { + system (string ("konqueror " + film->directory()).c_str ()); + } } +#endif } -} - -void -setup_menu (Gtk::MenuBar& m) -{ - using namespace Gtk::Menu_Helpers; - - Gtk::Menu* file = manage (new Gtk::Menu); - MenuList& file_items (file->items ()); - add_item (file_items, "New...", sigc::ptr_fun (file_new), ALWAYS); - add_item (file_items, "_Open...", sigc::ptr_fun (file_open), ALWAYS); - file_items.push_back (SeparatorElem ()); - add_item (file_items, "_Save", sigc::ptr_fun (file_save), NEEDS_FILM); - file_items.push_back (SeparatorElem ()); - add_item (file_items, "_Quit", sigc::ptr_fun (file_quit), NEEDS_FILM); - - Gtk::Menu* edit = manage (new Gtk::Menu); - MenuList& edit_items (edit->items ()); - add_item (edit_items, "_Preferences...", sigc::ptr_fun (edit_preferences), ALWAYS); - - Gtk::Menu* jobs = manage (new Gtk::Menu); - MenuList& jobs_items (jobs->items ()); - add_item (jobs_items, "_Make DCP", sigc::ptr_fun (jobs_make_dcp), NEEDS_FILM); - add_item (jobs_items, "_Send DCP to TMS", sigc::ptr_fun (jobs_send_dcp_to_tms), NEEDS_FILM); - add_item (jobs_items, "Copy from _DVD...", sigc::ptr_fun (jobs_copy_from_dvd), NEEDS_FILM); - jobs_items.push_back (SeparatorElem ()); - add_item (jobs_items, "_Examine content", sigc::ptr_fun (jobs_examine_content), NEEDS_FILM); - add_item (jobs_items, "Make DCP from _existing transcode", sigc::ptr_fun (jobs_make_dcp_from_existing_transcode), NEEDS_FILM); - - Gtk::Menu* help = manage (new Gtk::Menu); - MenuList& help_items (help->items ()); - add_item (help_items, "About", sigc::ptr_fun (help_about), ALWAYS); - MenuList& items (m.items ()); - items.push_back (MenuElem ("_File", *file)); - items.push_back (MenuElem ("_Edit", *edit)); - items.push_back (MenuElem ("_Jobs", *jobs)); - items.push_back (MenuElem ("_Help", *help)); -} - -bool -window_closed (GdkEventAny *) -{ - if (maybe_save_then_delete_film ()) { - return true; + void jobs_examine_content (wxCommandEvent &) + { + film->examine_content (); + } + + void help_about (wxCommandEvent &) + { + wxAboutDialogInfo info; + info.SetName (_("DVD-o-matic")); + if (strcmp (dvdomatic_git_commit, "release") == 0) { + info.SetVersion (std_to_wx (String::compose ("version %1", dvdomatic_version))); + } else { + info.SetVersion (std_to_wx (String::compose ("version %1 git %2", dvdomatic_version, dvdomatic_git_commit))); + } + info.SetDescription (_("Free, open-source DCP generation from almost anything.")); + info.SetCopyright (_("(C) 2012-2013 Carl Hetherington, Terrence Meiczinger, Paul Davis, Ole Laursen")); + wxArrayString authors; + authors.Add (wxT ("Carl Hetherington")); + authors.Add (wxT ("Terrence Meiczinger")); + authors.Add (wxT ("Paul Davis")); + authors.Add (wxT ("Ole Laursen")); + info.SetDevelopers (authors); + info.SetWebSite (wxT ("http://carlh.net/software/dvdomatic")); + wxAboutBox (info); } - return false; -} + wxSizer* _top_sizer; +}; + +#if wxMINOR_VERSION == 9 +static const wxCmdLineEntryDesc command_line_description[] = { + { wxCMD_LINE_OPTION, "l", "log", "set log level (silent, verbose or timing)", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL }, + { wxCMD_LINE_PARAM, 0, 0, "film to load", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE | wxCMD_LINE_PARAM_OPTIONAL }, + { wxCMD_LINE_NONE, "", "", "", wxCmdLineParamType (0), 0 } +}; +#else +static const wxCmdLineEntryDesc command_line_description[] = { + { wxCMD_LINE_OPTION, wxT("l"), wxT("log"), wxT("set log level (silent, verbose or timing)"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL }, + { wxCMD_LINE_PARAM, 0, 0, wxT("film to load"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE | wxCMD_LINE_PARAM_OPTIONAL }, + { wxCMD_LINE_NONE, wxT(""), wxT(""), wxT(""), wxCmdLineParamType (0), 0 } +}; +#endif void -file_changed (string f) +setup_i18n () { - stringstream s; - s << "DVD-o-matic"; - if (!f.empty ()) { - s << " — " << f; + int language = wxLANGUAGE_DEFAULT; + + if (wxLocale::IsAvailable (language)) { + locale = new wxLocale (language, wxLOCALE_LOAD_DEFAULT); + +#ifdef __WXGTK__ + locale->AddCatalogLookupPathPrefix (wxT (LOCALE_DIR)); +#endif + + locale->AddCatalog ("libdvdomatic-wx"); + locale->AddCatalog ("dvdomatic"); + + if (!locale->IsOk()) { + delete locale; + locale = new wxLocale (wxLANGUAGE_ENGLISH); + language = wxLANGUAGE_ENGLISH; + } } - - window->set_title (s.str ()); } -int -main (int argc, char* argv[]) +class App : public wxApp { - dvdomatic_setup (); - - Gtk::Main kit (argc, argv); + bool OnInit () + { + if (!wxApp::OnInit()) { + return false; + } + +#ifdef DVDOMATIC_POSIX + unsetenv ("UBUNTU_MENUPROXY"); +#endif + + wxInitAllImageHandlers (); + setup_i18n (); + + dvdomatic_setup (); + + if (!film_to_load.empty() && boost::filesystem::is_directory (film_to_load)) { + try { + film.reset (new Film (film_to_load)); + film->log()->set_level (log_level); + } catch (exception& e) { + error_dialog (0, std_to_wx (String::compose (wx_to_std (_("Could not load film %1 (%2)")), film_to_load, e.what()))); + } + } - if (argc == 2 && boost::filesystem::is_directory (argv[1])) { - film = new Film (argv[1]); + Frame* f = new Frame (_("DVD-o-matic")); + SetTopWindow (f); + f->Maximize (); + f->Show (); + + ui_signaller = new wxUISignaller (this); + this->Connect (-1, wxEVT_IDLE, wxIdleEventHandler (App::idle)); + + return true; } - window = new Gtk::Window (); - window->signal_delete_event().connect (sigc::ptr_fun (window_closed)); - - film_viewer = new FilmViewer (film); - film_editor = new FilmEditor (film); -#ifndef DVDOMATIC_DISABLE_PLAYER - film_player = new FilmPlayer (film); -#endif - JobManagerView jobs_view; - - window->set_title ("DVD-o-matic"); - - Gtk::VBox vbox; - - Gtk::MenuBar menu_bar; - vbox.pack_start (menu_bar, false, false); - setup_menu (menu_bar); - set_menu_sensitivity (); - - Gtk::HBox hbox; - hbox.set_spacing (12); - - Gtk::VBox left_vbox; - left_vbox.set_spacing (12); - left_vbox.pack_start (film_editor->widget (), false, false); -#ifndef DVDOMATIC_DISABLE_PLAYER - left_vbox.pack_start (film_player->widget (), false, false); -#endif - hbox.pack_start (left_vbox, false, false); - - Gtk::VBox right_vbox; - right_vbox.pack_start (film_viewer->widget (), true, true); - right_vbox.pack_start (jobs_view.widget(), false, false); - hbox.pack_start (right_vbox, true, true); - - vbox.pack_start (hbox, true, true); - - window->add (vbox); - window->show_all (); - - /* XXX: calling these here is a bit of a hack */ - film_editor->setup_visibility (); -#ifndef DVDOMATIC_DISABLE_PLAYER - film_player->setup_visibility (); -#endif - film_viewer->setup_visibility (); - - film_editor->FileChanged.connect (ptr_fun (file_changed)); - if (film) { - file_changed (film->directory ()); - } else { - file_changed (""); + void OnInitCmdLine (wxCmdLineParser& parser) + { + parser.SetDesc (command_line_description); + parser.SetSwitchChars (wxT ("-")); } - /* XXX this should be in JobManagerView, shouldn't it? */ - Glib::signal_timeout().connect (sigc::bind_return (sigc::mem_fun (jobs_view, &JobManagerView::update), true), 1000); + bool OnCmdLineParsed (wxCmdLineParser& parser) + { + if (parser.GetParamCount() > 0) { + film_to_load = wx_to_std (parser.GetParam(0)); + } - window->maximize (); - Gtk::Main::run (*window); + wxString log; + if (parser.Found(wxT("log"), &log)) { + log_level = wx_to_std (log); + } - return 0; -} + return true; + } + + void idle (wxIdleEvent &) + { + ui_signaller->ui_idle (); + } +}; + +IMPLEMENT_APP (App)