mirror of
https://github.com/miracle-wm-org/miracle-wm.git
synced 2024-12-02 08:48:07 +03:00
generally fixing up how nodes are inserted into the tree
This commit is contained in:
parent
6984692305
commit
3cec993799
26
src/node.cpp
26
src/node.cpp
@ -37,7 +37,7 @@ geom::Rectangle Node::get_rectangle()
|
|||||||
return area;
|
return area;
|
||||||
}
|
}
|
||||||
|
|
||||||
geom::Rectangle Node::new_node_position()
|
geom::Rectangle Node::new_node_position(int index)
|
||||||
{
|
{
|
||||||
if (is_window())
|
if (is_window())
|
||||||
{
|
{
|
||||||
@ -45,20 +45,24 @@ geom::Rectangle Node::new_node_position()
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (index < 0)
|
||||||
|
index = sub_nodes.size();
|
||||||
|
|
||||||
if (direction == NodeDirection::horizontal)
|
if (direction == NodeDirection::horizontal)
|
||||||
{
|
{
|
||||||
auto width_per_item = area.size.width.as_int() / static_cast<float>(sub_nodes.size() + 1);
|
auto width_per_item = area.size.width.as_int() / static_cast<float>(sub_nodes.size() + 1);
|
||||||
auto new_size = geom::Size{geom::Width{width_per_item}, area.size.height};
|
auto new_size = geom::Size{geom::Width{width_per_item}, area.size.height};
|
||||||
auto new_position = geom::Point{
|
auto new_position = geom::Point{
|
||||||
area.top_left.x.as_int() + area.size.width.as_int() - width_per_item,
|
area.top_left.x.as_int() + (index * width_per_item),
|
||||||
area.top_left.y
|
area.top_left.y
|
||||||
};
|
};
|
||||||
geom::Rectangle new_node_rect = {new_position, new_size};
|
geom::Rectangle new_node_rect = {new_position, new_size};
|
||||||
|
|
||||||
int divvied = ceil(new_node_rect.size.width.as_int() / static_cast<float>(sub_nodes.size()));
|
int divvied = ceil(new_node_rect.size.width.as_int() / static_cast<float>(sub_nodes.size()));
|
||||||
std::shared_ptr<Node> prev_node;
|
std::shared_ptr<Node> prev_node;
|
||||||
for (auto node : sub_nodes)
|
for (int i = 0; i < sub_nodes.size(); i++)
|
||||||
{
|
{
|
||||||
|
auto node = sub_nodes[i];
|
||||||
auto node_rect = node->get_rectangle();
|
auto node_rect = node->get_rectangle();
|
||||||
node_rect.size.width = geom::Width{node_rect.size.width.as_int() - divvied};
|
node_rect.size.width = geom::Width{node_rect.size.width.as_int() - divvied};
|
||||||
|
|
||||||
@ -68,6 +72,11 @@ geom::Rectangle Node::new_node_position()
|
|||||||
prev_node->get_rectangle().top_left.x.as_int() + prev_node->get_rectangle().size.width.as_int()};
|
prev_node->get_rectangle().top_left.x.as_int() + prev_node->get_rectangle().size.width.as_int()};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (i == index)
|
||||||
|
{
|
||||||
|
node_rect.top_left.x = geom::X{node_rect.top_left.x.as_int() + width_per_item};
|
||||||
|
}
|
||||||
|
|
||||||
node->set_rectangle(node_rect);
|
node->set_rectangle(node_rect);
|
||||||
prev_node = node;
|
prev_node = node;
|
||||||
}
|
}
|
||||||
@ -80,14 +89,15 @@ geom::Rectangle Node::new_node_position()
|
|||||||
auto new_size = geom::Size{area.size.width, height_per_item};
|
auto new_size = geom::Size{area.size.width, height_per_item};
|
||||||
auto new_position = geom::Point{
|
auto new_position = geom::Point{
|
||||||
area.top_left.x,
|
area.top_left.x,
|
||||||
area.top_left.y.as_int() + area.size.height.as_int() - height_per_item
|
area.top_left.y.as_int() + (index * height_per_item)
|
||||||
};
|
};
|
||||||
|
|
||||||
geom::Rectangle new_node_rect = {new_position, new_size};
|
geom::Rectangle new_node_rect = {new_position, new_size};
|
||||||
int divvied = ceil(new_node_rect.size.height.as_int() / static_cast<float>(sub_nodes.size()));
|
int divvied = ceil(new_node_rect.size.height.as_int() / static_cast<float>(sub_nodes.size()));
|
||||||
std::shared_ptr<Node> prev_node;
|
std::shared_ptr<Node> prev_node;
|
||||||
for (auto node : sub_nodes)
|
for (int i = 0; i < sub_nodes.size(); i++)
|
||||||
{
|
{
|
||||||
|
auto node = sub_nodes[i];
|
||||||
auto node_rect = node->get_rectangle();
|
auto node_rect = node->get_rectangle();
|
||||||
node_rect.size.height = geom::Height {node_rect.size.height.as_int() - divvied};
|
node_rect.size.height = geom::Height {node_rect.size.height.as_int() - divvied};
|
||||||
|
|
||||||
@ -97,6 +107,9 @@ geom::Rectangle Node::new_node_position()
|
|||||||
prev_node->get_rectangle().top_left.y.as_int() + prev_node->get_rectangle().size.height.as_int()};
|
prev_node->get_rectangle().top_left.y.as_int() + prev_node->get_rectangle().size.height.as_int()};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (i == index)
|
||||||
|
node_rect.top_left.y = geom::Y{node_rect.top_left.y.as_int() + height_per_item};
|
||||||
|
|
||||||
node->set_rectangle(node_rect);
|
node->set_rectangle(node_rect);
|
||||||
prev_node = node;
|
prev_node = node;
|
||||||
}
|
}
|
||||||
@ -306,6 +319,7 @@ bool Node::move_node(int from, int to) {
|
|||||||
|
|
||||||
void Node::insert_node(std::shared_ptr<Node> node, int index)
|
void Node::insert_node(std::shared_ptr<Node> node, int index)
|
||||||
{
|
{
|
||||||
|
auto position = new_node_position(index);
|
||||||
|
node->set_rectangle(position);
|
||||||
sub_nodes.insert(sub_nodes.begin() + index, node);
|
sub_nodes.insert(sub_nodes.begin() + index, node);
|
||||||
redistribute_size();
|
|
||||||
}
|
}
|
@ -51,7 +51,7 @@ public:
|
|||||||
geom::Rectangle get_rectangle();
|
geom::Rectangle get_rectangle();
|
||||||
|
|
||||||
/// Makes room for a new node on the lane.
|
/// Makes room for a new node on the lane.
|
||||||
geom::Rectangle new_node_position();
|
geom::Rectangle new_node_position(int index = -1);
|
||||||
|
|
||||||
/// Append the node to the lane
|
/// Append the node to the lane
|
||||||
void add_node(std::shared_ptr<Node>);
|
void add_node(std::shared_ptr<Node>);
|
||||||
|
Loading…
Reference in New Issue
Block a user