20 auto renderer = Renderer([
this] {
23 text(
"Hex Viewer") | bold | center,
25 text(
"No ROM loaded.") | center | color(Color::Red),
29 std::vector<Element> rows;
31 int current_offset =
offset_ + (i * 16);
32 if (current_offset >=
static_cast<int>(
rom_->
size())) {
37 row.push_back(text(absl::StrFormat(
"0x%08X: ", current_offset)) | color(Color::Yellow));
39 for (
int j = 0; j < 16; ++j) {
40 if (current_offset + j <
static_cast<int>(
rom_->
size())) {
41 row.push_back(text(absl::StrFormat(
"%02X ",
rom_->
vector()[current_offset + j])));
43 row.push_back(text(
" "));
46 row.push_back(separator());
47 for (
int j = 0; j < 16; ++j) {
48 if (current_offset + j <
static_cast<int>(
rom_->
size())) {
50 row.push_back(text(std::isprint(c) ? std::string(1, c) :
"."));
52 row.push_back(text(
" "));
55 rows.push_back(hbox(row));
59 text(
"Hex Viewer") | center | bold,
61 vbox(rows) | frame | flex,
64 text(absl::StrFormat(
"Offset: 0x%08X",
offset_)),
66 text(
"↑↓ PgUp/PgDn: Scroll | Esc/b: Back") | dim,
71 component_ = CatchEvent(renderer, [
this](
const Event& event) {
72 if (!rom_ || !rom_->is_loaded())
return false;
75 if (event == Event::ArrowUp) {
76 offset_ = std::max(0, offset_ - 16);
78 }
else if (event == Event::ArrowDown) {
79 offset_ = std::min(
static_cast<int>(rom_->size()) - (lines_to_show_ * 16), offset_ + 16);
81 }
else if (event == Event::PageUp) {
82 offset_ = std::max(0, offset_ - (lines_to_show_ * 16));
84 }
else if (event == Event::PageDown) {
85 offset_ = std::min(
static_cast<int>(rom_->size()) - (lines_to_show_ * 16), offset_ + (lines_to_show_ * 16));
87 }
else if (event == Event::Escape || event == Event::Character(
'b')) {
88 if (on_back_) on_back_();