X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fkeyframetreestore.cpp;h=596f0783974a73a397ab431179983dd69c0b8dbb;hb=756c0d29ac1742f231e6615f9a577e574e35a4af;hp=24d980d9ee5503c943e0d564f9390f11793adcfb;hpb=0c2b7e48750351e8f3d39885dd1e2c2b73551523;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/keyframetreestore.cpp b/synfig-studio/trunk/src/gtkmm/keyframetreestore.cpp index 24d980d..596f078 100644 --- a/synfig-studio/trunk/src/gtkmm/keyframetreestore.cpp +++ b/synfig-studio/trunk/src/gtkmm/keyframetreestore.cpp @@ -2,10 +2,11 @@ /*! \file keyframetreestore.cpp ** \brief Template File ** -** $Id: keyframetreestore.cpp,v 1.1.1.1 2005/01/07 03:34:36 darco Exp $ +** $Id$ ** ** \legal ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2007, 2008 Chris Moore ** ** This package is free software; you can redistribute it and/or ** modify it under the terms of the GNU General Public License as @@ -31,7 +32,7 @@ #include "keyframetreestore.h" #include -#include "iconcontroler.h" +#include "iconcontroller.h" #include #include #include @@ -45,6 +46,8 @@ #include "onemoment.h" #include +#include "general.h" + #endif /* === U S I N G =========================================================== */ @@ -58,7 +61,7 @@ using namespace studio; /* === G L O B A L S ======================================================= */ -KeyframeTreeStore_Class KeyframeTreeStore::keyframe_tree_store_class_; +// KeyframeTreeStore_Class KeyframeTreeStore::keyframe_tree_store_class_; /* === C L A S S E S & S T R U C T S ======================================= */ @@ -73,13 +76,13 @@ struct _keyframe_iterator Gtk::TreeModel::iterator keyframe_iter_2_model_iter(synfig::KeyframeList::iterator iter,int index) { Gtk::TreeModel::iterator ret; - + _keyframe_iterator*& data(static_cast<_keyframe_iterator*&>(ret->gobj()->user_data)); data=new _keyframe_iterator(); data->ref_count=1; data->iter=iter; data->index=index; - + return ret; } */ @@ -111,7 +114,7 @@ public: gobject_(0) { } - + TreeRowReferenceHack(const Glib::RefPtr& model, const Gtk::TreeModel::Path& path): gobject_ ( gtk_tree_row_reference_new(model->gobj(), const_cast(path.gobj())) ) { @@ -120,7 +123,7 @@ public: TreeRowReferenceHack(const TreeRowReferenceHack &x): gobject_ ( x.gobject_?gtk_tree_row_reference_copy(x.gobject_):0 ) { - + } void swap(TreeRowReferenceHack & other) @@ -137,13 +140,13 @@ public: swap(temp); return *this; } - + ~TreeRowReferenceHack() { if(gobject_) gtk_tree_row_reference_free(gobject_); } - + Gtk::TreeModel::Path get_path() { return Gtk::TreeModel::Path(gtk_tree_row_reference_get_path(gobject_),false); } GtkTreeRowReference *gobj() { return gobject_; } }; @@ -166,7 +169,7 @@ KeyframeTreeStore_Class::init() if(!gtype_) { class_init_func_ = &KeyframeTreeStore_Class::class_init_function; - + const GTypeInfo derived_info = { sizeof(GObjectClass), @@ -180,7 +183,7 @@ KeyframeTreeStore_Class::init() 0, NULL }; - + gtype_ = g_type_register_static(G_TYPE_OBJECT, "KeyframeTreeStore", &derived_info, GTypeFlags(0)); Gtk::TreeModel::add_interface(get_type()); } @@ -188,14 +191,15 @@ KeyframeTreeStore_Class::init() } void -KeyframeTreeStore_Class::class_init_function(gpointer g_class, gpointer class_data) +KeyframeTreeStore_Class::class_init_function(gpointer /*g_class*/, gpointer /*class_data*/) { // ??? } KeyframeTreeStore::KeyframeTreeStore(etl::loose_handle canvas_interface_): Glib::ObjectBase ("KeyframeTreeStore"), - Glib::Object (Glib::ConstructParams(keyframe_tree_store_class_.init(), (char*) 0)), + //! \todo what is going on here? why the need for this KeyframeTreeStore_Class at all? + // Glib::Object (Glib::ConstructParams(keyframe_tree_store_class_.init(), (char*) 0, (char*) 0)), canvas_interface_ (canvas_interface_) { reset_stamp(); @@ -208,7 +212,8 @@ KeyframeTreeStore::KeyframeTreeStore(etl::loose_handle @@ -232,7 +237,7 @@ KeyframeTreeStore::reset_path_table() { Gtk::TreeModel::Children::iterator iter; const Gtk::TreeModel::Children children(children()); - path_table_.clear(); + path_table_.clear(); for(iter = children.begin(); iter != children.end(); ++iter) { Gtk::TreeModel::Row row(*iter); @@ -258,7 +263,7 @@ KeyframeTreeStore::iterator_sane(const Gtk::TreeModel::iterator& iter)const } inline void -KeyframeTreeStore::dump_iterator(const GtkTreeIter* gtk_iter, const Glib::ustring &name)const +KeyframeTreeStore::dump_iterator(const GtkTreeIter* /*gtk_iter*/, const Glib::ustring &/*name*/)const { #if 0 if(!gtk_iter) @@ -292,10 +297,10 @@ int KeyframeTreeStore::time_sorter(const Gtk::TreeModel::iterator &rhs,const Gtk::TreeModel::iterator &lhs) { const Model model; - + _keyframe_iterator *rhs_iter(static_cast<_keyframe_iterator*>(rhs->gobj()->user_data)); _keyframe_iterator *lhs_iter(static_cast<_keyframe_iterator*>(lhs->gobj()->user_data)); - + Time diff(rhs_iter->iter->get_time()-lhs_iter->iter->get_time()); if(diff<0) return -1; @@ -304,6 +309,20 @@ KeyframeTreeStore::time_sorter(const Gtk::TreeModel::iterator &rhs,const Gtk::Tr return 0; } +int +KeyframeTreeStore::description_sorter(const Gtk::TreeModel::iterator &rhs,const Gtk::TreeModel::iterator &lhs) +{ + const Model model; + + _keyframe_iterator *rhs_iter(static_cast<_keyframe_iterator*>(rhs->gobj()->user_data)); + _keyframe_iterator *lhs_iter(static_cast<_keyframe_iterator*>(lhs->gobj()->user_data)); + + int comp = rhs_iter->iter->get_description().compare(lhs_iter->iter->get_description()); + if (comp > 0) return 1; + if (comp < 0) return -1; + return 0; +} + void KeyframeTreeStore::set_value_impl(const Gtk::TreeModel::iterator& row, int column, const Glib::ValueBase& value) { @@ -323,54 +342,55 @@ KeyframeTreeStore::set_value_impl(const Gtk::TreeModel::iterator& row, int colum } _keyframe_iterator *iter(static_cast<_keyframe_iterator*>(row.gobj()->user_data)); - + try { if(column==model.time_delta.index()) - { + { Glib::Value x; g_value_init(x.gobj(),model.time.type()); g_value_copy(value.gobj(),x.gobj()); - + Time new_delta(x.get()); if(new_delta<=Time::zero()+Time::epsilon()) { // Bad value return; } - + Time old_delta((*row)[model.time_delta]); if(old_delta<=Time::zero()+Time::epsilon()) { // Bad old delta return; } + // row(row) on the next line is bad - don't use it, because it leaves 'row' uninitialized //Gtk::TreeModel::iterator row(row); //row++; //if(!row)return; - + Time change_delta(new_delta-old_delta); - + if(change_delta<=Time::zero()+Time::epsilon() &&change_delta>=Time::zero()-Time::epsilon()) { // Not an error, just no change return; } - + { Keyframe keyframe((*row)[model.keyframe]); synfigapp::Action::Handle action(synfigapp::Action::create("keyframe_set_delta")); - + if(!action)return; - + action->set_param("canvas",canvas_interface()->get_canvas()); action->set_param("canvas_interface",canvas_interface()); action->set_param("keyframe",keyframe); action->set_param("delta",change_delta); - + canvas_interface()->get_instance()->perform_action(action); } - + return; } else @@ -386,16 +406,16 @@ KeyframeTreeStore::set_value_impl(const Gtk::TreeModel::iterator& row, int colum synfig::info("KeyframeTreeStore::set_value_impl():old_time=%s",keyframe.get_time().get_string().c_str()); keyframe.set_time(x.get()); synfig::info("KeyframeTreeStore::set_value_impl():new_time=%s",keyframe.get_time().get_string().c_str()); - + synfigapp::Action::Handle action(synfigapp::Action::create("keyframe_set")); - + if(!action) return; - + action->set_param("canvas",canvas_interface()->get_canvas()); action->set_param("canvas_interface",canvas_interface()); action->set_param("keyframe",keyframe); - + canvas_interface()->get_instance()->perform_action(action); } else if(column==model.description.index()) @@ -407,14 +427,14 @@ KeyframeTreeStore::set_value_impl(const Gtk::TreeModel::iterator& row, int colum keyframe.set_description(x.get()); synfigapp::Action::Handle action(synfigapp::Action::create("keyframe_set")); - + if(!action) return; - + action->set_param("canvas",canvas_interface()->get_canvas()); action->set_param("canvas_interface",canvas_interface()); action->set_param("keyframe",keyframe); - + canvas_interface()->get_instance()->perform_action(action); } else if(column==model.keyframe.index()) @@ -429,7 +449,7 @@ KeyframeTreeStore::set_value_impl(const Gtk::TreeModel::iterator& row, int colum catch(std::exception x) { g_warning(x.what()); - } + } } Gtk::TreeModelFlags @@ -461,7 +481,7 @@ KeyframeTreeStore::iter_next_vfunc (const iterator& xiter, iterator& iter_next) return false; _keyframe_iterator *next(new _keyframe_iterator()); - iter_next.gobj()->user_data=static_cast(next); + iter_next.gobj()->user_data=static_cast(next); next->ref_count=1; next->index=iter->index+1; next->iter=iter->iter; @@ -469,8 +489,8 @@ KeyframeTreeStore::iter_next_vfunc (const iterator& xiter, iterator& iter_next) if(next->iter==canvas_interface()->get_canvas()->keyframe_list().end()) return false; - - iter_next.gobj()->stamp=stamp_; + + iter_next.gobj()->stamp=stamp_; return true; } @@ -486,9 +506,9 @@ KeyframeTreeStore::iter_next_vfunc (GtkTreeIter* gtk_iter) // If we are already at the end, then we are very invalid if(iter->iter==canvas_interface()->get_canvas()->keyframe_list().end()) return false; - + ++(iter->iter); - + if(iter->iter==canvas_interface()->get_canvas()->keyframe_list().end()) { --(iter->iter); @@ -509,16 +529,16 @@ KeyframeTreeStore::iter_children_vfunc (GtkTreeIter* gtk_iter, const GtkTreeIter clear_iterator(gtk_iter); return false; } - + _keyframe_iterator *iter(new _keyframe_iterator()); iter->ref_count=1; iter->index=0; iter->iter=canvas_interface()->get_canvas()->keyframe_list().begin(); - + gtk_iter->user_data=static_cast(iter); - gtk_iter->stamp=stamp_; + gtk_iter->stamp=stamp_; - return true; + return true; } bool @@ -539,7 +559,7 @@ KeyframeTreeStore::iter_n_children_vfunc (const GtkTreeIter* parent) if(parent) return 0; - + return canvas_interface()->get_canvas()->keyframe_list().size(); } */ @@ -583,8 +603,8 @@ KeyframeTreeStore::iter_nth_root_child_vfunc (int n, iterator& xiter)const } ++iter->iter; } - xiter.gobj()->user_data=static_cast(iter); - xiter.gobj()->stamp=stamp_; + xiter.gobj()->user_data=static_cast(iter); + xiter.gobj()->stamp=stamp_; return true; } @@ -602,7 +622,7 @@ KeyframeTreeStore::iter_nth_child_vfunc (GtkTreeIter* gtk_iter, const GtkTreeIte } - + _keyframe_iterator *iter(new _keyframe_iterator()); iter->ref_count=1; iter->index=n; @@ -618,9 +638,9 @@ KeyframeTreeStore::iter_nth_child_vfunc (GtkTreeIter* gtk_iter, const GtkTreeIte } ++iter->iter; } - + gtk_iter->user_data=static_cast(iter); - gtk_iter->stamp=stamp_; + gtk_iter->stamp=stamp_; return true; } @@ -655,14 +675,14 @@ KeyframeTreeStore::unref_node_vfunc (iterator& xiter)const if(!iter->ref_count) { delete iter; - + // Make this iterator invalid gtk_iter->stamp=0; } } Gtk::TreeModel::Path -KeyframeTreeStore::get_path_vfunc (const TreeModel::iterator& gtk_iter)const +KeyframeTreeStore::get_path_vfunc (const iterator& gtk_iter)const { Gtk::TreeModel::Path path; @@ -672,7 +692,7 @@ KeyframeTreeStore::get_path_vfunc (const TreeModel::iterator& gtk_iter)const return path; _keyframe_iterator *iter(static_cast<_keyframe_iterator*>(gtk_iter->gobj()->user_data)); - + path.append_index(iter->index); return path; @@ -720,7 +740,7 @@ KeyframeTreeStore::get_value_vfunc (const Gtk::TreeModel::iterator& gtk_iter, in { Glib::Value x; g_value_init(x.gobj(),x.value_type()); - + synfig::Keyframe prev_keyframe(*iter->iter); synfig::Keyframe keyframe; { @@ -735,7 +755,7 @@ KeyframeTreeStore::get_value_vfunc (const Gtk::TreeModel::iterator& gtk_iter, in } keyframe=*tmp; } - + Time delta(0); try { delta=keyframe.get_time()-prev_keyframe.get_time(); @@ -773,15 +793,15 @@ KeyframeTreeStore::find_row(const synfig::Keyframe &keyframe) const GtkTreeIter *gtk_iter(row.gobj()); if(!iterator_sane(gtk_iter)) throw std::runtime_error(_("Unable to find Keyframe in table")); - + _keyframe_iterator *iter(static_cast<_keyframe_iterator*>(gtk_iter->user_data)); - + synfig::KeyframeList &keyframe_list(canvas_interface()->get_canvas()->keyframe_list()); if(keyframe_list.empty()) throw std::runtime_error(_("There are no keyframes n this canvas")); iter->index=0; - + for(iter->iter=keyframe_list.begin();iter->iter!=keyframe_list.end() && *iter->iter!=keyframe;++iter->iter) { iter->index++; @@ -792,14 +812,14 @@ KeyframeTreeStore::find_row(const synfig::Keyframe &keyframe) } void -KeyframeTreeStore::add_keyframe(Keyframe keyframe) +KeyframeTreeStore::add_keyframe(synfig::Keyframe keyframe) { try { Gtk::TreeRow row(find_row(keyframe)); dump_iterator(row.gobj(),"add_keyframe,row"); Gtk::TreePath path(get_path(row)); - + row_inserted(path,row); old_keyframe_list=get_canvas()->keyframe_list(); @@ -809,16 +829,16 @@ KeyframeTreeStore::add_keyframe(Keyframe keyframe) catch(std::exception x) { g_warning(x.what()); - } + } } void -KeyframeTreeStore::remove_keyframe(Keyframe keyframe) +KeyframeTreeStore::remove_keyframe(synfig::Keyframe keyframe) { try { if(1) - { + { Gtk::TreeRow row(find_row(keyframe)); dump_iterator(row,"remove_keyframe,row"); Gtk::TreePath path(get_path(row)); @@ -833,13 +853,12 @@ KeyframeTreeStore::remove_keyframe(Keyframe keyframe) } catch(std::exception x) { - DEBUGPOINT(); g_warning(x.what()); - } + } } void -KeyframeTreeStore::change_keyframe(Keyframe keyframe) +KeyframeTreeStore::change_keyframe(synfig::Keyframe keyframe) { try { @@ -848,11 +867,11 @@ KeyframeTreeStore::change_keyframe(Keyframe keyframe) unsigned int new_index(get_index_from_model_iter(row)); unsigned int old_index(0); synfig::KeyframeList::iterator iter; - for(old_index=0,iter=old_keyframe_list.begin();iter!=old_keyframe_list.end() && (UniqueID)*iter!=(UniqueID)keyframe;++iter,old_index++); - + for(old_index=0,iter=old_keyframe_list.begin();iter!=old_keyframe_list.end() && (UniqueID)*iter!=(UniqueID)keyframe;++iter,old_index++) + ; + if(iter!=old_keyframe_list.end() && new_index!=old_index) { - DEBUGPOINT(); std::vector new_order; for(unsigned int i=0;ikeyframe_list(); - + row=find_row(keyframe); } dump_iterator(row,"change_keyframe,row"); - row_changed(get_path(row),row); + row_changed(get_path(row),row); } catch(std::exception x) { - DEBUGPOINT(); g_warning(x.what()); - } + } }