added checkbox, slider, layer panel, brushes panel

This commit is contained in:
2017-03-19 23:51:45 +00:00
parent 011aeb8948
commit 03a8266972
5 changed files with 624 additions and 203 deletions

View File

@@ -36,9 +36,12 @@ kEventResult Node::on_event(Event* e)
{
case kEventCategory::MouseEvent:
{
if (m_mouse_ignore)
break;
MouseEvent* me = static_cast<MouseEvent*>(e);
bool inside = point_in_rect(me->m_pos, m_clip);
bool inside_old = m_mouse_inside;
m_mouse_inside = inside;
switch (e->m_type)
{
case kEventType::MouseDownL:
@@ -55,7 +58,6 @@ kEventResult Node::on_event(Event* e)
e2.m_type = kEventType::MouseEnter;
handle_event(&e2);
}
m_mouse_inside = inside;
if (inside || m_mouse_captured)
ret = handle_event(e);
if (inside_old == true && inside == false)
@@ -78,6 +80,21 @@ kEventResult Node::on_event(Event* e)
return ret;
}
const Node* Node::init_template(const char* id)
{
const auto& m_template = static_cast<Node*>((*m_manager)[const_hash(id)]->m_children[0].get());
for (auto& c : m_template->m_children)
{
auto node = c->clone();
add_child(node);
node->init();
node->create();
node->loaded();
}
YGNodeCopyStyle(y_node, m_template->y_node);
return m_template;
}
void Node::add_child(Node* n)
{
m_children.emplace_back(n);
@@ -86,16 +103,58 @@ void Node::add_child(Node* n)
YGNodeInsertChild(y_node, n->y_node, YGNodeGetChildCount(y_node));
}
void Node::add_child(Node* n, int index)
{
m_children.emplace_back(n);
n->parent = this;
n->m_manager = m_manager;
YGNodeInsertChild(y_node, n->y_node, index);
}
void Node::remove_child(Node* n)
{
auto i = std::find_if(m_children.begin(), m_children.end(), [=](std::unique_ptr<Node>& ptr) { return ptr.get() == n; });
if (i != m_children.end())
{
m_children.erase(i);
YGNodeRemoveChild(y_node, n->y_node);
m_children.erase(i);
}
}
void Node::move_child(Node* n, int index)
{
YGNodeRemoveChild(y_node, n->y_node);
YGNodeInsertChild(y_node, n->y_node, index);
}
void Node::move_child_offset(Node* n, int offset)
{
int count = YGNodeGetChildCount(y_node);
for (int i = 0; i < count; i++)
{
if (YGNodeGetChild(y_node, i) == n->y_node)
{
int new_index = glm::clamp<int>(i + offset, 0, count - 1);
YGNodeRemoveChild(y_node, n->y_node);
YGNodeInsertChild(y_node, n->y_node, new_index);
break;
}
}
}
int Node::get_child_index(Node* n)
{
int count = YGNodeGetChildCount(y_node);
for (int i = 0; i < count; i++)
{
if (YGNodeGetChild(y_node, i) == n->y_node)
{
return i;
}
}
return -1;
}
void Node::update(float width, float height, float zoom)
{
m_zoom = zoom;
@@ -358,71 +417,22 @@ void Node::load_internal(const tinyxml2::XMLElement* x_node)
kWidget child_id = (kWidget)const_hash(x_child->Name());
switch (child_id)
{
case kWidget::Border:
{
auto n = new NodeBorder();
add_child(n);
n->load_internal(x_child);
break;
}
// case kWidget::Shape:
// break;
case kWidget::Image:
{
auto n = new NodeImage();
add_child(n);
n->load_internal(x_child);
break;
}
case kWidget::Icon:
{
auto n = new NodeIcon();
add_child(n);
n->load_internal(x_child);
break;
}
case kWidget::Text:
{
auto n = new NodeText();
add_child(n);
n->load_internal(x_child);
break;
}
case kWidget::Button:
{
auto n = new NodeButton();
add_child(n);
n->load_internal(x_child);
break;
}
case kWidget::ButtonCustom:
{
auto n = new NodeButtonCustom();
add_child(n);
n->load_internal(x_child);
break;
}
case kWidget::SliderCursor:
{
auto n = new NodeSliderCursor();
add_child(n);
n->load_internal(x_child);
break;
}
case kWidget::PopupMenu:
{
auto n = new NodePopupMenu();
add_child(n);
n->load_internal(x_child);
break;
}
case kWidget::Viewport:
{
auto n = new NodeViewport();
add_child(n);
n->load_internal(x_child);
break;
}
#define CASE(W,C) case W: { auto n = new C(); add_child(n); n->load_internal(x_child); break; }
CASE(kWidget::Border, NodeBorder);
CASE(kWidget::Image, NodeImage);
CASE(kWidget::Icon, NodeIcon);
CASE(kWidget::Text, NodeText);
CASE(kWidget::Button , NodeButton);
CASE(kWidget::ButtonCustom, NodeButtonCustom);
CASE(kWidget::SliderCursor, NodeSliderCursor);
CASE(kWidget::Slider, NodeSlider);
CASE(kWidget::PopupMenu, NodePopupMenu);
CASE(kWidget::Viewport, NodeViewport);
CASE(kWidget::CheckBox, NodeCheckBox);
CASE(kWidget::Layer, NodeLayer);
CASE(kWidget::PanelLayers, NodePanelLayers);
CASE(kWidget::PanelBrushes, NodePanelBrushes);
#undef CASE
case kWidget::Ref:
{
auto ids = x_child->Attribute("id");