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 #include "gtk/film_player.h"
25 #include "gtk/job_manager_view.h"
26 #include "gtk/config_dialog.h"
28 #include "gtk/job_wrapper.h"
30 #include "lib/format.h"
31 #include "lib/config.h"
32 #include "lib/filter.h"
34 #include "lib/scaler.h"
37 using namespace boost;
39 static Gtk::Window* window = 0;
40 static FilmViewer* film_viewer = 0;
41 static FilmEditor* film_editor = 0;
42 static FilmPlayer* film_player = 0;
43 static Film* film = 0;
45 class FilmChangedDialog : public Gtk::MessageDialog
49 : Gtk::MessageDialog ("", false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE)
52 s << "Save changes to film \"" << film->name() << "\" before closing?";
53 set_message (s.str ());
54 add_button ("Close _without saving", Gtk::RESPONSE_NO);
55 add_button ("_Cancel", Gtk::RESPONSE_CANCEL);
56 add_button ("_Save", Gtk::RESPONSE_YES);
61 maybe_save_then_delete_film ()
70 case Gtk::RESPONSE_CANCEL:
72 case Gtk::RESPONSE_YES:
73 film->write_metadata ();
75 case Gtk::RESPONSE_NO:
88 Gtk::FileChooserDialog c (*window, "New Film", Gtk::FILE_CHOOSER_ACTION_CREATE_FOLDER);
89 c.add_button ("_Cancel", Gtk::RESPONSE_CANCEL);
90 c.add_button ("C_reate", Gtk::RESPONSE_ACCEPT);
92 int const r = c.run ();
93 if (r == Gtk::RESPONSE_ACCEPT) {
94 if (maybe_save_then_delete_film ()) {
97 film = new Film (c.get_filename ());
98 #if BOOST_FILESYSTEM_VERSION == 3
99 film->set_name (filesystem::path (c.get_filename().c_str()).filename().generic_string());
101 film->set_name (filesystem::path (c.get_filename().c_str()).filename());
103 film_viewer->set_film (film);
104 film_editor->set_film (film);
111 Gtk::FileChooserDialog c (*window, "Open Film", Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER);
112 c.add_button ("_Cancel", Gtk::RESPONSE_CANCEL);
113 c.add_button ("_Open", Gtk::RESPONSE_ACCEPT);
115 int const r = c.run ();
116 if (r == Gtk::RESPONSE_ACCEPT) {
117 if (maybe_save_then_delete_film ()) {
120 film = new Film (c.get_filename ());
121 film_viewer->set_film (film);
122 film_editor->set_film (film);
129 film->write_metadata ();
135 if (maybe_save_then_delete_film ()) {
147 Config::instance()->write ();
153 JobWrapper::make_dcp (film, true);
157 jobs_make_dcp_from_existing_transcode ()
159 JobWrapper::make_dcp (film, false);
163 jobs_copy_from_dvd ()
165 film->copy_from_dvd ();
169 jobs_send_dcp_to_tms ()
171 film->send_dcp_to_tms ();
175 jobs_examine_content ()
177 film->examine_content ();
184 d.set_name ("DVD-o-matic");
185 d.set_version (DVDOMATIC_VERSION);
188 s << "DCP generation from arbitrary formats\n\n"
189 << "Using " << dependency_version_summary() << "\n";
190 d.set_comments (s.str ());
192 vector<string> authors;
193 authors.push_back ("Carl Hetherington");
194 authors.push_back ("Terrence Meiczinger");
195 authors.push_back ("Paul Davis");
196 d.set_authors (authors);
198 d.set_website ("http://carlh.net/software/dvdomatic");
205 setup_menu (Gtk::MenuBar& m)
207 using namespace Gtk::Menu_Helpers;
209 Gtk::Menu* file = manage (new Gtk::Menu);
210 MenuList& file_items (file->items ());
211 file_items.push_back (MenuElem ("_New...", sigc::ptr_fun (file_new)));
212 file_items.push_back (MenuElem ("_Open...", sigc::ptr_fun (file_open)));
213 file_items.push_back (SeparatorElem ());
214 file_items.push_back (MenuElem ("_Save", sigc::ptr_fun (file_save)));
215 file_items.push_back (SeparatorElem ());
216 file_items.push_back (MenuElem ("_Quit", sigc::ptr_fun (file_quit)));
218 Gtk::Menu* edit = manage (new Gtk::Menu);
219 MenuList& edit_items (edit->items ());
220 edit_items.push_back (MenuElem ("_Preferences...", sigc::ptr_fun (edit_preferences)));
222 Gtk::Menu* jobs = manage (new Gtk::Menu);
223 MenuList& jobs_items (jobs->items ());
224 jobs_items.push_back (MenuElem ("_Make DCP", sigc::ptr_fun (jobs_make_dcp)));
225 jobs_items.push_back (MenuElem ("_Send DCP to TMS", sigc::ptr_fun (jobs_send_dcp_to_tms)));
226 jobs_items.push_back (MenuElem ("Copy from _DVD", sigc::ptr_fun (jobs_copy_from_dvd)));
227 jobs_items.push_back (MenuElem ("_Examine content", sigc::ptr_fun (jobs_examine_content)));
228 jobs_items.push_back (MenuElem ("Make DCP from _existing transcode", sigc::ptr_fun (jobs_make_dcp_from_existing_transcode)));
230 Gtk::Menu* help = manage (new Gtk::Menu);
231 MenuList& help_items (help->items ());
232 help_items.push_back (MenuElem ("_About", sigc::ptr_fun (help_about)));
234 MenuList& items (m.items ());
235 items.push_back (MenuElem ("_File", *file));
236 items.push_back (MenuElem ("_Edit", *edit));
237 items.push_back (MenuElem ("_Jobs", *jobs));
238 items.push_back (MenuElem ("_Help", *help));
242 window_closed (GdkEventAny *)
244 if (maybe_save_then_delete_film ()) {
252 file_changed (string f)
260 window->set_title (s.str ());
264 main (int argc, char* argv[])
268 Gtk::Main kit (argc, argv);
270 if (argc == 2 && boost::filesystem::is_directory (argv[1])) {
271 film = new Film (argv[1]);
274 window = new Gtk::Window ();
275 window->signal_delete_event().connect (sigc::ptr_fun (window_closed));
277 film_viewer = new FilmViewer (film);
278 film_editor = new FilmEditor (film);
279 film_player = new FilmPlayer (film);
280 JobManagerView jobs_view;
282 window->set_title ("DVD-o-matic");
286 Gtk::MenuBar menu_bar;
287 vbox.pack_start (menu_bar, false, false);
288 setup_menu (menu_bar);
291 hbox.set_spacing (12);
294 left_vbox.set_spacing (12);
295 left_vbox.pack_start (film_editor->widget (), false, false);
296 // left_vbox.pack_start (film_player->widget (), false, false);
297 hbox.pack_start (left_vbox, false, false);
299 Gtk::VBox right_vbox;
300 right_vbox.pack_start (film_viewer->widget (), true, true);
301 right_vbox.pack_start (jobs_view.widget(), false, false);
302 hbox.pack_start (right_vbox, true, true);
304 vbox.pack_start (hbox, true, true);
309 /* XXX: calling these here is a bit of a hack */
310 film_editor->setup_visibility ();
311 film_player->setup_visibility ();
312 film_viewer->setup_visibility ();
314 film_editor->FileChanged.connect (ptr_fun (file_changed));
316 file_changed (film->directory ());
321 /* XXX this should be in JobManagerView, shouldn't it? */
322 Glib::signal_timeout().connect (sigc::bind_return (sigc::mem_fun (jobs_view, &JobManagerView::update), true), 1000);
325 Gtk::Main::run (*window);