mirror of
https://github.com/nushell/nushell.git
synced 2024-11-22 08:23:24 +01:00
explore
cleanup: remove+move binary viewer config (#12920)
Small change, removing 4 more configuration options from `explore`'s binary viewer: 1. `show_index` 2. `show_data` 3. `show_ascii` 4. `show_split` These controlled whether the 3 columns in the binary viewer (index, hex data, ASCII) and the pipe separator (`|`) in between them are shown. I don't think we need this level of configurability until the `explore` command is more mature, and maybe even not then; we can just show them all. I think it's very unlikely that anyone is using these configuration points. Also, the row offset (e.g. how many rows we have scrolled down) was being stored in config/settings when it's arguably not config; more like internal state of the binary viewer. I moved it to a more appropriate location and renamed it.
This commit is contained in:
parent
58cf0c56f8
commit
c7097ca937
@ -20,11 +20,17 @@ pub struct BinaryWidget<'a> {
|
|||||||
data: &'a [u8],
|
data: &'a [u8],
|
||||||
opts: BinarySettings,
|
opts: BinarySettings,
|
||||||
style: BinaryStyle,
|
style: BinaryStyle,
|
||||||
|
row_offset: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> BinaryWidget<'a> {
|
impl<'a> BinaryWidget<'a> {
|
||||||
pub fn new(data: &'a [u8], opts: BinarySettings, style: BinaryStyle) -> Self {
|
pub fn new(data: &'a [u8], opts: BinarySettings, style: BinaryStyle) -> Self {
|
||||||
Self { data, opts, style }
|
Self {
|
||||||
|
data,
|
||||||
|
opts,
|
||||||
|
style,
|
||||||
|
row_offset: 0,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn count_lines(&self) -> usize {
|
pub fn count_lines(&self) -> usize {
|
||||||
@ -35,37 +41,22 @@ impl<'a> BinaryWidget<'a> {
|
|||||||
self.opts.count_segments * self.opts.segment_size
|
self.opts.count_segments * self.opts.segment_size
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_index_offset(&mut self, offset: usize) {
|
pub fn set_row_offset(&mut self, offset: usize) {
|
||||||
self.opts.index_offset = offset;
|
self.row_offset = offset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct BinarySettings {
|
pub struct BinarySettings {
|
||||||
disable_index: bool,
|
|
||||||
disable_ascii: bool,
|
|
||||||
disable_data: bool,
|
|
||||||
segment_size: usize,
|
segment_size: usize,
|
||||||
count_segments: usize,
|
count_segments: usize,
|
||||||
index_offset: usize,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BinarySettings {
|
impl BinarySettings {
|
||||||
pub fn new(
|
pub fn new(segment_size: usize, count_segments: usize) -> Self {
|
||||||
disable_index: bool,
|
|
||||||
disable_ascii: bool,
|
|
||||||
disable_data: bool,
|
|
||||||
segment_size: usize,
|
|
||||||
count_segments: usize,
|
|
||||||
index_offset: usize,
|
|
||||||
) -> Self {
|
|
||||||
Self {
|
Self {
|
||||||
disable_index,
|
|
||||||
disable_ascii,
|
|
||||||
disable_data,
|
|
||||||
segment_size,
|
segment_size,
|
||||||
count_segments,
|
count_segments,
|
||||||
index_offset,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -75,7 +66,6 @@ pub struct BinaryStyle {
|
|||||||
color_index: Option<NuStyle>,
|
color_index: Option<NuStyle>,
|
||||||
column_padding_left: u16,
|
column_padding_left: u16,
|
||||||
column_padding_right: u16,
|
column_padding_right: u16,
|
||||||
show_split: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BinaryStyle {
|
impl BinaryStyle {
|
||||||
@ -83,13 +73,11 @@ impl BinaryStyle {
|
|||||||
color_index: Option<NuStyle>,
|
color_index: Option<NuStyle>,
|
||||||
column_padding_left: u16,
|
column_padding_left: u16,
|
||||||
column_padding_right: u16,
|
column_padding_right: u16,
|
||||||
show_split: bool,
|
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
color_index,
|
color_index,
|
||||||
column_padding_left,
|
column_padding_left,
|
||||||
column_padding_right,
|
column_padding_right,
|
||||||
show_split,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -102,10 +90,6 @@ impl Widget for BinaryWidget<'_> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.opts.disable_index && self.opts.disable_data && self.opts.disable_ascii {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
render_hexdump(area, buf, self);
|
render_hexdump(area, buf, self);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -114,11 +98,6 @@ impl Widget for BinaryWidget<'_> {
|
|||||||
fn render_hexdump(area: Rect, buf: &mut Buffer, w: BinaryWidget) {
|
fn render_hexdump(area: Rect, buf: &mut Buffer, w: BinaryWidget) {
|
||||||
const MIN_INDEX_SIZE: usize = 8;
|
const MIN_INDEX_SIZE: usize = 8;
|
||||||
|
|
||||||
let show_index = !w.opts.disable_index;
|
|
||||||
let show_data = !w.opts.disable_data;
|
|
||||||
let show_ascii = !w.opts.disable_ascii;
|
|
||||||
let show_split = w.style.show_split;
|
|
||||||
|
|
||||||
let index_width = get_max_index_size(&w).max(MIN_INDEX_SIZE) as u16; // safe as it's checked before hand that we have enough space
|
let index_width = get_max_index_size(&w).max(MIN_INDEX_SIZE) as u16; // safe as it's checked before hand that we have enough space
|
||||||
|
|
||||||
let mut last_line = None;
|
let mut last_line = None;
|
||||||
@ -126,7 +105,7 @@ fn render_hexdump(area: Rect, buf: &mut Buffer, w: BinaryWidget) {
|
|||||||
for line in 0..area.height {
|
for line in 0..area.height {
|
||||||
let data_line_length = w.opts.count_segments * w.opts.segment_size;
|
let data_line_length = w.opts.count_segments * w.opts.segment_size;
|
||||||
let start_index = line as usize * data_line_length;
|
let start_index = line as usize * data_line_length;
|
||||||
let address = w.opts.index_offset + start_index;
|
let address = w.row_offset + start_index;
|
||||||
|
|
||||||
if start_index > w.data.len() {
|
if start_index > w.data.len() {
|
||||||
last_line = Some(line);
|
last_line = Some(line);
|
||||||
@ -137,31 +116,24 @@ fn render_hexdump(area: Rect, buf: &mut Buffer, w: BinaryWidget) {
|
|||||||
let y = line;
|
let y = line;
|
||||||
let line = &w.data[start_index..];
|
let line = &w.data[start_index..];
|
||||||
|
|
||||||
if show_index {
|
// index column
|
||||||
x += render_space(buf, x, y, 1, w.style.column_padding_left);
|
x += render_space(buf, x, y, 1, w.style.column_padding_left);
|
||||||
x += render_hex_usize(buf, x, y, address, index_width, get_index_style(&w));
|
x += render_hex_usize(buf, x, y, address, index_width, get_index_style(&w));
|
||||||
x += render_space(buf, x, y, 1, w.style.column_padding_right);
|
x += render_space(buf, x, y, 1, w.style.column_padding_right);
|
||||||
}
|
|
||||||
|
|
||||||
if show_split {
|
x += render_vertical_split(buf, x, y);
|
||||||
x += render_split(buf, x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
if show_data {
|
// data/hex column
|
||||||
x += render_space(buf, x, y, 1, w.style.column_padding_left);
|
x += render_space(buf, x, y, 1, w.style.column_padding_left);
|
||||||
x += render_data_line(buf, x, y, line, &w);
|
x += render_data_line(buf, x, y, line, &w);
|
||||||
x += render_space(buf, x, y, 1, w.style.column_padding_right);
|
x += render_space(buf, x, y, 1, w.style.column_padding_right);
|
||||||
}
|
|
||||||
|
|
||||||
if show_split {
|
x += render_vertical_split(buf, x, y);
|
||||||
x += render_split(buf, x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
if show_ascii {
|
// ASCII column
|
||||||
x += render_space(buf, x, y, 1, w.style.column_padding_left);
|
x += render_space(buf, x, y, 1, w.style.column_padding_left);
|
||||||
x += render_ascii_line(buf, x, y, line, &w);
|
x += render_ascii_line(buf, x, y, line, &w);
|
||||||
render_space(buf, x, y, 1, w.style.column_padding_right);
|
render_space(buf, x, y, 1, w.style.column_padding_right);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let data_line_size = (w.opts.count_segments * (w.opts.segment_size * 2)
|
let data_line_size = (w.opts.count_segments * (w.opts.segment_size * 2)
|
||||||
@ -172,36 +144,29 @@ fn render_hexdump(area: Rect, buf: &mut Buffer, w: BinaryWidget) {
|
|||||||
for line in last_line..area.height {
|
for line in last_line..area.height {
|
||||||
let data_line_length = w.opts.count_segments * w.opts.segment_size;
|
let data_line_length = w.opts.count_segments * w.opts.segment_size;
|
||||||
let start_index = line as usize * data_line_length;
|
let start_index = line as usize * data_line_length;
|
||||||
let address = w.opts.index_offset + start_index;
|
let address = w.row_offset + start_index;
|
||||||
|
|
||||||
let mut x = 0;
|
let mut x = 0;
|
||||||
let y = line;
|
let y = line;
|
||||||
|
|
||||||
if show_index {
|
// index column
|
||||||
x += render_space(buf, x, y, 1, w.style.column_padding_left);
|
x += render_space(buf, x, y, 1, w.style.column_padding_left);
|
||||||
x += render_hex_usize(buf, x, y, address, index_width, get_index_style(&w));
|
x += render_hex_usize(buf, x, y, address, index_width, get_index_style(&w));
|
||||||
x += render_space(buf, x, y, 1, w.style.column_padding_right);
|
x += render_space(buf, x, y, 1, w.style.column_padding_right);
|
||||||
}
|
|
||||||
|
|
||||||
if show_split {
|
x += render_vertical_split(buf, x, y);
|
||||||
x += render_split(buf, x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
if show_data {
|
// data/hex column
|
||||||
x += render_space(buf, x, y, 1, w.style.column_padding_left);
|
x += render_space(buf, x, y, 1, w.style.column_padding_left);
|
||||||
x += render_space(buf, x, y, 1, data_line_size);
|
x += render_space(buf, x, y, 1, data_line_size);
|
||||||
x += render_space(buf, x, y, 1, w.style.column_padding_right);
|
x += render_space(buf, x, y, 1, w.style.column_padding_right);
|
||||||
}
|
|
||||||
|
|
||||||
if show_split {
|
x += render_vertical_split(buf, x, y);
|
||||||
x += render_split(buf, x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
if show_ascii {
|
// ASCII column
|
||||||
x += render_space(buf, x, y, 1, w.style.column_padding_left);
|
x += render_space(buf, x, y, 1, w.style.column_padding_left);
|
||||||
x += render_space(buf, x, y, 1, ascii_line_size);
|
x += render_space(buf, x, y, 1, ascii_line_size);
|
||||||
render_space(buf, x, y, 1, w.style.column_padding_right);
|
render_space(buf, x, y, 1, w.style.column_padding_right);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -336,12 +301,15 @@ fn get_index_style(w: &BinaryWidget) -> Option<NuStyle> {
|
|||||||
w.style.color_index
|
w.style.color_index
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_space(buf: &mut Buffer, x: u16, y: u16, height: u16, padding: u16) -> u16 {
|
/// Render blank characters starting at the given position, going right `width` characters and down `height` characters.
|
||||||
repeat_vertical(buf, x, y, padding, height, ' ', TextStyle::default());
|
/// Returns `width` for convenience.
|
||||||
padding
|
fn render_space(buf: &mut Buffer, x: u16, y: u16, height: u16, width: u16) -> u16 {
|
||||||
|
repeat_vertical(buf, x, y, width, height, ' ', TextStyle::default());
|
||||||
|
width
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_split(buf: &mut Buffer, x: u16, y: u16) -> u16 {
|
/// Render a vertical split (│) at the given position. Returns the width of the split (always 1) for convenience.
|
||||||
|
fn render_vertical_split(buf: &mut Buffer, x: u16, y: u16) -> u16 {
|
||||||
repeat_vertical(buf, x, y, 1, 1, '│', TextStyle::default());
|
repeat_vertical(buf, x, y, 1, 1, '│', TextStyle::default());
|
||||||
1
|
1
|
||||||
}
|
}
|
||||||
@ -369,7 +337,7 @@ fn repeat_vertical(
|
|||||||
fn get_max_index_size(w: &BinaryWidget) -> usize {
|
fn get_max_index_size(w: &BinaryWidget) -> usize {
|
||||||
let line_size = w.opts.count_segments * (w.opts.segment_size * 2);
|
let line_size = w.opts.count_segments * (w.opts.segment_size * 2);
|
||||||
let count_lines = w.data.len() / line_size;
|
let count_lines = w.data.len() / line_size;
|
||||||
let max_index = w.opts.index_offset + count_lines * line_size;
|
let max_index = w.row_offset + count_lines * line_size;
|
||||||
usize_to_hex(max_index, 0).len()
|
usize_to_hex(max_index, 0).len()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -379,7 +347,7 @@ fn get_widget_width(w: &BinaryWidget) -> usize {
|
|||||||
let line_size = w.opts.count_segments * (w.opts.segment_size * 2);
|
let line_size = w.opts.count_segments * (w.opts.segment_size * 2);
|
||||||
let count_lines = w.data.len() / line_size;
|
let count_lines = w.data.len() / line_size;
|
||||||
|
|
||||||
let max_index = w.opts.index_offset + count_lines * line_size;
|
let max_index = w.row_offset + count_lines * line_size;
|
||||||
let index_size = usize_to_hex(max_index, 0).len();
|
let index_size = usize_to_hex(max_index, 0).len();
|
||||||
let index_size = index_size.max(MIN_INDEX_SIZE);
|
let index_size = index_size.max(MIN_INDEX_SIZE);
|
||||||
|
|
||||||
@ -388,17 +356,16 @@ fn get_widget_width(w: &BinaryWidget) -> usize {
|
|||||||
|
|
||||||
let ascii_size = w.opts.count_segments * w.opts.segment_size;
|
let ascii_size = w.opts.count_segments * w.opts.segment_size;
|
||||||
|
|
||||||
let split = w.style.show_split as usize;
|
|
||||||
#[allow(clippy::identity_op)]
|
#[allow(clippy::identity_op)]
|
||||||
let min_width = 0
|
let min_width = 0
|
||||||
+ w.style.column_padding_left as usize
|
+ w.style.column_padding_left as usize
|
||||||
+ index_size
|
+ index_size
|
||||||
+ w.style.column_padding_right as usize
|
+ w.style.column_padding_right as usize
|
||||||
+ split
|
+ 1 // split
|
||||||
+ w.style.column_padding_left as usize
|
+ w.style.column_padding_left as usize
|
||||||
+ data_size
|
+ data_size
|
||||||
+ w.style.column_padding_right as usize
|
+ w.style.column_padding_right as usize
|
||||||
+ split
|
+ 1 //split
|
||||||
+ w.style.column_padding_left as usize
|
+ w.style.column_padding_left as usize
|
||||||
+ ascii_size
|
+ ascii_size
|
||||||
+ w.style.column_padding_right as usize;
|
+ w.style.column_padding_right as usize;
|
||||||
|
@ -107,7 +107,7 @@ fn create_binary_widget(v: &BinaryView) -> BinaryWidget<'_> {
|
|||||||
let data = &v.data[index..];
|
let data = &v.data[index..];
|
||||||
|
|
||||||
let mut w = BinaryWidget::new(data, v.settings.opts, v.settings.style.clone());
|
let mut w = BinaryWidget::new(data, v.settings.opts, v.settings.style.clone());
|
||||||
w.set_index_offset(index);
|
w.set_row_offset(index);
|
||||||
|
|
||||||
w
|
w
|
||||||
}
|
}
|
||||||
@ -184,29 +184,17 @@ fn settings_from_config(config: &ConfigMap) -> Settings {
|
|||||||
|
|
||||||
Settings {
|
Settings {
|
||||||
opts: BinarySettings::new(
|
opts: BinarySettings::new(
|
||||||
!config_get_bool(config, "show_index", true),
|
|
||||||
!config_get_bool(config, "show_ascii", true),
|
|
||||||
!config_get_bool(config, "show_data", true),
|
|
||||||
config_get_usize(config, "segment_size", 2),
|
config_get_usize(config, "segment_size", 2),
|
||||||
config_get_usize(config, "count_segments", 8),
|
config_get_usize(config, "count_segments", 8),
|
||||||
0,
|
|
||||||
),
|
),
|
||||||
style: BinaryStyle::new(
|
style: BinaryStyle::new(
|
||||||
colors.get("color_index").cloned(),
|
colors.get("color_index").cloned(),
|
||||||
config_get_usize(config, "column_padding_left", 1) as u16,
|
config_get_usize(config, "column_padding_left", 1) as u16,
|
||||||
config_get_usize(config, "column_padding_right", 1) as u16,
|
config_get_usize(config, "column_padding_right", 1) as u16,
|
||||||
config_get_bool(config, "split", false),
|
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn config_get_bool(config: &ConfigMap, key: &str, default: bool) -> bool {
|
|
||||||
config
|
|
||||||
.get(key)
|
|
||||||
.and_then(|v| v.as_bool().ok())
|
|
||||||
.unwrap_or(default)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn config_get_usize(config: &ConfigMap, key: &str, default: usize) -> usize {
|
fn config_get_usize(config: &ConfigMap, key: &str, default: usize) -> usize {
|
||||||
config
|
config
|
||||||
.get(key)
|
.get(key)
|
||||||
|
Loading…
Reference in New Issue
Block a user