@@ -574,58 +574,95 @@ void
574574CellRenderer_ValueBase::gradient_edited (synfig::Gradient gradient, Glib::ustring path)
575575{
576576 synfigapp::ValueDesc vd = App::dialog_gradient->get_value_desc ();
577- if (vd.is_valid ()) {
578- if (vd.parent_is_layer ()) {
579- if (is_layer_deleted (vd.get_layer ()))
580- return ;
581- }
582- // do not emit signal_edited_ : gradient dialog may be opened by other cell
583- // and would try to update the parameter related to current one
584- // as it just remembered its parameter tree path
585- // Example:
586- // 1. Create a region layer
587- // 2. Create a gradient layer
588- // 3. Click on gradient parameter to edit it
589- // 4. Without closing gradient dialog, select the region layer instead
590- // 5. Try to edit the gradient
591- // 6. Error Message appears
577+ if (!vd.is_valid ()) {
578+ ValueBase old_value (property_value_.get_value ());
579+ ValueBase value (gradient);
580+ if (old_value != value)
581+ signal_edited_ (path, value);
582+
583+ return ;
584+ }
585+
586+ if (!vd.parent_is_layer ()) {
592587 canvas_interface->change_value (vd, gradient);
593588 return ;
594589 }
595590
596- ValueBase old_value (property_value_.get_value ());
597- ValueBase value (gradient);
598- if (old_value != value)
599- signal_edited_ (path, value);
591+ if (is_layer_deleted (vd.get_layer ()))
592+ return ;
593+
594+ // do not emit signal_edited_ : gradient dialog may be opened by other cell
595+ // and would try to update the parameter related to current one
596+ // as it just remembered its parameter tree path
597+ // Example:
598+ // 1. Create a region layer
599+ // 2. Create a gradient layer
600+ // 3. Click on gradient parameter to edit it
601+ // 4. Without closing gradient dialog, select the region layer instead
602+ // 5. Try to edit the gradient
603+ // 6. Error Message appears
604+ synfigapp::SelectionManager::LayerList selected_layers = canvas_interface->get_selection_manager ()->get_selected_layers ();
605+ const Layer::Handle& trigger_layer = vd.get_layer ();
606+ bool is_trigger_layer_still_selected = std::find (selected_layers.begin (), selected_layers.end (), trigger_layer) != selected_layers.end ();
607+ if (!is_trigger_layer_still_selected)
608+ return ;
609+
610+ if (selected_layers.size () <= 1 ) {
611+ canvas_interface->change_value (vd, gradient);
612+ } else {
613+ synfigapp::Action::PassiveGrouper set_multiple_color_action (canvas_interface->get_instance ().get (), strprintf (_ (" Set Layer Gradients (%d)" ), selected_layers.size ()));
614+ for (const auto & layer : selected_layers) {
615+ canvas_interface->change_value (synfigapp::ValueDesc (layer, vd.get_param_name ()), gradient);
616+ }
617+ }
600618}
601619
602620void
603621CellRenderer_ValueBase::color_edited (synfig::Color color, Glib::ustring path)
604622{
605623 synfigapp::ValueDesc vd = App::dialog_color->get_value_desc ();
606- if (vd.is_valid ()) {
607- if (vd.parent_is_layer ()) {
608- if (is_layer_deleted (vd.get_layer ()))
609- return ;
610- }
611- // do not emit signal_edited_ : color dialog may be opened by other cell
612- // and would try to update the parameter related to current one
613- // as it just remembered its parameter tree path
614- // Example:
615- // 1. Create a region layer
616- // 2. Create an outline layer
617- // 3. Click on color parameter to edit it
618- // 4. Without closing color dialog, select the region layer instead
619- // 5. Try to edit the color
620- // 6. Error Message appears
624+ if (!vd.is_valid ()) {
625+ ValueBase old_value (property_value_.get_value ());
626+ ValueBase value (color);
627+ if (old_value != value)
628+ signal_edited_ (path, value);
629+
630+ return ;
631+ }
632+
633+ if (!vd.parent_is_layer ()) {
621634 canvas_interface->change_value (vd, color);
622635 return ;
623636 }
624637
625- ValueBase old_value (property_value_.get_value ());
626- ValueBase value (color);
627- if (old_value != value)
628- signal_edited_ (path, value);
638+ if (is_layer_deleted (vd.get_layer ()))
639+ return ;
640+
641+ // do not emit signal_edited_ : color dialog may be opened by other cell
642+ // and would try to update the parameter related to current one
643+ // as it just remembered its parameter tree path
644+ // Example:
645+ // 1. Create a region layer
646+ // 2. Create an outline layer
647+ // 3. Click on color parameter to edit it
648+ // 4. Without closing color dialog, select the region layer instead
649+ // 5. Try to edit the color
650+ // 6. Error Message appears
651+
652+ synfigapp::SelectionManager::LayerList selected_layers = canvas_interface->get_selection_manager ()->get_selected_layers ();
653+ const Layer::Handle& trigger_layer = vd.get_layer ();
654+ bool is_trigger_layer_still_selected = std::find (selected_layers.begin (), selected_layers.end (), trigger_layer) != selected_layers.end ();
655+ if (!is_trigger_layer_still_selected)
656+ return ;
657+
658+ if (selected_layers.size () <= 1 ) {
659+ canvas_interface->change_value (vd, color);
660+ } else {
661+ synfigapp::Action::PassiveGrouper set_multiple_color_action (canvas_interface->get_instance ().get (), strprintf (_ (" Set Layer Colors (%d)" ), selected_layers.size ()));
662+ for (const auto & layer : selected_layers) {
663+ canvas_interface->change_value (synfigapp::ValueDesc (layer, vd.get_param_name ()), color);
664+ }
665+ }
629666}
630667
631668Gtk::CellEditable*
0 commit comments