mirror of
https://github.com/wxWidgets/Phoenix.git
synced 2025-07-21 04:31:09 +02:00
337 lines
13 KiB
Python
337 lines
13 KiB
Python
#!/usr/bin/env python
|
|
|
|
#-Imports----------------------------------------------------------------------
|
|
|
|
#--Python Imports.
|
|
import os
|
|
import sys
|
|
|
|
#--wxPython Imports.
|
|
import wx
|
|
from wx.lib.embeddedimage import PyEmbeddedImage
|
|
|
|
#-Globals----------------------------------------------------------------------
|
|
|
|
paperairplane_arrow_blue24 = PyEmbeddedImage(
|
|
"iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAACpUlEQVR42q3VC0hTYRgG4M6m"
|
|
"m8uRmGaVV8SQSrDMbJ6azpZ40qXLXM05y2GikFdKS4PUrEINUygVQ0FalmU3soiIhEohbEGS"
|
|
"RlQkRChUUAVBCL19/zBBNNDT+eBh8AO87LtsC6h+ExNRE45IWwo3d9DHBNETleQhfqEahMVa"
|
|
"WMhPEkaUkgYErtHCWNSOkAgBnEz+mZ4CiKtkAaFRBmxNPwJDbj2Cw7eA42Tv6NmHuEgSEKY1"
|
|
"wZjXgJiUYtiqLmNZcDjouZ94SxISrtsNS2kHNPG5EDKqkXe8G55LA1nIJeJJ5ER8rYszI6vC"
|
|
"Dk1CgVNqXhMKTnVjoYc3C6kjHkQmOiBSn46cym5oth2ckl1uR9FJO5QqNbuRbKIWHbIxPgP5"
|
|
"J65DY6iYpvT0Lew/2gq5q/L/boQXrDhQ34vo5GPT8Ck1qOvoQ1ZhDWRyF/E3EpOYiYqm+4je"
|
|
"UTuDztwA+53nSDJls/UVdyO67XtQ3dKH6J2NsxJsbbj75BUieT0b+vxvJN64F7XtA+BNrf+U"
|
|
"X30bjx2v4eamYiH3iNec11dItaHRPgje3DErU3EPHMMfoNE6v8E3kkaC5jwPQ5oNzVdegLdc"
|
|
"nGGztQuOkTHssu7DAo5jgzaS9fNqU1KqFed7hsBbr86QU/UQff0OtkXsHkpIFFlOFHNeWSEx"
|
|
"BeNfvuPZ8Bh6H42irWcElrIH2JR5Ew2dQzhUWft3uLFTrZlnwcvbBzp9AvJLDqOz6xrejI6j"
|
|
"7MwgLvS+hZBsZgEtJIJ4ijm2QnKDvCSfqNe/fANCMPDUgfcffyAoZBULsJKVzmsWUWriT1aT"
|
|
"tWQDKXdVKCfOnmuGr58/67+WrBD7yyojCuJOFk22YQmJI1/JBOHZm5T/1zKimhzq4GT/FxNJ"
|
|
"iyMK4kP8nK0UUX8Azg5aSnmghYAAAAAASUVORK5CYII=")
|
|
|
|
paperairplane_arrow_white24 = PyEmbeddedImage(
|
|
"iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAB2ElEQVR4Aa3VsatSYRiA8Twd"
|
|
"y5Pa5SoXi0RpErQuQehQIEREi+ka5KSLew4uDaKLgy26C7bkpIHgaOlgSINIEjgo0f0HqiFo"
|
|
"eXve4UxO174PfogqPpzj971eYf3EQ/jggdnl8/mEh+84xzXjgUQiIdlsViNfEYfXeKDZbEoy"
|
|
"mdTIR0RgGw30+31pt9sSjUY18h4hXDUWGAwGsl6vpV6vSzgc1shbnMAyFtjv97JYLKRarYrf"
|
|
"79fIawRhGQuo6XQqlUpFvF7vX95+BT88xgJqPB5LsVgUy7J+85En7hkxFlD6Wj6f11v1wz0j"
|
|
"RgO73U56vd7hGTEVUNvtVrrdrqRSqcMzYiKgNpuNtFqtwzNiKqBms5luX91ZGqnjJiwjgdVq"
|
|
"JY1Gw72CL3iKW7D/O6A/dKfTcefUNzzHPZwauYLlcimlUkm//A+KeIAz2JeeprpbdOiNRiPR"
|
|
"26KByWQimUxGAx/wCHeO2ariOI7E43FJp9NSKBSkVqvJfD6X4XAosVjMnUtJBI450c/wBu/w"
|
|
"CXsNlstl0fsfCAQ08AKxY/+MHERwFwncx0vm0EUul5NgMPiL548ROXayemDjOm4giBDO8RkX"
|
|
"yCAEY8sDDd5GF0mcwPiycYozOLj0+gej7JQuh90YaAAAAABJRU5ErkJggg==")
|
|
|
|
|
|
gFileDir = os.path.dirname(os.path.abspath(__file__))
|
|
|
|
ID_PAPERAIRPLANE_ARROW_BLUE = 2001
|
|
ID_PAPERAIRPLANE_ARROW_RED = 2002
|
|
ID_PAPERAIRPLANE_ARROW_GREY = 2003
|
|
ID_PAPERAIRPLANE_ARROW_DARK = 2004
|
|
ID_PAPERAIRPLANE_ARROW_BLUE_FADEOUT80 = 2005
|
|
ID_PAPERAIRPLANE_ARROW_COLORSHIFT = 2006
|
|
ID_PAPERAIRPLANE_ARROW_WHITE = 2006
|
|
|
|
ID_PAPERAIRPLANE_ARROW_WHITE_PNG = 2007
|
|
|
|
ID_PAPERAIRPLANE_ARROW_BLUE_PY = 2008
|
|
ID_PAPERAIRPLANE_ARROW_WHITE_PY = 2009
|
|
|
|
cursors = {
|
|
# .cur, .ani loose files.
|
|
"paperairplane_arrow_blue.cur" : ID_PAPERAIRPLANE_ARROW_BLUE,
|
|
"paperairplane_arrow_red.cur" : ID_PAPERAIRPLANE_ARROW_RED,
|
|
"paperairplane_arrow_grey.cur" : ID_PAPERAIRPLANE_ARROW_GREY,
|
|
"paperairplane_arrow_dark.cur" : ID_PAPERAIRPLANE_ARROW_DARK,
|
|
"paperairplane_arrow_blue_fadeout80.cur" : ID_PAPERAIRPLANE_ARROW_BLUE_FADEOUT80,
|
|
"paperairplane_arrow_white.cur" : ID_PAPERAIRPLANE_ARROW_WHITE,
|
|
"paperairplane_arrow_colorshift.ani" : ID_PAPERAIRPLANE_ARROW_COLORSHIFT,
|
|
# .png loose files.
|
|
"paperairplane_arrow_white24.png" : ID_PAPERAIRPLANE_ARROW_WHITE_PNG,
|
|
# PyEmbeddedImages
|
|
"paperairplane_arrow_blue24 [PyEmbeddedImage]" : ID_PAPERAIRPLANE_ARROW_BLUE_PY,
|
|
"paperairplane_arrow_white24 [PyEmbeddedImage]" : ID_PAPERAIRPLANE_ARROW_WHITE_PY,
|
|
# wxPython Stock Cursors.
|
|
"wx.CURSOR_ARROW" : wx.CURSOR_ARROW,
|
|
"wx.CURSOR_RIGHT_ARROW" : wx.CURSOR_RIGHT_ARROW,
|
|
"wx.CURSOR_BULLSEYE" : wx.CURSOR_BULLSEYE,
|
|
"wx.CURSOR_CHAR" : wx.CURSOR_CHAR,
|
|
"wx.CURSOR_CROSS" : wx.CURSOR_CROSS,
|
|
"wx.CURSOR_HAND" : wx.CURSOR_HAND,
|
|
"wx.CURSOR_IBEAM" : wx.CURSOR_IBEAM,
|
|
"wx.CURSOR_LEFT_BUTTON" : wx.CURSOR_LEFT_BUTTON,
|
|
"wx.CURSOR_MAGNIFIER" : wx.CURSOR_MAGNIFIER,
|
|
"wx.CURSOR_MIDDLE_BUTTON" : wx.CURSOR_MIDDLE_BUTTON,
|
|
"wx.CURSOR_NO_ENTRY" : wx.CURSOR_NO_ENTRY,
|
|
"wx.CURSOR_PAINT_BRUSH" : wx.CURSOR_PAINT_BRUSH,
|
|
"wx.CURSOR_PENCIL" : wx.CURSOR_PENCIL,
|
|
"wx.CURSOR_POINT_LEFT" : wx.CURSOR_POINT_LEFT,
|
|
"wx.CURSOR_POINT_RIGHT" : wx.CURSOR_POINT_RIGHT,
|
|
"wx.CURSOR_QUESTION_ARROW" : wx.CURSOR_QUESTION_ARROW,
|
|
"wx.CURSOR_RIGHT_BUTTON" : wx.CURSOR_RIGHT_BUTTON,
|
|
"wx.CURSOR_SIZENESW" : wx.CURSOR_SIZENESW,
|
|
"wx.CURSOR_SIZENS" : wx.CURSOR_SIZENS,
|
|
"wx.CURSOR_SIZENWSE" : wx.CURSOR_SIZENWSE,
|
|
"wx.CURSOR_SIZEWE" : wx.CURSOR_SIZEWE,
|
|
"wx.CURSOR_SIZING" : wx.CURSOR_SIZING,
|
|
"wx.CURSOR_SPRAYCAN" : wx.CURSOR_SPRAYCAN,
|
|
"wx.CURSOR_WAIT" : wx.CURSOR_WAIT,
|
|
"wx.CURSOR_WATCH" : wx.CURSOR_WATCH,
|
|
"wx.CURSOR_BLANK" : wx.CURSOR_BLANK,
|
|
"wx.CURSOR_DEFAULT" : wx.CURSOR_DEFAULT,
|
|
"wx.CURSOR_COPY_ARROW" : wx.CURSOR_COPY_ARROW,
|
|
"wx.CURSOR_ARROWWAIT" : wx.CURSOR_ARROWWAIT,
|
|
}
|
|
|
|
|
|
#-Classes----------------------------------------------------------------------
|
|
|
|
|
|
class DrawWindow(wx.Window):
|
|
def __init__(self, parent, log, id=wx.ID_ANY, pos=wx.DefaultPosition,
|
|
size=wx.DefaultSize, style=0):
|
|
wx.Window.__init__(self, parent, id, pos, size, style)
|
|
self.log = log
|
|
self.SetBackgroundColour(wx.WHITE)
|
|
self.lines = []
|
|
self.x = self.y = 0
|
|
|
|
self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
|
|
self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
|
|
self.Bind(wx.EVT_MOTION, self.OnMotion)
|
|
self.Bind(wx.EVT_PAINT, self.OnPaint)
|
|
|
|
def OnPaint(self, event):
|
|
dc = wx.PaintDC(self)
|
|
self.DrawSavedLines(dc)
|
|
|
|
def DrawSavedLines(self, dc):
|
|
dc.SetPen(wx.Pen(wx.BLUE, 1))
|
|
for line in self.lines:
|
|
for coords in line:
|
|
dc.DrawLine(*coords)
|
|
|
|
def OnLeftDown(self, event):
|
|
self.curLine = []
|
|
self.x, self.y = event.GetPosition()
|
|
self.CaptureMouse()
|
|
|
|
def OnLeftUp(self, event):
|
|
if self.HasCapture():
|
|
self.lines.append(self.curLine)
|
|
self.curLine = []
|
|
self.ReleaseMouse()
|
|
|
|
def OnMotion(self, event):
|
|
if self.HasCapture() and event.Dragging():
|
|
dc = wx.ClientDC(self)
|
|
dc.SetPen(wx.Pen(wx.BLUE, 1))
|
|
evtPos = event.GetPosition()
|
|
coords = (self.x, self.y) + (evtPos.x, evtPos.y)
|
|
self.curLine.append(coords)
|
|
dc.DrawLine(*coords)
|
|
self.x, self.y = event.GetPosition()
|
|
|
|
|
|
class CursorTestPanel(wx.Panel):
|
|
"""
|
|
Cursor Test Panel inspired by AniFX cursor test panel.
|
|
"""
|
|
def __init__(self, parent, log):
|
|
self.log = log
|
|
wx.Panel.__init__(self, parent, -1, style=wx.BORDER_SUNKEN)
|
|
|
|
# Create all the widgets for the test panel.
|
|
pnl = wx.Panel(self, -1, style=wx.BORDER_SIMPLE)
|
|
pnl.SetBackgroundColour(wx.BLACK)
|
|
|
|
self.win = wx.Window(pnl, -1, size=(200, 100))
|
|
self.win.SetBackgroundColour("white")
|
|
self.win.Bind(wx.EVT_LEFT_DOWN, self.OnDrawDot)
|
|
|
|
self.drawWin = DrawWindow(pnl, log, size=(200, 100))
|
|
|
|
vbSizer0 = wx.BoxSizer(wx.VERTICAL)
|
|
vbSizer0.Add(self.win, 1, wx.EXPAND | wx.BOTTOM, 1)
|
|
vbSizer0.Add(self.drawWin, 1, wx.EXPAND)
|
|
pnl.SetSizer(vbSizer0)
|
|
|
|
b = wx.Button(self, -1, 'Button')
|
|
tc = wx.TextCtrl(self, -1, 'Text Ctrl')
|
|
rb1 = wx.RadioButton(self, -1, 'Radio Button 1')
|
|
rb2 = wx.RadioButton(self, -1, 'Radio Button 2')
|
|
cb = wx.CheckBox(self, -1, 'Check Box')
|
|
combo = wx.ComboBox(self, -1, 'One', choices=('One', 'Two', 'Three', 'Four', 'Five'))
|
|
sl = wx.Slider(self, -1)
|
|
sc = wx.SpinCtrl(self, -1)
|
|
|
|
# Add all the widgets to a tuple that we will access when changing cursors.
|
|
self.allWidgets = (self, pnl, self.win, self.drawWin, b, tc, rb1, rb2, cb, combo, sl, sc)
|
|
|
|
# Do the panel layout.
|
|
vbSizer = wx.BoxSizer(wx.VERTICAL)
|
|
hbSizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
|
|
gSizer = wx.GridSizer(rows=4, cols=2, vgap=5, hgap=5)
|
|
gSizer.AddMany((b, tc, rb1, rb2, cb, combo, sl, sc))
|
|
|
|
hbSizer.Add(pnl, 0, wx.EXPAND | wx.ALL, 10)
|
|
hbSizer.Add(gSizer, 0, wx.EXPAND | wx.ALL, 10)
|
|
|
|
vbSizer.Add(hbSizer, 0, wx.ALL, 10)
|
|
|
|
self.SetSizer(vbSizer)
|
|
|
|
def OnDrawDot(self, event):
|
|
# Draw a dot so the user can see where the hotspot is.
|
|
dc = wx.ClientDC(self.win)
|
|
dc.SetPen(wx.Pen("RED"))
|
|
dc.SetBrush(wx.Brush("RED"))
|
|
pos = event.GetPosition()
|
|
dc.DrawCircle(pos.x, pos.y, 4)
|
|
|
|
|
|
class TestPanel(wx.Panel):
|
|
def __init__(self, parent, log):
|
|
self.log = log
|
|
wx.Panel.__init__(self, parent, -1)
|
|
|
|
# Create a list of choices from the dictionary above.
|
|
choices = sorted(cursors)
|
|
|
|
# Create the controls.
|
|
self.cb = wx.ComboBox(self, -1, "wx.CURSOR_DEFAULT", choices=choices,
|
|
style=wx.CB_READONLY)
|
|
self.tx = wx.StaticText(self, -1, """\
|
|
This sample allows you to see all the stock cursors available to wxPython,
|
|
and also custom cursors loaded from images, .cur, or .ani files. Simply
|
|
select a name from the wx.Choice and then move the mouse into the window
|
|
or the widgets below to see the cursor.
|
|
|
|
NOTE: not all stock cursors have a specific representation on all platforms.
|
|
""")
|
|
|
|
self.testPanel = CursorTestPanel(self, log)
|
|
|
|
# Bind events.
|
|
self.Bind(wx.EVT_COMBOBOX, self.OnChooseCursor, self.cb)
|
|
|
|
# Setup the layout.
|
|
vbSizer = wx.BoxSizer(wx.VERTICAL)
|
|
vbSizer.Add(self.tx, 0, wx.ALL, 10)
|
|
vbSizer.Add(self.cb, 0, wx.LEFT | wx.BOTTOM, 10)
|
|
|
|
gbs = wx.GridBagSizer(8, 8)
|
|
gbs.Add(self.testPanel, (0, 1), (1, 4), wx.ALIGN_LEFT)
|
|
vbSizer.Add(gbs, 0, wx.ALL)
|
|
|
|
self.SetSizer(vbSizer)
|
|
|
|
wx.CallAfter(self.cb.SetFocus) # Convenience start for mousewheel switching.
|
|
|
|
def OnChooseCursor(self, evt):
|
|
# Clear the dots.
|
|
self.testPanel.win.Refresh()
|
|
self.testPanel.drawWin.lines = []
|
|
self.testPanel.drawWin.Refresh()
|
|
|
|
choice = self.cb.GetStringSelection()
|
|
|
|
self.log.WriteText("Selecting the %s cursor\n" % choice)
|
|
|
|
cnum = cursors[choice]
|
|
|
|
if cnum in (ID_PAPERAIRPLANE_ARROW_BLUE,
|
|
ID_PAPERAIRPLANE_ARROW_RED,
|
|
ID_PAPERAIRPLANE_ARROW_GREY,
|
|
ID_PAPERAIRPLANE_ARROW_DARK,
|
|
ID_PAPERAIRPLANE_ARROW_BLUE_FADEOUT80,
|
|
ID_PAPERAIRPLANE_ARROW_WHITE,
|
|
ID_PAPERAIRPLANE_ARROW_COLORSHIFT): # .cur or .ani loose files.
|
|
|
|
if choice.endswith('.ani'):
|
|
cursor = wx.Cursor(gFileDir + os.sep + 'cursors' + os.sep + choice, wx.BITMAP_TYPE_ANI)
|
|
if choice.endswith('.cur'):
|
|
cursor = wx.Cursor(gFileDir + os.sep + 'cursors' + os.sep + choice, wx.BITMAP_TYPE_CUR)
|
|
|
|
elif cnum == ID_PAPERAIRPLANE_ARROW_WHITE_PNG: # .png loose files.
|
|
image = wx.Image(gFileDir + os.sep + 'cursors' + os.sep + choice, wx.BITMAP_TYPE_PNG)
|
|
|
|
# Since these image didn't come from a .cur or .ani file,
|
|
# tell it where the hotspot is.
|
|
image.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_X, 0)
|
|
image.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_Y, 0)
|
|
# Make the image into a cursor.
|
|
cursor = wx.Cursor(image)
|
|
|
|
elif cnum in (ID_PAPERAIRPLANE_ARROW_BLUE_PY,
|
|
ID_PAPERAIRPLANE_ARROW_WHITE_PY): # PyEmbeddedImages
|
|
if cnum == ID_PAPERAIRPLANE_ARROW_BLUE_PY:
|
|
image = paperairplane_arrow_blue24.GetImage()
|
|
elif cnum == ID_PAPERAIRPLANE_ARROW_WHITE_PY:
|
|
image = paperairplane_arrow_white24.GetImage()
|
|
|
|
# Since these image didn't come from a .cur or .ani file,
|
|
# tell it where the hotspot is.
|
|
image.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_X, 0)
|
|
image.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_Y, 0)
|
|
# Make the image into a cursor.
|
|
cursor = wx.Cursor(image)
|
|
|
|
else:
|
|
# Create one of the stock (built-in) cursors.
|
|
cursor = wx.Cursor(cnum)
|
|
|
|
# Set the cursors for all the testPanels widgets.
|
|
[widget.SetCursor(cursor) for widget in self.testPanel.allWidgets]
|
|
|
|
def OnDrawDot(self, evt):
|
|
# Draw a dot so the user can see where the hotspot is.
|
|
dc = wx.ClientDC(self.win)
|
|
dc.SetPen(wx.Pen("RED"))
|
|
dc.SetBrush(wx.Brush("RED"))
|
|
pos = evt.GetPosition()
|
|
dc.DrawCircle(pos.x, pos.y, 3)
|
|
|
|
|
|
#-wxPython Demo----------------------------------------------------------------
|
|
|
|
def runTest(frame, nb, log):
|
|
win = TestPanel(nb, log)
|
|
return win
|
|
|
|
|
|
overview = """<html><body>
|
|
<h2><center>wx.Cursor</center></h2>
|
|
|
|
This demo shows the stock mouse cursors that are available to wxPython.
|
|
|
|
</body></html>
|
|
"""
|
|
|
|
|
|
if __name__ == '__main__':
|
|
import os
|
|
import sys
|
|
import run
|
|
run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
|