18#include "absl/strings/str_format.h"
19#include "absl/strings/str_split.h"
20#include "absl/strings/ascii.h"
29constexpr const char*
RESET =
"\033[0m";
30constexpr const char*
BOLD =
"\033[1m";
31constexpr const char*
DIM =
"\033[2m";
32constexpr const char*
ITALIC =
"\033[3m";
37constexpr const char*
FG_RED =
"\033[31m";
40constexpr const char*
FG_BLUE =
"\033[34m";
42constexpr const char*
FG_CYAN =
"\033[36m";
55constexpr const char*
BG_RED =
"\033[41m";
58constexpr const char*
BG_BLUE =
"\033[44m";
60constexpr const char*
BG_CYAN =
"\033[46m";
98 CONSOLE_SCREEN_BUFFER_INFO csbi;
99 GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
100 return {csbi.srWindow.Right - csbi.srWindow.Left + 1,
101 csbi.srWindow.Bottom - csbi.srWindow.Top + 1};
104 ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
105 return {w.ws_col, w.ws_row};
133 default:
return "Unknown";
147 return absl::OkStatus();
152 auto [width, height] = GetTerminalSize();
160 return absl::OkStatus();
187 return absl::OkStatus();
191 const std::string& sender,
194 std::string formatted_message;
197 formatted_message = absl::StrFormat(
"%s %sERROR%s %s: %s",
203 formatted_message = absl::StrFormat(
"%s %s: %s",
219 const std::string& tool_name) {
221 std::string formatted_output = absl::StrFormat(
222 "%s %sTOOL%s %s:\n%s",
232 if (suggestions.empty()) {
236 std::string suggestion_text = absl::StrFormat(
237 "%sSuggestions:%s\n",
240 for (
size_t i = 0; i < suggestions.size() && i < 5; ++i) {
241 suggestion_text += absl::StrFormat(
" %s%d.%s %s\n",
242 FG_BRIGHT_BLACK, i + 1, RESET,
255 std::string help_text;
258 help_text = absl::StrFormat(
259 "%sHelp for '%s':%s\n%s\n",
260 FG_GREEN, command, RESET,
263 help_text = absl::StrFormat(
264 "%sUnknown command: %s%s\n",
265 FG_RED, command, RESET);
272 std::function<absl::Status(
const std::vector<std::string>&)> handler,
273 const std::string& description) {
285 std::cout << HIDE_CURSOR;
290 std::cout << SHOW_CURSOR;
295 std::cout << CLEAR_SCREEN << CURSOR_HOME;
300 std::cout << CURSOR_HOME;
323 std::string header_text = absl::StrFormat(
324 "%sZ3ED Enhanced TUI v2.0%s | ROM: %s | Theme: %s",
330 std::cout << CURSOR_HOME;
331 std::cout << header_text;
335 for (
int i = 0; i < remaining; ++i) {
349 std::cout <<
ApplyStyle(
"Command Palette: ", style);
372 for (
int line = start_line; line < end_line &&
373 line - start_line < static_cast<int>(
output_history_.size()); ++line) {
374 std::cout <<
"\033[" << line <<
";1H";
377 if (history_index >= 0 && history_index <
static_cast<int>(
output_history_.size())) {
380 std::cout << truncated;
385 std::cout <<
"\033[" << end_line <<
";1H";
403 std::string status_text = absl::StrFormat(
404 "Commands: %d | History: %d | Mode: %s",
413 for (
int i = 0; i < remaining; ++i) {
424 std::cout <<
ApplyStyle(
"ROM Info", style) <<
"\n";
430 std::cout <<
"Loaded: Yes\n";
433 std::cout <<
"No ROM loaded\n";
438 std::cout <<
ApplyStyle(
"Shortcuts", style) <<
"\n";
440 std::cout <<
"Ctrl+P: Command Palette\n";
442 std::cout <<
"Tab: Autocomplete\n";
444 std::cout <<
"Esc: Exit Palette\n";
448 int key = ReadChar();
452 return absl::OkStatus();
482 if (!suggestions.empty()) {
493 if (key >= 32 && key <= 126) {
533 if (key >= 32 && key <= 126) {
545 for (
const auto& [command, _] :
commands_) {
546 if (absl::AsciiStrToLower(command).find(absl::AsciiStrToLower(
palette_filter_)) != std::string::npos) {
555 std::vector<std::string> parts = absl::StrSplit(input,
' ', absl::SkipEmpty());
557 return absl::OkStatus();
560 std::string command = parts[0];
561 std::vector<std::string> args(parts.begin() + 1, parts.end());
567 return absl::NotFoundError(
"Unknown command: " + command);
572 std::vector<std::string> suggestions;
574 for (
const auto& [command, _] :
commands_) {
575 if (absl::AsciiStrToLower(command).find(absl::AsciiStrToLower(partial)) == 0) {
576 suggestions.push_back(command);
580 std::sort(suggestions.begin(), suggestions.end());
585 auto it =
styles_.find(component);
591 return TUIStyle{FG_WHITE, BG_BLACK, FG_CYAN, FG_BRIGHT_BLACK};
657 auto now = std::time(
nullptr);
658 auto tm = *std::localtime(&now);
660 std::ostringstream oss;
661 oss << std::put_time(&tm,
"%H:%M:%S");
662 return "[" + oss.str() +
"]";
666 if (
static_cast<int>(text.length()) <= max_width) {
670 return text.substr(0, max_width - 3) +
"...";
674 std::vector<std::string> lines;
675 std::vector<std::string> words = absl::StrSplit(text,
' ', absl::SkipEmpty());
677 std::string current_line;
678 for (
const auto& word : words) {
679 if (
static_cast<int>(current_line.length() + word.length() + 1) <= width) {
680 if (!current_line.empty()) {
683 current_line += word;
685 if (!current_line.empty()) {
686 lines.push_back(current_line);
689 lines.push_back(word);
694 if (!current_line.empty()) {
695 lines.push_back(current_line);
The Rom class is used to load, save, and modify Rom data.
void UpdateStatusBar(const std::string &status)
struct yaze::cli::agent::EnhancedTUI::Layout layout_
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
std::map< std::string, std::function< absl::Status(const std::vector< std::string > &)> > commands_
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()
#define RETURN_IF_ERROR(expression)
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)
Main namespace for the application.
Configuration for the enhanced TUI.
Visual styling configuration for TUI components.
std::string background_color
std::string foreground_color