Slightly better errors when the player fails to load a DCP.
[dcpomatic.git] / src / tools / dcpomatic_player.cc
index cd941e93557deab2cc53344204f5022fdc88dcd5..cdacee7848f288e34ab9bb5cbf7471e841e406c9 100644 (file)
@@ -30,6 +30,7 @@
 #include "wx/standard_controls.h"
 #include "wx/swaroop_controls.h"
 #include "wx/timer_display.h"
+#include "wx/system_information_dialog.h"
 #include "lib/cross.h"
 #include "lib/config.h"
 #include "lib/util.h"
@@ -111,6 +112,7 @@ enum {
        ID_tools_verify,
        ID_tools_check_for_updates,
        ID_tools_timing,
+       ID_tools_system_information,
        /* IDs for shortcuts (with no associated menu item) */
        ID_start_stop,
        ID_back_frame,
@@ -131,6 +133,7 @@ public:
                , _history_items (0)
                , _history_position (0)
                , _history_separator (0)
+               , _system_information_dialog (0)
                , _view_full_screen (0)
                , _view_dual_screen (0)
        {
@@ -172,6 +175,7 @@ public:
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_verify, this), ID_tools_verify);
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_check_for_updates, this), ID_tools_check_for_updates);
                Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_timing, this), ID_tools_timing);
+               Bind (wxEVT_MENU, boost::bind (&DOMFrame::tools_system_information, this), ID_tools_system_information);
 
                /* Use a panel as the only child of the Frame so that we avoid
                   the dark-grey background on Windows.
@@ -283,6 +287,15 @@ public:
                        }
                }
 
+#ifdef DCPOMATIC_VARIANT_SWAROOP
+               BOOST_FOREACH (shared_ptr<Content> i, _film->content()) {
+                       shared_ptr<FFmpegContent> c = dynamic_pointer_cast<FFmpegContent>(i);
+                       if (c && !c->kdm_timing_window_valid()) {
+                               ok = false;
+                       }
+               }
+#endif
+
                if (!ok) {
                        error_dialog (this, _("The KDM does not allow playback of this content at this time."));
                }
@@ -451,6 +464,21 @@ public:
 
 private:
 
+       bool report_errors_from_last_job (wxWindow* parent) const
+       {
+               JobManager* jm = JobManager::instance ();
+
+               DCPOMATIC_ASSERT (!jm->get().empty());
+
+               shared_ptr<Job> last = jm->get().back();
+               if (last->finished_in_error()) {
+                       error_dialog(parent, wxString::Format(_("Could not load DCP.\n\n%s."), std_to_wx(last->error_summary()).data()), std_to_wx(last->error_details()));
+                       return false;
+               }
+
+               return true;
+       }
+
        void setup_menu (wxMenuBar* m)
        {
                _file_menu = new wxMenu;
@@ -503,6 +531,7 @@ private:
                tools->AppendSeparator ();
                tools->Append (ID_tools_check_for_updates, _("Check for updates"));
                tools->Append (ID_tools_timing, _("Timing..."));
+               tools->Append (ID_tools_system_information, _("System information..."));
 
                wxMenu* help = new wxMenu;
 #ifdef __WXOSX__
@@ -796,6 +825,15 @@ private:
                d->Destroy ();
        }
 
+       void tools_system_information ()
+       {
+               if (!_system_information_dialog) {
+                       _system_information_dialog = new SystemInformationDialog (this, _viewer);
+               }
+
+               _system_information_dialog->Show ();
+       }
+
        void help_about ()
        {
                AboutDialog* d = new AboutDialog (this);
@@ -953,6 +991,7 @@ private:
        wxMenuItem* _history_separator;
        shared_ptr<FilmViewer> _viewer;
        Controls* _controls;
+       SystemInformationDialog* _system_information_dialog;
        boost::shared_ptr<Film> _film;
        boost::signals2::scoped_connection _config_changed_connection;
        wxMenuItem* _file_add_ov;