mirror of
https://github.com/FliegendeWurst/cursive.git
synced 2024-11-09 10:50:40 +00:00
Add Dialog skeleton
This commit is contained in:
parent
09a21803f8
commit
74f0fee9b6
@ -19,3 +19,7 @@ git = "https://github.com/jeaye/ncurses-rs"
|
||||
[[example]]
|
||||
name = "hello_world"
|
||||
path = "examples/hello_world.rs"
|
||||
|
||||
[[example]]
|
||||
name = "dialog"
|
||||
path = "examples/dialog.rs"
|
||||
|
14
examples/dialog.rs
Normal file
14
examples/dialog.rs
Normal file
@ -0,0 +1,14 @@
|
||||
extern crate cursive;
|
||||
|
||||
use cursive::Cursive;
|
||||
use cursive::view::{TextView,Dialog};
|
||||
|
||||
fn main() {
|
||||
let mut siv = Cursive::new();
|
||||
|
||||
// Creates a dialog with a single "Quit" button
|
||||
siv.add_layer(Dialog::new(TextView::new("Hello Dialog!"))
|
||||
.button("Quit", |s,_| s.quit()));
|
||||
|
||||
siv.run();
|
||||
}
|
@ -28,6 +28,9 @@ pub mod printer;
|
||||
pub mod vec2;
|
||||
|
||||
mod div;
|
||||
mod margins;
|
||||
|
||||
pub use margins::Margins;
|
||||
|
||||
use std::any::Any;
|
||||
use std::rc::Rc;
|
||||
|
23
src/margins.rs
Normal file
23
src/margins.rs
Normal file
@ -0,0 +1,23 @@
|
||||
/// Fixed margins around a rectangular view.
|
||||
pub struct Margins {
|
||||
/// Left margin
|
||||
pub left: u32,
|
||||
/// Right margin
|
||||
pub right: u32,
|
||||
/// Top margin
|
||||
pub top: u32,
|
||||
/// Bottom margin
|
||||
pub bottom: u32,
|
||||
}
|
||||
|
||||
impl Margins {
|
||||
/// Creates new margins.
|
||||
pub fn new(left: u32, right: u32, top: u32, bottom: u32) -> Self {
|
||||
Margins {
|
||||
left: left,
|
||||
right: right,
|
||||
top: top,
|
||||
bottom: bottom,
|
||||
}
|
||||
}
|
||||
}
|
18
src/vec2.rs
18
src/vec2.rs
@ -53,24 +53,26 @@ impl ToVec2 for (usize,usize) {
|
||||
}
|
||||
}
|
||||
|
||||
impl Add for Vec2 {
|
||||
impl <T: ToVec2> Add<T> for Vec2 {
|
||||
type Output = Vec2;
|
||||
|
||||
fn add(self, other: Vec2) -> Vec2 {
|
||||
fn add(self, other: T) -> Vec2 {
|
||||
let ov = other.to_vec2();
|
||||
Vec2 {
|
||||
x: self.x + other.x,
|
||||
y: self.y + other.y,
|
||||
x: self.x + ov.x,
|
||||
y: self.y + ov.y,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Sub for Vec2 {
|
||||
impl <T: ToVec2> Sub<T> for Vec2 {
|
||||
type Output = Vec2;
|
||||
|
||||
fn sub(self, other: Vec2) -> Vec2 {
|
||||
fn sub(self, other: T) -> Vec2 {
|
||||
let ov = other.to_vec2();
|
||||
Vec2 {
|
||||
x: self.x - other.x,
|
||||
y: self.y - other.y,
|
||||
x: self.x - ov.x,
|
||||
y: self.y - ov.y,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
56
src/view/dialog.rs
Normal file
56
src/view/dialog.rs
Normal file
@ -0,0 +1,56 @@
|
||||
use ::Cursive;
|
||||
use view::{View,ViewPath,SizeRequest,DimensionRequest};
|
||||
use vec2::{Vec2};
|
||||
use printer::Printer;
|
||||
|
||||
enum Focus {
|
||||
Content,
|
||||
Button(usize),
|
||||
Nothing,
|
||||
}
|
||||
|
||||
pub struct Dialog {
|
||||
content: Box<View>,
|
||||
buttons: Vec<Box<View>>,
|
||||
focus: Focus,
|
||||
}
|
||||
|
||||
impl Dialog {
|
||||
pub fn new<V: View + 'static>(view: V) -> Self {
|
||||
Dialog {
|
||||
content: Box::new(view),
|
||||
buttons: Vec::new(),
|
||||
focus: Focus::Nothing,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn button<'a, F>(self, label: &'a str, cb: F) -> Self
|
||||
where F: Fn(&mut Cursive, &ViewPath)
|
||||
{
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
fn offset_request(request: DimensionRequest, offset: i32) -> DimensionRequest {
|
||||
match request {
|
||||
DimensionRequest::Fixed(w) => DimensionRequest::Fixed((w as i32 + offset) as u32),
|
||||
DimensionRequest::AtMost(w) => DimensionRequest::AtMost((w as i32 + offset) as u32),
|
||||
DimensionRequest::Unknown => DimensionRequest::Unknown,
|
||||
}
|
||||
}
|
||||
|
||||
impl View for Dialog {
|
||||
fn draw(&self, printer: &Printer) {
|
||||
|
||||
}
|
||||
|
||||
fn get_min_size(&self, size: SizeRequest) -> Vec2 {
|
||||
let content_req = SizeRequest {
|
||||
w: offset_request(size.w, -2),
|
||||
h: offset_request(size.h, -2),
|
||||
};
|
||||
let content_size = self.content.get_min_size(content_req);
|
||||
|
||||
content_size + (2u32,2u32)
|
||||
}
|
||||
}
|
@ -5,6 +5,7 @@ mod stack_view;
|
||||
mod text_view;
|
||||
mod key_event_view;
|
||||
mod view_path;
|
||||
mod dialog;
|
||||
|
||||
use std::any::Any;
|
||||
|
||||
@ -13,6 +14,7 @@ pub use self::key_event_view::KeyEventView;
|
||||
pub use self::box_view::BoxView;
|
||||
pub use self::stack_view::StackView;
|
||||
pub use self::text_view::TextView;
|
||||
pub use self::dialog::Dialog;
|
||||
|
||||
use event::EventResult;
|
||||
use vec2::Vec2;
|
||||
|
@ -12,4 +12,20 @@ impl ViewPath {
|
||||
path: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn from<T: ToPath>(path: T) -> Self {
|
||||
path.to_path()
|
||||
}
|
||||
}
|
||||
|
||||
pub trait ToPath {
|
||||
fn to_path(self) -> ViewPath;
|
||||
}
|
||||
|
||||
impl <'a> ToPath for &'a [usize] {
|
||||
fn to_path(self) -> ViewPath {
|
||||
ViewPath {
|
||||
path: self.to_owned(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user