-
- _panel->SetBackgroundStyle (wxBG_STYLE_PAINT);
-
- _v_sizer = new wxBoxSizer (wxVERTICAL);
- SetSizer (_v_sizer);
-
- _v_sizer->Add (_panel, 1, wxEXPAND);
-
- wxBoxSizer* h_sizer = new wxBoxSizer (wxHORIZONTAL);
-
- wxBoxSizer* time_sizer = new wxBoxSizer (wxVERTICAL);
- time_sizer->Add (_frame_number, 0, wxEXPAND);
- time_sizer->Add (_timecode, 0, wxEXPAND);
-
- h_sizer->Add (_back_button, 0, wxALL, 2);
- h_sizer->Add (time_sizer, 0, wxEXPAND);
- h_sizer->Add (_forward_button, 0, wxALL, 2);
- h_sizer->Add (_play_button, 0, wxEXPAND);
- h_sizer->Add (_slider, 1, wxEXPAND);
-
- _v_sizer->Add (h_sizer, 0, wxEXPAND | wxALL, 6);
-
- _frame_number->SetMinSize (wxSize (84, -1));
- _back_button->SetMinSize (wxSize (32, -1));
- _forward_button->SetMinSize (wxSize (32, -1));
-
- _panel->Bind (wxEVT_PAINT, boost::bind (&FilmViewer::paint_panel, this));
- _panel->Bind (wxEVT_SIZE, boost::bind (&FilmViewer::panel_sized, this, _1));
- _slider->Bind (wxEVT_SCROLL_THUMBTRACK, boost::bind (&FilmViewer::slider_moved, this));
- _slider->Bind (wxEVT_SCROLL_PAGEUP, boost::bind (&FilmViewer::slider_moved, this));
- _slider->Bind (wxEVT_SCROLL_PAGEDOWN, boost::bind (&FilmViewer::slider_moved, this));
- _play_button->Bind (wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, boost::bind (&FilmViewer::play_clicked, this));
- _timer.Bind (wxEVT_TIMER, boost::bind (&FilmViewer::timer, this));
- _back_button->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&FilmViewer::back_clicked, this));
- _forward_button->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&FilmViewer::forward_clicked, this));
-
- set_film (f);
-
- JobManager::instance()->ActiveJobsChanged.connect (
- bind (&FilmViewer::active_jobs_changed, this, _1)
- );
+ , _idle_get (false)
+{
+ switch (Config::instance()->video_view_type()) {
+ case Config::VIDEO_VIEW_OPENGL:
+ _video_view = new GLVideoView (this, p);
+ break;
+ case Config::VIDEO_VIEW_SIMPLE:
+ _video_view = new SimpleVideoView (this, p);
+ break;
+ }
+
+ _video_view->Sized.connect (boost::bind(&FilmViewer::video_view_sized, this));
+
+ set_film (shared_ptr<Film> ());
+
+ _config_changed_connection = Config::instance()->Changed.connect (bind (&FilmViewer::config_changed, this, _1));
+ config_changed (Config::SOUND_OUTPUT);
+}
+
+FilmViewer::~FilmViewer ()
+{
+ stop ();
+}
+
+/** Ask for ::get() to be called next time we are idle */
+void
+FilmViewer::request_idle_display_next_frame ()
+{
+ if (_idle_get) {
+ return;
+ }
+
+ _idle_get = true;
+ DCPOMATIC_ASSERT (signal_manager);
+ signal_manager->when_idle (boost::bind(&FilmViewer::idle_handler, this));
+}
+
+void
+FilmViewer::idle_handler ()
+{
+ if (!_idle_get) {
+ return;
+ }
+
+ if (_video_view->display_next_frame(true)) {
+ _idle_get = false;
+ } else {
+ /* get() could not complete quickly so we'll try again later */
+ signal_manager->when_idle (boost::bind(&FilmViewer::idle_handler, this));
+ }