Working on phone messages

This commit is contained in:
Vladislav Khorev committed 2026-05-30 21:27:25 +03:00
1 parent cdab525858
commit 9425f9b19a
20 files changed
+591 -28

No files matched your search

+35
View File
@@ -429,6 +429,7 @@ namespace ZL {
}
if (j.contains("name")) node->name = j["name"].get<std::string>();
if (j.contains("visible")) node->visible = j["visible"].get<bool>();
// 2. Читаем размеры во временные "локальные" поля
// Это критически важно: мы не пишем сразу в screenRect,
@@ -825,6 +826,7 @@ namespace ZL {
textFields.clear();
staticImages.clear();
pulsingNodes.clear();
popInNodes.clear();
collectButtonsAndSliders(root);
nodeActiveAnims.clear();
@@ -1050,6 +1052,17 @@ namespace ZL {
);
}
void UiManager::startPopIn(const std::string& nodeName, float durationMs) {
auto node = findNode(nodeName);
if (!node) return;
node->scaleX = 0.0f;
node->scaleY = 0.0f;
node->popInActive = true;
node->popInProgress = 0.0f;
node->popInDurationMs = durationMs;
popInNodes.push_back(node);
}
void UiManager::collectButtonsAndSliders(const std::shared_ptr<UiNode>& node) {
if (node->button) {
buttons.push_back(node->button);
@@ -1188,6 +1201,7 @@ namespace ZL {
prev.pressedSliders = pressedSliders;
prev.focusedTextField = focusedTextField;
prev.path = "";
prev.popInNodes = popInNodes;
prev.animCallbacks = animCallbacks;
@@ -1246,6 +1260,7 @@ namespace ZL {
textFields = s.textFields;
staticImages = s.staticImages;
pulsingNodes = s.pulsingNodes;
popInNodes = s.popInNodes;
pressedButtons = s.pressedButtons;
pressedTextButtons = s.pressedTextButtons;
pressedSliders = s.pressedSliders;
@@ -1381,6 +1396,26 @@ namespace ZL {
node->scaleY = s;
}
// Pop-in scale animations (scale 0 → 1 on bubble reveal)
for (auto& node : popInNodes) {
if (!node || !node->popInActive) continue;
node->popInProgress += deltaMs / node->popInDurationMs;
if (node->popInProgress >= 1.0f) {
node->popInProgress = 1.0f;
node->popInActive = false;
node->scaleX = 1.0f;
node->scaleY = 1.0f;
} else {
// ease-out quad
const float t = node->popInProgress;
const float s = 1.0f - (1.0f - t) * (1.0f - t);
node->scaleX = s;
node->scaleY = s;
}
}
popInNodes.erase(std::remove_if(popInNodes.begin(), popInNodes.end(),
[](const auto& n) { return !n || !n->popInActive; }), popInNodes.end());
std::vector<std::pair<std::shared_ptr<UiNode>, size_t>> animationsToRemove;
std::vector<std::function<void()>> pendingCallbacks;