Skip to content
Merged
11 changes: 10 additions & 1 deletion GtkHelper/GtkHelper.py
Original file line number Diff line number Diff line change
Expand Up @@ -401,4 +401,13 @@ def __init__(self, title, model: Gtk.ListStore, **kwargs):
self.main_box.append(self.label)

self.combo_box = Gtk.ComboBox.new_with_model(self.model)
self.main_box.append(self.combo_box)
self.main_box.append(self.combo_box)

class BackButton(Gtk.Button):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6)
self.set_child(self.box)

self.box.append(Gtk.Image(icon_name="go-previous-symbolic"))
self.box.append(Gtk.Label(label=gl.lm.get("go-back")))
5 changes: 5 additions & 0 deletions flatpak/com.core447.StreamController.metainfo.xml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@
<url type="bugtracker">https://github.com/StreamController/StreamController/issues</url>
<url type="contribute">https://github.com/StreamController/StreamController</url>
<releases>
<release version="1.4.9-beta" date="2024-04-10">
<description translatable="no">
<p>Bugfixes</p>
</description>
</release>
<release version="1.4.8-beta" date="2024-04-09">
<description translatable="no">
<p>Bugfixes</p>
Expand Down
2 changes: 1 addition & 1 deletion globals.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
threads_running: bool = True


app_version: str = "1.4.8-beta" # In breaking.feature.fix-state format
app_version: str = "1.4.9-beta" # In breaking.feature.fix-state format
exact_app_version_check: bool = False
argparser: argparse.ArgumentParser = None
logs: list[str] = []
Expand Down
2 changes: 1 addition & 1 deletion locales/en_US.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"action-editor-header": "Actions",
"action-editor-expander-subtitle": "Actions for this key",
"action-editor-add-new-action": "Add Action",
"go-back": "Go Back",
"go-back": "Back",
"action-configurator-header": "Configure Action",
"action-configurator-remove-action": "Remove Action",
"header-page-selector-page-label": "Page:",
Expand Down
41 changes: 17 additions & 24 deletions src/backend/DeckManagement/DeckController.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,7 @@ def __init__(self, deck_controller: "DeckController"):
self.pause = False
self._stop = False

self.task_queue: Queue[MediaPlayerTask] = Queue()
# self.tasks = {}
self.tasks: list[MediaPlayerTask] = []
self.image_tasks = {}

self.fps: list[float] = []
Expand Down Expand Up @@ -201,7 +200,7 @@ def stop(self) -> None:
time.sleep(0.1)

def add_task(self, method: callable, *args, **kwargs):
self.task_queue.put(MediaPlayerTask(
self.tasks.append(MediaPlayerTask(
deck_controller=self.deck_controller,
page=self.deck_controller.active_page,
_callable=method,
Expand All @@ -218,12 +217,14 @@ def add_image_task(self, key_index: int, native_image: bytes):
)

def perform_media_player_tasks(self):
while not self.task_queue.empty():
task = self.task_queue.get()
# Skip task if it is from another page
if task.page is not self.deck_controller.active_page:
continue
task.run()
for task in self.tasks.copy():
if task.page is self.deck_controller.active_page:
task.run()

try:
self.tasks.remove(task)
except ValueError:
pass

for key in list(self.image_tasks.keys()):
try:
Expand Down Expand Up @@ -309,6 +310,7 @@ def update_key(self, index: int):

self.keys[index].set_ui_key_image(image)

@log.catch
def update_all_keys(self):
start = time.time()
if not self.get_alive(): return
Expand Down Expand Up @@ -368,6 +370,7 @@ def load_default_page(self):
page = gl.page_manager.get_page(default_page_path, self)
self.load_page(page)

@log.catch
def load_background(self, page: Page, update: bool = True):
log.info(f"Loading background in thread: {threading.get_ident()}")
deck_settings = self.get_deck_settings()
Expand All @@ -392,6 +395,7 @@ def set_from_page(self: "DeckController"):
else:
set_from_page(self)

@log.catch
def load_brightness(self, page: Page):
if not self.get_alive(): return
deck_settings = self.get_deck_settings()
Expand All @@ -406,6 +410,7 @@ def set_from_page(self: "DeckController"):
else:
set_from_page(self)

@log.catch
def load_screensaver(self, page: Page):
deck_settings = self.get_deck_settings()
def set_from_deck_settings(self: "DeckController"):
Expand Down Expand Up @@ -443,6 +448,7 @@ def set_from_page(self: "DeckController"):
else:
set_from_page(self)

@log.catch
def load_all_keys(self, page: Page, update: bool = True):
start = time.time()
keys_to_load = self.keys
Expand Down Expand Up @@ -487,6 +493,7 @@ def close_image_ressources(self):
self.background.image.close()


@log.catch
def load_page(self, page: Page, load_brightness: bool = True, load_screensaver: bool = True, load_background: bool = True, load_keys: bool = True,
allow_reload: bool = True):
if not self.get_alive(): return
Expand Down Expand Up @@ -610,9 +617,7 @@ def get_own_key_grid(self) -> KeyGrid:
return deck_stack_child.page_settings.grid_page

def clear_media_player_tasks(self):
while not self.media_player.task_queue.empty():
self.media_player.task_queue.get()

self.media_player.tasks.clear()
self.media_player.image_tasks.clear()

def clear_media_player_tasks_via_task(self):
Expand Down Expand Up @@ -1052,7 +1057,6 @@ def add_labels_to_image(self, _image: Image.Image) -> Image.Image:
# image = Image.frombytes("RGBA", _image.size, _image.tobytes())

draw = ImageDraw.Draw(image)
draw.fontmode = "1" # Anti-aliased - this prevents frayed/noisy labels on the deck

# labels = copy(self.labels) # Prevent crash if labels change during iteration
labels = self.labels
Expand All @@ -1079,14 +1083,10 @@ def add_labels_to_image(self, _image: Image.Image) -> Image.Image:
if label == "bottom":
position = (image.width / 2, image.height*0.875)


start_mem = process.memory_info().rss
draw.text(position,
text=text, font=font, anchor="ms",
fill=color, stroke_width=2,
stroke_fill="black")
end = process.memory_info().rss


draw = None
del draw
Expand Down Expand Up @@ -1171,11 +1171,8 @@ def load_from_page_dict(self, page_dict, update: bool = True, load_labels: bool
if load_labels:
self.labels = {}

start = time.time()
self.own_actions_ready() # Why not threaded? Because this would mean that some image changing calls might get executed after the next lines which blocks custom assets
actions = self.get_own_actions()

start = time.time()
## Load labels
if load_labels:
for label in page_dict.get("labels", []):
Expand All @@ -1191,8 +1188,6 @@ def load_from_page_dict(self, page_dict, update: bool = True, load_labels: bool
)
self.add_label(key_label, position=label, update=False)


start = time.time()
## Load media
if load_media:
path = page_dict.get("media", {}).get("path", None)
Expand Down Expand Up @@ -1237,14 +1232,12 @@ def load_from_page_dict(self, page_dict, update: bool = True, load_labels: bool
image=image.copy(),
), update=False)

start = time.time()
if load_background_color:
self.background_color = page_dict.get("background", {}).get("color", [0, 0, 0, 0])
# Ensure the background color has an alpha channel
if len(self.background_color) == 3:
self.background_color.append(255)


if update:
self.update()

Expand Down
14 changes: 12 additions & 2 deletions src/windows/mainWindow/elements/DeckSettings/DeckSettingsPage.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
"""
# Import gtk modules
import gi

from GtkHelper.GtkHelper import BackButton
gi.require_version("Gtk", "4.0")
gi.require_version("Adw", "1")
from gi.repository import Gtk, Adw
Expand All @@ -33,7 +35,7 @@ class DeckSettingsPage(Gtk.Overlay):
def __init__(self, deck_stack_child, deck_controller, **kwargs):
super().__init__(hexpand=True, vexpand=True,
margin_start=50, margin_end=50,
margin_top=50, margin_bottom=50, **kwargs)
margin_top=0, margin_bottom=50, **kwargs)
self.deck_stack_child = deck_stack_child
self.deck_controller = deck_controller
self.deck_serial_number = deck_controller.deck.get_serial_number()
Expand All @@ -47,7 +49,13 @@ def build(self):
self.main_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, hexpand=True)
self.set_child(self.main_box)

self.scrolled_window = Gtk.ScrolledWindow(hexpand=True, vexpand=True)
## Back button
self.back_button = BackButton(halign=Gtk.Align.START)
self.back_button.connect("clicked", self.on_back_clicked)
self.main_box.append(self.back_button)

## Main area
self.scrolled_window = Gtk.ScrolledWindow(hexpand=True, vexpand=True, margin_top=50)
self.main_box.append(self.scrolled_window)

self.clamp = Adw.Clamp()
Expand All @@ -74,6 +82,8 @@ def build(self):

self.fake_deck_group.set_visible(fake)

def on_back_clicked(self, button):
self.deck_stack_child.stack.set_visible_child_name("page-settings")


def on_open_page_settings_button_click(self, button):
Expand Down
8 changes: 4 additions & 4 deletions src/windows/mainWindow/elements/DeckStackChild.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,14 +71,14 @@ def on_toggle_settings_button_click(self, button):
if self.stack.get_visible_child_name() == "page-settings":
self.stack.set_visible_child_name("deck-settings")
self.toggle_settings_button.set_icon_name("view-paged-symbolic")
gl.app.main_win.sidebar_toggle_button.set_visible(False)
gl.app.main_win.split_view.set_collapsed(True)
# gl.app.main_win.sidebar_toggle_button.set_visible(False)
# gl.app.main_win.split_view.set_collapsed(True)

else:
self.stack.set_visible_child_name("page-settings")
self.toggle_settings_button.set_icon_name("applications-system-symbolic")
gl.app.main_win.sidebar_toggle_button.set_visible(True)
gl.app.main_win.split_view.set_collapsed(False)
# gl.app.main_win.sidebar_toggle_button.set_visible(True)
# gl.app.main_win.split_view.set_collapsed(False)

def on_banner_dismiss(self, banner):
banner.set_revealed(False)
2 changes: 1 addition & 1 deletion src/windows/mainWindow/elements/Sidebar/Sidebar.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ def build(self):
self.main_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, hexpand=True)
self.set_child(self.main_box)

self.header = Adw.HeaderBar(css_classes=["flat"])
self.header = Adw.HeaderBar(css_classes=["flat"], show_back_button=False)
self.main_box.append(self.header)

self.main_stack = Gtk.Stack(transition_duration=200, transition_type=Gtk.StackTransitionType.SLIDE_LEFT_RIGHT)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

# Import own modules
from src.backend.DeckManagement.HelperMethods import get_last_dir
from GtkHelper.GtkHelper import BetterExpander, BetterPreferencesGroup
from GtkHelper.GtkHelper import BackButton, BetterExpander, BetterPreferencesGroup
from src.windows.Store.Store import Store
from src.backend.PluginManager.ActionHolder import ActionHolder

Expand Down Expand Up @@ -61,13 +61,10 @@ def build(self):
self.nav_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, hexpand=True)
self.main_box.append(self.nav_box)

self.back_button = Gtk.Button(icon_name="go-previous")
self.back_button = BackButton()
self.back_button.connect("clicked", self.on_back_button_click)
self.nav_box.append(self.back_button)

self.back_label = Gtk.Label(label=gl.lm.get("action-chooser.go-back.label"), margin_start=6, xalign=0, css_classes=["bold"])
self.nav_box.append(self.back_label)

self.search_entry = Gtk.SearchEntry(margin_top=10, placeholder_text=gl.lm.get("action-chooser.search-entry.placeholder"), hexpand=True)
self.search_entry.connect("search-changed", self.on_search_changed)
self.main_box.append(self.search_entry)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
# Import gtk modules
import gi

from GtkHelper.GtkHelper import BackButton

gi.require_version("Gtk", "4.0")
gi.require_version("Adw", "1")
from gi.repository import Gtk, Adw
Expand Down Expand Up @@ -45,13 +47,10 @@ def build(self):
self.nav_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, hexpand=True)
self.main_box.append(self.nav_box)

self.back_button = Gtk.Button(icon_name="go-previous-symbolic")
self.back_button = BackButton()
self.back_button.connect("clicked", self.on_back_button_click)
self.nav_box.append(self.back_button)

self.back_label = Gtk.Label(label=gl.lm.get("go-back"), margin_start=6, xalign=0, css_classes=["bold"])
self.nav_box.append(self.back_label)

self.header = Gtk.Label(label=gl.lm.get("action-configurator-header"), xalign=0, css_classes=["page-header"], margin_start=20, margin_top=30)
self.main_box.append(self.header)

Expand Down