Merge master.
[dcpomatic.git] / src / tools / dcpomatic.cc
index 4312139f1498a9c19b3e358a87733076045c6b31..ebd647861817ea98cacdf3289ae189e378796aaf 100644 (file)
@@ -23,6 +23,9 @@
 #ifdef __WXMSW__
 #include <shellapi.h>
 #endif
+#ifdef __WXOSX__
+#include <ApplicationServices/ApplicationServices.h>
+#endif
 #include <wx/aboutdlg.h>
 #include <wx/stdpaths.h>
 #include <wx/cmdline.h>
 #include "wx/properties_dialog.h"
 #include "wx/wx_ui_signaller.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"
-#include "lib/exceptions.h"
 #include "lib/version.h"
 #include "lib/ui_signaller.h"
 #include "lib/log.h"
@@ -63,7 +62,6 @@ static std::string log_level;
 static std::string film_to_load;
 static std::string film_to_create;
 static wxMenu* jobs_menu = 0;
-static wxLocale* locale = 0;
 
 static void set_menu_sensitivity ();
 
@@ -147,13 +145,10 @@ enum {
        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_show_dcp,
        ID_jobs_analyse_audio,
-       ID_help_about
 };
 
 void
@@ -166,11 +161,17 @@ setup_menu (wxMenuBar* m)
        add_item (file, _("&Save"), ID_file_save, NEEDS_FILM);
        file->AppendSeparator ();
        add_item (file, _("&Properties..."), ID_file_properties, NEEDS_FILM);
+#ifndef __WXOSX__      
        file->AppendSeparator ();
-       add_item (file, _("&Quit"), ID_file_quit, ALWAYS);
+#endif 
+       add_item (file, _("&Exit"), wxID_EXIT, ALWAYS);
 
+#ifdef __WXOSX__       
+       add_item (file, _("&Preferences..."), wxID_PREFERENCES, ALWAYS);
+#else
        wxMenu* edit = new wxMenu;
-       add_item (edit, _("&Preferences..."), ID_edit_preferences, ALWAYS);
+       add_item (edit, _("&Preferences..."), wxID_PREFERENCES, ALWAYS);
+#endif 
 
        jobs_menu = new wxMenu;
        add_item (jobs_menu, _("&Make DCP"), ID_jobs_make_dcp, NEEDS_FILM);
@@ -180,10 +181,16 @@ setup_menu (wxMenuBar* m)
        add_item (jobs_menu, _("&Analyse audio"), ID_jobs_analyse_audio, NEEDS_FILM);
 
        wxMenu* help = new wxMenu;
-       add_item (help, _("About"), ID_help_about, ALWAYS);
+#ifdef __WXOSX__       
+       add_item (help, _("About DVD-o-matic"), wxID_ABOUT, ALWAYS);
+#else  
+       add_item (help, _("About"), wxID_ABOUT, ALWAYS);
+#endif 
 
        m->Append (file, _("&File"));
+#ifndef __WXOSX__      
        m->Append (edit, _("&Edit"));
+#endif 
        m->Append (jobs_menu, _("&Jobs"));
        m->Append (help, _("&Help"));
 }
@@ -209,33 +216,27 @@ public:
                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 (wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::file_exit));
+               Connect (wxID_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_show_dcp, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::jobs_show_dcp));
                Connect (ID_jobs_analyse_audio, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::jobs_analyse_audio));
-               Connect (ID_help_about, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::help_about));
+               Connect (wxID_ABOUT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler (Frame::help_about));
 
                Connect (wxID_ANY, wxEVT_MENU_OPEN, wxMenuEventHandler (Frame::menu_opened));
 
-               wxPanel* panel = new wxPanel (this);
-               wxSizer* s = new wxBoxSizer (wxHORIZONTAL);
-               s->Add (panel, 1, wxEXPAND);
-               SetSizer (s);
+               film_editor = new FilmEditor (film, this);
+               film_viewer = new FilmViewer (film, this);
+               JobManagerView* job_manager_view = new JobManagerView (this, static_cast<JobManagerView::Buttons> (0));
 
-               film_editor = new FilmEditor (film, panel);
-               film_viewer = new FilmViewer (film, panel);
-               JobManagerView* job_manager_view = new JobManagerView (panel);
+               wxBoxSizer* right_sizer = new wxBoxSizer (wxVERTICAL);
+               right_sizer->Add (film_viewer, 2, wxEXPAND | wxALL, 6);
+               right_sizer->Add (job_manager_view, 1, wxEXPAND | wxALL, 6);
 
-               _top_sizer = new wxBoxSizer (wxHORIZONTAL);
-               _top_sizer->Add (film_editor, 0, wxALL, 6);
-               _top_sizer->Add (film_viewer, 1, wxEXPAND | wxALL, 6);
-
-               wxBoxSizer* main_sizer = new wxBoxSizer (wxVERTICAL);
-               main_sizer->Add (_top_sizer, 2, wxEXPAND | wxALL, 6);
-               main_sizer->Add (job_manager_view, 1, wxEXPAND | wxALL, 6);
-               panel->SetSizer (main_sizer);
+               wxBoxSizer* main_sizer = new wxBoxSizer (wxHORIZONTAL);
+               main_sizer->Add (film_editor, 1, wxEXPAND | wxALL, 6);
+               main_sizer->Add (right_sizer, 2, wxEXPAND | wxALL, 6);
 
                set_menu_sensitivity ();
 
@@ -247,22 +248,11 @@ public:
                }
 
                set_film ();
-
-               film_editor->Connect (wxID_ANY, wxEVT_SIZE, wxSizeEventHandler (Frame::film_editor_sized), 0, this);
+               SetSizer (main_sizer);
        }
 
 private:
 
-       void film_editor_sized (wxSizeEvent &)
-       {
-               static bool in_layout = false;
-               if (!in_layout) {
-                       in_layout = true;
-                       _top_sizer->Layout ();
-                       in_layout = false;
-               }
-       }
-
        void menu_opened (wxMenuEvent& ev)
        {
                if (ev.GetMenu() != jobs_menu) {
@@ -313,7 +303,8 @@ private:
                        }
                        
                        maybe_save_then_delete_film ();
-                       film.reset (new Film (d->get_path (), false));
+                       film.reset (new Film (d->get_path ()));
+                       film->write_metadata ();
                        film->log()->set_level (log_level);
                        film->set_name (boost::filesystem::path (d->get_path()).filename().generic_string());
                        set_film ();
@@ -363,7 +354,7 @@ private:
                d->Destroy ();
        }
        
-       void file_quit (wxCommandEvent &)
+       void file_exit (wxCommandEvent &)
        {
                maybe_save_then_delete_film ();
                Close (true);
@@ -443,8 +434,6 @@ private:
                info.SetWebSite (wxT ("http://carlh.net/software/dcpomatic"));
                wxAboutBox (info);
        }
-
-       wxSizer* _top_sizer;
 };
 
 #if wxMINOR_VERSION == 9
@@ -463,49 +452,6 @@ static const wxCmdLineEntryDesc command_line_description[] = {
 };
 #endif
 
-void
-setup_i18n ()
-{
-       int language = wxLANGUAGE_DEFAULT;
-
-       ofstream f ("c:/users/carl hetherington/foo", std::ios::app);
-       f << "Hello.\n";
-
-       boost::optional<string> config_lang = Config::instance()->language ();
-       if (config_lang && !config_lang->empty ()) {
-               f << "Configured language " << config_lang.get() << "\n";
-               wxLanguageInfo const * li = wxLocale::FindLanguageInfo (std_to_wx (config_lang.get ()));
-               f << "LanguageInfo " << li << "\n";
-               if (li) {
-                       language = li->Language;
-                       f << "language=" << language << " cf " << wxLANGUAGE_DEFAULT << " " << wxLANGUAGE_ENGLISH << "\n";
-               }
-       }
-       if (wxLocale::IsAvailable (language)) {
-               f << "Language is available.\n";
-               locale = new wxLocale (language, wxLOCALE_LOAD_DEFAULT);
-
-#ifdef DCPOMATIC_WINDOWS
-               locale->AddCatalogLookupPathPrefix (std_to_wx (mo_path().string()));
-#endif         
-
-               locale->AddCatalog (wxT ("libdcpomatic-wx"));
-               locale->AddCatalog (wxT ("dcpomatic"));
-               
-               if (!locale->IsOk()) {
-                       f << "Locale is not ok.\n";
-                       delete locale;
-                       locale = new wxLocale (wxLANGUAGE_ENGLISH);
-                       language = wxLANGUAGE_ENGLISH;
-               }
-       }
-
-       if (locale) {
-               dcpomatic_setup_i18n (wx_to_std (locale->GetCanonicalName ()));
-       }
-}
-
 class App : public wxApp
 {
        bool OnInit ()
@@ -516,6 +462,12 @@ class App : public wxApp
                
 #ifdef DCPOMATIC_POSIX         
                unsetenv ("UBUNTU_MENUPROXY");
+#endif
+
+#ifdef __WXOSX__               
+               ProcessSerialNumber serial;
+               GetCurrentProcess (&serial);
+               TransformProcessType (&serial, kProcessTransformToForegroundApplication);
 #endif         
 
                wxInitAllImageHandlers ();
@@ -526,7 +478,7 @@ class App : public wxApp
                   hasn't yet been called and there aren't any scalers, filters etc.
                   set up yet.
                */
-               setup_i18n ();
+               dcpomatic_setup_i18n ();
 
                /* Set things up, including scalers / filters etc.
                   which will now be internationalised correctly.
@@ -541,6 +493,7 @@ class App : public wxApp
                if (!film_to_load.empty() && boost::filesystem::is_directory (film_to_load)) {
                        try {
                                film.reset (new Film (film_to_load));
+                               film->read_metadata ();
                                film->log()->set_level (log_level);
                        } catch (exception& e) {
                                error_dialog (0, std_to_wx (String::compose (wx_to_std (_("Could not load film %1 (%2)")), film_to_load, e.what())));
@@ -548,7 +501,8 @@ class App : public wxApp
                }
 
                if (!film_to_create.empty ()) {
-                       film.reset (new Film (film_to_create, false));
+                       film.reset (new Film (film_to_create));
+                       film->write_metadata ();
                        film->log()->set_level (log_level);
                        film->set_name (boost::filesystem::path (film_to_create).filename().generic_string ());
                }