X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Ftimeline.cc;h=1096a435aa5b7386e28ef1419e46e90621a342b9;hb=f021a24c9db4df2afb096392f9da18dba80b25d3;hp=4b56168a1d0636be5d56642d212b8050e19b61ce;hpb=f0edd6ab35c3c2b7800a26ec8206adab75e5f633;p=dcpomatic.git diff --git a/src/wx/timeline.cc b/src/wx/timeline.cc index 4b56168a1..1096a435a 100644 --- a/src/wx/timeline.cc +++ b/src/wx/timeline.cc @@ -22,8 +22,10 @@ #include #include "lib/film.h" #include "lib/playlist.h" +#include "lib/image_content.h" #include "film_editor.h" #include "timeline.h" +#include "content_panel.h" #include "wx_util.h" using std::list; @@ -127,12 +129,17 @@ public: _track = t; } + void unset_track () { + _track = boost::optional (); + } + optional track () const { return _track; } virtual wxString type () const = 0; - virtual wxColour colour () const = 0; + virtual wxColour background_colour () const = 0; + virtual wxColour foreground_colour () const = 0; private: @@ -149,15 +156,13 @@ private: DCPTime const position = cont->position (); DCPTime const len = cont->length_after_trim (); - wxColour selected (colour().Red() / 2, colour().Green() / 2, colour().Blue() / 2); + wxColour selected (background_colour().Red() / 2, background_colour().Green() / 2, background_colour().Blue() / 2); - gc->SetPen (*wxBLACK_PEN); - - gc->SetPen (*wxThePenList->FindOrCreatePen (wxColour (0, 0, 0), 4, wxPENSTYLE_SOLID)); + gc->SetPen (*wxThePenList->FindOrCreatePen (foreground_colour(), 4, wxPENSTYLE_SOLID)); if (_selected) { gc->SetBrush (*wxTheBrushList->FindOrCreateBrush (selected, wxBRUSHSTYLE_SOLID)); } else { - gc->SetBrush (*wxTheBrushList->FindOrCreateBrush (colour(), wxBRUSHSTYLE_SOLID)); + gc->SetBrush (*wxTheBrushList->FindOrCreateBrush (background_colour(), wxBRUSHSTYLE_SOLID)); } wxGraphicsPath path = gc->CreatePath (); @@ -169,7 +174,7 @@ private: gc->StrokePath (path); gc->FillPath (path); - wxString name = wxString::Format (wxT ("%s [%s]"), std_to_wx (cont->path_summary()).data(), type().data()); + wxString name = wxString::Format (wxT ("%s [%s]"), std_to_wx (cont->summary()).data(), type().data()); wxDouble name_width; wxDouble name_height; wxDouble name_descent; @@ -177,6 +182,7 @@ private: gc->GetTextExtent (name, &name_width, &name_height, &name_descent, &name_leading); gc->Clip (wxRegion (time_x (position), y_pos (_track.get()), len.seconds() * _timeline.pixels_per_second().get_value_or(0), _timeline.track_height())); + gc->SetFont (gc->CreateFont (*wxNORMAL_FONT, foreground_colour ())); gc->DrawText (name, time_x (position) + 12, y_pos (_track.get() + 1) - name_height - 4); gc->ResetClip (); } @@ -220,10 +226,15 @@ private: return _("audio"); } - wxColour colour () const + wxColour background_colour () const { return wxColour (149, 121, 232, 255); } + + wxColour foreground_colour () const + { + return wxColour (0, 0, 0, 255); + } }; class VideoContentView : public ContentView @@ -237,24 +248,30 @@ private: wxString type () const { - if (dynamic_pointer_cast (content ())) { - return _("video"); - } else { + if (dynamic_pointer_cast (content ()) && content()->number_of_paths() == 1) { return _("still"); + } else { + return _("video"); } } - wxColour colour () const + wxColour background_colour () const { return wxColour (242, 92, 120, 255); } + + wxColour foreground_colour () const + { + return wxColour (0, 0, 0, 255); + } }; class SubtitleContentView : public ContentView { public: - SubtitleContentView (Timeline& tl, shared_ptr c) + SubtitleContentView (Timeline& tl, shared_ptr c) : ContentView (tl, c) + , _subtitle_content (c) {} private: @@ -263,10 +280,27 @@ private: return _("subtitles"); } - wxColour colour () const + wxColour background_colour () const { + shared_ptr sc = _subtitle_content.lock (); + if (!sc || !sc->use_subtitles ()) { + return wxColour (210, 210, 210, 128); + } + return wxColour (163, 255, 154, 255); } + + wxColour foreground_colour () const + { + shared_ptr sc = _subtitle_content.lock (); + if (!sc || !sc->use_subtitles ()) { + return wxColour (180, 180, 180, 128); + } + + return wxColour (0, 0, 0, 255); + } + + boost::weak_ptr _subtitle_content; }; class TimeAxisView : public View @@ -323,6 +357,8 @@ private: path.AddLineToPoint (_timeline.width(), _y); gc->StrokePath (path); + gc->SetFont (gc->CreateFont (*wxNORMAL_FONT)); + /* Time in seconds */ DCPTime t; while ((t.seconds() * pps) < _timeline.width()) { @@ -359,9 +395,9 @@ private: }; -Timeline::Timeline (wxWindow* parent, FilmEditor* ed, shared_ptr film) +Timeline::Timeline (wxWindow* parent, ContentPanel* cp, shared_ptr film) : wxPanel (parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE) - , _film_editor (ed) + , _content_panel (cp) , _film (film) , _time_axis_view (new TimeAxisView (*this, 32)) , _tracks (0) @@ -386,7 +422,8 @@ Timeline::Timeline (wxWindow* parent, FilmEditor* ed, shared_ptr film) SetMinSize (wxSize (640, tracks() * track_height() + 96)); - _playlist_connection = film->playlist()->Changed.connect (bind (&Timeline::playlist_changed, this)); + _playlist_changed_connection = film->playlist()->Changed.connect (bind (&Timeline::playlist_changed, this)); + _playlist_content_changed_connection = film->playlist()->ContentChanged.connect (bind (&Timeline::playlist_content_changed, this, _2)); } void @@ -399,8 +436,6 @@ Timeline::paint () return; } - gc->SetFont (gc->CreateFont (*wxNORMAL_FONT)); - for (ViewList::iterator i = _views.begin(); i != _views.end(); ++i) { (*i)->paint (gc); } @@ -430,8 +465,10 @@ Timeline::playlist_changed () if (dynamic_pointer_cast (*i)) { _views.push_back (shared_ptr (new AudioContentView (*this, *i))); } - if (dynamic_pointer_cast (*i)) { - _views.push_back (shared_ptr (new SubtitleContentView (*this, *i))); + + shared_ptr sc = dynamic_pointer_cast (*i); + if (sc && sc->has_subtitles ()) { + _views.push_back (shared_ptr (new SubtitleContentView (*this, sc))); } } @@ -440,9 +477,28 @@ Timeline::playlist_changed () Refresh (); } +void +Timeline::playlist_content_changed (int property) +{ + ensure_ui_thread (); + + if (property == ContentProperty::POSITION) { + assign_tracks (); + setup_pixels_per_second (); + Refresh (); + } +} + void Timeline::assign_tracks () { + for (ViewList::iterator i = _views.begin(); i != _views.end(); ++i) { + shared_ptr c = dynamic_pointer_cast (*i); + if (c) { + c->unset_track (); + } + } + for (ViewList::iterator i = _views.begin(); i != _views.end(); ++i) { shared_ptr cv = dynamic_pointer_cast (*i); if (!cv) { @@ -548,7 +604,7 @@ Timeline::left_down (wxMouseEvent& ev) } if (view == *i) { - _film_editor->set_selection (cv->content ()); + _content_panel->set_selection (cv->content ()); } } @@ -680,7 +736,7 @@ Timeline::set_position_from_event (wxMouseEvent& ev) if (new_position < DCPTime ()) { new_position = DCPTime (); } - + _down_view->content()->set_position (new_position); shared_ptr film = _film.lock ();