source: rc/puzzlebox_brainstorms_client_interface.py @ 30

Last change on this file since 30 was 30, checked in by sc, 12 years ago

client_interface_button:

  • whitespace cleanup

client_interface:

  • comments added
  • Property svn:executable set to *
File size: 11.4 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#
4# Puzzlebox - Brainstorms - Client Interface
5#
6# Copyright Puzzlebox Productions, LLC (2010)
7#
8# Portions of this code have been previously
9# released under the GNU Pulic License (GPL) version 2
10# and is Copyright Steven M. Castellotti (2010)
11# For more information please refer to http://www.gnu.org/copyleft/gpl.htm
12#
13# Last Update: 2010.02.04
14#
15#####################################################################
16
17import os, sys
18
19import pygame
20#import pygame.font
21import pygame.image
22import pygame.locals
23
24from twisted.internet import reactor, protocol, defer
25
26import puzzlebox_brainstorms_configuration as configuration
27import puzzlebox_brainstorms_client as client
28import puzzlebox_brainstorms_client_interface_component as component
29import puzzlebox_brainstorms_client_interface_button as interface_button
30#import puzzlebox_logger
31
32#####################################################################
33# Globals
34#####################################################################
35
36DEBUG = 1
37
38FLIP = 1
39
40SERVER_HOST = configuration.SERVER_HOST
41SERVER_PORT = configuration.SERVER_PORT
42
43DISPLAY_WINDOW_X_COORDINATE = configuration.DISPLAY_WINDOW_X_COORDINATE
44DISPLAY_WINDOW_Y_COORDINATE = configuration.DISPLAY_WINDOW_Y_COORDINATE
45DISPLAY_WINDOW_X_DIMENSION = configuration.DISPLAY_WINDOW_X_DIMENSION
46DISPLAY_WINDOW_Y_DIMENSION = configuration.DISPLAY_WINDOW_Y_DIMENSION
47
48WINDOW_BACKGROUND_COLOR = configuration.WINDOW_BACKGROUND_COLOR
49
50IMAGE_DIRECTORY = configuration.IMAGE_DIRECTORY
51
52BUTTON_LAYOUT = configuration.BUTTON_LAYOUT
53
54#####################################################################
55# Classes
56#####################################################################
57
58class puzzlebox_brainstorms_client_interface( \
59         component.puzzlebox_brainstorms_client_interface_component, \
60         client.puzzlebox_brainstorms_client):
61       
62        def __init__(self, log, \
63                     display_window_x_coordinate, \
64                     display_window_y_coordinate, \
65                     display_window_x_dimension, \
66                     display_window_y_dimension, \
67                     window_background_color, \
68                     DEBUG=DEBUG):
69       
70                self.log = log
71                self.DEBUG = DEBUG
72               
73                self.display_window_x_coordinate = display_window_x_coordinate
74                self.display_window_y_coordinate = display_window_y_coordinate
75                self.display_window_x_dimension = display_window_x_dimension
76                self.display_window_y_dimension = display_window_y_dimension
77                self.window_background_color = window_background_color
78               
79                self.server_host = configuration.SERVER_HOST
80                self.server_port = configuration.SERVER_PORT
81                self.max_connection_attempts = configuration.MAX_CONNECTION_ATTEMPTS
82               
83                if (os.name == "nt") or (os.name == "dos"):
84                        self.operating_system = "windows"
85                else:
86                        self.operating_system = os.name
87               
88                self.pygame = pygame
89                self.screen = None
90                self.FLIP = FLIP
91                self.image_directory = IMAGE_DIRECTORY
92               
93                self.initialize_pygame()
94               
95                self.pygame.FLIP = self.FLIP
96               
97                self.buttons = {}
98                self.match_key_index = {}
99               
100                self.initialize_buttons(BUTTON_LAYOUT)
101               
102                self.update_display()
103       
104       
105        #####################################################################
106       
107        def initialize_pygame(self):
108               
109                if (self.operating_system != "windows"):
110                        os.environ['SDL_VIDEO_WINDOW_POS'] = \
111                           "%i,%i" % (self.display_window_x_coordinate, \
112                                      self.display_window_y_coordinate)
113               
114                self.pygame.init()
115               
116                if (self.FLIP):
117                       
118                        self.screen = self.pygame.display.set_mode((self.display_window_x_dimension, \
119                                                                    self.display_window_y_dimension), \
120                                                                   pygame.HWSURFACE|pygame.DOUBLEBUF)
121               
122                else:
123                       
124                        self.screen = self.pygame.display.set_mode((self.display_window_x_dimension, \
125                                                                    self.display_window_y_dimension), \
126                                                                   pygame.HWSURFACE)
127               
128               
129                if (self.DEBUG >= 2):
130                        print "Display Driver:",
131                        print pygame.display.get_driver()
132                        print "Display Info:",
133                        print pygame.display.Info()
134                        #print "Get Flags:",
135                        #print pygame.display.screen.get_flags()
136               
137               
138                #self.pygame.mouse.set_visible(0)
139                self.pygame.mouse.set_visible(1)
140               
141               
142                self.pygame.display.set_caption('Puzzlebox Brainstorms - Client Interface')
143               
144                # Set Background
145                self.background = pygame.Surface(self.screen.get_size())
146                #self.background.set_alpha(0)
147                self.draw_background()
148       
149       
150        ##################################################################
151
152        def draw_background(self):
153               
154                self.background.fill(self.window_background_color)
155               
156                self.screen.blit(self.background, (0,0))
157       
158       
159        #####################################################################
160       
161        def initialize_buttons(self, button_layout):
162               
163                self.buttons = {}
164                self.match_key_index = {}
165               
166                for each in button_layout.keys():
167                       
168                        button = button_layout[each]
169                       
170                        if ((button['button_image'] != None) and \
171                            (button['button_image'] != '.') and \
172                            (button['button_image'] != '..') and \
173                            (os.path.exists(os.path.join(self.image_directory, button['button_image'])))):
174                               
175                                button_image_path = \
176                                   os.path.join(self.image_directory, button['button_image'])
177                       
178                        else:
179                                if self.DEBUG:
180                                        print "Error: Button image does not exist:"
181                                        print "   %s" % os.path.join(self.image_directory, button['button_image'])
182                                continue
183                       
184                       
185                        if ((button['activated_image'] != None) and \
186                            (button['activated_image'] != '.') and \
187                            (button['activated_image'] != '..') and \
188                            (os.path.exists(os.path.join(self.image_directory, button['activated_image'])))):
189                               
190                                activated_image_path = \
191                                   os.path.join(self.image_directory, button['activated_image'])
192                       
193                        else:
194                                if self.DEBUG:
195                                        print "Error: Activated button image does not exist:"
196                                        print "   %s" % os.path.join(self.image_directory, button['activated_image'])
197                                continue
198                       
199                       
200                        for match in button['match_keys']:
201                                self.match_key_index[match] = button['command']
202                       
203                       
204                        new_button = \
205                           interface_button.puzzlebox_brainstorms_client_interface_button( \
206                                   self.pygame, \
207                                   self.screen, \
208                                   button_image_path, \
209                                   activated_image_path, \
210                                   button['image_x'], \
211                                   button['image_y'], \
212                                   button['command'], \
213                                   button['match_keys'], \
214                                   self.DEBUG)
215                       
216                       
217                        self.buttons[ button['command'] ] = new_button
218       
219       
220        ##################################################################
221       
222        def update_button(self, command, activated):
223               
224                self.buttons[command].activated=activated
225                self.buttons[command].display()
226                self.update_display()
227       
228       
229        ##################################################################
230       
231        def process_mouse_click(self, position, mouse_button):
232               
233                if (mouse_button == 1):
234                        # first mouse button clicked
235                       
236                        postion_rect = self.pygame.Rect(position, (1,1) )
237                       
238                        for each in self.buttons.keys():
239                               
240                                if self.buttons[each].check_collision(postion_rect):
241                                       
242                                        command = self.buttons[each].command
243                                        self.update_button(command, activated=True)
244                                        self.send_command(command)
245       
246       
247        ##################################################################
248       
249        def process_mouse_release(self, position, mouse_button):
250               
251                if (mouse_button == 1):
252                        # first mouse button released
253                       
254                        postion_rect = self.pygame.Rect(position, (1,1) )
255                       
256                        for each in self.buttons.keys():
257                               
258                                if self.buttons[each].check_collision(postion_rect):
259                                       
260                                        command = self.buttons[each].command
261                                        self.update_button(command, activated=False)
262       
263       
264        ##################################################################
265       
266        def release_all_buttons(self):
267               
268                for each in self.buttons.keys():
269                               
270                                command = self.buttons[each].command
271                                self.update_button(command, activated=False)
272       
273       
274        ##################################################################
275       
276        def check_events(self):
277               
278                for event in self.pygame.event.get():
279                       
280                        if (event.type is self.pygame.locals.QUIT):
281                                reactor.stop()
282                       
283                       
284                        elif (event.type == self.pygame.locals.KEYDOWN):
285                               
286                                if 'key' in event.dict.keys():
287                                       
288                                        key_pressed = event.dict['key']
289                                       
290                                        if (key_pressed == self.pygame.K_ESCAPE):
291                                                reactor.stop()
292                                       
293                                       
294                                        elif (key_pressed in self.match_key_index.keys()):
295                                               
296                                                # keypress matches recognized key
297                                                command = self.match_key_index[key_pressed]
298                                                self.update_button(command, activated=True)
299                                                self.send_command(command)
300                       
301                       
302                        elif (event.type == self.pygame.locals.KEYUP):
303                               
304                                if 'key' in event.dict.keys():
305                                       
306                                        key_pressed = event.dict['key']
307                                       
308                                        if (key_pressed in self.match_key_index.keys()):
309                                               
310                                                # keypress matches recognized key
311                                                command = self.match_key_index[key_pressed]
312                                                self.update_button(command, activated=False)
313                       
314                       
315                        elif (event.type == self.pygame.locals.MOUSEBUTTONDOWN):
316                               
317                                position = event.pos
318                                mouse_button = event.button
319                               
320                                self.process_mouse_click(position, mouse_button)
321                       
322                       
323                        elif (event.type == self.pygame.locals.MOUSEBUTTONUP):
324                               
325                                # We release all activated buttons when a mouse button is
326                                # released because its possible the user may have pressed
327                                # the mouse button down while hovering over one button on
328                                # the screen, then dragged the pointer while still holding
329                                # down the mouse button, finally releasing it over another
330                                # button on the screen.
331                               
332                                mouse_button = event.button
333                               
334                                if (mouse_button == 1):
335                                        # First mouse button released
336                                        self.release_all_buttons()
337                       
338                       
339                        else:
340                               
341                                if self.DEBUG > 2:
342                                        print "Unrecognized event:",
343                                        print event
344               
345               
346                # Sleep timer provides approximately 33.3 fps
347                reactor.callLater(0.03, self.check_events)
348
349
350#####################################################################
351# Functions
352#####################################################################
353
354#####################################################################
355# Main
356#####################################################################
357
358if __name__ == '__main__':
359       
360        #log = puzzlebox_logger.puzzlebox_logger(logfile='mcc')
361        log = None
362       
363       
364        # Collect default settings and command line parameters
365        server_host = SERVER_HOST
366        server_port = SERVER_PORT
367        display_window_x_coordinate = DISPLAY_WINDOW_X_COORDINATE
368        display_window_y_coordinate = DISPLAY_WINDOW_Y_COORDINATE
369        display_window_x_dimension = DISPLAY_WINDOW_X_DIMENSION
370        display_window_y_dimension = DISPLAY_WINDOW_Y_DIMENSION
371        window_background_color = WINDOW_BACKGROUND_COLOR
372       
373       
374        for each in sys.argv:
375               
376                if each.startswith("--host="):
377                        server_host = each[ len("--host="): ]
378                if each.startswith("--port="):
379                        server_port = each[ len("--port="): ]
380       
381       
382        # Window Defaults
383        try:
384                display_window_x_coordinate = string.atoi(sys.argv[-4])
385                display_window_y_coordinate = string.atoi(sys.argv[-3])
386                display_window_x_dimension = string.atoi(sys.argv[-2])
387                display_window_y_dimension = string.atoi(sys.argv[-1])
388        except:
389                if DEBUG:
390                        print "Using default display coordinates"
391       
392       
393        interface = puzzlebox_brainstorms_client_interface( \
394                                             log, \
395                                             display_window_x_coordinate, \
396                                             display_window_y_coordinate, \
397                                             display_window_x_dimension, \
398                                             display_window_y_dimension, \
399                                             window_background_color, \
400                                             DEBUG=DEBUG)
401       
402        reactor.callWhenRunning(interface.check_events)
403        reactor.run()
404
Note: See TracBrowser for help on using the repository browser.