b7a1fa0b94
Since the move to GTK3 custom color support is extremely hacky and buggy: - It relies on gtk_widget_override_color() which is deprecated - Only one call to gtk_widget_override_color() is functional, successive calls are ignored, leading to the menu not changing colors when the custom colors are changed or enabled/disabled. - RegenPlugins leads to a loss of color. - Theme changes are broken due to overridden colors. The feature is also very niche and quite unecessary. If a custom color is better than the default one we should apply the change in the theme or define a new theme which inherits ours and simply defines the menu differently. The way to do this, in line with GTK's design, is via CSS at theme level.
299 lines
17 KiB
Python
Executable File
299 lines
17 KiB
Python
Executable File
#!/usr/bin/python3
|
|
|
|
import gettext
|
|
import glob
|
|
import locale
|
|
import setproctitle
|
|
|
|
import gi
|
|
gi.require_version("Gtk", "3.0")
|
|
gi.require_version('XApp', '1.0')
|
|
from gi.repository import Gtk, Gdk, GdkPixbuf, XApp
|
|
|
|
import keybinding
|
|
from xapp.GSettingsWidgets import *
|
|
|
|
# i18n
|
|
gettext.install("mintmenu", "/usr/share/linuxmint/locale")
|
|
locale.bindtextdomain("mintmenu", "/usr/share/linuxmint/locale")
|
|
locale.textdomain("mintmenu")
|
|
|
|
class CustomPlaceDialog (Gtk.Dialog):
|
|
|
|
def __init__(self):
|
|
Gtk.Dialog.__init__(self, title=_("Custom Place"), flags=Gtk.DialogFlags.MODAL,
|
|
buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
|
|
Gtk.STOCK_OK, Gtk.ResponseType.OK))
|
|
self.set_default_size(150, 100)
|
|
|
|
grid = Gtk.Grid()
|
|
grid.set_row_spacing(12)
|
|
grid.set_column_spacing(12)
|
|
grid.set_border_width(12)
|
|
|
|
self.name = Gtk.Entry()
|
|
grid.attach(Gtk.Label(_("Name:")), 0, 0, 1, 1)
|
|
grid.attach(self.name, 1, 0, 1, 1)
|
|
|
|
self.filechooser_button = Gtk.FileChooserButton()
|
|
self.filechooser_button.set_title(_("Select a folder"))
|
|
self.filechooser_button.set_action(Gtk.FileChooserAction.SELECT_FOLDER)
|
|
grid.attach(Gtk.Label(_("Folder:")), 0, 1, 1, 1)
|
|
grid.attach(self.filechooser_button, 1, 1, 1, 1)
|
|
|
|
self.get_content_area().add(grid)
|
|
|
|
self.show_all()
|
|
|
|
class mintMenuPreferences():
|
|
|
|
def __init__(self):
|
|
|
|
self.settings = Gio.Settings("com.linuxmint.mintmenu")
|
|
self.places_settings = Gio.Settings("com.linuxmint.mintmenu.plugins.places")
|
|
|
|
self.builder = Gtk.Builder()
|
|
self.builder.set_translation_domain("mintmenu")
|
|
self.builder.add_from_file("/usr/share/linuxmint/mintmenu/preferences.ui")
|
|
|
|
self.window = self.builder.get_object("main_window")
|
|
self.window.set_title(_("Menu preferences"))
|
|
self.window.set_icon_name("linuxmint-logo")
|
|
self.window.connect("destroy", Gtk.main_quit)
|
|
|
|
page = SettingsPage()
|
|
self.builder.get_object("box_general").add(page)
|
|
|
|
section = page.add_section(_("Menu button"), _("Applet button in the panel"))
|
|
section.add_row(GSettingsSwitch(_("Show button icon"), "com.linuxmint.mintmenu", "show-applet-icon"))
|
|
section.add_reveal_row(GSettingsEntry(_("Button text"), "com.linuxmint.mintmenu", "applet-text"), "com.linuxmint.mintmenu", "show-applet-icon")
|
|
section.add_reveal_row(GSettingsIconChooser(_("Button icon"), "com.linuxmint.mintmenu", "applet-icon"), "com.linuxmint.mintmenu", "show-applet-icon")
|
|
|
|
binding_widget = keybinding.KeybindingWidget()
|
|
binding_widget.set_val(self.settings.get_string("hot-key"))
|
|
binding_widget.connect("accel-edited", self.set_keyboard_shortcut)
|
|
label = SettingsLabel(_("Keyboard shortcut"))
|
|
setting_widget = SettingsWidget()
|
|
setting_widget.pack_start(label, False, False, 0)
|
|
setting_widget.pack_end(binding_widget, False, False, 0)
|
|
section.add_row(setting_widget)
|
|
|
|
section = page.add_section(_("Options"), _("General applet options"))
|
|
self.system_switch = Switch(_("Show system management"))
|
|
self.system_switch.content_widget.connect("notify::active", self.set_plugins)
|
|
section.add_row(self.system_switch)
|
|
self.places_switch = Switch(_("Show places"))
|
|
self.places_switch.content_widget.connect("notify::active", self.set_plugins)
|
|
section.add_row(self.places_switch)
|
|
self.recent_switch = Switch(_("Show recently used documents and applications"))
|
|
self.recent_switch.content_widget.connect("notify::active", self.set_plugins)
|
|
section.add_row(self.recent_switch)
|
|
self.set_plugins_switches()
|
|
section.add_row(GSettingsSwitch(_("Show tooltips"), "com.linuxmint.mintmenu", "tooltips-enabled"))
|
|
|
|
page = SettingsPage()
|
|
self.builder.get_object("box_appearance").add(page)
|
|
section = page.add_section(_("Appearance"), _("Custom theme"))
|
|
# section.add_row(GSettingsSwitch(_("Use custom colors"), "com.linuxmint.mintmenu", "use-custom-color"))
|
|
# section.add_reveal_row(GSettingsColorChooser(_("Headings"), "com.linuxmint.mintmenu", "custom-heading-color"), "com.linuxmint.mintmenu", "use-custom-color")
|
|
# section.add_reveal_row(GSettingsColorChooser(_("Background"), "com.linuxmint.mintmenu", "custom-color"), "com.linuxmint.mintmenu", "use-custom-color")
|
|
options = []
|
|
options.append(["default", _("Desktop theme"), "default"])
|
|
themes = glob.glob("/usr/share/themes/*/*/gtkrc")
|
|
for theme in sorted(themes):
|
|
if theme.startswith("/usr/share/themes") and theme.endswith("/gtk-2.0/gtkrc"):
|
|
theme = theme.replace("/usr/share/themes/", "")
|
|
theme = theme.replace("gtk-2.0", "")
|
|
theme = theme.replace("gtkrc", "")
|
|
theme = theme.replace("/", "")
|
|
theme = theme.strip()
|
|
options.append([theme, theme])
|
|
section.add_row(GSettingsComboBox(_("Theme:"), "com.linuxmint.mintmenu", "theme-name", options))
|
|
|
|
section = page.add_section(_("Icon sizes"), _("The size of the icons"))
|
|
section.add_row(GSettingsSpinButton(_("Favorites"), "com.linuxmint.mintmenu.plugins.applications", "favicon-size", mini=1, maxi=128, step=1, page=2))
|
|
section.add_row(GSettingsSpinButton(_("Applications"), "com.linuxmint.mintmenu.plugins.applications", "icon-size", mini=1, maxi=128, step=1, page=2))
|
|
section.add_row(GSettingsSpinButton(_("System"), "com.linuxmint.mintmenu.plugins.system_management", "icon-size", mini=1, maxi=128, step=1, page=2))
|
|
section.add_row(GSettingsSpinButton(_("Places"), "com.linuxmint.mintmenu.plugins.places", "icon-size", mini=1, maxi=128, step=1, page=2))
|
|
|
|
page = SettingsPage()
|
|
self.builder.get_object("box_applications").add(page)
|
|
|
|
section = page.add_section(_("Layout"), _("Section layout"))
|
|
section.add_row(GSettingsSwitch(_("Show search bar on top"), "com.linuxmint.mintmenu.plugins.applications", "search-on-top"))
|
|
section.add_row(GSettingsSwitch(_("Show applications comments"), "com.linuxmint.mintmenu.plugins.applications", "show-application-comments"))
|
|
|
|
section = page.add_section(_("Categories"), _("Applications categories"))
|
|
section.add_row(GSettingsSwitch(_("Show category icons"), "com.linuxmint.mintmenu.plugins.applications", "show-category-icons"))
|
|
section.add_row(GSettingsSwitch(_("Switch categories on hover"), "com.linuxmint.mintmenu.plugins.applications", "categories-mouse-over"))
|
|
section.add_reveal_row(GSettingsSpinButton(_("Hover delay"), "com.linuxmint.mintmenu.plugins.applications", "category-hover-delay", units=_("milliseconds"), mini=1, maxi=500, step=1, page=10), "com.linuxmint.mintmenu.plugins.applications", "categories-mouse-over")
|
|
|
|
section = page.add_section(_("Search"), _("Search options"))
|
|
section.add_row(GSettingsSwitch(_("Search for packages to install"), "com.linuxmint.mintmenu.plugins.applications", "use-apt"))
|
|
section.add_row(GSettingsSwitch(_("Remember the last category or search"), "com.linuxmint.mintmenu.plugins.applications", "remember-filter"))
|
|
section.add_row(GSettingsSwitch(_("Enable Internet search"), "com.linuxmint.mintmenu.plugins.applications", "enable-internet-search"))
|
|
section.add_row(GSettingsEntry(_("Search command"), "com.linuxmint.mintmenu.plugins.applications", "search-command"))
|
|
|
|
page = SettingsPage()
|
|
self.builder.get_object("box_favorites").add(page)
|
|
|
|
section = page.add_section(_("Layout"), _("Section layout"))
|
|
section.add_row(GSettingsSpinButton(_("Number of columns"), "com.linuxmint.mintmenu.plugins.applications", "fav-cols", mini=1, maxi=5, step=1, page=1))
|
|
section.add_row(GSettingsSwitch(_("Swap name and generic name"), "com.linuxmint.mintmenu.plugins.applications", "swap-generic-name"))
|
|
section.add_row(GSettingsSwitch(_("Show favorites when the menu is open"), "com.linuxmint.mintmenu", "start-with-favorites"))
|
|
|
|
page = SettingsPage()
|
|
self.builder.get_object("box_system").add(page)
|
|
|
|
section = page.add_section(_("Layout"), _("Section layout"))
|
|
section.add_row(GSettingsSwitch(_("Custom height"), "com.linuxmint.mintmenu.plugins.system_management", "allow-scrollbar"))
|
|
section.add_reveal_row(GSettingsSpinButton(_("Height"), "com.linuxmint.mintmenu.plugins.system_management", "height", mini=1, maxi=800, step=1, page=2), "com.linuxmint.mintmenu.plugins.system_management", "allow-scrollbar")
|
|
|
|
section = page.add_section(_("Items"), _("Toggle default items"))
|
|
section.add_row(GSettingsSwitch(_("Software Manager"), "com.linuxmint.mintmenu.plugins.system_management", "show-software-manager"))
|
|
section.add_row(GSettingsSwitch(_("Package Manager"), "com.linuxmint.mintmenu.plugins.system_management", "show-package-manager"))
|
|
section.add_row(GSettingsSwitch(_("Control Center"), "com.linuxmint.mintmenu.plugins.system_management", "show-control-center"))
|
|
section.add_row(GSettingsSwitch(_("Terminal"), "com.linuxmint.mintmenu.plugins.system_management", "show-terminal"))
|
|
section.add_row(GSettingsSwitch(_("Lock Screen"), "com.linuxmint.mintmenu.plugins.system_management", "show-lock-screen"))
|
|
section.add_row(GSettingsSwitch(_("Logout"), "com.linuxmint.mintmenu.plugins.system_management", "show-logout"))
|
|
section.add_row(GSettingsSwitch(_("Quit"), "com.linuxmint.mintmenu.plugins.system_management", "show-quit"))
|
|
|
|
page = SettingsPage()
|
|
self.builder.get_object("box_places").add(page)
|
|
|
|
section = page.add_section(_("Layout"), _("Section layout"))
|
|
section.add_row(GSettingsSwitch(_("Custom height"), "com.linuxmint.mintmenu.plugins.places", "allow-scrollbar"))
|
|
section.add_reveal_row(GSettingsSpinButton(_("Height"), "com.linuxmint.mintmenu.plugins.places", "height", mini=1, maxi=800, step=1, page=2), "com.linuxmint.mintmenu.plugins.places", "allow-scrollbar")
|
|
|
|
section = page.add_section(_("Items"), _("Toggle default items"))
|
|
section.add_row(GSettingsSwitch(_("Computer"), "com.linuxmint.mintmenu.plugins.places", "show-computer"))
|
|
section.add_row(GSettingsSwitch(_("Home Folder"), "com.linuxmint.mintmenu.plugins.places", "show-home-folder"))
|
|
section.add_row(GSettingsSwitch(_("Network"), "com.linuxmint.mintmenu.plugins.places", "show-network"))
|
|
section.add_row(GSettingsSwitch(_("Desktop"), "com.linuxmint.mintmenu.plugins.places", "show-desktop"))
|
|
section.add_row(GSettingsSwitch(_("Trash"), "com.linuxmint.mintmenu.plugins.places", "show-trash"))
|
|
section.add_row(GSettingsSwitch(_("GTK Bookmarks"), "com.linuxmint.mintmenu.plugins.places", "show-gtk-bookmarks"))
|
|
|
|
section = page.add_section(_("Custom places"), _("You can add your own places in the menu"))
|
|
box = self.builder.get_object("custom_places_box")
|
|
section.add(box)
|
|
self.custom_places_tree = self.builder.get_object("custom_places_tree")
|
|
self.custom_places_paths = self.places_settings.get_strv("custom-paths")
|
|
self.custom_places_names = self.places_settings.get_strv("custom-names")
|
|
self.custom_places_model = Gtk.ListStore(str, str)
|
|
self.cell = Gtk.CellRendererText()
|
|
for count in range(len(self.custom_places_paths)):
|
|
self.custom_places_model.append([self.custom_places_names[count], self.custom_places_paths[count]])
|
|
self.custom_places_model.connect("row-inserted", self.save_custom_places)
|
|
self.custom_places_model.connect("row-deleted", self.save_custom_places)
|
|
self.custom_places_model.connect("rows-reordered", self.save_custom_places)
|
|
self.custom_places_model.connect("row-changed", self.save_custom_places)
|
|
self.custom_places_tree.set_model(self.custom_places_model)
|
|
self.custom_places_tree.append_column(Gtk.TreeViewColumn(_("Name"), self.cell, text=0))
|
|
self.custom_places_tree.append_column(Gtk.TreeViewColumn(_("Path"), self.cell, text=1))
|
|
self.builder.get_object("newButton").connect("clicked", self.add_custom_place)
|
|
self.builder.get_object("editButton").connect("clicked", self.edit_custom_place)
|
|
self.builder.get_object("upButton").connect("clicked", self.move_up)
|
|
self.builder.get_object("downButton").connect("clicked", self.move_down)
|
|
self.builder.get_object("removeButton").connect("clicked", self.remove_custom_place)
|
|
|
|
self.window.show_all()
|
|
return
|
|
|
|
def set_keyboard_shortcut(self, widget):
|
|
self.settings.set_string("hot-key", widget.get_val())
|
|
|
|
def set_plugins_switches(self):
|
|
plugins = self.settings.get_strv("plugins-list")
|
|
self.recent_switch.content_widget.set_active("recent" in plugins)
|
|
self.system_switch.content_widget.set_active("system_management" in plugins)
|
|
self.places_switch.content_widget.set_active("places" in plugins)
|
|
|
|
def set_plugins(self, widget, param):
|
|
visible_plugins = []
|
|
if self.places_switch.content_widget.get_active():
|
|
visible_plugins.append("places")
|
|
if self.system_switch.content_widget.get_active():
|
|
visible_plugins.append("system_management")
|
|
if self.places_switch.content_widget.get_active() or self.system_switch.content_widget.get_active():
|
|
visible_plugins.append("newpane")
|
|
visible_plugins.append("applications")
|
|
if self.recent_switch.content_widget.get_active():
|
|
visible_plugins.append("newpane")
|
|
visible_plugins.append("recent")
|
|
self.settings.set_strv("plugins-list", visible_plugins)
|
|
|
|
def add_custom_place(self, newButton):
|
|
dialog = CustomPlaceDialog()
|
|
response = dialog.run()
|
|
if response == Gtk.ResponseType.OK:
|
|
name = dialog.name.get_text()
|
|
path = dialog.filechooser_button.get_filename()
|
|
if name and path and name != "":
|
|
self.custom_places_model.append((name, path))
|
|
dialog.destroy()
|
|
return
|
|
|
|
def edit_custom_place(self, editButton):
|
|
dialog = CustomPlaceDialog()
|
|
treeselection = self.custom_places_tree.get_selection()
|
|
currentiter = treeselection.get_selected()[1]
|
|
if currentiter:
|
|
initName = self.custom_places_model.get_value(currentiter, 0)
|
|
initPath = self.custom_places_model.get_value(currentiter, 1)
|
|
dialog.name.set_text(initName)
|
|
dialog.filechooser_button.set_filename(initPath)
|
|
response = dialog.run()
|
|
if response == Gtk.ResponseType.OK:
|
|
name = dialog.name.get_text()
|
|
path = dialog.filechooser_button.get_filename()
|
|
if name and path and name != "":
|
|
self.custom_places_model.set_value(currentiter, 0, name)
|
|
self.custom_places_model.set_value(currentiter, 1, path)
|
|
dialog.destroy()
|
|
|
|
def move_up(self, upButton):
|
|
treeselection = self.custom_places_tree.get_selection()
|
|
currentiter = treeselection.get_selected()[1]
|
|
if treeselection:
|
|
lagiter = self.custom_places_model.get_iter_first()
|
|
nextiter = self.custom_places_model.get_iter_first()
|
|
while nextiter and self.custom_places_model.get_path(nextiter) != \
|
|
self.custom_places_model.get_path(currentiter):
|
|
lagiter = nextiter
|
|
nextiter = self.custom_places_model.iter_next(nextiter)
|
|
if nextiter:
|
|
self.custom_places_model.swap(currentiter, lagiter)
|
|
return
|
|
|
|
def move_down(self, downButton):
|
|
treeselection = self.custom_places_tree.get_selection()
|
|
currentiter = treeselection.get_selected()[1]
|
|
nextiter = self.custom_places_model.iter_next(currentiter)
|
|
if nextiter:
|
|
self.custom_places_model.swap(currentiter, nextiter)
|
|
return
|
|
|
|
def remove_custom_place(self, removeButton):
|
|
treeselection = self.custom_places_tree.get_selection()
|
|
currentiter = treeselection.get_selected()[1]
|
|
if currentiter:
|
|
self.custom_places_model.remove(currentiter)
|
|
return
|
|
|
|
def save_custom_places(self, treemodel, path, iter = None, new_order = None):
|
|
if not iter or self.custom_places_model.get_value(iter, 1):
|
|
treeiter = self.custom_places_model.get_iter_first()
|
|
custom_places_names = []
|
|
custom_places_paths = []
|
|
while treeiter:
|
|
custom_places_names = custom_places_names + [self.custom_places_model.get_value(treeiter, 0)]
|
|
custom_places_paths = custom_places_paths + [self.custom_places_model.get_value(treeiter, 1)]
|
|
treeiter = self.custom_places_model.iter_next(treeiter)
|
|
self.places_settings.set_strv("custom-paths", custom_places_paths)
|
|
self.places_settings.set_strv("custom-names", custom_places_names)
|
|
|
|
if __name__ == "__main__":
|
|
setproctitle.setproctitle('mintmenu-preferences')
|
|
preferences = mintMenuPreferences()
|
|
Gtk.main()
|