feat: add app launcher
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
from fabric.utils.helpers import DesktopApp, get_desktop_applications
|
||||
from fabric.widgets.box import Box
|
||||
from fabric.widgets.image import Image
|
||||
from fabric.widgets.label import Label
|
||||
from gi.repository import Gtk
|
||||
|
||||
from .base import FuzzyMenu
|
||||
|
||||
|
||||
ICON_SIZE = 32
|
||||
|
||||
|
||||
class AppProvider:
|
||||
def items(self) -> list[DesktopApp]:
|
||||
return get_desktop_applications()
|
||||
|
||||
def filter(self, items: list[DesktopApp], query: str) -> list[DesktopApp]:
|
||||
if not query:
|
||||
return items
|
||||
q = query.lower()
|
||||
return [a for a in items if _matches(a, q)]
|
||||
|
||||
def render(self, item: DesktopApp) -> Gtk.Widget:
|
||||
children: list[Gtk.Widget] = []
|
||||
|
||||
pixbuf = item.get_icon_pixbuf(size=ICON_SIZE)
|
||||
if pixbuf is not None:
|
||||
children.append(Image(pixbuf=pixbuf, name="app-icon"))
|
||||
|
||||
primary = item.display_name or item.name or ""
|
||||
text_box = Box(name="app-text", orientation="v", spacing=0)
|
||||
text_box.add(Label(label=primary, name="app-name", h_align="start"))
|
||||
if item.generic_name and item.generic_name != primary:
|
||||
text_box.add(
|
||||
Label(label=item.generic_name, name="app-generic", h_align="start")
|
||||
)
|
||||
children.append(text_box)
|
||||
|
||||
return Box(name="slot-box", orientation="h", spacing=10, children=children)
|
||||
|
||||
def activate(self, item: DesktopApp) -> None:
|
||||
item.launch()
|
||||
|
||||
|
||||
def _matches(app: DesktopApp, q: str) -> bool:
|
||||
for field in (app.name, app.display_name, app.generic_name, app.executable):
|
||||
if field and q in field.lower():
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def AppLauncher(monitor: int = 0) -> FuzzyMenu:
|
||||
return FuzzyMenu(
|
||||
provider=AppProvider(),
|
||||
monitor=monitor,
|
||||
placeholder="Search Apps...",
|
||||
window_name="app-launcher",
|
||||
max_results=8,
|
||||
)
|
||||
Reference in New Issue
Block a user