Replace the Clear widget with buffer.clear/clear_with.

imgbot
Blaž Hrastnik 3 years ago
parent 1255bcb8a3
commit ff4c1d05de

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

@ -205,14 +205,7 @@ impl<T: 'static> Component for Picker<T> {
// clear area
let background = cx.editor.theme.get("ui.background");
for y in area.top()..area.bottom() {
for x in area.left()..area.right() {
let cell = surface.get_mut(x, y);
cell.reset();
// cell.symbol.clear();
cell.set_style(background);
}
}
surface.clear_with(area, background);
use tui::widgets::Widget;
// don't like this but the lifetime sucks

@ -148,14 +148,7 @@ impl<T: Component> Component for Popup<T> {
// clear area
let background = cx.editor.theme.get("ui.popup");
for y in area.top()..area.bottom() {
for x in area.left()..area.right() {
let cell = surface.get_mut(x, y);
cell.reset();
// cell.symbol.clear();
cell.set_style(background);
}
}
surface.clear_with(area, background);
self.contents.render(area, surface, cx);
}

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

@ -379,6 +379,26 @@ impl Buffer {
}
}
/// 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
pub fn merge(&mut self, other: &Buffer) {
let area = self.area.union(other.area);

@ -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();
}
}
}
}

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

Loading…
Cancel
Save