18#include "absl/strings/ascii.h"
19#include "absl/strings/str_format.h"
20#include "absl/strings/str_split.h"
30constexpr const char*
RESET =
"\033[0m";
31constexpr const char*
BOLD =
"\033[1m";
32constexpr const char*
DIM =
"\033[2m";
33constexpr const char*
ITALIC =
"\033[3m";
38constexpr const char*
FG_RED =
"\033[31m";
41constexpr const char*
FG_BLUE =
"\033[34m";
43constexpr const char*
FG_CYAN =
"\033[36m";
56constexpr const char*
BG_RED =
"\033[41m";
59constexpr const char*
BG_BLUE =
"\033[44m";
61constexpr const char*
BG_CYAN =
"\033[46m";
99 CONSOLE_SCREEN_BUFFER_INFO csbi;
100 GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
101 return {csbi.srWindow.Right - csbi.srWindow.Left + 1,
102 csbi.srWindow.Bottom - csbi.srWindow.Top + 1};
105 ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
106 return {w.ws_col, w.ws_row};
154 return absl::OkStatus();
159 auto [width, height] = GetTerminalSize();
167 return absl::OkStatus();
194 return absl::OkStatus();
198 const std::string& sender,
bool is_error) {
200 std::string formatted_message;
203 formatted_message = absl::StrFormat(
"%s %sERROR%s %s: %s", timestamp,
204 FG_RED, RESET, sender, message);
207 absl::StrFormat(
"%s %s: %s", timestamp, sender, message);
220 const std::string& tool_name) {
222 std::string formatted_output = absl::StrFormat(
223 "%s %sTOOL%s %s:\n%s", timestamp, FG_CYAN, RESET, tool_name, output);
229 const std::vector<std::string>& suggestions) {
230 if (suggestions.empty()) {
234 std::string suggestion_text =
235 absl::StrFormat(
"%sSuggestions:%s\n", FG_YELLOW, RESET);
237 for (
size_t i = 0; i < suggestions.size() && i < 5; ++i) {
238 suggestion_text += absl::StrFormat(
" %s%d.%s %s\n", FG_BRIGHT_BLACK, i + 1,
239 RESET, suggestions[i]);
251 std::string help_text;
254 help_text = absl::StrFormat(
"%sHelp for '%s':%s\n%s\n", FG_GREEN, command,
258 absl::StrFormat(
"%sUnknown command: %s%s\n", FG_RED, command, RESET);
265 const std::string&
name,
266 std::function<absl::Status(
const std::vector<std::string>&)> handler,
279 std::cout << HIDE_CURSOR;
284 std::cout << SHOW_CURSOR;
289 std::cout << CLEAR_SCREEN << CURSOR_HOME;
294 std::cout << CURSOR_HOME;
318 std::string header_text = absl::StrFormat(
319 "%sZ3ED Enhanced TUI v2.0%s | ROM: %s | Theme: %s",
323 std::cout << CURSOR_HOME;
324 std::cout << header_text;
328 for (
int i = 0; i < remaining; ++i) {
342 std::cout <<
ApplyStyle(
"Command Palette: ", style);
365 for (
int line = start_line;
369 std::cout <<
"\033[" << line <<
";1H";
372 if (history_index >= 0 &&
375 std::string truncated =
377 std::cout << truncated;
382 std::cout <<
"\033[" << end_line <<
";1H";
387 std::cout <<
"\033[" << end_line <<
";"
402 std::string status_text =
403 absl::StrFormat(
"Commands: %d | History: %d | Mode: %s",
412 for (
int i = 0; i < remaining; ++i) {
424 std::cout <<
ApplyStyle(
"ROM Info", style) <<
"\n";
432 std::cout <<
"Loaded: Yes\n";
436 std::cout <<
"No ROM loaded\n";
442 std::cout <<
ApplyStyle(
"Shortcuts", style) <<
"\n";
445 std::cout <<
"Ctrl+P: Command Palette\n";
448 std::cout <<
"Tab: Autocomplete\n";
451 std::cout <<
"Esc: Exit Palette\n";
455 int key = ReadChar();
459 return absl::OkStatus();
489 if (!suggestions.empty()) {
500 if (key >= 32 && key <= 126) {
541 if (key >= 32 && key <= 126) {
553 for (
const auto& [command, _] :
commands_) {
554 if (absl::AsciiStrToLower(command).find(
564 std::vector<std::string> parts =
565 absl::StrSplit(input,
' ', absl::SkipEmpty());
567 return absl::OkStatus();
570 std::string command = parts[0];
571 std::vector<std::string> args(parts.begin() + 1, parts.end());
577 return absl::NotFoundError(
"Unknown command: " + command);
582 const std::string& partial) {
583 std::vector<std::string> suggestions;
585 for (
const auto& [command, _] :
commands_) {
586 if (absl::AsciiStrToLower(command).find(absl::AsciiStrToLower(partial)) ==
588 suggestions.push_back(command);
592 std::sort(suggestions.begin(), suggestions.end());
597 auto it =
styles_.find(component);
603 return TUIStyle{FG_WHITE, BG_BLACK, FG_CYAN, FG_BRIGHT_BLACK};
640 FG_BRIGHT_BLACK,
true};
651 FG_BRIGHT_BLACK,
true};
657 FG_YELLOW, FG_BRIGHT_BLACK};
682 auto now = std::time(
nullptr);
683 auto tm = *std::localtime(&now);
685 std::ostringstream oss;
686 oss << std::put_time(&tm,
"%H:%M:%S");
687 return "[" + oss.str() +
"]";
691 int max_width)
const {
692 if (
static_cast<int>(text.length()) <= max_width) {
696 return text.substr(0, max_width - 3) +
"...";
701 std::vector<std::string> lines;
702 std::vector<std::string> words = absl::StrSplit(text,
' ', absl::SkipEmpty());
704 std::string current_line;
705 for (
const auto& word : words) {
706 if (
static_cast<int>(current_line.length() + word.length() + 1) <= width) {
707 if (!current_line.empty()) {
710 current_line += word;
712 if (!current_line.empty()) {
713 lines.push_back(current_line);
716 lines.push_back(word);
721 if (!current_line.empty()) {
722 lines.push_back(current_line);
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
void UpdateStatusBar(const std::string &status)
struct yaze::cli::agent::EnhancedTUI::Layout layout_
std::map< std::string, std::function< absl::Status(const std::vector< std::string > &)> commands_)
EnhancedTUI(const TUIConfig &config=TUIConfig{})
std::vector< std::string > output_history_
void HandleNormalKey(int key)
std::vector< std::string > GetCommandSuggestions(const std::string &partial)
void SetRomContext(Rom *rom)
void HandleCommandPaletteKey(int key)
void DisplayToolOutput(const std::string &output, const std::string &tool_name)
void LoadTheme(TUITheme theme)
void RegisterCommand(const std::string &name, std::function< absl::Status(const std::vector< std::string > &)> handler, const std::string &description="")
absl::Status ProcessCommand(const std::string &input)
bool terminal_initialized_
std::map< TUIComponent, TUIStyle > styles_
void HandleKeyPress(int key)
std::string TruncateText(const std::string &text, int max_width) const
void DrawCommandPalette()
void DisplaySuggestions(const std::vector< std::string > &suggestions)
std::vector< std::string > palette_matches_
void DisplayMessage(const std::string &message, const std::string &sender="User", bool is_error=false)
void ShowHelp(const std::string &command)
std::string FormatTimestamp() const
std::string ApplyStyle(const std::string &text, const TUIStyle &style) const
std::vector< std::string > WrapText(const std::string &text, int width) const
absl::Status HandleInput()
void SetConfig(const TUIConfig &config)
absl::Status Initialize()
std::string current_input_
std::string palette_filter_
TUIStyle GetStyle(TUIComponent component) const
std::map< std::string, std::string > command_descriptions_
std::vector< std::string > command_history_
void UpdatePaletteMatches()
constexpr const char * ITALIC
constexpr const char * BG_RED
constexpr int KEY_PAGE_UP
constexpr const char * DIM
constexpr const char * BG_BRIGHT_CYAN
constexpr const char * CLEAR_LINE
constexpr const char * CLEAR_SCREEN
constexpr const char * BG_BLACK
constexpr const char * FG_MAGENTA
constexpr const char * BG_GREEN
constexpr const char * BG_BRIGHT_RED
constexpr const char * CURSOR_HOME
constexpr const char * BG_BRIGHT_WHITE
constexpr const char * FG_BRIGHT_CYAN
std::pair< int, int > GetTerminalSize()
constexpr const char * FG_BRIGHT_BLUE
constexpr const char * FG_WHITE
constexpr const char * FG_RED
constexpr const char * FG_BRIGHT_RED
constexpr const char * BG_CYAN
constexpr const char * FG_BRIGHT_BLACK
constexpr const char * FG_YELLOW
constexpr const char * BG_MAGENTA
constexpr const char * FG_BRIGHT_MAGENTA
constexpr const char * HIDE_CURSOR
constexpr const char * FG_BRIGHT_YELLOW
constexpr const char * RESTORE_CURSOR
constexpr const char * BG_BRIGHT_MAGENTA
constexpr const char * BG_BRIGHT_GREEN
constexpr const char * SHOW_CURSOR
constexpr const char * BG_BRIGHT_BLACK
constexpr const char * BG_BRIGHT_BLUE
constexpr int KEY_PAGE_DOWN
constexpr const char * BG_BRIGHT_YELLOW
constexpr int KEY_BACKSPACE
constexpr const char * FG_BRIGHT_GREEN
constexpr const char * SAVE_CURSOR
constexpr const char * UNDERLINE
bool IsSpecialKey(int key)
constexpr const char * BG_WHITE
constexpr const char * FG_BLACK
constexpr const char * BG_YELLOW
constexpr const char * FG_BRIGHT_WHITE
constexpr const char * BOLD
constexpr const char * FG_BLUE
constexpr const char * RESET
constexpr const char * BG_BLUE
constexpr const char * FG_CYAN
constexpr const char * FG_GREEN
TUITheme
Visual themes for the enhanced TUI.
TUIComponent
Different UI components in the enhanced TUI.
std::string TUIThemeToString(TUITheme theme)
#define RETURN_IF_ERROR(expr)
Configuration for the enhanced TUI.
Visual styling configuration for TUI components.
std::string background_color
std::string foreground_color