Skip to content

Commit 842638c

Browse files
authored
fix: regression: couldn't edit color or gradient of multiple layers (synfig#3470)
Introduced when fixing synfig#3288 ( 483b5ed - PR 3373 ). By the way, both commits fix another case: (In Synfig <= 1.5.3) 1. Create a text layer 2. Create a star layer 3. Select the text layer 4. Click on color parameter of text layer to open Color editor 5. Select both layers (text and star) 6. Change the color in the previously opened Color editor 7. It changes the text color, but yells an error to star The problem does not happen if you open color dialog after select both layers (step #5 above) fix synfig#3469
1 parent f532d7c commit 842638c

File tree

1 file changed

+75
-38
lines changed

1 file changed

+75
-38
lines changed

synfig-studio/src/gui/cellrenderer/cellrenderer_value.cpp

Lines changed: 75 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -574,58 +574,95 @@ void
574574
CellRenderer_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

602620
void
603621
CellRenderer_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

631668
Gtk::CellEditable*

0 commit comments

Comments
 (0)