-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTimerSourceActionCore.py
More file actions
124 lines (99 loc) · 4.24 KB
/
Copy pathTimerSourceActionCore.py
File metadata and controls
124 lines (99 loc) · 4.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
from uuid import UUID
from loguru import logger as log
from .OBSLiveSplitOneCore import OBSLiveSplitOneCore
import gi
gi.require_version("Gtk", "4.0")
gi.require_version("Adw", "1")
from gi.repository import Gtk, Adw, Gio, GObject
class OBSSource(GObject.Object):
name = GObject.Property(type=str)
uuid = GObject.Property(type=str)
def __init__(self, name: str, uuid: UUID | str):
super().__init__()
self.name = name
self.uuid = str(uuid)
class TimerSourceActionCore(OBSLiveSplitOneCore):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def get_config_rows(self) -> list:
self.timer_source_base_settings = Adw.PreferencesGroup()
self.timer_source_base_settings.set_title(
self.plugin_base.locale_manager.get(
"actions.timer-source-base.preferences-group.title"
)
)
self.timer_source_base_settings.set_description(
self.plugin_base.locale_manager.get(
"actions.timer-source-base.preferences-group.description"
)
)
self.timer_source_base_settings.set_margin_top(10)
self.timer_source_base_settings.set_margin_bottom(10)
self.source_entry = Adw.ComboRow(
title=self.plugin_base.locale_manager.get(
"actions.timer-source-base.source.label"
)
)
self._populate_source_model()
self.timer_source_base_settings.add(self.source_entry)
base_rows = super().get_config_rows()
self.source_entry.connect("notify::selected", self.on_change_source)
return [self.timer_source_base_settings, *base_rows]
def load_config_defaults(self):
super().load_config_defaults()
settings = self.get_settings()
source_uuid = settings.get("source-uuid")
if source_uuid:
for i in range(self.source_model.get_n_items()):
if self.source_model.get_item(i).uuid == source_uuid:
self.source_entry.set_selected(i)
break
else:
log.debug(f"LiveSplit One source with UUID {source_uuid} not"
f" found. Preserving setting until user selects"
f" another.")
self.source_model.insert(
0,
OBSSource("<<unknown source>>", source_uuid)
)
self.source_entry.set_selected(0)
else:
initial_selection = self.source_entry.get_selected_item()
if initial_selection is not None:
log.debug(f"Defaulting source to: {initial_selection.name}")
settings["source-uuid"] = initial_selection.uuid
self.set_settings(settings)
def on_change_source(self, sources, *args):
selected_source = sources.get_selected_item()
if selected_source is not None:
log.debug(f"Selected source changed to: {selected_source.name}")
settings = self.get_settings()
settings["source-uuid"] = selected_source.uuid
self.set_settings(settings)
def _populate_source_model(self):
self.source_model = Gio.ListStore()
if not self.plugin_base.get_connected():
self.reconnect_obs()
if not self.plugin_base.get_connected():
return
sources = sorted(
self.plugin_base.backend.get_all_livesplit_one_sources(),
key=lambda source: source["name"]
)
for source in sources:
self.source_model.append(
OBSSource(source["name"], source["uuid"])
)
self.source_entry.set_model(self.source_model)
source_factory = Gtk.SignalListItemFactory()
def f_setup(fact, item):
label = Gtk.Label(halign=Gtk.Align.START)
label.set_selectable(False)
item.set_child(label)
source_factory.connect("setup", f_setup)
def f_bind(fact, item):
item.get_child().set_label(item.get_item().name)
source_factory.connect("bind", f_bind)
self.source_entry.set_factory(source_factory)
def get_source_uuid(self) -> str | None:
return self.get_settings().get("source-uuid")