2 Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include <boost/filesystem.hpp>
22 #include "gtk/film_viewer.h"
23 #include "gtk/film_editor.h"
24 #ifndef DVDOMATIC_DISABLE_PLAYER
25 #include "gtk/film_player.h"
27 #include "gtk/job_manager_view.h"
28 #include "gtk/config_dialog.h"
30 #include "gtk/job_wrapper.h"
31 #include "gtk/dvd_title_dialog.h"
32 #include "gtk/gtk_util.h"
34 #include "lib/format.h"
35 #include "lib/config.h"
36 #include "lib/filter.h"
38 #include "lib/scaler.h"
39 #include "lib/exceptions.h"
42 using namespace boost;
44 static Gtk::Window* window = 0;
45 static FilmViewer* film_viewer = 0;
46 static FilmEditor* film_editor = 0;
47 #ifndef DVDOMATIC_DISABLE_PLAYER
48 static FilmPlayer* film_player = 0;
50 static Film* film = 0;
52 static void set_menu_sensitivity ();
54 class FilmChangedDialog : public Gtk::MessageDialog
58 : Gtk::MessageDialog ("", false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE)
61 s << "Save changes to film \"" << film->name() << "\" before closing?";
62 set_message (s.str ());
63 add_button ("Close _without saving", Gtk::RESPONSE_NO);
64 add_button ("_Cancel", Gtk::RESPONSE_CANCEL);
65 add_button ("_Save", Gtk::RESPONSE_YES);
70 maybe_save_then_delete_film ()
79 case Gtk::RESPONSE_CANCEL:
81 case Gtk::RESPONSE_YES:
82 film->write_metadata ();
84 case Gtk::RESPONSE_NO:
97 Gtk::FileChooserDialog c (*window, "New Film", Gtk::FILE_CHOOSER_ACTION_CREATE_FOLDER);
98 #ifdef DVDOMATIC_WINDOWS
99 c.set_current_folder (g_get_user_data_dir ());
101 c.add_button ("_Cancel", Gtk::RESPONSE_CANCEL);
102 c.add_button ("C_reate", Gtk::RESPONSE_ACCEPT);
104 int const r = c.run ();
105 if (r == Gtk::RESPONSE_ACCEPT) {
106 if (maybe_save_then_delete_film ()) {
109 film = new Film (c.get_filename ());
110 #if BOOST_FILESYSTEM_VERSION == 3
111 film->set_name (filesystem::path (c.get_filename().c_str()).filename().generic_string());
113 film->set_name (filesystem::path (c.get_filename().c_str()).filename());
115 film_viewer->set_film (film);
116 film_editor->set_film (film);
117 set_menu_sensitivity ();
124 Gtk::FileChooserDialog c (*window, "Open Film", Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER);
125 #ifdef DVDOMATIC_WINDOWS
126 c.set_current_folder (g_get_user_data_dir ());
128 c.add_button ("_Cancel", Gtk::RESPONSE_CANCEL);
129 c.add_button ("_Open", Gtk::RESPONSE_ACCEPT);
131 int const r = c.run ();
132 if (r == Gtk::RESPONSE_ACCEPT) {
133 if (maybe_save_then_delete_film ()) {
136 film = new Film (c.get_filename ());
137 film_viewer->set_film (film);
138 film_editor->set_film (film);
139 set_menu_sensitivity ();
146 film->write_metadata ();
152 if (maybe_save_then_delete_film ()) {
164 Config::instance()->write ();
170 JobWrapper::make_dcp (film, true);
174 jobs_make_dcp_from_existing_transcode ()
176 JobWrapper::make_dcp (film, false);
180 jobs_copy_from_dvd ()
184 if (d.run () != Gtk::RESPONSE_OK) {
187 film->copy_from_dvd ();
188 } catch (DVDError& e) {
189 error_dialog (e.what ());
194 jobs_send_dcp_to_tms ()
196 film->send_dcp_to_tms ();
200 jobs_examine_content ()
202 film->examine_content ();
209 d.set_name ("DVD-o-matic");
210 d.set_version (DVDOMATIC_VERSION);
213 s << "DCP generation from arbitrary formats\n\n"
214 << "Using " << dependency_version_summary() << "\n";
215 d.set_comments (s.str ());
217 vector<string> authors;
218 authors.push_back ("Carl Hetherington");
219 authors.push_back ("Terrence Meiczinger");
220 authors.push_back ("Paul Davis");
221 d.set_authors (authors);
223 d.set_website ("http://carlh.net/software/dvdomatic");
234 map<Gtk::MenuItem *, Sensitivity> menu_items;
237 add_item (Gtk::Menu_Helpers::MenuList& items, string text, sigc::slot0<void> handler, Sensitivity sens)
239 items.push_back (Gtk::Menu_Helpers::MenuElem (text, handler));
240 menu_items.insert (make_pair (&items.back(), sens));
244 set_menu_sensitivity ()
246 for (map<Gtk::MenuItem *, Sensitivity>::iterator i = menu_items.begin(); i != menu_items.end(); ++i) {
247 if (i->second == NEEDS_FILM) {
248 i->first->set_sensitive (film != 0);
250 i->first->set_sensitive (true);
256 setup_menu (Gtk::MenuBar& m)
258 using namespace Gtk::Menu_Helpers;
260 Gtk::Menu* file = manage (new Gtk::Menu);
261 MenuList& file_items (file->items ());
262 add_item (file_items, "New...", sigc::ptr_fun (file_new), ALWAYS);
263 add_item (file_items, "_Open...", sigc::ptr_fun (file_open), ALWAYS);
264 file_items.push_back (SeparatorElem ());
265 add_item (file_items, "_Save", sigc::ptr_fun (file_save), NEEDS_FILM);
266 file_items.push_back (SeparatorElem ());
267 add_item (file_items, "_Quit", sigc::ptr_fun (file_quit), ALWAYS);
269 Gtk::Menu* edit = manage (new Gtk::Menu);
270 MenuList& edit_items (edit->items ());
271 add_item (edit_items, "_Preferences...", sigc::ptr_fun (edit_preferences), ALWAYS);
273 Gtk::Menu* jobs = manage (new Gtk::Menu);
274 MenuList& jobs_items (jobs->items ());
275 add_item (jobs_items, "_Make DCP", sigc::ptr_fun (jobs_make_dcp), NEEDS_FILM);
276 add_item (jobs_items, "_Send DCP to TMS", sigc::ptr_fun (jobs_send_dcp_to_tms), NEEDS_FILM);
277 add_item (jobs_items, "Copy from _DVD...", sigc::ptr_fun (jobs_copy_from_dvd), NEEDS_FILM);
278 jobs_items.push_back (SeparatorElem ());
279 add_item (jobs_items, "_Examine content", sigc::ptr_fun (jobs_examine_content), NEEDS_FILM);
280 add_item (jobs_items, "Make DCP from _existing transcode", sigc::ptr_fun (jobs_make_dcp_from_existing_transcode), NEEDS_FILM);
282 Gtk::Menu* help = manage (new Gtk::Menu);
283 MenuList& help_items (help->items ());
284 add_item (help_items, "About", sigc::ptr_fun (help_about), ALWAYS);
286 MenuList& items (m.items ());
287 items.push_back (MenuElem ("_File", *file));
288 items.push_back (MenuElem ("_Edit", *edit));
289 items.push_back (MenuElem ("_Jobs", *jobs));
290 items.push_back (MenuElem ("_Help", *help));
294 window_closed (GdkEventAny *)
296 if (maybe_save_then_delete_film ()) {
304 file_changed (string f)
312 window->set_title (s.str ());
316 main (int argc, char* argv[])
320 Gtk::Main kit (argc, argv);
322 if (argc == 2 && boost::filesystem::is_directory (argv[1])) {
323 film = new Film (argv[1]);
326 window = new Gtk::Window ();
327 window->signal_delete_event().connect (sigc::ptr_fun (window_closed));
329 film_viewer = new FilmViewer (film);
330 film_editor = new FilmEditor (film);
331 #ifndef DVDOMATIC_DISABLE_PLAYER
332 film_player = new FilmPlayer (film);
334 JobManagerView jobs_view;
336 window->set_title ("DVD-o-matic");
340 Gtk::MenuBar menu_bar;
341 vbox.pack_start (menu_bar, false, false);
342 setup_menu (menu_bar);
343 set_menu_sensitivity ();
346 hbox.set_spacing (12);
349 left_vbox.set_spacing (12);
350 left_vbox.pack_start (film_editor->widget (), false, false);
351 #ifndef DVDOMATIC_DISABLE_PLAYER
352 left_vbox.pack_start (film_player->widget (), false, false);
354 hbox.pack_start (left_vbox, false, false);
356 Gtk::VBox right_vbox;
357 right_vbox.pack_start (film_viewer->widget (), true, true);
358 right_vbox.pack_start (jobs_view.widget(), false, false);
359 hbox.pack_start (right_vbox, true, true);
361 vbox.pack_start (hbox, true, true);
366 /* XXX: calling these here is a bit of a hack */
367 film_editor->setup_visibility ();
368 #ifndef DVDOMATIC_DISABLE_PLAYER
369 film_player->setup_visibility ();
371 film_viewer->setup_visibility ();
373 film_editor->FileChanged.connect (ptr_fun (file_changed));
375 file_changed (film->directory ());
380 /* XXX this should be in JobManagerView, shouldn't it? */
381 Glib::signal_timeout().connect (sigc::bind_return (sigc::mem_fun (jobs_view, &JobManagerView::update), true), 1000);
384 Gtk::Main::run (*window);