Basic jump to selected subtitle (#1200).
authorCarl Hetherington <cth@carlh.net>
Fri, 29 Jun 2018 21:02:19 +0000 (22:02 +0100)
committerCarl Hetherington <cth@carlh.net>
Fri, 29 Jun 2018 21:02:19 +0000 (22:02 +0100)
src/lib/player.cc
src/lib/player.h
src/wx/content_panel.h
src/wx/film_viewer.cc
src/wx/film_viewer.h
src/wx/subtitle_panel.cc
src/wx/subtitle_view.cc
src/wx/subtitle_view.h

index 5515b70e85a809fd8f767d911dcb48609ba7e656..df58ed223af0ea043322f5a2e42262dc0466656a 100644 (file)
@@ -1089,3 +1089,20 @@ Player::set_dcp_decode_reduction (optional<int> reduction)
        _have_valid_pieces = false;
        Changed (PlayerProperty::DCP_DECODE_REDUCTION, false);
 }
+
+DCPTime
+Player::content_time_to_dcp (shared_ptr<Content> content, ContentTime t)
+{
+       if (_have_valid_pieces) {
+               setup_pieces ();
+       }
+
+       BOOST_FOREACH (shared_ptr<Piece> i, _pieces) {
+               if (i->content == content) {
+                       return content_time_to_dcp (i, t);
+               }
+       }
+
+       DCPOMATIC_ASSERT (false);
+       return DCPTime ();
+}
index fc7117ba201abc006482819a5c27f8f7e56e140a..54fa074c011cd0d038e40d96de371e1bf47df098 100644 (file)
@@ -84,6 +84,8 @@ public:
        void set_play_referenced ();
        void set_dcp_decode_reduction (boost::optional<int> reduction);
 
+       DCPTime content_time_to_dcp (boost::shared_ptr<Content> content, ContentTime t);
+
        /** Emitted when something has changed such that if we went back and emitted
         *  the last frame again it would look different.  This is not emitted after
         *  a seek.
index 15e0fb6e1506d810a7d12bc9fe8ae947e68f5ff3..c5378fc363bfe50a8982d213090adf1efad9f984 100644 (file)
@@ -71,6 +71,10 @@ public:
        bool remove_clicked (bool hotkey);
        void timeline_clicked ();
 
+       FilmViewer* film_viewer () const {
+               return _film_viewer;
+       }
+
        boost::signals2::signal<void (void)> SelectionChanged;
 
 private:
index a7e040bb5c51335d64b1239e327e7d6f4b7a45fd..9f42aaad25798c18729bab2b162693290e2c3319 100644 (file)
@@ -757,6 +757,12 @@ FilmViewer::set_position (DCPTime p)
        update_position_slider ();
 }
 
+void
+FilmViewer::set_position (shared_ptr<Content> content, ContentTime t)
+{
+       set_position (_player->content_time_to_dcp (content, t));
+}
+
 void
 FilmViewer::set_coalesce_player_changes (bool c)
 {
index eed6c283d8ca811ac568e7d35c27f937001fd781..11d06cc4643c329e8626bb156f7afa202276697c 100644 (file)
@@ -55,6 +55,7 @@ public:
        }
 
        void set_position (DCPTime p);
+       void set_position (boost::shared_ptr<Content> content, ContentTime p);
        void set_coalesce_player_changes (bool c);
        void set_dcp_decode_reduction (boost::optional<int> reduction);
        boost::optional<int> dcp_decode_reduction () const;
index ff215c31d418ede4e28e1d017172d81ea15737b8..1a42c1f57a9ad7256174aeb0f1918df6a9969f79 100644 (file)
@@ -409,7 +409,7 @@ SubtitlePanel::subtitle_view_clicked ()
        shared_ptr<Decoder> decoder = decoder_factory (c.front(), _parent->film()->log(), false);
 
        if (decoder) {
-               _subtitle_view = new SubtitleView (this, _parent->film(), decoder, c.front()->position ());
+               _subtitle_view = new SubtitleView (this, _parent->film(), c.front(), decoder, _parent->film_viewer());
                _subtitle_view->Show ();
        }
 }
index bf839137112bf14ff4ade339906ea56f6bba8a9d..cedf273d4fb7cc36444aa187f888a0ad04964235 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2014-2016 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2014-2018 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -24,7 +24,9 @@
 #include "lib/audio_decoder.h"
 #include "lib/film.h"
 #include "lib/text_subtitle_content.h"
+#include "lib/config.h"
 #include "subtitle_view.h"
+#include "film_viewer.h"
 #include "wx_util.h"
 
 using std::list;
@@ -32,8 +34,10 @@ using boost::shared_ptr;
 using boost::bind;
 using boost::dynamic_pointer_cast;
 
-SubtitleView::SubtitleView (wxWindow* parent, shared_ptr<Film> film, shared_ptr<Decoder> decoder, DCPTime position)
+SubtitleView::SubtitleView (wxWindow* parent, shared_ptr<Film> film, shared_ptr<Content> content, shared_ptr<Decoder> decoder, FilmViewer* viewer)
        : wxDialog (parent, wxID_ANY, _("Subtitles"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
+       , _content (content)
+       , _film_viewer (viewer)
 {
        _list = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_SINGLE_SEL);
 
@@ -64,6 +68,8 @@ SubtitleView::SubtitleView (wxWindow* parent, shared_ptr<Film> film, shared_ptr<
        wxBoxSizer* sizer = new wxBoxSizer (wxVERTICAL);
        sizer->Add (_list, 1, wxEXPAND | wxALL, DCPOMATIC_SIZER_X_GAP);
 
+       _list->Bind (wxEVT_LIST_ITEM_SELECTED, boost::bind (&SubtitleView::subtitle_selected, this, _1));
+
        wxSizer* buttons = CreateSeparatedButtonSizer (wxOK);
        if (buttons) {
                sizer->Add (buttons, wxSizerFlags().Expand().DoubleBorder());
@@ -77,7 +83,7 @@ SubtitleView::SubtitleView (wxWindow* parent, shared_ptr<Film> film, shared_ptr<
        }
 
        _subs = 0;
-       _frc = film->active_frame_rate_change (position);
+       _frc = film->active_frame_rate_change (content->position());
        decoder->subtitle->TextStart.connect (bind (&SubtitleView::data_start, this, _1));
        decoder->subtitle->Stop.connect (bind (&SubtitleView::data_stop, this, _1));
        while (!decoder->pass ()) {}
@@ -93,6 +99,7 @@ SubtitleView::data_start (ContentTextSubtitle cts)
                _list->InsertItem (list_item);
                _list->SetItem (_subs, 0, std_to_wx (cts.from().timecode (_frc->source)));
                _list->SetItem (_subs, 2, std_to_wx (i.text ()));
+               _start_times.push_back (cts.from ());
                ++_subs;
        }
 
@@ -110,3 +117,16 @@ SubtitleView::data_stop (ContentTime time)
                _list->SetItem (i, 1, std_to_wx (time.timecode (_frc->source)));
        }
 }
+
+void
+SubtitleView::subtitle_selected (wxListEvent& ev)
+{
+       if (!Config::instance()->jump_to_selected ()) {
+               return;
+       }
+
+       DCPOMATIC_ASSERT (ev.GetIndex() < int(_start_times.size()));
+       shared_ptr<Content> locked = _content.lock ();
+       DCPOMATIC_ASSERT (locked);
+       _film_viewer->set_position (locked, _start_times[ev.GetIndex()]);
+}
index 43a62270525e4ac3a062c3c8afd985a2f5b908e0..94ef5217178c61552c4612008437db76c43bc3d8 100644 (file)
 #include <wx/listctrl.h>
 
 class Decoder;
+class FilmViewer;
 
 class SubtitleView : public wxDialog
 {
 public:
-       SubtitleView (wxWindow *, boost::shared_ptr<Film>, boost::shared_ptr<Decoder>, DCPTime position);
+       SubtitleView (wxWindow *, boost::shared_ptr<Film>, boost::shared_ptr<Content> content, boost::shared_ptr<Decoder>, FilmViewer* viewer);
 
 private:
        void data_start (ContentTextSubtitle cts);
        void data_stop (ContentTime time);
+       void subtitle_selected (wxListEvent &);
 
        wxListCtrl* _list;
        int _subs;
        boost::optional<FrameRateChange> _frc;
        boost::optional<int> _last_count;
+       std::vector<ContentTime> _start_times;
+       boost::weak_ptr<Content> _content;
+       FilmViewer* _film_viewer;
 };