1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-14 09:04:59 +00:00

HexEditor: Break bytes-per-row into numbers of groups of bytes

This commit is contained in:
Sam Atkins 2024-03-10 18:10:05 +00:00 committed by Sam Atkins
parent 73ba6d77ab
commit 4a2a40a3c8
2 changed files with 30 additions and 9 deletions

View file

@ -242,9 +242,24 @@ void HexEditor::update_content_size()
void HexEditor::set_bytes_per_row(size_t bytes_per_row)
{
if (bytes_per_row == m_bytes_per_row)
if (bytes_per_row == this->bytes_per_row())
return;
m_bytes_per_row = bytes_per_row;
set_groups_per_row(ceil_div(bytes_per_row, m_bytes_per_group));
}
void HexEditor::set_bytes_per_group(size_t bytes_per_group)
{
if (bytes_per_group == m_bytes_per_group)
return;
m_bytes_per_group = bytes_per_group;
update_content_size();
}
void HexEditor::set_groups_per_row(size_t groups_per_row)
{
if (groups_per_row == m_groups_per_row)
return;
m_groups_per_row = groups_per_row;
update_content_size();
}
@ -299,7 +314,7 @@ Optional<HexEditor::OffsetData> HexEditor::offset_at(Gfx::IntPoint position) con
auto byte_x = (absolute_x - hex_text_start_x) / cell_width();
auto byte_y = (absolute_y - hex_start_y) / line_height();
auto offset = (byte_y * m_bytes_per_row) + byte_x;
auto offset = (byte_y * bytes_per_row()) + byte_x;
if (offset >= m_document->size())
return {};
@ -315,7 +330,7 @@ Optional<HexEditor::OffsetData> HexEditor::offset_at(Gfx::IntPoint position) con
auto byte_x = (absolute_x - text_text_start_x) / character_width();
auto byte_y = (absolute_y - text_start_y) / line_height();
auto offset = (byte_y * m_bytes_per_row) + byte_x;
auto offset = (byte_y * bytes_per_row()) + byte_x;
if (offset >= m_document->size())
return {};

View file

@ -55,7 +55,12 @@ public:
bool copy_selected_hex_to_clipboard();
bool copy_selected_hex_to_clipboard_as_c_code();
size_t bytes_per_row() const { return m_bytes_per_row; }
size_t bytes_per_group() const { return m_bytes_per_group; }
void set_bytes_per_group(size_t);
size_t groups_per_row() const { return m_groups_per_row; }
void set_groups_per_row(size_t);
size_t bytes_per_row() const { return m_groups_per_row * m_bytes_per_group; }
// FIXME: Deprecated! Set bytes_per_group or groups_per_row instead
void set_bytes_per_row(size_t);
void set_position(size_t position);
@ -88,7 +93,8 @@ protected:
private:
size_t m_line_spacing { 4 };
size_t m_content_length { 0 };
size_t m_bytes_per_row { 16 };
size_t m_bytes_per_group { 4 };
size_t m_groups_per_row { 4 };
bool m_in_drag_select { false };
Selection m_selection;
size_t m_position { 0 };
@ -107,14 +113,14 @@ private:
void scroll_position_into_view(size_t position);
size_t total_rows() const { return ceil_div(m_content_length, m_bytes_per_row); }
size_t total_rows() const { return ceil_div(m_content_length, bytes_per_row()); }
size_t line_height() const { return font().pixel_size_rounded_up() + m_line_spacing; }
size_t character_width() const { return font().glyph_fixed_width(); }
size_t cell_width() const { return character_width() * 3; }
int offset_area_width() const { return m_padding + font().width_rounded_up("0X12345678"sv) + m_padding; }
int hex_area_width() const { return m_padding + m_bytes_per_row * cell_width() + m_padding; }
int text_area_width() const { return m_padding + m_bytes_per_row * character_width() + m_padding; }
int hex_area_width() const { return m_padding + bytes_per_row() * cell_width() + m_padding; }
int text_area_width() const { return m_padding + bytes_per_row() * character_width() + m_padding; }
struct OffsetData {
size_t offset;