fix gui alert window size

This commit is contained in:
MihailRis
2025-01-28 05:09:18 +03:00
parent dece2e25bc
commit 756ff4a2c7
7 changed files with 49 additions and 18 deletions
+13 -2
View File
@@ -5,6 +5,7 @@
#include "elements/UINode.hpp" #include "elements/UINode.hpp"
#include "elements/Label.hpp" #include "elements/Label.hpp"
#include "elements/Menu.hpp" #include "elements/Menu.hpp"
#include "elements/Panel.hpp"
#include "assets/Assets.hpp" #include "assets/Assets.hpp"
#include "frontend/UiDocument.hpp" #include "frontend/UiDocument.hpp"
@@ -23,8 +24,10 @@
using namespace gui; using namespace gui;
GUI::GUI() : batch2D(std::make_unique<Batch2D>(1024)) { GUI::GUI()
container = std::make_shared<Container>(glm::vec2(1000)); : batch2D(std::make_unique<Batch2D>(1024)),
container(std::make_shared<Container>(glm::vec2(1000))) {
container->setId("root");
uicamera = std::make_unique<Camera>(glm::vec3(), Window::height); uicamera = std::make_unique<Camera>(glm::vec3(), Window::height);
uicamera->perspective = false; uicamera->perspective = false;
uicamera->flipped = true; uicamera->flipped = true;
@@ -214,6 +217,14 @@ void GUI::draw(const DrawContext& pctx, const Assets& assets) {
auto& viewport = ctx.getViewport(); auto& viewport = ctx.getViewport();
glm::vec2 wsize = viewport.size(); glm::vec2 wsize = viewport.size();
auto& page = menu->getCurrent();
if (page.panel) {
menu->setSize(page.panel->getSize());
page.panel->refresh();
if (auto panel = std::dynamic_pointer_cast<gui::Panel>(page.panel)) {
panel->cropToContent();
}
}
menu->setPos((wsize - menu->getSize()) / 2.0f); menu->setPos((wsize - menu->getSize()) / 2.0f);
uicamera->setFov(wsize.y); uicamera->setFov(wsize.y);
+5 -3
View File
@@ -65,9 +65,10 @@ void Menu::setPage(Page page, bool history) {
setSize(current.panel->getSize()); setSize(current.panel->getSize());
} }
void Menu::back() { bool Menu::back() {
if (pageStack.empty()) if (pageStack.empty()) {
return; return false;
}
Page page = pageStack.top(); Page page = pageStack.top();
pageStack.pop(); pageStack.pop();
@@ -77,6 +78,7 @@ void Menu::back() {
} }
setPage(page, false); setPage(page, false);
return true;
} }
void Menu::setPageLoader(PageLoaderFunc loader) { void Menu::setPageLoader(PageLoaderFunc loader) {
+1 -1
View File
@@ -54,7 +54,7 @@ namespace gui {
PageLoaderFunc getPageLoader(); PageLoaderFunc getPageLoader();
/// @brief Set page to previous saved in history /// @brief Set page to previous saved in history
void back(); bool back();
/// @brief Clear pages history /// @brief Clear pages history
void clearHistory(); void clearHistory();
+5 -7
View File
@@ -70,9 +70,6 @@ void Panel::remove(const std::shared_ptr<UINode> &node) {
void Panel::refresh() { void Panel::refresh() {
UINode::refresh(); UINode::refresh();
std::stable_sort(nodes.begin(), nodes.end(), [](auto a, auto b) {
return a->getZIndex() < b->getZIndex();
});
float x = padding.x; float x = padding.x;
float y = padding.y; float y = padding.y;
@@ -80,20 +77,21 @@ void Panel::refresh() {
if (orientation == Orientation::vertical) { if (orientation == Orientation::vertical) {
float maxw = size.x; float maxw = size.x;
for (auto& node : nodes) { for (auto& node : nodes) {
glm::vec2 nodesize = node->getSize();
const glm::vec4 margin = node->getMargin(); const glm::vec4 margin = node->getMargin();
y += margin.y; y += margin.y;
float ex = x + margin.x; float ex = x + margin.x;
node->setPos(glm::vec2(ex, y)); node->setPos(glm::vec2(ex, y));
y += nodesize.y + margin.w + interval;
float width = size.x - padding.x - padding.z - margin.x - margin.z; float width = size.x - padding.x - padding.z - margin.x - margin.z;
if (node->isResizing()) { if (node->isResizing()) {
node->setSize(glm::vec2(width, nodesize.y)); node->setMaxSize({width, node->getMaxSize().y});
node->setSize(glm::vec2(width, node->getSize().y));
} }
node->refresh(); node->refresh();
maxw = fmax(maxw, ex+node->getSize().x+margin.z+padding.z); glm::vec2 nodeSize = node->getSize();
y += nodeSize.y + margin.w + interval;
maxw = fmax(maxw, ex+nodeSize.x+margin.z+padding.z);
} }
actualLength = y + padding.w; actualLength = y + padding.w;
} else { } else {
+11 -1
View File
@@ -195,7 +195,8 @@ glm::vec2 UINode::getSize() const {
void UINode::setSize(glm::vec2 size) { void UINode::setSize(glm::vec2 size) {
this->size = glm::vec2( this->size = glm::vec2(
glm::max(minSize.x, size.x), glm::max(minSize.y, size.y) glm::max(minSize.x, glm::min(maxSize.x, size.x)),
glm::max(minSize.y, glm::min(maxSize.y, size.y))
); );
} }
@@ -208,6 +209,15 @@ void UINode::setMinSize(glm::vec2 minSize) {
setSize(getSize()); setSize(getSize());
} }
glm::vec2 UINode::getMaxSize() const {
return maxSize;
}
void UINode::setMaxSize(glm::vec2 maxSize) {
this->maxSize = maxSize;
setSize(getSize());
}
void UINode::setColor(glm::vec4 color) { void UINode::setColor(glm::vec4 color) {
this->color = color; this->color = color;
this->hoverColor = color; this->hoverColor = color;
+4
View File
@@ -75,6 +75,8 @@ namespace gui {
glm::vec2 size; glm::vec2 size;
/// @brief minimal element size /// @brief minimal element size
glm::vec2 minSize {1.0f}; glm::vec2 minSize {1.0f};
/// @brief maximal element size
glm::vec2 maxSize {1e6f};
/// @brief element primary color (background-color or text-color if label) /// @brief element primary color (background-color or text-color if label)
glm::vec4 color {1.0f}; glm::vec4 color {1.0f};
/// @brief element color when mouse is over it /// @brief element color when mouse is over it
@@ -224,6 +226,8 @@ namespace gui {
virtual void setSize(glm::vec2 size); virtual void setSize(glm::vec2 size);
virtual glm::vec2 getMinSize() const; virtual glm::vec2 getMinSize() const;
virtual void setMinSize(glm::vec2 size); virtual void setMinSize(glm::vec2 size);
virtual glm::vec2 getMaxSize() const;
virtual void setMaxSize(glm::vec2 size);
/// @brief Called in containers when new element added /// @brief Called in containers when new element added
virtual void refresh() {}; virtual void refresh() {};
virtual void fullRefresh() { virtual void fullRefresh() {
+9 -3
View File
@@ -31,7 +31,11 @@ void guiutil::alert(
const std::wstring& text, const std::wstring& text,
const runnable& on_hidden const runnable& on_hidden
) { ) {
auto panel = std::make_shared<Panel>(glm::vec2(500, 300), glm::vec4(4.0f), 4.0f); auto panel = std::make_shared<Panel>(
glm::vec2(glm::min(650UL, glm::max(text.length() * 10, 200UL)), 300),
glm::vec4(4.0f),
4.0f
);
panel->setColor(glm::vec4(0.0f, 0.0f, 0.0f, 0.5f)); panel->setColor(glm::vec4(0.0f, 0.0f, 0.0f, 0.5f));
auto menuPtr = engine.getGUI()->getMenu(); auto menuPtr = engine.getGUI()->getMenu();
@@ -40,14 +44,15 @@ void guiutil::alert(
menu.removePage("<alert>"); menu.removePage("<alert>");
if (on_hidden) { if (on_hidden) {
on_hidden(); on_hidden();
} else { } else if (!menu.back()) {
menu.back(); menu.reset();
} }
}; };
auto label = std::make_shared<Label>(text); auto label = std::make_shared<Label>(text);
label->setMultiline(true); label->setMultiline(true);
label->setSize(glm::vec2(1, 24)); label->setSize(glm::vec2(1, 24));
label->setAutoResize(true);
panel->add(label); panel->add(label);
panel->add(std::make_shared<Button>( panel->add(std::make_shared<Button>(
langs::get(L"Ok"), glm::vec4(10.f), langs::get(L"Ok"), glm::vec4(10.f),
@@ -56,6 +61,7 @@ void guiutil::alert(
} }
)); ));
panel->refresh(); panel->refresh();
panel->keepAlive(Events::keyCallbacks[keycode::ENTER].add([on_hidden_final](){ panel->keepAlive(Events::keyCallbacks[keycode::ENTER].add([on_hidden_final](){
on_hidden_final(); on_hidden_final();
return true; return true;