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
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
class MonitorsGroup(BaseGroup): GROUP_PREFIX = 'monitor:' def __init__(self, widgets): super().__init__(widgets) self._entries = {} self._widgets = WidgetsWrapper(widgets, 'multihead') self._dialog = None self._widgets['label'].connect('activate-link', self._on_label_link_activate) def read(self, config): self._entries.clear() for name, section in config.items(): if not name.startswith(self.GROUP_PREFIX): continue name = name[len(self.GROUP_PREFIX):].strip() entry = MonitorEntry(self._widgets) entry['background'] = section.get('background', None) entry['user-background'] = section.getboolean('user-background', None) entry['laptop'] = section.getboolean('laptop', None) self._entries[name] = entry self.entry_added.emit(entry, name) def write(self, config): for name in config.sections(): if name.startswith(self.GROUP_PREFIX): config.remove_section(name) for name, entry in self._entries.items(): section = '{prefix} {name}'.format(prefix=self.GROUP_PREFIX, name=name) config.add_section(section) for key, value in entry: if value is not None: config.set(section, key, value) def _on_label_link_activate(self, label, uri): if not self._dialog: self._dialog = MultiheadSetupDialog() self._dialog.props.transient_for = self._widgets['label'].get_toplevel() self._dialog.set_model(self._entries) if self._dialog.run() == Gtk.ResponseType.OK: current_names = set(self._entries.keys()) for name, values in self._dialog.get_model().items(): if name in self._entries: self._entries[name].assign(values) current_names.discard(name) else: entry = MonitorEntry(self._widgets, values) self._entries[name] = entry self.entry_added.emit(entry, name) for name in current_names: self.entry_added.emit(self._entries.pop(name), name) self._dialog.hide() return True
def _on_label_link_activate(self, label, uri): if not self._dialog: self._dialog = MultiheadSetupDialog() self._dialog.props.transient_for = self._widgets['label'].get_toplevel() self._dialog.set_model(self._entries) if self._dialog.run() == Gtk.ResponseType.OK: current_names = set(self._entries.keys()) for name, values in self._dialog.get_model().items(): if name in self._entries: self._entries[name].assign(values) current_names.discard(name) else: entry = MonitorEntry(self._widgets, values) self._entries[name] = entry self.entry_added.emit(entry, name) for name in current_names: self.entry_added.emit(self._entries.pop(name), name) self._dialog.hide() return True
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
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