yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
unified_layout.cc
Go to the documentation of this file.
2
3#include <ftxui/component/component.hpp>
4#include <ftxui/component/screen_interactive.hpp>
5#include <ftxui/dom/elements.hpp>
6#include <ftxui/screen/terminal.hpp>
7#include <numeric>
8#include <utility>
9
10#include "absl/strings/str_format.h"
12#include "cli/z3ed_ascii_logo.h"
13
14namespace yaze {
15namespace cli {
16
17using namespace ftxui;
18
20 : screen_(ScreenInteractive::TerminalOutput()), rom_context_(rom_context) {
21 // Initialize chat TUI
22 chat_tui_ = std::make_unique<tui::ChatTUI>(rom_context_);
23
24 // Set default configuration
26
27 // Initialize state
29 if (rom_context_) {
31 }
32
33 state_.active_workflows = {"ROM Audit", "Dungeon QA", "Palette Polish"};
34
36
37 status_provider_ = [this] {
38 auto rom_loaded = rom_context_ && rom_context_->is_loaded();
39 return vbox(
40 {text(rom_loaded ? "✅ Ready" : "⚠ Awaiting ROM") |
41 color(rom_loaded ? Color::GreenLight : Color::YellowLight),
42 text(absl::StrFormat("Focus: %s", state_.command_palette_hint.empty()
43 ? "Main Menu"
45 dim});
46 };
47
49 return std::vector<std::string>{
50 "agent::chat — conversational ROM inspector",
51 "rom::info — metadata & validation", "dungeon::list — dungeon manifest",
52 "gfx::export — sprite/palette dump", "project::build — apply patches"};
53 };
54
55 todo_provider_ = [] {
56 return std::vector<std::string>{
57 "[pending] Implement dungeon diff visualizer",
58 "[pending] Integrate context panes",
59 "[todo] Hook TODO manager into project manifests"};
60 };
61
62 // Create components
74
75 // Create layout
77
78 // Set up event handlers
79 global_event_handler_ = [this](const Event& event) {
80 return HandleGlobalEvents(event);
81 };
82
83 panel_event_handler_ = [this](const Event& event) {
84 return HandlePanelEvents(event);
85 };
86}
87
89 // Wrap the layout with event handling
90 auto event_handler = CatchEvent(unified_layout_, global_event_handler_);
91
92 screen_.Loop(event_handler);
93}
94
96 rom_context_ = rom_context;
97 if (chat_tui_) {
98 chat_tui_->SetRomContext(rom_context_);
99 }
100
101 if (rom_context_) {
103 } else {
104 state_.current_rom_file.clear();
105 }
106}
107
110 screen_.PostEvent(Event::Custom); // Force screen refresh
111}
112
115 screen_.PostEvent(Event::Custom); // Force screen refresh
116}
117
120 screen_.PostEvent(Event::Custom); // Force screen refresh
121}
122
125 screen_.PostEvent(Event::Custom); // Force screen refresh
126}
127
132 todo_overlay_component_ = Renderer([this] {
133 Elements rows;
134 if (todo_provider_) {
135 auto items = todo_provider_();
136 if (items.empty()) {
137 rows.push_back(text("No TODOs available") | dim | center);
138 } else {
139 for (const auto& line : items) {
140 rows.push_back(text(line));
141 }
142 }
143 }
144 return dbox(
145 {window(text("📝 TODO Overlay") | bold,
146 vbox({separatorLight(),
147 vbox(rows) | frame | size(HEIGHT, LESS_THAN, 15) |
148 size(WIDTH, LESS_THAN, 80),
149 separatorLight(),
150 text("Ctrl+T to close • Enter to jump via command "
151 "palette") |
152 dim | center})) |
153 center});
154 });
155 }
156 screen_.PostEvent(Event::Custom);
157 } else {
158 screen_.PostEvent(Event::Custom);
159 }
160}
161
163 config_ = config;
164}
165
166void UnifiedLayout::SetStatusProvider(std::function<Element()> provider) {
167 status_provider_ = std::move(provider);
168}
169
171 std::function<std::vector<std::string>()> provider) {
172 command_summary_provider_ = std::move(provider);
173}
174
176 std::function<std::vector<std::string>()> provider) {
177 todo_provider_ = std::move(provider);
178}
179
181 auto terminal = Terminal::Size();
182 if (terminal.dimx < 120) {
185 }
186}
187
189 struct MenuState {
190 int selected = 0;
191 std::vector<std::string> items = {
192 "🔍 Hex Viewer", "🎨 Palette Editor", "📝 TODO Manager", "🔧 ROM Tools",
193 "🎮 Graphics Tools", "⚙️ Settings", "❓ Help", "🚪 Exit"};
194 };
195
196 auto state = std::make_shared<MenuState>();
197
198 MenuOption option;
199 option.focused_entry = &state->selected;
200 option.on_enter = [this, state] {
201 switch (state->selected) {
202 case 0:
204 break;
205 case 1:
207 break;
208 case 2:
210 break;
211 case 3:
213 break;
214 case 4:
216 break;
217 case 5:
219 break;
220 case 6:
222 break;
223 case 7:
224 screen_.Exit();
225 break;
226 }
227 };
228
229 auto menu = Menu(&state->items, &state->selected, option);
230
231 return Renderer(menu, [this, menu, state] {
232 auto banner = RenderAnimatedBanner();
233 return vbox({banner, separator(), menu->Render(), separator(),
234 RenderCommandHints(), separator(), RenderWorkflowLane(),
235 separator(),
236 text("↑/↓: Navigate | Enter: Select | q: Quit") | dim |
237 center}) |
238 borderRounded | bgcolor(Color::Black);
239 });
240}
241
243 // Use the full-featured ChatTUI if available
244 if (chat_tui_) {
245 return Renderer([this] {
246 std::vector<Element> cards;
247 cards.push_back(vbox({text("🤖 Overview") | bold,
248 text("AI assistant for ROM editing"),
249 text("Press 'f' for fullscreen chat") | dim}) |
250 borderRounded);
251
252 if (rom_context_) {
253 cards.push_back(
254 vbox(
255 {text("📦 ROM Context") | bold, text(rom_context_->title()),
256 text(absl::StrFormat("Size: %d bytes", rom_context_->size())) |
257 dim}) |
258 borderRounded | color(Color::GreenLight));
259 } else {
260 cards.push_back(vbox({text("⚠ No ROM loaded") | color(Color::Yellow),
261 text("Use Load ROM from main menu") | dim}) |
262 borderRounded);
263 }
264
265 cards.push_back(vbox({text("🛠 Integrations") | bold,
266 text("• TODO manager status") | dim,
267 text("• Command palette shortcuts") | dim,
268 text("• Tool dispatcher metrics") | dim}) |
269 borderRounded);
270
271 return vbox({RenderPanelHeader(PanelType::kChat), separator(),
272 RenderResponsiveGrid(cards), separator(),
273 text("Shortcuts: f fullscreen | c toggle chat | /help "
274 "commands") |
275 dim | center}) |
276 borderRounded | bgcolor(Color::Black);
277 });
278 }
279
280 // Fallback simple chat interface
281 auto input_message = std::make_shared<std::string>();
282 auto input_component = Input(input_message.get(), "Type your message...");
283
284 auto send_button = Button("Send", [this, input_message] {
285 if (input_message->empty())
286 return;
287
288 // Handle chat commands
289 if (*input_message == "/exit") {
290 screen_.Exit();
291 return;
292 }
293
294 input_message->clear();
295 });
296
297 // Handle Enter key
298 input_component =
299 CatchEvent(input_component, [this, input_message](const Event& event) {
300 if (event == Event::Return) {
301 if (input_message->empty())
302 return true;
303
304 if (*input_message == "/exit") {
305 screen_.Exit();
306 return true;
307 }
308
309 input_message->clear();
310 return true;
311 }
312 return false;
313 });
314
315 auto container = Container::Vertical({input_component, send_button});
316
317 return Renderer(container, [this, container, input_component, send_button] {
318 return vbox({text("🤖 AI Chat") | bold | center, separator(),
319 text("Chat functionality integrated into unified layout") |
320 center | dim,
321 separator(),
322 hbox({text("You: ") | bold, input_component->Render() | flex,
323 text(" "), send_button->Render()}),
324 separator(),
325 text("Commands: /exit, /clear, /help") | dim | center});
326 });
327}
328
330 return Renderer([this] {
331 Element rom_info =
332 rom_context_ ? text(absl::StrFormat("ROM: %s", rom_context_->title())) |
333 color(Color::GreenLight)
334 : text("ROM: none") | color(Color::RedLight);
335
336 Element provider_status = status_provider_
338 : text("Ready") | color(Color::GrayLight);
339 auto command_tiles = RenderCommandHints();
340 auto todo_tiles = RenderTodoStack();
341
342 std::vector<Element> sections = {
343 RenderAnimatedBanner(), separatorLight(), rom_info,
344 separatorLight(), provider_status, separatorLight(),
345 command_tiles, separatorLight(), todo_tiles};
346
347 if (!state_.current_error.empty()) {
348 sections.push_back(separatorLight());
349 sections.push_back(text(state_.current_error) | color(Color::Red) | bold);
350 }
351
352 return vbox(sections) | borderRounded | bgcolor(Color::Black);
353 });
354}
355
357 struct ToolsState {
358 int selected = 0;
359 std::vector<std::string> items = {
360 "🔧 ROM Tools (press t)", "🎨 Graphics Tools (ref gfx::export)",
361 "📝 TODO Manager (ref todo::list)", "⚙️ Settings", "❓ Help"};
362 };
363
364 auto state = std::make_shared<ToolsState>();
365 MenuOption option;
366 option.on_change = [this, state] {
367 if (!state->items.empty()) {
368 state_.command_palette_hint = state->items[state->selected];
369 }
370 };
371 auto menu = Menu(&state->items, &state->selected, option);
372
373 return Renderer(menu, [this, menu, state] {
374 return vbox({RenderPanelHeader(PanelType::kTools), separator(),
375 menu->Render(), separator(),
376 text("Select a tool category") | dim | center, separator(),
377 RenderCommandHints(), separator(), RenderWorkflowLane()}) |
378 borderRounded | bgcolor(Color::Black);
379 });
380}
381
383 auto offset = std::make_shared<int>(0);
384 const int lines_to_show = 20;
385
386 return Renderer([this, offset, lines_to_show] {
387 if (!rom_context_) {
388 return vbox({text("🔍 Hex Viewer") | bold | center, separator(),
389 text("No ROM loaded") | center | color(Color::Red),
390 separator(),
391 text("Load a ROM to view hex data") | center | dim}) |
392 border;
393 }
394
395 std::vector<Element> rows;
396 for (int i = 0; i < lines_to_show; ++i) {
397 int current_offset = *offset + (i * 16);
398 if (current_offset >= static_cast<int>(rom_context_->size())) {
399 break;
400 }
401
402 Elements row;
403 row.push_back(text(absl::StrFormat("0x%08X: ", current_offset)) |
404 color(Color::Yellow));
405
406 for (int j = 0; j < 16; ++j) {
407 if (current_offset + j < static_cast<int>(rom_context_->size())) {
408 row.push_back(text(absl::StrFormat(
409 "%02X ", rom_context_->vector()[current_offset + j])));
410 } else {
411 row.push_back(text(" "));
412 }
413 }
414
415 row.push_back(separator());
416
417 for (int j = 0; j < 16; ++j) {
418 if (current_offset + j < static_cast<int>(rom_context_->size())) {
419 char c = rom_context_->vector()[current_offset + j];
420 row.push_back(text(std::isprint(c) ? std::string(1, c) : "."));
421 } else {
422 row.push_back(text(" "));
423 }
424 }
425
426 rows.push_back(hbox(row));
427 }
428
429 auto workflow = RenderWorkflowLane();
430
431 return vbox({text("🔍 Hex Viewer") | bold | center, separator(), workflow,
432 separator(), vbox(rows) | frame | flex, separator(),
433 text(absl::StrFormat("Offset: 0x%08X", *offset)) |
434 color(Color::Cyan),
435 separator(), text("↑/↓: Scroll | q: Back") | dim | center}) |
436 borderRounded | bgcolor(Color::Black);
437 });
438}
439
441 return Renderer([this] {
442 return vbox({RenderPanelHeader(PanelType::kPaletteEditor), separator(),
444 {vbox({text("🌈 Overview") | bold,
445 text("Preview palette indices and colors"),
446 text("Highlight sprite-specific palettes") | dim}) |
447 borderRounded | bgcolor(Color::Black),
448 vbox({text("🧪 Roadmap") | bold,
449 text("• Live recolor with undo stack"),
450 text("• Sprite preview viewport"),
451 text("• Export to .pal/.act")}) |
452 borderRounded | bgcolor(Color::Black),
453 vbox({text("🗒 TODO") | bold,
454 text("Link to command palette"),
455 text("Use animation timeline"),
456 text("Add palette history panel") | dim}) |
457 borderRounded | bgcolor(Color::Black)}),
458 separator(), RenderWorkflowLane(), separator(),
459 text("Press 'q' to go back") | dim | center}) |
460 borderRounded;
461 });
462}
463
465 return Renderer([this] {
466 std::vector<Element> todo_cards;
467 if (todo_provider_) {
468 for (const auto& item : todo_provider_()) {
469 todo_cards.push_back(text("• " + item));
470 }
471 }
472 if (todo_cards.empty()) {
473 todo_cards.push_back(text("No TODOs yet") | dim);
474 }
475
476 return vbox(
478 vbox(todo_cards) | borderRounded | bgcolor(Color::Black),
479 separator(),
480 text(
481 "Press Ctrl+T anywhere to toggle the popup todo overlay.") |
482 dim,
483 separator(), RenderWorkflowLane(), separator(),
484 text("Press 'q' to go back") | dim | center}) |
485 borderRounded;
486 });
487}
488
490 struct ToolsState {
491 int selected = 0;
492 std::vector<std::string> items = {
493 "Apply Asar Patch — todo#123", "Apply BPS Patch — todo#124",
494 "Extract Symbols — todo#098", "Validate Assembly — todo#087",
495 "Generate Save File — todo#142", "Back"};
496 };
497
498 auto state = std::make_shared<ToolsState>();
499 auto menu = Menu(&state->items, &state->selected);
500
501 return Renderer(menu, [this, menu, state] {
502 return vbox({text("🔧 ROM Tools") | bold | center, separator(),
503 menu->Render(), separator(),
504 text("Select a ROM tool") | dim | center}) |
505 border;
506 });
507}
508
510 struct ToolsState {
511 int selected = 0;
512 std::vector<std::string> items = {"Palette Editor — ref gfx::export",
513 "Hex Viewer — ref rom::hex", "Back"};
514 };
515
516 auto state = std::make_shared<ToolsState>();
517 auto menu = Menu(&state->items, &state->selected);
518
519 return Renderer(menu, [this, menu, state] {
520 return vbox({text("🎨 Graphics Tools") | bold | center, separator(),
521 menu->Render(), separator(),
522 text("Select a graphics tool") | dim | center}) |
523 border;
524 });
525}
526
528 struct SettingsState {
529 int left_width_slider;
530 int right_width_slider;
531 int bottom_height_slider;
532 };
533
534 auto state = std::make_shared<SettingsState>();
535 state->left_width_slider = config_.left_panel_width;
536 state->right_width_slider = config_.right_panel_width;
537 state->bottom_height_slider = config_.bottom_panel_height;
538
539 auto left_width_control =
540 Slider("Left Panel Width: ", &state->left_width_slider, 20, 60, 1);
541 auto right_width_control =
542 Slider("Right Panel Width: ", &state->right_width_slider, 30, 60, 1);
543 auto bottom_height_control =
544 Slider("Bottom Panel Height: ", &state->bottom_height_slider, 10, 30, 1);
545
546 auto apply_button = Button("Apply Changes", [this, state] {
547 config_.left_panel_width = state->left_width_slider;
548 config_.right_panel_width = state->right_width_slider;
549 config_.bottom_panel_height = state->bottom_height_slider;
550 screen_.PostEvent(Event::Custom);
551 });
552
553 auto reset_button = Button("Reset to Defaults", [this, state] {
554 state->left_width_slider = 30;
555 state->right_width_slider = 40;
556 state->bottom_height_slider = 15;
560 screen_.PostEvent(Event::Custom);
561 });
562
563 auto controls = Container::Vertical(
564 {left_width_control, right_width_control, bottom_height_control,
565 Container::Horizontal({apply_button, reset_button})});
566
567 return Renderer(controls, [this, controls, state, left_width_control,
568 right_width_control, bottom_height_control,
569 apply_button, reset_button] {
570 return vbox(
571 {RenderPanelHeader(PanelType::kSettings) | color(Color::Cyan),
572 separator(),
573 text("Customize the TUI layout") | center | dim,
574 separator(),
575 hbox({text("Left Panel Width: ") | bold,
576 text(absl::StrFormat("%d", state->left_width_slider))}),
577 left_width_control->Render(),
578 separator(),
579 hbox({text("Right Panel Width: ") | bold,
580 text(absl::StrFormat("%d", state->right_width_slider))}),
581 right_width_control->Render(),
582 separator(),
583 hbox({text("Bottom Panel Height: ") | bold,
584 text(absl::StrFormat("%d", state->bottom_height_slider))}),
585 bottom_height_control->Render(),
586 separator(),
587 hbox({apply_button->Render(), text(" "), reset_button->Render()}) |
588 center,
589 separator(),
590 text("Panel Visibility:") | bold,
591 hbox({text("Chat: ") | bold,
592 text(config_.show_chat ? "ON ✓" : "OFF ✗") |
593 color(config_.show_chat ? Color::Green : Color::Red),
594 text(" "), text("Status: ") | bold,
595 text(config_.show_status ? "ON ✓" : "OFF ✗") |
596 color(config_.show_status ? Color::Green : Color::Red)}) |
597 center,
598 separator(),
599 text("Keyboard Shortcuts:") | bold,
600 text(" c - Toggle chat panel") | dim,
601 text(" s - Toggle status panel") | dim,
602 text(" Esc/b - Back to menu") | dim,
603 separator(),
604 text("Changes apply immediately") | center | dim});
605 });
606}
607
609 return Renderer([this] {
610 return vbox(
611 {RenderPanelHeader(PanelType::kHelp) | color(Color::Cyan),
612 separator(),
613 text("Unified TUI Layout - ROM Editor & AI Agent") | center | dim,
614 separator(),
615 text("Global Shortcuts:") | bold | color(Color::Yellow),
616 text(" q - Quit application"),
617 text(" h - Show this help"),
618 text(" m - Main menu"),
619 text(" Esc/b - Back to previous panel"),
620 separator(),
621 text("Panel Controls:") | bold | color(Color::Yellow),
622 text(" c - Toggle chat panel"),
623 text(" s - Toggle status panel"),
624 text(" f - Open full chat interface"),
625 text(" t - ROM tools"),
626 separator(),
627 text("Navigation:") | bold | color(Color::Yellow),
628 text(" ↑/↓ - Navigate menus"),
629 text(" Enter - Select item"),
630 text(" Tab - Switch focus"),
631 separator(),
632 text("Chat Commands:") | bold | color(Color::Yellow),
633 text(" /exit - Exit chat"),
634 text(" /clear - Clear history"),
635 text(" /help - Show chat help"),
636 separator(),
637 text("Available Tools:") | bold | color(Color::Green),
638 text(" • Hex Viewer - Inspect ROM data"),
639 text(" • Palette Editor - Edit color palettes"),
640 text(" • TODO Manager - Track tasks"),
641 text(" • AI Chat - Natural language ROM queries"),
642 text(" • Dungeon Tools - Room inspection & editing"),
643 text(" • Graphics Tools - Sprite & tile editing"),
644 separator(),
645 text("Press 'Esc' or 'b' to go back") | dim | center});
646 });
647}
648
650 // Create a container that holds all panels
651 auto all_panels = Container::Tab(
655 nullptr);
656
657 // Create a renderer that dynamically shows the right panels based on state
658 return Renderer(all_panels, [this, all_panels] {
659 // Dynamically select left panel based on current state
660 Component left_panel;
661 switch (state_.active_main_panel) {
662 case PanelType::kMainMenu:
663 left_panel = main_menu_panel_;
664 break;
665 case PanelType::kHexViewer:
666 left_panel = hex_viewer_panel_;
667 break;
668 case PanelType::kPaletteEditor:
669 left_panel = palette_editor_panel_;
670 break;
671 case PanelType::kTodoManager:
672 left_panel = todo_manager_panel_;
673 break;
674 case PanelType::kRomTools:
675 left_panel = rom_tools_panel_;
676 break;
677 case PanelType::kGraphicsTools:
678 left_panel = graphics_tools_panel_;
679 break;
680 case PanelType::kSettings:
681 left_panel = settings_panel_;
682 break;
683 case PanelType::kHelp:
684 left_panel = help_panel_;
685 break;
686 default:
687 left_panel = main_menu_panel_;
688 break;
689 }
690
691 // Dynamically select right panel
692 Component right_panel;
693 if (config_.show_status) {
694 right_panel = status_panel_;
695 } else {
696 right_panel = tools_panel_;
697 }
698
699 // Create horizontal layout
700 auto top_section =
701 hbox({left_panel->Render() | flex, separatorLight(),
702 right_panel->Render() |
703 size(WIDTH, LESS_THAN, config_.right_panel_width)});
704
705 // Add chat panel if enabled
706 if (config_.show_chat) {
707 Element stacked =
708 vbox({top_section | flex, separatorLight(),
709 chat_panel_->Render() |
710 size(HEIGHT, EQUAL, config_.bottom_panel_height)}) |
711 bgcolor(Color::Black);
712
714 stacked = dbox({stacked, todo_overlay_component_->Render()});
715 }
716 return stacked;
717 }
718
719 Element content = top_section | bgcolor(Color::Black);
721 content = dbox({content, todo_overlay_component_->Render()});
722 }
723 return content;
724 });
725}
726
728 // Back to main menu
729 if (event == Event::Escape || event == Event::Character('b')) {
732 return true;
733 }
734 }
735
736 // Global shortcuts
737 if (event == Event::Special({20})) { // Ctrl+T
739 return true;
740 }
741
742 if (event == Event::Character('q') ||
743 (event == Event::Character('q') &&
745 screen_.Exit();
746 return true;
747 }
748
749 if (event == Event::Character('h')) {
751 return true;
752 }
753
754 if (event == Event::Character('c')) {
755 ToggleChat();
756 return true;
757 }
758
759 if (event == Event::Character('s')) {
760 ToggleStatus();
761 return true;
762 }
763
764 if (event == Event::Character('t')) {
766 return true;
767 }
768
769 if (event == Event::Character('m')) {
771 return true;
772 }
773
774 if (event == Event::Character('f')) {
775 // Launch full chat interface
776 if (chat_tui_) {
777 screen_.ExitLoopClosure()(); // Exit current loop
778 chat_tui_->Run(); // Run full chat
779 screen_.PostEvent(Event::Custom); // Refresh when we return
780 }
781 return true;
782 }
783
784 return false;
785}
786
787bool UnifiedLayout::HandlePanelEvents(const Event& /* event */) {
788 // Panel-specific event handling
789 return false;
790}
791
793 std::string title;
794 switch (panel) {
796 title = "🎮 Main Menu";
797 break;
798 case PanelType::kChat:
799 title = "🤖 AI Chat";
800 break;
802 title = "📊 Status";
803 break;
805 title = "🛠️ Tools";
806 break;
808 title = "🔍 Hex Viewer";
809 break;
811 title = "🎨 Palette Editor";
812 break;
814 title = "📝 TODO Manager";
815 break;
817 title = "🔧 ROM Tools";
818 break;
820 title = "🎨 Graphics Tools";
821 break;
823 title = "⚙️ Settings";
824 break;
825 case PanelType::kHelp:
826 title = "❓ Help";
827 break;
828 }
829
830 return text(title) | bold | center;
831}
832
834 return hbox(
835 {text(absl::StrFormat("Panel: %s",
837 ? "Main"
838 : "Other")) |
839 color(Color::Cyan),
840 filler(),
841 text(absl::StrFormat("ROM: %s", state_.current_rom_file.empty()
842 ? "None"
844 color(Color::Green),
845 filler(),
846 text("Shortcuts: Ctrl+T TODO Overlay | f Full Chat | m Main Menu") |
847 dim});
848}
849
851 return text("🎮 Z3ED CLI") | bold | center;
852}
853
855 return text("Workflow: Active") | color(Color::Green);
856}
857
859 return vbox({text("Command Hints:") | bold,
860 text(" Ctrl+T - Toggle TODO overlay"),
861 text(" f - Full chat mode"), text(" m - Main menu")});
862}
863
865 return text("TODO Stack: Empty") | dim;
866}
867
868Element UnifiedLayout::RenderResponsiveGrid(const std::vector<Element>& tiles) {
869 if (tiles.empty()) {
870 return text("No items") | center | dim;
871 }
872 return vbox(tiles);
873}
874
875} // namespace cli
876} // namespace yaze
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:24
const auto & vector() const
Definition rom.h:139
auto size() const
Definition rom.h:134
bool is_loaded() const
Definition rom.h:128
auto title() const
Definition rom.h:133
ftxui::Component unified_layout_
ftxui::Element RenderTodoStack()
ftxui::Component CreateToolsPanel()
ftxui::Component CreatePaletteEditorPanel()
ftxui::Component graphics_tools_panel_
void SwitchToolPanel(PanelType panel)
ftxui::Component CreateHelpPanel()
void SetStatusProvider(std::function< ftxui::Element()> provider)
ftxui::Component settings_panel_
void SetLayoutConfig(const LayoutConfig &config)
std::function< bool(const ftxui::Event &) panel_event_handler_)
ftxui::Element RenderCommandHints()
UnifiedLayout(Rom *rom_context=nullptr)
std::function< ftxui::Element()> status_provider_
ftxui::Component rom_tools_panel_
ftxui::Component CreateRomToolsPanel()
ftxui::Element RenderStatusBar()
ftxui::Component hex_viewer_panel_
ftxui::Component CreateChatPanel()
ftxui::ScreenInteractive screen_
bool HandleGlobalEvents(const ftxui::Event &event)
std::unique_ptr< tui::ChatTUI > chat_tui_
ftxui::Element RenderPanelHeader(PanelType panel)
ftxui::Element RenderResponsiveGrid(const std::vector< ftxui::Element > &tiles)
void SwitchMainPanel(PanelType panel)
ftxui::Component status_panel_
ftxui::Component palette_editor_panel_
ftxui::Component chat_panel_
ftxui::Component help_panel_
ftxui::Component main_menu_panel_
void SetTodoProvider(std::function< std::vector< std::string >()> provider)
void SetRomContext(Rom *rom_context)
ftxui::Component CreateHexViewerPanel()
std::function< std::vector< std::string >()> todo_provider_
ftxui::Component CreateSettingsPanel()
ftxui::Component todo_manager_panel_
ftxui::Component todo_overlay_component_
ftxui::Element RenderWorkflowLane()
ftxui::Component CreateStatusPanel()
ftxui::Component tools_panel_
void SetCommandSummaryProvider(std::function< std::vector< std::string >()> provider)
bool HandlePanelEvents(const ftxui::Event &event)
ftxui::Component CreateUnifiedLayout()
ftxui::Component CreateGraphicsToolsPanel()
ftxui::Component CreateTodoManagerPanel()
ftxui::Component CreateMainMenuPanel()
ftxui::Element RenderAnimatedBanner()
std::function< std::vector< std::string >()> command_summary_provider_
std::function< bool(const ftxui::Event &) global_event_handler_)
Definition cli.h:17
std::vector< std::string > active_workflows
std::string current_rom_file
std::string command_palette_hint