X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Ftools%2Fdvdomatic.cc;h=23cf216ca1d8e29de534b9e1c757008bc5ca9cc2;hb=ec0a74ffb64199847847cb4413380d5e3c24f617;hp=7a96555674e16eb05635931e1e08a04265d4402a;hpb=9f861f06506d0b1b50172f0defadc5bff3f76871;p=dcpomatic.git diff --git a/src/tools/dvdomatic.cc b/src/tools/dvdomatic.cc index 7a9655567..23cf216ca 100644 --- a/src/tools/dvdomatic.cc +++ b/src/tools/dvdomatic.cc @@ -19,17 +19,18 @@ #include #include -#include "gtk/film_viewer.h" -#include "gtk/film_editor.h" -#ifndef DVDOMATIC_DISABLE_PLAYER -#include "gtk/film_player.h" -#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 "gtk/dvd_title_dialog.h" +#include "wx/wx_util.h" +#include "wx/new_film_dialog.h" +#include "wx/properties_dialog.h" #include "lib/film.h" #include "lib/format.h" #include "lib/config.h" @@ -37,187 +38,63 @@ #include "lib/util.h" #include "lib/scaler.h" #include "lib/exceptions.h" +#include "lib/version.h" 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 FilmViewer* film_viewer = 0; + static Film* film = 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 (s.str()), wxT ("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; -} - -void -file_new () -{ - 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 (); - } -} - -void -file_open () -{ - 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; - } - 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 (); -} - -void -file_quit () -{ - if (maybe_save_then_delete_film ()) { - return; - } - - Gtk::Main::quit (); -} - -void -edit_preferences () -{ - ConfigDialog d; - d.run (); - Config::instance()->write (); -} - -void -jobs_make_dcp () -{ - JobWrapper::make_dcp (film, true); -} - -void -jobs_make_dcp_from_existing_transcode () -{ - JobWrapper::make_dcp (film, false); -} - -void -jobs_copy_from_dvd () -{ - try { - DVDTitleDialog d; - if (d.run () != Gtk::RESPONSE_OK) { - return; - } - film->copy_from_dvd (); - } catch (DVDError& e) { - error_dialog (e.what ()); - } -} - -void -jobs_send_dcp_to_tms () -{ - film->send_dcp_to_tms (); -} - -void -jobs_examine_content () -{ - film->examine_content (); -} - -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); - - d.run (); } enum Sensitivity { @@ -225,157 +102,287 @@ enum Sensitivity { NEEDS_FILM }; -map menu_items; +map menu_items; void -add_item (Gtk::Menu_Helpers::MenuList& items, string text, sigc::slot0 handler, Sensitivity sens) +add_item (wxMenu* menu, std::string text, int id, Sensitivity sens) { - items.push_back (Gtk::Menu_Helpers::MenuElem (text, handler)); - menu_items.insert (make_pair (&items.back(), sens)); + wxMenuItem* item = menu->Append (id, std_to_wx (text)); + menu_items.insert (make_pair (item, sens)); } void set_menu_sensitivity () { - for (map::iterator i = menu_items.begin(); i != menu_items.end(); ++i) { + for (map::iterator i = menu_items.begin(); i != menu_items.end(); ++i) { if (i->second == NEEDS_FILM) { - i->first->set_sensitive (film != 0); + i->first->Enable (film != 0); } else { - i->first->set_sensitive (true); + i->first->Enable (true); } } } +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_copy_from_dvd, + ID_jobs_examine_content, + ID_jobs_make_dcp_from_existing_transcode, + ID_help_about +}; + void -setup_menu (Gtk::MenuBar& m) +setup_menu (wxMenuBar* 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)); + 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); + + wxMenu* jobs = new wxMenu; + add_item (jobs, "&Make DCP", ID_jobs_make_dcp, NEEDS_FILM); + add_item (jobs, "&Send DCP to TMS", ID_jobs_send_dcp_to_tms, NEEDS_FILM); +#ifdef DVDOMATIC_POSIX + add_item (jobs, "Copy from &DVD...", ID_jobs_copy_from_dvd, NEEDS_FILM); +#endif + jobs->AppendSeparator (); + add_item (jobs, "&Examine content", ID_jobs_examine_content, NEEDS_FILM); + add_item (jobs, "Make DCP from existing &transcode", ID_jobs_make_dcp_from_existing_transcode, 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, _("&Jobs")); + m->Append (help, _("&Help")); } bool -window_closed (GdkEventAny *) +window_closed (wxCommandEvent &) { - if (maybe_save_then_delete_film ()) { - return true; - } - + maybe_save_then_delete_film (); return false; } -void -file_changed (string f) +class Frame : public wxFrame { - stringstream s; - s << "DVD-o-matic"; - if (!f.empty ()) { - s << " — " << f; - } - - window->set_title (s.str ()); -} +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_copy_from_dvd, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::jobs_copy_from_dvd)); + Connect (ID_jobs_examine_content, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::jobs_examine_content)); + Connect (ID_jobs_make_dcp_from_existing_transcode, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::jobs_make_dcp_from_existing_transcode)); + Connect (ID_help_about, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::help_about)); + + 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); + + wxSizer* rhs_sizer = new wxBoxSizer (wxVERTICAL); + rhs_sizer->Add (film_viewer, 3, wxEXPAND | wxALL); + rhs_sizer->Add (job_manager_view, 1, wxEXPAND | wxALL); + + wxBoxSizer* main_sizer = new wxBoxSizer (wxHORIZONTAL); + main_sizer->Add (film_editor, 0, wxALL, 6); + main_sizer->Add (rhs_sizer, 1, wxEXPAND | wxALL, 6); + panel->SetSizer (main_sizer); -int -main (int argc, char* argv[]) -{ - dvdomatic_setup (); - - Gtk::Main kit (argc, argv); + set_menu_sensitivity (); + + /* XXX: calling these here is a bit of a hack */ + film_editor->setup_visibility (); + film_viewer->setup_visibility (); + + film_editor->FileChanged.connect (sigc::mem_fun (*this, &Frame::file_changed)); + if (film) { + file_changed (film->directory ()); + } else { + file_changed (""); + } + + set_film (); + } - if (argc == 2 && boost::filesystem::is_directory (argv[1])) { - film = new Film (argv[1]); + void set_film () + { + film_viewer->set_film (film); + film_editor->set_film (film); + set_menu_sensitivity (); } - window = new Gtk::Window (); - window->signal_delete_event().connect (sigc::ptr_fun (window_closed)); + void file_changed (string f) + { + stringstream s; + s << "DVD-o-matic"; + if (!f.empty ()) { + s << " - " << f; + } + + SetTitle (std_to_wx (s.str())); + } - 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; + void file_new (wxCommandEvent &) + { + NewFilmDialog* d = new NewFilmDialog (this); + int const r = d->ShowModal (); + + if (r == wxID_OK) { + maybe_save_then_delete_film (); + film = new Film (d->get_path (), false); +#if BOOST_FILESYSTEM_VERSION == 3 + film->set_name (filesystem::path (d->get_path()).filename().generic_string()); +#else + film->set_name (filesystem::path (d->get_path()).filename()); +#endif + set_film (); + } + + d->Destroy (); + } - Gtk::MenuBar menu_bar; - vbox.pack_start (menu_bar, false, false); - setup_menu (menu_bar); - set_menu_sensitivity (); + void file_open (wxCommandEvent &) + { + wxDirDialog* c = new wxDirDialog (this, wxT ("Select film to open"), wxStandardPaths::Get().GetDocumentsDir(), wxDEFAULT_DIALOG_STYLE | wxDD_DIR_MUST_EXIST); + int const r = c->ShowModal (); + c->Destroy (); + + if (r == wxID_OK) { + maybe_save_then_delete_film (); + film = new Film (wx_to_std (c->GetPath ())); + set_film (); + } + } - Gtk::HBox hbox; - hbox.set_spacing (12); + void file_save (wxCommandEvent &) + { + film->write_metadata (); + } - 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); + void file_properties (wxCommandEvent &) + { + PropertiesDialog* d = new PropertiesDialog (this, film); + d->ShowModal (); + d->Destroy (); + } + + void file_quit (wxCommandEvent &) + { + maybe_save_then_delete_film (); + Close (true); + } - 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); + void edit_preferences (wxCommandEvent &) + { + ConfigDialog* d = new ConfigDialog (this); + d->ShowModal (); + d->Destroy (); + Config::instance()->write (); + } - vbox.pack_start (hbox, true, true); + void jobs_make_dcp (wxCommandEvent &) + { + JobWrapper::make_dcp (this, film, true); + } + + void jobs_make_dcp_from_existing_transcode (wxCommandEvent &) + { + JobWrapper::make_dcp (this, film, false); + } + + void jobs_copy_from_dvd (wxCommandEvent &) + { + try { + +// DVDTitleDialog d; +// if (d.run () != Gtk::RESPONSE_OK) { +// return; +// } + film->copy_from_dvd (); + } catch (DVDError& e) { + error_dialog (this, e.what ()); + } + } + + void jobs_send_dcp_to_tms (wxCommandEvent &) + { + film->send_dcp_to_tms (); + } + + void jobs_examine_content (wxCommandEvent &) + { + film->examine_content (); + } + + void help_about (wxCommandEvent &) + { + wxAboutDialogInfo info; + info.SetName (_("DVD-o-matic")); + info.SetVersion (std_to_wx (String::compose ("DVD-o-matic version %1 git %2", dvdomatic_version, dvdomatic_git_commit))); + info.SetDescription (_("Free, open-source DCP generation from almost anything.")); + info.SetCopyright (_("(C) 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); + } +}; - window->add (vbox); - window->show_all (); +class App : public wxApp +{ + bool OnInit () + { + wxInitAllImageHandlers (); + + dvdomatic_setup (); - /* 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 (); + if (argc == 2 && boost::filesystem::is_directory (wx_to_std (argv[1]))) { + film = new Film (wx_to_std (argv[1])); + } - film_editor->FileChanged.connect (ptr_fun (file_changed)); - if (film) { - file_changed (film->directory ()); - } else { - file_changed (""); + Frame* f = new Frame (_("DVD-o-matic")); + SetTopWindow (f); + f->Maximize (); + f->Show (); + return true; } +}; - /* 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); - - window->maximize (); - Gtk::Main::run (*window); - - return 0; -} +IMPLEMENT_APP (App)