Skip to content

Commit d12b240

Browse files
committed
Finish design of BasePayload model and mixin classes, including new mixin that provides the attribute
1 parent 593bbca commit d12b240

File tree

5 files changed

+62
-27
lines changed

5 files changed

+62
-27
lines changed

streamdeck/models/events/common.py

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ class DeviceSpecificEventMixin:
2828
## Payload models and metadata used by multiple event models.
2929

3030

31+
PluginDefinedData = dict[str, Any]
32+
"""Data of arbitrary structure that is defined in and relevant to the plugin."""
33+
34+
3135
EncoderControllerType = Literal["Encoder"]
3236
"""The 'Encoder' controller type refers to a dial or touchscreen on a 'Stream Deck +' device."""
3337
KeypadControllerType = Literal["Keypad"]
@@ -38,8 +42,16 @@ class DeviceSpecificEventMixin:
3842
CT = TypeVar("CT", bound=ControllerType, default=ControllerType)
3943

4044

41-
PluginDefinedData = dict[str, Any]
42-
"""Data of arbitrary structure that is defined in and relevant to the plugin."""
45+
class BasePayload(ConfiguredBaseModel, Generic[CT], ABC):
46+
"""Base class for all complex payload models."""
47+
controller: CT
48+
"""Defines the controller type the action is applicable to.
49+
50+
'Keypad' refers to a standard action on a Stream Deck device, e.g. buttons or a pedal.
51+
'Encoder' refers to a dial / touchscreen on a 'Stream Deck +' device.
52+
"""
53+
settings: PluginDefinedData
54+
"""Settings associated with the action instance."""
4355

4456

4557
class CoordinatesDict(TypedDict):
@@ -81,21 +93,8 @@ def coordinates(self) -> Coordinates:
8193
return Coordinates(**self.coordinates_obj)
8294

8395

84-
class BasePayload(ConfiguredBaseModel, Generic[CT], ABC):
85-
"""Base class for all complex payload models."""
86-
controller: CT
87-
"""Defines the controller type the action is applicable to.
88-
89-
'Keypad' refers to a standard action on a Stream Deck device, e.g. buttons or a pedal.
90-
'Encoder' refers to a dial / touchscreen on a 'Stream Deck +' device.
91-
"""
92-
settings: PluginDefinedData
93-
"""Settings associated with the action instance."""
94-
95-
96-
class BaseActionPayload(BasePayload[CT], ABC):
97-
"""Base class for payloads of action events."""
98-
96+
class StatefulActionPayloadMixin:
97+
"""Mixin class for payload models that have an optional state field."""
9998
state: Optional[int] = None # noqa: UP007
10099
"""Current state of the action.
101100

streamdeck/models/events/keys.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@
66

77
from streamdeck.models.events.base import EventBase
88
from streamdeck.models.events.common import (
9-
BaseActionPayload,
9+
BasePayload,
1010
CardinalityDiscriminated,
1111
ContextualEventMixin,
1212
CoordinatesPayloadMixin,
1313
DeviceSpecificEventMixin,
1414
KeypadControllerType,
1515
MultiActionPayloadMixin,
1616
SingleActionPayloadMixin,
17+
StatefulActionPayloadMixin,
1718
)
1819

1920

@@ -23,11 +24,20 @@
2324
OptionalKeyControllerTypeField = Annotated[KeypadControllerType, Field(default=None)]
2425

2526

26-
class SingleActionKeyGesturePayload(BaseActionPayload[OptionalKeyControllerTypeField], SingleActionPayloadMixin, CoordinatesPayloadMixin):
27+
class SingleActionKeyGesturePayload(
28+
BasePayload[OptionalKeyControllerTypeField],
29+
SingleActionPayloadMixin,
30+
StatefulActionPayloadMixin,
31+
CoordinatesPayloadMixin,
32+
):
2733
"""Contextualized information for a KeyDown or KeyUp event that is not part of a multi-action."""
2834

2935

30-
class MultiActionKeyGesturePayload(BaseActionPayload[OptionalKeyControllerTypeField], MultiActionPayloadMixin):
36+
class MultiActionKeyGesturePayload(
37+
BasePayload[OptionalKeyControllerTypeField],
38+
MultiActionPayloadMixin,
39+
StatefulActionPayloadMixin,
40+
):
3141
"""Contextualized information for a KeyDown or KeyUp event that is part of a multi-action."""
3242
user_desired_state: Annotated[int, Field(alias="userDesiredState")]
3343
"""Desired state as specified by the user.

streamdeck/models/events/settings.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from streamdeck.models.events.base import ConfiguredBaseModel, EventBase
66
from streamdeck.models.events.common import (
7-
BaseActionPayload,
7+
BasePayload,
88
CardinalityDiscriminated,
99
ContextualEventMixin,
1010
CoordinatesPayloadMixin,
@@ -13,16 +13,27 @@
1313
MultiActionPayloadMixin,
1414
PluginDefinedData,
1515
SingleActionPayloadMixin,
16+
StatefulActionPayloadMixin,
1617
)
1718

1819

1920
## Models for didReceiveSettings event and its specific payloads.
2021

21-
class SingleActionSettingsPayload(BaseActionPayload, SingleActionPayloadMixin, CoordinatesPayloadMixin):
22+
23+
class SingleActionSettingsPayload(
24+
BasePayload,
25+
SingleActionPayloadMixin,
26+
StatefulActionPayloadMixin,
27+
CoordinatesPayloadMixin,
28+
):
2229
"""Contextualized information for a didReceiveSettings events that are not part of a multi-action."""
2330

2431

25-
class MultiActionSettingsPayload(BaseActionPayload[KeypadControllerType], MultiActionPayloadMixin):
32+
class MultiActionSettingsPayload(
33+
BasePayload[KeypadControllerType],
34+
MultiActionPayloadMixin,
35+
StatefulActionPayloadMixin,
36+
):
2637
"""Contextualized information for a didReceiveSettings events that are part of a multi-action.
2738
2839
NOTE: Action instances that are part of a multi-action are only applicable to the 'Keypad' controller type.

streamdeck/models/events/title_parameters.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66

77
from streamdeck.models.events.base import ConfiguredBaseModel, EventBase
88
from streamdeck.models.events.common import (
9-
BaseActionPayload,
9+
BasePayload,
1010
CoordinatesPayloadMixin,
1111
DeviceSpecificEventMixin,
12+
StatefulActionPayloadMixin,
1213
)
1314

1415

@@ -34,7 +35,11 @@ class TitleParameters(ConfiguredBaseModel):
3435
"""Color of the title, represented as a hexadecimal value."""
3536

3637

37-
class TitleParametersDidChangePayload(BaseActionPayload, CoordinatesPayloadMixin):
38+
class TitleParametersDidChangePayload(
39+
BasePayload,
40+
CoordinatesPayloadMixin,
41+
StatefulActionPayloadMixin,
42+
):
3843
"""Contextualized information for this event."""
3944
title: str
4045
"""Title of the action, as specified by the user or dynamically by the plugin."""

streamdeck/models/events/visibility.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,24 @@
1212
KeypadControllerType,
1313
MultiActionPayloadMixin,
1414
SingleActionPayloadMixin,
15+
StatefulActionPayloadMixin,
1516
)
1617

1718

18-
class SingleActionVisibilityPayload(BaseActionPayload, SingleActionPayloadMixin, CoordinatesPayloadMixin):
19+
class SingleActionVisibilityPayload(
20+
BasePayload,
21+
SingleActionPayloadMixin,
22+
StatefulActionPayloadMixin,
23+
CoordinatesPayloadMixin,
24+
):
1925
"""Contextualized information for willAppear and willDisappear events that is not part of a multi-action."""
2026

2127

22-
class MultiActionVisibilityPayload(BaseActionPayload[KeypadControllerType], MultiActionPayloadMixin):
28+
class MultiActionVisibilityPayload(
29+
BasePayload[KeypadControllerType],
30+
MultiActionPayloadMixin,
31+
StatefulActionPayloadMixin,
32+
):
2333
"""Contextualized information for willAppear and willDisappear events that is part of a multi-action."""
2434

2535

0 commit comments

Comments
 (0)