Replace the Clear widget with buffer.clear/clear_with.

This commit is contained in:
Blaž Hrastnik 2021-05-09 18:13:50 +09:00
parent 1255bcb8a3
commit ff4c1d05de
7 changed files with 25 additions and 77 deletions

View File

@ -202,14 +202,7 @@ fn render(&self, area: Rect, surface: &mut Surface, cx: &mut Context) {
// clear area // clear area
let background = cx.editor.theme.get("ui.popup"); let background = cx.editor.theme.get("ui.popup");
for y in area.top()..area.bottom() { surface.clear_with(area, background);
for x in area.left()..area.right() {
let cell = surface.get_mut(x, y);
cell.reset();
// cell.symbol.clear();
cell.set_style(background);
}
}
doc.render(area, surface, cx); doc.render(area, surface, cx);
} }
None => (), None => (),

View File

@ -205,14 +205,7 @@ fn render(&self, area: Rect, surface: &mut Surface, cx: &mut Context) {
// clear area // clear area
let background = cx.editor.theme.get("ui.background"); let background = cx.editor.theme.get("ui.background");
for y in area.top()..area.bottom() { surface.clear_with(area, background);
for x in area.left()..area.right() {
let cell = surface.get_mut(x, y);
cell.reset();
// cell.symbol.clear();
cell.set_style(background);
}
}
use tui::widgets::Widget; use tui::widgets::Widget;
// don't like this but the lifetime sucks // don't like this but the lifetime sucks

View File

@ -148,14 +148,7 @@ fn render(&self, viewport: Rect, surface: &mut Surface, cx: &mut Context) {
// clear area // clear area
let background = cx.editor.theme.get("ui.popup"); let background = cx.editor.theme.get("ui.popup");
for y in area.top()..area.bottom() { surface.clear_with(area, background);
for x in area.left()..area.right() {
let cell = surface.get_mut(x, y);
cell.reset();
// cell.symbol.clear();
cell.set_style(background);
}
}
self.contents.render(area, surface, cx); self.contents.render(area, surface, cx);
} }

View File

@ -126,13 +126,7 @@ pub fn render_prompt(&self, area: Rect, surface: &mut Surface, cx: &mut Context)
let area = completion_area; let area = completion_area;
let background = theme.get("ui.statusline"); let background = theme.get("ui.statusline");
for y in area.top()..area.bottom() { surface.clear_with(area, background);
for x in area.left()..area.right() {
let cell = surface.get_mut(x, y);
cell.reset();
cell.set_style(background);
}
}
let mut row = 0; let mut row = 0;
let mut col = 0; let mut col = 0;
@ -172,13 +166,7 @@ pub fn render_prompt(&self, area: Rect, surface: &mut Surface, cx: &mut Context)
); );
let background = theme.get("ui.window"); let background = theme.get("ui.window");
for y in area.top()..area.bottom() { surface.clear_with(area, background);
for x in area.left()..area.right() {
let cell = surface.get_mut(x, y);
cell.reset();
cell.set_style(background);
}
}
use tui::layout::Margin; use tui::layout::Margin;
text.render( text.render(

View File

@ -379,6 +379,26 @@ pub fn reset(&mut self) {
} }
} }
/// Clear an area in the buffer
pub fn clear(&mut self, area: Rect) {
for x in area.left()..area.right() {
for y in area.top()..area.bottom() {
self.get_mut(x, y).reset();
}
}
}
/// Clear an area in the buffer with a default style.
pub fn clear_with(&mut self, area: Rect, style: Style) {
for x in area.left()..area.right() {
for y in area.top()..area.bottom() {
let cell = self.get_mut(x, y);
cell.reset();
cell.set_style(style);
}
}
}
/// Merge an other buffer into this one /// Merge an other buffer into this one
pub fn merge(&mut self, other: &Buffer) { pub fn merge(&mut self, other: &Buffer) {
let area = self.area.union(other.area); let area = self.area.union(other.area);

View File

@ -1,36 +0,0 @@
use crate::buffer::Buffer;
use crate::layout::Rect;
use crate::widgets::Widget;
/// A widget to to clear/reset a certain area to allow overdrawing (e.g. for popups)
///
/// # Examples
///
/// ```
/// # use helix_tui::widgets::{Clear, Block, Borders};
/// # use helix_tui::layout::Rect;
/// # use helix_tui::Frame;
/// # use helix_tui::backend::Backend;
/// fn draw_on_clear<B: Backend>(f: &mut Frame<B>, area: Rect) {
/// let block = Block::default().title("Block").borders(Borders::ALL);
/// f.render_widget(Clear, area); // <- this will clear/reset the area first
/// f.render_widget(block, area); // now render the block widget
/// }
/// ```
///
/// # Popup Example
///
/// For a more complete example how to utilize `Clear` to realize popups see
/// the example `examples/popup.rs`
#[derive(Debug, Clone)]
pub struct Clear;
impl Widget for Clear {
fn render(self, area: Rect, buf: &mut Buffer) {
for x in area.left()..area.right() {
for y in area.top()..area.bottom() {
buf.get_mut(x, y).reset();
}
}
}
}

View File

@ -9,17 +9,14 @@
//! - [`List`] //! - [`List`]
//! - [`Table`] //! - [`Table`]
//! - [`Paragraph`] //! - [`Paragraph`]
//! - [`Clear`]
mod block; mod block;
mod clear;
// mod list; // mod list;
mod paragraph; mod paragraph;
mod reflow; mod reflow;
// mod table; // mod table;
pub use self::block::{Block, BorderType}; pub use self::block::{Block, BorderType};
pub use self::clear::Clear;
// pub use self::list::{List, ListItem, ListState}; // pub use self::list::{List, ListItem, ListState};
pub use self::paragraph::{Paragraph, Wrap}; pub use self::paragraph::{Paragraph, Wrap};
// pub use self::table::{Cell, Row, Table, TableState}; // pub use self::table::{Cell, Row, Table, TableState};