[pypy-svn] r7260 - pypy/trunk/src/pypy/translator/tool/pygame

bob at codespeak.net bob at codespeak.net
Mon Nov 15 19:23:43 CET 2004


Author: bob
Date: Mon Nov 15 19:23:40 2004
New Revision: 7260

Modified:
   pypy/trunk/src/pypy/translator/tool/pygame/graphdisplay.py
Log:
break up the event processing



Modified: pypy/trunk/src/pypy/translator/tool/pygame/graphdisplay.py
==============================================================================
--- pypy/trunk/src/pypy/translator/tool/pygame/graphdisplay.py	(original)
+++ pypy/trunk/src/pypy/translator/tool/pygame/graphdisplay.py	Mon Nov 15 19:23:40 2004
@@ -5,7 +5,6 @@
 from pygame.locals import *
 from drawgraph import GraphRenderer
 
-
 class Display(object):
     
     def __init__(self, (w,h)=(800,740)):
@@ -27,6 +26,7 @@
         self.font = pygame.font.Font(self.STATUSBARFONT, 16)
         self.viewers_history = []
         self.viewer = None
+        self.method_cache = {}
         self.setlayout(layout)
 
     def setlayout(self, layout):
@@ -176,69 +176,91 @@
                 pygame.display.flip()
         return moving
 
+    def peek(self, typ):
+        for event in self.events:
+            if event.type == typ:
+                return True
+        return False
+
+    def process_event(self, event):
+        method = self.method_cache.get(event.type, KeyError)
+        if method is KeyError:
+            method = getattr(self, 'process_%s' % (pygame.event.event_name(event.type),), None)
+            self.method_cache[method] = method
+        if method is not None:
+            method(event)
+        
+    def process_MouseMotion(self, event):
+        if self.peek(MOUSEMOTION):
+            return
+        if self.dragging:
+            if (abs(event.pos[0] - self.click_origin[0]) +
+                abs(event.pos[1] - self.click_origin[1])) > 12:
+                self.click_time = None
+            dx = event.pos[0] - self.dragging[0]
+            dy = event.pos[1] - self.dragging[1]
+            if event.buttons[0]:   # left mouse button
+                self.viewer.shiftscale(1.003 ** (dx+dy))
+            else:
+                self.viewer.shiftoffset(-2*dx, -2*dy)
+            self.dragging = event.pos
+            self.must_redraw = True
+        else:
+            self.notifymousepos(event.pos)
+
+    def process_MouseButtonDown(self, event):
+        self.dragging = self.click_origin = event.pos
+        self.click_time = time.time()
+        pygame.event.set_grab(True)
+
+    def process_MouseButtonUp(self, event):
+        self.dragging = None
+        pygame.event.set_grab(False)
+        if self.click_time is not None and abs(time.time() - self.click_time) < 1:
+            # click (no significant dragging)
+            self.notifyclick(self.click_origin)
+        self.click_time = None
+        self.notifymousepos(event.pos)
+
+    def process_KeyDown(self, event):
+        if event.key in [K_p, K_LEFT, K_BACKSPACE]:
+            self.layout_back()
+        elif event.key == K_ESCAPE:
+            self.events.insert(0, pygame.event.Event(QUIT))
+
+    def process_VideoResize(self, event):
+        # short-circuit if there are more resize events pending
+        if self.peek(VIDEORESIZE):
+            return
+        self.resize(event.size)
+        self.must_redraw = True
+
+    def process_Quit(self, event):
+        raise StopIteration
+     
     def run(self):
-        dragging = click_origin = click_time = None
-        events = []
-        def peek(typ):
-            for val in events:
-                if val.type == typ:
-                    return True
-            return False
-        while True:
-            if self.must_redraw and not events:
-                self.viewer.render()
-                if self.statusbarinfo:
-                    self.drawstatusbar()
-                pygame.display.flip()
-                self.must_redraw = False
-            
-            if not events:
-                events.append(pygame.event.wait())
-                events.extend(pygame.event.get())
-            event = events.pop(0)
-            if event.type == MOUSEMOTION:
-                # short-circuit if there are more motion events pending
-                if peek(MOUSEMOTION):
-                    continue
-                if dragging:
-                    if (abs(event.pos[0] - click_origin[0]) +
-                        abs(event.pos[1] - click_origin[1])) > 12:
-                        click_time = None
-                    dx = event.pos[0] - dragging[0]
-                    dy = event.pos[1] - dragging[1]
-                    if event.buttons[0]:   # left mouse button
-                        self.viewer.shiftscale(1.003 ** (dx+dy))
-                    else:
-                        self.viewer.shiftoffset(-2*dx, -2*dy)
-                    dragging = event.pos
-                    self.must_redraw = True
-                else:
-                    self.notifymousepos(event.pos)
-            elif event.type == MOUSEBUTTONDOWN:
-                dragging = click_origin = event.pos
-                click_time = time.time()
-                pygame.event.set_grab(True)
-            elif event.type == MOUSEBUTTONUP:
-                dragging = None
-                pygame.event.set_grab(False)
-                if click_time is not None and abs(time.time() - click_time) < 1:
-                    # click (no significant dragging)
-                    self.notifyclick(click_origin)
-                click_time = None
-                self.notifymousepos(event.pos)
-            elif event.type == KEYDOWN:
-                if event.key in [K_p, K_LEFT, K_BACKSPACE]:
-                    self.layout_back()
-                elif event.key == K_ESCAPE:
-                    events.insert(0, pygame.event.Event(QUIT))
-            elif event.type == VIDEORESIZE:
-                # short-circuit if there are more resize events pending
-                if peek(VIDEORESIZE):
-                    continue
-                self.resize(event.size)
-                self.must_redraw = True
-            elif event.type == QUIT:
-                break
+        self.dragging = self.click_origin = self.click_time = None
+        events = self.events = []
+        try:
+
+            while True:
+
+                if self.must_redraw and not events:
+                    self.viewer.render()
+                    if self.statusbarinfo:
+                        self.drawstatusbar()
+                    pygame.display.flip()
+                    self.must_redraw = False
+
+                if not events:
+                    events.append(pygame.event.wait())
+                    events.extend(pygame.event.get())
+
+                self.process_event(events.pop(0))
+
+        except StopIteration:
+            pass
+
         # cannot safely close and re-open the display, depending on
         # Pygame version and platform.
         pygame.display.set_mode((self.width,1))



More information about the Pypy-commit mailing list