Andrea's patch (plus some changes of my own) to add icons and other

features to the demo's main frame.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@45897 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2007-05-08 20:36:58 +00:00
parent bd33fd3e22
commit 04b3d5e844
30 changed files with 1567 additions and 123 deletions

View File

@@ -19,9 +19,11 @@
# * Annoying switching between tabs and resulting flicker # * Annoying switching between tabs and resulting flicker
# how to replace a page in the notebook without deleting/adding? # how to replace a page in the notebook without deleting/adding?
# Where is SetPage!? tried freeze...tried reparent of dummy panel.... # Where is SetPage!? tried freeze...tried reparent of dummy panel....
# AG: It looks like this issue is fixed by Freeze()ing and Thaw()ing the
# main frame and not the notebook
# TODO List: # TODO List:
# * UI design more prefessional # * UI design more professional (is the new version more professional?)
# * save file positions (new field in demoModules) (@ LoadDemoSource) # * save file positions (new field in demoModules) (@ LoadDemoSource)
# * Update main overview # * Update main overview
@@ -30,7 +32,10 @@
import sys, os, time, traceback, types import sys, os, time, traceback, types
import wx # This module uses the new wx namespace import wx # This module uses the new wx namespace
import wx.aui
import wx.html import wx.html
import wx.lib.customtreectrl as CT
from wx.lib.mixins.treemixin import ExpansionState
import images import images
@@ -43,6 +48,9 @@ import images
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
_demoPngs = ["overview", "recent", "frame", "dialog", "moredialog", "core",
"book", "custom", "morecontrols", "layout", "process", "clipboard",
"images", "miscellaneous"]
_treeList = [ _treeList = [
# new stuff # new stuff
@@ -731,7 +739,7 @@ class DemoCodePanel(wx.Panel):
os.makedirs(GetModifiedDirectory()) os.makedirs(GetModifiedDirectory())
if not os.path.exists(GetModifiedDirectory()): if not os.path.exists(GetModifiedDirectory()):
wx.LogMessage("BUG: Created demo directory but it still doesn't exist") wx.LogMessage("BUG: Created demo directory but it still doesn't exist")
raise AssetionError raise AssertionError
except: except:
wx.LogMessage("Error creating demo directory: %s" % GetModifiedDirectory()) wx.LogMessage("Error creating demo directory: %s" % GetModifiedDirectory())
return return
@@ -750,6 +758,8 @@ class DemoCodePanel(wx.Panel):
self.demoModules.LoadFromFile(modModified, modifiedFilename) self.demoModules.LoadFromFile(modModified, modifiedFilename)
self.ActiveModuleChanged() self.ActiveModuleChanged()
self.mainFrame.SetTreeModified(modifiedFilename, setIcon=True)
def OnRestore(self, event): # Handles the "Delete Modified" button def OnRestore(self, event): # Handles the "Delete Modified" button
modifiedFilename = GetModifiedFilename(self.demoModules.name) modifiedFilename = GetModifiedFilename(self.demoModules.name)
@@ -758,6 +768,8 @@ class DemoCodePanel(wx.Panel):
busy = wx.BusyInfo("Reloading demo module...") busy = wx.BusyInfo("Reloading demo module...")
self.ActiveModuleChanged() self.ActiveModuleChanged()
self.mainFrame.SetTreeModified(modifiedFilename, setIcon=False)
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
@@ -804,6 +816,16 @@ def DoesModifiedExist(name):
return False return False
def SearchDemo(name, keyword):
""" Returns whether a demo contains the search keyword or not. """
fid = open(GetOriginalFilename(name), "rt")
fullText = fid.read()
fid.close()
if fullText.find(keyword) >= 0:
return True
return False
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
class ModuleDictWrapper: class ModuleDictWrapper:
@@ -1156,10 +1178,13 @@ class wxPythonDemo(wx.Frame):
overviewText = "wxPython Overview" overviewText = "wxPython Overview"
def __init__(self, parent, title): def __init__(self, parent, title):
wx.Frame.__init__(self, parent, -1, title, size = (950, 720), wx.Frame.__init__(self, parent, -1, title, size = (970, 720),
style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE) style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE)
self.SetMinSize((640,480)) self.SetMinSize((640,480))
self.mgr = wx.aui.AuiManager()
self.mgr.SetManagedWindow(self)
self.loaded = False self.loaded = False
self.cwd = os.getcwd() self.cwd = os.getcwd()
@@ -1189,119 +1214,66 @@ class wxPythonDemo(wx.Frame):
self.Centre(wx.BOTH) self.Centre(wx.BOTH)
self.CreateStatusBar(1, wx.ST_SIZEGRIP) self.CreateStatusBar(1, wx.ST_SIZEGRIP)
splitter = wx.SplitterWindow(self, -1, style=wx.CLIP_CHILDREN | wx.SP_LIVE_UPDATE | wx.SP_3D)
splitter2 = wx.SplitterWindow(splitter, -1, style=wx.CLIP_CHILDREN | wx.SP_LIVE_UPDATE | wx.SP_3D)
def EmptyHandler(evt): pass
#splitter.Bind(wx.EVT_ERASE_BACKGROUND, EmptyHandler)
#splitter2.Bind(wx.EVT_ERASE_BACKGROUND, EmptyHandler)
# Prevent TreeCtrl from displaying all items after destruction when True
self.dying = False self.dying = False
def EmptyHandler(evt): pass
self.ReadConfigurationFile()
# Create a Notebook # Create a Notebook
self.nb = wx.Notebook(splitter2, -1, style=wx.CLIP_CHILDREN) self.nb = wx.Notebook(self, -1, style=wx.CLIP_CHILDREN)
imgList = wx.ImageList(16, 16)
# Make a File menu for png in ["overview", "code", "demo"]:
self.mainmenu = wx.MenuBar() bmp = images.catalog[png].getBitmap()
menu = wx.Menu() imgList.Add(bmp)
item = menu.Append(-1, '&Redirect Output', self.nb.AssignImageList(imgList)
'Redirect print statements to a window',
wx.ITEM_CHECK)
self.Bind(wx.EVT_MENU, self.OnToggleRedirect, item)
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[:-1]:
submenu = wx.Menu()
for childItem in item[1]:
mi = submenu.Append(-1, childItem)
self.Bind(wx.EVT_MENU, self.OnDemoMenu, mi)
menu.AppendMenu(wx.NewId(), item[0], submenu)
self.mainmenu.Append(menu, '&Demo')
# Make a Help menu
menu = wx.Menu()
findItem = menu.Append(-1, '&Find\tCtrl-F', 'Find in the Demo Code')
findnextItem = menu.Append(-1, 'Find &Next\tF3', 'Find Next')
menu.AppendSeparator()
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 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_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.BuildMenuBar()
self.finddata = wx.FindReplaceData() self.finddata = wx.FindReplaceData()
self.finddata.SetFlags(wx.FR_DOWN) self.finddata.SetFlags(wx.FR_DOWN)
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'), 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 # Create a TreeCtrl
tID = wx.NewId() leftPanel = wx.Panel(self)
leftPanel = wx.Panel(splitter) self.treeMap = {}
self.searchItems = {}
self.filter = wx.SearchCtrl(leftPanel) self.tree = wxPythonTreeCtrl(leftPanel)
self.filter = wx.SearchCtrl(leftPanel, style=wx.TE_PROCESS_ENTER)
self.filter.ShowCancelButton(True) self.filter.ShowCancelButton(True)
self.filter.Bind(wx.EVT_TEXT, self.RecreateTree) self.filter.Bind(wx.EVT_TEXT, self.RecreateTree)
self.filter.Bind(wx.EVT_SEARCHCTRL_CANCEL_BTN, self.filter.Bind(wx.EVT_SEARCHCTRL_CANCEL_BTN,
lambda e: self.filter.SetValue('')) lambda e: self.filter.SetValue(''))
self.filter.Bind(wx.EVT_TEXT_ENTER, self.OnSearch)
self.treeMap = {}
self.tree = wx.TreeCtrl(leftPanel, tID, style = searchMenu = wx.Menu()
wx.TR_DEFAULT_STYLE #| wx.TR_HAS_VARIABLE_ROW_HEIGHT item = searchMenu.AppendRadioItem(-1, "Sample Name")
) self.Bind(wx.EVT_MENU, self.OnSearchMenu, item)
item = searchMenu.AppendRadioItem(-1, "Sample Content")
self.Bind(wx.EVT_MENU, self.OnSearchMenu, item)
self.filter.SetMenu(searchMenu)
self.root = self.tree.AddRoot("wxPython Overview")
self.RecreateTree() self.RecreateTree()
self.tree.Bind(wx.EVT_TREE_ITEM_EXPANDED, self.OnItemExpanded, id=tID) self.tree.SetExpansionState(self.expansionState)
self.tree.Bind(wx.EVT_TREE_ITEM_COLLAPSED, self.OnItemCollapsed, id=tID) self.tree.Bind(wx.EVT_TREE_ITEM_EXPANDED, self.OnItemExpanded)
self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged, id=tID) self.tree.Bind(wx.EVT_TREE_ITEM_COLLAPSED, self.OnItemCollapsed)
self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged)
self.tree.Bind(wx.EVT_LEFT_DOWN, self.OnTreeLeftDown) self.tree.Bind(wx.EVT_LEFT_DOWN, self.OnTreeLeftDown)
# Set up a wx.html.HtmlWindow on the Overview Notebook page # Set up a wx.html.HtmlWindow on the Overview Notebook page
# we put it in a panel first because there seems to be a # we put it in a panel first because there seems to be a
# refresh bug of some sort (wxGTK) when it is directly in # refresh bug of some sort (wxGTK) when it is directly in
# the notebook... # the notebook...
if 0: # the old way if 0: # the old way
self.ovr = wx.html.HtmlWindow(self.nb, -1, size=(400, 400)) self.ovr = wx.html.HtmlWindow(self.nb, -1, size=(400, 400))
self.nb.AddPage(self.ovr, self.overviewText) self.nb.AddPage(self.ovr, self.overviewText, imageId=0)
else: # hopefully I can remove this hacky code soon, see SF bug #216861 else: # hopefully I can remove this hacky code soon, see SF bug #216861
panel = wx.Panel(self.nb, -1, style=wx.CLIP_CHILDREN) panel = wx.Panel(self.nb, -1, style=wx.CLIP_CHILDREN)
self.ovr = wx.html.HtmlWindow(panel, -1, size=(400, 400)) self.ovr = wx.html.HtmlWindow(panel, -1, size=(400, 400))
self.nb.AddPage(panel, self.overviewText) self.nb.AddPage(panel, self.overviewText, imageId=0)
def OnOvrSize(evt, ovr=self.ovr): def OnOvrSize(evt, ovr=self.ovr):
ovr.SetSize(evt.GetSize()) ovr.SetSize(evt.GetSize())
@@ -1314,7 +1286,7 @@ class wxPythonDemo(wx.Frame):
# Set up a log window # Set up a log window
self.log = wx.TextCtrl(splitter2, -1, self.log = wx.TextCtrl(self, -1,
style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL) style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL)
if wx.Platform == "__WXMAC__": if wx.Platform == "__WXMAC__":
self.log.MacCheckSpelling(False) self.log.MacCheckSpelling(False)
@@ -1329,30 +1301,15 @@ class wxPythonDemo(wx.Frame):
#wx.Log_SetActiveTarget(wx.LogStderr()) #wx.Log_SetActiveTarget(wx.LogStderr())
#wx.Log_SetTraceMask(wx.TraceMessages) #wx.Log_SetTraceMask(wx.TraceMessages)
self.Bind(wx.EVT_ACTIVATE, self.OnActivate) self.Bind(wx.EVT_ACTIVATE, self.OnActivate)
wx.GetApp().Bind(wx.EVT_ACTIVATE_APP, self.OnAppActivate) wx.GetApp().Bind(wx.EVT_ACTIVATE_APP, self.OnAppActivate)
# add the windows to the splitter and split it. # add the windows to the splitter and split it.
splitter2.SplitHorizontally(self.nb, self.log, -160)
leftBox = wx.BoxSizer(wx.VERTICAL) leftBox = wx.BoxSizer(wx.VERTICAL)
leftBox.Add(self.tree, 1, wx.EXPAND) leftBox.Add(self.tree, 1, wx.EXPAND)
leftBox.Add(wx.StaticText(leftPanel, label = "Filter Demos:"), 0, wx.TOP|wx.LEFT, 5) leftBox.Add(wx.StaticText(leftPanel, label = "Filter Demos:"), 0, wx.TOP|wx.LEFT, 5)
leftBox.Add(self.filter, 0, wx.EXPAND|wx.ALL, 5) leftBox.Add(self.filter, 0, wx.EXPAND|wx.ALL, 5)
leftPanel.SetSizer(leftBox) leftPanel.SetSizer(leftBox)
splitter.SplitVertically(leftPanel, splitter2, 220)
splitter.SetMinimumPaneSize(120)
splitter2.SetMinimumPaneSize(60)
# Make the splitter on the right expand the top window when resized
def SplitterOnSize(evt):
splitter = evt.GetEventObject()
sz = splitter.GetSize()
splitter.SetSashPosition(sz.height - 160, False)
evt.Skip()
splitter2.Bind(wx.EVT_SIZE, SplitterOnSize)
# select initial items # select initial items
self.nb.SetSelection(0) self.nb.SetSelection(0)
@@ -1372,32 +1329,268 @@ class wxPythonDemo(wx.Frame):
self.tree.SelectItem(selectedDemo) self.tree.SelectItem(selectedDemo)
self.tree.EnsureVisible(selectedDemo) self.tree.EnsureVisible(selectedDemo)
# Use the aui manager to set up everything
self.mgr.AddPane(self.nb, wx.aui.AuiPaneInfo().CenterPane().Name("Notebook"))
self.mgr.AddPane(leftPanel, wx.aui.AuiPaneInfo().Left().Layer(2).BestSize((240, -1)).
MinSize((160, -1)).FloatingSize((240, 700)).Caption("wxPython Demos").
MaximizeButton().Name("TreeDemo"))
self.mgr.AddPane(self.log, wx.aui.AuiPaneInfo().Bottom().BestSize((-1, 150)).
MinSize((-1, 60)).FloatingSize((500, 160)).Caption("Event Handlers Messages").
MaximizeButton().Name("LogWindow"))
#--------------------------------------------- self.auiConfigurations["Default Perspective"] = self.mgr.SavePerspective()
self.mgr.Update()
self.mgr.SetFlags(self.mgr.GetFlags() ^ wx.aui.AUI_MGR_ALLOW_ACTIVE_PANE)
self.mgr.SetFlags(self.mgr.GetFlags() ^ wx.aui.AUI_MGR_TRANSPARENT_DRAG)
def ReadConfigurationFile(self):
self.auiConfigurations = {}
optionsFile = opj(wx.GetHomeDir() + "/.wxPyDemo/wxPythonOptions.txt")
if not os.path.isfile(optionsFile):
self.expansionState = [0, 1]
return
fid = open(optionsFile, "rt")
self.expansionState = eval(fid.readline().strip().split(":")[1])
auiConfigurations = fid.readline().strip().split(":")[1:]
auiConfigurations = ":".join(auiConfigurations)
self.auiConfigurations.update(eval(auiConfigurations))
fid.close()
def BuildMenuBar(self):
# Make a File menu
self.mainmenu = wx.MenuBar()
menu = wx.Menu()
item = menu.Append(-1, '&Redirect Output',
'Redirect print statements to a window',
wx.ITEM_CHECK)
self.Bind(wx.EVT_MENU, self.OnToggleRedirect, item)
exitItem = wx.MenuItem(menu, -1, 'E&xit\tCtrl-Q', 'Get the heck outta here!')
exitItem.SetBitmap(images.catalog['exit'].getBitmap())
menu.AppendItem(exitItem)
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 indx, item in enumerate(_treeList[:-1]):
menuItem = wx.MenuItem(menu, -1, item[0])
submenu = wx.Menu()
for childItem in item[1]:
mi = submenu.Append(-1, childItem)
self.Bind(wx.EVT_MENU, self.OnDemoMenu, mi)
menuItem.SetBitmap(images.catalog[_demoPngs[indx+1]].getBitmap())
menuItem.SetSubMenu(submenu)
menu.AppendItem(menuItem)
self.mainmenu.Append(menu, '&Demo')
# Make an Option menu
menu = wx.Menu()
auiPerspectives = self.auiConfigurations.keys()
auiPerspectives.sort()
perspectivesMenu = wx.Menu()
item = wx.MenuItem(perspectivesMenu, -1, "Default Perspective", "Load startup default perspective", wx.ITEM_RADIO)
self.Bind(wx.EVT_MENU, self.OnAUIPerspectives, item)
perspectivesMenu.AppendItem(item)
for indx, key in enumerate(auiPerspectives):
if key == "Default Perspective":
continue
item = wx.MenuItem(perspectivesMenu, -1, key, "Load user perspective %d"%indx, wx.ITEM_RADIO)
perspectivesMenu.AppendItem(item)
self.Bind(wx.EVT_MENU, self.OnAUIPerspectives, item)
menu.AppendMenu(wx.ID_ANY, "&AUI Perspectives", perspectivesMenu)
self.perspectives_menu = perspectivesMenu
item = wx.MenuItem(menu, -1, 'Save Perspective', 'Save AUI perspective')
item.SetBitmap(images.catalog['saveperspective'].getBitmap())
menu.AppendItem(item)
self.Bind(wx.EVT_MENU, self.OnSavePerspective, item)
item = wx.MenuItem(menu, -1, 'Delete Perspective', 'Delete AUI perspective')
item.SetBitmap(images.catalog['deleteperspective'].getBitmap())
menu.AppendItem(item)
self.Bind(wx.EVT_MENU, self.OnDeletePerspective, item)
menu.AppendSeparator()
item = wx.MenuItem(menu, -1, 'Restore Tree Expansion', 'Restore the initial tree expansion state')
item.SetBitmap(images.catalog['expansion'].getBitmap())
menu.AppendItem(item)
self.Bind(wx.EVT_MENU, self.OnTreeExpansion, item)
self.mainmenu.Append(menu, '&Options')
# Make a Help menu
menu = wx.Menu()
findItem = wx.MenuItem(menu, -1, '&Find\tCtrl-F', 'Find in the Demo Code')
findItem.SetBitmap(images.catalog['find'].getBitmap())
findNextItem = wx.MenuItem(menu, -1, 'Find &Next\tF3', 'Find Next')
findNextItem.SetBitmap(images.catalog['findnext'].getBitmap())
menu.AppendItem(findItem)
menu.AppendItem(findNextItem)
menu.AppendSeparator()
shellItem = wx.MenuItem(menu, -1, 'Open Py&Shell Window\tF5',
'An interactive interpreter window with the demo app and frame objects in the namesapce')
shellItem.SetBitmap(images.catalog['pyshell'].getBitmap())
menu.AppendItem(shellItem)
inspToolItem = wx.MenuItem(menu, -1, 'Open &Widget Inspector\tF6',
'A tool that lets you browse the live widgets and sizers in an application')
inspToolItem.SetBitmap(images.catalog['inspect'].getBitmap())
menu.AppendItem(inspToolItem)
menu.AppendSeparator()
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_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)
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'), 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)
#---------------------------------------------
def RecreateTree(self, evt=None): def RecreateTree(self, evt=None):
# Catch the search type (name or content)
searchMenu = self.filter.GetMenu().GetMenuItems()
fullSearch = searchMenu[1].IsChecked()
if evt:
if fullSearch:
# Do not`scan all the demo files for every char
# the user input, use wx.EVT_TEXT_ENTER instead
return
self.tree.Freeze() self.tree.Freeze()
self.tree.DeleteAllItems() self.tree.DeleteAllItems()
self.root = self.tree.AddRoot("wxPython Overview") self.root = self.tree.AddRoot("wxPython Overview")
self.tree.SetItemImage(self.root, 0)
self.tree.SetPyData(self.root, 0)
treeFont = self.tree.GetFont()
catFont = self.tree.GetFont()
treeFont.SetPointSize(10)
treeFont.SetWeight(wx.BOLD)
self.tree.SetItemFont(self.root, treeFont)
catFont.SetWeight(wx.BOLD)
firstChild = None firstChild = None
filter = self.filter.GetValue() filter = self.filter.GetValue()
count = 0
bmp = images.catalog['modifiedexists'].getBitmap()
for category, items in _treeList: for category, items in _treeList:
count += 1
if filter: if filter:
items = [item for item in items if filter.lower() in item.lower()] if fullSearch:
items = self.searchItems[category]
else:
items = [item for item in items if filter.lower() in item.lower()]
if items: if items:
child = self.tree.AppendItem(self.root, category) child = self.tree.AppendItem(self.root, category, image=count)
self.tree.SetItemFont(child, catFont)
self.tree.SetPyData(child, count)
if not firstChild: firstChild = child if not firstChild: firstChild = child
for childItem in items: for childItem in items:
theDemo = self.tree.AppendItem(child, childItem) if DoesModifiedExist(childItem):
wnd = wx.StaticBitmap(self.tree, -1, bmp)
else:
wnd = None
theDemo = self.tree.AppendItem(child, childItem, image=count, wnd=wnd)
self.tree.SetPyData(theDemo, count)
self.treeMap[childItem] = theDemo self.treeMap[childItem] = theDemo
self.tree.Expand(self.root) self.tree.Expand(self.root)
if firstChild: if firstChild:
self.tree.Expand(firstChild) self.tree.Expand(firstChild)
if filter: if filter:
self.tree.ExpandAll() self.tree.ExpandAll()
self.tree.Thaw() self.tree.Thaw()
self.searchItems = {}
def OnSearchMenu(self, event):
# Catch the search type (name or content)
searchMenu = self.filter.GetMenu().GetMenuItems()
fullSearch = searchMenu[1].IsChecked()
if fullSearch:
self.OnSearch()
else:
self.RecreateTree()
def OnSearch(self, event=None):
value = self.filter.GetValue()
if not value:
self.RecreateTree()
return
wx.BeginBusyCursor()
for category, items in _treeList:
self.searchItems[category] = []
for childItem in items:
if SearchDemo(childItem, value):
self.searchItems[category].append(childItem)
wx.EndBusyCursor()
self.RecreateTree()
def SetTreeModified(self, modifiedFilename, setIcon):
self.tree.Freeze()
treeItemText = os.path.split(os.path.splitext(modifiedFilename)[0])[1]
self.LoopTreeCtrl(self.root, treeItemText, setIcon)
self.tree.CalculatePositions()
self.tree.Thaw()
def LoopTreeCtrl(self, parentItem, itemText, setIcon):
child, cookie = self.tree.GetFirstChild(parentItem)
while child:
text = self.tree.GetItemText(child)
if text == itemText:
child.DeleteWindow()
if setIcon:
bmp = images.catalog['modifiedexists'].getBitmap()
child.SetWindow(wx.StaticBitmap(self.tree, -1, bmp))
self.LoopTreeCtrl(child, itemText, setIcon)
child, cookie = self.tree.GetNextChild(parentItem, cookie)
def WriteText(self, text): def WriteText(self, text):
if text[-1:] == '\n': if text[-1:] == '\n':
text = text[:-1] text = text[:-1]
@@ -1440,6 +1633,7 @@ class wxPythonDemo(wx.Frame):
def LoadDemo(self, demoName): def LoadDemo(self, demoName):
try: try:
wx.BeginBusyCursor() wx.BeginBusyCursor()
self.Freeze()
os.chdir(self.cwd) os.chdir(self.cwd)
self.ShutdownDemoModule() self.ShutdownDemoModule()
@@ -1464,6 +1658,7 @@ class wxPythonDemo(wx.Frame):
self.UpdateNotebook(0) self.UpdateNotebook(0)
finally: finally:
wx.EndBusyCursor() wx.EndBusyCursor()
self.Thaw()
#--------------------------------------------- #---------------------------------------------
def LoadDemoSource(self): def LoadDemoSource(self):
@@ -1494,6 +1689,10 @@ class wxPythonDemo(wx.Frame):
self.demoPage = DemoErrorPanel(self.nb, self.codePage, self.demoPage = DemoErrorPanel(self.nb, self.codePage,
DemoError(sys.exc_info()), self) DemoError(sys.exc_info()), self)
bg = self.nb.GetThemeBackgroundColour()
if bg:
self.demoPage.SetBackgroundColour(bg)
assert self.demoPage is not None, "runTest must return a window!" assert self.demoPage is not None, "runTest must return a window!"
else: else:
@@ -1524,6 +1723,7 @@ class wxPythonDemo(wx.Frame):
def UpdateNotebook(self, select = -1): def UpdateNotebook(self, select = -1):
nb = self.nb nb = self.nb
debug = False debug = False
self.Freeze()
def UpdatePage(page, pageText): def UpdatePage(page, pageText):
pageExists = False pageExists = False
@@ -1537,15 +1737,13 @@ class wxPythonDemo(wx.Frame):
if page: if page:
if not pageExists: if not pageExists:
# Add a new page # Add a new page
nb.AddPage(page, pageText) nb.AddPage(page, pageText, imageId=nb.GetPageCount())
if debug: wx.LogMessage("DBG: ADDED %s" % pageText) if debug: wx.LogMessage("DBG: ADDED %s" % pageText)
else: else:
if nb.GetPage(pagePos) != page: if nb.GetPage(pagePos) != page:
# Reload an existing page # Reload an existing page
nb.Freeze()
nb.DeletePage(pagePos) nb.DeletePage(pagePos)
nb.InsertPage(pagePos, page, pageText) nb.InsertPage(pagePos, page, pageText, imageId=pagePos)
nb.Thaw()
if debug: wx.LogMessage("DBG: RELOADED %s" % pageText) if debug: wx.LogMessage("DBG: RELOADED %s" % pageText)
else: else:
# Excellent! No redraw/flicker # Excellent! No redraw/flicker
@@ -1565,7 +1763,9 @@ class wxPythonDemo(wx.Frame):
if select >= 0 and select < nb.GetPageCount(): if select >= 0 and select < nb.GetPageCount():
nb.SetSelection(select) nb.SetSelection(select)
self.Thaw()
#--------------------------------------------- #---------------------------------------------
def SetOverview(self, name, text): def SetOverview(self, name, text):
self.curOverview = text self.curOverview = text
@@ -1590,6 +1790,70 @@ class wxPythonDemo(wx.Frame):
else: else:
app.RestoreStdio() app.RestoreStdio()
print "Print statements and other standard output will now be sent to the usual location." print "Print statements and other standard output will now be sent to the usual location."
def OnAUIPerspectives(self, event):
perspective = self.perspectives_menu.GetLabel(event.GetId())
self.mgr.LoadPerspective(self.auiConfigurations[perspective])
self.mgr.Update()
def OnSavePerspective(self, event):
dlg = wx.TextEntryDialog(self, "Enter a name for the new perspective:", "AUI Configuration")
dlg.SetValue(("Perspective %d")%(len(self.auiConfigurations)+1))
if dlg.ShowModal() != wx.ID_OK:
return
perspectiveName = dlg.GetValue()
menuItems = self.perspectives_menu.GetMenuItems()
for item in menuItems:
if item.GetLabel() == perspectiveName:
wx.MessageBox("The selected perspective name:\n\n%s\n\nAlready exists."%perspectiveName,
"Error", style=wx.ICON_ERROR)
return
item = wx.MenuItem(self.perspectives_menu, -1, dlg.GetValue(),
"Load user perspective %d"%(len(self.auiConfigurations)+1),
wx.ITEM_RADIO)
self.Bind(wx.EVT_MENU, self.OnAUIPerspectives, item)
self.perspectives_menu.AppendItem(item)
item.Check(True)
self.auiConfigurations.update({dlg.GetValue(): self.mgr.SavePerspective()})
def OnDeletePerspective(self, event):
menuItems = self.perspectives_menu.GetMenuItems()[1:]
lst = []
loadDefault = False
for item in menuItems:
lst.append(item.GetLabel())
dlg = wx.MultiChoiceDialog(self,
"Please select the perspectives\nyou would like to delete:",
"Delete AUI Perspectives", lst)
if dlg.ShowModal() == wx.ID_OK:
selections = dlg.GetSelections()
strings = [lst[x] for x in selections]
for sel in strings:
self.auiConfigurations.pop(sel)
item = menuItems[lst.index(sel)]
if item.IsChecked():
loadDefault = True
self.perspectives_menu.GetMenuItems()[0].Check(True)
self.perspectives_menu.DeleteItem(item)
lst.remove(sel)
if loadDefault:
self.mgr.LoadPerspective(self.auiConfigurations["Default Perspective"])
self.mgr.Update()
def OnTreeExpansion(self, event):
self.tree.SetExpansionState(self.expansionState)
def OnHelpAbout(self, event): def OnHelpAbout(self, event):
from About import MyAboutBox from About import MyAboutBox
@@ -1710,6 +1974,15 @@ class wxPythonDemo(wx.Frame):
self.mainmenu = None self.mainmenu = None
if self.tbicon is not None: if self.tbicon is not None:
self.tbicon.Destroy() self.tbicon.Destroy()
optionsFile = opj(wx.GetHomeDir() + "/.wxPyDemo/wxPythonOptions.txt")
fid = open(optionsFile, "wt")
fid.write("ExpansionState: %s\n"%self.tree.GetExpansionState())
fid.write("AUIPerspectives: %s\n"%self.auiConfigurations)
fid.close()
self.mgr.UnInit()
del self.mgr
self.Destroy() self.Destroy()
@@ -1800,7 +2073,30 @@ class MySplashScreen(wx.SplashScreen):
if self.fc.IsRunning(): if self.fc.IsRunning():
self.Raise() self.Raise()
class wxPythonTreeCtrl(ExpansionState, CT.CustomTreeCtrl):
def __init__(self, parent):
CT.CustomTreeCtrl.__init__(self, parent, style=wx.TR_DEFAULT_STYLE|
wx.TR_HAS_VARIABLE_ROW_HEIGHT)
self.SetSpacing(10)
self.SetWindowStyle(self.GetWindowStyle() & ~wx.TR_LINES_AT_ROOT)
self.BuildTreeImageList()
def BuildTreeImageList(self):
imgList = wx.ImageList(16, 16)
for png in _demoPngs:
imgList.Add(images.catalog[png].getBitmap())
self.SetImageList(imgList)
def GetItemIdentity(self, item):
return self.GetPyData(item)
class MyApp(wx.App): class MyApp(wx.App):
def OnInit(self): def OnInit(self):
""" """
@@ -1876,7 +2172,7 @@ is loaded in another tab for you to browse and learn from.
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
if __name__ == '__main__': if __name__ == '__main__':
__name__ = 'Main' __name__ = 'MainWithoutFNB'
main() main()
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------

View File

@@ -30,8 +30,9 @@ class TestTreeCtrlPanel(wx.Panel):
tID = wx.NewId() tID = wx.NewId()
self.tree = MyTreeCtrl(self, tID, wx.DefaultPosition, wx.DefaultSize, self.tree = MyTreeCtrl(self, tID, wx.DefaultPosition, wx.DefaultSize,
wx.TR_HAS_BUTTONS wx.TR_DEFAULT_STYLE
| wx.TR_EDIT_LABELS #wx.TR_HAS_BUTTONS
#| wx.TR_EDIT_LABELS
#| wx.TR_MULTIPLE #| wx.TR_MULTIPLE
#| wx.TR_HIDE_ROOT #| wx.TR_HIDE_ROOT
, self.log) , self.log)

Binary file not shown.

After

Width:  |  Height:  |  Size: 622 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 693 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 868 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 807 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 833 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 892 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 817 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 995 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 894 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 985 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 811 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 519 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 716 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 740 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 495 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 655 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 664 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -100,6 +100,33 @@ command_lines = [
"-a -u -n _book_green bmp_source/book_green.png images.py", "-a -u -n _book_green bmp_source/book_green.png images.py",
"-a -u -n _book_blue bmp_source/book_blue.png images.py", "-a -u -n _book_blue bmp_source/book_blue.png images.py",
"-a -u -c bmp_source/book.png images.py",
"-a -u -c bmp_source/clipboard.png images.py",
"-a -u -c bmp_source/code.png images.py",
"-a -u -c bmp_source/core.png images.py",
"-a -u -c bmp_source/custom.png images.py",
"-a -u -c bmp_source/deleteperspective.png images.py",
"-a -u -c bmp_source/demo.png images.py",
"-a -u -c bmp_source/dialog.png images.py",
"-a -u -c bmp_source/exit.png images.py",
"-a -u -c bmp_source/expansion.png images.py",
"-a -u -c bmp_source/find.png images.py",
"-a -u -c bmp_source/findnext.png images.py",
"-a -u -c bmp_source/frame.png images.py",
"-a -u -c bmp_source/images.png images.py",
"-a -u -c bmp_source/inspect.png images.py",
"-a -u -c bmp_source/layout.png images.py",
"-a -u -c bmp_source/miscellaneous.png images.py",
"-a -u -c bmp_source/modifiedexists.png images.py",
"-a -u -c bmp_source/morecontrols.png images.py",
"-a -u -c bmp_source/moredialog.png images.py",
"-a -u -c bmp_source/overview.png images.py",
"-a -u -c bmp_source/process.png images.py",
"-a -u -c bmp_source/pyshell.png images.py",
"-a -u -c bmp_source/recent.png images.py",
"-a -u -c bmp_source/saveperspective.png images.py",
" -u -c bmp_source/001.png throbImages.py", " -u -c bmp_source/001.png throbImages.py",
"-a -u -c bmp_source/002.png throbImages.py", "-a -u -c bmp_source/002.png throbImages.py",
"-a -u -c bmp_source/003.png throbImages.py", "-a -u -c bmp_source/003.png throbImages.py",

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
#---------------------------------------------------------------------- #----------------------------------------------------------------------
# This file was generated by encode_bitmaps.py # This file was generated by encode_bitmaps.py
# #
from wx import ImageFromStream, BitmapFromImage from wx import ImageFromStream, BitmapFromImage, EmptyIcon
import cStringIO import cStringIO