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

View File

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