# For debugging
##wx.Trap();
-##print "wx.VERSION_STRING = ", wx.VERSION_STRING
-##print os.getpid();
+##print "wx.VERSION_STRING = %s (%s)" % (wx.VERSION_STRING, wx.USE_UNICODE and 'unicode' or 'ansi')
+##print "pid:", os.getpid()
##raw_input("Press Enter...")
_treeList = [
# new stuff
('Recent Additions/Updates', [
- 'StandardPaths',
- 'MediaCtrl',
- 'DatePickerCtrl',
]),
# managed windows == things with a (optional) caption you can close
('Frames and Dialogs', [
+ 'AUI_DockingWindowMgr',
+ 'AUI_MDI',
'Dialog',
'Frame',
'MDIWindows',
# the common dialogs
('Common Dialogs', [
+ 'AboutBox',
'ColourDialog',
'DirDialog',
'FileDialog',
'FindReplaceDialog',
'FontDialog',
'MessageDialog',
+ 'MultiChoiceDialog',
'PageSetupDialog',
'PrintDialog',
'ProgressDialog',
# dialogs from libraries
('More Dialogs', [
'ImageBrowser',
- 'MultipleChoiceDialog',
'ScrolledMessageDialog',
]),
'CheckBox',
'CheckListBox',
'Choice',
- 'Choicebook',
'ComboBox',
'Gauge',
'Grid',
'ListCtrl',
'ListCtrl_virtual',
'ListCtrl_edit',
- 'Listbook',
'Menu',
- 'Notebook',
'PopupMenu',
'PopupWindow',
'RadioBox',
'RadioButton',
'SashWindow',
'ScrolledWindow',
+ 'SearchCtrl',
'Slider',
'SpinButton',
'SpinCtrl',
'TreeCtrl',
'Validator',
]),
+
+ ('"Book" Controls', [
+ 'AUI_Notebook',
+ 'Choicebook',
+ 'Listbook',
+ 'Notebook',
+ 'Toolbook',
+ 'Treebook',
+ ]),
('Custom Controls', [
- 'AnalogClockWindow',
+ 'AnalogClock',
+ 'ButtonPanel',
'ColourSelect',
+ 'ComboTreeBox',
+ 'CustomTreeCtrl',
'Editor',
+ 'FlatNotebook',
'GenericButtons',
'GenericDirCtrl',
'LEDNumberCtrl',
'ActiveX_FlashWindow',
'ActiveX_IEHtmlWindow',
'ActiveX_PDFWindow',
- #'RightTextCtrl', deprecated as we have wxTE_RIGHT now.
+ 'BitmapComboBox',
'Calendar',
'CalendarCtrl',
+ 'CheckListCtrlMixin',
+ 'CollapsiblePane',
+ 'ComboCtrl',
'ContextHelp',
'DatePickerCtrl',
'DynamicSashWindow',
'EditableListBox',
+ 'ExpandoTextCtrl',
'FancyText',
'FileBrowseButton',
'FloatBar',
'FloatCanvas',
+ 'FoldPanelBar',
'HtmlWindow',
+ 'HyperLinkCtrl',
'IntCtrl',
- 'MediaCtrl',
'MVCTree',
'MaskedEditControls',
'MaskedNumCtrl',
- 'MimeTypesManager',
+ 'MediaCtrl',
+ 'MultiSplitterWindow',
+ 'OwnerDrawnComboBox',
+ 'Pickers',
'PyCrust',
'PyPlot',
'PyShell',
+ 'RichTextCtrl',
'ScrolledPanel',
'SplitTree',
'StyledTextCtrl_1',
'Throbber',
'Ticker',
'TimeCtrl',
+ 'TreeMixin',
'VListBox',
]),
'Layoutf',
'RowColSizer',
'ScrolledPanel',
+ 'SizedControls',
'Sizers',
'XmlResource',
'XmlResourceHandler',
# ditto
('Process and Events', [
+ 'DelayedResult',
'EventManager',
'KeyEvents',
'Process',
# Images
('Using Images', [
+ 'AlphaDrawing',
+ 'AnimateCtrl',
'ArtProvider',
+ 'BitmapFromBuffer',
'Cursor',
'DragImage',
'Image',
'ImageAlpha',
'ImageFromStream',
+ 'Img2PyArtProvider',
'Mask',
+ 'RawBitmapAccess',
'Throbber',
]),
# Other stuff
('Miscellaneous', [
+ 'AlphaDrawing',
'ColourDB',
##'DialogUnits', # needs more explanations
+ 'DragScroller',
'DrawXXXList',
'FileHistory',
'FontEnumerator',
+ 'GraphicsContext',
+ 'GLCanvas',
+ 'I18N',
'Joystick',
+ 'MimeTypesManager',
+ 'MouseGestures',
'OGL',
'PrintFramework',
+ 'PseudoDC',
'ShapedWindow',
'Sound',
'StandardPaths',
'Unicode',
]),
- # need libs not coming with the demo
- ('Samples using an external library', [
- 'GLCanvas',
- ]),
-
('Check out the samples dir too', [
]),
if wx.Platform == '__WXMSW__':
self.StyleSetSpec(stc.STC_STYLE_DEFAULT,
'fore:#000000,back:#FFFFFF,face:Courier New,size:9')
+ elif wx.Platform == '__WXMAC__':
+ # TODO: if this looks fine on Linux too, remove the Mac-specific case
+ # and use this whenever OS != MSW.
+ self.StyleSetSpec(stc.STC_STYLE_DEFAULT,
+ 'fore:#000000,back:#FFFFFF,face:Courier')
else:
self.StyleSetSpec(stc.STC_STYLE_DEFAULT,
- 'fore:#000000,back:#FFFFFF,face:Courier,size:12')
+ 'fore:#000000,back:#FFFFFF,face:Courier,size:9')
# Clear styles and revert to default.
self.StyleClearAll()
def LoadDict(self, modID):
if self.name != __name__:
source = self.modules[modID][1]
- description = self.modules[modID][3]
+ #description = self.modules[modID][3]
+ description = self.modules[modID][2]
try:
self.modules[modID][0] = {}
self.box = wx.BoxSizer(wx.VERTICAL)
# Main Label
- self.box.Add(wx.StaticText(self, -1, "An error has occured while trying to run the demo")
+ self.box.Add(wx.StaticText(self, -1, "An error has occurred while trying to run the demo")
, 0, wx.ALIGN_CENTER | wx.TOP, 10)
# Exception Information
boxInfoGrid = wx.FlexGridSizer(0, 2, 0, 0)
textFlags = wx.ALIGN_RIGHT | wx.LEFT | wx.RIGHT | wx.TOP
boxInfoGrid.Add(wx.StaticText(self, -1, "Type: "), 0, textFlags, 5 )
- boxInfoGrid.Add(wx.StaticText(self, -1, demoError.exception_type) , 0, textFlags, 5 )
+ boxInfoGrid.Add(wx.StaticText(self, -1, str(demoError.exception_type)) , 0, textFlags, 5 )
boxInfoGrid.Add(wx.StaticText(self, -1, "Details: ") , 0, textFlags, 5 )
boxInfoGrid.Add(wx.StaticText(self, -1, demoError.exception_details) , 0, textFlags, 5 )
boxInfoSizer.Add(boxInfoGrid, 0, wx.ALIGN_CENTRE | wx.ALL, 5 )
def OnTaskBarChange(self, evt):
- names = [ "WXPdemo", "WXP", "Mondrian", "Test2m",
- "Blom08m", "Blom10m", "Blom15m" ]
+ names = [ "WXPdemo", "Mondrian", "Pencil", "Carrot" ]
name = names[self.imgidx]
getFunc = getattr(images, "get%sImage" % name)
self.codePage = None
self.shell = None
self.firstTime = True
+ self.finddlg = None
icon = images.getWXPdemoIcon()
self.SetIcon(icon)
- self.tbicon = DemoTaskBarIcon(self)
-
+ try:
+ self.tbicon = DemoTaskBarIcon(self)
+ except:
+ self.tbicon = None
+
wx.CallAfter(self.ShowTip)
self.otherWin = None
wx.ITEM_CHECK)
self.Bind(wx.EVT_MENU, self.OnToggleRedirect, item)
- item = menu.Append(-1, 'E&xit\tAlt-X', 'Get the heck outta here!')
- self.Bind(wx.EVT_MENU, self.OnFileExit, item)
- wx.App.SetMacExitMenuItemId(item.GetId())
+ exitItem = menu.Append(-1, 'E&xit\tCtrl-Q', 'Get the heck outta here!')
+ self.Bind(wx.EVT_MENU, self.OnFileExit, exitItem)
+ wx.App.SetMacExitMenuItemId(exitItem.GetId())
self.mainmenu.Append(menu, '&File')
# Make a Demo menu
menu = wx.Menu()
- for item in _treeList:
+ for item in _treeList[:-1]:
submenu = wx.Menu()
for childItem in item[1]:
mi = submenu.Append(-1, childItem)
menu.AppendMenu(wx.NewId(), item[0], submenu)
self.mainmenu.Append(menu, '&Demo')
- # Make a Demo Code menu
- #TODO: Add new menu items
- # Like the option-enabled entries to select the
- # active module
- #TODO: should we bother?
-
- #menu = wx.Menu()
- #saveID = wx.NewId()
- #restoreID = wx.NewId()
- #
- #menu.Append(saveID, '&Save\tCtrl-S', 'Save edited demo')
- #menu.Append(restoreID, '&Delete Modified\tCtrl-R', 'Delete modified copy')
- #self.Bind(wx.EVT_MENU, self.codePage.OnSave, id=saveID)
- #self.Bind(wx.EVT_MENU, self.codePage.OnRestore, id=restoreID)
- #self.mainmenu.Append(menu, 'Demo &Code')
- #
# Make a Help menu
menu = wx.Menu()
shellItem = menu.Append(-1, 'Open Py&Shell Window\tF5',
'An interactive interpreter window with the demo app and frame objects in the namesapce')
+ inspToolItem = menu.Append(-1, 'Open &Widget Inspector\tF6',
+ 'A tool that lets you browse the live widgets and sizers in an application')
menu.AppendSeparator()
- helpItem = menu.Append(-1, '&About\tCtrl-H', 'wxPython RULES!!!')
+ helpItem = menu.Append(-1, '&About wxPython Demo', 'wxPython RULES!!!')
wx.App.SetMacAboutMenuItemId(helpItem.GetId())
self.Bind(wx.EVT_MENU, self.OnOpenShellWindow, shellItem)
+ self.Bind(wx.EVT_MENU, self.OnOpenWidgetInspector, inspToolItem)
self.Bind(wx.EVT_MENU, self.OnHelpAbout, helpItem)
self.Bind(wx.EVT_MENU, self.OnHelpFind, findItem)
self.Bind(wx.EVT_MENU, self.OnFindNext, findnextItem)
- self.Bind(wx.EVT_COMMAND_FIND, self.OnFind)
- self.Bind(wx.EVT_COMMAND_FIND_NEXT, self.OnFind)
- self.Bind(wx.EVT_COMMAND_FIND_CLOSE, self.OnFindClose)
+ self.Bind(wx.EVT_FIND, self.OnFind)
+ self.Bind(wx.EVT_FIND_NEXT, self.OnFind)
+ self.Bind(wx.EVT_FIND_CLOSE, self.OnFindClose)
+ self.Bind(wx.EVT_UPDATE_UI, self.OnUpdateFindItems, findItem)
+ self.Bind(wx.EVT_UPDATE_UI, self.OnUpdateFindItems, findnextItem)
self.mainmenu.Append(menu, '&Help')
self.SetMenuBar(self.mainmenu)
self.finddata = wx.FindReplaceData()
+ self.finddata.SetFlags(wx.FR_DOWN)
- if 0:
+ if False:
# This is another way to set Accelerators, in addition to
# using the '\t<key>' syntax in the menu items.
- aTable = wx.AcceleratorTable([(wx.ACCEL_ALT, ord('X'), exitID),
- (wx.ACCEL_CTRL, ord('H'), helpID),
- (wx.ACCEL_CTRL, ord('F'), findID),
- (wx.ACCEL_NORMAL, WXK_F3, findnextID)
+ aTable = wx.AcceleratorTable([(wx.ACCEL_ALT, ord('X'), exitItem.GetId()),
+ (wx.ACCEL_CTRL, ord('H'), helpItem.GetId()),
+ (wx.ACCEL_CTRL, ord('F'), findItem.GetId()),
+ (wx.ACCEL_NORMAL, wx.WXK_F3, findnextItem.GetId()),
+ (wx.ACCEL_NORMAL, wx.WXK_F9, shellItem.GetId()),
])
self.SetAcceleratorTable(aTable)
# Create a TreeCtrl
tID = wx.NewId()
+ leftPanel = wx.Panel(splitter)
+
+ self.filter = wx.SearchCtrl(leftPanel)
+ self.filter.ShowCancelButton(True)
+ self.filter.Bind(wx.EVT_TEXT, self.RecreateTree)
+ self.filter.Bind(wx.EVT_SEARCHCTRL_CANCEL_BTN,
+ lambda e: self.filter.SetValue(''))
+
self.treeMap = {}
- self.tree = wx.TreeCtrl(splitter, tID, style =
+ self.tree = wx.TreeCtrl(leftPanel, tID, style =
wx.TR_DEFAULT_STYLE #| wx.TR_HAS_VARIABLE_ROW_HEIGHT
)
- root = self.tree.AddRoot("wxPython Overview")
- firstChild = None
- for item in _treeList:
- child = self.tree.AppendItem(root, item[0])
- if not firstChild: firstChild = child
- for childItem in item[1]:
- theDemo = self.tree.AppendItem(child, childItem)
- self.treeMap[childItem] = theDemo
-
- self.tree.Expand(root)
- self.tree.Expand(firstChild)
+ self.root = self.tree.AddRoot("wxPython Overview")
+ self.RecreateTree()
self.tree.Bind(wx.EVT_TREE_ITEM_EXPANDED, self.OnItemExpanded, id=tID)
self.tree.Bind(wx.EVT_TREE_ITEM_COLLAPSED, self.OnItemCollapsed, id=tID)
self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged, id=tID)
self.tree.Bind(wx.EVT_LEFT_DOWN, self.OnTreeLeftDown)
-
+
# Set up a wx.html.HtmlWindow on the Overview Notebook page
# we put it in a panel first because there seems to be a
# refresh bug of some sort (wxGTK) when it is directly in
# Set up a log window
self.log = wx.TextCtrl(splitter2, -1,
style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL)
+ if wx.Platform == "__WXMAC__":
+ self.log.MacCheckSpelling(False)
# Set the wxWindows log target to be this textctrl
#wx.Log_SetActiveTarget(wx.LogTextCtrl(self.log))
# add the windows to the splitter and split it.
splitter2.SplitHorizontally(self.nb, self.log, -160)
- splitter.SplitVertically(self.tree, splitter2, 200)
+ leftBox = wx.BoxSizer(wx.VERTICAL)
+ leftBox.Add(self.tree, 1, wx.EXPAND)
+ leftBox.Add(wx.StaticText(leftPanel, label = "Filter Demos:"), 0, wx.TOP|wx.LEFT, 5)
+ leftBox.Add(self.filter, 0, wx.EXPAND|wx.ALL, 5)
+ leftPanel.SetSizer(leftBox)
+ splitter.SplitVertically(leftPanel, splitter2, 220)
splitter.SetMinimumPaneSize(120)
splitter2.SetMinimumPaneSize(60)
# select initial items
self.nb.SetSelection(0)
- self.tree.SelectItem(root)
+ self.tree.SelectItem(self.root)
# Load 'Main' module
self.LoadDemo(self.overviewText)
#---------------------------------------------
+
+ def RecreateTree(self, evt=None):
+ self.tree.Freeze()
+ self.tree.DeleteAllItems()
+ self.root = self.tree.AddRoot("wxPython Overview")
+ firstChild = None
+ filter = self.filter.GetValue()
+ for category, items in _treeList:
+ if filter:
+ items = [item for item in items if filter.lower() in item.lower()]
+ if items:
+ child = self.tree.AppendItem(self.root, category)
+ if not firstChild: firstChild = child
+ for childItem in items:
+ theDemo = self.tree.AppendItem(child, childItem)
+ self.treeMap[childItem] = theDemo
+
+ self.tree.Expand(self.root)
+ if firstChild:
+ self.tree.Expand(firstChild)
+ if filter:
+ self.tree.ExpandAll()
+ self.tree.Thaw()
+
def WriteText(self, text):
if text[-1:] == '\n':
text = text[:-1]
# o The RunTest() for all samples must now return a window that can
# be palced in a tab in the main notebook.
- # o If an error occurs (or has occured before) an error tab is created.
+ # o If an error occurs (or has occurred before) an error tab is created.
if module is not None:
wx.LogMessage("Running demo module...")
about.Destroy()
def OnHelpFind(self, event):
+ if self.finddlg != None:
+ return
+
self.nb.SetSelection(1)
self.finddlg = wx.FindReplaceDialog(self, self.finddata, "Find",
- wx.FR_NOUPDOWN |
- wx.FR_NOMATCHCASE |
- wx.FR_NOWHOLEWORD)
+ wx.FR_NOMATCHCASE | wx.FR_NOWHOLEWORD)
self.finddlg.Show(True)
+
+ def OnUpdateFindItems(self, evt):
+ evt.Enable(self.finddlg == None)
+
+
def OnFind(self, event):
editor = self.codePage.editor
self.nb.SetSelection(1)
end = editor.GetLastPosition()
textstring = editor.GetRange(0, end).lower()
- start = editor.GetSelection()[1]
findstring = self.finddata.GetFindString().lower()
- loc = textstring.find(findstring, start)
+ backward = not (self.finddata.GetFlags() & wx.FR_DOWN)
+ if backward:
+ start = editor.GetSelection()[0]
+ loc = textstring.rfind(findstring, 0, start)
+ else:
+ start = editor.GetSelection()[1]
+ loc = textstring.find(findstring, start)
if loc == -1 and start != 0:
# string not found, start at beginning
- start = 0
- loc = textstring.find(findstring, start)
+ if backward:
+ start = end
+ loc = textstring.rfind(findstring, 0, start)
+ else:
+ start = 0
+ loc = textstring.find(findstring, start)
if loc == -1:
dlg = wx.MessageDialog(self, 'Find String Not Found',
'Find String Not Found in Demo File',
return
else:
self.finddlg.Destroy()
+ self.finddlg = None
editor.ShowPosition(loc)
editor.SetSelection(loc, loc + len(findstring))
def OnFindClose(self, event):
event.GetDialog().Destroy()
+ self.finddlg = None
def OnOpenShellWindow(self, evt):
evt.Skip()
self.Bind(wx.EVT_CLOSE, CloseShell)
+
+ def OnOpenWidgetInspector(self, evt):
+ # Activate the widget inspection tool
+ from wx.lib.inspection import InspectionTool
+ if not InspectionTool().initialized:
+ InspectionTool().Init()
+
+ # Find a widget to be selected in the tree. Use either the
+ # one under the cursor, if any, or this frame.
+ wnd = wx.FindWindowAtPointer()
+ if not wnd:
+ wnd = self
+ InspectionTool().Show(wnd, True)
+
#---------------------------------------------
def OnCloseWindow(self, event):
self.demoPage = None
self.codePage = None
self.mainmenu = None
- self.tbicon.Destroy()
+ if self.tbicon is not None:
+ self.tbicon.Destroy()
self.Destroy()
class MySplashScreen(wx.SplashScreen):
def __init__(self):
- bmp = wx.Image(opj("bitmaps/splash.gif")).ConvertToBitmap()
+ bmp = wx.Image(opj("bitmaps/splash.png")).ConvertToBitmap()
wx.SplashScreen.__init__(self, bmp,
wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
- 3000, None, -1)
+ 5000, None, -1)
self.Bind(wx.EVT_CLOSE, self.OnClose)
+ self.fc = wx.FutureCall(2000, self.ShowMain)
+
def OnClose(self, evt):
+ # Make sure the default handler runs too so this window gets
+ # destroyed
+ evt.Skip()
self.Hide()
+
+ # if the timer is still running then go ahead and show the
+ # main frame now
+ if self.fc.IsRunning():
+ self.fc.Stop()
+ self.ShowMain()
+
+
+ def ShowMain(self):
frame = wxPythonDemo(None, "wxPython: (A Demonstration)")
frame.Show()
- evt.Skip() # Make sure the default handler runs too...
-
+ if self.fc.IsRunning():
+ self.Raise()
+
class MyApp(wx.App):
def OnInit(self):
"""
the main frame when it is time to do so.
"""
+ wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1)
+
# For debugging
#self.SetAssertMode(wx.PYAPP_ASSERT_DIALOG)
# initialization, finally creating and showing the main
# application window(s). In this case we have nothing else to
# do so we'll delay showing the main frame until later (see
- # OnClose above) so the users can see the SplashScreen effect.
+ # ShowMain above) so the users can see the SplashScreen effect.
splash = MySplashScreen()
splash.Show()