Can now change dialog button alignment

This commit is contained in:
Alexandre Bury 2015-06-02 19:36:22 -07:00
parent 7545d7170c
commit 781d9c1a03
4 changed files with 99 additions and 5 deletions

View File

@ -1,6 +1,7 @@
extern crate cursive; extern crate cursive;
use cursive::Cursive; use cursive::Cursive;
use cursive::align::HAlign;
use cursive::view::{TextView,Dialog}; use cursive::view::{TextView,Dialog};
use std::fs::File; use std::fs::File;
@ -20,6 +21,7 @@ fn main() {
// The text is too long to fit on a line, so the view will wrap lines, // The text is too long to fit on a line, so the view will wrap lines,
// and will adapt to the terminal size. // and will adapt to the terminal size.
siv.add_layer(Dialog::new(TextView::new(&content)) siv.add_layer(Dialog::new(TextView::new(&content))
.h_align(HAlign::Center)
.button("Quit", |s| s.quit())); .button("Quit", |s| s.quit()));
// Show a popup on top of the view. // Show a popup on top of the view.
siv.add_layer(Dialog::new(TextView::new("Try resizing the terminal!\n(Press 'q' to quit when you're done.)")) siv.add_layer(Dialog::new(TextView::new("Try resizing the terminal!\n(Press 'q' to quit when you're done.)"))

View File

@ -17,6 +17,18 @@ impl Align {
Align::new(HAlign::Left, VAlign::Top) Align::new(HAlign::Left, VAlign::Top)
} }
pub fn top_right() -> Self {
Align::new(HAlign::Right, VAlign::Top)
}
pub fn bot_left() -> Self {
Align::new(HAlign::Left, VAlign::Bottom)
}
pub fn bot_right() -> Self {
Align::new(HAlign::Right, VAlign::Top)
}
pub fn center() -> Self { pub fn center() -> Self {
Align::new(HAlign::Center, VAlign::Center) Align::new(HAlign::Center, VAlign::Center)
} }

View File

@ -124,6 +124,7 @@ impl Mul<usize> for Vec2 {
} }
/// Four values representing each direction. /// Four values representing each direction.
#[derive(Clone,Copy)]
pub struct Vec4 { pub struct Vec4 {
/// Left margin /// Left margin
pub left: usize, pub left: usize,
@ -193,3 +194,61 @@ impl ToVec4 for (i32,i32,i32,i32) {
Vec4::new(self.0 as usize, self.1 as usize, self.2 as usize, self.3 as usize) Vec4::new(self.0 as usize, self.1 as usize, self.2 as usize, self.3 as usize)
} }
} }
impl <T: ToVec4> Add<T> for Vec4 {
type Output = Vec4;
fn add(self, other: T) -> Vec4 {
let ov = other.to_vec4();
Vec4 {
left: self.left + ov.left,
right: self.right + ov.right,
top: self.top + ov.top,
bottom: self.bottom + ov.bottom,
}
}
}
impl <T: ToVec4> Sub<T> for Vec4 {
type Output = Vec4;
fn sub(self, other: T) -> Vec4 {
let ov = other.to_vec4();
Vec4 {
left: self.left - ov.left,
right: self.right - ov.right,
top: self.top - ov.top,
bottom: self.bottom - ov.bottom,
}
}
}
impl Div<usize> for Vec4 {
type Output = Vec4;
fn div(self, other: usize) -> Vec4 {
Vec4 {
left: self.left / other,
right: self.right / other,
top: self.top / other,
bottom: self.bottom / other,
}
}
}
impl Mul<usize> for Vec4 {
type Output = Vec4;
fn mul(self, other: usize) -> Vec4 {
Vec4 {
left: self.left * other,
right: self.right * other,
top: self.top * other,
bottom: self.bottom * other,
}
}
}

View File

@ -3,6 +3,7 @@ use std::any::Any;
use color; use color;
use ::{Cursive}; use ::{Cursive};
use align::*;
use event::*; use event::*;
use view::{View,SizeRequest,DimensionRequest,Selector}; use view::{View,SizeRequest,DimensionRequest,Selector};
use view::{Button,SizedView}; use view::{Button,SizedView};
@ -32,6 +33,8 @@ pub struct Dialog {
borders: Vec4, borders: Vec4,
focus: Focus, focus: Focus,
align: Align,
} }
impl Dialog { impl Dialog {
@ -44,6 +47,7 @@ impl Dialog {
focus: Focus::Content, focus: Focus::Content,
padding: Vec4::new(1,1,0,0), padding: Vec4::new(1,1,0,0),
borders: Vec4::new(1,1,1,1), borders: Vec4::new(1,1,1,1),
align: Align::top_right(),
} }
} }
@ -58,6 +62,18 @@ impl Dialog {
self self
} }
pub fn h_align(mut self, h: HAlign) -> Self {
self.align.h = h;
self
}
pub fn v_align(mut self, v: VAlign) -> Self {
self.align.v = v;
self
}
/// Shortcut method to add a button that will dismiss the dialog. /// Shortcut method to add a button that will dismiss the dialog.
pub fn dismiss_button<'a>(self, label: &'a str) -> Self { pub fn dismiss_button<'a>(self, label: &'a str) -> Self {
self.button(label, |s| s.screen_mut().pop_layer()) self.button(label, |s| s.screen_mut().pop_layer())
@ -85,14 +101,19 @@ impl View for Dialog {
// This will be the height used by the buttons. // This will be the height used by the buttons.
let mut height = 0; let mut height = 0;
// Current horizontal position of the next button we'll draw. // Current horizontal position of the next button we'll draw.
let mut x = 0;
for (i,button) in self.buttons.iter_mut().enumerate().rev() { let width = self.buttons.len() + self.buttons.iter().map(|button| button.size.x).fold(0, |a,b| a+b);
let overhead = self.padding + self.borders;
let mut offset = overhead.left + self.align.h.get_offset(width, printer.size.x - overhead.horizontal());
let y = printer.size.y - self.padding.bottom - self.borders.bottom - 1;
for (i,button) in self.buttons.iter_mut().enumerate() {
let size = button.size; let size = button.size;
let offset = printer.size - self.borders.bot_right() - self.padding.bot_right() - size - Vec2::new(x, 0); // let offset = printer.size - self.borders.bot_right() - self.padding.bot_right() - size - Vec2::new(x, 0);
// Add some special effect to the focused button // Add some special effect to the focused button
button.draw(&printer.sub_printer(offset, size, self.focus == Focus::Button(i))); button.draw(&printer.sub_printer(Vec2::new(offset, y), size, self.focus == Focus::Button(i)));
// Keep 1 blank between two buttons // Keep 1 blank between two buttons
x += size.x + 1; offset += size.x + 1;
// Also keep 1 blank above the buttons // Also keep 1 blank above the buttons
height = max(height, size.y+1); height = max(height, size.y+1);
} }