mirror of
https://github.com/FliegendeWurst/cursive.git
synced 2024-11-23 09:25:01 +00:00
Add NamedView::{name, set_name} and {LinearLayout,FixedLayout}::find_child_from_name
This commit is contained in:
parent
421c08c922
commit
58ef6c298b
@ -24,7 +24,7 @@ use crate::{
|
|||||||
/// .child(Rect::from_size((0,2), (1,1)), TextView::new(r"\"))
|
/// .child(Rect::from_size((0,2), (1,1)), TextView::new(r"\"))
|
||||||
/// .child(Rect::from_size((14,2), (1,1)), TextView::new("/"))
|
/// .child(Rect::from_size((14,2), (1,1)), TextView::new("/"))
|
||||||
/// .child(Rect::from_size((3,1), (11,1)), Button::new("Clickme", |s| s.quit()));
|
/// .child(Rect::from_size((3,1), (11,1)), Button::new("Clickme", |s| s.quit()));
|
||||||
/// ````
|
/// ```
|
||||||
pub struct FixedLayout {
|
pub struct FixedLayout {
|
||||||
children: Vec<Child>,
|
children: Vec<Child>,
|
||||||
focus: usize,
|
focus: usize,
|
||||||
@ -125,6 +125,24 @@ impl FixedLayout {
|
|||||||
Some(self.children.remove(i).view)
|
Some(self.children.remove(i).view)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Looks for the child containing a view with the given name.
|
||||||
|
///
|
||||||
|
/// Returns `Some(i)` if `self.get_child(i)` has the given name, or
|
||||||
|
/// contains a view with the given name.
|
||||||
|
///
|
||||||
|
/// Returns `None` if the given name was not found.
|
||||||
|
pub fn find_child_from_name(&mut self, name: &str) -> Option<usize> {
|
||||||
|
let selector = Selector::Name(name);
|
||||||
|
for (i, c) in self.children.iter_mut().enumerate() {
|
||||||
|
let mut found = false;
|
||||||
|
c.view.call_on_any(&selector, &mut |_| found = true);
|
||||||
|
if found {
|
||||||
|
return Some(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
fn iter_mut<'a>(
|
fn iter_mut<'a>(
|
||||||
source: Direction,
|
source: Direction,
|
||||||
children: &'a mut [Child],
|
children: &'a mut [Child],
|
||||||
|
@ -292,6 +292,24 @@ impl LinearLayout {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Looks for the child containing a view with the given name.
|
||||||
|
///
|
||||||
|
/// Returns `Some(i)` if `self.get_child(i)` has the given name, or
|
||||||
|
/// contains a view with the given name.
|
||||||
|
///
|
||||||
|
/// Returns `None` if the given name was not found.
|
||||||
|
pub fn find_child_from_name(&mut self, name: &str) -> Option<usize> {
|
||||||
|
let selector = Selector::Name(name);
|
||||||
|
for (i, c) in self.children.iter_mut().enumerate() {
|
||||||
|
let mut found = false;
|
||||||
|
c.view.call_on_any(&selector, &mut |_| found = true);
|
||||||
|
if found {
|
||||||
|
return Some(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
// If the cache can be used, return the cached size.
|
// If the cache can be used, return the cached size.
|
||||||
// Otherwise, return None.
|
// Otherwise, return None.
|
||||||
fn get_cache(&self, req: Vec2) -> Option<Vec2> {
|
fn get_cache(&self, req: Vec2) -> Option<Vec2> {
|
||||||
|
@ -12,7 +12,7 @@ use std::rc::Rc;
|
|||||||
/// See [`Identifiable`](crate::view::Identifiable) for an easy way to wrap any view with it.
|
/// See [`Identifiable`](crate::view::Identifiable) for an easy way to wrap any view with it.
|
||||||
pub struct NamedView<V> {
|
pub struct NamedView<V> {
|
||||||
view: Rc<RefCell<V>>,
|
view: Rc<RefCell<V>>,
|
||||||
id: String,
|
name: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Mutable reference to a view.
|
/// Mutable reference to a view.
|
||||||
@ -24,10 +24,10 @@ pub type ViewRef<V> = OwningHandle<RcRef<RefCell<V>>, RefMut<'static, V>>;
|
|||||||
|
|
||||||
impl<V> NamedView<V> {
|
impl<V> NamedView<V> {
|
||||||
/// Wraps `view` in a new `NamedView`.
|
/// Wraps `view` in a new `NamedView`.
|
||||||
pub fn new<S: Into<String>>(id: S, view: V) -> Self {
|
pub fn new<S: Into<String>>(name: S, view: V) -> Self {
|
||||||
NamedView {
|
NamedView {
|
||||||
view: Rc::new(RefCell::new(view)),
|
view: Rc::new(RefCell::new(view)),
|
||||||
id: id.into(),
|
name: name.into(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,6 +43,16 @@ impl<V> NamedView<V> {
|
|||||||
|
|
||||||
OwningHandle::new_mut(cell_ref)
|
OwningHandle::new_mut(cell_ref)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the name attached to this view.
|
||||||
|
pub fn name(&self) -> &str {
|
||||||
|
&self.name
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Changes the name attached to this view.
|
||||||
|
pub fn set_name<S: Into<String>>(&mut self, name: S) {
|
||||||
|
self.name = name.into();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: View + 'static> ViewWrapper for NamedView<T> {
|
impl<T: View + 'static> ViewWrapper for NamedView<T> {
|
||||||
@ -83,7 +93,9 @@ impl<T: View + 'static> ViewWrapper for NamedView<T> {
|
|||||||
) {
|
) {
|
||||||
match selector {
|
match selector {
|
||||||
#[allow(deprecated)]
|
#[allow(deprecated)]
|
||||||
&Selector::Name(id) | &Selector::Id(id) if id == self.id => {
|
&Selector::Name(name) | &Selector::Id(name)
|
||||||
|
if name == self.name =>
|
||||||
|
{
|
||||||
callback(self)
|
callback(self)
|
||||||
}
|
}
|
||||||
s => {
|
s => {
|
||||||
@ -97,7 +109,11 @@ impl<T: View + 'static> ViewWrapper for NamedView<T> {
|
|||||||
fn wrap_focus_view(&mut self, selector: &Selector<'_>) -> Result<(), ()> {
|
fn wrap_focus_view(&mut self, selector: &Selector<'_>) -> Result<(), ()> {
|
||||||
match selector {
|
match selector {
|
||||||
#[allow(deprecated)]
|
#[allow(deprecated)]
|
||||||
&Selector::Name(id) | &Selector::Id(id) if id == self.id => Ok(()),
|
&Selector::Name(name) | &Selector::Id(name)
|
||||||
|
if name == self.name =>
|
||||||
|
{
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
s => self
|
s => self
|
||||||
.view
|
.view
|
||||||
.try_borrow_mut()
|
.try_borrow_mut()
|
||||||
|
Loading…
Reference in New Issue
Block a user