Changeset 86

Show
Ignore:
Timestamp:
12/13/07 15:23:47
Author:
slee
Message:

going round in cirles with menus

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • action_groups/trunk/ActionBrowser.py

    r84 r86  
    1515 
    1616from ActionTree import ActionTree 
     17from Blinker import Blinker 
    1718 
    1819_ = lambda x: x 
     
    9899 
    99100    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 ) 
    100105 
    101106    self.show_all() 
     
    105110      if self.acc == self.acc.getApplication(): 
    106111        acc = self.acc[0] # first frame 
    107       self.groups_tree.set_top_acc(acc) 
     112      self.groups_tree.setModel(acc) 
    108113      self.groups_tree.next() 
    109114 
     
    160165    elif switch in (1, 6): 
    161166      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) 
    179178     
    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() 
    203181      return False 
    204182     
    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() 
    219185      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  
    156156    return None 
    157157   
     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  
    3535 
    3636    self.app = None 
    37     self.h = False 
    3837    #self.set_property('fixed-height-mode', True) # speed display 
    3938 
     
    7069    return acc 
    7170 
    72   def set_top_acc(self, acc): 
     71  def setModel(self, acc): 
    7372    model = ActionModel(acc) 
    7473    model.popLevel(None) # top 
     
    120119    class WindowActivateMessage(Message): 
    121120      _handler = self._onWindowActivate 
     121    class ChildChangedMessage(Message): 
     122      _handler = self._onChildChanged 
    122123     
    123124    s = formatEvent(event) 
     
    150151        WindowActivateMessage(top).send() 
    151152 
    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() 
    159168        HideMenuMessage().send() 
    160169 
     
    164173  def _onWindowActivate(self, top): 
    165174    print 'Activate' 
    166     self.set_top_acc(top) 
     175    self.setModel(top) 
    167176    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() 
    168192 
    169193  def _onShowMenu(self, event=None): 
     
    178202      acc.is_group = True 
    179203      self.next() 
    180       #self.focus() 
    181204      #AccDecorator(event.source).dumpAccTree() 
    182205       
    183206  def _onHideMenu(self, all=False): 
    184207    print 'HideMenu' 
    185     if self.h: 
    186       self.h = False 
    187       return 
    188208    model, iter, acc = self._getSelection() 
    189209    if None in (acc, iter): 
     
    206226    if menu_iter is not None: 
    207227      self.get_selection().select_iter(menu_iter) 
    208       #self.h = True 
    209       #acc2=self.get_acc_from_path(model.get_path(menu_iter)) 
    210       #print 'zzz '+str(acc2) 
    211       #acc2.toggleSectable() 
    212        
    213228 
    214229  def do_action(self): 
     
    235250          print '!!!Esc' 
    236251          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() 
    237258      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                      
    243261    # TODO: use template DP for toolkit and application 
    244262    elif acc.isActionable(): 
     
    251269        acc = model.getRootAcc() 
    252270        path = model.get_path(iter) # assume nothing changes before 
    253         self.set_top_acc(acc) 
     271        self.setModel(acc) 
    254272        selection = self.get_selection() 
    255273        print 'zzz' + str(path) 
    256         model.popToPath(path) 
    257         goToPath(path) 
     274        self.get_model().popToPath(path) 
     275        self.goToPath(path) 
    258276        return 
    259277