mirror of
https://github.com/FliegendeWurst/cursive.git
synced 2024-11-27 11:16:03 +00:00
Add View::as_any and View::as_any_mut
This commit is contained in:
parent
208b812976
commit
1551fbb543
@ -1,3 +1,4 @@
|
|||||||
|
#[macro_use]
|
||||||
extern crate cursive;
|
extern crate cursive;
|
||||||
|
|
||||||
use cursive::{Cursive, Printer};
|
use cursive::{Cursive, Printer};
|
||||||
@ -30,6 +31,8 @@ impl KeyCodeView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl View for KeyCodeView {
|
impl View for KeyCodeView {
|
||||||
|
view_any!();
|
||||||
|
|
||||||
fn draw(&self, printer: &Printer) {
|
fn draw(&self, printer: &Printer) {
|
||||||
// We simply draw every event from the history.
|
// We simply draw every event from the history.
|
||||||
for (y, line) in self.history.iter().enumerate() {
|
for (y, line) in self.history.iter().enumerate() {
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
#[macro_use]
|
||||||
extern crate cursive;
|
extern crate cursive;
|
||||||
|
|
||||||
use cursive::{Cursive, Printer};
|
use cursive::{Cursive, Printer};
|
||||||
@ -80,6 +81,8 @@ impl BufferView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl View for BufferView {
|
impl View for BufferView {
|
||||||
|
view_any!();
|
||||||
|
|
||||||
fn layout(&mut self, _: Vec2) {
|
fn layout(&mut self, _: Vec2) {
|
||||||
// Before drawing, we'll want to update the buffer
|
// Before drawing, we'll want to update the buffer
|
||||||
self.update();
|
self.update();
|
||||||
|
@ -35,6 +35,15 @@
|
|||||||
//! no matter what the request is. This means calling `View::layout()` with
|
//! no matter what the request is. This means calling `View::layout()` with
|
||||||
//! a size returned by `required_size` is **never** an error.
|
//! a size returned by `required_size` is **never** an error.
|
||||||
|
|
||||||
|
/// Helper macro to implement `View::as_any` and `View::as_any_mut`
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! view_any {
|
||||||
|
() => {
|
||||||
|
fn as_any(&self) -> &::std::any::Any { self }
|
||||||
|
fn as_any_mut(&mut self) -> &mut ::std::any::Any { self }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
mod view_wrapper;
|
mod view_wrapper;
|
||||||
|
|
||||||
@ -73,6 +82,12 @@ pub trait View: Any {
|
|||||||
EventResult::Ignored
|
EventResult::Ignored
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Downcast self to a `Any`.
|
||||||
|
fn as_any(&self) -> &Any;
|
||||||
|
|
||||||
|
/// Downcast self to a mutable `Any`.
|
||||||
|
fn as_any_mut(&mut self) -> &mut Any;
|
||||||
|
|
||||||
/// Returns the minimum size the view requires with the given restrictions.
|
/// Returns the minimum size the view requires with the given restrictions.
|
||||||
///
|
///
|
||||||
/// If the view is flexible (it has multiple size options), it can try
|
/// If the view is flexible (it has multiple size options), it can try
|
||||||
|
@ -119,6 +119,8 @@ impl<U: View + ?Sized, T: Deref<Target = U> + DerefMut + 'static> ViewWrapper
|
|||||||
|
|
||||||
// The main point of implementing ViewWrapper is to have View for free.
|
// The main point of implementing ViewWrapper is to have View for free.
|
||||||
impl<T: ViewWrapper> View for T {
|
impl<T: ViewWrapper> View for T {
|
||||||
|
view_any!();
|
||||||
|
|
||||||
fn draw(&self, printer: &Printer) {
|
fn draw(&self, printer: &Printer) {
|
||||||
self.wrap_draw(printer);
|
self.wrap_draw(printer);
|
||||||
}
|
}
|
||||||
|
@ -126,6 +126,8 @@ impl Button {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl View for Button {
|
impl View for Button {
|
||||||
|
view_any!();
|
||||||
|
|
||||||
fn draw(&self, printer: &Printer) {
|
fn draw(&self, printer: &Printer) {
|
||||||
if printer.size.x == 0 {
|
if printer.size.x == 0 {
|
||||||
return;
|
return;
|
||||||
|
@ -173,6 +173,8 @@ impl<T> Canvas<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<T: 'static> View for Canvas<T> {
|
impl<T: 'static> View for Canvas<T> {
|
||||||
|
view_any!();
|
||||||
|
|
||||||
fn draw(&self, printer: &Printer) {
|
fn draw(&self, printer: &Printer) {
|
||||||
(self.draw)(&self.state, printer);
|
(self.draw)(&self.state, printer);
|
||||||
}
|
}
|
||||||
|
@ -105,6 +105,8 @@ impl Checkbox {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl View for Checkbox {
|
impl View for Checkbox {
|
||||||
|
view_any!();
|
||||||
|
|
||||||
fn required_size(&mut self, _: Vec2) -> Vec2 {
|
fn required_size(&mut self, _: Vec2) -> Vec2 {
|
||||||
Vec2::new(3, 1)
|
Vec2::new(3, 1)
|
||||||
}
|
}
|
||||||
|
@ -423,6 +423,8 @@ impl Dialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl View for Dialog {
|
impl View for Dialog {
|
||||||
|
view_any!();
|
||||||
|
|
||||||
fn draw(&self, printer: &Printer) {
|
fn draw(&self, printer: &Printer) {
|
||||||
// This will be the buttons_height used by the buttons.
|
// This will be the buttons_height used by the buttons.
|
||||||
let buttons_height = match self.draw_buttons(printer) {
|
let buttons_height = match self.draw_buttons(printer) {
|
||||||
|
@ -7,5 +7,7 @@ use view::View;
|
|||||||
pub struct DummyView;
|
pub struct DummyView;
|
||||||
|
|
||||||
impl View for DummyView {
|
impl View for DummyView {
|
||||||
|
view_any!();
|
||||||
|
|
||||||
fn draw(&self, _: &Printer) {}
|
fn draw(&self, _: &Printer) {}
|
||||||
}
|
}
|
||||||
|
@ -434,6 +434,8 @@ fn make_small_stars(length: usize) -> &'static str {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl View for EditView {
|
impl View for EditView {
|
||||||
|
view_any!();
|
||||||
|
|
||||||
fn draw(&self, printer: &Printer) {
|
fn draw(&self, printer: &Printer) {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
printer.size.x,
|
printer.size.x,
|
||||||
|
@ -297,6 +297,8 @@ fn try_focus(
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl View for LinearLayout {
|
impl View for LinearLayout {
|
||||||
|
view_any!();
|
||||||
|
|
||||||
fn draw(&self, printer: &Printer) {
|
fn draw(&self, printer: &Printer) {
|
||||||
// Use pre-computed sizes
|
// Use pre-computed sizes
|
||||||
// eprintln!("Pre loop!");
|
// eprintln!("Pre loop!");
|
||||||
|
@ -261,6 +261,9 @@ fn try_focus(
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl View for ListView {
|
impl View for ListView {
|
||||||
|
view_any!();
|
||||||
|
|
||||||
|
|
||||||
fn draw(&self, printer: &Printer) {
|
fn draw(&self, printer: &Printer) {
|
||||||
if self.children.is_empty() {
|
if self.children.is_empty() {
|
||||||
return;
|
return;
|
||||||
|
@ -199,6 +199,8 @@ impl MenuPopup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl View for MenuPopup {
|
impl View for MenuPopup {
|
||||||
|
view_any!();
|
||||||
|
|
||||||
fn draw(&self, printer: &Printer) {
|
fn draw(&self, printer: &Printer) {
|
||||||
if !printer.size.fits((2, 2)) {
|
if !printer.size.fits((2, 2)) {
|
||||||
return;
|
return;
|
||||||
|
@ -259,6 +259,8 @@ fn show_child(s: &mut Cursive, offset: Vec2, menu: Rc<MenuTree>) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl View for Menubar {
|
impl View for Menubar {
|
||||||
|
view_any!();
|
||||||
|
|
||||||
fn draw(&self, printer: &Printer) {
|
fn draw(&self, printer: &Printer) {
|
||||||
// Draw the bar at the top
|
// Draw the bar at the top
|
||||||
printer.with_color(ColorStyle::primary(), |printer| {
|
printer.with_color(ColorStyle::primary(), |printer| {
|
||||||
|
@ -193,6 +193,8 @@ impl ProgressBar {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl View for ProgressBar {
|
impl View for ProgressBar {
|
||||||
|
view_any!();
|
||||||
|
|
||||||
fn draw(&self, printer: &Printer) {
|
fn draw(&self, printer: &Printer) {
|
||||||
// Now, the bar itself...
|
// Now, the bar itself...
|
||||||
let available = printer.size.x;
|
let available = printer.size.x;
|
||||||
|
@ -154,6 +154,9 @@ impl<T> RadioButton<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<T: 'static> View for RadioButton<T> {
|
impl<T: 'static> View for RadioButton<T> {
|
||||||
|
view_any!();
|
||||||
|
|
||||||
|
|
||||||
fn required_size(&mut self, _: Vec2) -> Vec2 {
|
fn required_size(&mut self, _: Vec2) -> Vec2 {
|
||||||
self.req_size()
|
self.req_size()
|
||||||
}
|
}
|
||||||
|
@ -570,6 +570,9 @@ impl SelectView<String> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<T: 'static> View for SelectView<T> {
|
impl<T: 'static> View for SelectView<T> {
|
||||||
|
view_any!();
|
||||||
|
|
||||||
|
|
||||||
fn draw(&self, printer: &Printer) {
|
fn draw(&self, printer: &Printer) {
|
||||||
self.last_offset.set(printer.offset);
|
self.last_offset.set(printer.offset);
|
||||||
|
|
||||||
|
@ -112,6 +112,8 @@ impl SliderView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl View for SliderView {
|
impl View for SliderView {
|
||||||
|
view_any!();
|
||||||
|
|
||||||
fn draw(&self, printer: &Printer) {
|
fn draw(&self, printer: &Printer) {
|
||||||
match self.orientation {
|
match self.orientation {
|
||||||
Orientation::Vertical => {
|
Orientation::Vertical => {
|
||||||
|
@ -71,6 +71,8 @@ impl<T: View> ChildWrapper<T> {
|
|||||||
|
|
||||||
// TODO: use macros to make this less ugly?
|
// TODO: use macros to make this less ugly?
|
||||||
impl<T: View> View for ChildWrapper<T> {
|
impl<T: View> View for ChildWrapper<T> {
|
||||||
|
view_any!();
|
||||||
|
|
||||||
fn draw(&self, printer: &Printer) {
|
fn draw(&self, printer: &Printer) {
|
||||||
match *self {
|
match *self {
|
||||||
ChildWrapper::Shadow(ref v) => v.draw(printer),
|
ChildWrapper::Shadow(ref v) => v.draw(printer),
|
||||||
@ -322,6 +324,8 @@ impl<R: Deref<Target = Child>, I: Iterator<Item = R>> Iterator
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl View for StackView {
|
impl View for StackView {
|
||||||
|
view_any!();
|
||||||
|
|
||||||
fn draw(&self, printer: &Printer) {
|
fn draw(&self, printer: &Printer) {
|
||||||
let last = self.layers.len();
|
let last = self.layers.len();
|
||||||
printer.with_color(ColorStyle::primary(), |printer| {
|
printer.with_color(ColorStyle::primary(), |printer| {
|
||||||
|
@ -396,6 +396,8 @@ impl TextArea {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl View for TextArea {
|
impl View for TextArea {
|
||||||
|
view_any!();
|
||||||
|
|
||||||
fn required_size(&mut self, constraint: Vec2) -> Vec2 {
|
fn required_size(&mut self, constraint: Vec2) -> Vec2 {
|
||||||
// Make sure our structure is up to date
|
// Make sure our structure is up to date
|
||||||
self.soft_compute_rows(constraint);
|
self.soft_compute_rows(constraint);
|
||||||
|
@ -448,6 +448,8 @@ impl TextView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl View for TextView {
|
impl View for TextView {
|
||||||
|
view_any!();
|
||||||
|
|
||||||
fn draw(&self, printer: &Printer) {
|
fn draw(&self, printer: &Printer) {
|
||||||
let h = self.rows.len();
|
let h = self.rows.len();
|
||||||
// If the content is smaller than the view, align it somewhere.
|
// If the content is smaller than the view, align it somewhere.
|
||||||
|
Loading…
Reference in New Issue
Block a user