yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
hex_viewer.cc
Go to the documentation of this file.
2
3#include <ftxui/component/component.hpp>
4#include <ftxui/dom/elements.hpp>
5#include "absl/strings/str_format.h"
6
7namespace yaze {
8namespace cli {
9
10using namespace ftxui;
11
12HexViewerComponent::HexViewerComponent(Rom* rom, std::function<void()> on_back)
13 : rom_(rom), on_back_(std::move(on_back)) {}
14
15ftxui::Component HexViewerComponent::Render() {
16 if (component_) {
17 return component_;
18 }
19
20 auto renderer = Renderer([this] {
21 if (!rom_ || !rom_->is_loaded()) {
22 return vbox({
23 text("Hex Viewer") | bold | center,
24 separator(),
25 text("No ROM loaded.") | center | color(Color::Red),
26 }) | border;
27 }
28
29 std::vector<Element> rows;
30 for (int i = 0; i < lines_to_show_; ++i) {
31 int current_offset = offset_ + (i * 16);
32 if (current_offset >= static_cast<int>(rom_->size())) {
33 break;
34 }
35
36 Elements row;
37 row.push_back(text(absl::StrFormat("0x%08X: ", current_offset)) | color(Color::Yellow));
38
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])));
42 } else {
43 row.push_back(text(" "));
44 }
45 }
46 row.push_back(separator());
47 for (int j = 0; j < 16; ++j) {
48 if (current_offset + j < static_cast<int>(rom_->size())) {
49 char c = rom_->vector()[current_offset + j];
50 row.push_back(text(std::isprint(c) ? std::string(1, c) : "."));
51 } else {
52 row.push_back(text(" "));
53 }
54 }
55 rows.push_back(hbox(row));
56 }
57
58 return vbox({
59 text("Hex Viewer") | center | bold,
60 separator(),
61 vbox(rows) | frame | flex,
62 separator(),
63 hbox({
64 text(absl::StrFormat("Offset: 0x%08X", offset_)),
65 filler(),
66 text("↑↓ PgUp/PgDn: Scroll | Esc/b: Back") | dim,
67 })
68 }) | border;
69 });
70
71 component_ = CatchEvent(renderer, [this](const Event& event) {
72 if (!rom_ || !rom_->is_loaded()) return false;
73
74 bool handled = false;
75 if (event == Event::ArrowUp) {
76 offset_ = std::max(0, offset_ - 16);
77 handled = true;
78 } else if (event == Event::ArrowDown) {
79 offset_ = std::min(static_cast<int>(rom_->size()) - (lines_to_show_ * 16), offset_ + 16);
80 handled = true;
81 } else if (event == Event::PageUp) {
82 offset_ = std::max(0, offset_ - (lines_to_show_ * 16));
83 handled = true;
84 } else if (event == Event::PageDown) {
85 offset_ = std::min(static_cast<int>(rom_->size()) - (lines_to_show_ * 16), offset_ + (lines_to_show_ * 16));
86 handled = true;
87 } else if (event == Event::Escape || event == Event::Character('b')) {
88 if (on_back_) on_back_();
89 handled = true;
90 }
91
92 return handled;
93 });
94
95 return component_;
96}
97
98} // namespace cli
99} // namespace yaze
The Rom class is used to load, save, and modify Rom data.
Definition rom.h:71
auto vector() const
Definition rom.h:207
auto size() const
Definition rom.h:202
bool is_loaded() const
Definition rom.h:197
HexViewerComponent(Rom *rom, std::function< void()> on_back)
Definition hex_viewer.cc:12
ftxui::Component component_
Definition hex_viewer.h:22
ftxui::Component Render() override
Definition hex_viewer.cc:15
Definition cli.h:21
Main namespace for the application.