#include <iostream>
#include <boost/filesystem.hpp>
-#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 <wx/aboutdlg.h>
+#include <wx/stdpaths.h>
+#include <wx/cmdline.h>
+#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"
#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<string> 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 {
NEEDS_FILM
};
-map<Gtk::MenuItem *, Sensitivity> menu_items;
+map<wxMenuItem*, Sensitivity> menu_items;
void
-add_item (Gtk::Menu_Helpers::MenuList& items, string text, sigc::slot0<void> 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<Gtk::MenuItem *, Sensitivity>::iterator i = menu_items.begin(); i != menu_items.end(); ++i) {
+ for (map<wxMenuItem*, Sensitivity>::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)