diff --git a/pyproject.toml b/pyproject.toml index 527d605..cb94e65 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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"] \ No newline at end of file +recoder = ["resources.gresource"] diff --git a/src/recoder/drop_handler.py b/src/recoder/drop_handler.py index 107647a..7fe42e0 100644 --- a/src/recoder/drop_handler.py +++ b/src/recoder/drop_handler.py @@ -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("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 + diff --git a/src/resources/net.jeena.Recoder.metainfo.xml b/src/resources/net.jeena.Recoder.metainfo.xml index 29d8c08..8d00b96 100644 --- a/src/resources/net.jeena.Recoder.metainfo.xml +++ b/src/resources/net.jeena.Recoder.metainfo.xml @@ -58,5 +58,10 @@

Fix bad video quality.

+ + +

Add possibility to Ctrl-v a path instead only drag and drop.

+
+
diff --git a/src/resources/window.ui b/src/resources/window.ui index 0e4a030..e38a51c 100644 --- a/src/resources/window.ui +++ b/src/resources/window.ui @@ -144,7 +144,7 @@ - Drop video files or folders here to get started + Drop video file or folder here, or press Ctrl+V to paste a path