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
284
295 void OnEditorSwitch(const std::string& from_category,
296 const std::string& to_category);
297
298 // ============================================================================
299 // Panel Control (Programmatic)
300 // ============================================================================
301
302 bool OpenWindow(size_t session_id, const std::string& base_window_id) {
303 return OpenWindowImpl(session_id, base_window_id);
304 }
305 bool CloseWindow(size_t session_id, const std::string& base_window_id) {
306 return CloseWindowImpl(session_id, base_window_id);
307 }
308 bool ToggleWindow(size_t session_id, const std::string& base_window_id) {
309 return ToggleWindowImpl(session_id, base_window_id);
310 }
311 bool IsWindowOpen(size_t session_id,
312 const std::string& base_window_id) const {
313 return IsWindowVisibleImpl(session_id, base_window_id);
314 }
315 bool* GetWindowVisibilityFlag(size_t session_id,
316 const std::string& base_window_id) {
317 return GetVisibilityFlag(session_id, base_window_id);
318 }
319
320 // ============================================================================
321 // Batch Operations
322 // ============================================================================
323
324 void ShowAllWindowsInSession(size_t session_id);
325 void HideAllWindowsInSession(size_t session_id);
326 void ShowAllWindowsInCategory(size_t session_id, const std::string& category);
327 void HideAllWindowsInCategory(size_t session_id, const std::string& category);
328 void ShowOnlyWindow(size_t session_id, const std::string& base_window_id);
329
330 YAZE_CARD_SHIM_DEPRECATED("Use ShowAllWindowsInSession() instead.")
331 void ShowAllPanelsInSession(size_t session_id) {
332 ShowAllWindowsInSession(session_id);
333 }
334 YAZE_CARD_SHIM_DEPRECATED("Use HideAllWindowsInSession() instead.")
335 void HideAllPanelsInSession(size_t session_id) {
336 HideAllWindowsInSession(session_id);
337 }
338 YAZE_CARD_SHIM_DEPRECATED("Use ShowAllWindowsInCategory() instead.")
339 void ShowAllPanelsInCategory(size_t session_id, const std::string& category) {
340 ShowAllWindowsInCategory(session_id, category);
341 }
342 YAZE_CARD_SHIM_DEPRECATED("Use HideAllWindowsInCategory() instead.")
343 void HideAllPanelsInCategory(size_t session_id, const std::string& category) {
344 HideAllWindowsInCategory(session_id, category);
345 }
346 YAZE_CARD_SHIM_DEPRECATED("Use ShowOnlyWindow() instead.")
347 void ShowOnlyPanel(size_t session_id, const std::string& base_card_id) {
348 ShowOnlyWindow(session_id, base_card_id);
349 }
350
351 // ============================================================================
352 // Query Methods
353 // ============================================================================
354
355 std::vector<std::string> GetWindowsInSession(size_t session_id) const {
356 return GetWindowsInSessionImpl(session_id);
357 }
358 std::vector<WindowDescriptor> GetWindowsInCategory(
359 size_t session_id, const std::string& category) const {
360 return GetWindowsInCategoryImpl(session_id, category);
361 }
362 std::vector<std::string> GetAllCategories(size_t session_id) const;
363 std::vector<std::string> GetAllWindowCategories(size_t session_id) const {
364 return GetAllCategories(session_id);
365 }
367 size_t session_id, const std::string& base_window_id) const {
368 return GetWindowDescriptorImpl(session_id, base_window_id);
369 }
370
375 const std::unordered_map<std::string, WindowDescriptor>&
379
380 std::vector<std::string> GetAllCategories() const;
381 std::vector<std::string> GetAllWindowCategories() const {
382 return GetAllCategories();
383 }
384
385 // ============================================================================
386 // State Persistence
387 // ============================================================================
388
394 std::vector<std::string> GetVisibleWindowIds(size_t session_id) const {
395 return GetVisibleWindowIdsImpl(session_id);
396 }
397
403 void SetVisibleWindows(size_t session_id,
404 const std::vector<std::string>& window_ids) {
405 SetVisibleWindowsImpl(session_id, window_ids);
406 }
407
413 std::unordered_map<std::string, bool> SerializeVisibilityState(
414 size_t session_id) const;
415
422 size_t session_id, const std::unordered_map<std::string, bool>& state,
423 bool publish_events = false);
424
429 std::unordered_map<std::string, bool> SerializePinnedState() const;
430
435 void RestorePinnedState(const std::unordered_map<std::string, bool>& state);
436
441 std::string GetWorkspaceWindowName(size_t session_id,
442 const std::string& base_window_id) const {
443 return GetWindowNameImpl(session_id, base_window_id);
444 }
445 std::string GetWorkspaceWindowName(const WindowDescriptor& descriptor) const {
446 return GetWindowNameImpl(descriptor);
447 }
448
449 static constexpr float GetSidebarWidth() { return 48.0f; }
450 static constexpr float GetSidePanelWidth() { return 300.0f; }
454 };
455 static SidePanelWidthBounds GetSidePanelWidthBounds(float viewport_width);
456 static float GetSidePanelWidthForViewport(float viewport_width) {
457 if (viewport_width <= 0.0f) {
458 return GetSidePanelWidth();
459 }
460
461 // Keep side panel useful on compact/touch widths while preserving
462 // desktop defaults on large displays.
463 if (viewport_width < 900.0f) {
464 const float preferred = viewport_width * 0.50f;
465 const float min_width = std::max(220.0f, viewport_width * 0.40f);
466 const float max_width =
467 std::max(min_width, std::min(380.0f, viewport_width * 0.58f));
468 return std::clamp(preferred, min_width, max_width);
469 }
470
471 if (viewport_width < 1200.0f) {
472 const float preferred = viewport_width * 0.34f;
473 const float min_width = 300.0f;
474 const float max_width = std::min(420.0f, viewport_width * 0.42f);
475 return std::clamp(preferred, min_width, max_width);
476 }
477
478 // iPad Pro landscape sits in this range; avoid falling back to a narrow
479 // desktop sidebar width that feels cramped for touch navigation.
480 if (viewport_width < 1400.0f) {
481 const float preferred = viewport_width * 0.25f;
482 const float min_width = 300.0f;
483 const float max_width = 380.0f;
484 return std::clamp(preferred, min_width, max_width);
485 }
486
487 float width = GetSidePanelWidth();
488 const float max_width = viewport_width * 0.30f;
489 if (max_width > 0.0f && width > max_width) {
490 width = max_width;
491 }
492 return width;
493 }
494 float GetActiveSidePanelWidth(float viewport_width) const;
495 void SetActiveSidePanelWidth(float width, float viewport_width = 0.0f,
496 bool notify = true);
497 void ResetSidePanelWidth(bool notify = true);
499 void SetStoredSidePanelWidth(float width, bool notify = false) {
500 SetActiveSidePanelWidth(width, 0.0f, notify);
501 }
502 void SetSidePanelWidthChangedCallback(std::function<void(float)> cb) {
504 }
505
506 YAZE_CARD_SHIM_DEPRECATED("Use GetWindowBrowserCategoryWidth() instead.")
513 YAZE_CARD_SHIM_DEPRECATED("Use SetWindowBrowserCategoryWidth() instead.")
514 void SetPanelBrowserCategoryWidth(float width, bool notify = true);
515 void SetWindowBrowserCategoryWidth(float width, bool notify = true) {
516 SetPanelBrowserCategoryWidth(width, notify);
517 }
519 std::function<void(float)> cb) {
521 }
523 std::function<void(float)> cb) {
525 }
527 "Use GetDefaultWindowBrowserCategoryWidth() instead.")
528 static constexpr float GetDefaultPanelBrowserCategoryWidth() {
529 return 260.0f;
530 }
531 static constexpr float GetDefaultWindowBrowserCategoryWidth() {
532 return 260.0f;
533 }
534
535 static constexpr float GetCollapsedSidebarWidth() { return 16.0f; }
536
537 static std::string GetCategoryIcon(const std::string& category);
538
545 float r, g, b, a; // Icon color when active
546 float glow_r, glow_g, glow_b; // Glow/accent color (same hue)
547 };
548 static CategoryTheme GetCategoryTheme(const std::string& category);
549
553 void HandleSidebarKeyboardNav(size_t session_id,
554 const std::vector<WindowDescriptor>& cards);
555
561
569
570 void SetSidebarVisible(bool visible, bool notify = true) {
571 if (browser_state_.sidebar_visible != visible) {
576 }
577 }
578 }
579
581
582 YAZE_CARD_SHIM_DEPRECATED("Use ToggleSidebarExpanded() instead.")
584
592
593 YAZE_CARD_SHIM_DEPRECATED("Use SetSidebarExpanded() instead.")
594 void SetPanelExpanded(bool expanded, bool notify = true) {
595 SetSidebarExpanded(expanded, notify);
596 }
597
598 void SetSidebarExpanded(bool expanded, bool notify = true) {
599 if (browser_state_.sidebar_expanded != expanded) {
604 }
605 }
606 }
607
608 YAZE_CARD_SHIM_DEPRECATED("Use IsSidebarExpanded() instead.")
609 bool IsPanelExpanded() const { return IsSidebarExpanded(); }
611
612 // ============================================================================
613 // EventBus Integration
614 // ============================================================================
615
616 void SetEventBus(EventBus* event_bus) { event_bus_ = event_bus; }
617
618 // ============================================================================
619 // Triggers (exposed for ActivityBar) - prefer EventBus, fallback to callbacks
620 // ============================================================================
621
632 YAZE_CARD_SHIM_DEPRECATED("Use TriggerShowWindowBrowser() instead.")
634
646 void TriggerUndo() {
647 if (event_bus_) {
649 }
650 }
651 void TriggerRedo() {
652 if (event_bus_) {
654 }
655 }
700 YAZE_CARD_SHIM_DEPRECATED("Use TriggerWindowClicked() instead.")
701 void TriggerPanelClicked(const std::string& category) {
702 TriggerWindowClicked(category);
703 }
704 void TriggerWindowClicked(const std::string& category) {
707 }
708 void TriggerCategorySelected(const std::string& category) {
711 }
712 }
713 void TriggerWindowCategorySelected(const std::string& category) {
714 TriggerCategorySelected(category);
715 }
716
717 // ============================================================================
718 // Utility Icon Callbacks (DEPRECATED: subscribe to UIActionRequestEvent instead)
719 // ============================================================================
720
721 void SetSidebarStateChangedCallback(std::function<void(bool, bool)> cb) {
723 }
724
725 void SetCategoryChangedCallback(std::function<void(const std::string&)> cb) {
726 browser_state_.on_category_changed = std::move(cb);
727 }
728
729 // ============================================================================
730 // Workspace Presets
731 // ============================================================================
732
734 std::string name;
735 std::vector<std::string> visible_cards; // Panel IDs
736 std::string description;
737 };
738
739 void SavePreset(const std::string& name, const std::string& description = "");
740 bool LoadPreset(const std::string& name);
741 void DeletePreset(const std::string& name);
742 std::vector<WorkspacePreset> GetPresets() const;
743
744 // ============================================================================
745 // Panel Validation (for catching ImGui window-name mismatches)
746 // ============================================================================
747
749 std::string card_id;
750 std::string expected_title; // Exact ImGui window name for docking/focus
751 bool found_in_imgui; // Whether ImGui found a window with this title
752 std::string message; // Human-readable status
753 };
754
755 std::vector<WindowValidationResult> ValidateWindows() const;
756 WindowValidationResult ValidateWindow(const std::string& card_id) const;
757
758 // ============================================================================
759 // Quick Actions
760 // ============================================================================
761
762 void ShowAll(size_t session_id);
763 void HideAll(size_t session_id);
764 void ResetToDefaults(size_t session_id);
765 void ResetToDefaults(size_t session_id, EditorType editor_type);
766
767 // ============================================================================
768 // Statistics
769 // ============================================================================
770
771 YAZE_CARD_SHIM_DEPRECATED("Use GetWindowCount() instead.")
772 size_t GetPanelCount() const { return registry_state_.descriptors.size(); }
773 size_t GetWindowCount() const { return registry_state_.descriptors.size(); }
774 size_t GetVisibleWindowCount(size_t session_id) const;
775 YAZE_CARD_SHIM_DEPRECATED("Use GetVisibleWindowCount() instead.")
776 size_t GetVisiblePanelCount(size_t session_id) const {
777 return GetVisibleWindowCount(session_id);
778 }
780
781 // ============================================================================
782 // Session Prefixing Utilities
783 // ============================================================================
784
785 std::string MakeWindowId(size_t session_id, const std::string& base_id) const;
786 std::string MakeWindowId(size_t session_id, const std::string& base_id,
787 WindowScope scope) const;
788 YAZE_CARD_SHIM_DEPRECATED("Use MakeWindowId() instead.")
789 std::string MakePanelId(size_t session_id, const std::string& base_id) const {
790 return MakeWindowId(session_id, base_id);
791 }
792 YAZE_CARD_SHIM_DEPRECATED("Use MakeWindowId() instead.")
793 std::string MakePanelId(size_t session_id, const std::string& base_id,
794 WindowScope scope) const {
795 return MakeWindowId(session_id, base_id, scope);
796 }
797 bool ShouldPrefixPanels() const { return session_count_ > 1; }
798
799 // ============================================================================
800 // Convenience Methods (for EditorManager direct usage without session_id)
801 // ============================================================================
802
803 void RegisterPanel(const WindowDescriptor& base_info) {
804 RegisterPanel(active_session_, base_info);
805 }
806 void RegisterWindow(const WindowDescriptor& descriptor) {
807 RegisterPanel(active_session_, descriptor);
808 }
809 void UnregisterPanel(const std::string& base_card_id) {
810 UnregisterPanel(active_session_, base_card_id);
811 }
812 void UnregisterWindow(const std::string& base_window_id) {
813 UnregisterPanel(active_session_, base_window_id);
814 }
815 bool OpenWindow(const std::string& base_window_id) {
816 return OpenWindowImpl(active_session_, base_window_id);
817 }
818 bool CloseWindow(const std::string& base_window_id) {
819 return CloseWindowImpl(active_session_, base_window_id);
820 }
821 bool IsWindowOpen(const std::string& base_window_id) const {
822 return IsWindowVisibleImpl(active_session_, base_window_id);
823 }
824 void HideAllWindowsInCategory(const std::string& category) {
826 }
827 YAZE_CARD_SHIM_DEPRECATED("Use HideAllWindowsInCategory() instead.")
828 void HideAllPanelsInCategory(const std::string& category) {
830 }
831 std::string GetActiveCategory() const {
833 }
834 void SetActiveCategory(const std::string& category, bool notify = true) {
835 if (browser_state_.active_category != category) {
837 if (notify && browser_state_.on_category_changed) {
839 }
840 }
841 }
842 void ShowAllWindowsInCategory(const std::string& category) {
844 }
845 YAZE_CARD_SHIM_DEPRECATED("Use ShowAllWindowsInCategory() instead.")
846 void ShowAllPanelsInCategory(const std::string& category) {
848 }
849 bool* GetWindowVisibilityFlag(const std::string& base_window_id) {
850 return GetVisibilityFlag(active_session_, base_window_id);
851 }
855 std::function<void(const std::string&)> callback) {
856 browser_state_.on_window_clicked = std::move(callback);
857 }
859 std::function<void(const std::string&)> callback) {
860 browser_state_.on_category_selected = std::move(callback);
861 }
862 void SetEditorResolver(std::function<Editor*(const std::string&)> resolver) {
863 editor_resolver_ = std::move(resolver);
864 }
865
866 size_t GetActiveSessionId() const { return active_session_; }
867
868 // ============================================================================
869 // File Browser Integration
870 // ============================================================================
871
872 FileBrowser* GetFileBrowser(const std::string& category);
873 void EnableFileBrowser(const std::string& category,
874 const std::string& root_path = "");
875 void DisableFileBrowser(const std::string& category);
876 bool HasFileBrowser(const std::string& category) const;
877 void SetFileBrowserPath(const std::string& category, const std::string& path);
879 std::function<void(const std::string& category, const std::string& path)>
880 callback) {
881 on_file_clicked_ = std::move(callback);
882 }
883
884 // ============================================================================
885 // Favorites (delegates to Pinned) and Recent
886 // ============================================================================
887
888 // Favorites are now aliases for pinned panels
889 void ToggleFavorite(const std::string& card_id) {
890 SetWindowPinned(card_id, !IsWindowPinned(card_id));
891 }
892 bool IsFavorite(const std::string& card_id) const {
893 return IsWindowPinned(card_id);
894 }
895
896 void MarkWindowRecentlyUsed(const std::string& window_id) {
898 }
899
900 std::vector<WindowDescriptor> GetWindowsSortedByMRU(
901 size_t session_id, const std::string& category) const {
902 return GetWindowsSortedByMRUImpl(session_id, category);
903 }
904
905 uint64_t GetWindowMRUTime(const std::string& window_id) const {
906 return GetWindowMRUTimeImpl(window_id);
907 }
908
909 // ============================================================================
910 // Pinning (Phase 3 scaffold)
911 // ============================================================================
912
913 void SetWindowPinned(size_t session_id, const std::string& base_window_id,
914 bool pinned) {
915 SetWindowPinnedImpl(session_id, base_window_id, pinned);
916 }
917 bool IsWindowPinned(size_t session_id,
918 const std::string& base_window_id) const {
919 return IsWindowPinnedImpl(session_id, base_window_id);
920 }
921 std::vector<std::string> GetPinnedWindows(size_t session_id) const {
922 return GetPinnedWindowsImpl(session_id);
923 }
924
925 void SetWindowPinned(const std::string& base_window_id, bool pinned) {
926 SetWindowPinnedImpl(base_window_id, pinned);
927 }
928 bool IsWindowPinned(const std::string& base_window_id) const {
929 return IsWindowPinnedImpl(base_window_id);
930 }
931 std::vector<std::string> GetPinnedWindows() const {
932 return GetPinnedWindowsImpl();
933 }
934
935 // ============================================================================
936 // Resource Management (Phase 6)
937 // ============================================================================
938
946 void EnforceResourceLimits(const std::string& resource_type);
947 void EnforceResourceWindowLimits(const std::string& resource_type) {
948 EnforceResourceLimits(resource_type);
949 }
950
955 void MarkPanelUsed(const std::string& panel_id);
956
957 WindowContent* FindPanelInstance(const std::string& prefixed_panel_id,
958 const std::string& base_panel_id);
960 const std::string& prefixed_panel_id,
961 const std::string& base_panel_id) const;
962
963 private:
965 size_t operator()(WindowContextScope scope) const noexcept {
966 return static_cast<size_t>(scope);
967 }
968 };
969
970 void ApplyContextPolicy(size_t session_id, WindowContextScope scope,
971 const std::string& old_key,
972 const std::string& new_key);
973 WindowDescriptor* FindDescriptorByPrefixedId(const std::string& prefixed_id);
975 const std::string& prefixed_id) const;
976 std::vector<std::string>* FindSessionWindowIds(size_t session_id);
977 const std::vector<std::string>* FindSessionWindowIds(size_t session_id) const;
978 std::unordered_map<std::string, std::string>* FindSessionWindowMapping(
979 size_t session_id);
980 const std::unordered_map<std::string, std::string>* FindSessionWindowMapping(
981 size_t session_id) const;
982 std::unordered_map<std::string, std::string>* FindSessionReverseWindowMapping(
983 size_t session_id);
984 const std::unordered_map<std::string, std::string>*
985 FindSessionReverseWindowMapping(size_t session_id) const;
986 void PublishWindowVisibilityChanged(size_t session_id,
987 const std::string& prefixed_window_id,
988 const std::string& base_window_id,
989 const std::string& category,
990 bool visible) const;
991 bool OpenWindowImpl(size_t session_id, const std::string& base_card_id);
992 bool CloseWindowImpl(size_t session_id, const std::string& base_card_id);
993 bool ToggleWindowImpl(size_t session_id, const std::string& base_card_id);
994 bool IsWindowVisibleImpl(size_t session_id,
995 const std::string& base_card_id) const;
996 bool* GetVisibilityFlag(size_t session_id, const std::string& base_card_id);
997 std::vector<std::string> GetWindowsInSessionImpl(size_t session_id) const;
998 std::vector<WindowDescriptor> GetWindowsInCategoryImpl(
999 size_t session_id, const std::string& category) const;
1000 std::vector<std::string> GetVisibleWindowIdsImpl(size_t session_id) const;
1001 void SetVisibleWindowsImpl(size_t session_id,
1002 const std::vector<std::string>& panel_ids);
1004 size_t session_id, const std::string& base_card_id) const;
1005 std::string GetWindowNameImpl(size_t session_id,
1006 const std::string& base_card_id) const;
1007 std::string GetWindowNameImpl(const WindowDescriptor& descriptor) const;
1008 void MarkWindowRecentlyUsedImpl(const std::string& card_id);
1009 std::vector<WindowDescriptor> GetWindowsSortedByMRUImpl(
1010 size_t session_id, const std::string& category) const;
1011 uint64_t GetWindowMRUTimeImpl(const std::string& card_id) const {
1012 auto iter = last_used_at_.find(card_id);
1013 return (iter != last_used_at_.end()) ? iter->second : 0;
1014 }
1015 void SetWindowPinnedImpl(size_t session_id, const std::string& base_card_id,
1016 bool pinned);
1017 bool IsWindowPinnedImpl(size_t session_id,
1018 const std::string& base_card_id) const;
1019 std::vector<std::string> GetPinnedWindowsImpl(size_t session_id) const;
1020 void RememberPinnedStateForRemovedWindow(size_t session_id,
1021 const std::string& base_card_id,
1022 const std::string& prefixed_id);
1023 void SetWindowPinnedImpl(const std::string& base_card_id, bool pinned);
1024 bool IsWindowPinnedImpl(const std::string& base_card_id) const;
1025 std::vector<std::string> GetPinnedWindowsImpl() const;
1026 size_t GetResourceWindowLimit(const std::string& resource_type) const;
1027 void TrackResourceWindow(const std::string& panel_id,
1028 ResourceWindowContent* resource_panel);
1029 void UntrackResourceWindow(const std::string& panel_id);
1031 const std::list<std::string>& panel_ids) const;
1032 std::string ResolveBaseWindowId(const std::string& panel_id) const;
1033 std::string GetBaseIdForPrefixedId(size_t session_id,
1034 const std::string& prefixed_id) const;
1035
1036 // ... existing private members ...
1037
1039 std::unordered_map<std::string, std::list<std::string>> window_ids_by_type;
1040 std::unordered_map<std::string, std::string> window_type_by_id;
1041 };
1042
1044
1045 std::unordered_map<std::string, std::list<std::string>>& resource_panels_ =
1047 std::unordered_map<std::string, std::string>& panel_resource_types_ =
1049
1051 std::unordered_map<std::string, WindowDescriptor> descriptors;
1052 std::unordered_map<std::string, std::unique_ptr<WindowContent>> instances;
1053 std::unordered_set<std::string> registry_ids;
1054 std::unordered_set<std::string> global_ids;
1055 std::unordered_map<std::string, bool> centralized_visibility;
1056 std::unordered_map<std::string, std::string> aliases;
1057 };
1058
1060 std::unordered_map<std::string, uint64_t> last_used_at;
1061 uint64_t mru_counter = 0;
1062 std::unordered_map<std::string, bool> pinned_windows;
1063 // Base-id → pinned entries restored before the matching panel registered.
1064 // Consumed by TrackPanelForSession when late-registering panels arrive.
1065 // Also included in SerializePinnedState so pins survive a restart even
1066 // when the user never actually opened the panel in the prior session.
1067 std::unordered_map<std::string, bool> pending_pinned_base_ids;
1068 size_t session_count = 0;
1069 size_t active_session = 0;
1070 std::unordered_map<size_t, std::vector<std::string>> session_windows;
1071 std::unordered_map<size_t, std::unordered_map<std::string, std::string>>
1073 std::unordered_map<size_t, std::unordered_map<std::string, std::string>>
1075 std::unordered_map<size_t,
1076 std::unordered_map<WindowContextScope, std::string,
1079 };
1080
1083
1084 // Legacy field aliases kept during the panel->window migration while methods
1085 // are gradually moved over to the grouped state containers above.
1086 std::unordered_map<std::string, WindowDescriptor>& cards_ =
1088 std::unordered_map<std::string, std::unique_ptr<WindowContent>>&
1090 std::unordered_set<std::string>& registry_panel_ids_ =
1092 std::unordered_set<std::string>& global_panel_ids_ =
1094 std::unordered_map<std::string, bool>& centralized_visibility_ =
1096 std::unordered_map<std::string, std::string>& panel_id_aliases_ =
1098
1099 std::unordered_map<std::string, uint64_t>& last_used_at_ =
1102 std::unordered_map<std::string, bool>& pinned_panels_ =
1104 std::unordered_map<std::string, bool>& pending_pinned_base_ids_ =
1108 std::unordered_map<size_t, std::vector<std::string>>& session_cards_ =
1110 std::unordered_map<size_t, std::unordered_map<std::string, std::string>>&
1112 std::unordered_map<size_t, std::unordered_map<std::string, std::string>>&
1115 std::unordered_map<size_t, std::unordered_map<WindowContextScope, std::string,
1118
1119 // Workspace presets
1120 std::unordered_map<std::string, WorkspacePreset> presets_;
1121
1123 static constexpr size_t kMaxRecentCategories = 5;
1124
1125 std::string active_category;
1126 std::vector<std::string> recent_categories;
1127 bool sidebar_visible = false;
1128 bool sidebar_expanded = false;
1129 float sidebar_width = 0.0f;
1130 float window_browser_category_width = GetDefaultPanelBrowserCategoryWidth();
1132 bool sidebar_has_focus = false;
1133 std::function<void(bool visible, bool expanded)> on_sidebar_state_changed;
1134 std::function<void(float width)> on_sidebar_width_changed;
1135 std::function<void(float width)> on_window_browser_width_changed;
1136 std::function<void(const std::string&)> on_category_changed;
1137 std::function<void(const std::string&)> on_window_clicked;
1138 std::function<void(const std::string&)> on_category_selected;
1139 std::unordered_map<std::string, std::unique_ptr<FileBrowser>>
1141 };
1142
1144
1145 // EventBus for action events (preferred over callbacks)
1147
1148 // State change callbacks
1149 std::function<void(const std::string&, const std::string&)> on_file_clicked_;
1150 std::function<Editor*(const std::string&)> editor_resolver_;
1151
1152 // Helper methods
1153 void UpdateSessionCount();
1154 std::string GetPrefixedWindowId(size_t session_id,
1155 const std::string& base_id) const;
1156 void RegisterPanelDescriptorForSession(size_t session_id,
1157 const WindowContent& panel);
1158 void TrackPanelForSession(size_t session_id, const std::string& base_id,
1159 const std::string& panel_id);
1160 void UnregisterSessionPanels(size_t session_id);
1161 void SavePresetsToFile();
1162 void LoadPresetsFromFile();
1163};
1164
1165} // namespace editor
1166} // namespace yaze
1167
1168#undef YAZE_CARD_SHIM_DEPRECATED
1169
1170#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:240
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)