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