2025-03-11 00:39:59 +03:00

63 lines
1.7 KiB
C++

#include "SplitBox.hpp"
using namespace gui;
SplitBox::SplitBox(const glm::vec2& size, float splitPos, Orientation orientation)
: Container(size), splitPos(splitPos), orientation(orientation) {
setCursor(
orientation == Orientation::vertical ? CursorShape::NS_RESIZE
: CursorShape::EW_RESIZE
);
}
void SplitBox::mouseMove(GUI*, int x, int y) {
auto pos = calcPos();
auto size = getSize();
glm::ivec2 cursor(x - pos.x, y - pos.y);
int axis = orientation == Orientation::vertical;
int v = cursor[axis];
v = std::max(std::min(static_cast<int>(size[axis]) - 10, v), 10);
float t = v / size[axis];
splitPos = t;
refresh();
}
void SplitBox::refresh() {
Container::refresh();
if (nodes.empty()) {
return;
}
glm::vec2 size = getSize();
if (nodes.size() == 1) {
auto node = nodes.at(0);
node->setPos(glm::vec2());
node->setSize(size);
return;
}
auto nodeA = nodes.at(0);
auto nodeB = nodes.at(1);
nodeA->setPos(glm::vec2());
if (orientation == Orientation::vertical) {
float splitPos = this->splitPos * size.y;
nodeA->setSize(glm::vec2(size.x, splitPos - splitRadius));
nodeB->setSize(glm::vec2(size.x, size.y - splitPos - splitRadius));
nodeB->setPos(glm::vec2(0.0f, splitPos + splitRadius));
} else {
float splitPos = this->splitPos * size.x;
nodeA->setSize(glm::vec2(splitPos - splitRadius, size.y));
nodeB->setSize(glm::vec2(size.x - splitPos - splitRadius, size.y));
nodeB->setPos(glm::vec2(splitPos + splitRadius, 0.0f));
}
}
void SplitBox::fullRefresh() {
refresh();
reposition();
Container::fullRefresh();
}