[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [1729] contrib/py/scripts/addons/ space_view3d_screencast_keys.py: Version 1.2

Bart Crouch bartius.crouch at gmail.com
Tue Mar 22 11:00:17 CET 2011


Revision: 1729
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=1729
Author:   crouch
Date:     2011-03-22 10:00:17 +0000 (Tue, 22 Mar 2011)
Log Message:
-----------
Version 1.2
Added graphical representation of the mouse.

Modified Paths:
--------------
    contrib/py/scripts/addons/space_view3d_screencast_keys.py

Modified: contrib/py/scripts/addons/space_view3d_screencast_keys.py
===================================================================
--- contrib/py/scripts/addons/space_view3d_screencast_keys.py	2011-03-22 01:42:06 UTC (rev 1728)
+++ contrib/py/scripts/addons/space_view3d_screencast_keys.py	2011-03-22 10:00:17 UTC (rev 1729)
@@ -22,9 +22,9 @@
 bl_info = {
     'name': 'Display Keys Status for Screencasting',
     'author': 'Paulo Gomes, Bart Crouch, John E. Herrenyo',
-    'version': (1, 1),
-    'blender': (2, 5, 6),
-    'api': 35457,
+    'version': (1, 2),
+    'blender': (2, 5, 7),
+    'api': 35658,
     'location': 'View3D > Properties panel > Display tab',
     'warning': '',
     'description': 'Display keys pressed in the 3d-view, '\
@@ -44,32 +44,241 @@
 
 def draw_callback_px(self, context):
     wm = context.window_manager
-    if wm.display_keys:
-        # draw text in the 3d-view
-        blf.size(0, wm.display_font_size, 72)
-        r, g, b = wm.display_color
+    if not wm.display_keys:
+        return
+    
+    # draw text in the 3d-view
+    blf.size(0, wm.display_font_size, 72)
+    r, g, b = wm.display_color
+    final = 0
+    for i in range(len(self.key)):
+        label_time = time.time() - self.time[i]
+        if label_time < 2: # only display key-presses of last 2 seconds
+            blf.position(0, wm.display_pos_x,
+                wm.display_pos_y + wm.display_font_size*i, 0)
+            alpha = min(1.0, max(0.0, 2 * (2 - label_time)))
+            bgl.glColor4f(r, g, b, alpha)
+            blf.draw(0, self.key[i])
+            final = i
+        else:
+            break
+
+    # get rid of status texts that aren't displayed anymore
+    self.key = self.key[:final+1]
+    self.time = self.time[:final+1]
+    
+    # draw graphical representation of the mouse
+    if wm.display_mouse == 'graphic':
+        for shape in ["mouse", "left_button", "middle_button", "right_button"]:
+            draw_mouse(context, shape, "outline", 0.5)
         final = 0
-        
-        # only display key-presses of last 2 seconds
-        for i in range(len(self.key)):
-            label_time = time.time() - self.time[i]
-            if label_time < 2:
-                blf.position(0, wm.display_pos_x,
-                    wm.display_pos_y + wm.display_font_size*i, 0)
-                alpha = min(1.0, max(0.0, 2 * (2 - label_time)))
-                bgl.glColor4f(r, g, b, alpha)
-                blf.draw(0, self.key[i])
+        for i in range(len(self.mouse)):
+            click_time = time.time() - self.mouse_time[i]
+            if click_time < 2:
+                shape = map_mouse_event(self.mouse[i])
+                if shape:
+                    alpha = min(1.0, max(0.0, 2 * (2 - click_time)))
+                    draw_mouse(context, shape, "filled", alpha)
                 final = i
             else:
                 break
+    
+    # get rid of mouse clicks that aren't displayed anymore
+    self.mouse = self.mouse[:final+1]
+    self.mouse_time = self.mouse_time[:final+1]
 
-        # get rid of statuses that aren't displayed anymore
-        self.key = self.key[:final+1]
-        self.time = self.time[:final+1]
-    else:
-        return
 
+def draw_mouse(context, shape, style, alpha):
+    # shape and position
+    wm = context.window_manager
+    size = wm.display_font_size * 3
+    offset_x = context.region.width - wm.display_pos_x - (size*0.535)
+    offset_y = wm.display_pos_y
+    shape_data = get_shape_data(shape)
+    bgl.glTranslatef(offset_x, offset_y, 0)
+    # colour
+    r, g, b = wm.display_color
+    bgl.glEnable(bgl.GL_BLEND)
+    #bgl.glBlendFunc(bgl.GL_SRC_ALPHA, bgl.GL_ONE_MINUS_SRC_ALPHA)
+    #bgl.glColor4f(r, g, b, alpha)
+    
+    # inner shape for filled style
+    if style == "filled":
+        inner_shape = []
+        for i in shape_data:
+            inner_shape.append(i[0])
+    
+    # outer shape
+    for i in shape_data:
+        shape_segment = i
+        shape_segment[0] = [size * k for k in shape_segment[0]]
+        shape_segment[1] = [size * k for k in shape_segment[1]]
+        shape_segment[2] = [size * k for k in shape_segment[2]]
+        shape_segment[3] = [size * k for k in shape_segment[3]]
+        
+        # create the buffer
+        shape_buffer = bgl.Buffer(bgl.GL_FLOAT, [4, 3], shape_segment)
+        
+        # create the map and draw the triangle fan
+        bgl.glMap1f(bgl.GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, shape_buffer)
+        bgl.glEnable(bgl.GL_MAP1_VERTEX_3)
+        bgl.glColor4f(r, g, b, alpha)
+        
+        if style == "outline":
+            bgl.glBegin(bgl.GL_LINE_STRIP)
+        else: # style == "filled"
+            bgl.glBegin(bgl.GL_TRIANGLE_FAN)
+        for j in range(10):
+            bgl.glEvalCoord1f(j / 10.0)
+        x, y, z = shape_segment[3]
+        
+        # make sure the last vertex is indeed the last one, to avoid gaps
+        bgl.glVertex3f(x, y, z)
+        bgl.glEnd()
+        bgl.glDisable(bgl.GL_MAP1_VERTEX_3)
+    
+    # draw interior
+    if style == "filled":
+        bgl.glColor4f(r, g, b, alpha)
+        bgl.glBegin(bgl.GL_TRIANGLE_FAN)
+        for i in inner_shape:
+            j = [size * k for k in i]
+            x, y, z = j
+            bgl.glVertex3f(x, y, z)
+        bgl.glEnd()
+    
+    bgl.glTranslatef(-offset_x, -offset_y, 0)
 
+
+# hardcoded data to draw the graphical represenation of the mouse
+def get_shape_data(shape):
+    data = []
+    if shape == "mouse":
+        data = [[[0.264, 0.002, 0.0], 
+            [0.096, 0.002, 0.0], 
+            [0.059, 0.226, 0.0], 
+            [0.04, 0.313, 0.0]], 
+            [[0.04, 0.313, 0.0], 
+            [-0.015, 0.565, 0.0], 
+            [-0.005, 0.664, 0.0], 
+            [0.032, 0.87, 0.0]], 
+            [[0.032, 0.87, 0.0], 
+            [0.05, 0.973, 0.0], 
+            [0.16, 1.002, 0.0], 
+            [0.264, 1.002, 0.0]], 
+            [[0.264, 1.002, 0.0], 
+            [0.369, 1.002, 0.0], 
+            [0.478, 0.973, 0.0], 
+            [0.497, 0.87, 0.0]], 
+            [[0.497, 0.87, 0.0], 
+            [0.533, 0.664, 0.0], 
+            [0.544, 0.565, 0.0], 
+            [0.489, 0.313, 0.0]], 
+            [[0.489, 0.313, 0.0], 
+            [0.47, 0.226, 0.0], 
+            [0.432, 0.002, 0.0], 
+            [0.264, 0.002, 0.0]]]
+    elif shape == "left_button":
+        data = [[[0.154, 0.763, 0.0], 
+            [0.126, 0.755, 0.0], 
+            [0.12, 0.754, 0.0], 
+            [0.066, 0.751, 0.0]], 
+            [[0.066, 0.751, 0.0], 
+            [0.043, 0.75, 0.0], 
+            [0.039, 0.757, 0.0], 
+            [0.039, 0.767, 0.0]], 
+            [[0.039, 0.767, 0.0], 
+            [0.047, 0.908, 0.0], 
+            [0.078, 0.943, 0.0], 
+            [0.155, 0.97, 0.0]], 
+            [[0.155, 0.97, 0.0], 
+            [0.174, 0.977, 0.0], 
+            [0.187, 0.975, 0.0], 
+            [0.191, 0.972, 0.0]], 
+            [[0.191, 0.972, 0.0], 
+            [0.203, 0.958, 0.0], 
+            [0.205, 0.949, 0.0], 
+            [0.199, 0.852, 0.0]], 
+            [[0.199, 0.852, 0.0], 
+            [0.195, 0.77, 0.0], 
+            [0.18, 0.771, 0.0], 
+            [0.154, 0.763, 0.0]]]
+    elif shape == "middle_button":
+        data = [[[0.301, 0.8, 0.0], 
+            [0.298, 0.768, 0.0], 
+            [0.231, 0.768, 0.0], 
+            [0.228, 0.8, 0.0]], 
+            [[0.228, 0.8, 0.0], 
+            [0.226, 0.817, 0.0], 
+            [0.225, 0.833, 0.0], 
+            [0.224, 0.85, 0.0]], 
+            [[0.224, 0.85, 0.0], 
+            [0.222, 0.873, 0.0], 
+            [0.222, 0.877, 0.0], 
+            [0.224, 0.9, 0.0]], 
+            [[0.224, 0.9, 0.0], 
+            [0.225, 0.917, 0.0], 
+            [0.226, 0.933, 0.0], 
+            [0.228, 0.95, 0.0]], 
+            [[0.228, 0.95, 0.0], 
+            [0.231, 0.982, 0.0], 
+            [0.298, 0.982, 0.0], 
+            [0.301, 0.95, 0.0]], 
+            [[0.301, 0.95, 0.0], 
+            [0.302, 0.933, 0.0], 
+            [0.303, 0.917, 0.0], 
+            [0.305, 0.9, 0.0]], 
+            [[0.305, 0.9, 0.0], 
+            [0.307, 0.877, 0.0], 
+            [0.307, 0.873, 0.0], 
+            [0.305, 0.85, 0.0]], 
+            [[0.305, 0.85, 0.0], 
+            [0.303, 0.833, 0.0], 
+            [0.302, 0.817, 0.0], 
+            [0.301, 0.8, 0.0]]]
+    elif shape == "right_button":
+        data = [[[0.375, 0.763, 0.0], 
+            [0.402, 0.755, 0.0], 
+            [0.408, 0.754, 0.0], 
+            [0.462, 0.751, 0.0]], 
+            [[0.462, 0.751, 0.0], 
+            [0.486, 0.75, 0.0], 
+            [0.49, 0.757, 0.0], 
+            [0.489, 0.767, 0.0]], 
+            [[0.489, 0.767, 0.0], 
+            [0.481, 0.908, 0.0], 
+            [0.451, 0.943, 0.0], 
+            [0.374, 0.97, 0.0]], 
+            [[0.374, 0.97, 0.0], 
+            [0.354, 0.977, 0.0], 
+            [0.341, 0.975, 0.0], 
+            [0.338, 0.972, 0.0]], 
+            [[0.338, 0.972, 0.0], 
+            [0.325, 0.958, 0.0], 
+            [0.324, 0.949, 0.0], 
+            [0.329, 0.852, 0.0]], 
+            [[0.329, 0.852, 0.0], 
+            [0.334, 0.77, 0.0], 
+            [0.348, 0.771, 0.0], 
+            [0.375, 0.763, 0.0]]]
+    
+    return(data)
+
+
+# return the shape that belongs to the given event
+def map_mouse_event(event):
+    shape = False
+    
+    if event == 'LEFTMOUSE':
+        shape = "left_button"
+    elif event == 'MIDDLEMOUSE':
+        shape = "middle_button"
+    elif event == 'RIGHTMOUSE':
+        shape = "right_button"
+    
+    return(shape)
+
+
 class ScreencastKeysStatus(bpy.types.Operator):
     bl_idname = "view3d.screencast_keys"
     bl_label = "Screencast Key Status Tool"
@@ -78,12 +287,13 @@
     def modal(self, context, event):
         if context.area:
             context.area.tag_redraw()
+        wm = context.window_manager
         # keys that shouldn't show up in the 3d-view
         mouse_keys = ['MOUSEMOVE','MIDDLEMOUSE','LEFTMOUSE',
          'RIGHTMOUSE', 'WHEELDOWNMOUSE','WHEELUPMOUSE']
         ignore_keys = ['LEFT_SHIFT', 'RIGHT_SHIFT', 'LEFT_ALT',
          'RIGHT_ALT', 'LEFT_CTRL', 'RIGHT_CTRL', 'TIMER']
-        if not context.window_manager.display_mouse:
+        if wm.display_mouse != 'text':
             ignore_keys.extend(mouse_keys)
 
         if event.value == 'PRESS':
@@ -115,6 +325,10 @@
                 sc_keys.append(event.type)

@@ Diff output truncated at 10240 characters. @@


More information about the Bf-extensions-cvs mailing list