Coverage for valmix/app.py: 100%

32 statements  

« 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 

6 

7"""Main application screen.""" 

8 

9from typing import List 

10 

11import textual.app 

12from textual.app import ComposeResult 

13from textual.binding import Binding 

14from textual.widgets import Footer, Header 

15 

16from .knob import Knob 

17from .knob_widget import KnobWidget 

18 

19 

20class App(textual.app.App): 

21 """Valmix application. 

22 

23 Attributes: 

24 knobs: Knobs manipulated via the app interface. 

25 """ 

26 

27 TITLE = "Valmix" 

28 

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 ] 

36 

37 def __init__(self, knobs: List[Knob]) -> None: 

38 """Initialize application. 

39 

40 Args: 

41 knobs: Knobs manipulated via the app interface. 

42 """ 

43 self.knobs = {knob.name: knob for knob in knobs} 

44 super().__init__() 

45 

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() 

52 

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) 

59 

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) 

66 

67 def action_previous(self) -> None: 

68 """Focus previous knob.""" 

69 self.screen.focus_previous() 

70 

71 def action_next(self) -> None: 

72 """Focus next knob.""" 

73 self.screen.focus_next()