Refactor TUI components for improved layout handling and add palette editor functionality

This commit is contained in:
scawful
2025-01-18 22:01:37 -05:00
parent a28da3b2ca
commit bc52fc5116
2 changed files with 55 additions and 25 deletions

View File

@@ -5,6 +5,8 @@
#include <ftxui/dom/elements.hpp> #include <ftxui/dom/elements.hpp>
#include <ftxui/screen/screen.hpp> #include <ftxui/screen/screen.hpp>
#include "app/core/common.h"
namespace yaze { namespace yaze {
namespace cli { namespace cli {
@@ -12,11 +14,12 @@ using namespace ftxui;
namespace { namespace {
void SwitchComponents(ftxui::ScreenInteractive &screen, LayoutID layout) { void SwitchComponents(ftxui::ScreenInteractive &screen, LayoutID layout) {
app_context.current_layout = layout;
screen.Clear();
screen.ExitLoopClosure()(); screen.ExitLoopClosure()();
screen.Clear();
app_context.current_layout = layout;
// Clear the buffer // Clear the buffer
std::cout << "\033[2J\033[1;1H"; // std::cout << "\033[2J\033[1;1H";
} }
bool HandleInput(ftxui::ScreenInteractive &screen, ftxui::Event &event, bool HandleInput(ftxui::ScreenInteractive &screen, ftxui::Event &event,
@@ -53,9 +56,11 @@ void ApplyBpsPatchComponent(ftxui::ScreenInteractive &screen) {
// Button to apply the patch. // Button to apply the patch.
auto apply_button = Button("Apply Patch", [&] { auto apply_button = Button("Apply Patch", [&] {
// Once the file paths are entered by the user, std::vector<uint8_t> source;
// you can load the files and apply the BPS patch here. std::vector<uint8_t> patch;
std::vector<uint8_t> patched;
core::ApplyBpsPatch(source, patch, patched);
// ... // ...
// Load or open patch_file // Load or open patch_file
// Load or open base_file // Load or open base_file
@@ -210,18 +215,46 @@ void LoadRomComponent(ftxui::ScreenInteractive &screen) {
screen.Loop(renderer); screen.Loop(renderer);
} }
Element ColorBox(const Color &color) {
return ftxui::text(" ") | ftxui::bgcolor(color);
}
void PaletteEditorComponent(ftxui::ScreenInteractive &screen) { void PaletteEditorComponent(ftxui::ScreenInteractive &screen) {
// Replace with actual data or inputs relevant to the palette editor. ReturnIfRomNotLoaded(screen);
auto back_button = auto back_button =
Button("Back", [&] { SwitchComponents(screen, LayoutID::kMainMenu); }); Button("Back", [&] { SwitchComponents(screen, LayoutID::kMainMenu); });
auto renderer = Renderer(back_button, [&] { static auto palette_groups = app_context.rom.palette_group();
return vbox({text("Palette Editor") | center, separator(), auto ftx_palettes = {
text("Implement your palette editing interface here."), palette_groups.armors, palette_groups.swords,
separator(), back_button->Render() | center}) | palette_groups.shields, palette_groups.sprites_aux1,
center; palette_groups.sprites_aux2, palette_groups.sprites_aux3,
palette_groups.dungeon_main, palette_groups.grass,
palette_groups.object_3d, palette_groups.overworld_mini_map,
};
// Create a list of palette groups to pick from
static int selected_palette_group = 0;
static std::vector<std::string> palette_group_names;
if (palette_group_names.empty()) {
for (size_t i = 0; i < 14; ++i) {
palette_group_names.push_back(gfx::kPaletteCategoryNames[i].data());
}
}
auto palette_list = Menu(&palette_group_names, &selected_palette_group);
auto container = Container::Vertical({
palette_list,
back_button,
}); });
auto renderer = Renderer(container, [&] {
return vbox({text("Palette Editor") | center, separator(),
palette_list->Render(), separator(),
back_button->Render() | center}) |
center;
});
screen.Loop(renderer); screen.Loop(renderer);
} }
@@ -231,6 +264,7 @@ void MainMenuComponent(ftxui::ScreenInteractive &screen) {
// Create menu. // Create menu.
MenuOption option; MenuOption option;
option.focused_entry = &selected;
auto menu = Menu(&kMainMenuEntries, &selected, option); auto menu = Menu(&kMainMenuEntries, &selected, option);
menu = CatchEvent( menu = CatchEvent(
menu, [&](Event event) { return HandleInput(screen, event, selected); }); menu, [&](Event event) { return HandleInput(screen, event, selected); });
@@ -243,9 +277,7 @@ void MainMenuComponent(ftxui::ScreenInteractive &screen) {
// This renderer displays the menu vertically. // This renderer displays the menu vertically.
auto renderer = Renderer(menu, [&] { auto renderer = Renderer(menu, [&] {
return vbox({ return vbox({
text("The Legend of Zelda: A Link to the Past") | center | text(rom_information) | center | color(Color::Red1),
color(Color::Blue),
text(rom_information) | center,
separator(), separator(),
menu->Render(), menu->Render(),
}); });
@@ -286,21 +318,22 @@ void MainMenuComponent(ftxui::ScreenInteractive &screen) {
} // namespace } // namespace
void ShowMain() { void ShowMain() {
auto screen = ScreenInteractive::FitComponent(); auto screen = ScreenInteractive::TerminalOutput();
while (true) { while (true) {
switch (app_context.current_layout) { switch (app_context.current_layout) {
case LayoutID::kMainMenu: { case LayoutID::kMainMenu: {
MainMenuComponent(screen); MainMenuComponent(screen);
} break; } break;
case LayoutID::kLoadRom: {
LoadRomComponent(screen);
} break;
case LayoutID::kApplyBpsPatch: { case LayoutID::kApplyBpsPatch: {
ApplyBpsPatchComponent(screen); ApplyBpsPatchComponent(screen);
} break; } break;
case LayoutID::kGenerateSaveFile: { case LayoutID::kGenerateSaveFile: {
GenerateSaveFileComponent(screen); GenerateSaveFileComponent(screen);
} break; } break;
case LayoutID::kLoadRom: {
LoadRomComponent(screen);
} break;
case LayoutID::kPaletteEditor: { case LayoutID::kPaletteEditor: {
PaletteEditorComponent(screen); PaletteEditorComponent(screen);
} break; } break;

View File

@@ -13,25 +13,22 @@ namespace yaze {
namespace cli { namespace cli {
const std::vector<std::string> kMainMenuEntries = { const std::vector<std::string> kMainMenuEntries = {
"Apply BPS Patch", "Load ROM", "Apply BPS Patch", "Generate Save File", "Palette Editor",
"Generate Save File",
"Load ROM",
"Palette Editor",
"Exit", "Exit",
}; };
enum class MainMenuEntry { enum class MainMenuEntry {
kLoadRom,
kApplyBpsPatch, kApplyBpsPatch,
kGenerateSaveFile, kGenerateSaveFile,
kLoadRom,
kPaletteEditor, kPaletteEditor,
kExit, kExit,
}; };
enum LayoutID { enum LayoutID {
kLoadRom,
kApplyBpsPatch, kApplyBpsPatch,
kGenerateSaveFile, kGenerateSaveFile,
kLoadRom,
kPaletteEditor, kPaletteEditor,
kExit, kExit,
kMainMenu, kMainMenu,