Extend app input planning to UI state

This commit is contained in:
2026-06-05 06:44:57 +02:00
parent b825d920d2
commit 32c95b224f
8 changed files with 196 additions and 19 deletions

View File

@@ -3,6 +3,7 @@
#include "foundation/result.h"
#include <cmath>
#include <cstddef>
namespace pp::app {
@@ -37,6 +38,17 @@ struct AppKeyDispatchPlan {
bool sync_vr_camera_rotation = false;
};
struct AppUiVisibilityTogglePlan {
bool next_ui_visible = true;
std::size_t first_panel_child_index = 1;
std::size_t panel_child_count = 0;
};
struct AppStylusAttachPlan {
bool set_has_stylus = true;
bool enable_canvas_touch_lock = false;
};
[[nodiscard]] inline pp::foundation::Status validate_input_zoom(float zoom)
{
if (!std::isfinite(zoom) || zoom <= 0.0F) {
@@ -163,4 +175,35 @@ struct AppKeyDispatchPlan {
};
}
[[nodiscard]] inline pp::foundation::Result<AppUiVisibilityTogglePlan> plan_app_ui_visibility_toggle(
bool current_ui_visible,
bool has_main_layout,
std::size_t main_child_count,
std::size_t panel_child_count)
{
if (!has_main_layout) {
return pp::foundation::Result<AppUiVisibilityTogglePlan>::failure(
pp::foundation::Status::invalid_argument("UI toggle requires a main layout"));
}
if (main_child_count <= 1U) {
return pp::foundation::Result<AppUiVisibilityTogglePlan>::failure(
pp::foundation::Status::invalid_argument("UI toggle requires a panel container child"));
}
return pp::foundation::Result<AppUiVisibilityTogglePlan>::success(AppUiVisibilityTogglePlan {
.next_ui_visible = !current_ui_visible,
.first_panel_child_index = 1U,
.panel_child_count = panel_child_count,
});
}
[[nodiscard]] constexpr AppStylusAttachPlan plan_app_stylus_attach(bool has_canvas) noexcept
{
return AppStylusAttachPlan {
.set_has_stylus = true,
.enable_canvas_touch_lock = has_canvas,
};
}
} // namespace pp::app

View File

@@ -661,15 +661,34 @@ bool App::key_char(char key)
void App::toggle_ui()
{
auto m = layout[main_id]->m_children[1];
ui_visible = !ui_visible;
for (int i = 1; i < m->m_children.size(); i++)
m->m_children[i]->m_display = ui_visible;
auto* main = layout[main_id];
const std::size_t main_child_count = main ? main->m_children.size() : 0U;
auto* panel_container = main_child_count > 1U ? main->m_children[1].get() : nullptr;
const auto plan = pp::app::plan_app_ui_visibility_toggle(
ui_visible,
main != nullptr,
main_child_count,
panel_container ? panel_container->m_children.size() : 0U);
if (!plan) {
LOG("UI toggle plan failed: %s", plan.status().message);
return;
}
ui_visible = plan.value().next_ui_visible;
if (!panel_container)
return;
for (std::size_t i = plan.value().first_panel_child_index;
i < plan.value().panel_child_count;
++i) {
panel_container->m_children[i]->m_display = ui_visible;
}
}
void App::set_stylus()
{
has_stylus = true;
if (canvas)
const auto plan = pp::app::plan_app_stylus_attach(canvas != nullptr);
has_stylus = plan.set_has_stylus;
if (plan.enable_canvas_touch_lock && canvas)
canvas->m_canvas->m_touch_lock = true;
}