TachyonUI 0.1.0
High-performance UI for building tools.
Loading...
Searching...
No Matches
gui_label_group_subsystem.h
Go to the documentation of this file.
1#pragma once
2
3#include <unordered_map>
4#include <vector>
5
6#include <gui_core/gui_id.h>
9
10namespace tachyon
11{
14
15 class FramePipeline;
16 struct FrameContext;
17 class ElementStorage;
18 class GUIStateManager;
19 class GUITheme;
20
27 {
28 public:
30 struct State
31 {
32 int32_t labelWidth = 120;
33 int32_t minWidth = 40;
34 int32_t maxWidth = 500;
35 bool resizable = true;
36 bool edgeHovered = false;
37 bool edgeDragging = false;
38 bool anyLabelHovered = false;
39 std::vector<tachyon::TextID> labelTextIDs;
41 std::vector<tachyon::ElementRef> labelRefs;
42 };
43
45 ElementStorage& elementStorage,
46 GUIStateManager& guiStateManager,
47 GUITheme& theme);
48
51 void BeginGroup(tachyon::ID id, int32_t defaultWidth, int32_t minWidth, int32_t maxWidth, bool resizable = true);
53 void EndGroup();
58
60 bool IsBalanced() const { return m_stack.empty(); }
61
62 private:
63 void OnPreConstruct();
64 void OnPostConstruct();
65 void OnEndFrame();
66
67 struct StackEntry {
68 State* state;
69 uint32_t nestingDepth;
70 };
71
72 std::unordered_map<tachyon::ID, State> m_states;
73 std::vector<StackEntry> m_stack;
74
75 ElementStorage& m_elementStorage;
76 GUIStateManager& m_guiStateManager;
77 GUITheme& m_theme;
78 };
79
80}
The frame's element tree.
Definition gui_element_storage.h:100
Stage callbacks run in registration order (no priorities): if A must run before B,...
Definition gui_frame_pipeline.h:74
Owns the per-frame state objects and runs their BeginFrame / EndFrame in order.
Definition gui_state_manager.h:65
The library's styles, icons and theme metrics, the defaults the controls draw with.
Definition gui_theme.h:46
State * GetActiveGroup()
The innermost group when it was opened at the current nesting depth, else nullptr.
void EndGroup()
Closes the innermost group.
void AddDragger(tachyon::ElementRef labelRef)
Adds a label to the innermost group and draws its resize edge; a group must be open.
LabelGroupSubsystem(FramePipeline &frame, ElementStorage &elementStorage, GUIStateManager &guiStateManager, GUITheme &theme)
bool IsBalanced() const
True iff every BeginGroup was matched by EndGroup.
Definition gui_label_group_subsystem.h:60
void BeginGroup(tachyon::ID id, int32_t defaultWidth, int32_t minWidth, int32_t maxWidth, bool resizable=true)
Opens group id at the current nesting depth; widths are CSS px, and defaultWidth applies only when th...
Definition gui_logging.h:24
An element's slot in ElementStorage: its depth and index within that depth.
Definition gui_element.h:127
Per-frame values plus references to long-lived managers, passed to every stage callback.
Definition gui_frame_pipeline.h:32
A 64-bit element ID whose bit layout depends on its IDMode.
Definition gui_id.h:23
State of one label group, kept across frames by group ID.
Definition gui_label_group_subsystem.h:31
std::vector< tachyon::TextID > labelTextIDs
transient: rebuilt each frame for auto-size
Definition gui_label_group_subsystem.h:39
int32_t minWidth
CSS px.
Definition gui_label_group_subsystem.h:33
std::vector< tachyon::ElementRef > labelRefs
transient: this frame's labels, in order
Definition gui_label_group_subsystem.h:41
int32_t maxLabelWidthThisFrame
transient: widest label (pixels), for auto-width
Definition gui_label_group_subsystem.h:40
int32_t labelWidth
shared label width, CSS px
Definition gui_label_group_subsystem.h:32
bool edgeDragging
a label's resize edge is being dragged
Definition gui_label_group_subsystem.h:37
bool resizable
false: the width fits the widest label instead
Definition gui_label_group_subsystem.h:35
int32_t maxWidth
CSS px.
Definition gui_label_group_subsystem.h:34
bool anyLabelHovered
transient: set during construction if any label has hover
Definition gui_label_group_subsystem.h:38
bool edgeHovered
a label's resize edge is hovered
Definition gui_label_group_subsystem.h:36