X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fcellrenderer_timetrack.cpp;h=c1759d989dbfe6382a5ca661c81f57d2ad4562d8;hb=63e709f66d50c124cc0ece2325f4773ac4ae7b20;hp=b3c9a66b0283a1baf52e1c15abac895840b44aab;hpb=3a3c4bca3a17137bec5d7960560934b91ef4146e;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/cellrenderer_timetrack.cpp b/synfig-studio/trunk/src/gtkmm/cellrenderer_timetrack.cpp index b3c9a66..c1759d9 100644 --- a/synfig-studio/trunk/src/gtkmm/cellrenderer_timetrack.cpp +++ b/synfig-studio/trunk/src/gtkmm/cellrenderer_timetrack.cpp @@ -1,20 +1,22 @@ -/* === S I N F G =========================================================== */ +/* === S Y N F I G ========================================================= */ /*! \file cellrenderer_timetrack.cpp ** \brief Template Header ** -** $Id: cellrenderer_timetrack.cpp,v 1.4 2005/01/13 20:23:01 darco Exp $ +** $Id$ ** ** \legal -** Copyright (c) 2002 Robert B. Quattlebaum Jr. +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2007 Chris Moore ** -** This software and associated documentation -** are CONFIDENTIAL and PROPRIETARY property of -** the above-mentioned copyright holder. +** This package is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 2 of +** the License, or (at your option) any later version. ** -** You may not copy, print, publish, or in any -** other way distribute this software without -** a prior written agreement with -** the copyright holder. +** This package is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. ** \endlegal */ /* ========================================================================= */ @@ -41,14 +43,16 @@ #include "widget_time.h" #include "widget_timeslider.h" -#include +#include #include "instance.h" -#include +#include + +#include "general.h" #endif -using namespace sinfg; +using namespace synfig; using namespace std; using namespace etl; using namespace studio; @@ -76,19 +80,19 @@ CellRenderer_TimeTrack::CellRenderer_TimeTrack(): Glib::ObjectBase (typeid(CellRenderer_TimeTrack)), Gtk::CellRenderer (), adjustment_ (10,10,20,0,0,0), - - property_valuedesc_ (*this,"value_desc",sinfgapp::ValueDesc()), - property_canvas_ (*this,"canvas",sinfg::Canvas::Handle()), + + property_valuedesc_ (*this,"value_desc",synfigapp::ValueDesc()), + property_canvas_ (*this,"canvas",synfig::Canvas::Handle()), property_adjustment_(*this,"adjustment",&adjustment_), property_enable_timing_info_(*this,"enable-timing-info", false) { - dragging=false; + dragging=false; selection=false; } CellRenderer_TimeTrack::~CellRenderer_TimeTrack() { - sinfg::info("CellRenderer_TimeTrack::~CellRenderer_TimeTrack(): deleted"); + synfig::info("CellRenderer_TimeTrack::~CellRenderer_TimeTrack(): deleted"); } void @@ -98,7 +102,7 @@ CellRenderer_TimeTrack::set_adjustment(Gtk::Adjustment &x) // x.signal_value_changed().connect(sigc::mem_fun(*this,&Gtk::Widget::queue_draw)); } -sinfg::Canvas::Handle +synfig::Canvas::Handle CellRenderer_TimeTrack::get_canvas()const { return const_cast(this)->property_canvas().get_value(); @@ -122,26 +126,48 @@ CellRenderer_TimeTrack::is_selected(const Waypoint& waypoint)const return selected==waypoint; } +const synfig::Time get_time_offset_from_vdesc(const synfigapp::ValueDesc &v) +{ +#ifdef ADJUST_WAYPOINTS_FOR_TIME_OFFSET + if(v.get_value_type() != synfig::ValueBase::TYPE_CANVAS) + return synfig::Time::zero(); + + synfig::Canvas::Handle canvasparam = v.get_value().get(Canvas::Handle()); + if(!canvasparam) + return synfig::Time::zero(); + + if (!v.parent_is_layer_param()) + return synfig::Time::zero(); + + synfig::Layer::Handle layer = v.get_layer(); + + if (layer->get_name()!="PasteCanvas") + return synfig::Time::zero(); + + return layer->get_param("time_offset").get(Time()); +#else // ADJUST_WAYPOINTS_FOR_TIME_OFFSET + return synfig::Time::zero(); +#endif +} + //kind of a hack... pointer is ugly -const sinfg::Node::time_set *get_times_from_vdesc(const sinfgapp::ValueDesc &v) +const synfig::Node::time_set *get_times_from_vdesc(const synfigapp::ValueDesc &v) { - if(v.get_value_type() == sinfg::ValueBase::TYPE_CANVAS) + if(v.get_value_type() == synfig::ValueBase::TYPE_CANVAS) { - sinfg::Canvas::Handle canvasparam = v.get_value().get(Canvas::Handle()); - + synfig::Canvas::Handle canvasparam = v.get_value().get(Canvas::Handle()); + if(canvasparam) - { return &canvasparam->get_times(); - } } - + ValueNode *base_value = v.get_value_node().get(); - - ValueNode_DynamicList *parent_value_node = + + ValueNode_DynamicList *parent_value_node = v.parent_is_value_node() ? dynamic_cast(v.get_parent_value_node().get()) : 0; - + //we want a dynamic list entry to override the normal... if(parent_value_node) { @@ -153,36 +179,44 @@ const sinfg::Node::time_set *get_times_from_vdesc(const sinfgapp::ValueDesc &v) return 0; } -bool get_closest_time(const sinfg::Node::time_set &tset, const Time &t, const Time &range, Time &out) +bool get_closest_time(const synfig::Node::time_set &tset, const Time &t, const Time &range, Time &out) { Node::time_set::const_iterator i,j,end = tset.end(); - + + // stop the crash mentioned in bug #1689282 + // doesn't solve the underlying problem though, I don't think + if (tset.size() == 0) + { + synfig::error(__FILE__":%d: tset.size() == 0",__LINE__); + return false; + } + //TODO add in RangeGet so it's not so damn hard to click on points - + i = tset.upper_bound(t); //where t is the lower bound, t < [first,i) j = i; --j; - + double dist = Time::end(); double closest = 0; - + if(i != end) { closest = i->get_time(); dist = abs(i->get_time() - t); } - + if(j != end && (abs(j->get_time() - t) < dist) ) { closest = j->get_time(); dist = abs(j->get_time() - t); } - + if( dist <= range/2 ) { out = closest; return true; } - + return false; } @@ -190,19 +224,19 @@ void CellRenderer_TimeTrack::render_vfunc( const Glib::RefPtr& window, Gtk::Widget& widget, - const Gdk::Rectangle& background_area, + const Gdk::Rectangle& /*background_area*/, const Gdk::Rectangle& area_, - const Gdk::Rectangle& expose_area, - Gtk::CellRendererState flags) + const Gdk::Rectangle& /*expose_area*/, + Gtk::CellRendererState /*flags*/) { if(!window) return; - + Glib::RefPtr gc(Gdk::GC::create(window)); Glib::RefPtr inactive_gc(Gdk::GC::create(window)); Gtk::Adjustment *adjustment=get_adjustment(); - Gtk::StateType state = Gtk::STATE_ACTIVE; - Gtk::ShadowType shadow; + // Gtk::StateType state = Gtk::STATE_ACTIVE; + // Gtk::ShadowType shadow; Gdk::Color curr_time_color("#0000ff"), @@ -216,84 +250,84 @@ CellRenderer_TimeTrack::render_vfunc( inactive_gc->set_rgb_fg_color(inactive_color); inactive_gc->set_stipple(Gdk::Bitmap::create(stipple_xpm,2,2)); inactive_gc->set_fill(Gdk::STIPPLED); - - sinfg::Canvas::Handle canvas(property_canvas().get_value()); - - sinfgapp::ValueDesc value_desc = property_value_desc().get_value(); - sinfg::ValueNode *base_value = value_desc.get_value_node().get(); - sinfg::ValueNode_Animated *value_node=dynamic_cast(base_value); - - sinfg::ValueNode_DynamicList *parent_value_node(0); + + synfig::Canvas::Handle canvas(property_canvas().get_value()); + + synfigapp::ValueDesc value_desc = property_value_desc().get_value(); + synfig::ValueNode *base_value = value_desc.get_value_node().get(); + // synfig::ValueNode_Animated *value_node=dynamic_cast(base_value); + + synfig::ValueNode_DynamicList *parent_value_node(0); if(property_value_desc().get_value().parent_is_value_node()) - parent_value_node=dynamic_cast(property_value_desc().get_value().get_parent_value_node().get()); + parent_value_node=dynamic_cast(property_value_desc().get_value().get_parent_value_node().get()); // If the canvas is defined, then load up the keyframes if(canvas) { - const sinfg::KeyframeList& keyframe_list(canvas->keyframe_list()); - sinfg::KeyframeList::const_iterator iter; - + const synfig::KeyframeList& keyframe_list(canvas->keyframe_list()); + synfig::KeyframeList::const_iterator iter; + for(iter=keyframe_list.begin();iter!=keyframe_list.end();++iter) { if(!iter->get_time().is_valid()) continue; - + const int x((int)((float)area_.get_width()/(adjustment->get_upper()-adjustment->get_lower())*(iter->get_time()-adjustment->get_lower()))); if(iter->get_time()>=adjustment->get_lower() && iter->get_time()get_upper()) { gc->set_rgb_fg_color(keyframe_color); window->draw_rectangle(gc, true, area_.get_x()+x, area_.get_y(), 1, area_.get_height()+1); - } + } } } - + //render all the time points that exist { - const sinfg::Node::time_set *tset = get_times_from_vdesc(value_desc); - + const synfig::Node::time_set *tset = get_times_from_vdesc(value_desc); + if(tset) { - sinfg::Node::time_set::const_iterator i = tset->begin(), end = tset->end(); - + const synfig::Time time_offset = get_time_offset_from_vdesc(value_desc); + synfig::Node::time_set::const_iterator i = tset->begin(), end = tset->end(); + float lower = adjustment->get_lower(), upper = adjustment->get_upper(); - + Glib::RefPtr gc = Gdk::GC::create(widget.get_window()); - + Gdk::Rectangle area(area_); gc->set_clip_rectangle(area); gc->set_line_attributes(1,Gdk::LINE_SOLID,Gdk::CAP_BUTT,Gdk::JOIN_MITER); - + bool valselected = sel_value.get_value_node() == base_value && !sel_times.empty(); - + float cfps = get_canvas()->rend_desc().get_frame_rate(); - + vector