116 lines
3.3 KiB
Python
Executable File
116 lines
3.3 KiB
Python
Executable File
# 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)
|
|
|
|
hdc = upiwin.DevCtxt(type='screen')
|
|
|
|
# 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])
|
|
|
|
# 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])
|