def double_click(self, widget, item, column): if not item.is_select: return #if not item.clicked: #return if not column in item.ENTRY_COLUMN: return if item.entry: item.entry.grab_focus() return item.get_buffer(column) item.entry_buffer.set_property('cursor-visible', True) hbox = gtk.HBox(False) align = gtk.Alignment(0, 0, 1, 1) entry = Entry() entry.set_data("item", item) entry.set_data("button_press", False) entry.set_buffer(item.entry_buffer) width = item.get_column_widths()[column] if width >= 0: entry.set_size_request(item.get_column_widths()[column]-4, 0) entry.connect("press-return", lambda w: hbox.destroy()) entry.connect("destroy", self.edit_done, hbox, item) entry.connect_after("focus-in-event", self.entry_focus_changed, item) entry.connect_after("focus-out-event", self.entry_focus_changed, item) self.pack_start(hbox, False, False) self.set_data("entry_widget", entry) hbox.pack_start(entry, False, False) hbox.pack_start(align) hbox.show_all() entry.set_can_focus(True) entry.grab_focus() entry.select_all() item.entry = entry
class CustomEntry(gtk.VBox): __gsignals__ = { "clear" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()), "enter-press" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)) } def __init__(self, content=""): ''' Initialize InputEntry class. ''' # Init. gtk.VBox.__init__(self) clean_button = CleanButton() clean_button.connect("clicked", self.on_clean_clicked) self.entry = Entry(content, place_holder=_("Need some music? Find it here...")) entry_align = gtk.Alignment() entry_align.set(0.5, 0.5, 1, 1) entry_align.add(self.entry) clean_box = gtk.HBox(spacing=5) clean_box.pack_start(entry_align, True, True) self.clean_button_align = set_widget_gravity(clean_button, gravity=(0.5, 0.5, 0, 0), paddings=(0, 0, 0, 5)) self.clean_button_align.set_no_show_all(True) clean_box.pack_start(self.clean_button_align, False, False) self.add(clean_box) self.entry.connect("press-return", self.__emit_enter_signal) self.entry.connect("changed", self.__on_entry_changed) self.connect("expose-event", self.expose_input_entry) def on_clean_clicked(self, widget): # self.emit("clear") self.set_text("") def get_clean_visible(self): return self.clean_button_align.get_visible() def hide_clean_button(self): self.clean_button_align.hide_all() self.clean_button_align.set_no_show_all(True) def __emit_enter_signal(self, widget): self.hide_clean_button() self.emit("enter-press", self.get_text()) def __on_entry_changed(self, widget, string): if string: self.clean_button_align.set_no_show_all(False) self.clean_button_align.show_all() else: self.clean_button_align.hide_all() self.clean_button_align.set_no_show_all(True) def set_sensitive(self, sensitive): ''' Internal function to wrap function `set_sensitive`. ''' super(InputEntry, self).set_sensitive(sensitive) self.entry.set_sensitive(sensitive) def emit_action_active_signal(self): ''' Internal callback for `action-active` signal. ''' self.emit("action-active", self.get_text()) def expose_input_entry(self, widget, event): ''' Internal callback for `expose-event` signal. ''' # Init. cr = widget.window.cairo_create() rect = widget.allocation cr.set_source_rgba(*alpha_color_hex_to_cairo(("#FFFFFF", 0.9))) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() # Draw frame. with cairo_disable_antialias(cr): cr.set_line_width(1) cr.set_source_rgba(*color_hex_to_cairo("#C3C4C5")) cr.move_to(rect.x + rect.width, rect.y) cr.rel_line_to(0, rect.height) cr.stroke() propagate_expose(widget, event) # return True def set_size(self, width, height): ''' Set input entry size with given value. @param width: New width of input entry. @param height: New height of input entry. ''' # self.set_size_request(width, height) self.entry.set_size_request(width - 2, height - 2) def set_editable(self, editable): ''' Set editable status of input entry. @param editable: input entry can editable if option is True, else can't edit. ''' self.entry.set_editable(editable) def set_text(self, text): ''' Set text of input entry. @param text: input entry string. ''' self.entry.set_text(text) def get_text(self): ''' Get text of input entry. @return: Return text of input entry. ''' return self.entry.get_text() def focus_input(self): ''' Focus input cursor. ''' self.entry.grab_focus()