diff --git a/src/canvas.cpp b/src/canvas.cpp index d4a0288..45d9179 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -1295,7 +1295,18 @@ void Canvas::layer_remove(int idx) // m_order index } void Canvas::layer_order(int idx, int pos) // m_order index { - std::swap(m_layers[idx], m_layers[pos]); + auto from = m_layers.begin() + idx; + auto to = m_layers.begin() + pos; + + if (pos < idx) + std::rotate(to, from, from + 1); + if (pos > idx) + std::rotate(from, from + 1, to + 1); + + if (m_current_layer_idx == idx) + m_current_layer_idx = pos; + else if (m_current_layer_idx == pos) + m_current_layer_idx = idx; } void Canvas::layer_merge(int source_idx, int dest_idx) // m_layer index { diff --git a/src/node_panel_layer.cpp b/src/node_panel_layer.cpp index 120b8e3..040f32e 100644 --- a/src/node_panel_layer.cpp +++ b/src/node_panel_layer.cpp @@ -146,11 +146,11 @@ void NodePanelLayer::init() ActionManager::add(a); }; btn_add->on_click = [this](Node*) { - add_layer(true, true); + add_layer(true, true, m_layers_container->get_child_index(m_current_layer) + 1); }; btn_remove->on_click = [this](Node*) { if (m_layers.size() == 1) - return; // dont' delete the last layer + return; // don't delete the last layer remove_layer(m_current_layer); }; btn_up->on_click = [this](Node*) { @@ -251,11 +251,11 @@ NodeLayer* NodePanelLayer::add_layer(const char* name, bool add_history /*= true return l.get(); } -void NodePanelLayer::add_layer(bool add_history /*= true*/, bool create_events /*= false*/) +void NodePanelLayer::add_layer(bool add_history /*= true*/, bool create_events /*= false*/, int index /*= -1*/) { static char s[64]; sprintf(s, "Layer-%d", id_counter++); - add_layer(s, add_history, create_events); + add_layer(s, add_history, create_events, nullptr, nullptr, index); } NodeLayer* NodePanelLayer::get_layer_at(int index) diff --git a/src/node_panel_layer.h b/src/node_panel_layer.h index 3708069..560fc37 100644 --- a/src/node_panel_layer.h +++ b/src/node_panel_layer.h @@ -63,7 +63,7 @@ public: virtual void init() override; virtual kEventResult handle_event(Event* e) override; void merge(int src_index, int dst_index, bool create_history); - void add_layer(bool add_history = true, bool create_events = false); + void add_layer(bool add_history = true, bool create_events = false, int index = -1); NodeLayer* add_layer(const char* name, bool add_history = true, bool create_events = false, std::shared_ptr layer = nullptr, std::shared_ptr layer_node = nullptr, int index = -1); NodeLayer* get_layer_at(int index);