yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
editor_card_registry.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EDITOR_SYSTEM_EDITOR_CARD_REGISTRY_H_
2#define YAZE_APP_EDITOR_SYSTEM_EDITOR_CARD_REGISTRY_H_
3
4#include <functional>
5#include <memory>
6#include <string>
7#include <unordered_map>
8#include <vector>
9
10#include "imgui/imgui.h"
11
12namespace yaze {
13namespace editor {
14
15// Forward declaration
16class EditorCard;
17
25struct CardInfo {
26 std::string card_id; // Unique identifier (e.g., "dungeon.room_selector")
27 std::string display_name; // Human-readable name (e.g., "Room Selector")
28 std::string icon; // Material icon
29 std::string category; // Category (e.g., "Dungeon", "Graphics", "Palette")
30 std::string shortcut_hint; // Display hint (e.g., "Ctrl+Shift+R")
31 bool* visibility_flag; // Pointer to bool controlling visibility
32 EditorCard* card_instance; // Pointer to actual card (optional)
33 std::function<void()> on_show; // Callback when card is shown
34 std::function<void()> on_hide; // Callback when card is hidden
35 int priority; // Display priority for menus (lower = higher)
36};
37
79 public:
80 EditorCardRegistry() = default;
82
83 // Non-copyable, non-movable (manages pointers and callbacks)
88
89 // ============================================================================
90 // Session Lifecycle Management
91 // ============================================================================
92
100 void RegisterSession(size_t session_id);
101
108 void UnregisterSession(size_t session_id);
109
116 void SetActiveSession(size_t session_id);
117
118 // ============================================================================
119 // Card Registration
120 // ============================================================================
121
130 void RegisterCard(size_t session_id, const CardInfo& base_info);
131
135 void RegisterCard(size_t session_id,
136 const std::string& card_id,
137 const std::string& display_name,
138 const std::string& icon,
139 const std::string& category,
140 const std::string& shortcut_hint = "",
141 int priority = 50,
142 std::function<void()> on_show = nullptr,
143 std::function<void()> on_hide = nullptr,
144 bool visible_by_default = false);
145
151 void UnregisterCard(size_t session_id, const std::string& base_card_id);
152
159 void UnregisterCardsWithPrefix(const std::string& prefix);
160
164 void ClearAllCards();
165
166 // ============================================================================
167 // Card Control (Programmatic, No GUI)
168 // ============================================================================
169
176 bool ShowCard(size_t session_id, const std::string& base_card_id);
177
181 bool HideCard(size_t session_id, const std::string& base_card_id);
182
186 bool ToggleCard(size_t session_id, const std::string& base_card_id);
187
191 bool IsCardVisible(size_t session_id, const std::string& base_card_id) const;
192
197 bool* GetVisibilityFlag(size_t session_id, const std::string& base_card_id);
198
199 // ============================================================================
200 // Batch Operations
201 // ============================================================================
202
206 void ShowAllCardsInSession(size_t session_id);
207
211 void HideAllCardsInSession(size_t session_id);
212
216 void ShowAllCardsInCategory(size_t session_id, const std::string& category);
217
221 void HideAllCardsInCategory(size_t session_id, const std::string& category);
222
226 void ShowOnlyCard(size_t session_id, const std::string& base_card_id);
227
228 // ============================================================================
229 // Query Methods
230 // ============================================================================
231
236 std::vector<std::string> GetCardsInSession(size_t session_id) const;
237
241 std::vector<CardInfo> GetCardsInCategory(size_t session_id, const std::string& category) const;
242
246 std::vector<std::string> GetAllCategories(size_t session_id) const;
247
253 const CardInfo* GetCardInfo(size_t session_id, const std::string& base_card_id) const;
254
258 std::vector<std::string> GetAllCategories() const;
259
260 // ============================================================================
261 // View Menu Integration
262 // ============================================================================
263
267 void DrawViewMenuSection(size_t session_id, const std::string& category);
268
272 void DrawViewMenuAll(size_t session_id);
273
274 // ============================================================================
275 // VSCode-Style Sidebar
276 // ============================================================================
277
281 void DrawSidebar(size_t session_id,
282 const std::string& category,
283 const std::vector<std::string>& active_categories = {},
284 std::function<void(const std::string&)> on_category_switch = nullptr,
285 std::function<void()> on_collapse = nullptr);
286
287 static constexpr float GetSidebarWidth() { return 48.0f; }
288
289 // ============================================================================
290 // Compact Controls for Menu Bar
291 // ============================================================================
292
296 void DrawCompactCardControl(size_t session_id, const std::string& category);
297
301 void DrawInlineCardToggles(size_t session_id, const std::string& category);
302
303 // ============================================================================
304 // Card Browser UI
305 // ============================================================================
306
310 void DrawCardBrowser(size_t session_id, bool* p_open);
311
312 // ============================================================================
313 // Workspace Presets
314 // ============================================================================
315
317 std::string name;
318 std::vector<std::string> visible_cards; // Card IDs
319 std::string description;
320 };
321
322 void SavePreset(const std::string& name, const std::string& description = "");
323 bool LoadPreset(const std::string& name);
324 void DeletePreset(const std::string& name);
325 std::vector<WorkspacePreset> GetPresets() const;
326
327 // ============================================================================
328 // Quick Actions
329 // ============================================================================
330
331 void ShowAll(size_t session_id);
332 void HideAll(size_t session_id);
333 void ResetToDefaults(size_t session_id);
334
335 // ============================================================================
336 // Statistics
337 // ============================================================================
338
339 size_t GetCardCount() const { return cards_.size(); }
340 size_t GetVisibleCardCount(size_t session_id) const;
341 size_t GetSessionCount() const { return session_count_; }
342
343 // ============================================================================
344 // Session Prefixing Utilities
345 // ============================================================================
346
357 std::string MakeCardId(size_t session_id, const std::string& base_id) const;
358
363 bool ShouldPrefixCards() const { return session_count_ > 1; }
364
365 // ============================================================================
366 // Convenience Methods (for EditorManager direct usage without session_id)
367 // ============================================================================
368
372 void RegisterCard(const CardInfo& base_info) {
373 RegisterCard(active_session_, base_info);
374 }
375
379 bool ShowCard(const std::string& base_card_id) {
380 return ShowCard(active_session_, base_card_id);
381 }
382
386 bool HideCard(const std::string& base_card_id) {
387 return HideCard(active_session_, base_card_id);
388 }
389
393 bool IsCardVisible(const std::string& base_card_id) const {
394 return IsCardVisible(active_session_, base_card_id);
395 }
396
400 void HideAllCardsInCategory(const std::string& category) {
402 }
403
407 void DrawCardBrowser(bool* p_open) {
409 }
410
414 std::string GetActiveCategory() const { return active_category_; }
415
419 void SetActiveCategory(const std::string& category) { active_category_ = category; }
420
424 void ShowAllCardsInCategory(const std::string& category) {
426 }
427
431 bool* GetVisibilityFlag(const std::string& base_card_id) {
432 return GetVisibilityFlag(active_session_, base_card_id);
433 }
434
438 void ShowAll() {
440 }
441
445 void HideAll() {
447 }
448
452 void DrawSidebar(const std::string& category,
453 const std::vector<std::string>& active_categories = {},
454 std::function<void(const std::string&)> on_category_switch = nullptr,
455 std::function<void()> on_collapse = nullptr) {
456 DrawSidebar(active_session_, category, active_categories, on_category_switch, on_collapse);
457 }
458
459 private:
460 // Core card storage (prefixed IDs → CardInfo)
461 std::unordered_map<std::string, CardInfo> cards_;
462
463 // Centralized visibility flags for cards without external flags
464 std::unordered_map<std::string, bool> centralized_visibility_;
465
466 // Session tracking
467 size_t session_count_ = 0;
468 size_t active_session_ = 0;
469
470 // Maps session_id → vector of prefixed card IDs registered for that session
471 std::unordered_map<size_t, std::vector<std::string>> session_cards_;
472
473 // Maps session_id → (base_card_id → prefixed_card_id)
474 std::unordered_map<size_t, std::unordered_map<std::string, std::string>> session_card_mapping_;
475
476 // Workspace presets
477 std::unordered_map<std::string, WorkspacePreset> presets_;
478
479 // Active category tracking
480 std::string active_category_;
481 std::vector<std::string> recent_categories_;
482 static constexpr size_t kMaxRecentCategories = 5;
483
484 // Helper methods
485 void UpdateSessionCount();
486 std::string GetPrefixedCardId(size_t session_id, const std::string& base_id) const;
487 void UnregisterSessionCards(size_t session_id);
488 void SavePresetsToFile();
489 void LoadPresetsFromFile();
490
491 // UI drawing helpers (internal)
492 void DrawCardMenuItem(const CardInfo& info);
493 void DrawCardInSidebar(const CardInfo& info, bool is_active);
494};
495
496} // namespace editor
497} // namespace yaze
498
499#endif // YAZE_APP_EDITOR_SYSTEM_EDITOR_CARD_REGISTRY_H_
500
Central registry for all editor cards with session awareness and dependency injection.
void ShowAllCardsInCategory(const std::string &category)
Show all cards in category for active session (convenience)
bool * GetVisibilityFlag(size_t session_id, const std::string &base_card_id)
Get visibility flag pointer for a card.
size_t GetVisibleCardCount(size_t session_id) const
EditorCardRegistry(EditorCardRegistry &&)=delete
void DrawCardMenuItem(const CardInfo &info)
void HideAllCardsInSession(size_t session_id)
Hide all cards in a specific session.
std::unordered_map< std::string, bool > centralized_visibility_
void DrawSidebar(size_t session_id, const std::string &category, const std::vector< std::string > &active_categories={}, std::function< void(const std::string &)> on_category_switch=nullptr, std::function< void()> on_collapse=nullptr)
Draw sidebar for a category with session filtering.
bool IsCardVisible(size_t session_id, const std::string &base_card_id) const
Check if a card is currently visible.
std::vector< std::string > GetCardsInSession(size_t session_id) const
Get all cards registered for a session.
const CardInfo * GetCardInfo(size_t session_id, const std::string &base_card_id) const
Get card metadata.
void UnregisterSession(size_t session_id)
Unregister a session and all its cards.
std::string MakeCardId(size_t session_id, const std::string &base_id) const
Generate session-aware card ID.
void DrawSidebar(const std::string &category, const std::vector< std::string > &active_categories={}, std::function< void(const std::string &)> on_category_switch=nullptr, std::function< void()> on_collapse=nullptr)
Draw sidebar for active session (convenience)
void DrawCardBrowser(bool *p_open)
Draw card browser for active session (convenience)
EditorCardRegistry & operator=(const EditorCardRegistry &)=delete
void SetActiveSession(size_t session_id)
Set the currently active session.
std::unordered_map< std::string, CardInfo > cards_
bool HideCard(size_t session_id, const std::string &base_card_id)
Hide a card programmatically.
void ShowAllCardsInCategory(size_t session_id, const std::string &category)
Show all cards in a category for a session.
void ShowAll()
Show all cards for active session (convenience)
void DrawViewMenuSection(size_t session_id, const std::string &category)
Draw view menu section for a category.
bool LoadPreset(const std::string &name)
void ClearAllCards()
Remove all registered cards (use with caution)
EditorCardRegistry & operator=(EditorCardRegistry &&)=delete
void ShowOnlyCard(size_t session_id, const std::string &base_card_id)
Show only one card, hiding all others in its category.
EditorCardRegistry(const EditorCardRegistry &)=delete
void RegisterCard(size_t session_id, const CardInfo &base_info)
Register a card for a specific session.
void ShowAllCardsInSession(size_t session_id)
Show all cards in a specific session.
bool HideCard(const std::string &base_card_id)
Hide card in active session (convenience)
std::unordered_map< size_t, std::vector< std::string > > session_cards_
bool ToggleCard(size_t session_id, const std::string &base_card_id)
Toggle a card's visibility.
void HideAllCardsInCategory(const std::string &category)
Hide all cards in category for active session (convenience)
bool ShouldPrefixCards() const
Check if card IDs should be prefixed.
std::vector< CardInfo > GetCardsInCategory(size_t session_id, const std::string &category) const
Get cards in a specific category for a session.
bool ShowCard(const std::string &base_card_id)
Show card in active session (convenience)
void DrawViewMenuAll(size_t session_id)
Draw all categories as view menu submenus.
void DrawInlineCardToggles(size_t session_id, const std::string &category)
Draw minimal inline card toggles.
void UnregisterCardsWithPrefix(const std::string &prefix)
Unregister all cards with a given prefix.
void UnregisterCard(size_t session_id, const std::string &base_card_id)
Unregister a specific card.
void SavePreset(const std::string &name, const std::string &description="")
void RegisterCard(const CardInfo &base_info)
Register card for active session (convenience)
void RegisterSession(size_t session_id)
Register a new session in the registry.
bool IsCardVisible(const std::string &base_card_id) const
Check if card is visible in active session (convenience)
void SetActiveCategory(const std::string &category)
Set active category (for sidebar)
void DeletePreset(const std::string &name)
bool * GetVisibilityFlag(const std::string &base_card_id)
Get visibility flag for active session (convenience)
std::string GetPrefixedCardId(size_t session_id, const std::string &base_id) const
void DrawCardBrowser(size_t session_id, bool *p_open)
Draw visual card browser/toggler.
static constexpr size_t kMaxRecentCategories
std::vector< std::string > GetAllCategories() const
Get all registered categories across all sessions.
std::vector< WorkspacePreset > GetPresets() const
std::vector< std::string > recent_categories_
void DrawCardInSidebar(const CardInfo &info, bool is_active)
void HideAll()
Hide all cards for active session (convenience)
void DrawCompactCardControl(size_t session_id, const std::string &category)
Draw compact card control for active editor's cards.
std::unordered_map< std::string, WorkspacePreset > presets_
std::unordered_map< size_t, std::unordered_map< std::string, std::string > > session_card_mapping_
void HideAllCardsInCategory(size_t session_id, const std::string &category)
Hide all cards in a category for a session.
bool ShowCard(size_t session_id, const std::string &base_card_id)
Show a card programmatically.
static constexpr float GetSidebarWidth()
std::string GetActiveCategory() const
Get active category (for sidebar)
void UnregisterSessionCards(size_t session_id)
Draggable, dockable card for editor sub-windows.
Main namespace for the application.
Definition controller.cc:20
Metadata for an editor card.
std::function< void()> on_hide
std::function< void()> on_show