From 2051d167a4dcbabbf831ec3e926147fc581f78c6 Mon Sep 17 00:00:00 2001 From: Ivan Mahonin Date: Feb 01 2016 16:08:49 +0000 Subject: Synchronized list of blanks layers --- diff --git a/synfig-core/src/synfig/layer.cpp b/synfig-core/src/synfig/layer.cpp index c026107..48070fc 100644 --- a/synfig-core/src/synfig/layer.cpp +++ b/synfig-core/src/synfig/layer.cpp @@ -218,8 +218,16 @@ synfig::Layer::set_canvas(etl::loose_handle x) void synfig::Layer::on_canvas_set() -{ -} + { } + +void +synfig::Layer::on_static_param_changed(const String & /* param */) + { } + +void +synfig::Layer::on_dynamic_param_changed(const String & /* param */) + { } + etl::loose_handle synfig::Layer::get_canvas()const @@ -269,6 +277,22 @@ Layer::set_description(const String& x) } } +void +Layer::static_param_changed(const String ¶m) +{ + on_static_param_changed(param); + if (!dynamic_param_list().count(param)) + signal_static_param_changed_(param); +} + +void +Layer::dynamic_param_changed(const String ¶m) +{ + on_dynamic_param_changed(param); + if (!dynamic_param_list().count(param)) + signal_dynamic_param_changed_(param); +} + bool Layer::connect_dynamic_param(const String& param, etl::loose_handle value_node) { @@ -277,7 +301,11 @@ Layer::connect_dynamic_param(const String& param, etl::loose_handle v if(previous==value_node) return true; + String param_noref = param; dynamic_param_list_[param]=ValueNode::Handle(value_node); + dynamic_param_list_connections_[param] = + value_node->signal_changed().connect( + sigc::bind(sigc::mem_fun(*this, &Layer::dynamic_param_changed), param_noref) ); if(previous) remove_child(previous.get()); @@ -289,6 +317,7 @@ Layer::connect_dynamic_param(const String& param, etl::loose_handle v value_node->set_parent_canvas(get_canvas()); } + dynamic_param_changed(param); changed(); return true; } @@ -300,6 +329,8 @@ Layer::disconnect_dynamic_param(const String& param) if(previous) { + dynamic_param_list_connections_[param].disconnect(); + dynamic_param_list_connections_.erase(param); dynamic_param_list_.erase(param); // fix 2353284: if two parameters in the same layer are @@ -314,6 +345,7 @@ Layer::disconnect_dynamic_param(const String& param) if (iter == dynamic_param_list().end()) remove_child(previous.get()); + static_param_changed(param); changed(); } return true; diff --git a/synfig-core/src/synfig/layer.h b/synfig-core/src/synfig/layer.h index 1b41834..621c350 100644 --- a/synfig-core/src/synfig/layer.h +++ b/synfig-core/src/synfig/layer.h @@ -97,6 +97,7 @@ if (#x=="param_"+param && x.get_type()==value.get_type()) \ { \ x=value; \ + static_param_changed(param); \ return true; \ } @@ -109,6 +110,7 @@ { #define IMPORT_VALUE_PLUS_END \ } \ + static_param_changed(param); \ return true; \ } #define IMPORT_VALUE_PLUS(x,y) \ @@ -295,6 +297,7 @@ private: //! Map of parameter with animated value nodes DynamicParamList dynamic_param_list_; + std::map dynamic_param_list_connections_; //! A description of what this layer does String description_; @@ -336,6 +339,10 @@ private: sigc::signal signal_removed_from_group_; + sigc::signal signal_static_param_changed_; + + sigc::signal signal_dynamic_param_changed_; + /* -- ** -- S I G N A L I N T E R F A C E ------------------------------------- */ @@ -358,12 +365,19 @@ public: sigc::signal& signal_removed_from_group() { return signal_removed_from_group_; } + sigc::signal& signal_static_param_changed() { return signal_static_param_changed_; } + + sigc::signal& signal_dynamic_param_changed() { return signal_dynamic_param_changed_; } + /* -- ** -- C O N S T R U C T O R S --------------------------------------------- */ protected: + void static_param_changed(const String ¶m); + void dynamic_param_changed(const String ¶m); + Layer(); public: @@ -376,6 +390,8 @@ public: public: virtual void on_canvas_set(); + virtual void on_static_param_changed(const String ¶m); + virtual void on_dynamic_param_changed(const String ¶m); //! Adds this layer to the given layer group void add_to_group(const String&); diff --git a/synfig-core/src/synfig/layers/layer_pastecanvas.cpp b/synfig-core/src/synfig/layers/layer_pastecanvas.cpp index c69d412..71c00c3 100644 --- a/synfig-core/src/synfig/layers/layer_pastecanvas.cpp +++ b/synfig-core/src/synfig/layers/layer_pastecanvas.cpp @@ -229,6 +229,10 @@ Layer_PasteCanvas::set_param(const String & param, const ValueBase &value) } void +Layer_PasteCanvas::childs_changed() + { on_childs_changed(); } + +void Layer_PasteCanvas::set_sub_canvas(etl::handle x) { if(canvas && muck_with_time_) @@ -238,20 +242,15 @@ Layer_PasteCanvas::set_sub_canvas(etl::handle x) if (extra_reference) canvas->unref(); - child_changed_connection.disconnect(); + childs_changed_connection.disconnect(); if (canvas != x) signal_subcanvas_changed()(); canvas=x; - /*if(canvas) - child_changed_connection=canvas->signal_changed().connect( - sigc::mem_fun( - *this, - &Layer_PasteCanvas::changed - ) - ); - */ + if(canvas) + childs_changed_connection=canvas->signal_changed().connect( + sigc::mem_fun(*this, &Layer_PasteCanvas::childs_changed) ); if(canvas && muck_with_time_) add_child(canvas.get()); diff --git a/synfig-core/src/synfig/layers/layer_pastecanvas.h b/synfig-core/src/synfig/layers/layer_pastecanvas.h index c9c16b4..3f2eb98 100644 --- a/synfig-core/src/synfig/layers/layer_pastecanvas.h +++ b/synfig-core/src/synfig/layers/layer_pastecanvas.h @@ -78,7 +78,7 @@ private: //! affected by the origin and transformation. mutable Rect bounds; //! signal connection for children. Seems to be used only here - sigc::connection child_changed_connection; + sigc::connection childs_changed_connection; // Nasty hack: Remember whether we called an extra ref() when // setting the canvas, so we know whether to call an extra unref() @@ -107,6 +107,8 @@ private: // 'extra_reference' member to store that decision. bool extra_reference; + void childs_changed(); + /* -- ** -- S I G N A L S ------------------------------------------------------- */ @@ -191,6 +193,8 @@ public: virtual void fill_sound_processor(SoundProcessor &soundProcessor) const; + virtual void on_childs_changed() { } + protected: //! Function to be overloaded that fills the Time Point Set with //! all the children Time Points. In this case the children Time Points diff --git a/synfig-core/src/synfig/layers/layer_switch.cpp b/synfig-core/src/synfig/layers/layer_switch.cpp index 5468716..08acb41 100644 --- a/synfig-core/src/synfig/layers/layer_switch.cpp +++ b/synfig-core/src/synfig/layers/layer_switch.cpp @@ -152,11 +152,55 @@ Layer_Switch::apply_z_range_to_params(ContextParams &cp)const } void +Layer_Switch::possible_layers_changed() +{ + on_possible_layers_changed(); + signal_possible_layers_changed_(); +} + +void +Layer_Switch::on_childs_changed() +{ + Layer_PasteCanvas::on_childs_changed(); + std::set a(last_existant_layers), b; + get_existant_layers(b); + if (a != b) + possible_layers_changed(); +} + +void +Layer_Switch::on_static_param_changed(const String ¶m) +{ + Layer_PasteCanvas::on_static_param_changed(param); + if (param == "layer_name") + { + std::set a(last_possible_layers), b; + get_possible_layers(b); + if (a != b) + possible_layers_changed(); + } +} + +void +Layer_Switch::on_dynamic_param_changed(const String ¶m) +{ + Layer_PasteCanvas::on_dynamic_param_changed(param); + if (param == "layer_name") + { + std::set a(last_possible_layers), b; + get_possible_layers(b); + if (a != b) + possible_layers_changed(); + } +} + +void Layer_Switch::get_existant_layers(std::set &x) const { if (!get_sub_canvas()) return; for(IndependentContext i = get_sub_canvas()->get_independent_context(); *i; ++i) x.insert((*i)->get_description()); + last_existant_layers = x; } void @@ -175,6 +219,7 @@ Layer_Switch::get_possible_layers(std::set &x) const if (!param_layer_name.get(String()).empty()) x.insert(param_layer_name.get(String())); } + last_possible_layers = x; } void diff --git a/synfig-core/src/synfig/layers/layer_switch.h b/synfig-core/src/synfig/layers/layer_switch.h index 7ae31e7..6606bd0 100644 --- a/synfig-core/src/synfig/layers/layer_switch.h +++ b/synfig-core/src/synfig/layers/layer_switch.h @@ -47,6 +47,12 @@ private: //! Parameter: (String) Active Layer Name ValueBase param_layer_name; + mutable std::set last_possible_layers; + mutable std::set last_existant_layers; + + sigc::signal signal_possible_layers_changed_; + void possible_layers_changed(); + public: //! Default constructor Layer_Switch(); @@ -64,6 +70,13 @@ public: Layer::Handle get_current_layer()const; + sigc::signal& signal_possible_layers_changed() { return signal_possible_layers_changed_; } + + virtual void on_childs_changed(); + virtual void on_static_param_changed(const String ¶m); + virtual void on_dynamic_param_changed(const String ¶m); + virtual void on_possible_layers_changed() { } + void get_existant_layers(std::set &x) const; void get_possible_layers(std::set &x) const; void get_possible_new_layers(std::set &x) const; diff --git a/synfig-studio/src/gui/trees/layertreestore.cpp b/synfig-studio/src/gui/trees/layertreestore.cpp index 0f3667c..c5b0da7 100644 --- a/synfig-studio/src/gui/trees/layertreestore.cpp +++ b/synfig-studio/src/gui/trees/layertreestore.cpp @@ -233,7 +233,7 @@ LayerTreeStore::get_value_vfunc(const Gtk::TreeModel::iterator& iter, int column if(sub_canvas && !sub_canvas->is_inline()) { Gtk::TreeRow row=*iter; - if(*row.parent()) + if(*row.parent() && RECORD_TYPE_LAYER == (RecordType)(*row.parent())[model.record_type]) { paste = etl::handle::cast_dynamic( Layer::Handle((*row.parent())[model.layer]) ); @@ -676,6 +676,10 @@ LayerTreeStore::rebuild() iter->second.disconnect(); subcanvas_changed_connections.clear(); + for (iter = switch_changed_connections.begin(); iter != switch_changed_connections.end(); iter++) + iter->second.disconnect(); + switch_changed_connections.clear(); + //etl::clock timer;timer.reset(); //synfig::warning("---------rebuilding layer table---------"); @@ -719,39 +723,43 @@ LayerTreeStore::refresh() void LayerTreeStore::refresh_row(Gtk::TreeModel::Row &row) { - Layer::Handle layer=row[model.layer]; - /* + RecordType record_type = row[model.record_type]; + Layer::Handle layer = row[model.layer]; + + if (record_type == RECORD_TYPE_LAYER && layer) { - row[model.name] = layer->get_local_name(); - if(layer->get_description().empty()) - { - row[model.label] = layer->get_local_name(); - row[model.tooltip] = Glib::ustring("Layer"); - } - else + /* { - row[model.label] = layer->get_description(); - row[model.tooltip] = layer->get_local_name(); + row[model.name] = layer->get_local_name(); + if(layer->get_description().empty()) + { + row[model.label] = layer->get_local_name(); + row[model.tooltip] = Glib::ustring("Layer"); + } + else + { + row[model.label] = layer->get_description(); + row[model.tooltip] = layer->get_local_name(); + } } - } - */ + */ - if(layer->dynamic_param_list().count("z_depth")) - row[model.z_depth]=Time::begin(); - // row_changed(get_path(row),row); + if(layer->dynamic_param_list().count("z_depth")) + row[model.z_depth]=Time::begin(); + // row_changed(get_path(row),row); - Gtk::TreeModel::Children children = row.children(); - Gtk::TreeModel::Children::iterator iter; + Gtk::TreeModel::Children children = row.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); - } + if(!children.empty()) + for(iter = children.begin(); iter && iter != children.end(); ++iter) + { + Gtk::TreeRow row=*iter; + refresh_row(row); + } + } } - void LayerTreeStore::set_row_layer(Gtk::TreeRow &row, const synfig::Layer::Handle &handle) { @@ -851,8 +859,11 @@ LayerTreeStore::on_layer_added(synfig::Layer::Handle layer) if (etl::handle::cast_dynamic(layer)) subcanvas_changed_connections[layer] = (etl::handle::cast_dynamic(layer))->signal_subcanvas_changed().connect( - sigc::mem_fun(*this,&studio::LayerTreeStore::queue_rebuild) - ); + sigc::mem_fun(*this,&studio::LayerTreeStore::queue_rebuild) ); + if (etl::handle layer_switch = etl::handle::cast_dynamic(layer)) + switch_changed_connections[layer_switch] = + layer_switch->signal_possible_layers_changed().connect( + sigc::mem_fun(*this,&studio::LayerTreeStore::queue_rebuild) ); assert(layer); Gtk::TreeRow row; @@ -881,6 +892,11 @@ LayerTreeStore::on_layer_removed(synfig::Layer::Handle handle) subcanvas_changed_connections[handle].disconnect(); subcanvas_changed_connections.erase(handle); } + if (etl::handle::cast_dynamic(handle)) + { + switch_changed_connections[handle].disconnect(); + switch_changed_connections.erase(handle); + } Gtk::TreeModel::Children::iterator iter; if(find_layer_row(handle,iter)) erase(iter); @@ -981,7 +997,7 @@ LayerTreeStore::on_layer_lowered(synfig::Layer::Handle layer) //synfigapp::SelectionManager::LayerList layer_list=canvas_interface()->get_selection_manager()->get_selected_layers(); iter2=iter; iter2++; - if(!iter2) + if(!iter2 || RECORD_TYPE_LAYER != (*iter2)[model.record_type]) { rebuild(); return; @@ -1009,7 +1025,7 @@ LayerTreeStore::on_layer_raised(synfig::Layer::Handle layer) if(find_layer_row_(layer, canvas_interface()->get_canvas(), children_, iter,iter2)) { - if(iter!=iter2) + if(iter!=iter2 && RECORD_TYPE_LAYER==(*iter2)[model.record_type]) { //Gtk::TreeModel::Row row = *iter; Gtk::TreeModel::Row row2 = *iter2; @@ -1149,7 +1165,8 @@ LayerTreeStore::find_layer_row_(const synfig::Layer::Handle &layer, synfig::Canv for(iter=prev=layers.begin(); iter && iter != layers.end(); prev=iter++) { Gtk::TreeModel::Row row = *iter; - if(layer==(synfig::Layer::Handle)row[model.layer]) + if ( RECORD_TYPE_LAYER == (RecordType)row[model.record_type] + && layer == (synfig::Layer::Handle)row[model.layer] ) return true; } @@ -1167,6 +1184,9 @@ LayerTreeStore::find_layer_row_(const synfig::Layer::Handle &layer, synfig::Canv if(row.children().empty()) continue; + if (RECORD_TYPE_LAYER != (RecordType)row[model.record_type]) + continue; + Canvas::Handle canvas((*row.children().begin())[model.canvas]); if(!canvas) continue; diff --git a/synfig-studio/src/gui/trees/layertreestore.h b/synfig-studio/src/gui/trees/layertreestore.h index 3416bd5..df2d8ad 100644 --- a/synfig-studio/src/gui/trees/layertreestore.h +++ b/synfig-studio/src/gui/trees/layertreestore.h @@ -125,6 +125,7 @@ private: sigc::connection queue_connection; std::map subcanvas_changed_connections; + std::map switch_changed_connections; etl::loose_handle canvas_interface_;