21 auto renderer = Renderer([
this] {
24 text(
"Hex Viewer") | bold | center,
26 text(
"No ROM loaded.") | center | color(Color::Red),
31 std::vector<Element> rows;
33 int current_offset =
offset_ + (i * 16);
34 if (current_offset >=
static_cast<int>(
rom_->
size())) {
39 row.push_back(text(absl::StrFormat(
"0x%08X: ", current_offset)) |
40 color(Color::Yellow));
42 for (
int j = 0; j < 16; ++j) {
43 if (current_offset + j <
static_cast<int>(
rom_->
size())) {
45 absl::StrFormat(
"%02X ",
rom_->
vector()[current_offset + j])));
47 row.push_back(text(
" "));
50 row.push_back(separator());
51 for (
int j = 0; j < 16; ++j) {
52 if (current_offset + j <
static_cast<int>(
rom_->
size())) {
54 row.push_back(text(std::isprint(c) ? std::string(1, c) :
"."));
56 row.push_back(text(
" "));
59 rows.push_back(hbox(row));
62 return vbox({text(
"Hex Viewer") | center | bold, separator(),
63 vbox(rows) | frame | flex, separator(),
65 text(absl::StrFormat(
"Offset: 0x%08X",
offset_)),
67 text(
"↑↓ PgUp/PgDn: Scroll | Esc/b: Back") | dim,
72 component_ = CatchEvent(renderer, [
this](
const Event& event) {
73 if (!rom_ || !rom_->is_loaded())
77 if (event == Event::ArrowUp) {
78 offset_ = std::max(0, offset_ - 16);
80 }
else if (event == Event::ArrowDown) {
81 offset_ = std::min(
static_cast<int>(rom_->size()) - (lines_to_show_ * 16),
84 }
else if (event == Event::PageUp) {
85 offset_ = std::max(0, offset_ - (lines_to_show_ * 16));
87 }
else if (event == Event::PageDown) {
88 offset_ = std::min(
static_cast<int>(rom_->size()) - (lines_to_show_ * 16),
89 offset_ + (lines_to_show_ * 16));
91 }
else if (event == Event::Escape || event == Event::Character(
'b')) {