X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8596dc0b9b9f6e4e434f39b505359ff1c8bd898b..c1dda21b64f300d89cbc084802082d37c694e971:/wxPython/demo/Main.py?ds=sidebyside diff --git a/wxPython/demo/Main.py b/wxPython/demo/Main.py index a0f0f7645b..c5ec3fa129 100644 --- a/wxPython/demo/Main.py +++ b/wxPython/demo/Main.py @@ -36,8 +36,8 @@ import images # 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...") @@ -47,14 +47,35 @@ import images _treeList = [ # new stuff ('Recent Additions/Updates', [ - 'StockButtons', - 'Ticker', - 'Choicebook', - 'ListCtrl_edit', + 'RichTextCtrl', + 'Treebook', + 'Toolbook', + 'BitmapFromBuffer', + 'RawBitmapAccess', + 'DragScroller', + 'DelayedResult', + 'ExpandoTextCtrl', + 'ButtonPanel', + 'FlatNotebook', + 'CustomTreeCtrl', + 'AboutBox', + 'AlphaDrawing', + 'GraphicsContext', + 'CollapsiblePane', + 'ComboCtrl', + 'OwnerDrawnComboBox', + 'BitmapComboBox', + 'I18N', + 'Img2PyArtProvider', + 'SearchCtrl', + 'SizedControls', + 'AUI_MDI', ]), # managed windows == things with a (optional) caption you can close ('Frames and Dialogs', [ + 'AUI_DockingWindowMgr', + 'AUI_MDI', 'Dialog', 'Frame', 'MDIWindows', @@ -64,12 +85,14 @@ _treeList = [ # the common dialogs ('Common Dialogs', [ + 'AboutBox', 'ColourDialog', 'DirDialog', 'FileDialog', 'FindReplaceDialog', 'FontDialog', 'MessageDialog', + 'MultiChoiceDialog', 'PageSetupDialog', 'PrintDialog', 'ProgressDialog', @@ -80,7 +103,6 @@ _treeList = [ # dialogs from libraries ('More Dialogs', [ 'ImageBrowser', - 'MultipleChoiceDialog', 'ScrolledMessageDialog', ]), @@ -91,7 +113,6 @@ _treeList = [ 'CheckBox', 'CheckListBox', 'Choice', - 'Choicebook', 'ComboBox', 'Gauge', 'Grid', @@ -100,20 +121,20 @@ _treeList = [ 'ListCtrl', 'ListCtrl_virtual', 'ListCtrl_edit', - 'Listbook', 'Menu', - 'Notebook', 'PopupMenu', 'PopupWindow', 'RadioBox', 'RadioButton', 'SashWindow', 'ScrolledWindow', + 'SearchCtrl', 'Slider', 'SpinButton', 'SpinCtrl', 'SplitterWindow', 'StaticBitmap', + 'StaticBox', 'StaticText', 'StatusBar', 'StockButtons', @@ -123,11 +144,24 @@ _treeList = [ 'TreeCtrl', 'Validator', ]), + + ('"Book" Controls', [ + 'AUI_Notebook', + 'Choicebook', + 'Listbook', + 'Notebook', + 'Toolbook', + 'Treebook', + ]), ('Custom Controls', [ - 'AnalogClockWindow', + 'AnalogClock', + 'ButtonPanel', 'ColourSelect', + 'ComboTreeBox', + 'CustomTreeCtrl', 'Editor', + 'FlatNotebook', 'GenericButtons', 'GenericDirCtrl', 'LEDNumberCtrl', @@ -142,25 +176,36 @@ _treeList = [ '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', 'MVCTree', 'MaskedEditControls', 'MaskedNumCtrl', - 'MimeTypesManager', + 'MediaCtrl', + 'MultiSplitterWindow', + 'OwnerDrawnComboBox', + 'Pickers', 'PyCrust', 'PyPlot', 'PyShell', + 'RichTextCtrl', 'ScrolledPanel', 'SplitTree', 'StyledTextCtrl_1', @@ -180,6 +225,7 @@ _treeList = [ 'Layoutf', 'RowColSizer', 'ScrolledPanel', + 'SizedControls', 'Sizers', 'XmlResource', 'XmlResourceHandler', @@ -188,13 +234,14 @@ _treeList = [ # ditto ('Process and Events', [ + 'DelayedResult', 'EventManager', 'KeyEvents', 'Process', 'PythonEvents', 'Threads', 'Timer', - ##'infoframe', # needs better explaination and some fixing + ##'infoframe', # needs better explanation and some fixing ]), # Clipboard and DnD @@ -206,36 +253,45 @@ _treeList = [ # Images ('Using Images', [ + 'AlphaDrawing', + 'AnimateCtrl', 'ArtProvider', + 'BitmapFromBuffer', 'Cursor', 'DragImage', 'Image', 'ImageAlpha', 'ImageFromStream', + 'Img2PyArtProvider', 'Mask', + 'RawBitmapAccess', 'Throbber', ]), # Other stuff ('Miscellaneous', [ + 'AlphaDrawing', 'ColourDB', - ##'DialogUnits', # needs more explainations + ##'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', [ ]), @@ -254,9 +310,10 @@ class MyLog(wx.PyLog): self.logTime = logTime def DoLogString(self, message, timeStamp): - if self.logTime: - message = time.strftime("%X", time.localtime(timeStamp)) + \ - ": " + message + #print message, timeStamp + #if self.logTime: + # message = time.strftime("%X", time.localtime(timeStamp)) + \ + # ": " + message if self.tc: self.tc.AppendText(message + '\n') @@ -265,6 +322,60 @@ class MyTP(wx.PyTipProvider): def GetTip(self): return "This is my tip" +#--------------------------------------------------------------------------- +# A class to be used to simply display a message in the demo pane +# rather than running the sample itself. + +class MessagePanel(wx.Panel): + def __init__(self, parent, message, caption='', flags=0): + wx.Panel.__init__(self, parent) + + # Make widgets + if flags: + artid = None + if flags & wx.ICON_EXCLAMATION: + artid = wx.ART_WARNING + elif flags & wx.ICON_ERROR: + artid = wx.ART_ERROR + elif flags & wx.ICON_QUESTION: + artid = wx.ART_QUESTION + elif flags & wx.ICON_INFORMATION: + artid = wx.ART_INFORMATION + + if artid is not None: + bmp = wx.ArtProvider.GetBitmap(artid, wx.ART_MESSAGE_BOX, (32,32)) + icon = wx.StaticBitmap(self, -1, bmp) + else: + icon = (32,32) # make a spacer instead + + if caption: + caption = wx.StaticText(self, -1, caption) + caption.SetFont(wx.Font(28, wx.SWISS, wx.NORMAL, wx.BOLD)) + + message = wx.StaticText(self, -1, message) + + # add to sizers for layout + tbox = wx.BoxSizer(wx.VERTICAL) + if caption: + tbox.Add(caption) + tbox.Add((10,10)) + tbox.Add(message) + + hbox = wx.BoxSizer(wx.HORIZONTAL) + hbox.Add((10,10), 1) + hbox.Add(icon) + hbox.Add((10,10)) + hbox.Add(tbox) + hbox.Add((10,10), 1) + + box = wx.BoxSizer(wx.VERTICAL) + box.Add((10,10), 1) + box.Add(hbox, 0, wx.EXPAND) + box.Add((10,10), 2) + + self.SetSizer(box) + self.Fit() + #--------------------------------------------------------------------------- # A class to be used to display source code in the demo. Try using the @@ -389,9 +500,14 @@ try: 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() @@ -461,13 +577,13 @@ except ImportError: def GetText(self): return self.GetValue() - def GetPositionFromLine(line): + def GetPositionFromLine(self, line): return self.XYToPosition(0,line) def GotoLine(self, line): - pos = self.editor.GetPositionFromLine(line) - self.editor.SetInsertionPoint(pos) - self.editor.ShowPosition(pos) + pos = self.GetPositionFromLine(line) + self.SetInsertionPoint(pos) + self.ShowPosition(pos) def SelectLine(self, line): start = self.GetPositionFromLine(line) @@ -612,7 +728,7 @@ class DemoCodePanel(wx.Panel): try: os.makedirs(GetModifiedDirectory()) if not os.path.exists(GetModifiedDirectory()): - wx.LogMessage("BUG: Created demo directory but it still doesn't exit") + wx.LogMessage("BUG: Created demo directory but it still doesn't exist") raise AssetionError except: wx.LogMessage("Error creating demo directory: %s" % GetModifiedDirectory()) @@ -737,7 +853,8 @@ class DemoModules: 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] = {} @@ -873,7 +990,7 @@ class DemoErrorPanel(wx.Panel): 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 @@ -882,7 +999,7 @@ class DemoErrorPanel(wx.Panel): 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 ) @@ -1016,8 +1133,7 @@ class DemoTaskBarIcon(wx.TaskBarIcon): 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) @@ -1041,6 +1157,8 @@ class wxPythonDemo(wx.Frame): wx.Frame.__init__(self, parent, -1, title, size = (950, 720), style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE) + self.SetMinSize((640,480)) + self.loaded = False self.cwd = os.getcwd() self.curOverview = "" @@ -1048,12 +1166,16 @@ class wxPythonDemo(wx.Frame): 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 @@ -1086,14 +1208,14 @@ class wxPythonDemo(wx.Frame): 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) @@ -1101,22 +1223,6 @@ class wxPythonDemo(wx.Frame): 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() @@ -1126,56 +1232,62 @@ class wxPythonDemo(wx.Frame): 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!!!') - wx.App_SetMacAboutMenuItemId(helpItem.GetId()) + 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' 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 @@ -1202,6 +1314,8 @@ class wxPythonDemo(wx.Frame): # 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)) @@ -1219,10 +1333,15 @@ class wxPythonDemo(wx.Frame): # 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(20) - splitter2.SetMinimumPaneSize(20) + splitter.SetMinimumPaneSize(120) + splitter2.SetMinimumPaneSize(60) # Make the splitter on the right expand the top window when resized def SplitterOnSize(evt): @@ -1235,7 +1354,7 @@ class wxPythonDemo(wx.Frame): # select initial items self.nb.SetSelection(0) - self.tree.SelectItem(root) + self.tree.SelectItem(self.root) # Load 'Main' module self.LoadDemo(self.overviewText) @@ -1253,6 +1372,30 @@ class wxPythonDemo(wx.Frame): #--------------------------------------------- + + 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] @@ -1336,7 +1479,7 @@ class wxPythonDemo(wx.Frame): # 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...") @@ -1453,25 +1596,40 @@ class wxPythonDemo(wx.Frame): 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', @@ -1484,6 +1642,7 @@ class wxPythonDemo(wx.Frame): return else: self.finddlg.Destroy() + self.finddlg = None editor.ShowPosition(loc) editor.SetSelection(loc, loc + len(findstring)) @@ -1497,6 +1656,7 @@ class wxPythonDemo(wx.Frame): def OnFindClose(self, event): event.GetDialog().Destroy() + self.finddlg = None def OnOpenShellWindow(self, evt): @@ -1525,6 +1685,20 @@ class wxPythonDemo(wx.Frame): evt.Skip() self.Bind(wx.EVT_CLOSE, CloseShell) + + def OnOpenWidgetInspector(self, evt): + # Activate the widget inspection tool + from wx.lib.inspect 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): @@ -1532,7 +1706,8 @@ class wxPythonDemo(wx.Frame): self.demoPage = None self.codePage = None self.mainmenu = None - self.tbicon.Destroy() + if self.tbicon is not None: + self.tbicon.Destroy() self.Destroy() @@ -1596,19 +1771,34 @@ class wxPythonDemo(wx.Frame): 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): """ @@ -1616,6 +1806,8 @@ class MyApp(wx.App): 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) @@ -1624,7 +1816,7 @@ class MyApp(wx.App): # 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()