Skip to content

Commit

Permalink
fix crash when undoing deletion of layer group and an inner layer
Browse files Browse the repository at this point in the history
fix #1070
  • Loading branch information
rodolforg committed Apr 5, 2020
1 parent 403c9b6 commit 509bdb8
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 1 deletion.
36 changes: 35 additions & 1 deletion synfig-studio/src/synfigapp/actions/layerremove.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,37 @@ ACTION_SET_CVS_ID(Action::LayerRemove,"$Id$");

/* === M E T H O D S ======================================================= */

bool LayerRemove::is_child_of_another_layer_in_list(Layer::LooseHandle layer) const
{
std::vector<Layer::LooseHandle> parent_list;
Layer::LooseHandle parent = layer->get_parent_paste_canvas_layer();
while (parent) {
parent_list.push_back(parent);
parent = parent->get_parent_paste_canvas_layer();
}

for (const auto &some_parent : parent_list) {
for (const auto &layer_pair : layer_list) {
if (some_parent == layer_pair.first) {
return true;
}
}
}
return false;
}

void LayerRemove::filter_layer_list()
{
std::list<std::pair<synfig::Layer::Handle,int> > filtered_layer_list;
for (auto layer_pair : layer_list) {
if (!is_child_of_another_layer_in_list(layer_pair.first))
filtered_layer_list.push_back(layer_pair);
}
layer_list = filtered_layer_list;
}

Action::LayerRemove::LayerRemove()
: is_filtered(false)
{
}

Expand Down Expand Up @@ -100,7 +130,7 @@ Action::LayerRemove::set_param(const synfig::String& name, const Action::Param &
std::pair<synfig::Layer::Handle,int> layer_pair;
layer_pair.first=param.get_layer();
layer_list.push_back(layer_pair);

is_filtered = false;
return true;
}

Expand All @@ -118,6 +148,10 @@ Action::LayerRemove::is_ready()const
void
Action::LayerRemove::perform()
{
if (!is_filtered) {
filter_layer_list();
is_filtered = true;
}
std::list<std::pair<synfig::Layer::Handle,int> >::iterator iter;
for(iter=layer_list.begin();iter!=layer_list.end();++iter)
{
Expand Down
4 changes: 4 additions & 0 deletions synfig-studio/src/synfigapp/actions/layerremove.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ class LayerRemove :

std::list<std::pair<synfig::Layer::Handle,int> > layer_list;

bool is_child_of_another_layer_in_list(synfig::Layer::LooseHandle layer) const;
void filter_layer_list();
bool is_filtered;

public:

LayerRemove();
Expand Down

0 comments on commit 509bdb8

Please sign in to comment.