X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Ftimeline.cc;h=556e6f1b3e08ca44c2108c27cd001a4cb02c2c29;hb=fe47588e80b35c07fc25b1d9e79bc13b6e439ff0;hp=534f4eda752ad4078c9d6afbc982a138de4586d9;hpb=8d58a7c5f4320ad5c111e336c45e44d6b51ab509;p=dcpomatic.git diff --git a/src/wx/timeline.cc b/src/wx/timeline.cc index 534f4eda7..556e6f1b3 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; @@ -136,7 +138,8 @@ public: } virtual wxString type () const = 0; - virtual wxColour colour () const = 0; + virtual wxColour background_colour () const = 0; + virtual wxColour foreground_colour () const = 0; private: @@ -153,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 (); @@ -173,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; @@ -181,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 (); } @@ -211,6 +213,9 @@ private: boost::signals2::scoped_connection _content_connection; }; +/** @class AudioContentView + * @brief Timeline view for AudioContent. + */ class AudioContentView : public ContentView { public: @@ -224,12 +229,20 @@ 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 AudioContentView + * @brief Timeline view for VideoContent. + */ class VideoContentView : public ContentView { public: @@ -241,24 +254,33 @@ 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 AudioContentView + * @brief Timeline view for SubtitleContent. + */ class SubtitleContentView : public ContentView { public: - SubtitleContentView (Timeline& tl, shared_ptr c) + SubtitleContentView (Timeline& tl, shared_ptr c) : ContentView (tl, c) + , _subtitle_content (c) {} private: @@ -267,10 +289,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 @@ -327,6 +366,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()) { @@ -363,9 +404,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) @@ -404,8 +445,6 @@ Timeline::paint () return; } - gc->SetFont (gc->CreateFont (*wxNORMAL_FONT)); - for (ViewList::iterator i = _views.begin(); i != _views.end(); ++i) { (*i)->paint (gc); } @@ -435,8 +474,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))); } } @@ -572,7 +613,7 @@ Timeline::left_down (wxMouseEvent& ev) } if (view == *i) { - _film_editor->set_selection (cv->content ()); + _content_panel->set_selection (cv->content ()); } } @@ -674,7 +715,7 @@ Timeline::set_position_from_event (wxMouseEvent& ev) DCPTime const d = DCPTime (cv->content()->end() - new_position).abs (); if (first || d < nearest_distance) { nearest_distance = d; - nearest_new_position = cv->content()->end(); + nearest_new_position = cv->content()->end() + DCPTime::delta (); } } @@ -686,7 +727,7 @@ Timeline::set_position_from_event (wxMouseEvent& ev) if (d < nearest_distance) { nearest_distance = d; - nearest_new_position = cv->content()->position() - _down_view->content()->length_after_trim (); + nearest_new_position = cv->content()->position() - _down_view->content()->length_after_trim () - DCPTime::delta(); } }