Working on phone messages
This commit is contained in:
1 parent
cdab525858
commit
9425f9b19a
20 files changed
+591
-28
No files matched your search
@@ -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;
|
||||
|
||||
|
||||
Reference in new issue
Block a user