roundabout,
created on Monday, 2 December 2024, 18:47:08 (1733165228),
received on Thursday, 12 December 2024, 14:59:12 (1734015552)
Author identity: vlad <vlad.muntoiu@gmail.com>
fbb11f1bf0f68107706840b00bd8b06708fa5f32
about.ui
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?> <!-- Generated with glade 3.38.2 --> <interface> <requires lib="gtk+" version="3.24"/> <object class="GtkAboutDialog" id="about-dialog"> <property name="can-focus">False</property> <property name="type-hint">dialog</property> <property name="program-name">Izvor</property> <property name="comments" translatable="yes">A powerful and modular desktop search and launcher</property> <property name="logo-icon-name">edit-find-symbolic</property> <property name="license-type">gpl-3-0</property> <child internal-child="vbox"> <object class="GtkBox"> <property name="can-focus">False</property> <property name="orientation">vertical</property> <property name="spacing">2</property> <child internal-child="action_area"> <object class="GtkButtonBox"> <property name="can-focus">False</property> <property name="layout-style">end</property> </object> <packing> <property name="expand">False</property> <property name="fill">False</property> <property name="position">0</property> </packing> </child> <child> <placeholder/> </child> </object> </child> </object> </interface>
izvor.ui
@@ -0,0 +1,175 @@
<?xml version="1.0" encoding="UTF-8"?> <!-- Generated with glade 3.38.2 --> <interface> <requires lib="gtk+" version="3.24"/> <object class="GtkMenu" id="main-menu"> <property name="visible">True</property> <property name="can-focus">False</property> <child> <object class="GtkMenuItem"> <property name="visible">True</property> <property name="can-focus">False</property> <property name="label" translatable="yes">Search p_roviders</property> <property name="use-underline">True</property> <signal name="activate" handler="menu-providers" swapped="no"/> </object> </child> <child> <object class="GtkMenuItem"> <property name="visible">True</property> <property name="can-focus">False</property> <property name="label" translatable="yes">_Preferences</property> <property name="use-underline">True</property> <signal name="activate" handler="menu-preferences" swapped="no"/> </object> </child> <child> <object class="GtkMenuItem"> <property name="visible">True</property> <property name="can-focus">False</property> <property name="label" translatable="yes">Manage _history</property> <property name="use-underline">True</property> <signal name="activate" handler="menu-history" swapped="no"/> </object> </child> <child> <object class="GtkSeparatorMenuItem"> <property name="visible">True</property> <property name="can-focus">False</property> </object> </child> <child> <object class="GtkMenuItem"> <property name="visible">True</property> <property name="can-focus">False</property> <property name="label" translatable="yes">_About</property> <property name="use-underline">True</property> <signal name="activate" handler="menu-about" swapped="no"/> </object> </child> </object> <object class="GtkMenu" id="providers-menu"> <property name="visible">True</property> <property name="can-focus">False</property> <child> <object class="GtkCheckMenuItem" id="providers-menu-all"> <property name="visible">True</property> <property name="can-focus">False</property> <property name="label" translatable="yes">_All</property> <property name="use-underline">True</property> <property name="active">True</property> <signal name="toggled" handler="providers-menu-all-toggled" swapped="no"/> </object> </child> <child> <object class="GtkSeparatorMenuItem"> <property name="visible">True</property> <property name="can-focus">False</property> </object> </child> </object> <object class="GtkEntryBuffer" id="search-query-buffer"/> <object class="GtkApplicationWindow" id="root"> <property name="can-focus">False</property> <property name="default-width">576</property> <property name="default-height">640</property> <property name="icon-name">edit-find</property> <child> <object class="GtkScrolledWindow" id="results-scroll-area"> <property name="visible">True</property> <property name="can-focus">True</property> <property name="hscrollbar-policy">never</property> <property name="shadow-type">in</property> <property name="propagate-natural-height">True</property> <child> <object class="GtkViewport" id="results-viewport"> <property name="visible">True</property> <property name="can-focus">False</property> <child> <object class="GtkListBox" id="results-list"> <property name="visible">True</property> <property name="can-focus">False</property> <signal name="row-activated" handler="result-activated" swapped="no"/> </object> </child> </object> </child> </object> </child> <child type="titlebar"> <object class="GtkHeaderBar"> <property name="visible">True</property> <property name="can-focus">False</property> <property name="show-close-button">True</property> <child type="title"> <object class="GtkEntry" id="search-query"> <property name="visible">True</property> <property name="can-focus">True</property> <property name="has-focus">True</property> <property name="is-focus">True</property> <property name="can-default">True</property> <property name="has-default">True</property> <property name="receives-default">True</property> <property name="hexpand">True</property> <property name="buffer">search-query-buffer</property> <property name="primary-icon-name">edit-find-symbolic</property> <property name="placeholder-text" translatable="yes">Type to search</property> <signal name="changed" handler="update-search" swapped="no"/> </object> </child> <child> <object class="GtkMenuButton" id="main-menu-button"> <property name="visible">True</property> <property name="can-focus">True</property> <property name="focus-on-click">False</property> <property name="receives-default">True</property> <property name="tooltip-text" translatable="yes">Options</property> <property name="popup">main-menu</property> <property name="direction">none</property> <property name="use-popover">False</property> <child> <placeholder/> </child> </object> <packing> <property name="pack-type">end</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkMenuButton" id="providers-menu-button"> <property name="visible">True</property> <property name="can-focus">True</property> <property name="focus-on-click">False</property> <property name="receives-default">True</property> <property name="tooltip-text" translatable="yes">Select search providers</property> <property name="popup">providers-menu</property> <property name="direction">none</property> <property name="use-popover">False</property> <child> <object class="GtkImage"> <property name="visible">True</property> <property name="can-focus">False</property> <property name="icon-name">edit-entry-symbolic</property> </object> </child> </object> <packing> <property name="pack-type">end</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkSpinner" id="spinner"> <property name="visible">True</property> <property name="can-focus">False</property> </object> <packing> <property name="pack-type">end</property> <property name="position">2</property> </packing> </child> </object> </child> </object> </interface>
main.py
@@ -25,7 +25,7 @@ from pathlib import Path
from typing import AsyncIterable, AsyncIterator, Collection, TypeVar, Iterable, Callable, Any gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Gdk, Pangofrom gi.repository import Gtk, Gdk, Pango, GLib_T = TypeVar("_T")
@@ -132,7 +132,8 @@ class Izvor(Gtk.Application):
print(f"Available providers: {list(self.available_providers.keys())}") self.enabled_providers = self.available_providers.copy()self.permanently_enabled_providers = self.available_providers.copy() self.enabled_providers = self.permanently_enabled_providers.copy()providers_menu = self.builder.get_object("providers-menu")
@@ -147,10 +148,11 @@ class Izvor(Gtk.Application):
self.providers.append(loaded_provider) print(f"Loaded provider: {loaded_provider.name}") print(loaded_provider.description) self.provider_checkboxes[loaded_provider.name] = Gtk.CheckMenuItem.new_with_label(loaded_provider.name)providers_menu.append(self.provider_checkboxes[loaded_provider.name])self.provider_checkboxes[loaded_provider.name].set_active(True)self.provider_checkboxes[loaded_provider.name].show()self.provider_checkboxes[provider.stem] = Gtk.CheckMenuItem.new_with_label(loaded_provider.name) providers_menu.append(self.provider_checkboxes[provider.stem]) self.provider_checkboxes[provider.stem].set_active(True) self.provider_checkboxes[provider.stem].show() self.provider_checkboxes[provider.stem].connect("toggled", self.update_enabled_providers)def call_update_results(widget): asyncio.create_task(self.update_results(widget))
@@ -163,9 +165,26 @@ class Izvor(Gtk.Application):
{ "update-search": call_update_results, "result-activated": execute_result, "providers-menu-all-toggled": self.update_enabled_providers_all,} ) GLib.idle_add(self.update_enabled_providers, None) def update_enabled_providers(self, widget=None): for provider, checkbox in self.provider_checkboxes.items(): if checkbox.get_active(): self.enabled_providers[provider] = self.permanently_enabled_providers[provider] else: self.enabled_providers.pop(provider, None) asyncio.create_task(self.update_results(None)) def update_enabled_providers_all(self, widget): for checkbox in self.provider_checkboxes.values(): checkbox.set_active(widget.get_active()) self.update_enabled_providers() def kill(self, widget=None): self.loop.stop() self.quit()