X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fwx%2Fclosed_captions_dialog.cc;h=b81414bed9f72b37a0e638cf6545a19440685fae;hb=9da2ff50f9f880fec6b457bfe3319fa3f892dd6a;hp=0b2e630357e60ed83a26c0a3d0d890687c4b6898;hpb=ded71cffd18962ebb6b9611a5eb6dfafe9e8e4ec;p=dcpomatic.git diff --git a/src/wx/closed_captions_dialog.cc b/src/wx/closed_captions_dialog.cc index 0b2e63035..b81414bed 100644 --- a/src/wx/closed_captions_dialog.cc +++ b/src/wx/closed_captions_dialog.cc @@ -19,20 +19,22 @@ */ #include "closed_captions_dialog.h" -#include "lib/text_caption.h" +#include "lib/string_text.h" +#include "lib/butler.h" #include using std::list; +using std::max; using std::cout; +using std::pair; using std::make_pair; using boost::shared_ptr; using boost::weak_ptr; - -int const ClosedCaptionsDialog::_num_lines = 3; -int const ClosedCaptionsDialog::_num_chars_per_line = 30; +using boost::optional; ClosedCaptionsDialog::ClosedCaptionsDialog (wxWindow* parent) - : wxDialog (parent, wxID_ANY, _("Closed captions"), wxDefaultPosition, wxDefaultSize, + /* XXX: empirical and probably unhelpful default size here; needs to be related to font metrics */ + : wxDialog (parent, wxID_ANY, _("Closed captions"), wxDefaultPosition, wxSize(640, (640 / 10) + 64), #ifdef DCPOMATIC_OSX /* I can't get wxFRAME_FLOAT_ON_PARENT to work on OS X, and although wxSTAY_ON_TOP keeps the window above all others (and not just our own) it's better than nothing for now. @@ -42,9 +44,9 @@ ClosedCaptionsDialog::ClosedCaptionsDialog (wxWindow* parent) wxDEFAULT_FRAME_STYLE | wxRESIZE_BORDER | wxFULL_REPAINT_ON_RESIZE | wxFRAME_FLOAT_ON_PARENT #endif ) - + , _current_in_lines (false) { - _lines.resize (_num_lines); + _lines.resize (CLOSED_CAPTION_LINES); Bind (wxEVT_PAINT, boost::bind (&ClosedCaptionsDialog::paint, this)); } @@ -57,26 +59,34 @@ ClosedCaptionsDialog::paint () dc.SetTextForeground (*wxWHITE); /* Choose a font which fits vertically */ - int const line_height = dc.GetSize().GetHeight() / _num_lines; + int const line_height = max (8, dc.GetSize().GetHeight() / CLOSED_CAPTION_LINES); wxFont font (*wxNORMAL_FONT); font.SetPixelSize (wxSize (0, line_height * 0.8)); dc.SetFont (font); - for (int i = 0; i < _num_lines; ++i) { - dc.DrawText (_lines[i], 8, line_height * i); + for (int i = 0; i < CLOSED_CAPTION_LINES; ++i) { + wxString const good = _lines[i].Left (CLOSED_CAPTION_LENGTH); + dc.DrawText (good, 8, line_height * i); + if (_lines[i].Length() > CLOSED_CAPTION_LENGTH) { + wxString const bad = _lines[i].Right (_lines[i].Length() - CLOSED_CAPTION_LENGTH); + wxSize size = dc.GetTextExtent (good); + dc.SetTextForeground (*wxRED); + dc.DrawText (bad, 8 + size.GetWidth(), line_height * i); + dc.SetTextForeground (*wxWHITE); + } } } class ClosedCaptionSorter { public: - bool operator() (TextCaption const & a, TextCaption const & b) + bool operator() (StringText const & a, StringText const & b) { return from_top(a) < from_top(b); } private: - float from_top (TextCaption const & c) const + float from_top (StringText const & c) const { switch (c.v_align()) { case dcp::VALIGN_TOP: @@ -94,40 +104,62 @@ private: void ClosedCaptionsDialog::update (DCPTime time) { - shared_ptr player = _player.lock (); - DCPOMATIC_ASSERT (player); - list to_show; - BOOST_FOREACH (PlayerCaption i, player->closed_captions_for_frame(time)) { - BOOST_FOREACH (TextCaption j, i.text) { - to_show.push_back (j); + if (_current_in_lines && _current->period.to > time) { + /* Current one is fine */ + return; + } + + if (_current && _current->period.to < time) { + /* Current one has finished; clear out */ + for (int j = 0; j < CLOSED_CAPTION_LINES; ++j) { + _lines[j] = ""; } + Refresh (); + _current = optional(); } - for (int j = 0; j < _num_lines; ++j) { - _lines[j] = ""; + if (!_current) { + /* We have no current one: get another */ + shared_ptr butler = _butler.lock (); + DCPOMATIC_ASSERT (butler); + _current = butler->get_closed_caption (); + _current_in_lines = false; } - to_show.sort (ClosedCaptionSorter()); + if (_current && _current->period.contains(time)) { + /* We need to set this new one up */ - list::const_iterator j = to_show.begin(); - int k = 0; - while (j != to_show.end() && k < _num_lines) { - _lines[k] = j->text(); - ++j; - ++k; - } + list to_show = _current->text.string; - Refresh (); + for (int j = 0; j < CLOSED_CAPTION_LINES; ++j) { + _lines[j] = ""; + } + + to_show.sort (ClosedCaptionSorter()); + + list::const_iterator j = to_show.begin(); + int k = 0; + while (j != to_show.end() && k < CLOSED_CAPTION_LINES) { + _lines[k] = j->text(); + ++j; + ++k; + } + + Refresh (); + _current_in_lines = true; + } } void ClosedCaptionsDialog::clear () { + _current = optional(); + _current_in_lines = false; Refresh (); } void -ClosedCaptionsDialog::set_player (weak_ptr player) +ClosedCaptionsDialog::set_butler (weak_ptr butler) { - _player = player; + _butler = butler; }