diff --git a/synfig-studio/src/gui/waypointrenderer.cpp b/synfig-studio/src/gui/waypointrenderer.cpp index ada9d42..7f44ddb 100644 --- a/synfig-studio/src/gui/waypointrenderer.cpp +++ b/synfig-studio/src/gui/waypointrenderer.cpp @@ -351,22 +351,24 @@ get_time_dilation_from_vdesc(const ValueDesc &v) #endif } -static const Node::time_set* -get_times_from_vdesc(const ValueDesc &v) +static const Node::time_set empty_time_set; + +const Node::time_set& +WaypointRenderer::get_times_from_valuedesc(const ValueDesc &v) { if (v.get_value_type() == type_canvas && !getenv("SYNFIG_SHOW_CANVAS_PARAM_WAYPOINTS")) if(Canvas::Handle canvasparam = v.get_value().get(Canvas::Handle())) - return &canvasparam->get_times(); + return canvasparam->get_times(); //we want a dynamic list entry to override the normal... if (v.parent_is_value_node()) if (ValueNode_DynamicList *parent_value_node = dynamic_cast(v.get_parent_value_node().get())) - return &parent_value_node->list[v.get_index()].get_times(); + return parent_value_node->list[v.get_index()].get_times(); if (ValueNode *base_value = v.get_value_node().get()) //don't render stuff if it's just animated... - return &base_value->get_times(); + return base_value->get_times(); - return nullptr; + return empty_time_set; } void @@ -375,15 +377,16 @@ WaypointRenderer::foreach_visible_waypoint(const synfigapp::ValueDesc &value_des std::function foreach_callback, void* data) { - if (const Node::time_set * const tset = get_times_from_vdesc(value_desc)) { + const Node::time_set & tset = get_times_from_valuedesc(value_desc); + if (!tset.empty()) { const Time time_offset = get_time_offset_from_vdesc(value_desc); const Time time_dilation = get_time_dilation_from_vdesc(value_desc); const double time_k = time_dilation == Time::zero() ? 1.0 : 1.0/(double)time_dilation; - for (const auto & waypoint : *tset) { - Time t = (waypoint.get_time() - time_offset)*time_k; + for (const auto & timepoint : tset) { + Time t = (timepoint.get_time() - time_offset)*time_k; if (time_plot_data.is_time_visible_extra(t)) { - if (foreach_callback(waypoint, t, data)) + if (foreach_callback(timepoint, t, data)) break; } } diff --git a/synfig-studio/src/gui/waypointrenderer.h b/synfig-studio/src/gui/waypointrenderer.h index 6c9140f..b7fa71e 100644 --- a/synfig-studio/src/gui/waypointrenderer.h +++ b/synfig-studio/src/gui/waypointrenderer.h @@ -66,6 +66,8 @@ public: std::function foreach_callback, void* data = nullptr); + static const synfig::Node::time_set & get_times_from_valuedesc(const synfigapp::ValueDesc &v); + }; // END of class WaypointRenderer }; // END of namespace studio diff --git a/synfig-studio/src/gui/widgets/widget_curves.cpp b/synfig-studio/src/gui/widgets/widget_curves.cpp index 1e03ba7..15578bd 100644 --- a/synfig-studio/src/gui/widgets/widget_curves.cpp +++ b/synfig-studio/src/gui/widgets/widget_curves.cpp @@ -1015,20 +1015,45 @@ Widget_Curves::on_draw(const Cairo::RefPtr &cr) } } + // Get last time point for this graph curve + Time last_timepoint; + const Node::time_set & tset = WaypointRenderer::get_times_from_valuedesc(curve_it->value_desc); + for (const auto & timepoint : tset) { + if (timepoint.get_time() > last_timepoint) + last_timepoint = timepoint.get_time(); + } + int last_timepoint_pixel = time_plot_data->get_pixel_t_coord(last_timepoint); + // Draw the graph curves with 0.5 width cr->set_line_width(0.5); + const std::vector dashes4 = {4}; + const std::vector no_dashes; for(int c = 0; c < channels; ++c) { // Draw the curve std::vector &p = points[c]; - for(std::vector::iterator j = p.begin(); j != p.end(); ++j) { - if (j == p.begin()) - cr->move_to(j->get_x(), j->get_y()); + std::vector::iterator p_it; + for(p_it = p.begin(); p_it != p.end(); ++p_it) { + if (p_it == p.begin()) + cr->move_to(p_it->get_x(), p_it->get_y()); else - cr->line_to(j->get_x(), j->get_y()); + cr->line_to(p_it->get_x(), p_it->get_y()); + if (p_it->get_x() >= last_timepoint_pixel) + break; } Gdk::Cairo::set_source_color(cr, curve_it->channels[c].color); cr->stroke(); + // Draw the remaining curve + if (p_it != p.end()) { + for(; p_it != p.end(); ++p_it) { + cr->line_to(p_it->get_x(), p_it->get_y()); + } + cr->set_dash(dashes4, 0); + cr->stroke(); + + cr->set_dash(no_dashes, 0); + } + Glib::RefPtr layout(Pango::Layout::create(get_pango_context())); layout->set_text(curve_it->channels[c].name);