Codebase list lightdm-gtk-greeter-settings / 1c5c583 gtk_greeter_settings / IndicatorChooserDialog.py
1c5c583

Tree @1c5c583 (Download .tar.gz)

IndicatorChooserDialog.py @1c5c583raw · history · blame

from glob import iglob
import os
import sys

from gi.repository import Gtk
from gtk_greeter_settings import helpers


class IndicatorChooserDialog(Gtk.Dialog):

    __gtype_name__ = 'IndicatorChooserDialog'

    BUILDER_WIDGETS = ('short_choice', 'short_value', 'short_model',
                       'path_value', 'add_button')

    def __new__(cls):
        builder = Gtk.Builder()
        builder.add_from_file(helpers.get_data_path('%s.ui' % cls.__name__))
        window = builder.get_object('indicator_chooser_dialog')
        window._builder = builder
        window.__dict__.update(('_' + w, builder.get_object(w))
                               for w in cls.BUILDER_WIDGETS)
        builder.connect_signals(window)
        window._init_window()
        return window

    def _init_window(self):
        self._add_callback = None

        for path in iglob(os.path.join(sys.prefix, 'share', 'unity', 'indicators', '*')):
            name = os.path.basename(path)
            parts = name.rsplit('.', maxsplit=1)
            if len(parts) == 2 and parts[0] == 'com.canonical.indicator':
                name = parts[1]
            self._short_model.append((name,))

        for path in iglob(os.path.join(sys.prefix, 'lib', 'indicators3', '7', '*.so')):
            self._short_model.append((os.path.basename(path),))

    def _get_current_value(self):
        if self._short_choice.props.active:
            return self._short_value.props.text
        else:
            return self._path_value.get_filename()

    def on_add_clicked(self, *args):
        value = self._get_current_value()
        if value:
            self._add_callback(value)

    def get_indicator(self, add_callback=None):
        self._add_callback = add_callback
        self._add_button.props.visible = add_callback and hasattr(add_callback, '__call__')
        response = self.run()
        self.hide()
        if response == Gtk.ResponseType.OK:
            return self._get_current_value()
        return None