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 "wx/film_viewer.h"
23 #include "wx/film_editor.h"
24 #ifndef DVDOMATIC_DISABLE_PLAYER
25 #include "wx/film_player.h"
27 //#include "gtk/job_manager_view.h"
28 //#include "gtk/config_dialog.h"
29 //#include "gtk/gpl.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 FilmEditor* film_editor = 0;
45 static FilmViewer* film_viewer = 0;
49 static Gtk::Window* window = 0;
50 #ifndef DVDOMATIC_DISABLE_PLAYER
51 static FilmPlayer* film_player = 0;
53 static Film* film = 0;
55 static void set_menu_sensitivity ();
57 class FilmChangedDialog : public Gtk::MessageDialog
61 : Gtk::MessageDialog ("", false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE)
64 s << "Save changes to film \"" << film->name() << "\" before closing?";
65 set_message (s.str ());
66 add_button ("Close _without saving", Gtk::RESPONSE_NO);
67 add_button ("_Cancel", Gtk::RESPONSE_CANCEL);
68 add_button ("_Save", Gtk::RESPONSE_YES);
73 maybe_save_then_delete_film ()
82 case Gtk::RESPONSE_CANCEL:
84 case Gtk::RESPONSE_YES:
85 film->write_metadata ();
87 case Gtk::RESPONSE_NO:
100 Gtk::FileChooserDialog c (*window, "New Film", Gtk::FILE_CHOOSER_ACTION_CREATE_FOLDER);
101 #ifdef DVDOMATIC_WINDOWS
102 c.set_current_folder (g_get_user_data_dir ());
104 c.add_button ("_Cancel", Gtk::RESPONSE_CANCEL);
105 c.add_button ("C_reate", Gtk::RESPONSE_ACCEPT);
107 int const r = c.run ();
108 if (r == Gtk::RESPONSE_ACCEPT) {
109 if (maybe_save_then_delete_film ()) {
112 film = new Film (c.get_filename ());
113 #if BOOST_FILESYSTEM_VERSION == 3
114 film->set_name (filesystem::path (c.get_filename().c_str()).filename().generic_string());
116 film->set_name (filesystem::path (c.get_filename().c_str()).filename());
118 film_viewer->set_film (film);
119 film_editor->set_film (film);
120 set_menu_sensitivity ();
127 Gtk::FileChooserDialog c (*window, "Open Film", Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER);
128 #ifdef DVDOMATIC_WINDOWS
129 c.set_current_folder (g_get_user_data_dir ());
131 c.add_button ("_Cancel", Gtk::RESPONSE_CANCEL);
132 c.add_button ("_Open", Gtk::RESPONSE_ACCEPT);
134 int const r = c.run ();
135 if (r == Gtk::RESPONSE_ACCEPT) {
136 if (maybe_save_then_delete_film ()) {
139 film = new Film (c.get_filename ());
140 film_viewer->set_film (film);
141 film_editor->set_film (film);
142 set_menu_sensitivity ();
149 film->write_metadata ();
155 if (maybe_save_then_delete_film ()) {
167 Config::instance()->write ();
173 JobWrapper::make_dcp (film, true);
177 jobs_make_dcp_from_existing_transcode ()
179 JobWrapper::make_dcp (film, false);
183 jobs_copy_from_dvd ()
187 if (d.run () != Gtk::RESPONSE_OK) {
190 film->copy_from_dvd ();
191 } catch (DVDError& e) {
192 error_dialog (e.what ());
197 jobs_send_dcp_to_tms ()
199 film->send_dcp_to_tms ();
203 jobs_examine_content ()
205 film->examine_content ();
212 d.set_name ("DVD-o-matic");
213 d.set_version (DVDOMATIC_VERSION);
216 s << "DCP generation from arbitrary formats\n\n"
217 << "Using " << dependency_version_summary() << "\n";
218 d.set_comments (s.str ());
220 vector<string> authors;
221 authors.push_back ("Carl Hetherington");
222 authors.push_back ("Terrence Meiczinger");
223 authors.push_back ("Paul Davis");
224 d.set_authors (authors);
226 d.set_website ("http://carlh.net/software/dvdomatic");
237 map<Gtk::MenuItem *, Sensitivity> menu_items;
240 add_item (Gtk::Menu_Helpers::MenuList& items, string text, sigc::slot0<void> handler, Sensitivity sens)
242 items.push_back (Gtk::Menu_Helpers::MenuElem (text, handler));
243 menu_items.insert (make_pair (&items.back(), sens));
247 set_menu_sensitivity ()
249 for (map<Gtk::MenuItem *, Sensitivity>::iterator i = menu_items.begin(); i != menu_items.end(); ++i) {
250 if (i->second == NEEDS_FILM) {
251 i->first->set_sensitive (film != 0);
253 i->first->set_sensitive (true);
259 setup_menu (Gtk::MenuBar& m)
261 using namespace Gtk::Menu_Helpers;
263 Gtk::Menu* file = manage (new Gtk::Menu);
264 MenuList& file_items (file->items ());
265 add_item (file_items, "New...", sigc::ptr_fun (file_new), ALWAYS);
266 add_item (file_items, "_Open...", sigc::ptr_fun (file_open), ALWAYS);
267 file_items.push_back (SeparatorElem ());
268 add_item (file_items, "_Save", sigc::ptr_fun (file_save), NEEDS_FILM);
269 file_items.push_back (SeparatorElem ());
270 add_item (file_items, "_Quit", sigc::ptr_fun (file_quit), ALWAYS);
272 Gtk::Menu* edit = manage (new Gtk::Menu);
273 MenuList& edit_items (edit->items ());
274 add_item (edit_items, "_Preferences...", sigc::ptr_fun (edit_preferences), ALWAYS);
276 Gtk::Menu* jobs = manage (new Gtk::Menu);
277 MenuList& jobs_items (jobs->items ());
278 add_item (jobs_items, "_Make DCP", sigc::ptr_fun (jobs_make_dcp), NEEDS_FILM);
279 add_item (jobs_items, "_Send DCP to TMS", sigc::ptr_fun (jobs_send_dcp_to_tms), NEEDS_FILM);
280 add_item (jobs_items, "Copy from _DVD...", sigc::ptr_fun (jobs_copy_from_dvd), NEEDS_FILM);
281 jobs_items.push_back (SeparatorElem ());
282 add_item (jobs_items, "_Examine content", sigc::ptr_fun (jobs_examine_content), NEEDS_FILM);
283 add_item (jobs_items, "Make DCP from _existing transcode", sigc::ptr_fun (jobs_make_dcp_from_existing_transcode), NEEDS_FILM);
285 Gtk::Menu* help = manage (new Gtk::Menu);
286 MenuList& help_items (help->items ());
287 add_item (help_items, "About", sigc::ptr_fun (help_about), ALWAYS);
289 MenuList& items (m.items ());
290 items.push_back (MenuElem ("_File", *file));
291 items.push_back (MenuElem ("_Edit", *edit));
292 items.push_back (MenuElem ("_Jobs", *jobs));
293 items.push_back (MenuElem ("_Help", *help));
297 window_closed (GdkEventAny *)
299 if (maybe_save_then_delete_film ()) {
307 file_changed (string f)
315 window->set_title (s.str ());
325 class Frame : public wxFrame
328 Frame (wxString const & title)
329 : wxFrame (NULL, -1, title)
331 wxMenuBar* bar = new wxMenuBar;
334 wxMenu *menu_file = new wxMenu;
335 menu_file->Append (ID_Quit, _("&Quit"));
337 bar->Append (menu_file, _("&File"));
342 SetStatusText (_("Welcome to DVD-o-matic!"));
345 void quit (wxCommandEvent& event)
351 class App : public wxApp
355 if (!wxApp::OnInit ()) {
359 wxInitAllImageHandlers ();
363 // if (argc == 2 && boost::filesystem::is_directory (argv[1])) {
364 // film = new Film (argv[1]);
367 Film* film = new Film ("/home/carl/DCP/BitHarvest");
369 Frame* frame = new Frame (_("DVD-o-matic"));
373 ID_Quit, wxEVT_COMMAND_MENU_SELECTED,
374 (wxObjectEventFunction) &Frame::quit
377 film_editor = new FilmEditor (film, frame);
378 film_editor->Show (true);
379 film_viewer = new FilmViewer (film, frame);
380 film_viewer->Show (true);
381 #ifndef DVDOMATIC_DISABLE_PLAYER
382 film_player = new FilmPlayer (film, frame);
385 wxBoxSizer* main_sizer = new wxBoxSizer (wxHORIZONTAL);
386 main_sizer->Add (film_editor, 0);
387 main_sizer->Add (film_viewer, 1, wxEXPAND);
388 frame->SetSizer (main_sizer);
390 SetTopWindow (frame);
394 /* XXX: calling these here is a bit of a hack */
395 film_editor->setup_visibility ();
396 #ifndef DVDOMATIC_DISABLE_PLAYER
397 film_player->setup_visibility ();
399 film_viewer->setup_visibility ();
401 film_editor->FileChanged.connect (ptr_fun (file_changed));
403 file_changed (film->directory ());
409 /* XXX this should be in JobManagerView, shouldn't it? */
410 //XXX Glib::signal_timeout().connect (sigc::bind_return (sigc::mem_fun (jobs_view, &JobManagerView::update), true), 1000);