mintmenu/usr/lib/linuxmint/mintMenu/plugins/places.py

267 lines
11 KiB
Python
Raw Permalink Normal View History

#!/usr/bin/python2
2009-07-27 11:45:34 +01:00
import locale
import gettext
2009-07-27 11:45:34 +01:00
import os
import string
from glob import glob
2010-10-25 12:23:16 +01:00
from urllib import unquote
2009-07-27 11:45:34 +01:00
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gio, GLib
from plugins.easybuttons import easyButton
from plugins.execute import Execute
2009-07-27 11:45:34 +01:00
# i18n
2009-11-03 11:29:52 +00:00
gettext.install("mintmenu", "/usr/share/linuxmint/locale")
locale.bindtextdomain("mintmenu", "/usr/share/linuxmint/locale")
locale.textdomain("mintmenu")
home = os.path.expanduser("~")
2009-07-27 11:45:34 +01:00
class pluginclass(object):
2009-07-27 11:45:34 +01:00
def __init__(self, mintMenuWin, toggleButton, de):
2010-09-12 12:56:38 +01:00
self.mintMenuWin = mintMenuWin
self.toggleButton = toggleButton
self.de = de
2010-09-12 12:56:38 +01:00
2016-05-21 17:11:36 +01:00
# Read UI file
2013-03-04 16:50:14 +00:00
builder = Gtk.Builder()
builder.set_translation_domain("mintmenu")
builder.add_from_file("/usr/share/linuxmint/mintmenu/places.ui")
2016-05-21 17:11:36 +01:00
self.placesBtnHolder = builder.get_object("places_button_holder")
self.editableBtnHolder = builder.get_object("editable_button_holder")
2013-03-04 16:50:14 +00:00
self.scrolledWindow=builder.get_object("scrolledwindow2")
2010-09-12 12:56:38 +01:00
# These properties are NECESSARY to maintain consistency
# Set 'window' property for the plugin (Must be the root widget)
self.window = builder.get_object("mainWindow")
2010-09-12 12:56:38 +01:00
# Set 'heading' property for plugin
self.heading = _("Places")
# This should be the first item added to the window in glade
self.content_holder = builder.get_object("Places")
2010-09-12 12:56:38 +01:00
# Items to get custom colors
self.itemstocolor = [builder.get_object("viewport2")]
2013-03-04 16:50:14 +00:00
2016-05-21 17:11:36 +01:00
# Settings
2019-05-20 15:19:55 +01:00
self.settings = Gio.Settings("com.linuxmint.mintmenu.plugins.places")
self.settings.connect("changed::icon-size", self.RegenPlugin)
self.settings.connect("changed::show-computer", self.RegenPlugin)
self.settings.connect("changed::show-desktop", self.RegenPlugin)
self.settings.connect("changed::show-home_folder", self.RegenPlugin)
self.settings.connect("changed::show-network", self.RegenPlugin)
self.settings.connect("changed::show-trash", self.RegenPlugin)
self.settings.connect("changed::custom-names", self.RegenPlugin)
self.settings.connect("changed::allow-scrollbar", self.RegenPlugin)
self.settings.connect("changed::show-gtk-bookmarks", self.RegenPlugin)
self.settings.connect("changed::height", self.changePluginSize)
self.settings.connect("changed::width", self.changePluginSize)
2013-03-04 16:50:14 +00:00
self.loadSettings()
2010-09-12 12:56:38 +01:00
self.content_holder.set_size_request(self.width, self.height)
2010-09-12 12:56:38 +01:00
def wake(self):
if self.showtrash:
2010-09-12 12:56:38 +01:00
self.refreshTrash()
def changePluginSize(self, settings, key):
2019-05-20 15:19:55 +01:00
self.allowScrollbar = self.settings.get_boolean("allow-scrollbar")
self.width = self.settings.get_int("width")
if not self.allowScrollbar:
2013-03-04 16:50:14 +00:00
self.height = -1
self.scrolledWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.NEVER)
2013-03-04 16:50:14 +00:00
else:
self.scrolledWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
2019-05-20 15:19:55 +01:00
self.height = self.settings.get_int("height")
self.content_holder.set_size_request(self.width, self.height)
2010-09-12 12:56:38 +01:00
def RegenPlugin(self, *args, **kargs):
2013-03-04 16:50:14 +00:00
self.loadSettings()
2010-09-12 12:56:38 +01:00
self.ClearAll()
self.do_standard_places()
self.do_custom_places()
self.do_gtk_bookmarks()
2010-09-12 12:56:38 +01:00
def loadSettings(self):
2019-05-20 15:19:55 +01:00
self.width = self.settings.get_int("width")
self.allowScrollbar = self.settings.get_boolean("allow-scrollbar")
self.showGTKBookmarks = self.settings.get_boolean("show-gtk-bookmarks")
self.scrolledWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
2019-05-20 15:19:55 +01:00
self.height = self.settings.get_int("height")
self.content_holder.set_size_request(self.width, self.height)
if not self.allowScrollbar:
2010-09-12 12:56:38 +01:00
self.height = -1
self.scrolledWindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.NEVER)
self.content_holder.set_size_request(self.width, self.height)
2019-05-20 15:19:55 +01:00
self.iconsize = self.settings.get_int("icon-size")
2010-09-12 12:56:38 +01:00
# Check default items
2019-05-20 15:19:55 +01:00
self.showcomputer = self.settings.get_boolean("show-computer")
self.showhomefolder = self.settings.get_boolean("show-home-folder")
self.shownetwork = self.settings.get_boolean("show-network")
self.showdesktop = self.settings.get_boolean("show-desktop")
self.showtrash = self.settings.get_boolean("show-trash")
2010-09-12 12:56:38 +01:00
# Get paths for custom items
2019-05-20 15:19:55 +01:00
self.custompaths = self.settings.get_strv("custom-paths")
2010-09-12 12:56:38 +01:00
# Get names for custom items
2019-05-20 15:19:55 +01:00
self.customnames = self.settings.get_strv("custom-names")
2010-09-12 12:56:38 +01:00
# Hide vertical dotted separator
2019-05-20 15:19:55 +01:00
self.hideseparator = self.settings.get_boolean("hide-separator")
2010-09-12 12:56:38 +01:00
# Plugin icon
2019-05-20 15:19:55 +01:00
self.icon = self.settings.get_string("icon")
2016-05-21 17:11:36 +01:00
2010-09-12 12:56:38 +01:00
def ClearAll(self):
for child in self.placesBtnHolder.get_children():
child.destroy()
for child in self.editableBtnHolder.get_children():
child.destroy()
#Add standard places
def do_standard_places(self):
2010-09-12 12:56:38 +01:00
if self.showcomputer:
Button1 = easyButton("computer", self.iconsize, [_("Computer")], -1, -1)
Button1.connect("clicked", self.ButtonClicked, "xdg-open computer:")
2010-09-12 12:56:38 +01:00
Button1.show()
self.placesBtnHolder.pack_start(Button1, False, False, 0)
self.mintMenuWin.setTooltip(Button1, _("Browse all local and remote disks and folders accessible from this computer"))
2010-09-12 12:56:38 +01:00
if self.showhomefolder:
Button2 = easyButton("user-home", self.iconsize, [_("Home Folder")], -1, -1)
Button2.connect("clicked", self.ButtonClicked, "xdg-open %s " % home)
2010-09-12 12:56:38 +01:00
Button2.show()
self.placesBtnHolder.pack_start(Button2, False, False, 0)
self.mintMenuWin.setTooltip(Button2, _("Open your personal folder"))
2010-09-12 12:56:38 +01:00
if self.shownetwork and self.de == "mate":
2013-03-04 16:50:14 +00:00
mate_settings = Gio.Settings.new("org.mate.interface")
icon_theme = mate_settings.get_string("icon-theme")
if "Mint-X" in icon_theme:
Button3 = easyButton("notification-network-ethernet-connected", self.iconsize, [_("Network")], -1, -1)
else:
Button3 = easyButton("network-workgroup", self.iconsize, [_("Network")], -1, -1)
Button3.connect("clicked", self.ButtonClicked, "xdg-open network:")
2010-09-12 12:56:38 +01:00
Button3.show()
self.placesBtnHolder.pack_start(Button3, False, False, 0)
self.mintMenuWin.setTooltip(Button3, _("Browse bookmarked and local network locations"))
2010-09-12 12:56:38 +01:00
if self.showdesktop:
2010-09-12 12:56:38 +01:00
# Determine where the Desktop folder is (could be localized)
desktopDir = home + "/Desktop"
try:
import sys
sys.path.append('/usr/lib/linuxmint/common')
from configobj import ConfigObj
config = ConfigObj(home + "/.config/user-dirs.dirs")
tmpdesktopDir = config['XDG_DESKTOP_DIR']
if os.path.exists(os.path.expandvars(tmpdesktopDir)):
2010-09-12 12:56:38 +01:00
desktopDir = tmpdesktopDir
except Exception as e:
print(e)
Button4 = easyButton("desktop", self.iconsize, [_("Desktop")], -1, -1)
Button4.connect("clicked", self.ButtonClicked, 'xdg-open "%s"' % desktopDir)
2010-09-12 12:56:38 +01:00
Button4.show()
self.placesBtnHolder.pack_start(Button4, False, False, 0)
self.mintMenuWin.setTooltip(Button4, _("Browse items placed on the desktop"))
2010-09-12 12:56:38 +01:00
if self.showtrash:
self.trashButton = easyButton("user-trash", self.iconsize, [_("Trash")], -1, -1)
self.trashButton.connect("clicked", self.ButtonClicked, "xdg-open trash:")
2010-09-12 12:56:38 +01:00
self.trashButton.show()
self.trashButton.connect("button-release-event", self.trashPopup)
self.trash_path = os.path.join(home, ".local/share/Trash/info")
2010-09-12 12:56:38 +01:00
self.refreshTrash()
self.placesBtnHolder.pack_start(self.trashButton, False, False, 0)
self.mintMenuWin.setTooltip(self.trashButton, _("Browse deleted files"))
2010-09-12 12:56:38 +01:00
def do_custom_places(self):
for index in range(len(self.custompaths)):
2010-09-12 12:56:38 +01:00
path = self.custompaths[index]
path = path.replace("~", home)
command = 'xdg-open "%s"' % path
currentbutton = easyButton("folder", self.iconsize, [self.customnames[index]], -1, -1)
currentbutton.connect("clicked", self.ButtonClicked, command)
2010-09-12 12:56:38 +01:00
currentbutton.show()
self.placesBtnHolder.pack_start(currentbutton, False, False, 0)
2010-09-12 12:56:38 +01:00
def do_gtk_bookmarks(self):
if self.showGTKBookmarks:
2017-05-06 14:07:02 +01:00
bookmarksFile = os.path.join(GLib.get_user_config_dir(), "gtk-3.0", "bookmarks")
if not os.path.exists(bookmarksFile):
bookmarksFile = os.path.join(GLib.get_home_dir(), ".gtk-bookmarks")
if not os.path.exists(bookmarksFile):
return
bookmarks = []
2017-05-06 14:07:02 +01:00
with open(bookmarksFile, "r") as f:
for line in f:
2010-10-25 12:23:16 +01:00
#line = line.replace('file://', '')
line = line.rstrip()
if not line:
continue
parts = line.split(' ', 1)
if len(parts) == 2:
path, name = parts
elif len(parts) == 1:
path = parts[0]
name = os.path.basename(os.path.normpath(path))
bookmarks.append((name, path))
for name, path in bookmarks:
2010-10-25 12:23:16 +01:00
name = unquote(name)
currentbutton = easyButton("folder", self.iconsize, [name], -1, -1)
currentbutton.connect("clicked", self.launch_gtk_bookmark, path)
currentbutton.show()
self.placesBtnHolder.pack_start(currentbutton, False, False, 0)
2016-05-21 17:11:36 +01:00
def launch_gtk_bookmark(self, widget, path):
2010-10-25 12:23:16 +01:00
self.mintMenuWin.hide()
os.system("xdg-open \"%s\" &" % path)
def trashPopup(self, widget, event):
2010-09-12 12:56:38 +01:00
if event.button == 3:
2013-03-04 16:50:14 +00:00
trashMenu = Gtk.Menu()
emptyTrashMenuItem = Gtk.MenuItem(_("Empty trash"))
2010-09-12 12:56:38 +01:00
trashMenu.append(emptyTrashMenuItem)
trashMenu.show_all()
emptyTrashMenuItem.connect("activate", self.emptyTrash, widget)
self.mintMenuWin.stopHiding()
2017-04-28 16:04:01 +01:00
trashMenu.attach_to_widget(widget, None)
2016-09-06 15:58:34 +01:00
trashMenu.popup(None, None, None, None, 3, 0)
2010-09-12 12:56:38 +01:00
def emptyTrash(self, menu, widget):
2010-09-12 12:56:38 +01:00
os.system("rm -rf " + home + "/.local/share/Trash/info/*")
os.system("rm -rf " + home + "/.local/share/Trash/files/*")
self.trashButton.setIcon("user-trash")
def ButtonClicked(self, widget, Exec):
2010-09-12 12:56:38 +01:00
self.mintMenuWin.hide()
if Exec:
Execute(Exec)
2010-09-12 12:56:38 +01:00
def do_plugin(self):
2010-09-12 12:56:38 +01:00
self.do_standard_places()
self.do_custom_places()
self.do_gtk_bookmarks()
2010-09-12 12:56:38 +01:00
def refreshTrash(self):
if os.path.exists(self.trash_path) and glob(os.path.join(self.trash_path, "*")):
iconName = "user-trash-full"
else:
iconName = "user-trash"
2010-09-12 12:56:38 +01:00
self.trashButton.setIcon(iconName)