#pragma once #include "rendering/export_config.h" #include namespace Donut { class Scene; // App-level actions the UI can request (window/device changes it can't do // itself). The Application implements this — it owns the window and device. struct AppActions { virtual ~AppActions() = default; virtual auto set_resolution(int w, int h) -> void = 0; virtual auto set_fullscreen(bool on) -> void = 0; virtual auto set_vsync(bool on) -> void = 0; virtual auto set_ui_scale(float scale) -> void = 0; virtual auto get_window_size(int& w, int& h) const -> void = 0; virtual auto is_fullscreen() const -> bool = 0; // Renders the requested channels off-screen and writes files; returns the // number written (0 on failure). virtual auto export_frame(const ExportConfig& cfg) -> int = 0; }; // What the UI panels get each frame. `scene` is mutable — panels edit the // document through it; `actions` performs app-level changes. struct UIContext { Scene& scene; std::string device_name; AppActions& actions; }; }