HexView

Struct HexView 

Source
pub struct HexView { /* private fields */ }
Expand description

Hexadecimal viewer.

This is a classic hexview which can be used to view and manipulate data which resides inside this struct. There are severeal states in which the view can be operatered, see DisplayState. You should consider the corresponding method docs for each state.

§Examples

extern crate cursive;
extern crate cursive_hexview;

use cursive_hexview::{DisplayState,HexView};

fn main() {
    let view = HexView::new().display_state(DisplayState::Editable);
    let mut cur = cursive::dummy();

    cur.add_layer(cursive::views::Dialog::around(view).title("HexView"));

    // cur.run();
}

Implementations§

Source§

impl HexView

Source

pub fn new() -> Self

Creates a new, default HexView with an empty databuffer and disabled state.

§Examples
let view = HexView::new();
Examples found in repository?
examples/default.rs (line 10)
7fn main() {
8    let mut cur = cursive::default();
9    let explanation = TextView::new("Use the keys + - ↑ ↓ ← → 0-9 a-f for the HexView.\nUse q to exit.");
10    let view = HexView::new().display_state(DisplayState::Editable);
11
12    cur.add_layer(
13        Dialog::around(LinearLayout::vertical().child(explanation).child(DummyView).child(view)).title("HexView"),
14    );
15    cur.add_global_callback('q', |cur| cur.quit());
16    cur.run();
17}
Source

pub fn new_from_iter<B: Borrow<u8>, I: IntoIterator<Item = B>>(data: I) -> Self

Crates a new HexView with the given data and disabled state.

§Examples

With data from a Vec:

let view = HexView::new_from_iter(vec![3, 6, 1, 8, 250]);

With data from a byte string literal:

let view = HexView::new_from_iter(b"Hello, World!");

Or with a slice

let view = HexView::new_from_iter(&[5, 6, 2, 89]);
Examples found in repository?
examples/hexdump.rs (line 26)
18fn main() {
19    let arg = env::args()
20        .nth(1)
21        .expect("Please provide the file to read from as first argument");
22    let path = Path::new(&arg);
23
24    let mut cur = cursive::default();
25    let explanation = TextView::new("Use the keys ↑ ↓ ← → to navigate around.\nUse q to exit.");
26    let view = HexView::new_from_iter(read_file(path).expect("Cannot read file")).display_state(DisplayState::Enabled);
27
28    cur.add_layer(
29        Dialog::around(LinearLayout::vertical().child(explanation).child(DummyView).child(view)).title("HexView"),
30    );
31    cur.add_global_callback('q', |cur| cur.quit());
32    cur.run();
33}
More examples
Hide additional examples
examples/config.rs (line 13)
7fn main() {
8    let mut cur = cursive::default();
9    let explanation = TextView::new("Use the keys + - ↑ ↓ ← → 0-9 a-f for the HexView.\nUse q to exit.");
10    let data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".as_bytes();
11
12    //A view with implicit default config
13    let view1 = HexView::new_from_iter(data).display_state(DisplayState::Editable);
14
15    //A view with a single config change, everything else default, chainable version
16    let config = HexViewConfig {
17        hex_ascii_separator: " - ",
18        ..Default::default()
19    };
20    let view2 = HexView::new_from_iter(data)
21        .config(config)
22        .display_state(DisplayState::Editable);
23
24    //A view with several config changes, non chainable version
25    let mut view3 = HexView::new_from_iter(data).display_state(DisplayState::Editable);
26    let config2 = HexViewConfig {
27        bytes_per_line: 8,
28        bytes_per_group: 4,
29        byte_group_separator: "     ",
30        show_ascii: false,
31        ..Default::default()
32    };
33    view3.set_config(config2);
34
35    cur.add_layer(
36        Dialog::around(
37            LinearLayout::vertical()
38                .child(explanation)
39                .child(DummyView)
40                .child(view1)
41                .child(DummyView)
42                .child(view2)
43                .child(DummyView)
44                .child(view3),
45        )
46        .title("HexView"),
47    );
48    cur.add_global_callback('q', |cur| cur.quit());
49    cur.run();
50}
Source

pub fn set_config(&mut self, config: HexViewConfig)

This function allows the customization of the HexView output.

For options and explanation of every possible option, see the HexViewConfig struct.

#Examples

let mut view = HexView::new();
view.set_config(HexViewConfig {
    bytes_per_line: 8,
    ..Default::default()
});
Examples found in repository?
examples/config.rs (line 33)
7fn main() {
8    let mut cur = cursive::default();
9    let explanation = TextView::new("Use the keys + - ↑ ↓ ← → 0-9 a-f for the HexView.\nUse q to exit.");
10    let data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".as_bytes();
11
12    //A view with implicit default config
13    let view1 = HexView::new_from_iter(data).display_state(DisplayState::Editable);
14
15    //A view with a single config change, everything else default, chainable version
16    let config = HexViewConfig {
17        hex_ascii_separator: " - ",
18        ..Default::default()
19    };
20    let view2 = HexView::new_from_iter(data)
21        .config(config)
22        .display_state(DisplayState::Editable);
23
24    //A view with several config changes, non chainable version
25    let mut view3 = HexView::new_from_iter(data).display_state(DisplayState::Editable);
26    let config2 = HexViewConfig {
27        bytes_per_line: 8,
28        bytes_per_group: 4,
29        byte_group_separator: "     ",
30        show_ascii: false,
31        ..Default::default()
32    };
33    view3.set_config(config2);
34
35    cur.add_layer(
36        Dialog::around(
37            LinearLayout::vertical()
38                .child(explanation)
39                .child(DummyView)
40                .child(view1)
41                .child(DummyView)
42                .child(view2)
43                .child(DummyView)
44                .child(view3),
45        )
46        .title("HexView"),
47    );
48    cur.add_global_callback('q', |cur| cur.quit());
49    cur.run();
50}
Source

pub fn config(self, config: HexViewConfig) -> Self

Examples found in repository?
examples/config.rs (line 21)
7fn main() {
8    let mut cur = cursive::default();
9    let explanation = TextView::new("Use the keys + - ↑ ↓ ← → 0-9 a-f for the HexView.\nUse q to exit.");
10    let data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".as_bytes();
11
12    //A view with implicit default config
13    let view1 = HexView::new_from_iter(data).display_state(DisplayState::Editable);
14
15    //A view with a single config change, everything else default, chainable version
16    let config = HexViewConfig {
17        hex_ascii_separator: " - ",
18        ..Default::default()
19    };
20    let view2 = HexView::new_from_iter(data)
21        .config(config)
22        .display_state(DisplayState::Editable);
23
24    //A view with several config changes, non chainable version
25    let mut view3 = HexView::new_from_iter(data).display_state(DisplayState::Editable);
26    let config2 = HexViewConfig {
27        bytes_per_line: 8,
28        bytes_per_group: 4,
29        byte_group_separator: "     ",
30        show_ascii: false,
31        ..Default::default()
32    };
33    view3.set_config(config2);
34
35    cur.add_layer(
36        Dialog::around(
37            LinearLayout::vertical()
38                .child(explanation)
39                .child(DummyView)
40                .child(view1)
41                .child(DummyView)
42                .child(view2)
43                .child(DummyView)
44                .child(view3),
45        )
46        .title("HexView"),
47    );
48    cur.add_global_callback('q', |cur| cur.quit());
49    cur.run();
50}
Source

pub fn data(&self) -> &[u8]

Returns a reference to the internal data.

§Examples
let data = vec![3, 4, 9, 1];
let view = HexView::new_from_iter(&data);
assert_eq!(view.data(), &data);
Source

pub fn set_data<B: Borrow<u8>, I: IntoIterator<Item = B>>(&mut self, data: I)

Sets the data during the lifetime of this instance.

For insance to update the data due to an external event.

let mut view = HexView::new();
view.set_data(b"Hello, World!".to_owned().iter());
Source

pub fn display_state(self, state: DisplayState) -> Self

Examples found in repository?
examples/default.rs (line 10)
7fn main() {
8    let mut cur = cursive::default();
9    let explanation = TextView::new("Use the keys + - ↑ ↓ ← → 0-9 a-f for the HexView.\nUse q to exit.");
10    let view = HexView::new().display_state(DisplayState::Editable);
11
12    cur.add_layer(
13        Dialog::around(LinearLayout::vertical().child(explanation).child(DummyView).child(view)).title("HexView"),
14    );
15    cur.add_global_callback('q', |cur| cur.quit());
16    cur.run();
17}
More examples
Hide additional examples
examples/hexdump.rs (line 26)
18fn main() {
19    let arg = env::args()
20        .nth(1)
21        .expect("Please provide the file to read from as first argument");
22    let path = Path::new(&arg);
23
24    let mut cur = cursive::default();
25    let explanation = TextView::new("Use the keys ↑ ↓ ← → to navigate around.\nUse q to exit.");
26    let view = HexView::new_from_iter(read_file(path).expect("Cannot read file")).display_state(DisplayState::Enabled);
27
28    cur.add_layer(
29        Dialog::around(LinearLayout::vertical().child(explanation).child(DummyView).child(view)).title("HexView"),
30    );
31    cur.add_global_callback('q', |cur| cur.quit());
32    cur.run();
33}
examples/config.rs (line 13)
7fn main() {
8    let mut cur = cursive::default();
9    let explanation = TextView::new("Use the keys + - ↑ ↓ ← → 0-9 a-f for the HexView.\nUse q to exit.");
10    let data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".as_bytes();
11
12    //A view with implicit default config
13    let view1 = HexView::new_from_iter(data).display_state(DisplayState::Editable);
14
15    //A view with a single config change, everything else default, chainable version
16    let config = HexViewConfig {
17        hex_ascii_separator: " - ",
18        ..Default::default()
19    };
20    let view2 = HexView::new_from_iter(data)
21        .config(config)
22        .display_state(DisplayState::Editable);
23
24    //A view with several config changes, non chainable version
25    let mut view3 = HexView::new_from_iter(data).display_state(DisplayState::Editable);
26    let config2 = HexViewConfig {
27        bytes_per_line: 8,
28        bytes_per_group: 4,
29        byte_group_separator: "     ",
30        show_ascii: false,
31        ..Default::default()
32    };
33    view3.set_config(config2);
34
35    cur.add_layer(
36        Dialog::around(
37            LinearLayout::vertical()
38                .child(explanation)
39                .child(DummyView)
40                .child(view1)
41                .child(DummyView)
42                .child(view2)
43                .child(DummyView)
44                .child(view3),
45        )
46        .title("HexView"),
47    );
48    cur.add_global_callback('q', |cur| cur.quit());
49    cur.run();
50}
Source

pub fn set_display_state(&mut self, state: DisplayState)

Sets the state of the view to one of the variants from DisplayState.

This will alter the behavior of the view accrodingly to the set state.

If the state is set to Disabled this view can neither be focused nor edited. If the state is set to Enabled it can be focused and the cursor can be moved around, but no data can be altered. If set to Editable this view behaves like Enabled but the data can be altered.

§Note

This has nothing to do with rusts type system, which means even when this instance is set to Disabled you still can alter the data through set_data but you cannot alter it with the keyboard commands (+, -, #hexvalue).

§Examples
let view = HexView::new().display_state(DisplayState::Editable);
Source

pub fn len(&self) -> usize

Returns the length of the data.

§Examples
let view = HexView::new_from_iter(vec![0, 1, 2, 3]);
assert_eq!(4, view.len());
Source

pub fn is_empty(&self) -> bool

Checks whether the data is empty.

§Examples
let view = HexView::new();
assert!(view.is_empty());
let view = HexView::new_from_iter(b"ABC");
assert!(!view.is_empty());
Source

pub fn set_len(&mut self, length: usize)

Sets the length of the data which this view displays.

If the new length is greater than the current one, 0’s will be appended to the data. If the new length is less than the current one, the data will be truncated and is lost.

§Examples
let mut view = HexView::new();
view.set_len(3);

assert_eq!(view.len(), 3);
assert_eq!(view.data(), &vec![0u8, 0u8, 0u8]);

Trait Implementations§

Source§

impl Default for HexView

Source§

fn default() -> Self

Creates a new, default HexView with an empty databuffer and disabled state.

Source§

impl View for HexView

Source§

fn on_event(&mut self, event: Event) -> EventResult

Called when an event is received (key press, mouse event, …). Read more
Source§

fn required_size(&mut self, _: Vec2) -> Vec2

Returns the minimum size the view requires with the given restrictions. Read more
Source§

fn draw(&self, printer: &Printer<'_, '_>)

Draws the view with the given printer (includes bounds) and focus. Read more
Source§

fn take_focus(&mut self, _: Direction) -> Result<EventResult, CannotFocus>

Attempt to give this view the focus. Read more
Source§

fn layout(&mut self, _: XY<usize>)

Called once the size for this view has been decided. Read more
Source§

fn needs_relayout(&self) -> bool

Should return true if the view content changed since the last call to layout(). Read more
Source§

fn call_on_any( &mut self, _: &Selector<'_>, _: &mut dyn FnMut(&mut (dyn View + 'static)), )

Runs a closure on the view identified by the given selector. Read more
Source§

fn focus_view(&mut self, _: &Selector<'_>) -> Result<EventResult, ViewNotFound>

Moves the focus to the view identified by the given selector. Read more
Source§

fn important_area(&self, view_size: XY<usize>) -> Rect

What part of the view is important and should be visible? Read more
Source§

fn type_name(&self) -> &'static str

Returns the type of this view. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> AnyView for T
where T: View,

Source§

fn as_any(&self) -> &(dyn Any + 'static)

Downcast self to a Any.

Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Downcast self to a mutable Any.

Source§

fn as_boxed_any(self: Box<T>) -> Box<dyn Any>

Returns a boxed any from a boxed self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Finder for T
where T: View,

Source§

fn call_on_all<V, F>(&mut self, sel: &Selector<'_>, callback: F)
where V: View, F: FnMut(&mut V),

Runs a callback on all views identified by sel. Read more
Source§

fn call_on<V, F, R>(&mut self, sel: &Selector<'_>, callback: F) -> Option<R>
where V: View, F: FnOnce(&mut V) -> R,

Runs a callback on the view identified by sel. Read more
Source§

fn call_on_name<V, F, R>(&mut self, name: &str, callback: F) -> Option<R>
where V: View, F: FnOnce(&mut V) -> R,

Convenient method to use call_on with a view::Selector::Name.
Source§

fn find_name<V>( &mut self, name: &str, ) -> Option<OwningHandle<OwningRef<Rc<RefCell<V>>, RefCell<V>>, RefMut<'static, V>>>
where V: View,

Convenient method to find a view wrapped in an NamedView.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoBoxedView for T
where T: View,

Source§

fn into_boxed_view(self) -> Box<dyn View>

Returns a Box<View>.
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Nameable for T
where T: View,

Source§

fn with_name<S>(self, name: S) -> NamedView<Self>
where S: Into<String>,

Wraps this view into an NamedView with the given id. Read more
Source§

impl<T> Resizable for T
where T: View,

Source§

fn resized( self, width: SizeConstraint, height: SizeConstraint, ) -> ResizedView<Self>

Wraps self in a ResizedView with the given size constraints.
Source§

fn fixed_size<S>(self, size: S) -> ResizedView<Self>
where S: Into<XY<usize>>,

Wraps self into a fixed-size ResizedView.
Source§

fn fixed_width(self, width: usize) -> ResizedView<Self>

Wraps self into a fixed-width ResizedView.
Source§

fn fixed_height(self, height: usize) -> ResizedView<Self>

Wraps self into a fixed-width ResizedView.
Source§

fn full_screen(self) -> ResizedView<Self>

Wraps self into a full-screen ResizedView.
Source§

fn full_width(self) -> ResizedView<Self>

Wraps self into a full-width ResizedView.
Source§

fn full_height(self) -> ResizedView<Self>

Wraps self into a full-height ResizedView.
Source§

fn max_size<S>(self, size: S) -> ResizedView<Self>
where S: Into<XY<usize>>,

Wraps self into a limited-size ResizedView.
Source§

fn max_width(self, max_width: usize) -> ResizedView<Self>

Wraps self into a limited-width ResizedView.
Source§

fn max_height(self, max_height: usize) -> ResizedView<Self>

Wraps self into a limited-height ResizedView.
Source§

fn min_size<S>(self, size: S) -> ResizedView<Self>
where S: Into<XY<usize>>,

Wraps self into a ResizedView at least sized size.
Source§

fn min_width(self, min_width: usize) -> ResizedView<Self>

Wraps self in a ResizedView at least min_width wide.
Source§

fn min_height(self, min_height: usize) -> ResizedView<Self>

Wraps self in a ResizedView at least min_height tall.
Source§

impl<T> Scrollable for T
where T: View,

Source§

fn scrollable(self) -> ScrollView<Self>

Wraps self in a ScrollView.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> With for T

Source§

fn wrap_with<U, F>(self, f: F) -> U
where F: FnOnce(Self) -> U,

Calls the given closure and return the result. Read more
Source§

fn with<F>(self, f: F) -> Self
where F: FnOnce(&mut Self),

Calls the given closure on self.
Source§

fn try_with<E, F>(self, f: F) -> Result<Self, E>
where F: FnOnce(&mut Self) -> Result<(), E>,

Calls the given closure on self.
Source§

fn with_if<F>(self, condition: bool, f: F) -> Self
where F: FnOnce(&mut Self),

Calls the given closure if condition == true.
Source§

impl<T> Erased for T