complete left click event handle

This commit is contained in:
2017-02-09 22:08:30 +00:00
parent de1784e932
commit 914fc34331
8 changed files with 140 additions and 11 deletions

View File

@@ -52,6 +52,39 @@ enum class kShapeType : uint16_t
Slice9 = const_hash("slice9"),
};
enum class kEventResult : uint8_t
{
Handled,
UnHandled,
};
enum class kEventCategory : uint8_t
{
MouseEvent,
};
enum class kEventType : uint8_t
{
MouseDownL,
MouseDownR,
MouseMove,
MouseUpL,
MouseUpR,
};
class Event
{
public:
kEventCategory m_cat;
kEventType m_type;
};
class MouseEvent : public Event
{
public:
MouseEvent() { m_cat = kEventCategory::MouseEvent; }
glm::vec2 m_pos;
};
class Widget
{
public:
@@ -65,6 +98,7 @@ public:
virtual void draw() { }
virtual void parse_attributes(kAttribute ka, const tinyxml2::XMLAttribute* attr) { }
virtual void update() { }
virtual kEventResult on_event(Event* e) { return kEventResult::UnHandled; }
};
class WidgetRef : public Widget
@@ -136,6 +170,11 @@ public:
break;
}
}
virtual kEventResult on_event(Event* e)
{
m_color = rand_color();
return kEventResult::Handled;
}
};
class WidgetShape : public Widget
@@ -288,6 +327,11 @@ public:
{
mvp = proj * pos;
}
virtual kEventResult on_event(Event* e)
{
m_color = rand_color();
return kEventResult::Handled;
}
};
class WidgetImage : public Widget
@@ -366,6 +410,11 @@ public:
break;
}
}
virtual kEventResult on_event(Event* e)
{
MouseEvent* me = static_cast<MouseEvent*>(e);
return kEventResult::UnHandled;
}
};
class Node
@@ -377,22 +426,28 @@ class Node
class LayoutManager* m_manager;
public:
uint16_t m_nodeID;
std::string m_nodeID_s;
std::vector<Node> m_children;
std::unique_ptr<Widget> m_widget;
glm::vec2 m_pos;
glm::vec2 m_size;
glm::vec4 m_clip;
std::string m_name;
bool m_display = true;
Node(const Node&) = delete;
Node& operator=(const Node&) = delete;
Node&& operator=(Node&& o) { return std::forward<Node>(o); }
Node(Node&& o)
{
m_name = std::move(o.m_name);
m_nodeID_s = std::move(o.m_nodeID_s);
m_widget = std::move(o.m_widget);
m_children = std::move(o.m_children);
for (auto& c : m_children)
c.parent = this;
m_nodeID = o.m_nodeID;
m_display = o.m_display;
parent = o.parent;
y_node = o.y_node;
m_pos = o.m_pos;
@@ -444,6 +499,8 @@ public:
void load_internal(const tinyxml2::XMLElement* x_node);
void draw();
Node clone();
Node* find(const char* ids);
kEventResult on_event(Event* e);
class iterator
{