diff --git a/data/layout.xml b/data/layout.xml
index 8bbb7fd..c5e5a85 100644
--- a/data/layout.xml
+++ b/data/layout.xml
@@ -1617,25 +1617,25 @@ Here's a list of what's available in this release.
-
+
+
+
-
-
-
-
+
+
+
-
-
-
+
+
diff --git a/src/node.cpp b/src/node.cpp
index b1fcb49..12adb57 100644
--- a/src/node.cpp
+++ b/src/node.cpp
@@ -114,12 +114,33 @@ kEventResult Node::on_event(Event* e)
}
else
{
- return kEventResult::Consumed;
+ ret = kEventResult::Consumed;
+ break;
}
}
}
if (ret == kEventResult::Consumed)
- return ret;
+ {
+ if (e->m_cat == kEventCategory::MouseEvent)
+ {
+ MouseEvent* me = static_cast(e);
+ bool old_inside = m_mouse_inside;
+ m_mouse_inside = point_in_rect(me->m_pos, m_clip);
+ if (old_inside == false && m_mouse_inside == true)
+ {
+ MouseEvent e2 = *me;
+ e2.m_type = kEventType::MouseEnter;
+ handle_event(&e2);
+ }
+ if (old_inside == true && m_mouse_inside == false)
+ {
+ MouseEvent e2 = *me;
+ e2.m_type = kEventType::MouseLeave;
+ handle_event(&e2);
+ }
+ }
+ return kEventResult::Consumed;
+ }
}
switch (e->m_cat)
diff --git a/src/node_dialog_picker.cpp b/src/node_dialog_picker.cpp
index 104ad68..737892e 100644
--- a/src/node_dialog_picker.cpp
+++ b/src/node_dialog_picker.cpp
@@ -36,15 +36,19 @@ void NodeColorPicker::draw()
// m_wheel->m_hsv = hsv;
}
-void NodeColorPicker::handle_value_changed()
+void NodeColorPicker::added(Node* parent)
{
-
+ m_interacted = false;
}
kEventResult NodeColorPicker::handle_event(Event* e)
{
switch (e->m_type)
{
+ case kEventType::MouseLeave:
+ if (!m_interacted)
+ break;
+ // else fall through
case kEventType::MouseUpL:
if (!m_mouse_inside)
{
@@ -93,6 +97,7 @@ void NodeColorPicker::init_controls()
m_color_cur->m_color = { rgb, 1 };
if (on_color_change)
on_color_change(this, rgb);
+ m_interacted = true;
};
auto hsv_setter = [this](Node* target, float v)
{
@@ -105,6 +110,7 @@ void NodeColorPicker::init_controls()
m_slider_b->m_value = rgb.z;
if (on_color_change)
on_color_change(this, rgb);
+ m_interacted = true;
};
m_slider_h->on_value_changed = hsv_setter;
m_slider_s->on_value_changed = hsv_setter;
@@ -121,6 +127,7 @@ void NodeColorPicker::init_controls()
m_slider_v->set_value(hsv.z);
if (on_color_change)
on_color_change(this, rgb);
+ m_interacted = true;
};
m_slider_r->on_value_changed = rgb_setter;
m_slider_g->on_value_changed = rgb_setter;
diff --git a/src/node_dialog_picker.h b/src/node_dialog_picker.h
index b5974ec..8c7f70e 100644
--- a/src/node_dialog_picker.h
+++ b/src/node_dialog_picker.h
@@ -11,6 +11,7 @@ public:
std::function on_popup_close;
std::function on_color_change;
+ bool m_interacted = false;
NodeSliderH* m_slider_h;
NodeSliderH* m_slider_s;
NodeSliderH* m_slider_v;
@@ -31,9 +32,9 @@ public:
virtual void init() override;
virtual void draw() override;
virtual kEventResult handle_event(Event* e) override;
+ virtual void added(Node* parent) override;
void init_controls();
void set_color(glm::vec3 rgb);
glm::vec3 get_hsv() const;
glm::vec3 get_rgb() const;
- void handle_value_changed();
};
diff --git a/src/node_panel_brush.cpp b/src/node_panel_brush.cpp
index 9ac3b69..8b6f90e 100644
--- a/src/node_panel_brush.cpp
+++ b/src/node_panel_brush.cpp
@@ -191,6 +191,10 @@ kEventResult NodePanelBrush::handle_event(Event* e)
{
switch (e->m_type)
{
+ case kEventType::MouseLeave:
+ if (!m_interacted)
+ break;
+ // else fall through
case kEventType::MouseUpL:
if (!m_mouse_inside)
{
@@ -217,6 +221,7 @@ void NodePanelBrush::handle_click(Node* target)
m_current->m_selected = true;
if (on_brush_changed)
on_brush_changed(this, m_container->get_child_index(target));
+ m_interacted = true;
}
int NodePanelBrush::find_brush(const std::string & name) const
@@ -330,6 +335,11 @@ bool NodePanelBrush::restore()
return false;
}
+void NodePanelBrush::added(Node* parent)
+{
+ m_interacted = false;
+}
+
// -----------------------------------------------------------------------
Node* NodeBrushPresetItem::clone_instantiate() const
@@ -426,6 +436,10 @@ kEventResult NodePanelBrushPreset::handle_event(Event* e)
{
switch (e->m_type)
{
+ case kEventType::MouseLeave:
+ if (!m_interacted)
+ break;
+ // else fall through
case kEventType::MouseUpL:
if (!m_mouse_inside)
{
@@ -452,6 +466,7 @@ void NodePanelBrushPreset::handle_click(Node* target)
m_current->m_selected = true;
if (on_brush_changed)
on_brush_changed(this, m_current->m_brush);
+ m_interacted = true;
}
bool NodePanelBrushPreset::save()
@@ -704,3 +719,8 @@ void NodePanelBrushPreset::add_brush(std::shared_ptr brush)
b->m_caption_size->set_text_format("%d", (int)brush->m_tip_size);
b->on_click = std::bind(&NodePanelBrushPreset::handle_click, this, std::placeholders::_1);
}
+
+void NodePanelBrushPreset::added(Node* parent)
+{
+ m_interacted = false;
+}
diff --git a/src/node_panel_brush.h b/src/node_panel_brush.h
index ecdd64e..306c86f 100644
--- a/src/node_panel_brush.h
+++ b/src/node_panel_brush.h
@@ -33,6 +33,7 @@ class NodePanelBrush : public Node
NodeButtonCustom* m_btn_up;
NodeButtonCustom* m_btn_down;
NodeButtonCustom* m_btn_remove;
+ bool m_interacted = false;
struct header_t {
char magic[5]{ 'P', 'P', 'B', 'R', 0 };
uint16_t version = 0;
@@ -55,6 +56,7 @@ public:
virtual Node* clone_instantiate() const override;
virtual void init() override;
virtual kEventResult handle_event(Event* e) override;
+ virtual void added(Node* parent) override;
void handle_click(Node* target);
int find_brush(const std::string& name) const;
std::string get_texture_path(int index) const;
@@ -82,6 +84,7 @@ public:
class NodePanelBrushPreset : public Node
{
+ bool m_interacted = false;
NodeBrushPresetItem* m_current = nullptr;
NodeButtonCustom* m_btn_add;
NodeButtonCustom* m_btn_up;
@@ -179,6 +182,7 @@ public:
virtual Node* clone_instantiate() const override;
virtual void init() override;
virtual kEventResult handle_event(Event* e) override;
+ virtual void added(Node* parent) override;
void handle_click(Node* target);
bool save();
bool restore();
diff --git a/src/node_panel_color.cpp b/src/node_panel_color.cpp
index 42b18f0..7b46754 100644
--- a/src/node_panel_color.cpp
+++ b/src/node_panel_color.cpp
@@ -31,6 +31,7 @@ void NodePanelColor::init_controls()
m_quad->m_color = hue_color;
if (on_color_changed)
on_color_changed(this, m_color);
+ m_interacted = true;
};
m_quad->on_value_changed = [this](Node*, glm::vec2 pos)
{
@@ -39,6 +40,7 @@ void NodePanelColor::init_controls()
m_color = glm::vec4(convert_hsv2rgb(glm::vec3(hue, m_cursor.x, 1.f-m_cursor.y)), 1.f);
if (on_color_changed)
on_color_changed(this, m_color);
+ m_interacted = true;
};
m_hue->set_value(0);
}
@@ -57,6 +59,10 @@ kEventResult NodePanelColor::handle_event(Event* e)
{
switch (e->m_type)
{
+ case kEventType::MouseLeave:
+ if (!m_interacted)
+ break;
+ // else fall through
case kEventType::MouseUpL:
if (!m_mouse_inside)
{
@@ -76,4 +82,5 @@ kEventResult NodePanelColor::handle_event(Event* e)
void NodePanelColor::added(Node* parent)
{
set_color(Canvas::I->m_current_brush->m_tip_color);
+ m_interacted = false;
}
diff --git a/src/node_panel_color.h b/src/node_panel_color.h
index 310af3c..0258fdc 100644
--- a/src/node_panel_color.h
+++ b/src/node_panel_color.h
@@ -6,6 +6,7 @@
class NodePanelColor : public Node
{
public:
+ bool m_interacted = false;
NodeColorQuad* m_quad;
NodeSliderHue* m_hue;
glm::vec4 m_base_color;