Files
2026-07-12 18:56:10 +05:45

121 lines
3.8 KiB
Python

from fabric.widgets.box import Box
from fabric.widgets.button import Button
from fabric.widgets.image import Image
from fabric.widgets.label import Label
from modules.launcher.base import LauncherPlugin
from services import screen_capture_service
class ScreenCapturePlugin(LauncherPlugin):
@property
def name(self) -> str:
return "screen_capture"
@property
def icon(self) -> str:
return "camera-photo-symbolic"
@property
def keywords(self) -> list[str]:
return ["screen", "sc"]
def __init__(self, handler):
super().__init__(handler)
self.service = screen_capture_service
def on_search(self, text: str) -> None:
self.query_screen_capture(text)
def stop(self):
pass
def is_recording(self):
return self.service.is_recording
def query_screen_capture(self, text: str) -> None:
self._show_main_options()
def _show_main_options(self):
self.handler.start("screen_capture")
options = [
("Screenshot Selection", "camera-photo-symbolic", "screenshot selection"),
("Screenshot Fullscreen", "camera-photo-symbolic", "screenshot fullscreen"),
("Record Selection", "camera-video-symbolic", "record selection"),
("Record Fullscreen", "camera-video-symbolic", "record fullscreen"),
("Record Selection No Audio", "camera-video-symbolic", "record no audio"),
(
"Record Fullscreen No Audio",
"camera-video-symbolic",
"record fullscreen no audio",
),
]
if self.is_recording():
options.insert(
0, ("Stop Recording", "media-playback-stop-symbolic", "stop")
)
for title, icon, command in options:
self.handler.slot_ready(
Button(
style_classes="app-slot",
child=Box(
orientation="h",
spacing=12,
children=[
Image(icon_name=icon, style_classes="app-icon"),
Label(
label=title,
style_classes="app-name",
h_align="start",
),
],
),
on_clicked=lambda _, cmd=command: self._execute_command(cmd),
),
"screen_capture",
)
self.handler.done()
def _execute_command(self, command):
self.handler.launched()
actions = {
"stop": lambda: self.service.stop_recording(),
"screenshot selection": lambda: self.service.screenshot(fullscreen=False),
"screenshot fullscreen": lambda: self.service.screenshot(fullscreen=True),
"record selection": lambda: self.service.record(
fullscreen=False, no_audio=False
),
"record fullscreen": lambda: self.service.record(
fullscreen=True, no_audio=False
),
"record no audio": lambda: self.service.record(
fullscreen=False, no_audio=True
),
"record fullscreen no audio": lambda: self.service.record(
fullscreen=True, no_audio=True
),
}
# Add aliases
aliases = {
"region": "screenshot selection",
"full": "screenshot fullscreen",
"select": "screenshot selection",
}
cmd = aliases.get(command, command)
if cmd in actions:
actions[cmd]()
def handle_external(self, command: str, args: str) -> None:
if args:
self._execute_command(args)
else:
self.handler.launched()