Exemplo n.º 1
0
    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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
    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
Exemplo n.º 6
0
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