yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
workspace_window_manager.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EDITOR_SYSTEM_WORKSPACE_WINDOW_MANAGER_H_
2#define YAZE_APP_EDITOR_SYSTEM_WORKSPACE_WINDOW_MANAGER_H_
3
4#include <algorithm>
5#include <cstdint>
6#include <functional>
7#include <list>
8#include <memory>
9#include <string>
10#include <unordered_map>
11#include <unordered_set>
12#include <vector>
13
18
19#ifndef YAZE_ENABLE_CARD_SHIM_DEPRECATION
20#define YAZE_ENABLE_CARD_SHIM_DEPRECATION 1
21#endif
22
23#if YAZE_ENABLE_CARD_SHIM_DEPRECATION && defined(__has_cpp_attribute)
24#if __has_cpp_attribute(deprecated)
25#define YAZE_CARD_SHIM_DEPRECATED(msg) [[deprecated(msg)]]
26#else
27#define YAZE_CARD_SHIM_DEPRECATED(msg)
28#endif
29#else
30#define YAZE_CARD_SHIM_DEPRECATED(msg)
31#endif
32
33namespace yaze {
34
35namespace gui {
36class PanelWindow;
37} // namespace gui
38
39namespace editor {
40
41// Forward declarations
42enum class EditorType;
43class Editor;
44class ResourceWindowContent;
45
51 std::string card_id; // Unique identifier (e.g., "dungeon.room_selector")
52 std::string display_name; // Human-readable name (e.g., "Room Selector")
53 std::string
54 window_title; // ImGui window title for DockBuilder (e.g., " Rooms List")
55 std::string icon; // Material icon
56 std::string category; // Category (e.g., "Dungeon", "Graphics", "Palette")
57 std::string workflow_group;
58 std::string workflow_label;
61
62 // Lifecycle behavior on editor switches (default: EditorBound).
64
65 // Optional context binding (default: none).
67
69 enum class ShortcutScope {
70 kGlobal, // Available regardless of active editor
71 kEditor, // Only active within the owning editor
72 kPanel // Panel visibility/within-panel actions
73 };
74 std::string shortcut_hint; // Display hint (e.g., "Ctrl+Shift+R")
76 bool* visibility_flag; // Pointer to bool controlling visibility
77 std::function<void()> on_show; // Callback when card is shown
78 std::function<void()> on_hide; // Callback when card is hidden
79 int priority; // Display priority for menus (lower = higher)
80
81 // Disabled state support for IDE-like behavior
82 std::function<bool()>
83 enabled_condition; // Returns true if card is enabled (nullptr = always enabled)
84 std::string disabled_tooltip; // Tooltip shown when hovering disabled card
85
90 std::string GetWindowTitle() const {
91 if (!window_title.empty()) {
92 return window_title;
93 }
94 // Generate from icon + display_name if window_title not explicitly set
95 return icon + " " + display_name;
96 }
97
104 std::string GetImGuiWindowName() const {
105 const std::string label =
106 icon.empty() ? display_name : (icon + " " + display_name);
107 if (!card_id.empty()) {
108 return label + "##" + card_id;
109 }
110 return label;
111 }
112};
113
120 public:
123
124 // Non-copyable, non-movable
129
130 // Special category for dashboard/welcome screen - suppresses panel drawing
131 static constexpr const char* kDashboardCategory = "Dashboard";
132
133 // ============================================================================
134 // Session Lifecycle Management
135 // ============================================================================
136
137 void RegisterSession(size_t session_id);
138 void UnregisterSession(size_t session_id);
139 void SetActiveSession(size_t session_id);
140
141 // ============================================================================
142 // Context Keys (Optional Policy Engine)
143 // ============================================================================
144
152 void SetContextKey(size_t session_id, WindowContextScope scope,
153 std::string key);
154 std::string GetContextKey(size_t session_id, WindowContextScope scope) const;
155
156 // ============================================================================
157 // Panel Registration
158 // ============================================================================
159
160 void RegisterPanel(size_t session_id, const WindowDescriptor& base_info);
161 void RegisterWindow(size_t session_id, const WindowDescriptor& descriptor) {
162 RegisterPanel(session_id, descriptor);
163 }
164
171 void RegisterPanelAlias(const std::string& legacy_base_id,
172 const std::string& canonical_base_id);
173 void RegisterWindowAlias(const std::string& legacy_base_id,
174 const std::string& canonical_base_id) {
175 RegisterPanelAlias(legacy_base_id, canonical_base_id);
176 }
177
182 std::string ResolvePanelAlias(const std::string& panel_id) const;
183 std::string ResolveWindowAlias(const std::string& window_id) const {
184 return ResolvePanelAlias(window_id);
185 }
186
187 void RegisterPanel(size_t session_id, const std::string& card_id,
188 const std::string& display_name, const std::string& icon,
189 const std::string& category,
190 const std::string& shortcut_hint = "", int priority = 50,
191 std::function<void()> on_show = nullptr,
192 std::function<void()> on_hide = nullptr,
193 bool visible_by_default = false);
194
195 void RegisterWindow(size_t session_id, const std::string& window_id,
196 const std::string& display_name, const std::string& icon,
197 const std::string& category,
198 const std::string& shortcut_hint = "", int priority = 50,
199 std::function<void()> on_show = nullptr,
200 std::function<void()> on_hide = nullptr,
201 bool visible_by_default = false) {
202 RegisterPanel(session_id, window_id, display_name, icon, category,
203 shortcut_hint, priority, std::move(on_show),
204 std::move(on_hide), visible_by_default);
205 }
206
207 void UnregisterPanel(size_t session_id, const std::string& base_card_id);
208 void UnregisterWindow(size_t session_id, const std::string& base_window_id) {
209 UnregisterPanel(session_id, base_window_id);
210 }
211 void UnregisterPanelsWithPrefix(const std::string& prefix);
212 void ClearAllPanels();
214
215 // ============================================================================
216 // WindowContent Instance Management (Phase 4)
217 // ============================================================================
218
227 void RegisterRegistryWindowContent(std::unique_ptr<WindowContent> window);
228 void RegisterRegistryWindow(std::unique_ptr<WindowContent> window) {
229 RegisterRegistryWindowContent(std::move(window));
230 }
231
238 void RegisterRegistryWindowContentsForSession(size_t session_id);
239 void RegisterRegistryWindowsForSession(size_t session_id) {
241 }
242
245 return registry_state_.registry_ids.size();
246 }
247 size_t GetRegistryWindowCount() const {
249 }
250
260 void RegisterWindowContent(std::unique_ptr<WindowContent> window);
261
266 void UnregisterWindowContent(const std::string& window_id);
267
273 WindowContent* GetWindowContent(const std::string& window_id);
274 WindowContent* GetWindowContent(size_t session_id,
275 const std::string& window_id);
276
286
297 void OnEditorSwitch(const std::string& from_category,
298 const std::string& to_category);
299
300 // ============================================================================
301 // Panel Control (Programmatic)
302 // ============================================================================
303
304 bool OpenWindow(size_t session_id, const std::string& base_window_id) {
305 return OpenWindowImpl(session_id, base_window_id);
306 }
307 bool CloseWindow(size_t session_id, const std::string& base_window_id) {
308 return CloseWindowImpl(session_id, base_window_id);
309 }
310 bool ToggleWindow(size_t session_id, const std::string& base_window_id) {
311 return ToggleWindowImpl(session_id, base_window_id);
312 }
313 bool IsWindowOpen(size_t session_id,
314 const std::string& base_window_id) const {
315 return IsWindowVisibleImpl(session_id, base_window_id);
316 }
317 bool* GetWindowVisibilityFlag(size_t session_id,
318 const std::string& base_window_id) {
319 return GetVisibilityFlag(session_id, base_window_id);
320 }
321
322 // ============================================================================
323 // Batch Operations
324 // ============================================================================
325
326 void ShowAllWindowsInSession(size_t session_id);
327 void HideAllWindowsInSession(size_t session_id);
328 void ShowAllWindowsInCategory(size_t session_id, const std::string& category);
329 void HideAllWindowsInCategory(size_t session_id, const std::string& category);
330 void ShowOnlyWindow(size_t session_id, const std::string& base_window_id);
331
332 YAZE_CARD_SHIM_DEPRECATED("Use ShowAllWindowsInSession() instead.")
333 void ShowAllPanelsInSession(size_t session_id) {
334 ShowAllWindowsInSession(session_id);
335 }
336 YAZE_CARD_SHIM_DEPRECATED("Use HideAllWindowsInSession() instead.")
337 void HideAllPanelsInSession(size_t session_id) {
338 HideAllWindowsInSession(session_id);
339 }
340 YAZE_CARD_SHIM_DEPRECATED("Use ShowAllWindowsInCategory() instead.")
341 void ShowAllPanelsInCategory(size_t session_id, const std::string& category) {
342 ShowAllWindowsInCategory(session_id, category);
343 }
344 YAZE_CARD_SHIM_DEPRECATED("Use HideAllWindowsInCategory() instead.")
345 void HideAllPanelsInCategory(size_t session_id, const std::string& category) {
346 HideAllWindowsInCategory(session_id, category);
347 }
348 YAZE_CARD_SHIM_DEPRECATED("Use ShowOnlyWindow() instead.")
349 void ShowOnlyPanel(size_t session_id, const std::string& base_card_id) {
350 ShowOnlyWindow(session_id, base_card_id);
351 }
352
353 // ============================================================================
354 // Query Methods
355 // ============================================================================
356
357 std::vector<std::string> GetWindowsInSession(size_t session_id) const {
358 return GetWindowsInSessionImpl(session_id);
359 }
360 std::vector<WindowDescriptor> GetWindowsInCategory(
361 size_t session_id, const std::string& category) const {
362 return GetWindowsInCategoryImpl(session_id, category);
363 }
364 std::vector<std::string> GetAllCategories(size_t session_id) const;
365 std::vector<std::string> GetAllWindowCategories(size_t session_id) const {
366 return GetAllCategories(session_id);
367 }
369 size_t session_id, const std::string& base_window_id) const {
370 return GetWindowDescriptorImpl(session_id, base_window_id);
371 }
372
377 const std::unordered_map<std::string, WindowDescriptor>&
381
382 std::vector<std::string> GetAllCategories() const;
383 std::vector<std::string> GetAllWindowCategories() const {
384 return GetAllCategories();
385 }
386
387 // ============================================================================
388 // State Persistence
389 // ============================================================================
390
396 std::vector<std::string> GetVisibleWindowIds(size_t session_id) const {
397 return GetVisibleWindowIdsImpl(session_id);
398 }
399
405 void SetVisibleWindows(size_t session_id,
406 const std::vector<std::string>& window_ids) {
407 SetVisibleWindowsImpl(session_id, window_ids);
408 }
409
415 std::unordered_map<std::string, bool> SerializeVisibilityState(
416 size_t session_id) const;
417
424 size_t session_id, const std::unordered_map<std::string, bool>& state,
425 bool publish_events = false);
426
431 std::unordered_map<std::string, bool> SerializePinnedState() const;
432
437 void RestorePinnedState(const std::unordered_map<std::string, bool>& state);
438
443 std::string GetWorkspaceWindowName(size_t session_id,
444 const std::string& base_window_id) const {
445 return GetWindowNameImpl(session_id, base_window_id);
446 }
447 std::string GetWorkspaceWindowName(const WindowDescriptor& descriptor) const {
448 return GetWindowNameImpl(descriptor);
449 }
450
451 static constexpr float GetSidebarWidth() { return 48.0f; }
452 static constexpr float GetSidePanelWidth() { return 300.0f; }
456 };
457 static SidePanelWidthBounds GetSidePanelWidthBounds(float viewport_width);
458 static float GetSidePanelWidthForViewport(float viewport_width) {
459 if (viewport_width <= 0.0f) {
460 return GetSidePanelWidth();
461 }
462
463 // Keep side panel useful on compact/touch widths while preserving
464 // desktop defaults on large displays.
465 if (viewport_width < 900.0f) {
466 const float preferred = viewport_width * 0.50f;
467 const float min_width = std::max(220.0f, viewport_width * 0.40f);
468 const float max_width =
469 std::max(min_width, std::min(380.0f, viewport_width * 0.58f));
470 return std::clamp(preferred, min_width, max_width);
471 }
472
473 if (viewport_width < 1200.0f) {
474 const float preferred = viewport_width * 0.34f;
475 const float min_width = 300.0f;
476 const float max_width = std::min(420.0f, viewport_width * 0.42f);
477 return std::clamp(preferred, min_width, max_width);
478 }
479
480 // iPad Pro landscape sits in this range; avoid falling back to a narrow
481 // desktop sidebar width that feels cramped for touch navigation.
482 if (viewport_width < 1400.0f) {
483 const float preferred = viewport_width * 0.25f;
484 const float min_width = 300.0f;
485 const float max_width = 380.0f;
486 return std::clamp(preferred, min_width, max_width);
487 }
488
489 float width = GetSidePanelWidth();
490 const float max_width = viewport_width * 0.30f;
491 if (max_width > 0.0f && width > max_width) {
492 width = max_width;
493 }
494 return width;
495 }
496 float GetActiveSidePanelWidth(float viewport_width) const;
497 void SetActiveSidePanelWidth(float width, float viewport_width = 0.0f,
498 bool notify = true);
499 void ResetSidePanelWidth(bool notify = true);
501 void SetStoredSidePanelWidth(float width, bool notify = false) {
502 SetActiveSidePanelWidth(width, 0.0f, notify);
503 }
504 void SetSidePanelWidthChangedCallback(std::function<void(float)> cb) {
506 }
507
508 YAZE_CARD_SHIM_DEPRECATED("Use GetWindowBrowserCategoryWidth() instead.")
515 YAZE_CARD_SHIM_DEPRECATED("Use SetWindowBrowserCategoryWidth() instead.")
516 void SetPanelBrowserCategoryWidth(float width, bool notify = true);
517 void SetWindowBrowserCategoryWidth(float width, bool notify = true) {
518 SetPanelBrowserCategoryWidth(width, notify);
519 }
521 std::function<void(float)> cb) {
523 }
525 std::function<void(float)> cb) {
527 }
529 "Use GetDefaultWindowBrowserCategoryWidth() instead.")
530 static constexpr float GetDefaultPanelBrowserCategoryWidth() {
531 return 260.0f;
532 }
533 static constexpr float GetDefaultWindowBrowserCategoryWidth() {
534 return 260.0f;
535 }
536
537 static constexpr float GetCollapsedSidebarWidth() { return 16.0f; }
538
539 static std::string GetCategoryIcon(const std::string& category);
540
547 float r, g, b, a; // Icon color when active
548 float glow_r, glow_g, glow_b; // Glow/accent color (same hue)
549 };
550 static CategoryTheme GetCategoryTheme(const std::string& category);
551
555 void HandleSidebarKeyboardNav(size_t session_id,
556 const std::vector<WindowDescriptor>& cards);
557
563
571
572 void SetSidebarVisible(bool visible, bool notify = true) {
573 if (browser_state_.sidebar_visible != visible) {
578 }
579 }
580 }
581
583
584 YAZE_CARD_SHIM_DEPRECATED("Use ToggleSidebarExpanded() instead.")
586
594
595 YAZE_CARD_SHIM_DEPRECATED("Use SetSidebarExpanded() instead.")
596 void SetPanelExpanded(bool expanded, bool notify = true) {
597 SetSidebarExpanded(expanded, notify);
598 }
599
600 void SetSidebarExpanded(bool expanded, bool notify = true) {
601 if (browser_state_.sidebar_expanded != expanded) {
606 }
607 }
608 }
609
610 YAZE_CARD_SHIM_DEPRECATED("Use IsSidebarExpanded() instead.")
611 bool IsPanelExpanded() const { return IsSidebarExpanded(); }
613
614 // ============================================================================
615 // EventBus Integration
616 // ============================================================================
617
618 void SetEventBus(EventBus* event_bus) { event_bus_ = event_bus; }
619
620 // ============================================================================
621 // Triggers (exposed for ActivityBar) - prefer EventBus, fallback to callbacks
622 // ============================================================================
623
634 YAZE_CARD_SHIM_DEPRECATED("Use TriggerShowWindowBrowser() instead.")
636
648 void TriggerUndo() {
649 if (event_bus_) {
651 }
652 }
653 void TriggerRedo() {
654 if (event_bus_) {
656 }
657 }
702 YAZE_CARD_SHIM_DEPRECATED("Use TriggerWindowClicked() instead.")
703 void TriggerPanelClicked(const std::string& category) {
704 TriggerWindowClicked(category);
705 }
706 void TriggerWindowClicked(const std::string& category) {
709 }
710 void TriggerCategorySelected(const std::string& category) {
713 }
714 }
715 void TriggerWindowCategorySelected(const std::string& category) {
716 TriggerCategorySelected(category);
717 }
718
719 // ============================================================================
720 // Utility Icon Callbacks (DEPRECATED: subscribe to UIActionRequestEvent instead)
721 // ============================================================================
722
723 void SetSidebarStateChangedCallback(std::function<void(bool, bool)> cb) {
725 }
726
727 void SetCategoryChangedCallback(std::function<void(const std::string&)> cb) {
728 browser_state_.on_category_changed = std::move(cb);
729 }
730
731 // ============================================================================
732 // Workspace Presets
733 // ============================================================================
734
736 std::string name;
737 std::vector<std::string> visible_cards; // Panel IDs
738 std::string description;
739 };
740
741 void SavePreset(const std::string& name, const std::string& description = "");
742 bool LoadPreset(const std::string& name);
743 void DeletePreset(const std::string& name);
744 std::vector<WorkspacePreset> GetPresets() const;
745
746 // ============================================================================
747 // Panel Validation (for catching ImGui window-name mismatches)
748 // ============================================================================
749
751 std::string card_id;
752 std::string expected_title; // Exact ImGui window name for docking/focus
753 bool found_in_imgui; // Whether ImGui found a window with this title
754 std::string message; // Human-readable status
755 };
756
757 std::vector<WindowValidationResult> ValidateWindows() const;
758 WindowValidationResult ValidateWindow(const std::string& card_id) const;
759
760 // ============================================================================
761 // Quick Actions
762 // ============================================================================
763
764 void ShowAll(size_t session_id);
765 void HideAll(size_t session_id);
766 void ResetToDefaults(size_t session_id);
767 void ResetToDefaults(size_t session_id, EditorType editor_type);
768
769 // ============================================================================
770 // Statistics
771 // ============================================================================
772
773 YAZE_CARD_SHIM_DEPRECATED("Use GetWindowCount() instead.")
774 size_t GetPanelCount() const { return registry_state_.descriptors.size(); }
775 size_t GetWindowCount() const { return registry_state_.descriptors.size(); }
776 size_t GetVisibleWindowCount(size_t session_id) const;
777 YAZE_CARD_SHIM_DEPRECATED("Use GetVisibleWindowCount() instead.")
778 size_t GetVisiblePanelCount(size_t session_id) const {
779 return GetVisibleWindowCount(session_id);
780 }
782
783 // ============================================================================
784 // Session Prefixing Utilities
785 // ============================================================================
786
787 std::string MakeWindowId(size_t session_id, const std::string& base_id) const;
788 std::string MakeWindowId(size_t session_id, const std::string& base_id,
789 WindowScope scope) const;
790 YAZE_CARD_SHIM_DEPRECATED("Use MakeWindowId() instead.")
791 std::string MakePanelId(size_t session_id, const std::string& base_id) const {
792 return MakeWindowId(session_id, base_id);
793 }
794 YAZE_CARD_SHIM_DEPRECATED("Use MakeWindowId() instead.")
795 std::string MakePanelId(size_t session_id, const std::string& base_id,
796 WindowScope scope) const {
797 return MakeWindowId(session_id, base_id, scope);
798 }
799 bool ShouldPrefixPanels() const { return session_count_ > 1; }
800
801 // ============================================================================
802 // Convenience Methods (for EditorManager direct usage without session_id)
803 // ============================================================================
804
805 void RegisterPanel(const WindowDescriptor& base_info) {
806 RegisterPanel(active_session_, base_info);
807 }
808 void RegisterWindow(const WindowDescriptor& descriptor) {
809 RegisterPanel(active_session_, descriptor);
810 }
811 void UnregisterPanel(const std::string& base_card_id) {
812 UnregisterPanel(active_session_, base_card_id);
813 }
814 void UnregisterWindow(const std::string& base_window_id) {
815 UnregisterPanel(active_session_, base_window_id);
816 }
817 bool OpenWindow(const std::string& base_window_id) {
818 return OpenWindowImpl(active_session_, base_window_id);
819 }
820 bool CloseWindow(const std::string& base_window_id) {
821 return CloseWindowImpl(active_session_, base_window_id);
822 }
823 bool IsWindowOpen(const std::string& base_window_id) const {
824 return IsWindowVisibleImpl(active_session_, base_window_id);
825 }
826 void HideAllWindowsInCategory(const std::string& category) {
828 }
829 YAZE_CARD_SHIM_DEPRECATED("Use HideAllWindowsInCategory() instead.")
830 void HideAllPanelsInCategory(const std::string& category) {
832 }
833 std::string GetActiveCategory() const {
835 }
836 void SetActiveCategory(const std::string& category, bool notify = true) {
837 if (browser_state_.active_category != category) {
839 if (notify && browser_state_.on_category_changed) {
841 }
842 }
843 }
844 void ShowAllWindowsInCategory(const std::string& category) {
846 }
847 YAZE_CARD_SHIM_DEPRECATED("Use ShowAllWindowsInCategory() instead.")
848 void ShowAllPanelsInCategory(const std::string& category) {
850 }
851 bool* GetWindowVisibilityFlag(const std::string& base_window_id) {
852 return GetVisibilityFlag(active_session_, base_window_id);
853 }
857 std::function<void(const std::string&)> callback) {
858 browser_state_.on_window_clicked = std::move(callback);
859 }
861 std::function<void(const std::string&)> callback) {
862 browser_state_.on_category_selected = std::move(callback);
863 }
864 void SetEditorResolver(std::function<Editor*(const std::string&)> resolver) {
865 editor_resolver_ = std::move(resolver);
866 }
867
868 size_t GetActiveSessionId() const { return active_session_; }
869
870 // ============================================================================
871 // File Browser Integration
872 // ============================================================================
873
874 FileBrowser* GetFileBrowser(const std::string& category);
875 void EnableFileBrowser(const std::string& category,
876 const std::string& root_path = "");
877 void DisableFileBrowser(const std::string& category);
878 bool HasFileBrowser(const std::string& category) const;
879 void SetFileBrowserPath(const std::string& category, const std::string& path);
881 std::function<void(const std::string& category, const std::string& path)>
882 callback) {
883 on_file_clicked_ = std::move(callback);
884 }
885
886 // ============================================================================
887 // Favorites (delegates to Pinned) and Recent
888 // ============================================================================
889
890 // Favorites are now aliases for pinned panels
891 void ToggleFavorite(const std::string& card_id) {
892 SetWindowPinned(card_id, !IsWindowPinned(card_id));
893 }
894 bool IsFavorite(const std::string& card_id) const {
895 return IsWindowPinned(card_id);
896 }
897
898 void MarkWindowRecentlyUsed(const std::string& window_id) {
900 }
901
902 std::vector<WindowDescriptor> GetWindowsSortedByMRU(
903 size_t session_id, const std::string& category) const {
904 return GetWindowsSortedByMRUImpl(session_id, category);
905 }
906
907 uint64_t GetWindowMRUTime(const std::string& window_id) const {
908 return GetWindowMRUTimeImpl(window_id);
909 }
910
911 // ============================================================================
912 // Pinning (Phase 3 scaffold)
913 // ============================================================================
914
915 void SetWindowPinned(size_t session_id, const std::string& base_window_id,
916 bool pinned) {
917 SetWindowPinnedImpl(session_id, base_window_id, pinned);
918 }
919 bool IsWindowPinned(size_t session_id,
920 const std::string& base_window_id) const {
921 return IsWindowPinnedImpl(session_id, base_window_id);
922 }
923 std::vector<std::string> GetPinnedWindows(size_t session_id) const {
924 return GetPinnedWindowsImpl(session_id);
925 }
926
927 void SetWindowPinned(const std::string& base_window_id, bool pinned) {
928 SetWindowPinnedImpl(base_window_id, pinned);
929 }
930 bool IsWindowPinned(const std::string& base_window_id) const {
931 return IsWindowPinnedImpl(base_window_id);
932 }
933 std::vector<std::string> GetPinnedWindows() const {
934 return GetPinnedWindowsImpl();
935 }
936
937 // ============================================================================
938 // Resource Management (Phase 6)
939 // ============================================================================
940
948 void EnforceResourceLimits(const std::string& resource_type);
949 void EnforceResourceWindowLimits(const std::string& resource_type) {
950 EnforceResourceLimits(resource_type);
951 }
952
957 void MarkPanelUsed(const std::string& panel_id);
958
959 WindowContent* FindPanelInstance(const std::string& prefixed_panel_id,
960 const std::string& base_panel_id);
962 const std::string& prefixed_panel_id,
963 const std::string& base_panel_id) const;
964
965 private:
967 size_t operator()(WindowContextScope scope) const noexcept {
968 return static_cast<size_t>(scope);
969 }
970 };
971
972 void ApplyContextPolicy(size_t session_id, WindowContextScope scope,
973 const std::string& old_key,
974 const std::string& new_key);
975 WindowDescriptor* FindDescriptorByPrefixedId(const std::string& prefixed_id);
977 const std::string& prefixed_id) const;
978 std::vector<std::string>* FindSessionWindowIds(size_t session_id);
979 const std::vector<std::string>* FindSessionWindowIds(size_t session_id) const;
980 std::unordered_map<std::string, std::string>* FindSessionWindowMapping(
981 size_t session_id);
982 const std::unordered_map<std::string, std::string>* FindSessionWindowMapping(
983 size_t session_id) const;
984 std::unordered_map<std::string, std::string>* FindSessionReverseWindowMapping(
985 size_t session_id);
986 const std::unordered_map<std::string, std::string>*
987 FindSessionReverseWindowMapping(size_t session_id) const;
988 void PublishWindowVisibilityChanged(size_t session_id,
989 const std::string& prefixed_window_id,
990 const std::string& base_window_id,
991 const std::string& category,
992 bool visible) const;
993 bool OpenWindowImpl(size_t session_id, const std::string& base_card_id);
994 bool CloseWindowImpl(size_t session_id, const std::string& base_card_id);
995 bool ToggleWindowImpl(size_t session_id, const std::string& base_card_id);
996 bool IsWindowVisibleImpl(size_t session_id,
997 const std::string& base_card_id) const;
998 bool* GetVisibilityFlag(size_t session_id, const std::string& base_card_id);
999 std::vector<std::string> GetWindowsInSessionImpl(size_t session_id) const;
1000 std::vector<WindowDescriptor> GetWindowsInCategoryImpl(
1001 size_t session_id, const std::string& category) const;
1002 std::vector<std::string> GetVisibleWindowIdsImpl(size_t session_id) const;
1003 void SetVisibleWindowsImpl(size_t session_id,
1004 const std::vector<std::string>& panel_ids);
1006 size_t session_id, const std::string& base_card_id) const;
1007 std::string GetWindowNameImpl(size_t session_id,
1008 const std::string& base_card_id) const;
1009 std::string GetWindowNameImpl(const WindowDescriptor& descriptor) const;
1010 void MarkWindowRecentlyUsedImpl(const std::string& card_id);
1011 std::vector<WindowDescriptor> GetWindowsSortedByMRUImpl(
1012 size_t session_id, const std::string& category) const;
1013 uint64_t GetWindowMRUTimeImpl(const std::string& card_id) const {
1014 auto iter = last_used_at_.find(card_id);
1015 return (iter != last_used_at_.end()) ? iter->second : 0;
1016 }
1017 void SetWindowPinnedImpl(size_t session_id, const std::string& base_card_id,
1018 bool pinned);
1019 bool IsWindowPinnedImpl(size_t session_id,
1020 const std::string& base_card_id) const;
1021 std::vector<std::string> GetPinnedWindowsImpl(size_t session_id) const;
1022 void RememberPinnedStateForRemovedWindow(size_t session_id,
1023 const std::string& base_card_id,
1024 const std::string& prefixed_id);
1025 void SetWindowPinnedImpl(const std::string& base_card_id, bool pinned);
1026 bool IsWindowPinnedImpl(const std::string& base_card_id) const;
1027 std::vector<std::string> GetPinnedWindowsImpl() const;
1028 size_t GetResourceWindowLimit(const std::string& resource_type) const;
1029 void TrackResourceWindow(const std::string& panel_id,
1030 ResourceWindowContent* resource_panel);
1031 void UntrackResourceWindow(const std::string& panel_id);
1033 const std::list<std::string>& panel_ids) const;
1034 std::string ResolveBaseWindowId(const std::string& panel_id) const;
1035 std::string GetBaseIdForPrefixedId(size_t session_id,
1036 const std::string& prefixed_id) const;
1037
1038 // ... existing private members ...
1039
1041 std::unordered_map<std::string, std::list<std::string>> window_ids_by_type;
1042 std::unordered_map<std::string, std::string> window_type_by_id;
1043 };
1044
1046
1047 std::unordered_map<std::string, std::list<std::string>>& resource_panels_ =
1049 std::unordered_map<std::string, std::string>& panel_resource_types_ =
1051
1053 std::unordered_map<std::string, WindowDescriptor> descriptors;
1054 std::unordered_map<std::string, std::unique_ptr<WindowContent>> instances;
1055 std::unordered_set<std::string> registry_ids;
1056 std::unordered_set<std::string> global_ids;
1057 std::unordered_map<std::string, bool> centralized_visibility;
1058 std::unordered_map<std::string, std::string> aliases;
1059 };
1060
1062 std::unordered_map<std::string, uint64_t> last_used_at;
1063 uint64_t mru_counter = 0;
1064 std::unordered_map<std::string, bool> pinned_windows;
1065 // Base-id → pinned entries restored before the matching panel registered.
1066 // Consumed by TrackPanelForSession when late-registering panels arrive.
1067 // Also included in SerializePinnedState so pins survive a restart even
1068 // when the user never actually opened the panel in the prior session.
1069 std::unordered_map<std::string, bool> pending_pinned_base_ids;
1070 size_t session_count = 0;
1071 size_t active_session = 0;
1072 std::unordered_map<size_t, std::vector<std::string>> session_windows;
1073 std::unordered_map<size_t, std::unordered_map<std::string, std::string>>
1075 std::unordered_map<size_t, std::unordered_map<std::string, std::string>>
1077 std::unordered_map<size_t,
1078 std::unordered_map<WindowContextScope, std::string,
1081 };
1082
1085
1086 // Legacy field aliases kept during the panel->window migration while methods
1087 // are gradually moved over to the grouped state containers above.
1088 std::unordered_map<std::string, WindowDescriptor>& cards_ =
1090 std::unordered_map<std::string, std::unique_ptr<WindowContent>>&
1092 std::unordered_set<std::string>& registry_panel_ids_ =
1094 std::unordered_set<std::string>& global_panel_ids_ =
1096 std::unordered_map<std::string, bool>& centralized_visibility_ =
1098 std::unordered_map<std::string, std::string>& panel_id_aliases_ =
1100
1101 std::unordered_map<std::string, uint64_t>& last_used_at_ =
1104 std::unordered_map<std::string, bool>& pinned_panels_ =
1106 std::unordered_map<std::string, bool>& pending_pinned_base_ids_ =
1110 std::unordered_map<size_t, std::vector<std::string>>& session_cards_ =
1112 std::unordered_map<size_t, std::unordered_map<std::string, std::string>>&
1114 std::unordered_map<size_t, std::unordered_map<std::string, std::string>>&
1117 std::unordered_map<size_t, std::unordered_map<WindowContextScope, std::string,
1120
1121 // Workspace presets
1122 std::unordered_map<std::string, WorkspacePreset> presets_;
1123
1125 static constexpr size_t kMaxRecentCategories = 5;
1126
1127 std::string active_category;
1128 std::vector<std::string> recent_categories;
1129 bool sidebar_visible = false;
1130 bool sidebar_expanded = false;
1131 float sidebar_width = 0.0f;
1132 float window_browser_category_width = GetDefaultPanelBrowserCategoryWidth();
1134 bool sidebar_has_focus = false;
1135 std::function<void(bool visible, bool expanded)> on_sidebar_state_changed;
1136 std::function<void(float width)> on_sidebar_width_changed;
1137 std::function<void(float width)> on_window_browser_width_changed;
1138 std::function<void(const std::string&)> on_category_changed;
1139 std::function<void(const std::string&)> on_window_clicked;
1140 std::function<void(const std::string&)> on_category_selected;
1141 std::unordered_map<std::string, std::unique_ptr<FileBrowser>>
1143 };
1144
1146
1147 // EventBus for action events (preferred over callbacks)
1149
1150 // State change callbacks
1151 std::function<void(const std::string&, const std::string&)> on_file_clicked_;
1152 std::function<Editor*(const std::string&)> editor_resolver_;
1153
1154 // Helper methods
1155 void UpdateSessionCount();
1156 std::string GetPrefixedWindowId(size_t session_id,
1157 const std::string& base_id) const;
1158 void RegisterPanelDescriptorForSession(size_t session_id,
1159 const WindowContent& panel);
1160 void TrackPanelForSession(size_t session_id, const std::string& base_id,
1161 const std::string& panel_id);
1162 void UnregisterSessionPanels(size_t session_id);
1163 void SavePresetsToFile();
1164 void LoadPresetsFromFile();
1165};
1166
1167} // namespace editor
1168} // namespace yaze
1169
1170#undef YAZE_CARD_SHIM_DEPRECATED
1171
1172#endif // YAZE_APP_EDITOR_SYSTEM_WORKSPACE_WINDOW_MANAGER_H_
void Publish(const T &event)
Definition event_bus.h:35
Interface for editor classes.
Definition editor.h:245
File system browser for the sidebar.
Base class for windows that edit specific ROM resources.
Base interface for all logical window content components.
Central registry for all editor cards with session awareness and dependency injection.
void HideAllPanelsInCategory(size_t session_id, const std::string &category)
void EnableFileBrowser(const std::string &category, const std::string &root_path="")
void TriggerPanelClicked(const std::string &category)
void RegisterPanel(size_t session_id, const WindowDescriptor &base_info)
bool IsWindowPinnedImpl(size_t session_id, const std::string &base_card_id) const
void SavePreset(const std::string &name, const std::string &description="")
std::vector< std::string > GetWindowsInSessionImpl(size_t session_id) const
void SetVisibleWindows(size_t session_id, const std::vector< std::string > &window_ids)
Set which panels should be visible for a session.
bool IsWindowOpen(const std::string &base_window_id) const
void SetActiveSidePanelWidth(float width, float viewport_width=0.0f, bool notify=true)
void HideAllWindowsInCategory(size_t session_id, const std::string &category)
size_t GetVisiblePanelCount(size_t session_id) const
bool CloseWindowImpl(size_t session_id, const std::string &base_card_id)
std::string GetContextKey(size_t session_id, WindowContextScope scope) const
size_t GetResourceWindowLimit(const std::string &resource_type) const
std::unordered_map< size_t, std::unordered_map< std::string, std::string > > & session_reverse_card_mapping_
std::string GetWorkspaceWindowName(size_t session_id, const std::string &base_window_id) const
Resolve the exact ImGui window name for a panel by base ID.
void ShowAllPanelsInCategory(size_t session_id, const std::string &category)
static SidePanelWidthBounds GetSidePanelWidthBounds(float viewport_width)
void SetSidebarVisible(bool visible, bool notify=true)
std::vector< WindowDescriptor > GetWindowsInCategory(size_t session_id, const std::string &category) const
std::vector< WorkspacePreset > GetPresets() const
void UnregisterWindowContent(const std::string &window_id)
Unregister and destroy a WindowContent instance.
std::unordered_map< std::string, std::string > * FindSessionWindowMapping(size_t session_id)
std::string SelectResourceWindowForEviction(const std::list< std::string > &panel_ids) const
void RegisterRegistryWindowsForSession(size_t session_id)
bool * GetVisibilityFlag(size_t session_id, const std::string &base_card_id)
void UntrackResourceWindow(const std::string &panel_id)
std::string ResolveBaseWindowId(const std::string &panel_id) const
void RegisterWindow(const WindowDescriptor &descriptor)
void SetEditorResolver(std::function< Editor *(const std::string &)> resolver)
std::unordered_map< std::string, WindowDescriptor > & cards_
std::string GetPrefixedWindowId(size_t session_id, const std::string &base_id) const
std::string ResolveWindowAlias(const std::string &window_id) const
void RestoreVisibilityState(size_t session_id, const std::unordered_map< std::string, bool > &state, bool publish_events=false)
Restore panel visibility state from persistence.
static float GetSidePanelWidthForViewport(float viewport_width)
std::string MakePanelId(size_t session_id, const std::string &base_id) const
void SetPanelBrowserCategoryWidthChangedCallback(std::function< void(float)> cb)
std::vector< std::string > * FindSessionWindowIds(size_t session_id)
const WindowDescriptor * GetWindowDescriptor(size_t session_id, const std::string &base_window_id) const
void ApplyContextPolicy(size_t session_id, WindowContextScope scope, const std::string &old_key, const std::string &new_key)
const WindowDescriptor * GetWindowDescriptorImpl(size_t session_id, const std::string &base_card_id) const
WorkspaceWindowManager(WorkspaceWindowManager &&)=delete
std::vector< std::string > GetWindowsInSession(size_t session_id) const
bool CloseWindow(const std::string &base_window_id)
void RememberPinnedStateForRemovedWindow(size_t session_id, const std::string &base_card_id, const std::string &prefixed_id)
std::string GetBaseIdForPrefixedId(size_t session_id, const std::string &prefixed_id) const
static CategoryTheme GetCategoryTheme(const std::string &category)
void RegisterWindowAlias(const std::string &legacy_base_id, const std::string &canonical_base_id)
WorkspaceWindowManager & operator=(const WorkspaceWindowManager &)=delete
FileBrowser * GetFileBrowser(const std::string &category)
std::unordered_map< std::string, std::string > & panel_resource_types_
std::vector< WindowDescriptor > GetWindowsInCategoryImpl(size_t session_id, const std::string &category) const
const std::unordered_map< std::string, WindowDescriptor > & GetAllWindowDescriptors() const
Get all panel descriptors (for layout designer, panel browser, etc.)
std::unordered_map< std::string, bool > & centralized_visibility_
std::unordered_map< size_t, std::unordered_map< std::string, std::string > > & session_card_mapping_
std::unordered_map< std::string, bool > & pending_pinned_base_ids_
void SetPanelExpanded(bool expanded, bool notify=true)
void MarkPanelUsed(const std::string &panel_id)
Mark a panel as recently used (for LRU)
bool IsWindowPinned(const std::string &base_window_id) const
std::function< void(const std::string &, const std::string &) on_file_clicked_)
void TrackPanelForSession(size_t session_id, const std::string &base_id, const std::string &panel_id)
void SetWindowPinned(size_t session_id, const std::string &base_window_id, bool pinned)
bool CloseWindow(size_t session_id, const std::string &base_window_id)
std::unordered_map< std::string, std::list< std::string > > & resource_panels_
std::vector< std::string > GetAllWindowCategories() const
void TrackResourceWindow(const std::string &panel_id, ResourceWindowContent *resource_panel)
std::vector< std::string > GetAllWindowCategories(size_t session_id) const
std::vector< std::string > GetAllCategories() const
void SetActiveCategory(const std::string &category, bool notify=true)
void SetSidebarStateChangedCallback(std::function< void(bool, bool)> cb)
std::string GetWorkspaceWindowName(const WindowDescriptor &descriptor) const
std::vector< std::string > GetPinnedWindowsImpl() const
void RegisterRegistryWindowContent(std::unique_ptr< WindowContent > window)
Register a ContentRegistry-managed WindowContent instance.
static std::string GetCategoryIcon(const std::string &category)
void UnregisterPanel(size_t session_id, const std::string &base_card_id)
void TriggerWindowClicked(const std::string &category)
void ShowOnlyWindow(size_t session_id, const std::string &base_window_id)
bool IsFavorite(const std::string &card_id) const
void RegisterWindowContent(std::unique_ptr< WindowContent > window)
Register a WindowContent instance for central drawing.
std::function< Editor *(const std::string &) editor_resolver_)
static constexpr const char * kDashboardCategory
std::unordered_map< std::string, WorkspacePreset > presets_
void EnforceResourceLimits(const std::string &resource_type)
Enforce limits on resource panels (LRU eviction)
bool HasFileBrowser(const std::string &category) const
YAZE_CARD_SHIM_DEPRECATED("Use GetDefaultWindowBrowserCategoryWidth() instead.") static const expr float GetDefaultPanelBrowserCategoryWidth()
WindowDescriptor * FindDescriptorByPrefixedId(const std::string &prefixed_id)
std::vector< std::string > GetVisibleWindowIds(size_t session_id) const
Get list of currently visible panel IDs for a session.
void SetPanelBrowserCategoryWidth(float width, bool notify=true)
void RegisterWindow(size_t session_id, const WindowDescriptor &descriptor)
bool IsWindowVisibleImpl(size_t session_id, const std::string &base_card_id) const
void SetStoredSidePanelWidth(float width, bool notify=false)
void DrawAllVisiblePanels()
Draw all visible WindowContent instances (central drawing)
std::unordered_map< std::string, std::unique_ptr< WindowContent > > & panel_instances_
void SetVisibleWindowsImpl(size_t session_id, const std::vector< std::string > &panel_ids)
void RegisterRegistryWindow(std::unique_ptr< WindowContent > window)
std::unordered_set< std::string > & registry_panel_ids_
std::vector< std::string > GetVisibleWindowIdsImpl(size_t session_id) const
void SetWindowPinnedImpl(size_t session_id, const std::string &base_card_id, bool pinned)
void MarkWindowRecentlyUsedImpl(const std::string &card_id)
bool ToggleWindowImpl(size_t session_id, const std::string &base_card_id)
std::unordered_map< size_t, std::vector< std::string > > & session_cards_
std::vector< std::string > GetPinnedWindows(size_t session_id) const
void HideAllWindowsInCategory(const std::string &category)
uint64_t GetWindowMRUTime(const std::string &window_id) const
size_t GetVisibleWindowCount(size_t session_id) const
bool IsWindowOpen(size_t session_id, const std::string &base_window_id) const
void EnforceResourceWindowLimits(const std::string &resource_type)
void ShowOnlyPanel(size_t session_id, const std::string &base_card_id)
std::string ResolvePanelAlias(const std::string &panel_id) const
Resolve a panel ID through the alias table.
std::unordered_map< std::string, std::string > * FindSessionReverseWindowMapping(size_t session_id)
bool OpenWindow(const std::string &base_window_id)
std::string GetWindowNameImpl(size_t session_id, const std::string &base_card_id) const
void SetCategoryChangedCallback(std::function< void(const std::string &)> cb)
void SetFileBrowserPath(const std::string &category, const std::string &path)
std::unordered_map< std::string, uint64_t > & last_used_at_
void SetWindowBrowserCategoryWidthChangedCallback(std::function< void(float)> cb)
float GetActiveSidePanelWidth(float viewport_width) const
std::string MakeWindowId(size_t session_id, const std::string &base_id) const
std::vector< WindowDescriptor > GetWindowsSortedByMRUImpl(size_t session_id, const std::string &category) const
bool * GetWindowVisibilityFlag(const std::string &base_window_id)
void SetOnWindowCategorySelectedCallback(std::function< void(const std::string &)> callback)
void TriggerCategorySelected(const std::string &category)
std::unordered_map< std::string, bool > SerializeVisibilityState(size_t session_id) const
Serialize panel visibility state for persistence.
void SetOnWindowClickedCallback(std::function< void(const std::string &)> callback)
void HandleSidebarKeyboardNav(size_t session_id, const std::vector< WindowDescriptor > &cards)
Handle keyboard navigation in sidebar (click-to-focus modal)
void OnEditorSwitch(const std::string &from_category, const std::string &to_category)
Handle editor/category switching for panel visibility.
bool OpenWindow(size_t session_id, const std::string &base_window_id)
uint64_t GetWindowMRUTimeImpl(const std::string &card_id) const
void ToggleFavorite(const std::string &card_id)
std::vector< WindowValidationResult > ValidateWindows() const
static constexpr float GetDefaultWindowBrowserCategoryWidth()
std::vector< std::string > GetPinnedWindows() const
std::vector< WindowDescriptor > GetWindowsSortedByMRU(size_t session_id, const std::string &category) const
void RegisterWindow(size_t session_id, const std::string &window_id, const std::string &display_name, const std::string &icon, const std::string &category, const std::string &shortcut_hint="", int priority=50, std::function< void()> on_show=nullptr, std::function< void()> on_hide=nullptr, bool visible_by_default=false)
void ShowAllWindowsInCategory(const std::string &category)
std::unordered_map< std::string, std::string > & panel_id_aliases_
std::unordered_map< std::string, bool > & pinned_panels_
bool IsWindowPinned(size_t session_id, const std::string &base_window_id) const
void SetSidePanelWidthChangedCallback(std::function< void(float)> cb)
WorkspaceWindowManager(const WorkspaceWindowManager &)=delete
void TriggerWindowCategorySelected(const std::string &category)
WindowContent * GetWindowContent(const std::string &window_id)
Get a WindowContent instance by ID.
bool ToggleWindow(size_t session_id, const std::string &base_window_id)
void SetWindowBrowserCategoryWidth(float width, bool notify=true)
void RegisterRegistryWindowContentsForSession(size_t session_id)
Register descriptors for all registry window contents in a session.
void SetFileClickedCallback(std::function< void(const std::string &category, const std::string &path)> callback)
size_t GetRegistryWindowContentCount() const
Returns the number of window contents registered via ContentRegistry.
void UnregisterPanel(const std::string &base_card_id)
std::unordered_map< std::string, bool > SerializePinnedState() const
Serialize pinned panel state for persistence.
void SetSidebarExpanded(bool expanded, bool notify=true)
WorkspaceWindowManager & operator=(WorkspaceWindowManager &&)=delete
std::unordered_map< size_t, std::unordered_map< WindowContextScope, std::string, WindowContextScopeHash > > & session_context_keys_
void UnregisterWindow(const std::string &base_window_id)
WindowContent * FindPanelInstance(const std::string &prefixed_panel_id, const std::string &base_panel_id)
void RegisterPanel(const WindowDescriptor &base_info)
void UnregisterPanelsWithPrefix(const std::string &prefix)
bool * GetWindowVisibilityFlag(size_t session_id, const std::string &base_window_id)
void SetContextKey(size_t session_id, WindowContextScope scope, std::string key)
Set a string key for a given context scope (room/selection/etc)
WindowValidationResult ValidateWindow(const std::string &card_id) const
void PublishWindowVisibilityChanged(size_t session_id, const std::string &prefixed_window_id, const std::string &base_window_id, const std::string &category, bool visible) const
void RegisterPanelDescriptorForSession(size_t session_id, const WindowContent &panel)
bool OpenWindowImpl(size_t session_id, const std::string &base_card_id)
void ShowAllWindowsInCategory(size_t session_id, const std::string &category)
void UnregisterWindow(size_t session_id, const std::string &base_window_id)
void RestorePinnedState(const std::unordered_map< std::string, bool > &state)
Restore pinned panel state from persistence.
void RegisterPanelAlias(const std::string &legacy_base_id, const std::string &canonical_base_id)
Register a legacy panel ID alias that resolves to a canonical ID.
void MarkWindowRecentlyUsed(const std::string &window_id)
void SetWindowPinned(const std::string &base_window_id, bool pinned)
std::unordered_set< std::string > & global_panel_ids_
Draggable, dockable panel for editor sub-windows.
WindowContextScope
Optional context binding for a window's behavior within an editor.
WindowLifecycle
Defines lifecycle behavior for editor windows.
@ EditorBound
Hidden when switching editors (default)
WindowScope
Defines whether a window is session-scoped or global.
static UIActionRequestEvent Redo(size_t session=0)
static UIActionRequestEvent ShowCommandPalette(size_t session=0)
static UIActionRequestEvent SaveRom(size_t session=0)
static UIActionRequestEvent Create(Action act, size_t session=0)
static UIActionRequestEvent Undo(size_t session=0)
static UIActionRequestEvent ShowSettings(size_t session=0)
static UIActionRequestEvent ShowAgentProposalsSidebar(size_t session=0)
static UIActionRequestEvent ShowAgentChatSidebar(size_t session=0)
static UIActionRequestEvent OpenRom(size_t session=0)
static UIActionRequestEvent ShowEmulator(size_t session=0)
Metadata for a dockable editor window (formerly PanelInfo)
std::string GetWindowTitle() const
Get the effective window title for DockBuilder.
std::string GetImGuiWindowName() const
Build the exact ImGui window name used by PanelWindow::Begin.
Get the expressive theme color for a category.
std::unordered_map< std::string, std::string > window_type_by_id
std::unordered_map< std::string, std::list< std::string > > window_ids_by_type
std::function< void(bool visible, bool expanded)> on_sidebar_state_changed
std::function< void(const std::string &) on_category_selected)
std::unordered_map< std::string, std::unique_ptr< FileBrowser > > category_file_browsers
std::function< void(const std::string &) on_category_changed)
size_t operator()(WindowContextScope scope) const noexcept
std::unordered_map< std::string, std::string > aliases
std::unordered_map< std::string, std::unique_ptr< WindowContent > > instances
std::unordered_map< std::string, WindowDescriptor > descriptors
std::unordered_map< size_t, std::unordered_map< WindowContextScope, std::string, WindowContextScopeHash > > session_context_keys
std::unordered_map< size_t, std::vector< std::string > > session_windows
std::unordered_map< size_t, std::unordered_map< std::string, std::string > > session_reverse_window_mapping
std::unordered_map< size_t, std::unordered_map< std::string, std::string > > session_window_mapping
#define YAZE_CARD_SHIM_DEPRECATED(msg)