载入中...
搜索中...
未找到
UI.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
5#include "common/Module.h"
6#include "common/Result.h"
7#include "ui/NinePatch.h"
8#include "ui/UIBackend.h"
9#include "ui/UIHost.h"
10#include "ui/UiTween.h"
11#include "ui/Widget.h"
12
13#include <SDL2/SDL.h>
14#include <cstddef>
15#include <cstdint>
16#include <memory>
17#include <simplesquirrel/simplesquirrel.hpp>
18#include <string>
19#include <unordered_map>
20#include <vector>
21
22namespace eve::graphics {
23class Canvas;
24class Graphics;
25class Texture;
26}
27
28namespace eve::ui {
29
30class DatabasePanel;
31class EditorShell;
32class Inspector;
33class ScenePanel;
34struct UIEvent;
35
42public:
45 UI();
47 ~UI() override;
48
53 void releaseSquirrelRoots() noexcept;
54
56 bool initBackend();
58 void shutdownBackend();
60 bool isBackendReady() const;
61
63 void processEvent(const SDL_Event *event);
65 void beginFrameAndRender();
67 void dispatchEvents();
68
70 bool wantCaptureMouse() const;
72 bool wantCaptureKeyboard() const;
73
82 [[nodiscard]] UIHostHandle mountAs(const std::string &name, WidgetDesc root);
91 [[nodiscard]] UIHostHandle mount(WidgetDesc root);
100 [[nodiscard]] UIHostHandle remount(WidgetDesc root);
109 [[nodiscard]] UIHostHandle remountReconcile(WidgetDesc root);
118 [[nodiscard]] UIHostHandle remountAs(const std::string &name, WidgetDesc root);
119
121 bool select(const std::string &name);
130 [[nodiscard]] UIHostHandle findHost(const std::string &name) const;
139 [[nodiscard]] UIHostHandle findHostByOwner(uint32_t ownerId) const;
149 [[nodiscard]] UIHostHandle current() const noexcept { return selected_; }
151 void bindOwner(uint32_t ownerId);
152
154 void beginBuild();
156 void beginWindow(const std::string &title, const std::string &id = "root");
158 void beginGroup(const std::string &id = "");
160 void beginList(const std::string &id);
162 void beginCollapsing(const std::string &label, const std::string &id = "", bool open = true);
164 void beginChild(const std::string &id, float width = 0.f, float height = 120.f);
166 void beginCard(const std::string &id = "");
168 bool beginNinePatch(const std::string &path, const std::string &id = "",
169 float width = 0.f, float height = 0.f);
171 void beginMenuBar(const std::string &id = "");
173 void beginMenu(const std::string &label, const std::string &id = "");
175 void beginToolbar(const std::string &id = "");
177 void beginToolbox(const std::string &id = "", float cellSize = 0.f, int columns = 0);
179 void beginSidebar(const std::string &id = "", float width = 0.f);
181 void beginStatusBar(const std::string &id = "");
183 void beginSplitPane(const std::string &direction = "row", float ratio = 0.25f,
184 const std::string &id = "");
187 void beginScrollList(const std::string &id = "", float height = 0.f, float itemHeight = 0.f);
194 void beginFlex(const std::string &direction = "row", const std::string &id = "",
195 float gap = -1.f);
197 void beginRow(const std::string &id = "", float gap = -1.f);
199 void beginColumn(const std::string &id = "", float gap = -1.f);
201 void beginGrid(int columns, const std::string &id = "", float columnGap = -1.f,
202 float rowGap = -1.f);
204 void end();
206 void addText(const std::string &content, const std::string &id = "");
209 void addTextWrapped(const std::string &content, float width, const std::string &id = "");
211 void addButton(const std::string &label, const std::string &id = "");
213 void addIcon(const std::string &name, const std::string &id = "");
215 void addIconButton(const std::string &name, const std::string &label = "",
216 const std::string &id = "");
218 void addSameLine(const std::string &id = "");
220 void addSeparator(const std::string &id = "");
222 void addCheckbox(const std::string &label, bool checked, const std::string &id = "");
224 void addSlider(const std::string &label, float value, float minV, float maxV,
225 const std::string &id = "");
230 void addColorPalette(const std::string &label, float r, float g, float b, float a = 1.f,
231 const std::string &id = "");
233 void addProgress(float fraction, const std::string &id = "", const std::string &overlay = "");
236 void addImage(const std::string &id = "", float width = 0.f, float height = 0.f);
238 bool addNinePatch(const std::string &path, const std::string &id = "",
239 float width = 0.f, float height = 0.f);
242 void addImageButton(const std::string &id, float width, float height);
245 void addViewport(const std::string &id, float width = 0.f, float height = 0.f);
248 void addCombo(const std::string &label, const std::string &options, int selected,
249 const std::string &id = "");
251 void addInputText(const std::string &label, const std::string &value, const std::string &id = "");
253 void addSearchField(const std::string &hint, const std::string &value = "",
254 const std::string &id = "");
256 void addSwitch(const std::string &label, bool checked, const std::string &id = "");
258 void addBadge(const std::string &label, const std::string &id = "");
260 void addSectionHeader(const std::string &label, const std::string &id = "");
262 void addMenuItem(const std::string &label, const std::string &shortcut = "",
263 const std::string &id = "");
265 void addSpacer(const std::string &id = "", float grow = 1.f);
270 void setItemFlexGrow(float grow);
272 void setItemFlexShrink(float shrink);
274 void setItemFlexBasis(float basis);
276 void setItemAlignSelf(const std::string &align);
278 void setItemAspectRatio(float ratio);
280 void setItemGridColumnSpan(int span);
282 void setItemSize(float width, float height);
285 void setItemMargin(float l, float t, float r, float b);
287 void setItemPadding(float l, float t, float r, float b);
289 void setItemMinSize(float w, float h);
291 void setItemMaxSize(float w, float h);
293 void setItemPercent(float w, float h);
296 void setItemAbsolute(float anchorX, float anchorY, float x = 0.f, float y = 0.f);
298 void setItemTooltip(const std::string &text);
304 void setItemDragSource(const std::string &payloadType, const std::string &payloadText);
309 void setItemDropTarget(const std::string &acceptedType);
311 void setItemEnabled(bool enabled);
316 void setItemSelected(bool selected);
318 void setItemFocusMode(const std::string &mode);
320 void setItemMouseFilter(const std::string &filter);
322 void setItemTheme(const std::string &theme);
324 void setThemeScope(const std::string &theme);
326 void setItemStyleClass(const std::string &name);
328 void setStyleScope(const std::string &name);
330 void setItemTabIndex(int index);
332 void setItemFocusOrder(const std::string &previous, const std::string &next);
334 void setItemFocusNeighbors(const std::string &left, const std::string &right,
335 const std::string &up, const std::string &down);
337 void setItemAccessibility(const std::string &role, const std::string &name,
338 const std::string &description = "");
341 void setFlexAlign(const std::string &align);
343 void setFlexJustify(const std::string &justify);
345 void setLayoutGaps(float columnGap, float rowGap);
347 void setFlexWrap(bool wrap);
349 void setLayoutOverflow(const std::string &overflow);
351 void addListItem(const std::string &label, const std::string &id = "");
352
354 bool mountBuild();
356 bool mountBuildAs(const std::string &name);
358 bool remountBuildAs(const std::string &name);
359
364 bool setListItems(const std::string &listId, const std::vector<std::string> &items);
365
367 void setText(const std::string &id, const std::string &text);
369 void setTextWrap(const std::string &id, float width);
371 void setVisible(const std::string &id, bool visible);
373 void setEnabled(const std::string &id, bool enabled);
375 void setChecked(const std::string &id, bool checked);
377 void setValue(const std::string &id, float value);
379 void setValueText(const std::string &id, const std::string &value);
381 void setColor(const std::string &id, float r, float g, float b, float a = 1.f);
383 void setImageTint(const std::string &id, float r, float g, float b, float a = 1.f);
385 void setImageUv(const std::string &id, float u0, float v0, float u1, float v1);
387 void setImageNinePatch(const std::string &id, float l, float t, float r, float b);
389 bool setImageNinePatchFile(const std::string &id, const std::string &path);
391 void setImageCornerRadius(const std::string &id, float radius);
394 void setImageTextureId(const std::string &id, uint64_t textureId);
400 [[nodiscard("retain the UI texture registration id or explicitly handle failure")]]
401 uint64_t registerTexture(graphics::Texture *tex);
406 void unregisterTexture(uint64_t textureId);
408 float getValue(const std::string &id) const;
410 std::string getValueText(const std::string &id) const;
412 float getColorR(const std::string &id) const;
414 float getColorG(const std::string &id) const;
416 float getColorB(const std::string &id) const;
418 float getColorA(const std::string &id) const;
420 bool getChecked(const std::string &id) const;
422 bool requestFocus(const std::string &id);
424 bool moveFocus(const std::string &direction);
426 std::string getFocusedId() const;
428 void setHostVisible(bool visible);
430 void setHostLayer(int layer);
432 void setHostModal(bool modal);
434 void setHostOverlay(bool overlay);
436 void setHostOverlayAlpha(float alpha);
438 void setHostMovable(bool movable);
440 void setHostResizable(bool resizable);
442 void setHostPos(float x, float y, float pivotX = 0.f, float pivotY = 0.f);
449 void setHostWorldAnchor(float x, float y, float z);
451 void clearHostWorldAnchor();
457 void setHostWorldEdgePolicy(const std::string &policy, float safeMargin = 8.f);
465 void setHostWorldDistanceScale(bool enabled, float referenceDistance = 10.f,
466 float minScale = 0.65f, float maxScale = 1.25f);
474 void setHostWorldOverlap(bool enabled, int priority = 0, float padding = 4.f,
475 float maxDisplacement = 96.f);
477 std::string getHostWorldState() const;
479 float getHostWorldScreenX() const;
481 float getHostWorldScreenY() const;
484 void setHostAnchor(float x, float y);
487 void setHostSize(float w, float h);
490 void setHostPercent(float w, float h);
501 void animateHostPos(float x, float y, float durationMs, const std::string &ease = "smoothstep",
502 float delayMs = 0.f);
511 void animateHostSize(float w, float h, float durationMs, const std::string &ease = "smoothstep",
512 float delayMs = 0.f);
520 void animateHostOverlayAlpha(float alpha, float durationMs, const std::string &ease = "smoothstep",
521 float delayMs = 0.f);
530 void animateItemOpacity(const std::string &id, float opacity, float durationMs,
531 const std::string &ease = "smoothstep", float delayMs = 0.f);
541 void animateItemPos(const std::string &id, float x, float y, float durationMs,
542 const std::string &ease = "smoothstep", float delayMs = 0.f);
544 void cancelHostTweens();
549 void cancelItemTweens(const std::string &id = "");
551 void cancelAllTweens();
557 void tickTweens(double nowMs);
559 std::size_t getHostTweenCount() const;
561 std::size_t getItemTweenCount() const;
563 std::string consumeClick();
565 std::string consumeChange();
567 std::string dragDropSupport() const;
569 std::string consumeDrop();
571 std::string getDropType() const;
573 std::string getDropText() const;
575 std::string getDropSource() const;
577 std::string getDropOrigin() const;
578
586 void onClick(const std::string &id, ssq::Function fn);
588 void onChange(const std::string &id, ssq::Function fn);
590 void componentOnClick(uint64_t owner, const std::string &id, ssq::Function fn);
592 void componentOnChange(uint64_t owner, const std::string &id, ssq::Function fn);
594 void componentClearHandlers(uint64_t owner);
595
597 void setThemeDark();
599 void setThemeLight();
601 bool setTheme(const std::string &name);
603 std::string getTheme() const;
605 std::string defineStyleClass(const std::string &name, const std::string &parent = "");
607 std::string setStyleClassColor(const std::string &name, const std::string &property, float r,
608 float g, float b, float a = 1.f);
610 std::string setStyleClassMetric(const std::string &name, const std::string &property, float x,
611 float y = 0.f);
613 void clearStyleClasses();
615 void setNavKeyboard(bool enabled);
617 void setNavGamepad(bool enabled);
619 void setScale(float scale);
621 float getScale() const;
624 std::string getStats() const;
626 std::string getLayoutDiagnostics() const;
628 std::string getAccessibilitySnapshot() const;
631 std::string saveTreeJson() const;
634 bool loadTreeJson(const std::string &json);
644 graphics::Canvas *viewportCanvas(const std::string &id);
646 bool viewportHovered(const std::string &id);
648 bool viewportActive(const std::string &id);
650 float viewportMouseX(const std::string &id);
652 float viewportMouseY(const std::string &id);
654 float viewportDragDX(const std::string &id);
656 float viewportDragDY(const std::string &id);
658 float viewportWheel(const std::string &id);
659
661 void mountSimple(const std::string &title, const std::string &labelText,
662 const std::string &buttonText);
663
664 // ---- Reflection-driven property inspector (MVVM DevTools) ---------------
666 bool inspectOpen();
668 void inspectClose();
670 bool inspectRefresh();
672 bool inspectSelectClass(const std::string &name);
674 bool inspectObject(ssq::Object object);
680 bool inspectSetPickHandler(ssq::Function fn);
682 bool inspectPickScene();
684 bool inspectAddInstance();
694 ssq::Object propertySchema(ssq::Object instance);
695
696 // ---- Reflection-driven database panel -------------------------------
698 bool dbOpen();
700 void dbClose();
702 bool dbRefresh();
704 bool dbSelectClass(const std::string &name);
714 [[nodiscard("retain the packed UI object handle or explicitly handle failure")]]
715 uint64_t dbRegister(ssq::Object object, const std::string &label);
720 [[nodiscard("retain the packed UI object handle or explicitly handle failure")]]
721 uint64_t dbCreateInstance();
730 [[nodiscard("inspect the database removal result or explicitly ignore it")]]
731 eve::Result<void> dbUnregister(uint64_t id);
732
733 // ---- DevTools editor shell --------------------------------------------
735 bool editorOpen();
737 void editorClose();
739 bool editorSelectPanel(const std::string &name);
740
741 // ---- Scene hierarchy panel --------------------------------------------
743 bool sceneOpen();
745 void sceneClose();
747 bool sceneSelectNode(const std::string &id);
753 bool sceneSetPickHandler(ssq::Function fn);
754
755private:
756 struct NinePatchResource {
757 graphics::Texture *texture = nullptr;
758 uint64_t textureId = 0;
760 };
769 NinePatchResource *loadNinePatch(const std::string &path);
770 void releaseNinePatches();
771
772 WidgetDesc &currentParent();
773 void pushOpen(WidgetDesc d);
774 bool buildComplete() const;
783 UIHostHandle ensureSelected(const std::string &preferredName = "");
789 [[nodiscard]] eve::OptionalRef<UIHost> resolveSelected() const noexcept;
790
791 std::unique_ptr<UIBackend> backend_;
792 std::unordered_map<std::string, NinePatchResource> ninePatches_;
793 UIHostHandle selected_{};
794
795 std::vector<WidgetDesc> openStack_;
796 WidgetDesc builtRoot_;
797 bool hasBuiltRoot_ = false;
798 std::string lastDropType_;
799 std::string lastDropText_;
800 std::string lastDropSource_;
801 std::string lastDropOrigin_;
802
803 struct ScriptHandler {
805 ScriptHandler(std::string host, std::string node, std::string k, ssq::Function f,
806 uint64_t componentOwner = 0)
808 : hostName(std::move(host)), nodeId(std::move(node)), kind(std::move(k)),
810 fn(std::move(f)), owner(componentOwner) {}
811 std::string hostName;
812 std::string nodeId;
813 std::string kind; // "click" | "toggle" | "value" | "text"
814 ssq::Function fn;
815 uint64_t owner = 0; // 0 belongs to the legacy host-level registration API.
816 };
817 std::vector<ScriptHandler> scriptHandlers_;
818 void fireScriptHandlers(const UIEvent &ev);
819
820 UiTweenDriver tweens_;
821 ssq::Object callPickHandler();
822 void callScenePickHandler(const std::string &nodeId);
823 std::unique_ptr<Inspector> inspector_;
824 std::unique_ptr<DatabasePanel> databasePanel_;
825 std::unique_ptr<EditorShell> editorShell_;
826 std::unique_ptr<ScenePanel> scenePanel_;
827};
828
829} // namespace eve::ui
double value
float w
Definition AnimClip.cpp:738
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
int root
Definition AnimSmr.cpp:119
float gap
int priority
std::string title
std::string label
std::string nodeId
Object::Ptr theme
bool resizable
#define EVENGINE_API_WORLD
Definition Export.h:109
tensor::Graph g
Definition GpuGraph.cpp:7
double r
HexVec3 up
HexVec3 left
HexVec3 right
int h
std::uint32_t height
std::uint32_t width
std::string text
TokenKind kind
std::array< float, 3 > scale
std::int32_t parent
std::string description
std::string name
MeleePoint3 b
Definition MeleeHit.cpp:41
MeleePoint3 a
Definition MeleeHit.cpp:40
graphics::Canvas * previous
TileLayer * layer
float f
float radius
std::string path
Definition PlayHost.cpp:110
float d
float t
Move-only, checked operation results for the common layer.
const RoadNode * node
RoadLaneDirection direction
std::string filter
double current
const SquirrelValueOptions & options
int columns
float opacity
bool visible
UIHostHandle host
std::string payloadType
Definition UISystem.cpp:71
std::string payloadText
Definition UISystem.cpp:72
Lightweight UI-owned tween driver for host/item visual properties.
uint32_t index
EVENGINE_API_FOUNDATION public API.
Definition Module.h:46
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Canvas public API.
Definition Canvas.h:17
GPU texture created via Graphics::newTexture. Owns GPU resources through an opaque backend handle.
Definition Texture.h:18
Declarative UI module (eve.UI).
Definition UI.h:41
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition Animation.h:25
StyleClassStatus defineStyleClass(const std::string &name, const std::string &parent)
Declares or replaces one sparse style class. @thread UI thread only. @reentrancy Does not invoke call...
Definition Theme.cpp:82
void clearStyleClasses()
Clears user-defined style classes. Intended for runtime/test teardown.
Definition Theme.cpp:160
StyleClassStatus setStyleClassMetric(const std::string &name, const std::string &property, float x, float y)
Sets padding, rounding, or alpha on an existing style class.
Definition Theme.cpp:128
ecs::EntityHandle UIHostHandle
Definition UIHost.h:16
StyleClassStatus setStyleClassColor(const std::string &name, const std::string &property, float r, float g, float b, float a)
Sets text/background/border/accent RGBA on an existing style class.
Definition Theme.cpp:99
std::optional< std::reference_wrapper< T > > OptionalRef
Optional borrowed reference; it does not extend T's lifetime.
Definition BorrowedRef.h:24
SettlementPipeline::Stage fn
bool enabled
Parsed Android-style .9.png stretch and content metadata.
Definition NinePatch.h:21
Declarative widget description (build once / on dirty → flatten into UIHost::Tree).
Definition Widget.h:15
glm::uvec4 info