diff --git a/data/layout.xml b/data/layout.xml index 041d722..d712eab 100644 --- a/data/layout.xml +++ b/data/layout.xml @@ -124,11 +124,11 @@ - - + + - + @@ -1280,7 +1280,7 @@ Here's a list of what's available in this release. - + diff --git a/src/app.cpp b/src/app.cpp index 575bdf1..e37a72a 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -594,6 +594,8 @@ void App::update(float dt) } //auto box = n->m_clip; //glm::ivec4 c = glm::vec4((int)box.x - 1, (int)(height / zoom - box.y - box.w) - 1, (int)box.z + 2, (int)box.w + 2) * zoom; + if (box.z <= 0.f || box.w <= 0.f) + return false; glm::ivec4 c = glm::vec4((int)box.x, (int)(height / zoom - box.y - box.w), (int)box.z, (int)box.w) * zoom; glScissor(c.x + off_x, c.y + off_y, c.z, c.w); n->draw(); diff --git a/src/app.h b/src/app.h index d3eccab..4e3b706 100644 --- a/src/app.h +++ b/src/app.h @@ -64,6 +64,9 @@ public: std::shared_ptr grid; std::shared_ptr presets; NodePanelQuick* quick; + NodePanelColor* floating_color; + NodeColorPicker* floating_picker; + NodePanelBrushPreset* floating_presets; NodeCanvas* canvas; const uint16_t main_id = const_hash("main"); const std::array res_map{ 512, 1024, 1536, 2048, 4096, 8192 }; diff --git a/src/app_layout.cpp b/src/app_layout.cpp index b9b482c..69c9fb3 100644 --- a/src/app_layout.cpp +++ b/src/app_layout.cpp @@ -5,6 +5,7 @@ #include "node_text.h" #include "node_progress_bar.h" #include "node_dialog_picker.h" +#include "node_panel_floating.h" void App::title_update() { @@ -872,6 +873,10 @@ void App::brush_update() *quick->m_button_brush_current_preview->m_brush = *Canvas::I->m_current_brush; quick->m_button_brush_current_preview->draw_stroke(); quick->m_button_color_current_inner->m_color = Canvas::I->m_current_brush->m_tip_color; + if (floating_picker) + floating_picker->set_color(Canvas::I->m_current_brush->m_tip_color); + if (floating_color) + floating_color->set_color(Canvas::I->m_current_brush->m_tip_color); } void App::init_menu_layer() @@ -1080,8 +1085,41 @@ void App::initLayout() }; } + // test floating panel + auto fp_presets = layout[main_id]->add_child(); + floating_presets = fp_presets->m_container->add_child(); + floating_presets->SetHeightP(100); + floating_presets->on_brush_changed = [this](Node* target, std::shared_ptr& b) { + auto c = Canvas::I->m_current_brush->m_tip_color; + *Canvas::I->m_current_brush = *b; + Canvas::I->m_current_brush->m_tip_color = c; + Canvas::I->m_current_brush->load(); + brush_update(); + }; + + auto fp_color = layout[main_id]->add_child(); + floating_color = fp_color->m_container->add_child(); + floating_color->SetHeightP(100); + floating_color->find("title")->destroy(); + floating_color->on_color_changed = [this](Node* target, glm::vec4 color) { + Canvas::I->m_current_brush->m_tip_color = color; + brush_update(); + }; + + auto fp_picker = layout[main_id]->add_child(); + fp_picker->m_container->SetSize(300, 500); + floating_picker = fp_picker->m_container->add_child(); + floating_picker->m_autohide = false; + floating_picker->on_color_change = [this](Node* target, glm::vec3 color) { + Canvas::I->m_current_brush->m_tip_color = glm::vec4(color, 1.f); + brush_update(); + }; + //picker->SetHeightP(100); + //color->find("title")->destroy(); + App::I.redraw = true; }; + LOG("initializing layout xml"); if (layout.m_loaded) { diff --git a/src/node.cpp b/src/node.cpp index 2b3e382..8c5e141 100644 --- a/src/node.cpp +++ b/src/node.cpp @@ -302,6 +302,8 @@ const Node* Node::init_template(const char* id) void Node::add_child(Node* n) { + if (n->m_parent) + n->m_parent->remove_child(n); m_children.emplace_back(n); n->m_parent = this; n->m_manager = m_manager; @@ -312,6 +314,8 @@ void Node::add_child(Node* n) void Node::add_child(Node* n, int index) { + if (n->m_parent) + n->m_parent->remove_child(n); m_children.emplace_back(n); n->m_parent = this; n->m_manager = m_manager; @@ -322,6 +326,8 @@ void Node::add_child(Node* n, int index) void Node::add_child(std::shared_ptr n) { + if (n->m_parent) + n->m_parent->remove_child(n.get()); m_children.push_back(n); n->m_parent = this; n->m_manager = m_manager; @@ -332,6 +338,8 @@ void Node::add_child(std::shared_ptr n) void Node::add_child(std::shared_ptr n, int index) { + if (n->m_parent) + n->m_parent->remove_child(n.get()); m_children.insert(m_children.begin() + index, n); n->m_parent = this; n->m_manager = m_manager; diff --git a/src/node_dialog_picker.cpp b/src/node_dialog_picker.cpp index 6b5a3d1..25942ee 100644 --- a/src/node_dialog_picker.cpp +++ b/src/node_dialog_picker.cpp @@ -46,7 +46,7 @@ kEventResult NodeColorPicker::handle_event(Event* e) switch (e->m_type) { case kEventType::MouseLeave: - if (!m_interacted) + if (!m_interacted || !m_autohide) break; // else fall through case kEventType::MouseUpL: diff --git a/src/node_dialog_picker.h b/src/node_dialog_picker.h index 8c7f70e..fc1b478 100644 --- a/src/node_dialog_picker.h +++ b/src/node_dialog_picker.h @@ -12,6 +12,7 @@ public: std::function on_color_change; bool m_interacted = false; + bool m_autohide = true; NodeSliderH* m_slider_h; NodeSliderH* m_slider_s; NodeSliderH* m_slider_v;