username.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
This module contains value widgets for helping enter usernames.

Classes:
    UsernameValueWidget - makes a helpful widget for usernames.

"""

import pwd

import gobject
import pygtk
pygtk.require('2.0')
import gtk


class UsernameValueWidget(gtk.HBox):

    """This class generates a widget for entering usernames."""

    def __init__(self, value, metadata, set_value, hook, arg_str=None):
        super(UsernameValueWidget, self).__init__(homogeneous=False, spacing=0)
        self.value = value
        self.metadata = metadata
        self.set_value = set_value
        self.hook = hook
        self.entry = gtk.Entry()
        self.entry.set_text(self.value)
        self.entry.connect_after("paste-clipboard", self._setter)
        self.entry.connect_after("key-release-event", self._setter)
        self.entry.connect_after("button-release-event", self._setter)
        self.entry.show()
        gobject.idle_add(self._set_completion)
        self.pack_start(self.entry, expand=True, fill=True,
                        padding=0)
        self.entry.connect('focus-in-event',
                           hook.trigger_scroll)
        self.grab_focus = lambda : hook.get_focus(self.entry)

    def _setter(self, *args):
        """Alter the variable value and update status."""
        self.value = self.entry.get_text()
        self.set_value(self.value)
        return False

    def get_focus_index(self):
        """Return the cursor position within the variable value."""
        return self.entry.get_position()

    def set_focus_index(self, focus_index=None):
        """Set the cursor position within the variable value."""
        if focus_index is None:
            return False
        self.entry.set_position(focus_index)

    def _set_completion(self):
        # Return a predictive text model.
        completion = gtk.EntryCompletion()
        model = gtk.ListStore(str)
        for username in [p.pw_name for p in pwd.getpwall()]:
            model.append([username])
        completion.set_model(model)
        completion.set_text_column(0)
        completion.set_inline_completion(True)
        self.entry.set_completion(completion)