X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftags%2Fsynfigstudio_0_61_07_rc1%2Fsrc%2Fgtkmm%2Flayerparamtreestore.cpp;fp=synfig-studio%2Ftags%2Fsynfigstudio_0_61_07_rc1%2Fsrc%2Fgtkmm%2Flayerparamtreestore.cpp;h=0000000000000000000000000000000000000000;hb=3a6643238c67c043fc3592837a05d6d2861967f1;hp=6e098e5a9234448def8e9528435c45aee85b15fa;hpb=47fce282611fbba1044921d22ca887f9b53ad91a;p=synfig.git diff --git a/synfig-studio/tags/synfigstudio_0_61_07_rc1/src/gtkmm/layerparamtreestore.cpp b/synfig-studio/tags/synfigstudio_0_61_07_rc1/src/gtkmm/layerparamtreestore.cpp deleted file mode 100644 index 6e098e5..0000000 --- a/synfig-studio/tags/synfigstudio_0_61_07_rc1/src/gtkmm/layerparamtreestore.cpp +++ /dev/null @@ -1,561 +0,0 @@ -/* === S Y N F I G ========================================================= */ -/*! \file layerparamtreestore.cpp -** \brief Template File -** -** $Id$ -** -** \legal -** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley -** -** 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. -** -** 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 -*/ -/* ========================================================================= */ - -/* === H E A D E R S ======================================================= */ - -#ifdef USING_PCH -# include "pch.h" -#else -#ifdef HAVE_CONFIG_H -# include -#endif - -#include "layerparamtreestore.h" -#include "iconcontroler.h" -#include -#include -#include "layertree.h" -#include -#include -#include "app.h" -#include - -#endif - -/* === U S I N G =========================================================== */ - -using namespace std; -using namespace etl; -using namespace synfig; -using namespace studio; - -/* === M A C R O S ========================================================= */ - -class Profiler : private etl::clock -{ - const std::string name; -public: - Profiler(const std::string& name):name(name) { reset(); } - ~Profiler() { float time(operator()()); synfig::info("%s: took %f msec",name.c_str(),time*1000); } -}; - -/* === G L O B A L S ======================================================= */ - -/* === P R O C E D U R E S ================================================= */ - -/* === M E T H O D S ======================================================= */ - -static LayerParamTreeStore::Model& ModelHack() -{ - static LayerParamTreeStore::Model* model(0); - if(!model)model=new LayerParamTreeStore::Model; - return *model; -} - -LayerParamTreeStore::LayerParamTreeStore(etl::loose_handle canvas_interface_,LayerTree* layer_tree): - Gtk::TreeStore (ModelHack()), - CanvasTreeStore (canvas_interface_), - layer_tree (layer_tree) -{ - queued=false; - // Connect all the signals - canvas_interface()->signal_value_node_changed().connect(sigc::mem_fun(*this,&studio::LayerParamTreeStore::on_value_node_changed)); - canvas_interface()->signal_value_node_added().connect(sigc::mem_fun(*this,&studio::LayerParamTreeStore::on_value_node_added)); - canvas_interface()->signal_value_node_deleted().connect(sigc::mem_fun(*this,&studio::LayerParamTreeStore::on_value_node_deleted)); - canvas_interface()->signal_value_node_replaced().connect(sigc::mem_fun(*this,&studio::LayerParamTreeStore::on_value_node_replaced)); - canvas_interface()->signal_layer_param_changed().connect(sigc::mem_fun(*this,&studio::LayerParamTreeStore::on_layer_param_changed)); - - canvas_interface()->signal_value_node_child_added().connect(sigc::mem_fun(*this,&studio::LayerParamTreeStore::on_value_node_child_added)); - canvas_interface()->signal_value_node_child_removed().connect(sigc::mem_fun(*this,&studio::LayerParamTreeStore::on_value_node_child_removed)); - - - layer_tree->get_selection()->signal_changed().connect(sigc::mem_fun(*this,&LayerParamTreeStore::queue_rebuild)); - - signal_changed().connect(sigc::mem_fun(*this,&LayerParamTreeStore::queue_refresh)); - rebuild(); -} - -LayerParamTreeStore::~LayerParamTreeStore() -{ - while(!changed_connection_list.empty()) - { - changed_connection_list.back().disconnect(); - changed_connection_list.pop_back(); - } - synfig::info("LayerParamTreeStore::~LayerParamTreeStore(): Deleted"); -} - -Glib::RefPtr -LayerParamTreeStore::create(etl::loose_handle canvas_interface_, LayerTree*layer_tree) -{ - return Glib::RefPtr(new LayerParamTreeStore(canvas_interface_,layer_tree)); -} - - - -void -LayerParamTreeStore::get_value_vfunc (const Gtk::TreeModel::iterator& iter, int column, Glib::ValueBase& value)const -{ - if(column<0) - { - synfig::error("LayerParamTreeStore::get_value_vfunc(): Bad column!"); - return; - } - -/* if(column==model.label.index()) - { - synfig::Layer::Handle layer((*iter)[model.layer]); - - if(!layer)return; - - Glib::Value x; - g_value_init(x.gobj(),x.value_type()); - - - if(!layer->get_description().empty()) - x.set(layer->get_description()); - else - x.set(layer->get_local_name()); - - g_value_init(value.gobj(),x.value_type()); - g_value_copy(x.gobj(),value.gobj()); - } - else -*/ - if(column==model.label.index()) - { - synfigapp::ValueDesc value_desc((*iter)[model.value_desc]); - Glib::ustring label; - - if(!(*iter)[model.is_toplevel]) - return CanvasTreeStore::get_value_vfunc(iter,column,value); - synfig::ParamDesc param_desc((*iter)[model.param_desc]); - label=param_desc.get_local_name(); - - if(!(*iter)[model.is_inconsistent]) - if(value_desc.is_value_node() && value_desc.get_value_node()->is_exported()) - { - label+=strprintf(" (%s)",value_desc.get_value_node()->get_id().c_str()); - } - - Glib::Value x; - g_value_init(x.gobj(),x.value_type()); - - x.set(label); - - g_value_init(value.gobj(),x.value_type()); - g_value_copy(x.gobj(),value.gobj()); - } - else - if(column==model.is_toplevel.index()) - { - Glib::Value x; - g_value_init(x.gobj(),x.value_type()); - - TreeModel::Path path(get_path(iter)); - - x.set(path.get_depth()<=1); - - g_value_init(value.gobj(),x.value_type()); - g_value_copy(x.gobj(),value.gobj()); - } - else - if(column==model.is_inconsistent.index()) - { - if((*iter)[model.is_toplevel]) - { - CanvasTreeStore::get_value_vfunc(iter,column,value); - return; - } - - Glib::Value x; - g_value_init(x.gobj(),x.value_type()); - - x.set(false); - - g_value_init(value.gobj(),x.value_type()); - g_value_copy(x.gobj(),value.gobj()); - } - else - CanvasTreeStore::get_value_vfunc(iter,column,value); -} - - - -void -LayerParamTreeStore::set_value_impl(const Gtk::TreeModel::iterator& iter, int column, const Glib::ValueBase& value) -{ - //if(!iterator_sane(row)) - // return; - - if(column>=get_n_columns_vfunc()) - { - g_warning("LayerTreeStore::set_value_impl: Bad column (%d)",column); - return; - } - - if(!g_value_type_compatible(G_VALUE_TYPE(value.gobj()),get_column_type_vfunc(column))) - { - g_warning("LayerTreeStore::set_value_impl: Bad value type"); - return; - } - - try - { - if(column==model.value.index()) - { - Glib::Value x; - g_value_init(x.gobj(),model.value.type()); - g_value_copy(value.gobj(),x.gobj()); - - if((bool)(*iter)[model.is_toplevel]) - { - synfigapp::Action::PassiveGrouper group(canvas_interface()->get_instance().get(),_("Set Layer Params")); - - synfig::ParamDesc param_desc((*iter)[model.param_desc]); - - LayerList::iterator iter2(layer_list.begin()); - - for(;iter2!=layer_list.end();++iter2) - { - if(!canvas_interface()->change_value(synfigapp::ValueDesc(*iter2,param_desc.get_name()),x.get())) - { - // ERROR! - group.cancel(); - App::dialog_error_blocking(_("Error"),_("Unable to set all layer parameters.")); - - return; - } - } - } - else - { - canvas_interface()->change_value((*iter)[model.value_desc],x.get()); - } - return; - } - else -/* - if(column==model.active.index()) - { - synfig::Layer::Handle layer((*iter)[model.layer]); - - if(!layer)return; - - Glib::Value x; - g_value_init(x.gobj(),model.active.type()); - g_value_copy(value.gobj(),x.gobj()); - - synfigapp::Action::Handle action(synfigapp::Action::create("layer_activate")); - - if(!action) - return; - - action->set_param("canvas",canvas_interface()->get_canvas()); - action->set_param("canvas_interface",canvas_interface()); - action->set_param("layer",layer); - action->set_param("new_status",bool(x.get())); - - canvas_interface()->get_instance()->perform_action(action); - return; - } - else -*/ - CanvasTreeStore::set_value_impl(iter,column, value); - } - catch(std::exception x) - { - g_warning(x.what()); - } -} - - - - - - - - - - -void -LayerParamTreeStore::rebuild() -{ - Profiler profiler("LayerParamTreeStore::rebuild()"); - if(queued)queued=false; - clear(); - layer_list=layer_tree->get_selected_layers(); - - if(layer_list.size()<=0) - return; - - // Get rid of all the connections, - // and clear the connection map. - //while(!connection_map.empty())connection_map.begin()->second.disconnect(),connection_map.erase(connection_map.begin()); - while(!changed_connection_list.empty()) - { - changed_connection_list.back().disconnect(); - changed_connection_list.pop_back(); - } - - struct REBUILD_HELPER - { - ParamVocab vocab; - - static ParamVocab::iterator find_param_desc(ParamVocab& vocab, const synfig::String& x) - { - ParamVocab::iterator iter; - - for(iter=vocab.begin();iter!=vocab.end();++iter) - if(iter->get_name()==x) - break; - return iter; - } - - void process_vocab(ParamVocab x) - { - ParamVocab::iterator iter; - - for(iter=vocab.begin();iter!=vocab.end();++iter) - { - ParamVocab::iterator iter2(find_param_desc(x,iter->get_name())); - if(iter2==x.end()) - { - // remove it and start over - vocab.erase(iter); - iter=vocab.begin(); - iter--; - continue; - } - } - } - - } rebuild_helper; - - - { - LayerList::iterator iter(layer_list.begin()); - rebuild_helper.vocab=(*iter)->get_param_vocab(); - - for(++iter;iter!=layer_list.end();++iter) - { - rebuild_helper.process_vocab((*iter)->get_param_vocab()); - changed_connection_list.push_back( - (*iter)->signal_changed().connect( - sigc::mem_fun( - *this, - &LayerParamTreeStore::changed - ) - ) - ); - } - } - - ParamVocab::iterator iter; - for(iter=rebuild_helper.vocab.begin();iter!=rebuild_helper.vocab.end();++iter) - { - if(iter->get_hidden()) - continue; - - /* - if(iter->get_animation_only()) - { - int length(layer_list.front()->get_canvas()->rend_desc().get_frame_end()-layer_list.front()->get_canvas()->rend_desc().get_frame_start()); - if(!length) - continue; - } - */ - Gtk::TreeRow row(*(append())); - synfigapp::ValueDesc value_desc(layer_list.front(),iter->get_name()); - CanvasTreeStore::set_row(row,value_desc); - if(value_desc.is_value_node()) - { - changed_connection_list.push_back( - value_desc.get_value_node()->signal_changed().connect( - sigc::mem_fun( - this, - &LayerParamTreeStore::changed - ) - ) - ); - } - if(value_desc.get_value_type()==ValueBase::TYPE_CANVAS) - { - Canvas::Handle canvas_handle = value_desc.get_value().get(Canvas::Handle()); - if(canvas_handle) changed_connection_list.push_back( - canvas_handle->signal_changed().connect( - sigc::mem_fun( - this, - &LayerParamTreeStore::changed - ) - ) - ); - } - //row[model.label] = iter->get_local_name(); - row[model.param_desc] = *iter; - row[model.canvas] = layer_list.front()->get_canvas(); - row[model.is_inconsistent] = false; - //row[model.is_toplevel] = true; - - - LayerList::iterator iter2(layer_list.begin()); - ValueBase value((*iter2)->get_param(iter->get_name())); - for(++iter2;iter2!=layer_list.end();++iter2) - { - if(value!=((*iter2)->get_param(iter->get_name()))) - { - row[model.is_inconsistent] = true; - while(!row.children().empty() && erase(row.children().begin())); - break; - } - } - } -} - -void -LayerParamTreeStore::queue_refresh() -{ - if(queued) - return; - queued=1; - queue_connection.disconnect(); - queue_connection=Glib::signal_timeout().connect( - sigc::bind_return( - sigc::mem_fun(*this,&LayerParamTreeStore::refresh), - false - ) - ,150); - -} - -void -LayerParamTreeStore::queue_rebuild() -{ - if(queued==2) - return; - queued=2; - queue_connection.disconnect(); - queue_connection=Glib::signal_timeout().connect( - sigc::bind_return( - sigc::mem_fun(*this,&LayerParamTreeStore::rebuild), - false - ) - ,150); - -} - -void -LayerParamTreeStore::refresh() -{ - if(queued)queued=false; - - Gtk::TreeModel::Children children_(children()); - - Gtk::TreeModel::Children::iterator iter; - - if(!children_.empty()) - for(iter = children_.begin(); iter && iter != children_.end(); ++iter) - { - Gtk::TreeRow row=*iter; - refresh_row(row); - } -} - -void -LayerParamTreeStore::refresh_row(Gtk::TreeModel::Row &row) -{ - if(row[model.is_toplevel]) - { - row[model.is_inconsistent] = false; - ParamDesc param_desc(row[model.param_desc]); - - LayerList::iterator iter2(layer_list.begin()); - ValueBase value((*iter2)->get_param(param_desc.get_name())); - for(++iter2;iter2!=layer_list.end();++iter2) - { - if(value!=((*iter2)->get_param(param_desc.get_name()))) - { - row[model.is_inconsistent] = true; - while(!row.children().empty() && erase(row.children().begin())); - return; - } - } - } - - //handle value_node=row[model.value_node]; - //if(value_node) - { - CanvasTreeStore::refresh_row(row); - return; - } -} - -void -LayerParamTreeStore::set_row(Gtk::TreeRow row,synfigapp::ValueDesc value_desc) -{ - Gtk::TreeModel::Children children = row.children(); - while(!children.empty() && erase(children.begin())); - - CanvasTreeStore::set_row(row,value_desc); -} - -void -LayerParamTreeStore::on_value_node_added(ValueNode::Handle /*value_node*/) -{ -// queue_refresh(); -} - -void -LayerParamTreeStore::on_value_node_deleted(etl::handle /*value_node*/) -{ -// queue_refresh(); -} - -void -LayerParamTreeStore::on_value_node_child_added(synfig::ValueNode::Handle /*value_node*/,synfig::ValueNode::Handle /*child*/) -{ - queue_rebuild(); -} - -void -LayerParamTreeStore::on_value_node_child_removed(synfig::ValueNode::Handle /*value_node*/,synfig::ValueNode::Handle /*child*/) -{ - rebuild(); -} - -void -LayerParamTreeStore::on_value_node_changed(etl::handle /*value_node*/) -{ - queue_refresh(); -} - -void -LayerParamTreeStore::on_value_node_replaced(synfig::ValueNode::Handle /*replaced_value_node*/,synfig::ValueNode::Handle /*new_value_node*/) -{ - queue_rebuild(); -} - -void -LayerParamTreeStore::on_layer_param_changed(synfig::Layer::Handle /*handle*/,synfig::String /*param_name*/) -{ - queue_refresh(); -}