summaryrefslogtreecommitdiff
path: root/src/tools/dvdomatic.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2012-07-15 00:14:28 +0100
committerCarl Hetherington <cth@carlh.net>2012-07-15 00:14:28 +0100
commitbb767c7e338414beee132af3e96829c1448e214b (patch)
treebec2858dcc7225a9bcc2acd8170c25508f6df6cb /src/tools/dvdomatic.cc
parent66c9be6bdb1361e5681e094a0c8170d268aa9518 (diff)
Move things round a bit.
Diffstat (limited to 'src/tools/dvdomatic.cc')
-rw-r--r--src/tools/dvdomatic.cc328
1 files changed, 328 insertions, 0 deletions
diff --git a/src/tools/dvdomatic.cc b/src/tools/dvdomatic.cc
new file mode 100644
index 000000000..803eec3c4
--- /dev/null
+++ b/src/tools/dvdomatic.cc
@@ -0,0 +1,328 @@
+/*
+ Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <iostream>
+#include <boost/filesystem.hpp>
+#include "gtk/film_viewer.h"
+#include "gtk/film_editor.h"
+#include "gtk/film_player.h"
+#include "gtk/job_manager_view.h"
+#include "gtk/config_dialog.h"
+#include "gtk/gpl.h"
+#include "gtk/job_wrapper.h"
+#include "lib/film.h"
+#include "lib/format.h"
+#include "lib/config.h"
+#include "lib/filter.h"
+#include "lib/util.h"
+#include "lib/scaler.h"
+
+using namespace std;
+using namespace boost;
+
+static Gtk::Window* window = 0;
+static FilmViewer* film_viewer = 0;
+static FilmEditor* film_editor = 0;
+static FilmPlayer* film_player = 0;
+static Film* film = 0;
+
+class FilmChangedDialog : public Gtk::MessageDialog
+{
+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);
+ }
+};
+
+bool
+maybe_save_then_delete_film ()
+{
+ if (!film) {
+ return false;
+ }
+
+ if (film->dirty ()) {
+ FilmChangedDialog d;
+ switch (d.run ()) {
+ case Gtk::RESPONSE_CANCEL:
+ return true;
+ case Gtk::RESPONSE_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);
+ }
+}
+
+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);
+ }
+}
+
+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 ()
+{
+ film->copy_from_dvd ();
+}
+
+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 ();
+}
+
+void
+setup_menu (Gtk::MenuBar& m)
+{
+ using namespace Gtk::Menu_Helpers;
+
+ Gtk::Menu* file = manage (new Gtk::Menu);
+ MenuList& file_items (file->items ());
+ file_items.push_back (MenuElem ("_New...", sigc::ptr_fun (file_new)));
+ file_items.push_back (MenuElem ("_Open...", sigc::ptr_fun (file_open)));
+ file_items.push_back (SeparatorElem ());
+ file_items.push_back (MenuElem ("_Save", sigc::ptr_fun (file_save)));
+ file_items.push_back (SeparatorElem ());
+ file_items.push_back (MenuElem ("_Quit", sigc::ptr_fun (file_quit)));
+
+ Gtk::Menu* edit = manage (new Gtk::Menu);
+ MenuList& edit_items (edit->items ());
+ edit_items.push_back (MenuElem ("_Preferences...", sigc::ptr_fun (edit_preferences)));
+
+ Gtk::Menu* jobs = manage (new Gtk::Menu);
+ MenuList& jobs_items (jobs->items ());
+ jobs_items.push_back (MenuElem ("_Make DCP", sigc::ptr_fun (jobs_make_dcp)));
+ jobs_items.push_back (MenuElem ("_Send DCP to TMS", sigc::ptr_fun (jobs_send_dcp_to_tms)));
+ jobs_items.push_back (MenuElem ("Copy from _DVD", sigc::ptr_fun (jobs_copy_from_dvd)));
+ jobs_items.push_back (MenuElem ("_Examine content", sigc::ptr_fun (jobs_examine_content)));
+ jobs_items.push_back (MenuElem ("Make DCP from _existing transcode", sigc::ptr_fun (jobs_make_dcp_from_existing_transcode)));
+
+ Gtk::Menu* help = manage (new Gtk::Menu);
+ MenuList& help_items (help->items ());
+ help_items.push_back (MenuElem ("_About", sigc::ptr_fun (help_about)));
+
+ 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;
+ }
+
+ return false;
+}
+
+void
+file_changed (string f)
+{
+ stringstream s;
+ s << "DVD-o-matic";
+ if (!f.empty ()) {
+ s << " — " << f;
+ }
+
+ window->set_title (s.str ());
+}
+
+int
+main (int argc, char* argv[])
+{
+ dvdomatic_setup ();
+
+ Gtk::Main kit (argc, argv);
+
+ if (argc == 2 && boost::filesystem::is_directory (argv[1])) {
+ film = new Film (argv[1]);
+ }
+
+ window = new Gtk::Window ();
+ window->signal_delete_event().connect (sigc::ptr_fun (window_closed));
+
+ film_viewer = new FilmViewer (film);
+ film_editor = new FilmEditor (film);
+ film_player = new FilmPlayer (film);
+ 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);
+
+ 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);
+// left_vbox.pack_start (film_player->widget (), false, false);
+ 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 ();
+ film_player->setup_visibility ();
+ film_viewer->setup_visibility ();
+
+ film_editor->FileChanged.connect (ptr_fun (file_changed));
+ if (film) {
+ file_changed (film->directory ());
+ } else {
+ file_changed ("");
+ }
+
+ /* 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;
+}