Files
2026-06-03 21:32:45 +02:00

159 lines
5.5 KiB
Python

import random
import gi
from fabric.utils import get_relative_path
from fabric.widgets.box import Box
from fabric.widgets.image import Image
from fabric.widgets.label import Label
from fabric.widgets.stack import Stack
import config.data as data
gi.require_version("Gtk", "3.0")
gi.require_version("GdkPixbuf", "2.0")
from gi.repository import Gdk, GdkPixbuf, GLib, Gtk
import modules.icons as icons
from modules.kanban import Kanban
from modules.mixer import Mixer
from modules.pins import Pins
from modules.wallpapers import WallpaperSelector
from modules.widgets import Widgets
class Dashboard(Box):
def __init__(self, **kwargs):
super().__init__(
name="dashboard",
orientation="v",
spacing=8,
h_align="center",
v_align="center",
h_expand=True,
visible=True,
all_visible=True,
)
self.notch = kwargs["notch"]
self.widgets = Widgets(notch=self.notch)
self.pins = Pins()
self.kanban = Kanban()
self.wallpapers = WallpaperSelector()
self.mixer = Mixer()
self.stack = Stack(
name="stack",
transition_type="slide-left-right",
transition_duration=500,
v_expand=True,
v_align="fill",
h_expand=True,
h_align="fill",
)
self.stack.set_homogeneous(False)
self.switcher = Gtk.StackSwitcher(
name="switcher",
spacing=8,
)
self.stack.add_titled(self.widgets, "widgets", "Widgets")
self.stack.add_titled(self.pins, "pins", "Pins")
self.stack.add_titled(self.kanban, "kanban", "Kanban")
self.stack.add_titled(self.wallpapers, "wallpapers", "Wallpapers")
self.stack.add_titled(self.mixer, "mixer", "Mixer")
self.switcher.set_stack(self.stack)
self.switcher.set_hexpand(True)
self.switcher.set_homogeneous(True)
self.switcher.set_can_focus(True)
self.stack.connect("notify::visible-child", self.on_visible_child_changed)
self.add(self.switcher)
self.add(self.stack)
if data.PANEL_THEME == "Panel" and (
data.BAR_POSITION in ["Left", "Right"]
or data.PANEL_POSITION in ["Start", "End"]
):
GLib.idle_add(self._setup_switcher_icons)
# Close on right click if the event isn't handled
self.connect(
"button-release-event",
lambda widget, event: (event.button == 3 and self.notch.close_notch()),
)
self.show_all()
def _setup_switcher_icons(self):
icon_details_map = {
"Widgets": {"icon": icons.widgets, "name": "widgets"},
"Pins": {"icon": icons.pins, "name": "pins"},
"Kanban": {"icon": icons.kanban, "name": "kanban"},
"Wallpapers": {"icon": icons.wallpapers, "name": "wallpapers"},
"Mixer": {"icon": icons.speaker, "name": "mixer"},
}
buttons = self.switcher.get_children()
for btn in buttons:
if isinstance(btn, Gtk.ToggleButton):
original_gtk_label = None
for child_widget in btn.get_children():
if isinstance(child_widget, Gtk.Label):
original_gtk_label = child_widget
break
if original_gtk_label:
label_text = original_gtk_label.get_text()
if label_text in icon_details_map:
details = icon_details_map[label_text]
icon_markup = details["icon"]
css_name_suffix = details["name"]
btn.remove(original_gtk_label)
new_icon_label = Label(
name=f"switcher-icon-{css_name_suffix}", markup=icon_markup
)
btn.add(new_icon_label)
new_icon_label.show_all()
return GLib.SOURCE_REMOVE
def go_to_next_child(self):
children = self.stack.get_children()
current_index = self.get_current_index(children)
next_index = (current_index + 1) % len(children)
self.stack.set_visible_child(children[next_index])
def go_to_previous_child(self):
children = self.stack.get_children()
current_index = self.get_current_index(children)
previous_index = (current_index - 1 + len(children)) % len(children)
self.stack.set_visible_child(children[previous_index])
def get_current_index(self, children):
current_child = self.stack.get_visible_child()
return children.index(current_child) if current_child in children else -1
def on_visible_child_changed(self, stack, param):
visible = stack.get_visible_child()
if visible == self.wallpapers:
self.wallpapers.search_entry.set_text("")
self.wallpapers.search_entry.grab_focus()
def go_to_section(self, section_name):
"""Navigate to a specific section in the dashboard."""
if section_name == "widgets":
self.stack.set_visible_child(self.widgets)
elif section_name == "pins":
self.stack.set_visible_child(self.pins)
elif section_name == "kanban":
self.stack.set_visible_child(self.kanban)
elif section_name == "wallpapers":
self.stack.set_visible_child(self.wallpapers)
elif section_name == "mixer":
self.stack.set_visible_child(self.mixer)