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, Pango
from 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()