# -*- 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 <http://www.gnu.org/licenses/>.
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("<Primary><Alt>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: