Skip to content

Commit

Permalink
Merge pull request #4083 from davep/progress-diet
Browse files Browse the repository at this point in the history
Small simplification to the composition of `ProgressBar`
  • Loading branch information
willmcgugan authored Jan 31, 2024
2 parents 45ee02c + ccd829f commit cd5e309
Showing 1 changed file with 34 additions and 36 deletions.
70 changes: 34 additions & 36 deletions src/textual/widgets/_progress_bar.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

from .._types import UnusedParameter
from ..app import ComposeResult, RenderResult
from ..containers import Horizontal
from ..geometry import clamp
from ..reactive import reactive
from ..renderables.bar import Bar as BarRenderable
Expand Down Expand Up @@ -43,18 +42,19 @@ class Bar(Widget, can_focus=False):
Bar {
width: 32;
height: 1;
}
Bar > .bar--bar {
color: $warning;
background: $foreground 10%;
}
Bar > .bar--indeterminate {
color: $error;
background: $foreground 10%;
}
Bar > .bar--complete {
color: $success;
background: $foreground 10%;
&> .bar--bar {
color: $warning;
background: $foreground 10%;
}
&> .bar--indeterminate {
color: $error;
background: $foreground 10%;
}
&> .bar--complete {
color: $success;
background: $foreground 10%;
}
}
"""

Expand Down Expand Up @@ -263,13 +263,10 @@ class ProgressBar(Widget, can_focus=False):
"""A progress bar widget."""

DEFAULT_CSS = """
ProgressBar > Horizontal {
width: auto;
height: auto;
}
ProgressBar {
width: auto;
height: 1;
layout: horizontal;
}
"""

Expand Down Expand Up @@ -343,7 +340,9 @@ def compose(self) -> ComposeResult:
# We create a closure so that we can determine what are the sub-widgets
# that are present and, therefore, will need to be notified about changes
# to the percentage.
def update_percentage(widget: Widget) -> Callable[[float | None], None]:
def update_percentage(
widget: Bar | PercentageStatus | ETAStatus,
) -> Callable[[float | None], None]:
"""Closure to allow updating the percentage of a given widget."""

def updater(percentage: float | None) -> None:
Expand All @@ -352,37 +351,36 @@ def updater(percentage: float | None) -> None:

return updater

with Horizontal():
if self.show_bar:
bar = Bar(id="bar")
self.watch(self, "percentage", update_percentage(bar))
yield bar
if self.show_percentage:
percentage_status = PercentageStatus(id="percentage")
self.watch(self, "percentage", update_percentage(percentage_status))
yield percentage_status
if self.show_eta:
eta_status = ETAStatus(id="eta")
self.watch(self, "percentage", update_percentage(eta_status))
yield eta_status

def validate_progress(self, progress: float) -> float:
if self.show_bar:
bar = Bar(id="bar")
self.watch(self, "percentage", update_percentage(bar))
yield bar
if self.show_percentage:
percentage_status = PercentageStatus(id="percentage")
self.watch(self, "percentage", update_percentage(percentage_status))
yield percentage_status
if self.show_eta:
eta_status = ETAStatus(id="eta")
self.watch(self, "percentage", update_percentage(eta_status))
yield eta_status

def _validate_progress(self, progress: float) -> float:
"""Clamp the progress between 0 and the maximum total."""
if self.total is not None:
return clamp(progress, 0, self.total)
return progress

def validate_total(self, total: float | None) -> float | None:
def _validate_total(self, total: float | None) -> float | None:
"""Ensure the total is not negative."""
if total is None:
return total
return max(0, total)

def watch_total(self, total: float | None) -> None:
def _watch_total(self) -> None:
"""Re-validate progress."""
self.progress = self.progress

def compute_percentage(self) -> float | None:
def _compute_percentage(self) -> float | None:
"""Keep the percentage of progress updated automatically.
This will report a percentage of `1` if the total is zero.
Expand Down

0 comments on commit cd5e309

Please sign in to comment.