# Demo script that implements a simple drawing program import upiwin # Save off some color values. WHITE = upiwin.rgb(255, 255, 255) LTGRAY = upiwin.rgb(204, 204, 204) YELLOW = upiwin.rgb(255, 255, 0) # Get the stock bitmaps. bmp_freehand = upiwin.Bitmap(stock='freehand') bmp_line = upiwin.Bitmap(stock='line') bmp_rect = upiwin.Bitmap(stock='rect') bmp_fillrect = upiwin.Bitmap(stock='fillrect') hdc = upiwin.DevCtxt(type='screen') hdc_bits = upiwin.DevCtxt(type='memory') # divide the screen into "drawing" and "command" areas screen_rect = hdc.get_clip_rect() drawing_rect = (screen_rect[0], screen_rect[1], screen_rect[2] - 60, screen_rect[3]) command_rect = (drawing_rect[2], screen_rect[1], screen_rect[2], screen_rect[3]) # further divide up the "command" area cmd1_rect = (command_rect[0], command_rect[1], command_rect[2], 60) cmd2_rect = (command_rect[0], 60, command_rect[2], 120) cmd3_rect = (command_rect[0], 120, command_rect[2], 180) cmd4_rect = (command_rect[0], 180, command_rect[2], command_rect[3]) def point_in_rect(rect, x, y): return (x >= rect[0]) and (x < rect[2]) and (y >= rect[1]) and (y < rect[3]) # --- Graphic feedback -- origin_x = 0 origin_y = 0 current_x = 0 current_y = 0 def rubberband_rectangle(x, y, down, up): global current_x, current_y hdc.text_color = YELLOW hdc.rop2 = upiwin.R2_XORPEN if not down: hdc.rectangle(min(origin_x, current_x), min(origin_y, current_y), max(origin_x, current_x), max(origin_y, current_y)) current_x = x current_y = y if not up: hdc.rectangle(min(origin_x, current_x), min(origin_y, current_y), max(origin_x, current_x), max(origin_y, current_y)) def rubberband_line(x, y, down, up): global current_x, current_y hdc.text_color = YELLOW hdc.rop2 = upiwin.R2_XORPEN if not down: hdc.move_to(origin_x, origin_y) hdc.line_to(current_x, current_y) current_x = x current_y = y if not up: hdc.move_to(origin_x, origin_y) hdc.line_to(current_x, current_y) # --- Message handlers --- def on_touchdown(x, y): global origin_x, origin_y if point_in_rect(drawing_rect, x, y): origin_x = x origin_y = y rubberband_line(x, y, True, False) def on_touchmove(x, y): if point_in_rect(drawing_rect, x, y): rubberband_line(x, y, False, False) def on_touchup(x, y): if point_in_rect(drawing_rect, x, y): rubberband_line(x, y, False, True) def on_touchclick(x, y): print("Click at {0},{1}".format(x, y)) if point_in_rect(cmd1_rect, x, y): print("Click command 1") elif point_in_rect(cmd2_rect, x, y): print("Click command 2") elif point_in_rect(cmd3_rect, x, y): print("Click command 3") elif point_in_rect(cmd4_rect, x, y): print("Click command 4") def on_button_click(button): if button == 4: # Button 4 = Exit app upiwin.post_quit_message(0) # --- Initialize and start message loop --- # Draw the basic layout. hdc.text_color = LTGRAY hdc.rectangle(cmd1_rect[0], cmd1_rect[1], cmd1_rect[2], cmd1_rect[3]) hdc.rectangle(cmd2_rect[0], cmd2_rect[1], cmd2_rect[2], cmd2_rect[3]) hdc.rectangle(cmd3_rect[0], cmd3_rect[1], cmd3_rect[2], cmd3_rect[3]) hdc.rectangle(cmd4_rect[0], cmd4_rect[1], cmd4_rect[2], cmd4_rect[3]) hdc_bits.select_object(bmp_freehand) hdc.bitblt(cmd1_rect[0] + 6, cmd1_rect[1] + 6, cmd1_rect[0] + 54, cmd1_rect[1] + 54, hdc_bits, 0, 0, 0) # Main message loop msg = {} while upiwin.get_message(msg): if msg['message'] == upiwin.WM_TOUCHDOWN: on_touchdown(msg['attrs'][0], msg['attrs'][1]) if msg['message'] == upiwin.WM_TOUCHMOVE: on_touchmove(msg['attrs'][0], msg['attrs'][1]) if msg['message'] == upiwin.WM_TOUCHUP: on_touchup(msg['attrs'][0], msg['attrs'][1]) if msg['message'] == upiwin.WM_TOUCHCLICK: on_touchclick(msg['attrs'][0], msg['attrs'][1]) elif msg['message'] == upiwin.WM_HWBUTTONCLICK: on_button_click(msg['attrs'][0])