annotate gamelib/cursor.py @ 135:b43599b7f8a2

Cursor highlights
author Stefano Rivera <stefano@rivera.za.net>
date Tue, 24 Aug 2010 20:33:20 +0200
parents 4223d66d88b4
children a5972444ad1e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
66
05346a412b55 A sprite cursor attempt
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
1 # cursor.py
05346a412b55 A sprite cursor attempt
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
2 # Copyright Boomslang team, 2010 (see COPYING File)
05346a412b55 A sprite cursor attempt
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
3 # Sprite Cursor
05346a412b55 A sprite cursor attempt
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
4
135
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
5 from albow.resource import get_image
70
213e47dea4d0 Funkier cursor handling
Neil Muller <neil@dip.sun.ac.za>
parents: 66
diff changeset
6 from albow.widget import Widget
66
05346a412b55 A sprite cursor attempt
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
7 from pygame.sprite import Sprite, RenderUpdates
135
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
8 import pygame
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
9 import pygame.color
70
213e47dea4d0 Funkier cursor handling
Neil Muller <neil@dip.sun.ac.za>
parents: 66
diff changeset
10 import pygame.cursors
213e47dea4d0 Funkier cursor handling
Neil Muller <neil@dip.sun.ac.za>
parents: 66
diff changeset
11 import pygame.mouse
213e47dea4d0 Funkier cursor handling
Neil Muller <neil@dip.sun.ac.za>
parents: 66
diff changeset
12
66
05346a412b55 A sprite cursor attempt
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
13 class CursorSprite(Sprite):
05346a412b55 A sprite cursor attempt
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
14 "A Sprite that follows the Cursor"
05346a412b55 A sprite cursor attempt
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
15
129
4223d66d88b4 Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents: 124
diff changeset
16 def __init__(self, filename, x, y):
66
05346a412b55 A sprite cursor attempt
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
17 Sprite.__init__(self)
135
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
18 self.filename = filename
129
4223d66d88b4 Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents: 124
diff changeset
19 self.pointer_x = x
4223d66d88b4 Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents: 124
diff changeset
20 self.pointer_y = y
66
05346a412b55 A sprite cursor attempt
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
21
135
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
22 def load(self):
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
23 if not hasattr(self, 'plain_image'):
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
24 self.plain_image = get_image('items', self.filename)
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
25 self.image = self.plain_image
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
26 self.rect = self.image.get_rect()
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
27 self.highlight = pygame.Surface(self.rect.size)
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
28 color = pygame.color.Color(255, 100, 100, 0)
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
29 self.highlight.fill(color)
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
30
66
05346a412b55 A sprite cursor attempt
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
31 def update(self):
135
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
32 pos = pygame.mouse.get_pos()
129
4223d66d88b4 Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents: 124
diff changeset
33 self.rect.left = pos[0] - self.pointer_x
4223d66d88b4 Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents: 124
diff changeset
34 self.rect.top = pos[1] - self.pointer_y
66
05346a412b55 A sprite cursor attempt
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
35
135
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
36 def set_highlight(self, enable):
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
37 self.image = self.plain_image.copy()
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
38 if enable:
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
39 self.image.blit(self.highlight, self.highlight.get_rect(), None, pygame.BLEND_MULT)
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
40
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
41
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
42 HAND = CursorSprite('hand.png', 12, 0)
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
43
124
97322b78d1c1 Minor style cleanups
Neil Muller <neil@dip.sun.ac.za>
parents: 115
diff changeset
44
70
213e47dea4d0 Funkier cursor handling
Neil Muller <neil@dip.sun.ac.za>
parents: 66
diff changeset
45 class CursorWidget(Widget):
213e47dea4d0 Funkier cursor handling
Neil Muller <neil@dip.sun.ac.za>
parents: 66
diff changeset
46 """Mix-in widget to ensure that mouse_move is propogated to parents"""
213e47dea4d0 Funkier cursor handling
Neil Muller <neil@dip.sun.ac.za>
parents: 66
diff changeset
47
129
4223d66d88b4 Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents: 124
diff changeset
48 cursor = HAND
4223d66d88b4 Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents: 124
diff changeset
49
84
c76f2fad2af5 Draw CursorWidget on top of StateWidget
Stefano Rivera <stefano@rivera.za.net>
parents: 70
diff changeset
50 def __init__(self, *args, **kwargs):
c76f2fad2af5 Draw CursorWidget on top of StateWidget
Stefano Rivera <stefano@rivera.za.net>
parents: 70
diff changeset
51 Widget.__init__(self, *args, **kwargs)
c76f2fad2af5 Draw CursorWidget on top of StateWidget
Stefano Rivera <stefano@rivera.za.net>
parents: 70
diff changeset
52 self._cursor_group = RenderUpdates()
129
4223d66d88b4 Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents: 124
diff changeset
53 self._loaded_cursor = None
66
05346a412b55 A sprite cursor attempt
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
54
114
13d8cb1d5962 Better cursor handling using draw_all() and mouse_delta().
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
55 def draw_all(self, _surface):
13d8cb1d5962 Better cursor handling using draw_all() and mouse_delta().
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
56 Widget.draw_all(self, _surface)
106
da547e148532 Some (slightly) better cursor handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 84
diff changeset
57 surface = self.get_root().surface
129
4223d66d88b4 Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents: 124
diff changeset
58 if self.cursor != self._loaded_cursor:
135
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
59 self._loaded_cursor = self.cursor
129
4223d66d88b4 Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents: 124
diff changeset
60 if self.cursor is None:
115
5e704ee7b84b Remove "in-widget" check and always draw cursor.
Jeremy Thurgood <firxen@gmail.com>
parents: 114
diff changeset
61 pygame.mouse.set_visible(1)
5e704ee7b84b Remove "in-widget" check and always draw cursor.
Jeremy Thurgood <firxen@gmail.com>
parents: 114
diff changeset
62 self._cursor_group.empty()
5e704ee7b84b Remove "in-widget" check and always draw cursor.
Jeremy Thurgood <firxen@gmail.com>
parents: 114
diff changeset
63 else:
5e704ee7b84b Remove "in-widget" check and always draw cursor.
Jeremy Thurgood <firxen@gmail.com>
parents: 114
diff changeset
64 pygame.mouse.set_visible(0)
135
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
65 self.cursor.load()
115
5e704ee7b84b Remove "in-widget" check and always draw cursor.
Jeremy Thurgood <firxen@gmail.com>
parents: 114
diff changeset
66 self._cursor_group.empty()
135
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
67 self._cursor_group.add(self.cursor)
129
4223d66d88b4 Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents: 124
diff changeset
68 if self.cursor is not None:
115
5e704ee7b84b Remove "in-widget" check and always draw cursor.
Jeremy Thurgood <firxen@gmail.com>
parents: 114
diff changeset
69 self._cursor_group.update()
5e704ee7b84b Remove "in-widget" check and always draw cursor.
Jeremy Thurgood <firxen@gmail.com>
parents: 114
diff changeset
70 self._cursor_group.draw(surface)
66
05346a412b55 A sprite cursor attempt
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
71
114
13d8cb1d5962 Better cursor handling using draw_all() and mouse_delta().
Jeremy Thurgood <firxen@gmail.com>
parents: 108
diff changeset
72 def mouse_delta(self, event):
66
05346a412b55 A sprite cursor attempt
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
73 self.invalidate()
70
213e47dea4d0 Funkier cursor handling
Neil Muller <neil@dip.sun.ac.za>
parents: 66
diff changeset
74
129
4223d66d88b4 Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents: 124
diff changeset
75 def set_cursor(self, cursor):
4223d66d88b4 Cursor change when you select a Tool
Stefano Rivera <stefano@rivera.za.net>
parents: 124
diff changeset
76 CursorWidget.cursor = cursor
135
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
77
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
78 def cursor_highlight(self, enable):
b43599b7f8a2 Cursor highlights
Stefano Rivera <stefano@rivera.za.net>
parents: 129
diff changeset
79 self.cursor.set_highlight(enable)