yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
panel_manager.h
Go to the documentation of this file.
1#ifndef APP_EDITOR_SYSTEM_PANEL_MANAGER_H_
2#define APP_EDITOR_SYSTEM_PANEL_MANAGER_H_
3
4#include <functional>
5#include <list>
6#include <memory>
7#include <string>
8#include <unordered_map>
9#include <unordered_set>
10#include <vector>
11
14
15#ifndef YAZE_ENABLE_CARD_SHIM_DEPRECATION
16#define YAZE_ENABLE_CARD_SHIM_DEPRECATION 1
17#endif
18
19#if YAZE_ENABLE_CARD_SHIM_DEPRECATION && defined(__has_cpp_attribute)
20#if __has_cpp_attribute(deprecated)
21#define YAZE_CARD_SHIM_DEPRECATED(msg) [[deprecated(msg)]]
22#else
23#define YAZE_CARD_SHIM_DEPRECATED(msg)
24#endif
25#else
26#define YAZE_CARD_SHIM_DEPRECATED(msg)
27#endif
28
29namespace yaze {
30
31namespace gui {
32class PanelWindow;
33} // namespace gui
34
35namespace editor {
36
37// Forward declarations
38enum class EditorType;
39
45 std::string card_id; // Unique identifier (e.g., "dungeon.room_selector")
46 std::string display_name; // Human-readable name (e.g., "Room Selector")
47 std::string window_title; // ImGui window title for DockBuilder (e.g., " Rooms List")
48 std::string icon; // Material icon
49 std::string category; // Category (e.g., "Dungeon", "Graphics", "Palette")
50 enum class ShortcutScope {
51 kGlobal, // Available regardless of active editor
52 kEditor, // Only active within the owning editor
53 kPanel // Panel visibility/within-panel actions
54 };
55 std::string shortcut_hint; // Display hint (e.g., "Ctrl+Shift+R")
57 bool* visibility_flag; // Pointer to bool controlling visibility
58 std::function<void()> on_show; // Callback when card is shown
59 std::function<void()> on_hide; // Callback when card is hidden
60 int priority; // Display priority for menus (lower = higher)
61
62 // Disabled state support for IDE-like behavior
63 std::function<bool()> enabled_condition; // Returns true if card is enabled (nullptr = always enabled)
64 std::string disabled_tooltip; // Tooltip shown when hovering disabled card
65
70 std::string GetWindowTitle() const {
71 if (!window_title.empty()) {
72 return window_title;
73 }
74 // Generate from icon + display_name if window_title not explicitly set
75 return icon + " " + display_name;
76 }
77};
78
85 public:
86 PanelManager() = default;
87 ~PanelManager() = default;
88
89 // Non-copyable, non-movable
90 PanelManager(const PanelManager&) = delete;
94
95 // Special category for dashboard/welcome screen - suppresses panel drawing
96 static constexpr const char* kDashboardCategory = "Dashboard";
97
98 // ============================================================================
99 // Session Lifecycle Management
100 // ============================================================================
101
102 void RegisterSession(size_t session_id);
103 void UnregisterSession(size_t session_id);
104 void SetActiveSession(size_t session_id);
105
106 // ============================================================================
107 // Panel Registration
108 // ============================================================================
109
110 void RegisterPanel(size_t session_id, const PanelDescriptor& base_info);
111
112 void RegisterPanel(size_t session_id, const std::string& card_id,
113 const std::string& display_name, const std::string& icon,
114 const std::string& category,
115 const std::string& shortcut_hint = "", int priority = 50,
116 std::function<void()> on_show = nullptr,
117 std::function<void()> on_hide = nullptr,
118 bool visible_by_default = false);
119
120 void UnregisterPanel(size_t session_id, const std::string& base_card_id);
121 void UnregisterPanelsWithPrefix(const std::string& prefix);
122 void ClearAllPanels();
123
124 // ============================================================================
125 // EditorPanel Instance Management (Phase 4)
126 // ============================================================================
127
137 void RegisterEditorPanel(std::unique_ptr<EditorPanel> panel);
138
143 void UnregisterEditorPanel(const std::string& panel_id);
144
150 EditorPanel* GetEditorPanel(const std::string& panel_id);
151
160
171 void OnEditorSwitch(const std::string& from_category,
172 const std::string& to_category);
173
174 // ============================================================================
175 // Panel Control (Programmatic)
176 // ============================================================================
177
178 bool ShowPanel(size_t session_id, const std::string& base_card_id);
179 bool HidePanel(size_t session_id, const std::string& base_card_id);
180 bool TogglePanel(size_t session_id, const std::string& base_card_id);
181 bool IsPanelVisible(size_t session_id, const std::string& base_card_id) const;
182 bool* GetVisibilityFlag(size_t session_id, const std::string& base_card_id);
183
184 // ============================================================================
185 // Batch Operations
186 // ============================================================================
187
188 void ShowAllPanelsInSession(size_t session_id);
189 void HideAllPanelsInSession(size_t session_id);
190 void ShowAllPanelsInCategory(size_t session_id, const std::string& category);
191 void HideAllPanelsInCategory(size_t session_id, const std::string& category);
192 void ShowOnlyPanel(size_t session_id, const std::string& base_card_id);
193
194 // ============================================================================
195 // Query Methods
196 // ============================================================================
197
198 std::vector<std::string> GetPanelsInSession(size_t session_id) const;
199 std::vector<PanelDescriptor> GetPanelsInCategory(size_t session_id,
200 const std::string& category) const;
201 std::vector<std::string> GetAllCategories(size_t session_id) const;
202 const PanelDescriptor* GetPanelDescriptor(size_t session_id,
203 const std::string& base_card_id) const;
204
209 const std::unordered_map<std::string, PanelDescriptor>& GetAllPanelDescriptors() const {
210 return cards_;
211 }
212
213 std::vector<std::string> GetAllCategories() const;
214
215 static constexpr float GetSidebarWidth() { return 48.0f; }
216 static constexpr float GetSidePanelWidth() { return 250.0f; }
217 static constexpr float GetCollapsedSidebarWidth() { return 16.0f; }
218
219 static std::string GetCategoryIcon(const std::string& category);
220
227 float r, g, b, a; // Icon color when active
228 float glow_r, glow_g, glow_b; // Glow/accent color (same hue)
229 };
230 static CategoryTheme GetCategoryTheme(const std::string& category);
231
235 void HandleSidebarKeyboardNav(size_t session_id,
236 const std::vector<PanelDescriptor>& cards);
237
238 bool SidebarHasFocus() const { return sidebar_has_focus_; }
240
247
248 void SetSidebarVisible(bool visible) {
249 if (sidebar_visible_ != visible) {
250 sidebar_visible_ = visible;
253 }
254 }
255 }
256
257 bool IsSidebarVisible() const { return sidebar_visible_; }
258
265
266 void SetPanelExpanded(bool expanded) {
267 if (panel_expanded_ != expanded) {
268 panel_expanded_ = expanded;
271 }
272 }
273 }
274
275 bool IsPanelExpanded() const { return panel_expanded_; }
276
277 // ============================================================================
278 // Triggers (exposed for ActivityBar)
279 // ============================================================================
280
285 void TriggerUndo() { if (on_undo_) on_undo_(); }
286 void TriggerRedo() { if (on_redo_) on_redo_(); }
292 void TriggerPanelClicked(const std::string& category) { if (on_card_clicked_) on_card_clicked_(category); }
293 void TriggerCategorySelected(const std::string& category) { if (on_category_selected_) on_category_selected_(category); }
294
295 // ============================================================================
296 // Utility Icon Callbacks (for sidebar quick access buttons)
297 // ============================================================================
298
299 void SetShowEmulatorCallback(std::function<void()> cb) {
300 on_show_emulator_ = std::move(cb);
301 }
302 void SetShowSettingsCallback(std::function<void()> cb) {
303 on_show_settings_ = std::move(cb);
304 }
305 void SetShowPanelBrowserCallback(std::function<void()> cb) {
306 on_show_panel_browser_ = std::move(cb);
307 }
308 void SetSaveRomCallback(std::function<void()> cb) {
309 on_save_rom_ = std::move(cb);
310 }
311 void SetUndoCallback(std::function<void()> cb) {
312 on_undo_ = std::move(cb);
313 }
314 void SetRedoCallback(std::function<void()> cb) {
315 on_redo_ = std::move(cb);
316 }
317 void SetShowSearchCallback(std::function<void()> cb) {
318 on_show_search_ = std::move(cb);
319 }
320 void SetShowShortcutsCallback(std::function<void()> cb) {
321 on_show_shortcuts_ = std::move(cb);
322 }
323 void SetShowCommandPaletteCallback(std::function<void()> cb) {
324 on_show_command_palette_ = std::move(cb);
325 }
326 void SetShowHelpCallback(std::function<void()> cb) {
327 on_show_help_ = std::move(cb);
328 }
329 void SetOpenRomCallback(std::function<void()> cb) {
330 on_open_rom_ = std::move(cb);
331 }
333 std::function<void(bool, bool)> cb) {
334 on_sidebar_state_changed_ = std::move(cb);
335 }
336
337 // ============================================================================
338 // Unified Visibility Management (single source of truth)
339 // ============================================================================
340
341 bool IsEmulatorVisible() const { return emulator_visible_; }
342 void SetEmulatorVisible(bool visible) {
343 if (emulator_visible_ != visible) {
344 emulator_visible_ = visible;
347 }
348 }
349 }
351 void SetEmulatorVisibilityChangedCallback(std::function<void(bool)> cb) {
352 on_emulator_visibility_changed_ = std::move(cb);
353 }
354 void SetCategoryChangedCallback(std::function<void(const std::string&)> cb) {
355 on_category_changed_ = std::move(cb);
356 }
357
358 // ============================================================================
359 // Workspace Presets
360 // ============================================================================
361
363 std::string name;
364 std::vector<std::string> visible_cards; // Panel IDs
365 std::string description;
366 };
367
368 void SavePreset(const std::string& name, const std::string& description = "");
369 bool LoadPreset(const std::string& name);
370 void DeletePreset(const std::string& name);
371 std::vector<WorkspacePreset> GetPresets() const;
372
373 // ============================================================================
374 // Panel Validation (for catching window title mismatches)
375 // ============================================================================
376
378 std::string card_id;
379 std::string expected_title; // From PanelDescriptor::GetWindowTitle()
380 bool found_in_imgui; // Whether ImGui found a window with this title
381 std::string message; // Human-readable status
382 };
383
384 std::vector<PanelValidationResult> ValidatePanels() const;
385 PanelValidationResult ValidatePanel(const std::string& card_id) const;
386
387 // ============================================================================
388 // Quick Actions
389 // ============================================================================
390
391 void ShowAll(size_t session_id);
392 void HideAll(size_t session_id);
393 void ResetToDefaults(size_t session_id);
394 void ResetToDefaults(size_t session_id, EditorType editor_type);
395
396 // ============================================================================
397 // Statistics
398 // ============================================================================
399
400 size_t GetPanelCount() const { return cards_.size(); }
401 size_t GetVisiblePanelCount(size_t session_id) const;
402 size_t GetSessionCount() const { return session_count_; }
403
404 // ============================================================================
405 // Session Prefixing Utilities
406 // ============================================================================
407
408 std::string MakePanelId(size_t session_id, const std::string& base_id) const;
409 bool ShouldPrefixPanels() const { return session_count_ > 1; }
410
411 // ============================================================================
412 // Convenience Methods (for EditorManager direct usage without session_id)
413 // ============================================================================
414
415 void RegisterPanel(const PanelDescriptor& base_info) {
416 RegisterPanel(active_session_, base_info);
417 }
418 void UnregisterPanel(const std::string& base_card_id) {
419 UnregisterPanel(active_session_, base_card_id);
420 }
421 bool ShowPanel(const std::string& base_card_id) {
422 return ShowPanel(active_session_, base_card_id);
423 }
424 bool HidePanel(const std::string& base_card_id) {
425 return HidePanel(active_session_, base_card_id);
426 }
427 bool IsPanelVisible(const std::string& base_card_id) const {
428 return IsPanelVisible(active_session_, base_card_id);
429 }
430 void HideAllPanelsInCategory(const std::string& category) {
432 }
433 std::string GetActiveCategory() const { return active_category_; }
434 void SetActiveCategory(const std::string& category) {
435 if (active_category_ != category) {
436 active_category_ = category;
438 on_category_changed_(category);
439 }
440 }
441 }
442 void ShowAllPanelsInCategory(const std::string& category) {
444 }
445 bool* GetVisibilityFlag(const std::string& base_card_id) {
446 return GetVisibilityFlag(active_session_, base_card_id);
447 }
450 void SetOnPanelClickedCallback(std::function<void(const std::string&)> callback) {
451 on_card_clicked_ = std::move(callback);
452 }
453 void SetOnCategorySelectedCallback(std::function<void(const std::string&)> callback) {
454 on_category_selected_ = std::move(callback);
455 }
456
457 size_t GetActiveSessionId() const { return active_session_; }
458
459 // ============================================================================
460 // File Browser Integration
461 // ============================================================================
462
463 FileBrowser* GetFileBrowser(const std::string& category);
464 void EnableFileBrowser(const std::string& category,
465 const std::string& root_path = "");
466 void DisableFileBrowser(const std::string& category);
467 bool HasFileBrowser(const std::string& category) const;
468 void SetFileBrowserPath(const std::string& category, const std::string& path);
470 std::function<void(const std::string& category, const std::string& path)>
471 callback) {
472 on_file_clicked_ = std::move(callback);
473 }
474
475 // ============================================================================
476 // Favorites and Recent
477 // ============================================================================
478
479 void ToggleFavorite(const std::string& card_id);
480 bool IsFavorite(const std::string& card_id) const;
481 void AddToRecent(const std::string& card_id);
482 const std::vector<std::string>& GetRecentPanels() const { return recent_cards_; }
483 const std::unordered_set<std::string>& GetFavoritePanels() const { return favorite_cards_; }
484
485 // ============================================================================
486 // Pinning (Phase 3 scaffold)
487 // ============================================================================
488
489 void SetPanelPinned(size_t session_id, const std::string& base_card_id, bool pinned);
490 bool IsPanelPinned(size_t session_id, const std::string& base_card_id) const;
491 std::vector<std::string> GetPinnedPanels(size_t session_id) const;
492
493 void SetPanelPinned(const std::string& base_card_id, bool pinned);
494 bool IsPanelPinned(const std::string& base_card_id) const;
495 std::vector<std::string> GetPinnedPanels() const;
496
497 // ============================================================================
498 // Resource Management (Phase 6)
499 // ============================================================================
500
508 void EnforceResourceLimits(const std::string& resource_type);
509
514 void MarkPanelUsed(const std::string& panel_id);
515
516 private:
517 // ... existing private members ...
518
519 // Resource panel tracking: type -> list of panel_ids (front = LRU, back = MRU)
520 std::unordered_map<std::string, std::list<std::string>> resource_panels_;
521
522 // Map panel_id -> resource_type for quick lookups
523 std::unordered_map<std::string, std::string> panel_resource_types_;
524
525 // ... existing private members ...
526 // Core card storage (prefixed IDs → PanelDescriptor)
527 std::unordered_map<std::string, PanelDescriptor> cards_;
528
529 // EditorPanel instance storage (panel_id → EditorPanel)
530 // Panels with instances are drawn by DrawAllVisiblePanels()
531 std::unordered_map<std::string, std::unique_ptr<EditorPanel>> panel_instances_;
532
533 // Favorites and Recent tracking
534 std::unordered_set<std::string> favorite_cards_;
535 std::vector<std::string> recent_cards_;
536 static constexpr size_t kMaxRecentPanels = 10;
537
538 // Centralized visibility flags for cards without external flags
539 std::unordered_map<std::string, bool> centralized_visibility_;
540 // Pinned state tracking (prefixed ID → pinned)
541 std::unordered_map<std::string, bool> pinned_panels_;
542
543 // Session tracking
544 size_t session_count_ = 0;
545 size_t active_session_ = 0;
546
547 // Maps session_id → vector of prefixed card IDs registered for that session
548 std::unordered_map<size_t, std::vector<std::string>> session_cards_;
549
550 // Maps session_id → (base_card_id → prefixed_card_id)
551 std::unordered_map<size_t, std::unordered_map<std::string, std::string>>
553
554 // Workspace presets
555 std::unordered_map<std::string, WorkspacePreset> presets_;
556
557 // Active category tracking
558 std::string active_category_;
559 std::vector<std::string> recent_categories_;
560 static constexpr size_t kMaxRecentCategories = 5;
561
562 // Sidebar state
563 bool sidebar_visible_ = false; // Controls Activity Bar visibility (0px vs 48px)
564 bool panel_expanded_ = false; // Controls Side Panel visibility (0px vs 250px) - starts collapsed
565
566 // Keyboard navigation state (click-to-focus modal)
567 int focused_card_index_ = -1; // Currently focused card index (-1 = none)
568 bool sidebar_has_focus_ = false; // Whether sidebar has keyboard focus
569
570 // Unified visibility state (single source of truth)
571 bool emulator_visible_ = false; // Emulator window visibility
572
573 // Utility icon callbacks
574 std::function<void()> on_show_emulator_;
575 std::function<void()> on_show_settings_;
576 std::function<void()> on_show_panel_browser_;
577 std::function<void()> on_save_rom_;
578 std::function<void()> on_undo_;
579 std::function<void()> on_redo_;
580 std::function<void()> on_show_search_;
581 std::function<void()> on_show_shortcuts_;
582 std::function<void()> on_show_command_palette_;
583 std::function<void()> on_show_help_;
584 std::function<void()> on_open_rom_;
585
586 // State change callbacks
587 std::function<void(bool visible, bool expanded)> on_sidebar_state_changed_;
588 std::function<void(const std::string&)> on_category_changed_;
589 std::function<void(const std::string&)> on_card_clicked_;
590 std::function<void(const std::string&)> on_category_selected_; // Activity Bar icon clicked
591 std::function<void(bool)> on_emulator_visibility_changed_;
592 std::function<void(const std::string&, const std::string&)> on_file_clicked_;
593
594 // File browser for categories that support it (e.g., Assembly)
595 std::unordered_map<std::string, std::unique_ptr<FileBrowser>>
597
598 // Tracking active editor categories for visual feedback
599 std::unordered_set<std::string> active_editor_categories_;
600
601 // Helper methods
602 void UpdateSessionCount();
603 std::string GetPrefixedPanelId(size_t session_id,
604 const std::string& base_id) const;
605 void UnregisterSessionPanels(size_t session_id);
606 void SavePresetsToFile();
607 void LoadPresetsFromFile();
608};
609
610} // namespace editor
611} // namespace yaze
612
613#undef YAZE_CARD_SHIM_DEPRECATED
614
615#endif // APP_EDITOR_SYSTEM_PANEL_MANAGER_H_
Base interface for all logical panel components.
File system browser for the sidebar.
Central registry for all editor cards with session awareness and dependency injection.
std::vector< std::string > GetPinnedPanels() const
void SetUndoCallback(std::function< void()> cb)
std::function< void(bool visible, bool expanded)> on_sidebar_state_changed_
size_t GetVisiblePanelCount(size_t session_id) const
void SetShowCommandPaletteCallback(std::function< void()> cb)
void ShowOnlyPanel(size_t session_id, const std::string &base_card_id)
std::unordered_map< std::string, bool > centralized_visibility_
void SetOpenRomCallback(std::function< void()> cb)
std::function< void()> on_show_settings_
void SetEmulatorVisibilityChangedCallback(std::function< void(bool)> cb)
void AddToRecent(const std::string &card_id)
void SetOnCategorySelectedCallback(std::function< void(const std::string &)> callback)
void SetSidebarStateChangedCallback(std::function< void(bool, bool)> cb)
std::unordered_map< std::string, std::unique_ptr< EditorPanel > > panel_instances_
bool * GetVisibilityFlag(const std::string &base_card_id)
std::function< void(const std::string &) on_category_selected_)
void ShowAllPanelsInCategory(const std::string &category)
void RegisterSession(size_t session_id)
std::function< void()> on_redo_
void SetFileBrowserPath(const std::string &category, const std::string &path)
void TriggerCategorySelected(const std::string &category)
EditorPanel * GetEditorPanel(const std::string &panel_id)
Get an EditorPanel instance by ID.
void SetShowPanelBrowserCallback(std::function< void()> cb)
std::function< void()> on_show_shortcuts_
void SetShowSearchCallback(std::function< void()> cb)
void OnEditorSwitch(const std::string &from_category, const std::string &to_category)
Handle editor/category switching for panel visibility.
void UnregisterSessionPanels(size_t session_id)
void SetActiveSession(size_t session_id)
bool TogglePanel(size_t session_id, const std::string &base_card_id)
const PanelDescriptor * GetPanelDescriptor(size_t session_id, const std::string &base_card_id) const
void SetCategoryChangedCallback(std::function< void(const std::string &)> cb)
void HideAllPanelsInCategory(const std::string &category)
std::unordered_map< std::string, std::string > panel_resource_types_
void TriggerPanelClicked(const std::string &category)
std::unordered_map< size_t, std::vector< std::string > > session_cards_
PanelManager & operator=(PanelManager &&)=delete
std::vector< std::string > GetPanelsInSession(size_t session_id) const
void HandleSidebarKeyboardNav(size_t session_id, const std::vector< PanelDescriptor > &cards)
Handle keyboard navigation in sidebar (click-to-focus modal)
std::vector< std::string > GetAllCategories() const
static constexpr size_t kMaxRecentPanels
bool * GetVisibilityFlag(size_t session_id, const std::string &base_card_id)
void UnregisterSession(size_t session_id)
void HideAllPanelsInSession(size_t session_id)
bool HasFileBrowser(const std::string &category) const
PanelManager & operator=(const PanelManager &)=delete
std::function< void(bool)> on_emulator_visibility_changed_
void UnregisterPanelsWithPrefix(const std::string &prefix)
void SetOnPanelClickedCallback(std::function< void(const std::string &)> callback)
std::function< void(const std::string &, const std::string &) on_file_clicked_)
std::vector< std::string > recent_cards_
std::vector< PanelDescriptor > GetPanelsInCategory(size_t session_id, const std::string &category) const
void SetShowShortcutsCallback(std::function< void()> cb)
std::function< void()> on_undo_
bool ShowPanel(size_t session_id, const std::string &base_card_id)
std::string MakePanelId(size_t session_id, const std::string &base_id) const
std::unordered_map< std::string, PanelDescriptor > cards_
void UnregisterPanel(const std::string &base_card_id)
std::unordered_map< std::string, bool > pinned_panels_
static CategoryTheme GetCategoryTheme(const std::string &category)
void RegisterPanel(size_t session_id, const PanelDescriptor &base_info)
std::string GetActiveCategory() const
bool IsPanelVisible(size_t session_id, const std::string &base_card_id) const
bool LoadPreset(const std::string &name)
void EnableFileBrowser(const std::string &category, const std::string &root_path="")
void SetShowEmulatorCallback(std::function< void()> cb)
PanelManager(const PanelManager &)=delete
std::function< void()> on_show_command_palette_
static constexpr float GetCollapsedSidebarWidth()
std::function< void()> on_show_help_
PanelValidationResult ValidatePanel(const std::string &card_id) const
std::unordered_map< size_t, std::unordered_map< std::string, std::string > > session_card_mapping_
void DeletePreset(const std::string &name)
std::vector< std::string > recent_categories_
PanelManager(PanelManager &&)=delete
void DisableFileBrowser(const std::string &category)
std::function< void(const std::string &) on_card_clicked_)
std::unordered_map< std::string, std::unique_ptr< FileBrowser > > category_file_browsers_
std::function< void()> on_open_rom_
std::string GetPrefixedPanelId(size_t session_id, const std::string &base_id) const
void SetPanelExpanded(bool expanded)
std::function< void()> on_show_emulator_
static constexpr float GetSidebarWidth()
const std::unordered_set< std::string > & GetFavoritePanels() const
std::unordered_set< std::string > active_editor_categories_
void SetShowSettingsCallback(std::function< void()> cb)
const std::vector< std::string > & GetRecentPanels() const
void UnregisterPanel(size_t session_id, const std::string &base_card_id)
void DrawAllVisiblePanels()
Draw all visible EditorPanel instances (central drawing)
void ResetToDefaults(size_t session_id)
static constexpr size_t kMaxRecentCategories
void UnregisterEditorPanel(const std::string &panel_id)
Unregister and destroy an EditorPanel instance.
bool IsPanelVisible(const std::string &base_card_id) const
void ShowAllPanelsInCategory(size_t session_id, const std::string &category)
std::vector< PanelValidationResult > ValidatePanels() const
void MarkPanelUsed(const std::string &panel_id)
Mark a panel as recently used (for LRU)
void SetEmulatorVisible(bool visible)
std::unordered_map< std::string, std::list< std::string > > resource_panels_
std::function< void()> on_show_panel_browser_
void SetRedoCallback(std::function< void()> cb)
void EnforceResourceLimits(const std::string &resource_type)
Enforce limits on resource panels (LRU eviction)
std::function< void()> on_save_rom_
static std::string GetCategoryIcon(const std::string &category)
static constexpr const char * kDashboardCategory
static constexpr float GetSidePanelWidth()
bool IsPanelPinned(size_t session_id, const std::string &base_card_id) const
const std::unordered_map< std::string, PanelDescriptor > & GetAllPanelDescriptors() const
Get all panel descriptors (for layout designer, panel browser, etc.)
void RegisterPanel(const PanelDescriptor &base_info)
void SetSidebarVisible(bool visible)
void SetSaveRomCallback(std::function< void()> cb)
bool HidePanel(const std::string &base_card_id)
FileBrowser * GetFileBrowser(const std::string &category)
void SetShowHelpCallback(std::function< void()> cb)
void ToggleFavorite(const std::string &card_id)
void SetActiveCategory(const std::string &category)
bool ShowPanel(const std::string &base_card_id)
void RegisterEditorPanel(std::unique_ptr< EditorPanel > panel)
Register an EditorPanel instance for central drawing.
void SavePreset(const std::string &name, const std::string &description="")
bool HidePanel(size_t session_id, const std::string &base_card_id)
std::function< void()> on_show_search_
void SetFileClickedCallback(std::function< void(const std::string &category, const std::string &path)> callback)
std::vector< WorkspacePreset > GetPresets() const
std::unordered_set< std::string > favorite_cards_
size_t GetActiveSessionId() const
void SetPanelPinned(size_t session_id, const std::string &base_card_id, bool pinned)
bool IsFavorite(const std::string &card_id) const
void HideAllPanelsInCategory(size_t session_id, const std::string &category)
std::unordered_map< std::string, WorkspacePreset > presets_
std::function< void(const std::string &) on_category_changed_)
void ShowAllPanelsInSession(size_t session_id)
Draggable, dockable panel for editor sub-windows.
Metadata for an editor panel (formerly PanelInfo)
std::function< void()> on_show
std::string GetWindowTitle() const
Get the effective window title for DockBuilder.
std::function< bool()> enabled_condition
std::function< void()> on_hide
Get the expressive theme color for a category.