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 float GetSidePanelWidthForViewport(float viewport_width) {
218 float width = GetSidePanelWidth();
219 const float max_width = viewport_width * 0.28f;
220 if (viewport_width > 0.0f && max_width > 0.0f && width > max_width) {
221 width = max_width;
222 }
223 return width;
224 }
225 static constexpr float GetCollapsedSidebarWidth() { return 16.0f; }
226
227 static std::string GetCategoryIcon(const std::string& category);
228
235 float r, g, b, a; // Icon color when active
236 float glow_r, glow_g, glow_b; // Glow/accent color (same hue)
237 };
238 static CategoryTheme GetCategoryTheme(const std::string& category);
239
243 void HandleSidebarKeyboardNav(size_t session_id,
244 const std::vector<PanelDescriptor>& cards);
245
246 bool SidebarHasFocus() const { return sidebar_has_focus_; }
248
255
256 void SetSidebarVisible(bool visible) {
257 if (sidebar_visible_ != visible) {
258 sidebar_visible_ = visible;
261 }
262 }
263 }
264
265 bool IsSidebarVisible() const { return sidebar_visible_; }
266
273
274 void SetPanelExpanded(bool expanded) {
275 if (panel_expanded_ != expanded) {
276 panel_expanded_ = expanded;
279 }
280 }
281 }
282
283 bool IsPanelExpanded() const { return panel_expanded_; }
284
285 // ============================================================================
286 // Triggers (exposed for ActivityBar)
287 // ============================================================================
288
293 void TriggerUndo() { if (on_undo_) on_undo_(); }
294 void TriggerRedo() { if (on_redo_) on_redo_(); }
300 void TriggerPanelClicked(const std::string& category) { if (on_card_clicked_) on_card_clicked_(category); }
301 void TriggerCategorySelected(const std::string& category) { if (on_category_selected_) on_category_selected_(category); }
302
303 // ============================================================================
304 // Utility Icon Callbacks (for sidebar quick access buttons)
305 // ============================================================================
306
307 void SetShowEmulatorCallback(std::function<void()> cb) {
308 on_show_emulator_ = std::move(cb);
309 }
310 void SetShowSettingsCallback(std::function<void()> cb) {
311 on_show_settings_ = std::move(cb);
312 }
313 void SetShowPanelBrowserCallback(std::function<void()> cb) {
314 on_show_panel_browser_ = std::move(cb);
315 }
316 void SetSaveRomCallback(std::function<void()> cb) {
317 on_save_rom_ = std::move(cb);
318 }
319 void SetUndoCallback(std::function<void()> cb) {
320 on_undo_ = std::move(cb);
321 }
322 void SetRedoCallback(std::function<void()> cb) {
323 on_redo_ = std::move(cb);
324 }
325 void SetShowSearchCallback(std::function<void()> cb) {
326 on_show_search_ = std::move(cb);
327 }
328 void SetShowShortcutsCallback(std::function<void()> cb) {
329 on_show_shortcuts_ = std::move(cb);
330 }
331 void SetShowCommandPaletteCallback(std::function<void()> cb) {
332 on_show_command_palette_ = std::move(cb);
333 }
334 void SetShowHelpCallback(std::function<void()> cb) {
335 on_show_help_ = std::move(cb);
336 }
337 void SetOpenRomCallback(std::function<void()> cb) {
338 on_open_rom_ = std::move(cb);
339 }
341 std::function<void(bool, bool)> cb) {
342 on_sidebar_state_changed_ = std::move(cb);
343 }
344
345 // ============================================================================
346 // Unified Visibility Management (single source of truth)
347 // ============================================================================
348
349 bool IsEmulatorVisible() const { return emulator_visible_; }
350 void SetEmulatorVisible(bool visible) {
351 if (emulator_visible_ != visible) {
352 emulator_visible_ = visible;
355 }
356 }
357 }
359 void SetEmulatorVisibilityChangedCallback(std::function<void(bool)> cb) {
360 on_emulator_visibility_changed_ = std::move(cb);
361 }
362 void SetCategoryChangedCallback(std::function<void(const std::string&)> cb) {
363 on_category_changed_ = std::move(cb);
364 }
365
366 // ============================================================================
367 // Workspace Presets
368 // ============================================================================
369
371 std::string name;
372 std::vector<std::string> visible_cards; // Panel IDs
373 std::string description;
374 };
375
376 void SavePreset(const std::string& name, const std::string& description = "");
377 bool LoadPreset(const std::string& name);
378 void DeletePreset(const std::string& name);
379 std::vector<WorkspacePreset> GetPresets() const;
380
381 // ============================================================================
382 // Panel Validation (for catching window title mismatches)
383 // ============================================================================
384
386 std::string card_id;
387 std::string expected_title; // From PanelDescriptor::GetWindowTitle()
388 bool found_in_imgui; // Whether ImGui found a window with this title
389 std::string message; // Human-readable status
390 };
391
392 std::vector<PanelValidationResult> ValidatePanels() const;
393 PanelValidationResult ValidatePanel(const std::string& card_id) const;
394
395 // ============================================================================
396 // Quick Actions
397 // ============================================================================
398
399 void ShowAll(size_t session_id);
400 void HideAll(size_t session_id);
401 void ResetToDefaults(size_t session_id);
402 void ResetToDefaults(size_t session_id, EditorType editor_type);
403
404 // ============================================================================
405 // Statistics
406 // ============================================================================
407
408 size_t GetPanelCount() const { return cards_.size(); }
409 size_t GetVisiblePanelCount(size_t session_id) const;
410 size_t GetSessionCount() const { return session_count_; }
411
412 // ============================================================================
413 // Session Prefixing Utilities
414 // ============================================================================
415
416 std::string MakePanelId(size_t session_id, const std::string& base_id) const;
417 bool ShouldPrefixPanels() const { return session_count_ > 1; }
418
419 // ============================================================================
420 // Convenience Methods (for EditorManager direct usage without session_id)
421 // ============================================================================
422
423 void RegisterPanel(const PanelDescriptor& base_info) {
424 RegisterPanel(active_session_, base_info);
425 }
426 void UnregisterPanel(const std::string& base_card_id) {
427 UnregisterPanel(active_session_, base_card_id);
428 }
429 bool ShowPanel(const std::string& base_card_id) {
430 return ShowPanel(active_session_, base_card_id);
431 }
432 bool HidePanel(const std::string& base_card_id) {
433 return HidePanel(active_session_, base_card_id);
434 }
435 bool IsPanelVisible(const std::string& base_card_id) const {
436 return IsPanelVisible(active_session_, base_card_id);
437 }
438 void HideAllPanelsInCategory(const std::string& category) {
440 }
441 std::string GetActiveCategory() const { return active_category_; }
442 void SetActiveCategory(const std::string& category) {
443 if (active_category_ != category) {
444 active_category_ = category;
446 on_category_changed_(category);
447 }
448 }
449 }
450 void ShowAllPanelsInCategory(const std::string& category) {
452 }
453 bool* GetVisibilityFlag(const std::string& base_card_id) {
454 return GetVisibilityFlag(active_session_, base_card_id);
455 }
458 void SetOnPanelClickedCallback(std::function<void(const std::string&)> callback) {
459 on_card_clicked_ = std::move(callback);
460 }
461 void SetOnCategorySelectedCallback(std::function<void(const std::string&)> callback) {
462 on_category_selected_ = std::move(callback);
463 }
464
465 size_t GetActiveSessionId() const { return active_session_; }
466
467 // ============================================================================
468 // File Browser Integration
469 // ============================================================================
470
471 FileBrowser* GetFileBrowser(const std::string& category);
472 void EnableFileBrowser(const std::string& category,
473 const std::string& root_path = "");
474 void DisableFileBrowser(const std::string& category);
475 bool HasFileBrowser(const std::string& category) const;
476 void SetFileBrowserPath(const std::string& category, const std::string& path);
478 std::function<void(const std::string& category, const std::string& path)>
479 callback) {
480 on_file_clicked_ = std::move(callback);
481 }
482
483 // ============================================================================
484 // Favorites and Recent
485 // ============================================================================
486
487 void ToggleFavorite(const std::string& card_id);
488 bool IsFavorite(const std::string& card_id) const;
489 void AddToRecent(const std::string& card_id);
490 const std::vector<std::string>& GetRecentPanels() const { return recent_cards_; }
491 const std::unordered_set<std::string>& GetFavoritePanels() const { return favorite_cards_; }
492
493 // ============================================================================
494 // Pinning (Phase 3 scaffold)
495 // ============================================================================
496
497 void SetPanelPinned(size_t session_id, const std::string& base_card_id, bool pinned);
498 bool IsPanelPinned(size_t session_id, const std::string& base_card_id) const;
499 std::vector<std::string> GetPinnedPanels(size_t session_id) const;
500
501 void SetPanelPinned(const std::string& base_card_id, bool pinned);
502 bool IsPanelPinned(const std::string& base_card_id) const;
503 std::vector<std::string> GetPinnedPanels() const;
504
505 // ============================================================================
506 // Resource Management (Phase 6)
507 // ============================================================================
508
516 void EnforceResourceLimits(const std::string& resource_type);
517
522 void MarkPanelUsed(const std::string& panel_id);
523
524 private:
525 // ... existing private members ...
526
527 // Resource panel tracking: type -> list of panel_ids (front = LRU, back = MRU)
528 std::unordered_map<std::string, std::list<std::string>> resource_panels_;
529
530 // Map panel_id -> resource_type for quick lookups
531 std::unordered_map<std::string, std::string> panel_resource_types_;
532
533 // ... existing private members ...
534 // Core card storage (prefixed IDs → PanelDescriptor)
535 std::unordered_map<std::string, PanelDescriptor> cards_;
536
537 // EditorPanel instance storage (panel_id → EditorPanel)
538 // Panels with instances are drawn by DrawAllVisiblePanels()
539 std::unordered_map<std::string, std::unique_ptr<EditorPanel>> panel_instances_;
540
541 // Favorites and Recent tracking
542 std::unordered_set<std::string> favorite_cards_;
543 std::vector<std::string> recent_cards_;
544 static constexpr size_t kMaxRecentPanels = 10;
545
546 // Centralized visibility flags for cards without external flags
547 std::unordered_map<std::string, bool> centralized_visibility_;
548 // Pinned state tracking (prefixed ID → pinned)
549 std::unordered_map<std::string, bool> pinned_panels_;
550
551 // Session tracking
552 size_t session_count_ = 0;
553 size_t active_session_ = 0;
554
555 // Maps session_id → vector of prefixed card IDs registered for that session
556 std::unordered_map<size_t, std::vector<std::string>> session_cards_;
557
558 // Maps session_id → (base_card_id → prefixed_card_id)
559 std::unordered_map<size_t, std::unordered_map<std::string, std::string>>
561
562 // Workspace presets
563 std::unordered_map<std::string, WorkspacePreset> presets_;
564
565 // Active category tracking
566 std::string active_category_;
567 std::vector<std::string> recent_categories_;
568 static constexpr size_t kMaxRecentCategories = 5;
569
570 // Sidebar state
571 bool sidebar_visible_ = false; // Controls Activity Bar visibility (0px vs 48px)
572 bool panel_expanded_ = false; // Controls Side Panel visibility (0px vs 250px) - starts collapsed
573
574 // Keyboard navigation state (click-to-focus modal)
575 int focused_card_index_ = -1; // Currently focused card index (-1 = none)
576 bool sidebar_has_focus_ = false; // Whether sidebar has keyboard focus
577
578 // Unified visibility state (single source of truth)
579 bool emulator_visible_ = false; // Emulator window visibility
580
581 // Utility icon callbacks
582 std::function<void()> on_show_emulator_;
583 std::function<void()> on_show_settings_;
584 std::function<void()> on_show_panel_browser_;
585 std::function<void()> on_save_rom_;
586 std::function<void()> on_undo_;
587 std::function<void()> on_redo_;
588 std::function<void()> on_show_search_;
589 std::function<void()> on_show_shortcuts_;
590 std::function<void()> on_show_command_palette_;
591 std::function<void()> on_show_help_;
592 std::function<void()> on_open_rom_;
593
594 // State change callbacks
595 std::function<void(bool visible, bool expanded)> on_sidebar_state_changed_;
596 std::function<void(const std::string&)> on_category_changed_;
597 std::function<void(const std::string&)> on_card_clicked_;
598 std::function<void(const std::string&)> on_category_selected_; // Activity Bar icon clicked
599 std::function<void(bool)> on_emulator_visibility_changed_;
600 std::function<void(const std::string&, const std::string&)> on_file_clicked_;
601
602 // File browser for categories that support it (e.g., Assembly)
603 std::unordered_map<std::string, std::unique_ptr<FileBrowser>>
605
606 // Tracking active editor categories for visual feedback
607 std::unordered_set<std::string> active_editor_categories_;
608
609 // Helper methods
610 void UpdateSessionCount();
611 std::string GetPrefixedPanelId(size_t session_id,
612 const std::string& base_id) const;
613 void UnregisterSessionPanels(size_t session_id);
614 void SavePresetsToFile();
615 void LoadPresetsFromFile();
616};
617
618} // namespace editor
619} // namespace yaze
620
621#undef YAZE_CARD_SHIM_DEPRECATED
622
623#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
static float GetSidePanelWidthForViewport(float viewport_width)
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.