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 = {"🔍 Hex Viewer", "🎨 Palette Editor",
192 "📝 TODO Manager", "🔧 ROM Tools",
193 "🎮 Graphics Tools", "⚙️ Settings",
194 "❓ Help", "🚪 Exit"};
195 };
196
197 auto state = std::make_shared<MenuState>();
198
199 MenuOption option;
200 option.focused_entry = &state->selected;
201 option.on_enter = [this, state] {
202 switch (state->selected) {
203 case 0:
205 break;
206 case 1:
208 break;
209 case 2:
211 break;
212 case 3:
214 break;
215 case 4:
217 break;
218 case 5:
220 break;
221 case 6:
223 break;
224 case 7:
225 screen_.Exit();
226 break;
227 }
228 };
229
230 auto menu = Menu(&state->items, &state->selected, option);
231
232 return Renderer(menu, [this, menu, state] {
233 auto banner = RenderAnimatedBanner();
234 return vbox({banner, separator(), menu->Render(), separator(),
235 RenderCommandHints(), separator(), RenderWorkflowLane(),
236 separator(),
237 text("↑/↓: Navigate | Enter: Select | q: Quit") | dim |
238 center}) |
239 borderRounded | bgcolor(Color::Black);
240 });
241}
242
244 // Use the full-featured ChatTUI if available
245 if (chat_tui_) {
246 return Renderer([this] {
247 std::vector<Element> cards;
248 cards.push_back(vbox({text("🤖 Overview") | bold,
249 text("AI assistant for ROM editing"),
250 text("Press 'f' for fullscreen chat") | dim}) |
251 borderRounded);
252
253 if (rom_context_) {
254 cards.push_back(
255 vbox(
256 {text("📦 ROM Context") | bold, text(rom_context_->title()),
257 text(absl::StrFormat("Size: %d bytes", rom_context_->size())) |
258 dim}) |
259 borderRounded | color(Color::GreenLight));
260 } else {
261 cards.push_back(vbox({text("⚠ No ROM loaded") | color(Color::Yellow),
262 text("Use Load ROM from main menu") | dim}) |
263 borderRounded);
264 }
265
266 cards.push_back(vbox({text("🛠 Integrations") | bold,
267 text("• TODO manager status") | dim,
268 text("• Command palette shortcuts") | dim,
269 text("• Tool dispatcher metrics") | dim}) |
270 borderRounded);
271
272 return vbox({RenderPanelHeader(PanelType::kChat), separator(),
273 RenderResponsiveGrid(cards), separator(),
274 text("Shortcuts: f fullscreen | c toggle chat | /help "
275 "commands") |
276 dim | center}) |
277 borderRounded | bgcolor(Color::Black);
278 });
279 }
280
281 // Fallback simple chat interface
282 auto input_message = std::make_shared<std::string>();
283 auto input_component = Input(input_message.get(), "Type your message...");
284
285 auto send_button = Button("Send", [this, input_message] {
286 if (input_message->empty())
287 return;
288
289 // Handle chat commands
290 if (*input_message == "/exit") {
291 screen_.Exit();
292 return;
293 }
294
295 input_message->clear();
296 });
297
298 // Handle Enter key
299 input_component =
300 CatchEvent(input_component, [this, input_message](const Event& event) {
301 if (event == Event::Return) {
302 if (input_message->empty())
303 return true;
304
305 if (*input_message == "/exit") {
306 screen_.Exit();
307 return true;
308 }
309
310 input_message->clear();
311 return true;
312 }
313 return false;
314 });
315
316 auto container = Container::Vertical({input_component, send_button});
317
318 return Renderer(container, [this, container, input_component, send_button] {
319 return vbox({text("🤖 AI Chat") | bold | center, separator(),
320 text("Chat functionality integrated into unified layout") |
321 center | dim,
322 separator(),
323 hbox({text("You: ") | bold, input_component->Render() | flex,
324 text(" "), send_button->Render()}),
325 separator(),
326 text("Commands: /exit, /clear, /help") | dim | center});
327 });
328}
329
331 return Renderer([this] {
332 Element rom_info =
333 rom_context_ ? text(absl::StrFormat("ROM: %s", rom_context_->title())) |
334 color(Color::GreenLight)
335 : text("ROM: none") | color(Color::RedLight);
336
337 Element provider_status = status_provider_
339 : text("Ready") | color(Color::GrayLight);
340 auto command_tiles = RenderCommandHints();
341 auto todo_tiles = RenderTodoStack();
342
343 std::vector<Element> sections = {
344 RenderAnimatedBanner(), separatorLight(), rom_info,
345 separatorLight(), provider_status, separatorLight(),
346 command_tiles, separatorLight(), todo_tiles};
347
348 if (!state_.current_error.empty()) {
349 sections.push_back(separatorLight());
350 sections.push_back(text(state_.current_error) | color(Color::Red) | bold);
351 }
352
353 return vbox(sections) | borderRounded | bgcolor(Color::Black);
354 });
355}
356
358 struct ToolsState {
359 int selected = 0;
360 std::vector<std::string> items = {
361 "🔧 ROM Tools (press t)", "🎨 Graphics Tools (ref gfx::export)",
362 "📝 TODO Manager (ref todo::list)", "⚙️ Settings", "❓ Help"};
363 };
364
365 auto state = std::make_shared<ToolsState>();
366 MenuOption option;
367 option.on_change = [this, state] {
368 if (!state->items.empty()) {
369 state_.command_palette_hint = state->items[state->selected];
370 }
371 };
372 auto menu = Menu(&state->items, &state->selected, option);
373
374 return Renderer(menu, [this, menu, state] {
375 return vbox({RenderPanelHeader(PanelType::kTools), separator(),
376 menu->Render(), separator(),
377 text("Select a tool category") | dim | center, separator(),
378 RenderCommandHints(), separator(), RenderWorkflowLane()}) |
379 borderRounded | bgcolor(Color::Black);
380 });
381}
382
384 auto offset = std::make_shared<int>(0);
385 const int lines_to_show = 20;
386
387 return Renderer([this, offset, lines_to_show] {
388 if (!rom_context_) {
389 return vbox({text("🔍 Hex Viewer") | bold | center, separator(),
390 text("No ROM loaded") | center | color(Color::Red),
391 separator(),
392 text("Load a ROM to view hex data") | center | dim}) |
393 border;
394 }
395
396 std::vector<Element> rows;
397 for (int i = 0; i < lines_to_show; ++i) {
398 int current_offset = *offset + (i * 16);
399 if (current_offset >= static_cast<int>(rom_context_->size())) {
400 break;
401 }
402
403 Elements row;
404 row.push_back(text(absl::StrFormat("0x%08X: ", current_offset)) |
405 color(Color::Yellow));
406
407 for (int j = 0; j < 16; ++j) {
408 if (current_offset + j < static_cast<int>(rom_context_->size())) {
409 row.push_back(text(absl::StrFormat(
410 "%02X ", rom_context_->vector()[current_offset + j])));
411 } else {
412 row.push_back(text(" "));
413 }
414 }
415
416 row.push_back(separator());
417
418 for (int j = 0; j < 16; ++j) {
419 if (current_offset + j < static_cast<int>(rom_context_->size())) {
420 char c = rom_context_->vector()[current_offset + j];
421 row.push_back(text(std::isprint(c) ? std::string(1, c) : "."));
422 } else {
423 row.push_back(text(" "));
424 }
425 }
426
427 rows.push_back(hbox(row));
428 }
429
430 auto workflow = RenderWorkflowLane();
431
432 return vbox({text("🔍 Hex Viewer") | bold | center, separator(), workflow,
433 separator(), vbox(rows) | frame | flex, separator(),
434 text(absl::StrFormat("Offset: 0x%08X", *offset)) |
435 color(Color::Cyan),
436 separator(), text("↑/↓: Scroll | q: Back") | dim | center}) |
437 borderRounded | bgcolor(Color::Black);
438 });
439}
440
442 return Renderer([this] {
443 return vbox({RenderPanelHeader(PanelType::kPaletteEditor), separator(),
445 {vbox({text("🌈 Overview") | bold,
446 text("Preview palette indices and colors"),
447 text("Highlight sprite-specific palettes") | dim}) |
448 borderRounded | bgcolor(Color::Black),
449 vbox({text("🧪 Roadmap") | bold,
450 text("• Live recolor with undo stack"),
451 text("• Sprite preview viewport"),
452 text("• Export to .pal/.act")}) |
453 borderRounded | bgcolor(Color::Black),
454 vbox({text("🗒 TODO") | bold,
455 text("Link to command palette"),
456 text("Use animation timeline"),
457 text("Add palette history panel") | dim}) |
458 borderRounded | bgcolor(Color::Black)}),
459 separator(), RenderWorkflowLane(), separator(),
460 text("Press 'q' to go back") | dim | center}) |
461 borderRounded;
462 });
463}
464
466 return Renderer([this] {
467 std::vector<Element> todo_cards;
468 if (todo_provider_) {
469 for (const auto& item : todo_provider_()) {
470 todo_cards.push_back(text("• " + item));
471 }
472 }
473 if (todo_cards.empty()) {
474 todo_cards.push_back(text("No TODOs yet") | dim);
475 }
476
477 return vbox(
479 vbox(todo_cards) | borderRounded | bgcolor(Color::Black),
480 separator(),
481 text(
482 "Press Ctrl+T anywhere to toggle the popup todo overlay.") |
483 dim,
484 separator(), RenderWorkflowLane(), separator(),
485 text("Press 'q' to go back") | dim | center}) |
486 borderRounded;
487 });
488}
489
491 struct ToolsState {
492 int selected = 0;
493 std::vector<std::string> items = {
494 "Apply Asar Patch — todo#123", "Apply BPS Patch — todo#124",
495 "Extract Symbols — todo#098", "Validate Assembly — todo#087",
496 "Generate Save File — todo#142", "Back"};
497 };
498
499 auto state = std::make_shared<ToolsState>();
500 auto menu = Menu(&state->items, &state->selected);
501
502 return Renderer(menu, [this, menu, state] {
503 return vbox({text("🔧 ROM Tools") | bold | center, separator(),
504 menu->Render(), separator(),
505 text("Select a ROM tool") | dim | center}) |
506 border;
507 });
508}
509
511 struct ToolsState {
512 int selected = 0;
513 std::vector<std::string> items = {"Palette Editor — ref gfx::export",
514 "Hex Viewer — ref rom::hex", "Back"};
515 };
516
517 auto state = std::make_shared<ToolsState>();
518 auto menu = Menu(&state->items, &state->selected);
519
520 return Renderer(menu, [this, menu, state] {
521 return vbox({text("🎨 Graphics Tools") | bold | center, separator(),
522 menu->Render(), separator(),
523 text("Select a graphics tool") | dim | center}) |
524 border;
525 });
526}
527
529 struct SettingsState {
530 int left_width_slider;
531 int right_width_slider;
532 int bottom_height_slider;
533 };
534
535 auto state = std::make_shared<SettingsState>();
536 state->left_width_slider = config_.left_panel_width;
537 state->right_width_slider = config_.right_panel_width;
538 state->bottom_height_slider = config_.bottom_panel_height;
539
540 auto left_width_control =
541 Slider("Left Panel Width: ", &state->left_width_slider, 20, 60, 1);
542 auto right_width_control =
543 Slider("Right Panel Width: ", &state->right_width_slider, 30, 60, 1);
544 auto bottom_height_control =
545 Slider("Bottom Panel Height: ", &state->bottom_height_slider, 10, 30, 1);
546
547 auto apply_button = Button("Apply Changes", [this, state] {
548 config_.left_panel_width = state->left_width_slider;
549 config_.right_panel_width = state->right_width_slider;
550 config_.bottom_panel_height = state->bottom_height_slider;
551 screen_.PostEvent(Event::Custom);
552 });
553
554 auto reset_button = Button("Reset to Defaults", [this, state] {
555 state->left_width_slider = 30;
556 state->right_width_slider = 40;
557 state->bottom_height_slider = 15;
561 screen_.PostEvent(Event::Custom);
562 });
563
564 auto controls = Container::Vertical(
565 {left_width_control, right_width_control, bottom_height_control,
566 Container::Horizontal({apply_button, reset_button})});
567
568 return Renderer(controls, [this, controls, state, left_width_control,
569 right_width_control, bottom_height_control,
570 apply_button, reset_button] {
571 return vbox(
572 {RenderPanelHeader(PanelType::kSettings) | color(Color::Cyan),
573 separator(),
574 text("Customize the TUI layout") | center | dim,
575 separator(),
576 hbox({text("Left Panel Width: ") | bold,
577 text(absl::StrFormat("%d", state->left_width_slider))}),
578 left_width_control->Render(),
579 separator(),
580 hbox({text("Right Panel Width: ") | bold,
581 text(absl::StrFormat("%d", state->right_width_slider))}),
582 right_width_control->Render(),
583 separator(),
584 hbox({text("Bottom Panel Height: ") | bold,
585 text(absl::StrFormat("%d", state->bottom_height_slider))}),
586 bottom_height_control->Render(),
587 separator(),
588 hbox({apply_button->Render(), text(" "), reset_button->Render()}) |
589 center,
590 separator(),
591 text("Panel Visibility:") | bold,
592 hbox({text("Chat: ") | bold,
593 text(config_.show_chat ? "ON ✓" : "OFF ✗") |
594 color(config_.show_chat ? Color::Green : Color::Red),
595 text(" "), text("Status: ") | bold,
596 text(config_.show_status ? "ON ✓" : "OFF ✗") |
597 color(config_.show_status ? Color::Green : Color::Red)}) |
598 center,
599 separator(),
600 text("Keyboard Shortcuts:") | bold,
601 text(" c - Toggle chat panel") | dim,
602 text(" s - Toggle status panel") | dim,
603 text(" Esc/b - Back to menu") | dim,
604 separator(),
605 text("Changes apply immediately") | center | dim});
606 });
607}
608
610 return Renderer([this] {
611 return vbox(
612 {RenderPanelHeader(PanelType::kHelp) | color(Color::Cyan),
613 separator(),
614 text("Unified TUI Layout - ROM Editor & AI Agent") | center | dim,
615 separator(),
616 text("Global Shortcuts:") | bold | color(Color::Yellow),
617 text(" q - Quit application"),
618 text(" h - Show this help"),
619 text(" m - Main menu"),
620 text(" Esc/b - Back to previous panel"),
621 separator(),
622 text("Panel Controls:") | bold | color(Color::Yellow),
623 text(" c - Toggle chat panel"),
624 text(" s - Toggle status panel"),
625 text(" f - Open full chat interface"),
626 text(" t - ROM tools"),
627 separator(),
628 text("Navigation:") | bold | color(Color::Yellow),
629 text(" ↑/↓ - Navigate menus"),
630 text(" Enter - Select item"),
631 text(" Tab - Switch focus"),
632 separator(),
633 text("Chat Commands:") | bold | color(Color::Yellow),
634 text(" /exit - Exit chat"),
635 text(" /clear - Clear history"),
636 text(" /help - Show chat help"),
637 separator(),
638 text("Available Tools:") | bold | color(Color::Green),
639 text(" • Hex Viewer - Inspect ROM data"),
640 text(" • Palette Editor - Edit color palettes"),
641 text(" • TODO Manager - Track tasks"),
642 text(" • AI Chat - Natural language ROM queries"),
643 text(" • Dungeon Tools - Room inspection & editing"),
644 text(" • Graphics Tools - Sprite & tile editing"),
645 separator(),
646 text("Press 'Esc' or 'b' to go back") | dim | center});
647 });
648}
649
651 // Create a container that holds all panels
652 auto all_panels = Container::Tab(
656 nullptr);
657
658 // Create a renderer that dynamically shows the right panels based on state
659 return Renderer(all_panels, [this, all_panels] {
660 // Dynamically select left panel based on current state
661 Component left_panel;
662 switch (state_.active_main_panel) {
663 case PanelType::kMainMenu:
664 left_panel = main_menu_panel_;
665 break;
666 case PanelType::kHexViewer:
667 left_panel = hex_viewer_panel_;
668 break;
669 case PanelType::kPaletteEditor:
670 left_panel = palette_editor_panel_;
671 break;
672 case PanelType::kTodoManager:
673 left_panel = todo_manager_panel_;
674 break;
675 case PanelType::kRomTools:
676 left_panel = rom_tools_panel_;
677 break;
678 case PanelType::kGraphicsTools:
679 left_panel = graphics_tools_panel_;
680 break;
681 case PanelType::kSettings:
682 left_panel = settings_panel_;
683 break;
684 case PanelType::kHelp:
685 left_panel = help_panel_;
686 break;
687 default:
688 left_panel = main_menu_panel_;
689 break;
690 }
691
692 // Dynamically select right panel
693 Component right_panel;
694 if (config_.show_status) {
695 right_panel = status_panel_;
696 } else {
697 right_panel = tools_panel_;
698 }
699
700 // Create horizontal layout
701 auto top_section =
702 hbox({left_panel->Render() | flex, separatorLight(),
703 right_panel->Render() |
704 size(WIDTH, LESS_THAN, config_.right_panel_width)});
705
706 // Add chat panel if enabled
707 if (config_.show_chat) {
708 Element stacked =
709 vbox({top_section | flex, separatorLight(),
710 chat_panel_->Render() |
711 size(HEIGHT, EQUAL, config_.bottom_panel_height)}) |
712 bgcolor(Color::Black);
713
715 stacked = dbox({stacked, todo_overlay_component_->Render()});
716 }
717 return stacked;
718 }
719
720 Element content = top_section | bgcolor(Color::Black);
722 content = dbox({content, todo_overlay_component_->Render()});
723 }
724 return content;
725 });
726}
727
729 // Back to main menu
730 if (event == Event::Escape || event == Event::Character('b')) {
733 return true;
734 }
735 }
736
737 // Global shortcuts
738 if (event == Event::Special({20})) { // Ctrl+T
740 return true;
741 }
742
743 if (event == Event::Character('q') ||
744 (event == Event::Character('q') &&
746 screen_.Exit();
747 return true;
748 }
749
750 if (event == Event::Character('h')) {
752 return true;
753 }
754
755 if (event == Event::Character('c')) {
756 ToggleChat();
757 return true;
758 }
759
760 if (event == Event::Character('s')) {
761 ToggleStatus();
762 return true;
763 }
764
765 if (event == Event::Character('t')) {
767 return true;
768 }
769
770 if (event == Event::Character('m')) {
772 return true;
773 }
774
775 if (event == Event::Character('f')) {
776 // Launch full chat interface
777 if (chat_tui_) {
778 screen_.ExitLoopClosure()(); // Exit current loop
779 chat_tui_->Run(); // Run full chat
780 screen_.PostEvent(Event::Custom); // Refresh when we return
781 }
782 return true;
783 }
784
785 return false;
786}
787
788bool UnifiedLayout::HandlePanelEvents(const Event& /* event */) {
789 // Panel-specific event handling
790 return false;
791}
792
794 std::string title;
795 switch (panel) {
797 title = "🎮 Main Menu";
798 break;
799 case PanelType::kChat:
800 title = "🤖 AI Chat";
801 break;
803 title = "📊 Status";
804 break;
806 title = "🛠️ Tools";
807 break;
809 title = "🔍 Hex Viewer";
810 break;
812 title = "🎨 Palette Editor";
813 break;
815 title = "📝 TODO Manager";
816 break;
818 title = "🔧 ROM Tools";
819 break;
821 title = "🎨 Graphics Tools";
822 break;
824 title = "⚙️ Settings";
825 break;
826 case PanelType::kHelp:
827 title = "❓ Help";
828 break;
829 }
830
831 return text(title) | bold | center;
832}
833
835 return hbox(
836 {text(absl::StrFormat("Panel: %s",
838 ? "Main"
839 : "Other")) |
840 color(Color::Cyan),
841 filler(),
842 text(absl::StrFormat("ROM: %s", state_.current_rom_file.empty()
843 ? "None"
845 color(Color::Green),
846 filler(),
847 text("Shortcuts: Ctrl+T TODO Overlay | f Full Chat | m Main Menu") |
848 dim});
849}
850
852 return text("🎮 Z3ED CLI") | bold | center;
853}
854
856 return text("Workflow: Active") | color(Color::Green);
857}
858
860 return vbox({text("Command Hints:") | bold,
861 text(" Ctrl+T - Toggle TODO overlay"),
862 text(" f - Full chat mode"), text(" m - Main menu")});
863}
864
866 return text("TODO Stack: Empty") | dim;
867}
868
869Element UnifiedLayout::RenderResponsiveGrid(const std::vector<Element>& tiles) {
870 if (tiles.empty()) {
871 return text("No items") | center | dim;
872 }
873 return vbox(tiles);
874}
875
876} // namespace cli
877} // 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