*/
-#include "closed_captions_view.h"
+#include "closed_captions_dialog.h"
+#include "lib/string_text.h"
#include <boost/bind.hpp>
using std::list;
+using std::max;
using std::cout;
using std::make_pair;
-
-int const ClosedCaptionsDialog::_num_lines = 3;
-int const ClosedCaptionsDialog::_num_chars_per_line = 30;
+using boost::shared_ptr;
+using boost::weak_ptr;
ClosedCaptionsDialog::ClosedCaptionsDialog (wxWindow* parent)
: wxDialog (parent, wxID_ANY, _("Closed captions"), wxDefaultPosition, wxDefaultSize,
)
{
- _lines.resize (_num_lines);
+ _lines.resize (CLOSED_CAPTION_LINES);
Bind (wxEVT_PAINT, boost::bind (&ClosedCaptionsDialog::paint, this));
}
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) {
- if (_lines[i].IsEmpty()) {
- dc.DrawText (wxString::Format("Line %d", i + 1), 8, line_height * i);
- } else {
- 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:
};
void
-ClosedCaptionsDialog::refresh (DCPTime time)
+ClosedCaptionsDialog::update (DCPTime time)
{
- list<TextCaption> to_show;
- list<Caption>::iterator i = _captions.begin ();
- while (i != _captions.end ()) {
- if (time > i->second.to) {
- list<Caption>::iterator tmp = i;
- ++i;
- _captions.erase (tmp);
- } else if (i->second.contains (time)) {
- BOOST_FOREACH (TextCaption j, i->first.text) {
- to_show.push_back (j);
- }
- ++i;
- } else {
- ++i;
+ shared_ptr<Player> player = _player.lock ();
+ DCPOMATIC_ASSERT (player);
+ list<StringText> to_show;
+ BOOST_FOREACH (PlayerText i, player->closed_captions_for_frame(time)) {
+ BOOST_FOREACH (StringText j, i.string) {
+ to_show.push_back (j);
}
}
- for (int j = 0; j < _num_lines; ++j) {
+ for (int j = 0; j < CLOSED_CAPTION_LINES; ++j) {
_lines[j] = "";
}
to_show.sort (ClosedCaptionSorter());
- list<TextCaption>::const_iterator j = to_show.begin();
+ list<StringText>::const_iterator j = to_show.begin();
int k = 0;
- while (j != to_show.end() && k < _num_lines) {
+ while (j != to_show.end() && k < CLOSED_CAPTION_LINES) {
_lines[k] = j->text();
++j;
++k;
}
void
-ClosedCaptionsDialog::caption (PlayerCaption caption, DCPTimePeriod period)
+ClosedCaptionsDialog::clear ()
{
- _captions.push_back (make_pair (caption, period));
+ Refresh ();
}
void
-ClosedCaptionsDialog::clear ()
+ClosedCaptionsDialog::set_player (weak_ptr<Player> player)
{
- _captions.clear ();
- Refresh ();
+ _player = player;
}