Extend app frame planning to tick and resize

This commit is contained in:
2026-06-05 06:23:00 +02:00
parent 48a4547f51
commit 548b6d3ae5
8 changed files with 205 additions and 24 deletions

View File

@@ -1,5 +1,10 @@
#pragma once
#include "foundation/result.h"
#include <cmath>
#include <limits>
namespace pp::app {
struct AppInitialSurfacePlan {
@@ -20,6 +25,20 @@ struct AppFrameDrawPlan {
bool reset_redraw = true;
};
struct AppFrameTickPlan {
bool tick_designer_layout = false;
bool tick_main_layout = false;
};
struct AppResizePlan {
float width = 0.0F;
float height = 0.0F;
int render_target_width = 0;
int render_target_height = 0;
bool recreate_ui_render_target = true;
bool request_redraw = true;
};
[[nodiscard]] constexpr AppInitialSurfacePlan plan_app_initial_surface() noexcept
{
return AppInitialSurfacePlan {
@@ -53,4 +72,42 @@ struct AppFrameDrawPlan {
};
}
[[nodiscard]] constexpr AppFrameTickPlan plan_app_frame_tick(
bool has_designer_layout,
bool has_main_layout) noexcept
{
return AppFrameTickPlan {
.tick_designer_layout = has_designer_layout,
.tick_main_layout = has_main_layout,
};
}
[[nodiscard]] inline pp::foundation::Result<AppResizePlan> plan_app_resize(float width, float height)
{
if (!std::isfinite(width) || !std::isfinite(height)) {
return pp::foundation::Result<AppResizePlan>::failure(
pp::foundation::Status::invalid_argument("resize dimensions must be finite"));
}
if (width < 1.0F || height < 1.0F) {
return pp::foundation::Result<AppResizePlan>::failure(
pp::foundation::Status::invalid_argument("resize dimensions must be positive"));
}
if (width > static_cast<float>(std::numeric_limits<int>::max())
|| height > static_cast<float>(std::numeric_limits<int>::max())) {
return pp::foundation::Result<AppResizePlan>::failure(
pp::foundation::Status::out_of_range("resize dimensions exceed integer range"));
}
return pp::foundation::Result<AppResizePlan>::success(AppResizePlan {
.width = width,
.height = height,
.render_target_width = static_cast<int>(width),
.render_target_height = static_cast<int>(height),
.recreate_ui_render_target = true,
.request_redraw = true,
});
}
} // namespace pp::app