mirror of
https://github.com/FliegendeWurst/cursive.git
synced 2024-11-23 17:35:00 +00:00
Add more examples
This commit is contained in:
parent
a9cbcad4d4
commit
5bf6f952d1
@ -16,10 +16,13 @@ use crate::XY;
|
|||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
/// # use cursive::views::{BoxView,TextView};
|
/// use cursive::views::{BoxView, TextView};
|
||||||
|
///
|
||||||
/// // Creates a 20x4 BoxView with a TextView content.
|
/// // Creates a 20x4 BoxView with a TextView content.
|
||||||
/// let view = BoxView::with_fixed_size((20,4), TextView::new("Hello!"));
|
/// let view = BoxView::with_fixed_size((20,4), TextView::new("Hello!"));
|
||||||
/// ```
|
/// ```
|
||||||
|
///
|
||||||
|
/// See also [`Boxable`](crate::view::Boxable) for an easy way to wrap any view.
|
||||||
pub struct BoxView<T: View> {
|
pub struct BoxView<T: View> {
|
||||||
/// Constraint on each axis
|
/// Constraint on each axis
|
||||||
size: XY<SizeConstraint>,
|
size: XY<SizeConstraint>,
|
||||||
|
@ -15,7 +15,8 @@ use unicode_width::UnicodeWidthStr;
|
|||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
/// # use cursive::views::Button;
|
/// use cursive::views::Button;
|
||||||
|
///
|
||||||
/// let quit_button = Button::new("Quit", |s| s.quit());
|
/// let quit_button = Button::new("Quit", |s| s.quit());
|
||||||
/// ```
|
/// ```
|
||||||
pub struct Button {
|
pub struct Button {
|
||||||
@ -39,6 +40,14 @@ impl Button {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a new button without angle brackets.
|
/// Creates a new button without angle brackets.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use cursive::views::Button;
|
||||||
|
///
|
||||||
|
/// let button = Button::new_raw("[ Quit ]", |s| s.quit());
|
||||||
|
/// ```
|
||||||
pub fn new_raw<F, S: Into<String>>(label: S, cb: F) -> Self
|
pub fn new_raw<F, S: Into<String>>(label: S, cb: F) -> Self
|
||||||
where
|
where
|
||||||
F: 'static + Fn(&mut Cursive),
|
F: 'static + Fn(&mut Cursive),
|
||||||
@ -109,6 +118,15 @@ impl Button {
|
|||||||
/// Sets the label to the given value.
|
/// Sets the label to the given value.
|
||||||
///
|
///
|
||||||
/// This will include brackets.
|
/// This will include brackets.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use cursive::views::Button;
|
||||||
|
///
|
||||||
|
/// let mut button = Button::new("Quit", |s| s.quit());
|
||||||
|
/// button.set_label("Escape");
|
||||||
|
/// ```
|
||||||
pub fn set_label<S>(&mut self, label: S)
|
pub fn set_label<S>(&mut self, label: S)
|
||||||
where
|
where
|
||||||
S: Into<String>,
|
S: Into<String>,
|
||||||
|
@ -12,6 +12,40 @@ type CallOnAny<T> = Box<dyn for<'a> FnMut(&mut T, &Selector, AnyCb<'a>)>;
|
|||||||
/// A blank view that forwards calls to closures.
|
/// A blank view that forwards calls to closures.
|
||||||
///
|
///
|
||||||
/// You can use this view to easily draw your own interface.
|
/// You can use this view to easily draw your own interface.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```rust
|
||||||
|
/// use cursive::views::{Canvas, Dialog};
|
||||||
|
/// use cursive::event::{Event, EventResult, Key};
|
||||||
|
/// use unicode_width::UnicodeWidthStr; // To get the width of some text.
|
||||||
|
///
|
||||||
|
/// // Build a canvas around a string.
|
||||||
|
/// let state = String::new();
|
||||||
|
/// let canvas = Canvas::new(state)
|
||||||
|
/// .with_draw(|text: &String, printer| {
|
||||||
|
/// // Simply print our string
|
||||||
|
/// printer.print((0,0), text);
|
||||||
|
/// })
|
||||||
|
/// .with_on_event(|text: &mut String, event| {
|
||||||
|
/// match event {
|
||||||
|
/// Event::Char(c) => {
|
||||||
|
/// text.push(c);
|
||||||
|
/// EventResult::Consumed(None)
|
||||||
|
/// }
|
||||||
|
/// Event::Key(Key::Enter) => {
|
||||||
|
/// let text = text.clone();
|
||||||
|
/// EventResult::with_cb(move |s| {
|
||||||
|
/// s.add_layer(Dialog::info(&text));
|
||||||
|
/// })
|
||||||
|
/// },
|
||||||
|
/// _ => EventResult::Ignored,
|
||||||
|
/// }
|
||||||
|
/// })
|
||||||
|
/// .with_required_size(|text, _constraints| {
|
||||||
|
/// (text.width(), 1).into()
|
||||||
|
/// });
|
||||||
|
/// ```
|
||||||
pub struct Canvas<T> {
|
pub struct Canvas<T> {
|
||||||
state: T,
|
state: T,
|
||||||
|
|
||||||
@ -46,16 +80,6 @@ impl<T: 'static + View> Canvas<T> {
|
|||||||
|
|
||||||
impl<T> Canvas<T> {
|
impl<T> Canvas<T> {
|
||||||
/// Creates a new, empty Canvas.
|
/// Creates a new, empty Canvas.
|
||||||
///
|
|
||||||
/// # Examples
|
|
||||||
///
|
|
||||||
/// ```rust
|
|
||||||
/// # use cursive::views::Canvas;
|
|
||||||
/// let canvas = Canvas::new(())
|
|
||||||
/// .with_draw(|printer, _| {
|
|
||||||
/// // Print the view
|
|
||||||
/// });
|
|
||||||
/// ```
|
|
||||||
pub fn new(state: T) -> Self {
|
pub fn new(state: T) -> Self {
|
||||||
Canvas {
|
Canvas {
|
||||||
state,
|
state,
|
||||||
|
@ -9,6 +9,15 @@ use crate::With;
|
|||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
/// Checkable box.
|
/// Checkable box.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use cursive::views::Checkbox;
|
||||||
|
/// use cursive::traits::Identifiable;
|
||||||
|
///
|
||||||
|
/// let checkbox = Checkbox::new().checked().with_id("check");
|
||||||
|
/// ```
|
||||||
pub struct Checkbox {
|
pub struct Checkbox {
|
||||||
checked: bool,
|
checked: bool,
|
||||||
enabled: bool,
|
enabled: bool,
|
||||||
@ -69,6 +78,18 @@ impl Checkbox {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Returns `true` if the checkbox is checked.
|
/// Returns `true` if the checkbox is checked.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use cursive::views::Checkbox;
|
||||||
|
///
|
||||||
|
/// let mut checkbox = Checkbox::new().checked();
|
||||||
|
/// assert!(checkbox.is_checked());
|
||||||
|
///
|
||||||
|
/// checkbox.uncheck();
|
||||||
|
/// assert!(!checkbox.is_checked());
|
||||||
|
/// ```
|
||||||
pub fn is_checked(&self) -> bool {
|
pub fn is_checked(&self) -> bool {
|
||||||
self.checked
|
self.checked
|
||||||
}
|
}
|
||||||
|
@ -108,6 +108,16 @@ impl Dialog {
|
|||||||
/// Sets the content for this dialog.
|
/// Sets the content for this dialog.
|
||||||
///
|
///
|
||||||
/// Chainable variant.
|
/// Chainable variant.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use cursive::views::{Dialog, TextView};
|
||||||
|
///
|
||||||
|
/// let dialog = Dialog::new()
|
||||||
|
/// .content(TextView::new("Hello!"))
|
||||||
|
/// .button("Quit", |s| s.quit());
|
||||||
|
/// ```
|
||||||
pub fn content<V: View + 'static>(self, view: V) -> Self {
|
pub fn content<V: View + 'static>(self, view: V) -> Self {
|
||||||
self.with(|s| s.set_content(view))
|
self.with(|s| s.set_content(view))
|
||||||
}
|
}
|
||||||
@ -143,6 +153,15 @@ impl Dialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Convenient method to create a dialog with a simple text content.
|
/// Convenient method to create a dialog with a simple text content.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use cursive::views::Dialog;
|
||||||
|
///
|
||||||
|
/// let dialog = Dialog::text("Hello!")
|
||||||
|
/// .button("Quit", |s| s.quit());
|
||||||
|
/// ```
|
||||||
pub fn text<S: Into<String>>(text: S) -> Self {
|
pub fn text<S: Into<String>>(text: S) -> Self {
|
||||||
Self::around(TextView::new(text))
|
Self::around(TextView::new(text))
|
||||||
}
|
}
|
||||||
@ -150,6 +169,14 @@ impl Dialog {
|
|||||||
/// Convenient method to create an infobox.
|
/// Convenient method to create an infobox.
|
||||||
///
|
///
|
||||||
/// It will contain the given text and a `Ok` dismiss button.
|
/// It will contain the given text and a `Ok` dismiss button.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use cursive::views::Dialog;
|
||||||
|
///
|
||||||
|
/// let dialog = Dialog::info("Some very important information!");
|
||||||
|
/// ```
|
||||||
pub fn info<S: Into<String>>(text: S) -> Self {
|
pub fn info<S: Into<String>>(text: S) -> Self {
|
||||||
Dialog::text(text).dismiss_button("Ok")
|
Dialog::text(text).dismiss_button("Ok")
|
||||||
}
|
}
|
||||||
@ -217,6 +244,15 @@ impl Dialog {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/// Shortcut method to add a button that will dismiss the dialog.
|
/// Shortcut method to add a button that will dismiss the dialog.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use cursive::views::Dialog;
|
||||||
|
///
|
||||||
|
/// let dialog = Dialog::text("Hello!")
|
||||||
|
/// .dismiss_button("Close");
|
||||||
|
/// ```
|
||||||
pub fn dismiss_button<S: Into<String>>(self, label: S) -> Self {
|
pub fn dismiss_button<S: Into<String>>(self, label: S) -> Self {
|
||||||
self.button(label, |s| {
|
self.button(label, |s| {
|
||||||
s.pop_layer();
|
s.pop_layer();
|
||||||
@ -226,6 +262,15 @@ impl Dialog {
|
|||||||
/// Sets the title of the dialog.
|
/// Sets the title of the dialog.
|
||||||
///
|
///
|
||||||
/// If not empty, it will be visible at the top.
|
/// If not empty, it will be visible at the top.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use cursive::views::Dialog;
|
||||||
|
///
|
||||||
|
/// let dialog = Dialog::info("Some info")
|
||||||
|
/// .title("Read me!");
|
||||||
|
/// ```
|
||||||
pub fn title<S: Into<String>>(self, label: S) -> Self {
|
pub fn title<S: Into<String>>(self, label: S) -> Self {
|
||||||
self.with(|s| s.set_title(label))
|
self.with(|s| s.set_title(label))
|
||||||
}
|
}
|
||||||
@ -249,6 +294,14 @@ impl Dialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Sets the padding in the dialog (around content and buttons).
|
/// Sets the padding in the dialog (around content and buttons).
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
/// ```
|
||||||
|
/// use cursive::views::Dialog;
|
||||||
|
///
|
||||||
|
/// let dialog = Dialog::info("Hello!")
|
||||||
|
/// .padding(((1, 1), (0, 0))); // ((Left, Right), (Top, Bottom))
|
||||||
|
/// ```
|
||||||
pub fn padding<T: Into<Margins>>(mut self, padding: T) -> Self {
|
pub fn padding<T: Into<Margins>>(mut self, padding: T) -> Self {
|
||||||
self.padding = padding.into();
|
self.padding = padding.into();
|
||||||
|
|
||||||
|
@ -268,6 +268,20 @@ impl EditView {
|
|||||||
/// Sets a callback to be called whenever the content is modified.
|
/// Sets a callback to be called whenever the content is modified.
|
||||||
///
|
///
|
||||||
/// Chainable variant. See [`set_on_edit`](#method.set_on_edit).
|
/// Chainable variant. See [`set_on_edit`](#method.set_on_edit).
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use cursive::views::{TextContent, TextView, EditView};
|
||||||
|
/// // Keep the length of the text in a separate view.
|
||||||
|
/// let mut content = TextContent::new("0");
|
||||||
|
/// let text_view = TextView::new_with_content(content.clone());
|
||||||
|
///
|
||||||
|
/// let on_edit = EditView::new()
|
||||||
|
/// .on_edit(move |_s, text, _cursor| {
|
||||||
|
/// content.set_content(format!("{}", text.len()));
|
||||||
|
/// });
|
||||||
|
/// ```
|
||||||
pub fn on_edit<F>(self, callback: F) -> Self
|
pub fn on_edit<F>(self, callback: F) -> Self
|
||||||
where
|
where
|
||||||
F: Fn(&mut Cursive, &str, usize) + 'static,
|
F: Fn(&mut Cursive, &str, usize) + 'static,
|
||||||
@ -328,6 +342,17 @@ impl EditView {
|
|||||||
/// Sets a callback to be called when `<Enter>` is pressed.
|
/// Sets a callback to be called when `<Enter>` is pressed.
|
||||||
///
|
///
|
||||||
/// Chainable variant.
|
/// Chainable variant.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use cursive::views::{Dialog, EditView};
|
||||||
|
///
|
||||||
|
/// let edit_view = EditView::new()
|
||||||
|
/// .on_submit(|s, text| {
|
||||||
|
/// s.add_layer(Dialog::info(text));
|
||||||
|
/// });
|
||||||
|
/// ```
|
||||||
pub fn on_submit<F>(self, callback: F) -> Self
|
pub fn on_submit<F>(self, callback: F) -> Self
|
||||||
where
|
where
|
||||||
F: Fn(&mut Cursive, &str) + 'static,
|
F: Fn(&mut Cursive, &str) + 'static,
|
||||||
|
@ -5,6 +5,27 @@ use crate::{Printer, With};
|
|||||||
/// Wrapper around another view that can be enabled/disabled at will.
|
/// Wrapper around another view that can be enabled/disabled at will.
|
||||||
///
|
///
|
||||||
/// When disabled, all child views will be disabled and will stop receiving events.
|
/// When disabled, all child views will be disabled and will stop receiving events.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use cursive::Cursive;
|
||||||
|
/// use cursive::views::{Button, EnableableView, Checkbox, LinearLayout};
|
||||||
|
/// use cursive::traits::Identifiable;
|
||||||
|
///
|
||||||
|
/// let mut siv = Cursive::dummy();
|
||||||
|
///
|
||||||
|
/// siv.add_layer(LinearLayout::vertical()
|
||||||
|
/// .child(EnableableView::new(Checkbox::new()).with_id("my_view"))
|
||||||
|
/// .child(Button::new("Toggle", |s| {
|
||||||
|
/// s.call_on_id("my_view", |v: &mut EnableableView<Checkbox>| {
|
||||||
|
/// // This will disable (or re-enable) the checkbox, preventing the user from
|
||||||
|
/// // interacting with it.
|
||||||
|
/// v.set_enabled(!v.is_enabled());
|
||||||
|
/// });
|
||||||
|
/// }))
|
||||||
|
/// );
|
||||||
|
/// ```
|
||||||
pub struct EnableableView<V> {
|
pub struct EnableableView<V> {
|
||||||
view: V,
|
view: V,
|
||||||
enabled: bool,
|
enabled: bool,
|
||||||
|
@ -5,7 +5,11 @@ use std::cell::{RefCell, RefMut};
|
|||||||
use std::ops::DerefMut;
|
use std::ops::DerefMut;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
/// Wrapper around a view to provide interior mutability.
|
/// Wrapper around a view to make it identifiable.
|
||||||
|
///
|
||||||
|
/// This lets other views refer to this one using a string identifier.
|
||||||
|
///
|
||||||
|
/// See [`Identifiable`](crate::view::Identifiable) for an easy way to wrap any view with it.
|
||||||
pub struct IdView<V: View> {
|
pub struct IdView<V: View> {
|
||||||
view: Rc<RefCell<V>>,
|
view: Rc<RefCell<V>>,
|
||||||
id: String,
|
id: String,
|
||||||
|
@ -3,7 +3,7 @@ use crate::Printer;
|
|||||||
|
|
||||||
/// Wrapper view that fills the background.
|
/// Wrapper view that fills the background.
|
||||||
///
|
///
|
||||||
/// Used as layer in the [`StackView`].
|
/// This is mostly used as layer in the [`StackView`].
|
||||||
///
|
///
|
||||||
/// [`StackView`]: struct.StackView.html
|
/// [`StackView`]: struct.StackView.html
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -11,6 +11,18 @@ use std::cmp::min;
|
|||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
|
|
||||||
/// Arranges its children linearly according to its orientation.
|
/// Arranges its children linearly according to its orientation.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use cursive::views::{Button, LinearLayout, TextView, TextArea};
|
||||||
|
/// use cursive::traits::Boxable;
|
||||||
|
///
|
||||||
|
/// let linear_layout = LinearLayout::horizontal()
|
||||||
|
/// .child(TextView::new("Top of the page"))
|
||||||
|
/// .child(TextArea::new().fixed_size((20, 5)))
|
||||||
|
/// .child(Button::new("Ok", |s| s.quit()));
|
||||||
|
/// ```
|
||||||
pub struct LinearLayout {
|
pub struct LinearLayout {
|
||||||
children: Vec<Child>,
|
children: Vec<Child>,
|
||||||
orientation: direction::Orientation,
|
orientation: direction::Orientation,
|
||||||
|
@ -16,6 +16,12 @@ use std::rc::Rc;
|
|||||||
use unicode_width::UnicodeWidthStr;
|
use unicode_width::UnicodeWidthStr;
|
||||||
|
|
||||||
/// Popup that shows a list of items.
|
/// Popup that shows a list of items.
|
||||||
|
///
|
||||||
|
/// This is mostly used indirectly when creating a [popup `SelectView`][1] or
|
||||||
|
/// a [menubar][2].
|
||||||
|
///
|
||||||
|
/// [1]: crate::views::SelectView::popup()
|
||||||
|
/// [2]: crate::Cursive::menubar()
|
||||||
pub struct MenuPopup {
|
pub struct MenuPopup {
|
||||||
menu: Rc<MenuTree>,
|
menu: Rc<MenuTree>,
|
||||||
focus: usize,
|
focus: usize,
|
||||||
|
@ -84,7 +84,7 @@ impl Deref for TextContentRef {
|
|||||||
|
|
||||||
impl TextContent {
|
impl TextContent {
|
||||||
/// Replaces the content with the given value.
|
/// Replaces the content with the given value.
|
||||||
pub fn set_content<S>(&mut self, content: S)
|
pub fn set_content<S>(&self, content: S)
|
||||||
where
|
where
|
||||||
S: Into<StyledString>,
|
S: Into<StyledString>,
|
||||||
{
|
{
|
||||||
@ -94,7 +94,7 @@ impl TextContent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Append `content` to the end of a `TextView`.
|
/// Append `content` to the end of a `TextView`.
|
||||||
pub fn append<S>(&mut self, content: S)
|
pub fn append<S>(&self, content: S)
|
||||||
where
|
where
|
||||||
S: Into<StyledString>,
|
S: Into<StyledString>,
|
||||||
{
|
{
|
||||||
@ -113,7 +113,8 @@ impl TextContent {
|
|||||||
TextContentInner::get_content(&self.content)
|
TextContentInner::get_content(&self.content)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn with_content<F, O>(&mut self, f: F) -> O
|
/// Apply the given closure to the inner content, and bust the cache afterward.
|
||||||
|
fn with_content<F, O>(&self, f: F) -> O
|
||||||
where
|
where
|
||||||
F: FnOnce(&mut TextContentInner) -> O,
|
F: FnOnce(&mut TextContentInner) -> O,
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user