pub struct Gauge<'a> { /* private fields */ }
Expand description
A widget to display a progress bar.
A Gauge
renders a bar filled according to the value given to Gauge::percent
or
Gauge::ratio
. The bar width and height are defined by the Rect
it is
rendered in.
The associated label is always centered horizontally and vertically. If not set with
Gauge::label
, the label is the percentage of the bar filled.
You might want to have a higher precision bar using Gauge::use_unicode
.
This can be useful to indicate the progression of a task, like a download.
§Example
use ratatui::{
style::{Style, Stylize},
widgets::{Block, Gauge},
};
Gauge::default()
.block(Block::bordered().title("Progress"))
.gauge_style(Style::new().white().on_black().italic())
.percent(20);
§See also
LineGauge
for a thin progress bar
Implementations§
Source§impl<'a> Gauge<'a>
impl<'a> Gauge<'a>
Sourcepub fn block(self, block: Block<'a>) -> Self
pub fn block(self, block: Block<'a>) -> Self
Surrounds the Gauge
with a Block
.
The gauge is rendered in the inner portion of the block once space for borders and padding is reserved. Styles set on the block do not affect the bar itself.
Examples found in repository?
151 fn render_gauge1(&self, area: Rect, buf: &mut Buffer) {
152 let title = title_block("Gauge with percentage");
153 Gauge::default()
154 .block(title)
155 .gauge_style(GAUGE1_COLOR)
156 .percent(self.progress1)
157 .render(area, buf);
158 }
159
160 fn render_gauge2(&self, area: Rect, buf: &mut Buffer) {
161 let title = title_block("Gauge with ratio and custom label");
162 let label = Span::styled(
163 format!("{:.1}/100", self.progress2),
164 Style::new().italic().bold().fg(CUSTOM_LABEL_COLOR),
165 );
166 Gauge::default()
167 .block(title)
168 .gauge_style(GAUGE2_COLOR)
169 .ratio(self.progress2 / 100.0)
170 .label(label)
171 .render(area, buf);
172 }
173
174 fn render_gauge3(&self, area: Rect, buf: &mut Buffer) {
175 let title = title_block("Gauge with ratio (no unicode)");
176 let label = format!("{:.1}%", self.progress3);
177 Gauge::default()
178 .block(title)
179 .gauge_style(GAUGE3_COLOR)
180 .ratio(self.progress3 / 100.0)
181 .label(label)
182 .render(area, buf);
183 }
184
185 fn render_gauge4(&self, area: Rect, buf: &mut Buffer) {
186 let title = title_block("Gauge with ratio (unicode)");
187 let label = format!("{:.1}%", self.progress3);
188 Gauge::default()
189 .block(title)
190 .gauge_style(GAUGE4_COLOR)
191 .ratio(self.progress4 / 100.0)
192 .label(label)
193 .use_unicode(true)
194 .render(area, buf);
195 }
Sourcepub fn percent(self, percent: u16) -> Self
pub fn percent(self, percent: u16) -> Self
Sets the bar progression from a percentage.
§Panics
This method panics if percent
is not between 0 and 100 inclusively.
§See also
See Gauge::ratio
to set from a float.
Sourcepub fn ratio(self, ratio: f64) -> Self
pub fn ratio(self, ratio: f64) -> Self
Sets the bar progression from a ratio (float).
ratio
is the ratio between filled bar over empty bar (i.e. 3/4
completion is 0.75
).
This is more easily seen as a floating point percentage (e.g. 42% = 0.42
).
§Panics
This method panics if ratio
is not between 0 and 1 inclusively.
§See also
See Gauge::percent
to set from a percentage.
Examples found in repository?
160 fn render_gauge2(&self, area: Rect, buf: &mut Buffer) {
161 let title = title_block("Gauge with ratio and custom label");
162 let label = Span::styled(
163 format!("{:.1}/100", self.progress2),
164 Style::new().italic().bold().fg(CUSTOM_LABEL_COLOR),
165 );
166 Gauge::default()
167 .block(title)
168 .gauge_style(GAUGE2_COLOR)
169 .ratio(self.progress2 / 100.0)
170 .label(label)
171 .render(area, buf);
172 }
173
174 fn render_gauge3(&self, area: Rect, buf: &mut Buffer) {
175 let title = title_block("Gauge with ratio (no unicode)");
176 let label = format!("{:.1}%", self.progress3);
177 Gauge::default()
178 .block(title)
179 .gauge_style(GAUGE3_COLOR)
180 .ratio(self.progress3 / 100.0)
181 .label(label)
182 .render(area, buf);
183 }
184
185 fn render_gauge4(&self, area: Rect, buf: &mut Buffer) {
186 let title = title_block("Gauge with ratio (unicode)");
187 let label = format!("{:.1}%", self.progress3);
188 Gauge::default()
189 .block(title)
190 .gauge_style(GAUGE4_COLOR)
191 .ratio(self.progress4 / 100.0)
192 .label(label)
193 .use_unicode(true)
194 .render(area, buf);
195 }
More examples
231fn draw(frame: &mut Frame, downloads: &Downloads) {
232 let area = frame.area();
233
234 let block = Block::new().title(Line::from("Progress").centered());
235 frame.render_widget(block, area);
236
237 let vertical = Layout::vertical([Constraint::Length(2), Constraint::Length(4)]).margin(1);
238 let horizontal = Layout::horizontal([Constraint::Percentage(20), Constraint::Percentage(80)]);
239 let [progress_area, main] = vertical.areas(area);
240 let [list_area, gauge_area] = horizontal.areas(main);
241
242 // total progress
243 let done = NUM_DOWNLOADS - downloads.pending.len() - downloads.in_progress.len();
244 #[allow(clippy::cast_precision_loss)]
245 let progress = LineGauge::default()
246 .filled_style(Style::default().fg(Color::Blue))
247 .label(format!("{done}/{NUM_DOWNLOADS}"))
248 .ratio(done as f64 / NUM_DOWNLOADS as f64);
249 frame.render_widget(progress, progress_area);
250
251 // in progress downloads
252 let items: Vec<ListItem> = downloads
253 .in_progress
254 .values()
255 .map(|download| {
256 ListItem::new(Line::from(vec![
257 Span::raw(symbols::DOT),
258 Span::styled(
259 format!(" download {:>2}", download.id),
260 Style::default()
261 .fg(Color::LightGreen)
262 .add_modifier(Modifier::BOLD),
263 ),
264 Span::raw(format!(
265 " ({}ms)",
266 download.started_at.elapsed().as_millis()
267 )),
268 ]))
269 })
270 .collect();
271 let list = List::new(items);
272 frame.render_widget(list, list_area);
273
274 #[allow(clippy::cast_possible_truncation)]
275 for (i, (_, download)) in downloads.in_progress.iter().enumerate() {
276 let gauge = Gauge::default()
277 .gauge_style(Style::default().fg(Color::Yellow))
278 .ratio(download.progress / 100.0);
279 if gauge_area.top().saturating_add(i as u16) > area.bottom() {
280 continue;
281 }
282 frame.render_widget(
283 gauge,
284 Rect {
285 x: gauge_area.left(),
286 y: gauge_area.top().saturating_add(i as u16),
287 width: gauge_area.width,
288 height: 1,
289 },
290 );
291 }
292}
Sourcepub fn label<T>(self, label: T) -> Self
pub fn label<T>(self, label: T) -> Self
Sets the label to display in the center of the bar.
For a left-aligned label, see LineGauge
.
If the label is not defined, it is the percentage filled.
Examples found in repository?
160 fn render_gauge2(&self, area: Rect, buf: &mut Buffer) {
161 let title = title_block("Gauge with ratio and custom label");
162 let label = Span::styled(
163 format!("{:.1}/100", self.progress2),
164 Style::new().italic().bold().fg(CUSTOM_LABEL_COLOR),
165 );
166 Gauge::default()
167 .block(title)
168 .gauge_style(GAUGE2_COLOR)
169 .ratio(self.progress2 / 100.0)
170 .label(label)
171 .render(area, buf);
172 }
173
174 fn render_gauge3(&self, area: Rect, buf: &mut Buffer) {
175 let title = title_block("Gauge with ratio (no unicode)");
176 let label = format!("{:.1}%", self.progress3);
177 Gauge::default()
178 .block(title)
179 .gauge_style(GAUGE3_COLOR)
180 .ratio(self.progress3 / 100.0)
181 .label(label)
182 .render(area, buf);
183 }
184
185 fn render_gauge4(&self, area: Rect, buf: &mut Buffer) {
186 let title = title_block("Gauge with ratio (unicode)");
187 let label = format!("{:.1}%", self.progress3);
188 Gauge::default()
189 .block(title)
190 .gauge_style(GAUGE4_COLOR)
191 .ratio(self.progress4 / 100.0)
192 .label(label)
193 .use_unicode(true)
194 .render(area, buf);
195 }
Sourcepub fn style<S: Into<Style>>(self, style: S) -> Self
pub fn style<S: Into<Style>>(self, style: S) -> Self
Sets the widget style.
style
accepts any type that is convertible to Style
(e.g. Style
, Color
, or
your own type that implements Into<Style>
).
This will style the block (if any non-styled) and background of the widget (everything
except the bar itself). Block
style set with Gauge::block
takes precedence.
Sourcepub fn gauge_style<S: Into<Style>>(self, style: S) -> Self
pub fn gauge_style<S: Into<Style>>(self, style: S) -> Self
Sets the style of the bar.
style
accepts any type that is convertible to Style
(e.g. Style
, Color
, or
your own type that implements Into<Style>
).
Examples found in repository?
151 fn render_gauge1(&self, area: Rect, buf: &mut Buffer) {
152 let title = title_block("Gauge with percentage");
153 Gauge::default()
154 .block(title)
155 .gauge_style(GAUGE1_COLOR)
156 .percent(self.progress1)
157 .render(area, buf);
158 }
159
160 fn render_gauge2(&self, area: Rect, buf: &mut Buffer) {
161 let title = title_block("Gauge with ratio and custom label");
162 let label = Span::styled(
163 format!("{:.1}/100", self.progress2),
164 Style::new().italic().bold().fg(CUSTOM_LABEL_COLOR),
165 );
166 Gauge::default()
167 .block(title)
168 .gauge_style(GAUGE2_COLOR)
169 .ratio(self.progress2 / 100.0)
170 .label(label)
171 .render(area, buf);
172 }
173
174 fn render_gauge3(&self, area: Rect, buf: &mut Buffer) {
175 let title = title_block("Gauge with ratio (no unicode)");
176 let label = format!("{:.1}%", self.progress3);
177 Gauge::default()
178 .block(title)
179 .gauge_style(GAUGE3_COLOR)
180 .ratio(self.progress3 / 100.0)
181 .label(label)
182 .render(area, buf);
183 }
184
185 fn render_gauge4(&self, area: Rect, buf: &mut Buffer) {
186 let title = title_block("Gauge with ratio (unicode)");
187 let label = format!("{:.1}%", self.progress3);
188 Gauge::default()
189 .block(title)
190 .gauge_style(GAUGE4_COLOR)
191 .ratio(self.progress4 / 100.0)
192 .label(label)
193 .use_unicode(true)
194 .render(area, buf);
195 }
More examples
231fn draw(frame: &mut Frame, downloads: &Downloads) {
232 let area = frame.area();
233
234 let block = Block::new().title(Line::from("Progress").centered());
235 frame.render_widget(block, area);
236
237 let vertical = Layout::vertical([Constraint::Length(2), Constraint::Length(4)]).margin(1);
238 let horizontal = Layout::horizontal([Constraint::Percentage(20), Constraint::Percentage(80)]);
239 let [progress_area, main] = vertical.areas(area);
240 let [list_area, gauge_area] = horizontal.areas(main);
241
242 // total progress
243 let done = NUM_DOWNLOADS - downloads.pending.len() - downloads.in_progress.len();
244 #[allow(clippy::cast_precision_loss)]
245 let progress = LineGauge::default()
246 .filled_style(Style::default().fg(Color::Blue))
247 .label(format!("{done}/{NUM_DOWNLOADS}"))
248 .ratio(done as f64 / NUM_DOWNLOADS as f64);
249 frame.render_widget(progress, progress_area);
250
251 // in progress downloads
252 let items: Vec<ListItem> = downloads
253 .in_progress
254 .values()
255 .map(|download| {
256 ListItem::new(Line::from(vec![
257 Span::raw(symbols::DOT),
258 Span::styled(
259 format!(" download {:>2}", download.id),
260 Style::default()
261 .fg(Color::LightGreen)
262 .add_modifier(Modifier::BOLD),
263 ),
264 Span::raw(format!(
265 " ({}ms)",
266 download.started_at.elapsed().as_millis()
267 )),
268 ]))
269 })
270 .collect();
271 let list = List::new(items);
272 frame.render_widget(list, list_area);
273
274 #[allow(clippy::cast_possible_truncation)]
275 for (i, (_, download)) in downloads.in_progress.iter().enumerate() {
276 let gauge = Gauge::default()
277 .gauge_style(Style::default().fg(Color::Yellow))
278 .ratio(download.progress / 100.0);
279 if gauge_area.top().saturating_add(i as u16) > area.bottom() {
280 continue;
281 }
282 frame.render_widget(
283 gauge,
284 Rect {
285 x: gauge_area.left(),
286 y: gauge_area.top().saturating_add(i as u16),
287 width: gauge_area.width,
288 height: 1,
289 },
290 );
291 }
292}
Sourcepub const fn use_unicode(self, unicode: bool) -> Self
pub const fn use_unicode(self, unicode: bool) -> Self
Sets whether to use unicode characters to display the progress bar.
This enables the use of unicode block characters. This is useful to display a higher precision bar (8 extra fractional parts per cell).
Trait Implementations§
Source§impl WidgetRef for Gauge<'_>
impl WidgetRef for Gauge<'_>
Source§fn render_ref(&self, area: Rect, buf: &mut Buffer)
fn render_ref(&self, area: Rect, buf: &mut Buffer)
unstable-widget-ref
only.impl<'a> StructuralPartialEq for Gauge<'a>
Auto Trait Implementations§
impl<'a> Freeze for Gauge<'a>
impl<'a> RefUnwindSafe for Gauge<'a>
impl<'a> Send for Gauge<'a>
impl<'a> Sync for Gauge<'a>
impl<'a> Unpin for Gauge<'a>
impl<'a> UnwindSafe for Gauge<'a>
Blanket Implementations§
Source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
Source§fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
Source§fn adapt_into(self) -> D
fn adapt_into(self) -> D
Source§impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
Source§fn arrays_from(colors: C) -> T
fn arrays_from(colors: C) -> T
Source§impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
Source§fn arrays_into(self) -> C
fn arrays_into(self) -> C
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
Source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
parameters
when converting.Source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T
self
into C
, using the provided parameters.Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
Source§fn components_from(colors: C) -> T
fn components_from(colors: C) -> T
Source§impl<T> FromAngle<T> for T
impl<T> FromAngle<T> for T
Source§fn from_angle(angle: T) -> T
fn from_angle(angle: T) -> T
angle
.Source§impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
Source§fn from_stimulus(other: U) -> T
fn from_stimulus(other: U) -> T
other
into Self
, while performing the appropriate scaling,
rounding and clamping.Source§impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
Source§fn into_angle(self) -> U
fn into_angle(self) -> U
T
.Source§impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
Source§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
parameters
when converting.Source§fn into_cam16_unclamped(
self,
parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>,
) -> T
fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T
self
into C
, using the provided parameters.Source§impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
Source§fn into_color(self) -> U
fn into_color(self) -> U
Source§impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
Source§fn into_color_unclamped(self) -> U
fn into_color_unclamped(self) -> U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoStimulus<T> for T
impl<T> IntoStimulus<T> for T
Source§fn into_stimulus(self) -> T
fn into_stimulus(self) -> T
self
into T
, while performing the appropriate scaling,
rounding and clamping.Source§impl<'a, T, U> Stylize<'a, T> for Uwhere
U: Styled<Item = T>,
impl<'a, T, U> Stylize<'a, T> for Uwhere
U: Styled<Item = T>,
fn bg<C>(self, color: C) -> T
fn fg<C>(self, color: C) -> T
fn add_modifier(self, modifier: Modifier) -> T
fn remove_modifier(self, modifier: Modifier) -> T
fn reset(self) -> T
Source§fn on_magenta(self) -> T
fn on_magenta(self) -> T
magenta
.Source§fn on_dark_gray(self) -> T
fn on_dark_gray(self) -> T
dark_gray
.Source§fn on_light_red(self) -> T
fn on_light_red(self) -> T
light_red
.Source§fn light_green(self) -> T
fn light_green(self) -> T
light_green
.Source§fn on_light_green(self) -> T
fn on_light_green(self) -> T
light_green
.Source§fn light_yellow(self) -> T
fn light_yellow(self) -> T
light_yellow
.Source§fn on_light_yellow(self) -> T
fn on_light_yellow(self) -> T
light_yellow
.Source§fn light_blue(self) -> T
fn light_blue(self) -> T
light_blue
.Source§fn on_light_blue(self) -> T
fn on_light_blue(self) -> T
light_blue
.Source§fn light_magenta(self) -> T
fn light_magenta(self) -> T
light_magenta
.Source§fn on_light_magenta(self) -> T
fn on_light_magenta(self) -> T
light_magenta
.Source§fn light_cyan(self) -> T
fn light_cyan(self) -> T
light_cyan
.Source§fn on_light_cyan(self) -> T
fn on_light_cyan(self) -> T
light_cyan
.Source§fn not_italic(self) -> T
fn not_italic(self) -> T
ITALIC
modifier.Source§fn underlined(self) -> T
fn underlined(self) -> T
UNDERLINED
modifier.Source§fn not_underlined(self) -> T
fn not_underlined(self) -> T
UNDERLINED
modifier.Source§fn slow_blink(self) -> T
fn slow_blink(self) -> T
SLOW_BLINK
modifier.Source§fn not_slow_blink(self) -> T
fn not_slow_blink(self) -> T
SLOW_BLINK
modifier.Source§fn rapid_blink(self) -> T
fn rapid_blink(self) -> T
RAPID_BLINK
modifier.Source§fn not_rapid_blink(self) -> T
fn not_rapid_blink(self) -> T
RAPID_BLINK
modifier.Source§fn not_reversed(self) -> T
fn not_reversed(self) -> T
REVERSED
modifier.HIDDEN
modifier.HIDDEN
modifier.Source§fn crossed_out(self) -> T
fn crossed_out(self) -> T
CROSSED_OUT
modifier.Source§fn not_crossed_out(self) -> T
fn not_crossed_out(self) -> T
CROSSED_OUT
modifier.Source§impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
Source§type Error = <C as TryFromComponents<T>>::Error
type Error = <C as TryFromComponents<T>>::Error
try_into_colors
fails to cast.Source§fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
Source§impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
Source§fn try_into_color(self) -> Result<U, OutOfBounds<U>>
fn try_into_color(self) -> Result<U, OutOfBounds<U>>
OutOfBounds
error is returned which contains
the unclamped color. Read more