121 lines
3.8 KiB
Python
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()
|