Lots of wx namespace updates for the wx.lib package and the demo from
Jeff Grimmett with some tweaks and changes from Robin git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@24889 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -9,6 +9,10 @@
|
||||
# Copyright: (c) 2001 by Total Control Software
|
||||
# Licence: wxWindows license
|
||||
#----------------------------------------------------------------------
|
||||
# 12/14/2003 - Jeff Grimmett (grimmtooth@softhome.net)
|
||||
#
|
||||
# o 2.5 compatability update.
|
||||
#
|
||||
|
||||
|
||||
|
||||
|
@@ -9,8 +9,14 @@
|
||||
# Copyright: (c) 2001 by Total Control Software
|
||||
# Licence: wxWindows license
|
||||
#----------------------------------------------------------------------------
|
||||
# 12/14/2003 - Jeff Grimmett (grimmtooth@softhome.net)
|
||||
#
|
||||
# o 2.5 compatability update.
|
||||
# o Untested
|
||||
#
|
||||
|
||||
from wxPython import wx, grid
|
||||
import wx
|
||||
import wx.grid
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
@@ -25,8 +31,8 @@ class wxGridAutoEditMixin:
|
||||
|
||||
def __init__(self):
|
||||
self.__enableEdit = 0
|
||||
wx.EVT_IDLE(self, self.__OnIdle)
|
||||
grid.EVT_GRID_SELECT_CELL(self, self.__OnSelectCell)
|
||||
self.Bind(wx.EVT_IDLE, self.__OnIdle)
|
||||
self.Bind(wx.grid.EVT_GRID_SELECT_CELL, self.__OnSelectCell)
|
||||
|
||||
|
||||
def __OnIdle(self, evt):
|
||||
|
@@ -1,5 +1,5 @@
|
||||
#----------------------------------------------------------------------------
|
||||
# Name: wxPython.lib.mixins.listctrl
|
||||
# Name: wx.lib.mixins.imagelist
|
||||
# Purpose: Helpful mix-in classes for using a wxImageList
|
||||
#
|
||||
# Author: Robin Dunn
|
||||
@@ -9,8 +9,13 @@
|
||||
# Copyright: (c) 2001 by Total Control Software
|
||||
# Licence: wxWindows license
|
||||
#----------------------------------------------------------------------------
|
||||
# 12/14/2003 - Jeff Grimmett (grimmtooth@softhome.net)
|
||||
#
|
||||
# o 2.5 compatability update.
|
||||
# o Untested.
|
||||
#
|
||||
|
||||
from wxPython.wx import *
|
||||
import wx
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
@@ -25,12 +30,12 @@ class MagicImageList:
|
||||
|
||||
def SetupIcons(self, images=(), size=None):
|
||||
self.__size = size or self.DEFAULTICONSIZE
|
||||
self.__magicImageList = wxImageList (self.__size,self.__size)
|
||||
self.__magicImageList = wx.ImageList (self.__size,self.__size)
|
||||
self.__magicImageListMapping = {}
|
||||
self.SetImageList (
|
||||
self.__magicImageList, {
|
||||
16:wxIMAGE_LIST_SMALL,
|
||||
32:wxIMAGE_LIST_NORMAL,
|
||||
16:wx.IMAGE_LIST_SMALL,
|
||||
32:wx.IMAGE_LIST_NORMAL,
|
||||
}[self.__size]
|
||||
)
|
||||
for image in images:
|
||||
@@ -46,20 +51,20 @@ class MagicImageList:
|
||||
|
||||
|
||||
### Local methods...
|
||||
def AddIcon(self, icon, mask = wxNullBitmap):
|
||||
def AddIcon(self, icon, mask = wx.NullBitmap):
|
||||
'''Add an icon to the image list, or get the index if already there'''
|
||||
index = self.__magicImageListMapping.get (id (icon))
|
||||
if index is None:
|
||||
if isinstance( icon, wxIconPtr ):
|
||||
index = self.__magicImageList.AddIcon( icon )
|
||||
elif isinstance( icon, wxBitmapPtr ):
|
||||
if isinstance( mask, wxColour ):
|
||||
elif isinstance( icon, wx.BitmapPtr ):
|
||||
if isinstance( mask, wx.Colour ):
|
||||
index = self.__magicImageList.AddWithColourMask( icon, mask )
|
||||
else:
|
||||
index = self.__magicImageList.Add( icon, mask )
|
||||
else:
|
||||
raise ValueError("Unexpected icon object %s, "
|
||||
"expected wxIcon or wxBitmap" % (icon))
|
||||
"expected wx.Icon or wx.Bitmap" % (icon))
|
||||
self.__magicImageListMapping [id (icon)] = index
|
||||
return index
|
||||
|
||||
|
@@ -9,22 +9,27 @@
|
||||
# Copyright: (c) 2001 by Total Control Software
|
||||
# Licence: wxWindows license
|
||||
#----------------------------------------------------------------------------
|
||||
# 12/14/2003 - Jeff Grimmett (grimmtooth@softhome.net)
|
||||
#
|
||||
# o 2.5 compatability update.
|
||||
# o ListCtrlSelectionManagerMix untested.
|
||||
#
|
||||
|
||||
from wxPython.wx import *
|
||||
import locale
|
||||
import locale
|
||||
import wx
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
class wxColumnSorterMixin:
|
||||
"""
|
||||
A mixin class that handles sorting of a wxListCtrl in REPORT mode when
|
||||
A mixin class that handles sorting of a wx.ListCtrl in REPORT mode when
|
||||
the column header is clicked on.
|
||||
|
||||
There are a few requirments needed in order for this to work genericly:
|
||||
|
||||
1. The combined class must have a GetListCtrl method that
|
||||
returns the wxListCtrl to be sorted, and the list control
|
||||
must exist at the time the wxColumnSorterMixin.__init__
|
||||
returns the wx.ListCtrl to be sorted, and the list control
|
||||
must exist at the time the wx.ColumnSorterMixin.__init__
|
||||
method is called because it uses GetListCtrl.
|
||||
|
||||
2. Items in the list control must have a unique data value set
|
||||
@@ -43,8 +48,8 @@ class wxColumnSorterMixin:
|
||||
self.SetColumnCount(numColumns)
|
||||
list = self.GetListCtrl()
|
||||
if not list:
|
||||
raise ValueError, "No wxListCtrl available"
|
||||
EVT_LIST_COL_CLICK(list, list.GetId(), self.__OnColClick)
|
||||
raise ValueError, "No wx.ListCtrl available"
|
||||
self.Bind(wx.EVT_LIST_COL_CLICK, self.__OnColClick, list)
|
||||
|
||||
|
||||
def SetColumnCount(self, newNumColumns):
|
||||
@@ -141,15 +146,15 @@ class wxColumnSorterMixin:
|
||||
|
||||
class wxListCtrlAutoWidthMixin:
|
||||
""" A mix-in class that automatically resizes the last column to take up
|
||||
the remaining width of the wxListCtrl.
|
||||
the remaining width of the wx.ListCtrl.
|
||||
|
||||
This causes the wxListCtrl to automatically take up the full width of
|
||||
This causes the wx.ListCtrl to automatically take up the full width of
|
||||
the list, without either a horizontal scroll bar (unless absolutely
|
||||
necessary) or empty space to the right of the last column.
|
||||
|
||||
NOTE: This only works for report-style lists.
|
||||
|
||||
WARNING: If you override the EVT_SIZE event in your wxListCtrl, make
|
||||
WARNING: If you override the EVT_SIZE event in your wx.ListCtrl, make
|
||||
sure you call event.Skip() to ensure that the mixin's
|
||||
_OnResize method is called.
|
||||
|
||||
@@ -160,8 +165,8 @@ class wxListCtrlAutoWidthMixin:
|
||||
"""
|
||||
self._lastColMinWidth = None
|
||||
|
||||
EVT_SIZE(self, self._onResize)
|
||||
EVT_LIST_COL_END_DRAG(self, self.GetId(), self._onResize)
|
||||
self.Bind(wx.EVT_SIZE, self._onResize)
|
||||
self.Bind(wx.EVT_LIST_COL_END_DRAG, self._onResize, self)
|
||||
|
||||
|
||||
def resizeLastColumn(self, minWidth):
|
||||
@@ -171,7 +176,7 @@ class wxListCtrlAutoWidthMixin:
|
||||
a horizontal scrollbar. Otherwise, we expand the right-most column
|
||||
to take up the remaining free space in the list.
|
||||
|
||||
This method is called automatically when the wxListCtrl is resized;
|
||||
This method is called automatically when the wx.ListCtrl is resized;
|
||||
you can also call it yourself whenever you want the last column to
|
||||
be resized appropriately (eg, when adding, removing or resizing
|
||||
columns).
|
||||
@@ -186,11 +191,11 @@ class wxListCtrlAutoWidthMixin:
|
||||
# =====================
|
||||
|
||||
def _onResize(self, event):
|
||||
""" Respond to the wxListCtrl being resized.
|
||||
""" Respond to the wx.ListCtrl being resized.
|
||||
|
||||
We automatically resize the last column in the list.
|
||||
"""
|
||||
wxCallAfter(self._doResize)
|
||||
wx.CallAfter(self._doResize)
|
||||
event.Skip()
|
||||
|
||||
|
||||
@@ -216,9 +221,9 @@ class wxListCtrlAutoWidthMixin:
|
||||
# NOTE: on GTK, the scrollbar is included in the client size, but on
|
||||
# Windows it is not included
|
||||
listWidth = self.GetClientSize().width
|
||||
if wxPlatform != '__WXMSW__':
|
||||
if wx.Platform != '__WXMSW__':
|
||||
if self.GetItemCount() > self.GetCountPerPage():
|
||||
scrollWidth = wxSystemSettings_GetMetric(wxSYS_VSCROLL_X)
|
||||
scrollWidth = wx.SystemSettings_GetMetric(wx.SYS_VSCROLL_X)
|
||||
listWidth = listWidth - scrollWidth
|
||||
|
||||
totColWidth = 0 # Width of all columns except last one.
|
||||
@@ -242,7 +247,7 @@ class wxListCtrlAutoWidthMixin:
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
SEL_FOC = wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED
|
||||
SEL_FOC = wx.LIST_STATE_SELECTED | wx.LIST_STATE_FOCUSED
|
||||
def selectBeforePopup(event):
|
||||
"""Ensures the item the mouse is pointing at is selected before a popup.
|
||||
|
||||
@@ -251,36 +256,39 @@ def selectBeforePopup(event):
|
||||
if isinstance(ctrl, wxListCtrl):
|
||||
n, flags = ctrl.HitTest(event.GetPosition())
|
||||
if n >= 0:
|
||||
if not ctrl.GetItemState(n, wxLIST_STATE_SELECTED):
|
||||
if not ctrl.GetItemState(n, wx.LIST_STATE_SELECTED):
|
||||
for i in range(ctrl.GetItemCount()):
|
||||
ctrl.SetItemState(i, 0, SEL_FOC)
|
||||
#for i in getListCtrlSelection(ctrl, SEL_FOC):
|
||||
# ctrl.SetItemState(i, 0, SEL_FOC)
|
||||
ctrl.SetItemState(n, SEL_FOC, SEL_FOC)
|
||||
|
||||
def getListCtrlSelection(listctrl, state=wxLIST_STATE_SELECTED):
|
||||
def getListCtrlSelection(listctrl, state=wx.LIST_STATE_SELECTED):
|
||||
""" Returns list of item indexes of given state (selected by defaults) """
|
||||
res = []
|
||||
idx = -1
|
||||
while 1:
|
||||
idx = listctrl.GetNextItem(idx, wxLIST_NEXT_ALL, state)
|
||||
idx = listctrl.GetNextItem(idx, wx.LIST_NEXT_ALL, state)
|
||||
if idx == -1:
|
||||
break
|
||||
res.append(idx)
|
||||
return res
|
||||
|
||||
wxEVT_DOPOPUPMENU = wx.NewEventType()
|
||||
EVT_DOPOPUPMENU = wx.PyEventBinder(wxEVT_DOPOPUPMENU, 0)
|
||||
|
||||
class ListCtrlSelectionManagerMix:
|
||||
"""Mixin that defines a platform independent selection policy
|
||||
|
||||
As selection single and multi-select list return the item index or a
|
||||
list of item indexes respectively.
|
||||
"""
|
||||
wxEVT_DOPOPUPMENU = wxNewId()
|
||||
_menu = None
|
||||
|
||||
def __init__(self):
|
||||
EVT_RIGHT_DOWN(self, self.OnLCSMRightDown)
|
||||
self.Connect(-1, -1, self.wxEVT_DOPOPUPMENU, self.OnLCSMDoPopup)
|
||||
self.Bind(wx.EVT_RIGHT_DOWN, self.OnLCSMRightDown)
|
||||
self.Bind(EVT_DOPOPUPMENU, self.OnLCSMDoPopup)
|
||||
# self.Connect(-1, -1, self.wxEVT_DOPOPUPMENU, self.OnLCSMDoPopup)
|
||||
|
||||
def getPopupMenu(self):
|
||||
""" Override to implement dynamic menus (create) """
|
||||
@@ -296,7 +304,7 @@ class ListCtrlSelectionManagerMix:
|
||||
|
||||
def getSelection(self):
|
||||
res = getListCtrlSelection(self)
|
||||
if self.GetWindowStyleFlag() & wxLC_SINGLE_SEL:
|
||||
if self.GetWindowStyleFlag() & wx.LC_SINGLE_SEL:
|
||||
if res:
|
||||
return res[0]
|
||||
else:
|
||||
@@ -309,11 +317,11 @@ class ListCtrlSelectionManagerMix:
|
||||
event.Skip()
|
||||
menu = self.getPopupMenu()
|
||||
if menu:
|
||||
evt = wxPyEvent()
|
||||
evt.SetEventType(self.wxEVT_DOPOPUPMENU)
|
||||
evt = wx.PyEvent()
|
||||
evt.SetEventType(wxEVT_DOPOPUPMENU)
|
||||
evt.menu = menu
|
||||
evt.pos = event.GetPosition()
|
||||
wxPostEvent(self, evt)
|
||||
wx.PostEvent(self, evt)
|
||||
|
||||
def OnLCSMDoPopup(self, event):
|
||||
self.PopupMenu(event.menu, event.pos)
|
||||
|
@@ -9,13 +9,19 @@
|
||||
# Copyright: (c) 2002 by db-X Corporation
|
||||
# Licence: wxWindows license
|
||||
#---------------------------------------------------------------------------
|
||||
# 12/14/2003 - Jeff Grimmett (grimmtooth@softhome.net)
|
||||
#
|
||||
# o 2.5 compatability update.
|
||||
# o Tested, but there is an anomaly between first use and subsequent uses.
|
||||
# First use is odd, subsequent uses seem to be OK. Init error?
|
||||
# -- No, the first time it uses an aspect ratio, but after the reset it doesn't.
|
||||
#
|
||||
|
||||
"""
|
||||
A mixin class for doing "RubberBand"-ing on a window.
|
||||
"""
|
||||
|
||||
from wxPython.wx import *
|
||||
|
||||
import wx
|
||||
|
||||
#
|
||||
# Some miscellaneous mathematical and geometrical functions
|
||||
@@ -125,8 +131,9 @@ class RubberBand:
|
||||
self.currentBox = None
|
||||
self.__enabled = 1
|
||||
self.__currentCursor = None
|
||||
EVT_MOUSE_EVENTS(drawingSurface, self.__handleMouseEvents)
|
||||
EVT_PAINT(drawingSurface, self.__handleOnPaint)
|
||||
|
||||
drawingSurface.Bind(wx.EVT_MOUSE_EVENTS, self.__handleMouseEvents)
|
||||
drawingSurface.Bind(wx.EVT_PAINT, self.__handleOnPaint)
|
||||
|
||||
def __setEnabled(self, enabled):
|
||||
self.__enabled = enabled
|
||||
@@ -143,19 +150,19 @@ class RubberBand:
|
||||
Return True if the current cursor is one used to
|
||||
mean moving the rubberband.
|
||||
"""
|
||||
return self.__currentCursor == wxCURSOR_HAND
|
||||
return self.__currentCursor == wx.CURSOR_HAND
|
||||
|
||||
def __isSizingCursor(self):
|
||||
"""
|
||||
Return True if the current cursor is one of the ones
|
||||
I may use to signify sizing.
|
||||
"""
|
||||
sizingCursors = [wxCURSOR_SIZENESW,
|
||||
wxCURSOR_SIZENS,
|
||||
wxCURSOR_SIZENWSE,
|
||||
wxCURSOR_SIZEWE,
|
||||
wxCURSOR_SIZING,
|
||||
wxCURSOR_CROSS]
|
||||
sizingCursors = [wx.CURSOR_SIZENESW,
|
||||
wx.CURSOR_SIZENS,
|
||||
wx.CURSOR_SIZENWSE,
|
||||
wx.CURSOR_SIZEWE,
|
||||
wx.CURSOR_SIZING,
|
||||
wx.CURSOR_CROSS]
|
||||
try:
|
||||
sizingCursors.index(self.__currentCursor)
|
||||
return 1
|
||||
@@ -177,7 +184,7 @@ class RubberBand:
|
||||
# First make sure we have started a box.
|
||||
if self.currentBox == None and not event.LeftDown():
|
||||
# No box started yet. Set cursor to the initial kind.
|
||||
self.__setCursor(wxCURSOR_CROSS)
|
||||
self.__setCursor(wx.CURSOR_CROSS)
|
||||
return
|
||||
|
||||
if event.LeftDown():
|
||||
@@ -228,9 +235,9 @@ class RubberBand:
|
||||
# Implement the correct behavior for dragging a side
|
||||
# of the box: Only change one dimension.
|
||||
if not self.aspectRatio:
|
||||
if self.__currentCursor == wxCURSOR_SIZENS:
|
||||
if self.__currentCursor == wx.CURSOR_SIZENS:
|
||||
x = None
|
||||
elif self.__currentCursor == wxCURSOR_SIZEWE:
|
||||
elif self.__currentCursor == wx.CURSOR_SIZEWE:
|
||||
y = None
|
||||
|
||||
x0,y0,w0,h0 = self.currentBox
|
||||
@@ -274,18 +281,18 @@ class RubberBand:
|
||||
if pointOnBox(x, y, self.currentBox, thickness=self.__THICKNESS):
|
||||
position = getCursorPosition(x, y, self.currentBox, thickness=self.__THICKNESS)
|
||||
cursor = [
|
||||
wxCURSOR_SIZENWSE,
|
||||
wxCURSOR_SIZENS,
|
||||
wxCURSOR_SIZENESW,
|
||||
wxCURSOR_SIZEWE,
|
||||
wxCURSOR_SIZENWSE,
|
||||
wxCURSOR_SIZENS,
|
||||
wxCURSOR_SIZENESW,
|
||||
wxCURSOR_SIZEWE
|
||||
wx.CURSOR_SIZENWSE,
|
||||
wx.CURSOR_SIZENS,
|
||||
wx.CURSOR_SIZENESW,
|
||||
wx.CURSOR_SIZEWE,
|
||||
wx.CURSOR_SIZENWSE,
|
||||
wx.CURSOR_SIZENS,
|
||||
wx.CURSOR_SIZENESW,
|
||||
wx.CURSOR_SIZEWE
|
||||
] [position]
|
||||
self.__setCursor(cursor)
|
||||
elif pointInBox(x, y, self.currentBox):
|
||||
self.__setCursor(wxCURSOR_HAND)
|
||||
self.__setCursor(wx.CURSOR_HAND)
|
||||
else:
|
||||
self.__setCursor()
|
||||
|
||||
@@ -295,9 +302,9 @@ class RubberBand:
|
||||
"""
|
||||
if self.__currentCursor != id: # Avoid redundant calls
|
||||
if id:
|
||||
self.drawingSurface.SetCursor(wxStockCursor(id))
|
||||
self.drawingSurface.SetCursor(wx.StockCursor(id))
|
||||
else:
|
||||
self.drawingSurface.SetCursor(wxNullCursor)
|
||||
self.drawingSurface.SetCursor(wx.NullCursor)
|
||||
self.__currentCursor = id
|
||||
|
||||
def __moveCenterTo(self, x, y):
|
||||
@@ -320,14 +327,17 @@ class RubberBand:
|
||||
"""
|
||||
Draw one box shape and possibly erase another.
|
||||
"""
|
||||
dc = wxClientDC(self.drawingSurface)
|
||||
dc = wx.ClientDC(self.drawingSurface)
|
||||
dc.BeginDrawing()
|
||||
dc.SetPen(wxPen(wxWHITE, 1, wxDOT))
|
||||
dc.SetBrush(wxTRANSPARENT_BRUSH)
|
||||
dc.SetLogicalFunction(wxXOR)
|
||||
dc.SetPen(wx.Pen(wx.WHITE, 1, wx.DOT))
|
||||
dc.SetBrush(wx.TRANSPARENT_BRUSH)
|
||||
dc.SetLogicalFunction(wx.XOR)
|
||||
if boxToErase:
|
||||
dc.DrawRectangle(*boxToErase)
|
||||
dc.DrawRectangle(*boxToDraw)
|
||||
r = wx.Rect(*boxToErase)
|
||||
dc.DrawRectangleRect(r)
|
||||
|
||||
r = wx.Rect(*boxToDraw)
|
||||
dc.DrawRectangleRect(r)
|
||||
dc.EndDrawing()
|
||||
|
||||
def __dumpMouseEvent(self, event):
|
||||
@@ -369,12 +379,12 @@ class RubberBand:
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app = wxPySimpleApp()
|
||||
frame = wxFrame(None, -1, title='RubberBand Test', size=(300,300))
|
||||
app = wx.PySimpleApp()
|
||||
frame = wx.Frame(None, -1, title='RubberBand Test', size=(300,300))
|
||||
|
||||
# Add a panel that the rubberband will work on.
|
||||
panel = wxPanel(frame, -1)
|
||||
panel.SetBackgroundColour(wxBLUE)
|
||||
panel = wx.Panel(frame, -1)
|
||||
panel.SetBackgroundColour(wx.BLUE)
|
||||
|
||||
# Create the rubberband
|
||||
frame.rubberBand = RubberBand(drawingSurface=panel)
|
||||
@@ -383,13 +393,13 @@ if __name__ == '__main__':
|
||||
# Add a button that creates a new rubberband
|
||||
def __newRubberBand(event):
|
||||
frame.rubberBand.reset()
|
||||
button = wxButton(frame, 100, 'Reset Rubberband')
|
||||
EVT_BUTTON(frame, 100, __newRubberBand)
|
||||
button = wx.Button(frame, 100, 'Reset Rubberband')
|
||||
frame.Bind(wx.EVT_BUTTON, __newRubberBand, button)
|
||||
|
||||
# Layout the frame
|
||||
sizer = wxBoxSizer(wxVERTICAL)
|
||||
sizer.Add(panel, 1, wxEXPAND | wxALL, 5)
|
||||
sizer.Add(button, 0, wxALIGN_CENTER | wxALL, 5)
|
||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||
sizer.Add(panel, 1, wx.EXPAND | wx.ALL, 5)
|
||||
sizer.Add(button, 0, wx.ALIGN_CENTER | wx.ALL, 5)
|
||||
frame.SetAutoLayout(1)
|
||||
frame.SetSizer(sizer)
|
||||
frame.Show(1)
|
||||
|
Reference in New Issue
Block a user