#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # LightDM GTK Greeter Settings # Copyright (C) 2014 Andrew P. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . from lightdm_gtk_greeter_settings.MultiheadSetupDialog import MultiheadSetupDialog from lightdm_gtk_greeter_settings import ( helpers, OptionEntry, OptionGroup) from lightdm_gtk_greeter_settings.helpers import ( WidgetsWrapper) __all__ = ['MonitorsGroup'] class MonitorsGroup(OptionGroup.BaseGroup): GroupPrefix = 'monitor:' EntriesSetup = (('name', OptionEntry.StringEntry), ('background', OptionEntry.BackgroundEntry), ('user-background', OptionEntry.BooleanEntry), ('laptop', OptionEntry.BooleanEntry)) def __init__(self, widgets): super().__init__(widgets) self._widgets = helpers.WidgetsWrapper(widgets) self._groups = [] self._adapters = {key: OptionGroup.OneToManyEntryAdapter() for key, __ in self.EntriesSetup} self._dialog = None self._groups_wrapper = helpers.SimpleDictWrapper( deleter=self._remove_group, add=self._add_group, itergetter=lambda: iter(self._groups)) self._widgets['multihead_label'].connect('activate-link', self._on_label_link_activate) def read(self, config): for group in self._groups: group.clear() self._groups.clear() for groupname in config: if not groupname.startswith(MonitorsGroup.GroupPrefix): continue monitor = groupname[len(MonitorsGroup.GroupPrefix):].strip() self._add_group(monitor, groupname, config) def write(self, config, is_changed=None): groups = set(group.entries['name'].value for group in self._groups) groups_to_remove = tuple(name for name in config if (name.startswith(self.GroupPrefix) and name[len(self.GroupPrefix):].strip() not in groups)) for group in self._groups: name = group.entries['name'] new_name = self.GroupPrefix + ' ' + name.value if group.name == new_name: def changed_(entry): if entry == name: return False return not is_changed or is_changed(entry) else: def changed_(entry): return entry != name group.name = new_name group.write(config, is_changed=changed_) for name in groups_to_remove: config_group = config[name] for key, *__ in self.EntriesSetup: del config_group[key] def clear(self): if not self._groups and not self._adapters: return for group in self._groups: group.clear() self._groups.clear() def activate(self, key, entry): self._adapters[key].activate(entry) @property def groups(self): return self._groups_wrapper def _add_group(self, monitor='', groupname='', config=None): group = OptionGroup.SimpleGroup(groupname, self._widgets) group.entry_added.connect(lambda g, s, e, k: self.entry_added.emit(s, e, k)) group.entry_removed.connect(lambda g, s, e, k: self.entry_removed.emit(s, e, k)) group.options = {key: (adapter.new_entry, None) for key, adapter in self._adapters.items()} if config: group.read(config) name = group.entries['name'] name.enabled = True name.value = monitor self._groups.append(group) return group def _remove_group(self, group): group.clear() self._groups.remove(group) def _on_label_link_activate(self, label, uri): if not self._dialog: self._dialog = MultiheadSetupDialog(self) self._dialog.props.transient_for = self._widgets['multihead_label'].get_toplevel() for key, klass in self.EntriesSetup: self._adapters[key].base_entry = klass(WidgetsWrapper(self._dialog.builder, key)) self._dialog.run() self._dialog.hide() return True