Animating alpha colors

This commit is contained in:
Darren Burns
2022-10-20 09:47:03 +01:00
parent 48d59bb4fe
commit 311108f779
4 changed files with 50 additions and 13 deletions

View File

View File

@@ -0,0 +1,22 @@
from textual.app import App, ComposeResult
from textual.color import Color
from textual.widgets import Static
START_COLOR = Color.parse("#FF0000EE")
END_COLOR = Color.parse("#0000FF0F")
class ColorAnimate(App):
def compose(self) -> ComposeResult:
box = Static("Hello, world", id="box")
box.styles.background = START_COLOR
self.box = box
yield box
def key_a(self):
self.animator.animate(self.box.styles, "background", END_COLOR, duration=2.0)
app = ColorAnimate(css_path="color_animate.css")
if __name__ == "__main__":
app.run()

View File

@@ -2,19 +2,21 @@ from __future__ import annotations
from textual.app import App, ComposeResult from textual.app import App, ComposeResult
from textual.binding import Binding from textual.binding import Binding
from textual.screen import Screen
from textual.widgets import Static, Footer, Header from textual.widgets import Static, Footer, Header
class JustABox(App): class MainScreen(Screen):
BINDINGS = [ BINDINGS = [
Binding( Binding(
key="ctrl+t", action="text_fade_out", description="text-opacity fade out" key="ctrl+t", action="text_fade_out", description="text-opacity fade out"
), ),
Binding( (
key="o,f,w", "o,f,w",
action="widget_fade_out", "widget_fade_out",
description="opacity fade out", "opacity fade out",
key_display="o or f or w", # key_display="o or f or w",
), ),
] ]
@@ -25,11 +27,16 @@ class JustABox(App):
def action_text_fade_out(self) -> None: def action_text_fade_out(self) -> None:
box = self.query_one("#box1") box = self.query_one("#box1")
self.animator.animate(box.styles, "text_opacity", value=0.0, duration=1) self.app.animator.animate(box.styles, "text_opacity", value=0.0, duration=1)
def action_widget_fade_out(self) -> None: def action_widget_fade_out(self) -> None:
box = self.query_one("#box1") box = self.query_one("#box1")
self.animator.animate(box.styles, "opacity", value=0.0, duration=1) self.app.animator.animate(box.styles, "opacity", value=0.0, duration=1)
class JustABox(App):
def on_mount(self):
self.push_screen(MainScreen())
def key_d(self): def key_d(self):
print(self.screen.styles.get_rules()) print(self.screen.styles.get_rules())

View File

@@ -341,13 +341,15 @@ class Color(NamedTuple):
r, g, b, _ = self r, g, b, _ = self
return Color(r, g, b, alpha) return Color(r, g, b, alpha)
def blend(self, destination: Color, factor: float, alpha: float = 1) -> Color: def blend(
self, destination: Color, factor: float, alpha: float | None = None
) -> Color:
"""Generate a new color between two colors. """Generate a new color between two colors.
Args: Args:
destination (Color): Another color. destination (Color): Another color.
factor (float): A blend factor, 0 -> 1. factor (float): A blend factor, 0 -> 1.
alpha (float | None): New alpha for result. Defaults to 1. alpha (float | None): New alpha for result. Defaults to None.
Returns: Returns:
Color: A new color. Color: A new color.
@@ -356,13 +358,19 @@ class Color(NamedTuple):
return self return self
elif factor == 1: elif factor == 1:
return destination return destination
r1, g1, b1, _ = self r1, g1, b1, a1 = self
r2, g2, b2, _ = destination r2, g2, b2, a2 = destination
if alpha is None:
new_alpha = a1 + (a2 - a1) * factor
else:
new_alpha = alpha
return Color( return Color(
int(r1 + (r2 - r1) * factor), int(r1 + (r2 - r1) * factor),
int(g1 + (g2 - g1) * factor), int(g1 + (g2 - g1) * factor),
int(b1 + (b2 - b1) * factor), int(b1 + (b2 - b1) * factor),
alpha, new_alpha,
) )
def __add__(self, other: object) -> Color: def __add__(self, other: object) -> Color: