def click_in_tree(view, path=None, column=0, button=1, events=pygps.single_click_events, process_events=True, control=False, alt=False, shift=False, modifier=None, through_gps=True): """Simulate a click in the TreeView on the given path and column. This event is sent asynchronously, and you should check its result in an idle callback, or call process_all_events() immediately after the call to click_in_tree. If path is none, the event is sent to the first selected row. modifier is a Gdk.ModifierType, overriding control, alt or shift. If you are using the third button to display a contextual menu, see also activate_contextual() To send a double-click, emit an event with type=Gdk._2BUTTON_PRESS """ if not view.get_realized(): GPS.Logger("TESTSUITE").log("click_in_tree: view is not realized") return if (os.name == 'nt' and button == 3 and events == pygps.single_click_events): # ??? work around # On Windows sending a BUTTON_PRESS followed by a # BUTTON_RELEASE event when opening a contextual menu does # not work. The BUTTON_RELEASE close the contextual menu. # For now we remove this event. events = events[:1] if not path: path = view.get_selection().get_selected_rows()[1][0] rect = view.get_cell_area(path, view.get_column(column)) x = float(rect.x + rect.width / 2) y = float(rect.y + rect.height / 2) if modifier is not None: state = modifier else: state = Gdk.ModifierType(0) if control: if sys.platform == 'darwin': # on Mac, we need to also pass the Command key state |= Gdk.ModifierType.MOD2_MASK else: state |= Gdk.ModifierType.CONTROL_MASK if shift: state |= Gdk.ModifierType.SHIFT_MASK if alt: state |= Gdk.ModifierType.MOD1_MASK # TreeView doesn't handle single click well without # getting "enter-notify-event" first if through_gps: GPS.send_crossing_event(type=Gdk.EventType.ENTER_NOTIFY, window=view.get_bin_window(), x=int(x), y=int(y), state=0) else: event = Gdk.EventCrossing() event.type = Gdk.EventType.ENTER_NOTIFY event.window = view.get_bin_window() event.device = pygps.default_event_device() event.x = x event.y = y event.state = 0 event.put() for t in events: if through_gps: GPS.send_button_event(button=button, x=int(x), y=int(y), window=view.get_bin_window(), state=state, type=t) else: # event = Gdk.Event.new(t) event = Gdk.EventButton() event.type = t event.window = view.get_bin_window() event.device = pygps.default_event_device() event.button = button event.x = x event.y = y event.state = state event.put() if process_events: pygps.process_all_events()