From d3a732ed4d4455de3c4f7b4e6d2e351e4e48a7bf Mon Sep 17 00:00:00 2001 From: itdominator <1itdominator@gmail.com> Date: Sun, 30 Nov 2025 17:04:59 -0600 Subject: [PATCH] Added searchCommand entry plus fixed clock not updating properly --- src/core/containers/center_container.py | 2 + src/core/widgets/category_list_widget.py | 86 +++++++++++++------- src/core/widgets/clock_widget.py | 6 +- src/core/widgets/search_command_widget.py | 86 ++++++++++++++++++++ user_config/usr/share/utop/key-bindings.json | 1 + 5 files changed, 150 insertions(+), 31 deletions(-) create mode 100644 src/core/widgets/search_command_widget.py diff --git a/src/core/containers/center_container.py b/src/core/containers/center_container.py index d8e7e3d..82a45c7 100644 --- a/src/core/containers/center_container.py +++ b/src/core/containers/center_container.py @@ -6,6 +6,7 @@ gi.require_version('Gtk', '3.0') from gi.repository import Gtk # Application imports +from ..widgets.search_command_widget import SearchCommandWidget from ..widgets.tab_widget import TabWidget @@ -40,4 +41,5 @@ class CenterContainer(Gtk.Box): ... def _load_widgets(self): + self.add(SearchCommandWidget()) self.add(TabWidget()) diff --git a/src/core/widgets/category_list_widget.py b/src/core/widgets/category_list_widget.py index ca9958f..10ec709 100644 --- a/src/core/widgets/category_list_widget.py +++ b/src/core/widgets/category_list_widget.py @@ -19,10 +19,7 @@ class CategoryListWidget(Gtk.ButtonBox): def __init__(self): super(CategoryListWidget, self).__init__() - self.ctx = self.get_style_context() - self.dir_watchers: [] = [] - - self.active_category: str = 'Accessories' + self.active_category = None self.category_dict: {} = { "Accessories": [], "Multimedia": [], @@ -37,33 +34,44 @@ class CategoryListWidget(Gtk.ButtonBox): "Other": [] } + self.dir_watchers: [] = [] + self._setup_styling() self._setup_signals() self._subscribe_to_events() self._load_widgets() - self.fill_menu_objects() + self._fill_menu_objects() self.show_all() def _setup_styling(self): self.set_orientation(Gtk.Orientation.VERTICAL) - self.ctx.add_class("category-list-widget") + ctx = self.get_style_context() + ctx.add_class("category-list-widget") def _setup_signals(self): self._load_dir_watchers() def _subscribe_to_events(self): + event_system.subscribe("get-active-category", self.get_active_category) event_system.subscribe("refresh-active-category", self.refresh_active_category) + event_system.subscribe("query-all-categories", self.query_all_categories) def _load_widgets(self): for category in self.category_dict.keys(): button = Gtk.Button(label = category) - button.connect("clicked", self.set_active_category) + button.connect("clicked", self._set_active_category) button.show() self.add(button) + if category == "Accessories": + self.active_category = button + self.active_category.get_style_context().add_class("active-category") + + self.category_dict["All"] = [] + def _reset_dir_watchers(self): self._clear_dir_watchers() self._load_dir_watchers() @@ -99,16 +107,16 @@ class CategoryListWidget(Gtk.ButtonBox): GLib.idle_add(self._reload_meu) def _reload_meu(self): - for group in self.category_dict: - self.category_dict[group].clear() + for category in self.category_dict: + self.category_dict[category].clear() - self.fill_menu_objects() + self._fill_menu_objects() event_system.emit( "load-active-category", - (self.category_dict[ self.active_category ],) + (self.category_dict[ self.active_category.get_label() ],) ) - def fill_menu_objects(self, apps: [] = []): + def _fill_menu_objects(self, apps: [] = []): if not apps: apps = find_apps() @@ -147,29 +155,49 @@ class CategoryListWidget(Gtk.ButtonBox): else: group = "Other" - self.category_dict[group].append( - { - "title": title, - "groups": groups, - "comment": comment, - "exec": mainExec, - "tryExec": tryExec, - "fileName": fPath.split("/")[-1], - "filePath": fPath, - "icon": icon - } - ) + entry = { + "title": title, + "groups": groups, + "comment": comment, + "exec": mainExec, + "tryExec": tryExec, + "fileName": fPath.split("/")[-1], + "filePath": fPath, + "icon": icon + } + + self.category_dict["All"].append(entry) + self.category_dict[group].append(entry) + + def _set_active_category(self, button): + self.active_category.get_style_context().remove_class("active-category") + self.active_category = button + self.active_category.get_style_context().add_class("active-category") - def set_active_category(self, button): - self.active_category = button.get_label() event_system.emit( "load-active-category", - (self.category_dict[ self.active_category ],) + (self.category_dict[ self.active_category.get_label() ],) ) + def query_all_categories(self, query: str): + self.active_category.get_style_context().remove_class("active-category") + + filtered_group = [] + for app in self.category_dict["All"]: + if ( + query in app["title"].lower()or \ + query in app["comment"].lower() + ): + filtered_group.append(app) + + event_system.emit("load-active-category", (filtered_group,)) + + def get_active_category(self): + return self.active_category + def refresh_active_category(self): + self.active_category.get_style_context().add_class("active-category") event_system.emit( "load-active-category", - (self.category_dict[ self.active_category ],) + (self.category_dict[ self.active_category.get_label() ],) ) - diff --git a/src/core/widgets/clock_widget.py b/src/core/widgets/clock_widget.py index bda1842..5a6af16 100644 --- a/src/core/widgets/clock_widget.py +++ b/src/core/widgets/clock_widget.py @@ -5,7 +5,7 @@ from datetime import datetime import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk -from gi.repository import GObject +from gi.repository import GLib # Application imports @@ -77,7 +77,7 @@ class ClockWidget(Gtk.EventBox): self._update_face() self.add(self.label) - GObject.timeout_add(59000, self._update_face) + GLib.timeout_add(59000 , self._update_face) def _update_face(self): dt_now = datetime.now() @@ -87,6 +87,8 @@ class ClockWidget(Gtk.EventBox): self.label.set_label(time_str) + return True + def _toggle_cal_popover(self, widget, eve): if (self.calendar.get_visible() == True): self.calendar.popdown() diff --git a/src/core/widgets/search_command_widget.py b/src/core/widgets/search_command_widget.py new file mode 100644 index 0000000..4110605 --- /dev/null +++ b/src/core/widgets/search_command_widget.py @@ -0,0 +1,86 @@ +# Python imports +import subprocess + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk +from gi.repository import GLib + +# Application imports + + + +class SearchCommandWidget(Gtk.SearchEntry): + def __init__(self): + super(SearchCommandWidget, self).__init__() + + self.mode = "" + self.timeout_id = None + + self._setup_styling() + self._setup_signals() + self._subscribe_to_events() + self._load_widgets() + + self.show() + + + def _setup_styling(self): + self.set_placeholder_text("Apps /a | Search /s | Command /c ...") + + def _setup_signals(self): + self.connect("search-changed", self._search_changed) + self.connect("activate", self._handle_enter) + + def _subscribe_to_events(self): + event_system.subscribe("focus-search", self._focus_search) + + def _load_widgets(self): + ... + + def _focus_search(self): + self.grab_focus() + + def _search_changed(self, widget): + if self.timeout_id: + GLib.source_remove(self.timeout_id) + self.timeout_id = None + + entry = widget.get_text().strip() + if not entry or len(entry) <= 3: + self.mode = "" + self.request = "" + + event_system.emit("refresh-active-category") + return + + self.mode = entry[0:2] + self.request = entry[2:].strip() + self.timeout_id = GLib.timeout_add(600, self._match_mode) + + def _match_mode(self): + GLib.source_remove(self.timeout_id) + self.timeout_id = None + + match self.mode: + case "/a": + self.query_all_categories() + case "/s": + sub_mode = self.request[0:2] + match sub_mode: + case "/f ": + ... + case "/d": + ... + case _: + ... + ... + case _: + ... + + def _handle_enter(self, widget): + if self.mode != "/c": return + + def query_all_categories(self): + event_system.emit("query-all-categories", (self.request,)) diff --git a/user_config/usr/share/utop/key-bindings.json b/user_config/usr/share/utop/key-bindings.json index 64641bc..0efa5cd 100644 --- a/user_config/usr/share/utop/key-bindings.json +++ b/user_config/usr/share/utop/key-bindings.json @@ -2,6 +2,7 @@ "keybindings": { "help" : "F1", "guake_key" : "KP_Insert", + "focus-search" : "s", "focus-apps" : "a", "focus-terminal" : "t" }