Changeset 86
- Timestamp:
- 12/13/07 15:23:47
- Files:
-
- action_groups/trunk/ActionBrowser.py (modified) (4 diffs)
- action_groups/trunk/ActionModel.py (modified) (1 diff)
- action_groups/trunk/ActionTree.py (modified) (9 diffs)
- action_groups/trunk/Blinker.py (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
action_groups/trunk/ActionBrowser.py
r84 r86 15 15 16 16 from ActionTree import ActionTree 17 from Blinker import Blinker 17 18 18 19 _ = lambda x: x … … 98 99 99 100 self.connect('switch-down', self._onSwitchDown) 101 self.connect('button_press_event', self._onButtonPressEvent) 102 103 # enable events 104 self.set_events( gtk.gdk.BUTTON_PRESS_MASK ) 100 105 101 106 self.show_all() … … 105 110 if self.acc == self.acc.getApplication(): 106 111 acc = self.acc[0] # first frame 107 self.groups_tree.set _top_acc(acc)112 self.groups_tree.setModel(acc) 108 113 self.groups_tree.next() 109 114 … … 160 165 elif switch in (1, 6): 161 166 self.groups_tree.do_action() 162 163 class Blinker(object): 164 max_blinks = -1 165 blink_on_time = 200 166 blink_off_time = 450 167 def __init__(self, extents): 168 self.extents = extents 169 display = gtk.gdk.display_get_default() 170 self.screen = display.get_default_screen() 171 self.root = self.screen.get_root_window() 172 self.gc = self.root.new_gc() 173 self.gc.set_subwindow(gtk.gdk.INCLUDE_INFERIORS) 174 self.gc.set_function(gtk.gdk.INVERT) 175 self.gc.set_line_attributes(3, gtk.gdk.LINE_DOUBLE_DASH, gtk.gdk.CAP_BUTT, 176 gtk.gdk.JOIN_MITER) 177 178 self.blinks = 0 167 168 def _onButtonPressEvent(self, widget, event): 169 SINGLE, DOUBLE = event.type == gtk.gdk.BUTTON_PRESS \ 170 , event.type == gtk.gdk._2BUTTON_PRESS 171 LEFT, RIGHT, MIDDLE = event.button == 1 \ 172 , event.button == 3 \ 173 , event.button == 2 174 ALT, CONTROL, SHIFT = event.state & gtk.gdk.MOD1_MASK <> 0 \ 175 , event.state & gtk.gdk.CONTROL_MASK <> 0 \ 176 , event.state & gtk.gdk.SHIFT_MASK <> 0 177 x, y = int(event.x), int(event.y) 179 178 180 def start(self): 181 self.stopping = False 182 self.blinks = 0 183 self._drawRectangle() 184 185 def stop(self): 186 self.stopping = True 187 if self.blinks % 2 == 1: 188 self.draw() 189 self._drawRectangle() 190 191 def draw(self): 192 self.root.draw_rectangle(self.gc, False, 193 self.extents.x, 194 self.extents.y, 195 self.extents.width, 196 self.extents.height) 197 198 def _drawRectangle(self): 199 ''' 200 Draw a rectangle on the screen using L{extents} for position and size. 201 ''' 202 if self.stopping: 179 if MIDDLE and SINGLE: 180 self.groups_tree.next() 203 181 return False 204 182 205 # draw a blinking rectangle 206 if self.blinks % 2 == 0: 207 self.inv = gtk.Invisible() 208 self.inv.set_screen(self.screen) 209 self.inv.show() 210 #self.inv.grab_add() 211 self.draw() 212 if self.blinks % 2 == 1: 213 #self.inv.grab_remove() 214 self.inv.destroy() 215 self.blinks += 1 216 if self.max_blinks <> -1 and self.blinks >= self.max_blinks: 217 self.inv.grab_remove() 218 self.inv.destroy() 183 elif RIGHT and SINGLE: 184 self.groups_tree.do_action() 219 185 return False 220 blink_time = (self.blink_on_time if self.blinks % 2 == 1 else self.blink_off_time) 221 gobject.timeout_add(blink_time, self._drawRectangle) 222 return False 186 187 return True action_groups/trunk/ActionModel.py
r82 r86 156 156 return None 157 157 158 def search(self, rows, func, data=None): 159 if not rows: return None 160 for row in rows: 161 if func(row, data): 162 return row 163 result = self.search(row.iterchildren(), func, data) 164 if result: return result 165 return None 166 167 def getAccPath(self, acc): 168 row = self.search(self, lambda row, acc: row[ActionModel.COL_ACC] == acc) 169 if row is not None: 170 return row.path 171 return None action_groups/trunk/ActionTree.py
r85 r86 35 35 36 36 self.app = None 37 self.h = False38 37 #self.set_property('fixed-height-mode', True) # speed display 39 38 … … 70 69 return acc 71 70 72 def set _top_acc(self, acc):71 def setModel(self, acc): 73 72 model = ActionModel(acc) 74 73 model.popLevel(None) # top … … 120 119 class WindowActivateMessage(Message): 121 120 _handler = self._onWindowActivate 121 class ChildChangedMessage(Message): 122 _handler = self._onChildChanged 122 123 123 124 s = formatEvent(event) … … 150 151 WindowActivateMessage(top).send() 151 152 152 elif event.source.getRole() == pyatspi.ROLE_MENU and \ 153 event.type == 'object:state-changed:selected': 154 PrintMessage(s).send() 155 selected = bool(event.detail1) 156 if selected: 157 ShowMenuMessage(event).send() 158 else: 153 # elif event.type in ('object:children-changed:add', 'object:children-changed:remove'): 154 # PrintMessage(s).send() 155 # ChildChangedMessage(source_acc).send() 156 157 elif event.source.getRole() == pyatspi.ROLE_MENU: 158 if event.type == 'object:state-changed:selected': 159 PrintMessage(s).send() 160 selected = bool(event.detail1) 161 if selected: 162 ShowMenuMessage(event).send() 163 else: 164 HideMenuMessage().send() 165 elif event.type == 'object:state-changed:visible' \ 166 and event.detail1 == 0: 167 PrintMessage(s).send() 159 168 HideMenuMessage().send() 160 169 … … 164 173 def _onWindowActivate(self, top): 165 174 print 'Activate' 166 self.set _top_acc(top)175 self.setModel(top) 167 176 self.next() 177 178 def _onChildChanged(self, parent): 179 print 'ChildChange' 180 model, iter, acc = self._getSelection() 181 if iter is None: return 182 acc_path = model.getAccPath(parent) 183 sel_path = model.get_path(iter) 184 print '%s %s' % (acc_path, sel_path) 185 if acc_path and len(acc_path) < len(sel_path): 186 #a child of a acc in the model has changed 187 self.setModel(model.getRootAcc()) 188 print 'zzz' + str(path) 189 self.get_model().popToPath(path) 190 self.goToPath(path) 191 #self.next() 168 192 169 193 def _onShowMenu(self, event=None): … … 178 202 acc.is_group = True 179 203 self.next() 180 #self.focus()181 204 #AccDecorator(event.source).dumpAccTree() 182 205 183 206 def _onHideMenu(self, all=False): 184 207 print 'HideMenu' 185 if self.h:186 self.h = False187 return188 208 model, iter, acc = self._getSelection() 189 209 if None in (acc, iter): … … 206 226 if menu_iter is not None: 207 227 self.get_selection().select_iter(menu_iter) 208 #self.h = True209 #acc2=self.get_acc_from_path(model.get_path(menu_iter))210 #print 'zzz '+str(acc2)211 #acc2.toggleSectable()212 213 228 214 229 def do_action(self): … … 235 250 print '!!!Esc' 236 251 sendKeyCombination('Escape', '') 252 elif acc.hasRoleIn(pyatspi.ROLE_MENU): 253 acc.doAction() 254 #acc.parent.clearSelection() 255 elif acc.hasRoleIn(pyatspi.ROLE_CHECK_MENU_ITEM): 256 acc.toggleSectable() 257 acc.doAction() 237 258 else: 238 if not acc.hasRoleIn(pyatspi.ROLE_MENU): 239 acc.toggleSectable() # causes too many problems 240 if acc.hasRoleIn(pyatspi.ROLE_MENU, pyatspi.ROLE_CHECK_MENU_ITEM): 241 acc.doAction() 242 259 acc.toggleSectable() 260 243 261 # TODO: use template DP for toolkit and application 244 262 elif acc.isActionable(): … … 251 269 acc = model.getRootAcc() 252 270 path = model.get_path(iter) # assume nothing changes before 253 self.set _top_acc(acc)271 self.setModel(acc) 254 272 selection = self.get_selection() 255 273 print 'zzz' + str(path) 256 model.popToPath(path)257 goToPath(path)274 self.get_model().popToPath(path) 275 self.goToPath(path) 258 276 return 259 277
