diff --git a/data/layout.xml b/data/layout.xml index 18f8c4c..87b2a66 100644 --- a/data/layout.xml +++ b/data/layout.xml @@ -320,7 +320,7 @@ - + diff --git a/engine/app.cpp b/engine/app.cpp index 6b342df..9fbc3a6 100644 --- a/engine/app.cpp +++ b/engine/app.cpp @@ -154,6 +154,7 @@ void App::initLayout() LOG("initializing layout components"); sidebar = layout[main_id]->find("sidebar"); brushes = layout[main_id]->find("panel-brushes"); + layers = layout[main_id]->find("panel-layers"); if (auto* button = layout[main_id]->find("btn-close")) { button->on_click = [](Node*) { exit(0); }; diff --git a/engine/app.h b/engine/app.h index 75c503c..9f23106 100644 --- a/engine/app.h +++ b/engine/app.h @@ -21,6 +21,7 @@ public: NodePopupMenu* menu_layers = nullptr; NodeBorder* sidebar = nullptr; NodePanelBrushes* brushes; + NodePanelLayers* layers; const uint16_t main_id = const_hash("main"); float width; float height; diff --git a/engine/layout.h b/engine/layout.h index e968b17..5c16f7a 100644 --- a/engine/layout.h +++ b/engine/layout.h @@ -1172,7 +1172,11 @@ class NodePanelLayers : public Node NodeButtonCustom* btn_remove; NodeButtonCustom* btn_up; NodeButtonCustom* btn_down; + int id_counter = 0; public: + std::function on_layer_change; + std::function on_layer_delete; + std::function on_layer_add; NodeLayer* m_current_layer = nullptr; std::vector m_layers; NodeBorder* m_layers_container; @@ -1181,11 +1185,9 @@ public: { init_template("tpl-panel-layers"); m_layers_container = find("layers-container"); - for (int i = 0; i < 5; i++) + for (int i = 0; i < 1; i++) { - static char s[64]; - sprintf(s, "Layer-%d", i); - add_layer(s); + add_layer(); } m_current_layer = m_layers[0]; m_layers[0]->m_selected = true; @@ -1193,20 +1195,26 @@ public: btn_remove = find("btn-remove"); btn_up = find("btn-up"); btn_down = find("btn-down"); - btn_add->on_click = [this](Node*) { add_layer("New Layer"); }; + btn_add->on_click = [this](Node*) { + add_layer(); + }; btn_remove->on_click = [this](Node*) { if (m_layers.size() == 1) return; // dont' delete the last layer - auto it = std::find(m_layers.begin(), m_layers.end(), m_current_layer); - auto i = m_layers_container->get_child_index(m_current_layer); - m_layers_container->remove_child(m_current_layer); - m_layers.erase(it); - i = std::min(i, m_layers.size() - 1); - m_current_layer = m_layers[i]; - m_current_layer->m_selected = true; + remove_layer(m_current_layer); }; - btn_up->on_click = [this](Node*) { m_layers_container->move_child_offset(m_current_layer, -1); }; - btn_down->on_click = [this](Node*) { m_layers_container->move_child_offset(m_current_layer, +1); }; + btn_up->on_click = [this](Node*) { + m_layers_container->move_child_offset(m_current_layer, -1); + }; + btn_down->on_click = [this](Node*) { + m_layers_container->move_child_offset(m_current_layer, +1); + }; + } + void add_layer() + { + static char s[64]; + sprintf(s, "Layer-%d", id_counter++); + add_layer(s); } void add_layer(const char* name) { @@ -1218,6 +1226,22 @@ public: l->set_name(name); l->on_selected = std::bind(&NodePanelLayers::handle_layer_selected, this, std::placeholders::_1); m_layers.push_back(l); + if (on_layer_add) + on_layer_add(this); + } + void remove_layer(NodeLayer* layer) + { + auto it = std::find(m_layers.begin(), m_layers.end(), m_current_layer); + auto i = m_layers_container->get_child_index(m_current_layer); + m_layers_container->remove_child(m_current_layer); + m_layers.erase(it); + i = std::min(i, m_layers.size() - 1); + m_current_layer = m_layers[i]; + m_current_layer->m_selected = true; + if (on_layer_delete) + on_layer_delete(this, std::distance(m_layers.begin(), it)); + if (on_layer_change) + on_layer_change(this, -1, i); } void handle_layer_selected(NodeLayer* target) { @@ -1225,6 +1249,8 @@ public: m_current_layer->m_selected = false; m_current_layer = target; m_current_layer->m_selected = true; + if (on_layer_change) + on_layer_change(this, -1, m_layers_container->get_child_index(m_current_layer)); } };