Coverage for valmix/app.py: 100%
32 statements
« prev ^ index » next coverage.py v7.9.2, created at 2026-10-25 09:28 +0000
« prev ^ index » next coverage.py v7.9.2, created at 2026-10-25 09:28 +0000
1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3#
4# SPDX-License-Identifier: Apache-2.0
5# Copyright 2024 Inria
7"""Main application screen."""
9from typing import List
11import textual.app
12from textual.app import ComposeResult
13from textual.binding import Binding
14from textual.widgets import Footer, Header
16from .knob import Knob
17from .knob_widget import KnobWidget
20class App(textual.app.App):
21 """Valmix application.
23 Attributes:
24 knobs: Knobs manipulated via the app interface.
25 """
27 TITLE = "Valmix"
29 BINDINGS = [
30 Binding(key="down,j", action="next", description="Next"),
31 Binding(key="up,k", action="previous", description="Previous"),
32 Binding(key="left,h", action="decrease", description="Decrease"),
33 Binding(key="right,l", action="increase", description="Increase"),
34 Binding(key="q", action="quit", description="Quit"),
35 ]
37 def __init__(self, knobs: List[Knob]) -> None:
38 """Initialize application.
40 Args:
41 knobs: Knobs manipulated via the app interface.
42 """
43 self.knobs = {knob.name: knob for knob in knobs}
44 super().__init__()
46 def compose(self) -> ComposeResult:
47 """Compose the application screen."""
48 yield Header()
49 for knob in self.knobs.values():
50 yield KnobWidget(knob)
51 yield Footer()
53 def action_decrease(self) -> None:
54 """Decrease currently-selected knob."""
55 if self.focused is not None:
56 knob = self.query_one(f"#{self.focused.id}-knob")
57 if isinstance(knob, KnobWidget): # should be the case
58 knob.advance(-1)
60 def action_increase(self) -> None:
61 """Increase currently-selected knob."""
62 if self.focused is not None:
63 knob = self.query_one(f"#{self.focused.id}-knob")
64 if isinstance(knob, KnobWidget): # should be the case
65 knob.advance(+1)
67 def action_previous(self) -> None:
68 """Focus previous knob."""
69 self.screen.focus_previous()
71 def action_next(self) -> None:
72 """Focus next knob."""
73 self.screen.focus_next()