import gtk, gtk.gdk, gtk.keysyms, gobject from deskbar.ui.cuemiac.CuemiacEntry import CuemiacEntry from deskbar.ui.cuemiac.CuemiacAlignedWindow import CuemiacAlignedWindow class CuemiacPopupEntry(CuemiacEntry): def __init__(self, default_entry_pixbuf, treeview): CuemiacEntry.__init__(self, default_entry_pixbuf) # State variables self.ignore_enter = False self.first_sel_changed = True self.entry_window_group = gtk.WindowGroup() # Our own UI elements self.tree_view = tree_view self.tree_view.set_hover_selection (True) self.selection = self.tree_view.get_selection() self.selection.set_mode(gtk.SELECTION_SINGLE) self.selection.unselect_all() # Signals setup self.selection.connect("changed", self.on_selection_changed) self.tree_view.connect('button-press-event', self.on_treeview_button_press) self.tree_view.connect('enter-notify-event', self.on_treeview_enter) self.tree_view.connect('motion-notify-event', self.on_treeview_motion) self.entry.connect("changed", self.on_entry_changed) self.entry.connect("key-press-event", self.on_entry_key_press) #self.popup_window.connect('key-press-event', self.on_popup_key_press) #self.popup_window.connect('button-press-event', self.on_popup_button_press) def on_treeview_button_press(self, widget, event): path = tree_view.get_path_at_pos(event.x, event.y) if path != None: print 'emit Match selected and block changed_id from entry' self.popdown() return True return False def on_treeview_enter(self, widget, event): return self.ignore_enter def on_treeview_motion(self, widget, event): self.ignore_enter = False return False def on_selection_changed(self, selection): if self.first_sel_changed: self.first_sel_changed = False if self.tree_view.is_focus(): self.selection.unselect_all() def on_entry_changed(self, entry): print 'Entry Changed cb' self.popup() def on_entry_key_press(self, widget, event): if event.keyval in (gtk.keysyms.Up, gtk.keysyms.KP_Up,gtk.keysyms.Down, gtk.keysyms.KP_Down,gtk.keysyms.Page_Up,gtk.keysyms.Page_Down): matches = 4 model, iter = self.selection.get_selected() if iter == None: iter = model.get_iter_first() if event.keyval in (gtk.keysyms.Up, gtk.keysyms.KP_Up): iter = model.iter_next(iter) elif event.keyval in (gtk.keysyms.Down, gtk.keysyms.KP_Down): iter = model.iter_next(iter) elif event.keyval in (gtk.keysyms.Page_Up): iter = model.iter_next(iter) elif event.keyval in (gtk.keysyms.Page_Down): iter = model.iter_next(iter) # if current_selected < 0: # sel.unselect_all() # elif current_selected < matches: self.selection.unselect_all() self.tree_view.set_cursor(model.get_path(iter), None, False) #path = gtk.TreePath(index of selection) #tree_view.set_cursor(path, None, False) print 'Move cursor in tree' return True elif event.keyval == gtk.keysyms.Escape: self.popdown() return True elif event.keyval in (gtk.keysyms.Tab, gtk.keysyms.KP_Tab, gtk.keysyms.ISO_Left_Tab): self.popdown() #self.entry.get_toplevel().child_focus(gtk.DIR_TAB_FORWARD) return True elif event.keyval in (gtk.keysyms.ISO_Enter, gtk.keysyms.KP_Enter, gtk.keysyms.Return): print 'Emit match selected' self.popdown() return True return False def popup(self): if not (self.popup_window.flags()>k.MAPPED): return print 'Entered1' if not (self.entry.flags()>k.MAPPED): return print 'Entered2' if not (self.entry.flags()>k.HAS_FOCUS): return print 'Entered3' self.ignore_enter = True entry_toplevel = self.entry.get_toplevel() entry_group = self.entry_window_group if entry_toplevel != None and entry_toplevel.group != None: entry_group = entry_toplevel.group entry_group.add_window (self.popup_window) self.tree_view.grab_focus() self.tree_view.realize() self.selection.unselect_all() for row in self.tree_view.get_model(): print row self.popup_window.update_position() #self.tree_view.set_size_request(100, 100) #self.popup_window.set_size_request(200, 200) #popup.move(100, 100) print 'Popup window show' self.popup_window.show() # Grab pointer self.popup_window.grab_add() gtk.gdk.pointer_grab( self.popup_window.window, True, gtk.gdk.BUTTON_PRESS_MASK| gtk.gdk.BUTTON_RELEASE_MASK| gtk.gdk.POINTER_MOTION_MASK, None, None, gtk.get_current_event_time()) def popdown(self): if not (self.popup_window.flags()>k.MAPPED): return self.ignore_enter = False self.popup_window.hide() # Ungrab pointer gtk.gdk.pointer_ungrab(gtk.get_current_event_time()) self.popup_window.grab_remove() # def on_popup_key_press(self, widget, event): # if not (self.popup_window.flags()>k.MAPPED): # return False # # self.entry.event(event) # return True # # def on_popup_button_press(self, widget, event): # if not (self.popup_window.flags()>k.MAPPED): # return False # # self.popdown() # return True