From ba429d344132c088177e853cce8ff7181570b221 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 10 Apr 2024 19:42:51 +0200 Subject: Adding upstream version 44.2. Signed-off-by: Daniel Baumann --- plugins/quickopen/quickopen/__init__.py | 193 ++++++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 plugins/quickopen/quickopen/__init__.py (limited to 'plugins/quickopen/quickopen/__init__.py') diff --git a/plugins/quickopen/quickopen/__init__.py b/plugins/quickopen/quickopen/__init__.py new file mode 100644 index 0000000..3f708a3 --- /dev/null +++ b/plugins/quickopen/quickopen/__init__.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2009 - Jesse van den Kieboom +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . + +import os + +import gi +gi.require_version('Gedit', '3.0') +gi.require_version('Gtk', '3.0') +from gi.repository import GObject, Gio, GLib, Gtk, Gedit + +from .popup import Popup +from .virtualdirs import RecentDocumentsDirectory +from .virtualdirs import CurrentDocumentsDirectory + +try: + import gettext + gettext.bindtextdomain('gedit') + gettext.textdomain('gedit') + _ = gettext.gettext +except: + _ = lambda s: s + +class QuickOpenAppActivatable(GObject.Object, Gedit.AppActivatable): + app = GObject.Property(type=Gedit.App) + + def __init__(self): + GObject.Object.__init__(self) + + def do_activate(self): + self.app.add_accelerator("O", "win.quickopen", None) + + self.menu_ext = self.extend_menu("file-section") + item = Gio.MenuItem.new(_("Quick Open…"), "win.quickopen") + self.menu_ext.prepend_menu_item(item) + + def do_deactivate(self): + self.app.remove_accelerator("win.quickopen", None) + + +class QuickOpenPlugin(GObject.Object, Gedit.WindowActivatable): + __gtype_name__ = "QuickOpenPlugin" + + window = GObject.Property(type=Gedit.Window) + + def __init__(self): + GObject.Object.__init__(self) + + def do_activate(self): + self._popup_size = (450, 300) + self._popup = None + + action = Gio.SimpleAction(name="quickopen") + action.connect('activate', self.on_quick_open_activate) + self.window.add_action(action) + + def do_deactivate(self): + self.window.remove_action("quickopen") + + def get_popup_size(self): + return self._popup_size + + def set_popup_size(self, size): + self._popup_size = size + + def _create_popup(self): + paths = [] + + # Open documents + paths.append(CurrentDocumentsDirectory(self.window)) + + doc = self.window.get_active_document() + + # Current document directory + if doc and doc.get_file().is_local(): + gfile = doc.get_file().get_location() + paths.append(gfile.get_parent()) + + # File browser root directory + bus = self.window.get_message_bus() + + if bus.is_registered('/plugins/filebrowser', 'get_root'): + msg = bus.send_sync('/plugins/filebrowser', 'get_root') + + if msg: + gfile = msg.props.location + + if gfile and gfile.is_native(): + paths.append(gfile) + + # Recent documents + paths.append(RecentDocumentsDirectory()) + + # Local bookmarks + for path in self._local_bookmarks(): + paths.append(path) + + # Desktop directory + desktopdir = self._desktop_dir() + + if desktopdir: + paths.append(Gio.file_new_for_path(desktopdir)) + + # Home directory + paths.append(Gio.file_new_for_path(os.path.expanduser('~'))) + + self._popup = Popup(self.window, paths, self.on_activated) + self.window.get_group().add_window(self._popup) + + self._popup.set_default_size(*self.get_popup_size()) + self._popup.set_transient_for(self.window) + self._popup.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) + self._popup.connect('destroy', self.on_popup_destroy) + + def _local_bookmarks(self): + filename = os.path.expanduser('~/.config/gtk-3.0/bookmarks') + + if not os.path.isfile(filename): + return [] + + paths = [] + + for line in open(filename, 'r', encoding='utf-8'): + uri = line.strip().split(" ")[0] + f = Gio.file_new_for_uri(uri) + + if f.is_native(): + try: + info = f.query_info(Gio.FILE_ATTRIBUTE_STANDARD_TYPE, + Gio.FileQueryInfoFlags.NONE, + None) + + if info and info.get_file_type() == Gio.FileType.DIRECTORY: + paths.append(f) + except: + pass + + return paths + + def _desktop_dir(self): + config = os.getenv('XDG_CONFIG_HOME') + + if not config: + config = os.path.expanduser('~/.config') + + config = os.path.join(config, 'user-dirs.dirs') + desktopdir = None + + if os.path.isfile(config): + for line in open(config, 'r', encoding='utf-8'): + line = line.strip() + + if line.startswith('XDG_DESKTOP_DIR'): + parts = line.split('=', 1) + desktopdir = parts[1].strip('"').strip("'") + desktopdir = os.path.expandvars(desktopdir) + break + + if not desktopdir: + desktopdir = os.path.expanduser('~/Desktop') + + return desktopdir + + # Callbacks + def on_quick_open_activate(self, action, parameter, user_data=None): + if not self._popup: + self._create_popup() + + self._popup.show() + + def on_popup_destroy(self, popup, user_data=None): + self.set_popup_size(popup.get_final_size()) + + self._popup = None + + def on_activated(self, gfile, user_data=None): + Gedit.commands_load_location(self.window, gfile, None, -1, -1) + return True + +# ex:ts=4:et: -- cgit v1.2.3