Update Widget Trait

The draw function now take a &mut reference to the widget, allowing the
widget to modify itself when drawn. This change the semantic of the draw
call since the widget should now be considered "consumed" after it.
pull/13/head
Florian Dehau 7 years ago
parent bb61028e0c
commit b1737ce667

@ -91,7 +91,7 @@ impl<B> Terminal<B>
}
/// Calls the draw method of a given widget on the current buffer
pub fn render<W>(&mut self, widget: &W, area: &Rect)
pub fn render<W>(&mut self, widget: &mut W, area: &Rect)
where W: Widget
{
widget.draw(area, &mut self.buffers[self.current]);

@ -108,9 +108,9 @@ impl<'a> BarChart<'a> {
}
impl<'a> Widget for BarChart<'a> {
fn draw(&self, area: &Rect, buf: &mut Buffer) {
fn draw(&mut self, area: &Rect, buf: &mut Buffer) {
let chart_area = match self.block {
Some(ref b) => {
Some(ref mut b) => {
b.draw(area, buf);
b.inner(area)
}

@ -99,7 +99,7 @@ impl<'a> Block<'a> {
}
impl<'a> Widget for Block<'a> {
fn draw(&self, area: &Rect, buf: &mut Buffer) {
fn draw(&mut self, area: &Rect, buf: &mut Buffer) {
if area.width < 2 || area.height < 2 {
return;

@ -221,9 +221,9 @@ impl<'a, F> Canvas<'a, F>
impl<'a, F> Widget for Canvas<'a, F>
where F: Fn(&mut Context)
{
fn draw(&self, area: &Rect, buf: &mut Buffer) {
fn draw(&mut self, area: &Rect, buf: &mut Buffer) {
let canvas_area = match self.block {
Some(ref b) => {
Some(ref mut b) => {
b.draw(area, buf);
b.inner(area)
}

@ -305,9 +305,9 @@ impl<'a> Chart<'a> {
}
impl<'a> Widget for Chart<'a> {
fn draw(&self, area: &Rect, buf: &mut Buffer) {
fn draw(&mut self, area: &Rect, buf: &mut Buffer) {
let chart_area = match self.block {
Some(ref b) => {
Some(ref mut b) => {
b.draw(area, buf);
b.inner(area)
}

@ -61,9 +61,9 @@ impl<'a> Gauge<'a> {
}
impl<'a> Widget for Gauge<'a> {
fn draw(&self, area: &Rect, buf: &mut Buffer) {
fn draw(&mut self, area: &Rect, buf: &mut Buffer) {
let gauge_area = match self.block {
Some(ref b) => {
Some(ref mut b) => {
b.draw(area, buf);
b.inner(area)
}

@ -48,9 +48,9 @@ impl<'a> List<'a> {
}
impl<'a> Widget for List<'a> {
fn draw(&self, area: &Rect, buf: &mut Buffer) {
fn draw(&mut self, area: &Rect, buf: &mut Buffer) {
let list_area = match self.block {
Some(ref b) => {
Some(ref mut b) => {
b.draw(area, buf);
b.inner(area)
}
@ -156,10 +156,10 @@ impl<'a> SelectableList<'a> {
}
impl<'a> Widget for SelectableList<'a> {
fn draw(&self, area: &Rect, buf: &mut Buffer) {
fn draw(&mut self, area: &Rect, buf: &mut Buffer) {
let list_area = match self.block {
Some(ref b) => b.inner(area),
Some(ref mut b) => b.inner(area),
None => *area,
};

@ -49,7 +49,7 @@ pub mod border {
pub trait Widget {
/// Draws the current state of the widget in the given buffer. That the only method required to
/// implement a custom widget.
fn draw(&self, area: &Rect, buf: &mut Buffer);
fn draw(&mut self, area: &Rect, buf: &mut Buffer);
/// Helper method to quickly set the background of all cells inside the specified area.
fn background(&self, area: &Rect, buf: &mut Buffer, color: Color) {
for y in area.top()..area.bottom() {
@ -59,7 +59,7 @@ pub trait Widget {
}
}
/// Helper method that can be chained with a widget's builder methods to render it.
fn render<B>(&self, t: &mut Terminal<B>, area: &Rect)
fn render<B>(&mut self, t: &mut Terminal<B>, area: &Rect)
where Self: Sized,
B: Backend
{

@ -224,9 +224,9 @@ impl<'a, T> Iterator for Parser<'a, T>
}
impl<'a> Widget for Paragraph<'a> {
fn draw(&self, area: &Rect, buf: &mut Buffer) {
fn draw(&mut self, area: &Rect, buf: &mut Buffer) {
let text_area = match self.block {
Some(ref b) => {
Some(ref mut b) => {
b.draw(area, buf);
b.inner(area)
}

@ -68,9 +68,9 @@ impl<'a> Sparkline<'a> {
}
impl<'a> Widget for Sparkline<'a> {
fn draw(&self, area: &Rect, buf: &mut Buffer) {
fn draw(&mut self, area: &Rect, buf: &mut Buffer) {
let spark_area = match self.block {
Some(ref b) => {
Some(ref mut b) => {
b.draw(area, buf);
b.inner(area)
}

@ -111,11 +111,11 @@ impl<'a> Table<'a> {
}
impl<'a> Widget for Table<'a> {
fn draw(&self, area: &Rect, buf: &mut Buffer) {
fn draw(&mut self, area: &Rect, buf: &mut Buffer) {
// Render block if necessary and get the drawing area
let table_area = match self.block {
Some(ref b) => {
Some(ref mut b) => {
b.draw(area, buf);
b.inner(area)
}

@ -75,10 +75,10 @@ impl<'a> Tabs<'a> {
}
impl<'a> Widget for Tabs<'a> {
fn draw(&self, area: &Rect, buf: &mut Buffer) {
fn draw(&mut self, area: &Rect, buf: &mut Buffer) {
let tabs_area = match self.block {
Some(b) => {
Some(ref mut b) => {
b.draw(area, buf);
b.inner(area)
}

Loading…
Cancel
Save