X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Ffilm_viewer.cc;h=db72e6c6037fb759ff43b1587830fe878119e9b4;hb=69e46a5803c9c015f3da4153340b3d4554deea2e;hp=3113a1e057f7a0848315a189e95b8056230b5dc9;hpb=23583dfb56181c76126e652042e9d1940367aa27;p=dcpomatic.git diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index 3113a1e05..db72e6c60 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -73,43 +73,32 @@ rtaudio_callback (void* out, void *, unsigned int frames, double, RtAudioStreamS return reinterpret_cast(data)->audio_callback (out, frames); } -FilmViewer::FilmViewer (wxWindow* p, bool outline_content, bool jump_to_selected) +FilmViewer::FilmViewer (wxWindow* p) : _panel (new wxPanel (p)) - , _outline_content (0) - , _eye (0) - , _jump_to_selected (0) , _coalesce_player_changes (false) - , _slider_being_moved (false) - , _was_running_before_slider (false) , _audio (DCPOMATIC_RTAUDIO_API) , _audio_channels (0) , _audio_block_size (1024) , _playing (false) , _latency_history_count (0) , _dropped (0) - , _closed_captions_dialog (new ClosedCaptionsDialog(GetParent())) + , _closed_captions_dialog (new ClosedCaptionsDialog(p)) + , _outline_content (false) + , _eyes (EYES_LEFT) { #ifndef __WXOSX__ _panel->SetDoubleBuffered (true); #endif _panel->SetBackgroundStyle (wxBG_STYLE_PAINT); + _panel->SetBackgroundColour (wxNullColour); - _panel->Bind (wxEVT_PAINT, boost::bind (&FilmViewer::paint_panel, this)); - _panel->Bind (wxEVT_SIZE, boost::bind (&FilmViewer::panel_sized, this, _1)); - if (_outline_content) { - _outline_content->Bind (wxEVT_CHECKBOX, boost::bind (&FilmViewer::refresh_panel, this)); - } - _timer.Bind (wxEVT_TIMER, boost::bind (&FilmViewer::timer, this)); + _panel->Bind (wxEVT_PAINT, boost::bind (&FilmViewer::paint_panel, this)); + _panel->Bind (wxEVT_SIZE, boost::bind (&FilmViewer::panel_sized, this, _1)); + _timer.Bind (wxEVT_TIMER, boost::bind (&FilmViewer::timer, this)); set_film (shared_ptr ()); - JobManager::instance()->ActiveJobsChanged.connect ( - bind (&FilmViewer::active_jobs_changed, this, _2) - ); - - setup_sensitivity (); - _config_changed_connection = Config::instance()->Changed.connect (bind (&FilmViewer::config_changed, this, _1)); config_changed (Config::SOUND_OUTPUT); } @@ -128,6 +117,8 @@ FilmViewer::set_film (shared_ptr film) _film = film; + FilmChanged (); + _frame.reset (); _closed_captions_dialog->clear (); @@ -146,7 +137,7 @@ FilmViewer::set_film (shared_ptr film) _player->set_dcp_decode_reduction (_dcp_decode_reduction); } } catch (bad_alloc) { - error_dialog (this, _("There is not enough free memory to do that.")); + error_dialog (_panel, _("There is not enough free memory to do that.")); _film.reset (); return; } @@ -164,8 +155,6 @@ FilmViewer::set_film (shared_ptr film) calculate_sizes (); slow_refresh (); - - setup_sensitivity (); } void @@ -233,7 +222,7 @@ FilmViewer::get () } while ( _player_video.first && _film->three_d() && - ((_eye->GetSelection() == 0 && _player_video.first->eyes() == EYES_RIGHT) || (_eye->GetSelection() == 1 && _player_video.first->eyes() == EYES_LEFT)) + (_eyes != _player_video.first->eyes()) ); _butler->rethrow (); @@ -302,8 +291,7 @@ FilmViewer::timer () } get (); - update_position_label (); - update_position_slider (); + PositionChanged (); DCPTime const next = _video_position + one_video_frame(); if (next >= _film->length()) { @@ -329,25 +317,27 @@ FilmViewer::paint_panel () wxImage frame (_out_size.width, _out_size.height, _frame->data()[0], true); wxBitmap frame_bitmap (frame); - dc.DrawBitmap (frame_bitmap, 0, 0); + dc.DrawBitmap (frame_bitmap, 0, max(0, (_panel_size.height - _out_size.height) / 2)); if (_out_size.width < _panel_size.width) { - wxPen p (GetBackgroundColour ()); - wxBrush b (GetBackgroundColour ()); + wxPen p (_panel->GetParent()->GetBackgroundColour()); + wxBrush b (_panel->GetParent()->GetBackgroundColour()); dc.SetPen (p); dc.SetBrush (b); dc.DrawRectangle (_out_size.width, 0, _panel_size.width - _out_size.width, _panel_size.height); } if (_out_size.height < _panel_size.height) { - wxPen p (GetBackgroundColour ()); - wxBrush b (GetBackgroundColour ()); + wxPen p (_panel->GetParent()->GetBackgroundColour()); + wxBrush b (_panel->GetParent()->GetBackgroundColour()); dc.SetPen (p); dc.SetBrush (b); - dc.DrawRectangle (0, _out_size.height, _panel_size.width, _panel_size.height - _out_size.height); + int const gap = (_panel_size.height - _out_size.height) / 2; + dc.DrawRectangle (0, 0, _panel_size.width, gap); + dc.DrawRectangle (0, gap + _out_size.height, _panel_size.width, gap); } - if (_outline_content && _outline_content->GetValue ()) { + if (_outline_content) { wxPen p (wxColour (255, 0, 0), 2); dc.SetPen (p); dc.SetBrush (*wxTRANSPARENT_BRUSH); @@ -355,6 +345,20 @@ FilmViewer::paint_panel () } } +void +FilmViewer::set_outline_content (bool o) +{ + _outline_content = o; + refresh_panel (); +} + +void +FilmViewer::set_eyes (Eyes e) +{ + _eyes = e; + slow_refresh (); +} + void FilmViewer::panel_sized (wxSizeEvent& ev) { @@ -365,8 +369,7 @@ FilmViewer::panel_sized (wxSizeEvent& ev) if (!quick_refresh()) { slow_refresh (); } - update_position_label (); - update_position_slider (); + PositionChanged (); } void @@ -405,6 +408,12 @@ FilmViewer::start () return; } + optional v = PlaybackPermitted (); + if (v && !*v) { + /* Computer says no */ + return; + } + if (_audio.isStreamOpen()) { _audio.setStreamTime (_video_position.seconds()); _audio.startStream (); @@ -413,7 +422,7 @@ FilmViewer::start () _playing = true; _dropped = 0; timer (); - _play_button->SetValue (true); + Started (position()); } bool @@ -429,26 +438,10 @@ FilmViewer::stop () } _playing = false; - _play_button->SetValue (false); + Stopped (position()); return true; } -void -FilmViewer::go_to (DCPTime t) -{ - if (t < DCPTime ()) { - t = DCPTime (); - } - - if (t >= _film->length ()) { - t = _film->length (); - } - - seek (t, true); - update_position_label (); - update_position_slider (); -} - void FilmViewer::player_change (ChangeType type, int property, bool frequent) { @@ -478,20 +471,13 @@ FilmViewer::player_change (ChangeType type, int property, bool frequent) if (!refreshed) { slow_refresh (); } - update_position_label (); - update_position_slider (); + PositionChanged (); } void FilmViewer::film_change (ChangeType type, Film::Property p) { - if (type != CHANGE_TYPE_DONE) { - return; - } - - if (p == Film::CONTENT || p == Film::THREE_D) { - setup_sensitivity (); - } else if (p == Film::AUDIO_CHANNELS) { + if (type == CHANGE_TYPE_DONE && p == Film::AUDIO_CHANNELS) { recreate_butler (); } } @@ -523,20 +509,11 @@ FilmViewer::quick_refresh () } void -FilmViewer::set_position (DCPTime p) -{ - _video_position = p; - seek (p, true); - update_position_label (); - update_position_slider (); -} - -void -FilmViewer::set_position (shared_ptr content, ContentTime t) +FilmViewer::seek (shared_ptr content, ContentTime t, bool accurate) { optional dt = _player->content_time_to_dcp (content, t); if (dt) { - set_position (*dt); + seek (*dt, accurate); } } @@ -560,6 +537,14 @@ FilmViewer::seek (DCPTime t, bool accurate) return; } + if (t < DCPTime ()) { + t = DCPTime (); + } + + if (t >= _film->length ()) { + t = _film->length (); + } + bool const was_running = stop (); _closed_captions_dialog->clear (); @@ -569,6 +554,9 @@ FilmViewer::seek (DCPTime t, bool accurate) if (was_running) { start (); } + + PositionChanged (); + Seeked (position()); } void @@ -612,7 +600,7 @@ FilmViewer::config_changed (Config::Property p) } catch (RtAudioError& e) { #endif error_dialog ( - this, + _panel, _("Could not set up audio output. There will be no audio during the preview."), std_to_wx(e.what()) ); } @@ -705,6 +693,7 @@ FilmViewer::one_video_frame () const return DCPTime::from_frames (1, _film->video_frame_rate()); } +/** Open a dialog box showing our film's closed captions */ void FilmViewer::show_closed_captions () { @@ -712,11 +701,7 @@ FilmViewer::show_closed_captions () } void -FilmViewer::back_frame (DCPTime by) +FilmViewer::seek_by (DCPTime by, bool accurate) { - if (!_film) { - return; - } - - go_to (_video_position + by); + seek (_video_position + by, accurate); }