Compare commits

..

2 commits

Author SHA1 Message Date
743b476d38 Add possibility to Ctrl-v a path
Until now it was only possible to drag and drop a path, but now
that I'm using Hyprland this is not implemented. This patch
allows me to copy and paste a path either as simple text or
from a file manager like Nautilus into the app.
2025-08-24 21:48:31 +09:00
ae99dd6a4a Add notice about migration to Forgejo 2025-08-19 02:29:39 +00:00
5 changed files with 58 additions and 6 deletions

View file

@ -1,3 +1,5 @@
⚠️ This repository has moved to https://git.jeena.net/jeena/recoder
<p align="center">
<img src="src/resources/net.jeena.Recoder.svg" width="120" height="120" alt="Recoder logo">
</p>

View file

@ -1,6 +1,6 @@
[project]
name = "recoder"
version = "1.0.1"
version = "1.1.0"
description = "A GTK4 video transcoding GUI application"
readme = "README.md"
authors = [{name = "Jeena", email = "hello@jeena.net"}]
@ -24,4 +24,4 @@ include-package-data = true
where = ["src"]
[tool.setuptools.package-data]
recoder = ["resources.gresource"]
recoder = ["resources.gresource"]

View file

@ -10,13 +10,23 @@ class DropHandler:
self._accepting = self._compute_accept()
self.app_state_manager.connect("notify::state", self.on_state_changed)
# --- Drag & Drop ---
self.drop_target = Gtk.DropTarget.new(Gio.File, Gdk.DragAction.COPY)
self.drop_target.connect("enter", self.on_drop_enter)
self.drop_target.connect("leave", self.on_drop_leave)
self.drop_target.connect("drop", self.on_drop)
self.w.overlay.add_controller(self.drop_target)
# --- Clipboard Paste (Ctrl+V) ---
self.shortcut_ctrl_v = Gtk.ShortcutController()
self.shortcut_ctrl_v.add_shortcut(
Gtk.Shortcut.new(
Gtk.ShortcutTrigger.parse_string("<Ctrl>V"),
Gtk.CallbackAction.new(self.on_paste_clipboard)
)
)
self.w.add_controller(self.shortcut_ctrl_v)
def _compute_accept(self):
return self.app_state_manager.state not in {
AppState.TRANSCODING,
@ -33,7 +43,7 @@ class DropHandler:
else:
self.w.overlay.remove_controller(self.drop_target)
# ---------------- Drag & Drop ----------------
def on_drop_enter(self, *_):
if not self._accepting:
return False
@ -47,10 +57,45 @@ class DropHandler:
def on_drop(self, _, value, __, ___):
if not self._accepting:
return False
self._start_processing(value)
return True
# ---------------- Clipboard Paste ----------------
def on_paste_clipboard(self, *_):
if not self._accepting:
return True
clipboard = self.w.get_clipboard()
clipboard.read_text_async(None, self._on_clipboard_text_ready)
return True
def _on_clipboard_text_ready(self, clipboard, res):
try:
text = clipboard.read_text_finish(res)
except GLib.Error:
return
if not text:
return
# take the first non-empty line only
uri = next((u.strip() for u in text.splitlines() if u.strip()), None)
if not uri:
return
if uri.startswith("file://"):
gfile = Gio.File.new_for_uri(uri)
else:
gfile = Gio.File.new_for_path(uri)
self._start_processing(gfile)
# ---------------- Shared ----------------
def _start_processing(self, value):
if self.w.drop_hint.get_parent():
self.w.overlay.remove_overlay(self.w.drop_hint)
self.w.drop_hint.set_visible(False)
self.w.progress_bar.set_visible(True)
self.w.progress_bar.set_fraction(0.0)
GLib.idle_add(partial(self.w.process_drop_value, value))
return True

View file

@ -58,5 +58,10 @@
<p>Fix bad video quality.</p>
</description>
</release>
<release version="1.1.0" date="2025-08-24">
<description>
<p>Add possibility to Ctrl-v a path instead only drag and drop.</p>
</description>
</release>
</releases>
</component>

View file

@ -144,7 +144,7 @@
<child>
<object class="GtkLabel">
<property name="label">Drop video files or folders here to get started</property>
<property name="label">Drop video file or folder here, or press Ctrl+V to paste a path</property>
<style>
<class name="dim-label"/>
</style>