Backport: Various fixes and improvements to get look-and-feel similar across

different platforms.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@45801 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2007-05-04 01:01:08 +00:00
parent 89419ee6a9
commit e057fb3454
4 changed files with 111 additions and 79 deletions

View File

@@ -1,3 +1,9 @@
0.1.8-6
-------
Various fixes and improvements to get look-and-feel similar across
different platforms.
0.1.8-5 0.1.8-5
------- -------

View File

@@ -99,6 +99,7 @@ class Tools(wx.Panel):
wx.wxEVT_COMMAND_BUTTON_CLICKED, g.frame.OnCreate) wx.wxEVT_COMMAND_BUTTON_CLICKED, g.frame.OnCreate)
wx.EVT_KEY_DOWN(self, self.OnKeyDown) wx.EVT_KEY_DOWN(self, self.OnKeyDown)
wx.EVT_KEY_UP(self, self.OnKeyUp) wx.EVT_KEY_UP(self, self.OnKeyUp)
self.Bind(wx.EVT_LEFT_DOWN, self.OnClickBox)
self.drag = None self.drag = None
@@ -119,10 +120,11 @@ class Tools(wx.Panel):
# Each group is inside box # Each group is inside box
id = wx.NewId() id = wx.NewId()
box = wx.StaticBox(self, id, '[+] '+name, style=wx.WANTS_CHARS) box = wx.StaticBox(self, id, '[+] '+name, style=wx.WANTS_CHARS)
box.SetForegroundColour(wx.Colour(64, 64, 64))
# box.SetFont(g.smallerFont())
box.show = True box.show = True
box.name = name box.name = name
box.gnum = len(self.groups) box.gnum = len(self.groups)
box.SetFont(g.smallerFont())
box.Bind(wx.EVT_LEFT_DOWN, self.OnClickBox) box.Bind(wx.EVT_LEFT_DOWN, self.OnClickBox)
boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL) boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
boxSizer.Add((0, 4)) boxSizer.Add((0, 4))
@@ -135,7 +137,7 @@ class Tools(wx.Panel):
# Enable/disable group # Enable/disable group
def EnableGroup(self, gnum, enable = True): def EnableGroup(self, gnum, enable = True):
grp = self.groups[gnum] grp = self.groups[gnum]
grp[0].Enable(enable) #grp[0].Enable(enable)
for b in grp[1].values(): b.Enable(enable) for b in grp[1].values(): b.Enable(enable)
# Show/hide group # Show/hide group
@@ -156,12 +158,23 @@ class Tools(wx.Panel):
grp[1][id].Enable(enable) grp[1][id].Enable(enable)
def OnClickBox(self, evt): def OnClickBox(self, evt):
box = self.boxes[evt.GetId()] if wx.Platform == '__WXMSW__':
box = None
for id,b in self.boxes.items():
# Detect click on label
if b.GetRect().Inside(evt.GetPosition()):
box = b
break
if not box: return
else:
box = self.boxes[evt.GetId()]
# Collapse/restore static box, change label # Collapse/restore static box, change label
self.ShowGroup(box.gnum, not box.show) self.ShowGroup(box.gnum, not box.show)
if box.show: box.SetLabel('[+] ' + box.name) if box.show: box.SetLabel('[+] ' + box.name)
else: box.SetLabel('[-] ' + box.name) else: box.SetLabel('[-] ' + box.name)
self.Layout() self.Layout()
self.Refresh()
#for b in self.boxes.items():
# DaD # DaD
def OnLeftDownOnButton(self, evt): def OnLeftDownOnButton(self, evt):

View File

@@ -11,12 +11,6 @@ import traceback
# Constant to define standart window name # Constant to define standart window name
STD_NAME = '_XRCED_T_W' STD_NAME = '_XRCED_T_W'
COLOUR_COMMENT = 'Blue'
COLOUR_REF = 'DarkGreen'
COLOUR_HIDDEN = 'Grey'
COLOUR_HL = 'Red'
COLOUR_DT = 'DarkGreen'
# Icons # Icons
import images import images
@@ -420,44 +414,7 @@ def SetMenu(m, list, shift=False):
class HighLightBox: class HighLightBox:
colour = None colour = None
def __init__(self, pos, size): def __init__(self, pos, size):
if not self.colour: colour = self.colour = wx.NamedColour(COLOUR_HL) colour = g.tree.COLOUR_HL
else: colour = self.colour
if size.width == -1: size.width = 1
if size.height == -1: size.height = 1
w = g.testWin.panel
l1 = wx.Window(w, -1, pos, wx.Size(size.width, 2))
l1.SetBackgroundColour(self.colour)
l2 = wx.Window(w, -1, pos, wx.Size(2, size.height))
l2.SetBackgroundColour(self.colour)
l3 = wx.Window(w, -1, wx.Point(pos.x + size.width - 2, pos.y), wx.Size(2, size.height))
l3.SetBackgroundColour(self.colour)
l4 = wx.Window(w, -1, wx.Point(pos.x, pos.y + size.height - 2), wx.Size(size.width, 2))
l4.SetBackgroundColour(self.colour)
self.lines = [l1, l2, l3, l4]
self.size = size
g.testWin.highLight = self
# Move highlight to a new position
def Replace(self, pos, size):
if size.width == -1: size.width = 1
if size.height == -1: size.height = 1
self.lines[0].SetDimensions(pos.x, pos.y, size.width, 2)
self.lines[1].SetDimensions(pos.x, pos.y, 2, size.height)
self.lines[2].SetDimensions(pos.x + size.width - 2, pos.y, 2, size.height)
self.lines[3].SetDimensions(pos.x, pos.y + size.height - 2, size.width, 2)
self.size = size
# Remove it
def Remove(self):
map(wx.Window.Destroy, self.lines)
g.testWin.highLight = None
def Refresh(self):
map(wx.Window.Refresh, self.lines)
# Same for drop target
class HighLightDTBox(HighLightBox):
colour = None
def __init__(self, pos, size):
if not self.colour: colour = self.colour = wx.NamedColour(COLOUR_DT)
else: colour = self.colour
if size.width == -1: size.width = 0 if size.width == -1: size.width = 0
if size.height == -1: size.height = 0 if size.height == -1: size.height = 0
w = g.testWin.panel w = g.testWin.panel
@@ -470,28 +427,79 @@ class HighLightDTBox(HighLightBox):
l4 = wx.Window(w, -1, wx.Point(pos.x, pos.y + size.height - 2), wx.Size(size.width, 2)) l4 = wx.Window(w, -1, wx.Point(pos.x, pos.y + size.height - 2), wx.Size(size.width, 2))
l4.SetBackgroundColour(colour) l4.SetBackgroundColour(colour)
self.lines = [l1, l2, l3, l4] self.lines = [l1, l2, l3, l4]
if wx.Platform == '__WXMSW__':
for l in self.lines:
l.Bind(wx.EVT_PAINT, self.OnPaint)
g.testWin.highLight = self
self.size = size self.size = size
# Repainting is not always done for these windows on Windows
def OnPaint(self, evt):
w = evt.GetEventObject()
dc = wx.PaintDC(w)
w.ClearBackground()
dc.Destroy()
# Move highlight to a new position
def Replace(self, pos, size):
if size.width == -1: size.width = 0
if size.height == -1: size.height = 0
self.lines[0].SetDimensions(pos.x, pos.y, size.width, 2)
self.lines[1].SetDimensions(pos.x, pos.y, 2, size.height)
self.lines[2].SetDimensions(pos.x + size.width - 2, pos.y, 2, size.height)
self.lines[3].SetDimensions(pos.x, pos.y + size.height - 2, size.width, 2)
self.size = size
def Remove(self):
map(wx.Window.Destroy, self.lines)
g.testWin.highLight = None
def Refresh(self):
map(wx.Window.Refresh, self.lines)
# Same for drop target
class HighLightDTBox(HighLightBox):
colour = None
def __init__(self, pos, size):
colour = g.tree.COLOUR_DT
if size.width == -1: size.width = 0
if size.height == -1: size.height = 0
w = g.testWin.panel
l1 = wx.Window(w, -1, pos, wx.Size(size.width, 2))
l1.SetBackgroundColour(colour)
l2 = wx.Window(w, -1, pos, wx.Size(2, size.height))
l2.SetBackgroundColour(colour)
l3 = wx.Window(w, -1, wx.Point(pos.x + size.width - 2, pos.y), wx.Size(2, size.height))
l3.SetBackgroundColour(colour)
l4 = wx.Window(w, -1, wx.Point(pos.x, pos.y + size.height - 2), wx.Size(size.width, 2))
l4.SetBackgroundColour(colour)
self.lines = [l1, l2, l3, l4]
self.item = None self.item = None
self.size = size
# Remove it # Remove it
def Remove(self): def Remove(self):
map(wx.Window.Destroy, self.lines) map(wx.Window.Destroy, self.lines)
g.testWin.highLightDT = None g.testWin.highLightDT = None
def updateHL(hl, hlClass, pos, size): def updateHL(hl, hlClass, pos, size):
# Need to recreate window if size did not change to force update
if hl and hl.size == size: if hl and hl.size == size:
hl.Remove() hl.Remove()
hl = None hl = None
if hl: if hl:
hl.Replace(pos, size) hl.Replace(pos, size)
hl.Refresh()
else: else:
hl = hlClass(pos, size) hl = hlClass(pos, size)
hl.Refresh()
return hl return hl
################################################################################ ################################################################################
class XML_Tree(wx.TreeCtrl): class XML_Tree(wx.TreeCtrl):
def __init__(self, parent, id): def __init__(self, parent, id):
# Item colour
self.COLOUR_COMMENT = wx.Colour(0, 0, 255)
self.COLOUR_REF = wx.Colour(0, 0, 128)
self.COLOUR_HIDDEN = wx.Colour(128, 128, 128)
self.COLOUR_HL = wx.Colour(255, 0, 0)
self.COLOUR_DT = wx.Colour(0, 64, 0)
wx.TreeCtrl.__init__(self, parent, id, wx.TreeCtrl.__init__(self, parent, id,
style = wx.TR_HAS_BUTTONS | wx.TR_MULTIPLE | wx.TR_EDIT_LABELS) style = wx.TR_HAS_BUTTONS | wx.TR_MULTIPLE | wx.TR_EDIT_LABELS)
self.SetBackgroundColour(wx.Colour(224, 248, 224)) self.SetBackgroundColour(wx.Colour(224, 248, 224))
@@ -569,7 +577,6 @@ class XML_Tree(wx.TreeCtrl):
# Clear tree # Clear tree
def Clear(self): def Clear(self):
self.selection = None
self.UnselectAll() self.UnselectAll()
self.DeleteAllItems() self.DeleteAllItems()
# Add minimal structure # Add minimal structure
@@ -590,7 +597,6 @@ class XML_Tree(wx.TreeCtrl):
# Clear old data and set new # Clear old data and set new
def SetData(self, dom): def SetData(self, dom):
self.selection = None
self.UnselectAll() self.UnselectAll()
self.DeleteAllItems() self.DeleteAllItems()
# Add minimal structure # Add minimal structure
@@ -634,12 +640,12 @@ class XML_Tree(wx.TreeCtrl):
data=wx.TreeItemData(xxx)) data=wx.TreeItemData(xxx))
# Different color for comments and references # Different color for comments and references
if xxx.className == 'comment': if xxx.className == 'comment':
self.SetItemTextColour(item, COLOUR_COMMENT) self.SetItemTextColour(item, self.COLOUR_COMMENT)
self.SetItemFont(item, self.fontComment) self.SetItemFont(item, self.fontComment)
elif treeObj.ref: elif treeObj.ref:
self.SetItemTextColour(item, COLOUR_REF) self.SetItemTextColour(item, self.COLOUR_REF)
elif treeObj.hasStyle and treeObj.params.get('hidden', False): elif treeObj.hasStyle and treeObj.params.get('hidden', False):
self.SetItemTextColour(item, COLOUR_HIDDEN) self.SetItemTextColour(item, self.COLOUR_HIDDEN)
# Try to find children objects # Try to find children objects
if treeObj.hasChildren: if treeObj.hasChildren:
nodes = treeObj.node.childNodes[:] nodes = treeObj.node.childNodes[:]
@@ -670,12 +676,12 @@ class XML_Tree(wx.TreeCtrl):
treeObj = xxx.treeObject() treeObj = xxx.treeObject()
# Different color for references and comments # Different color for references and comments
if xxx.className == 'comment': if xxx.className == 'comment':
self.SetItemTextColour(newItem, COLOUR_COMMENT) self.SetItemTextColour(newItem, self.COLOUR_COMMENT)
self.SetItemFont(newItem, self.fontComment) self.SetItemFont(newItem, self.fontComment)
elif treeObj.ref: elif treeObj.ref:
self.SetItemTextColour(newItem, COLOUR_REF) self.SetItemTextColour(newItem, self.COLOUR_REF)
elif treeObj.hasStyle and treeObj.params.get('hidden', False): elif treeObj.hasStyle and treeObj.params.get('hidden', False):
self.SetItemTextColour(newItem, COLOUR_HIDDEN) self.SetItemTextColour(newItem, self.COLOUR_HIDDEN)
# Add children items # Add children items
if xxx.hasChildren: if xxx.hasChildren:
treeObj = xxx.treeObject() treeObj = xxx.treeObject()
@@ -691,8 +697,6 @@ class XML_Tree(wx.TreeCtrl):
parent = node.parentNode parent = node.parentNode
parent.removeChild(node) parent.removeChild(node)
self.Delete(leaf) self.Delete(leaf)
# Reset selection object
self.selection = None
return node return node
# Find position relative to the top-level window # Find position relative to the top-level window
@@ -768,10 +772,27 @@ class XML_Tree(wx.TreeCtrl):
def OnSelChanged(self, evt): def OnSelChanged(self, evt):
if self.selectionChanging: return if self.selectionChanging: return
self.selectionChanging = True self.selectionChanging = True
self.UnselectAll() wx.TreeCtrl.UnselectAll(self)
self.SelectItem(evt.GetItem()) self.ChangeSelection(evt.GetItem())
wx.TreeCtrl.SelectItem(self, evt.GetItem())
self.selectionChanging = False self.selectionChanging = False
g.frame.SetStatusText('') g.frame.SetStatusText('')
evt.Skip()
# Override to use like single-selection tree
def GetSelection(self):
return self.selection
def SelectItem(self, item):
self.UnselectAll()
self.ChangeSelection(item)
wx.TreeCtrl.SelectItem(self, item)
def UnselectAll(self):
self.selection = None
g.tools.UpdateUI()
wx.TreeCtrl.UnselectAll(self)
wx.Yield()
def ChangeSelection(self, item): def ChangeSelection(self, item):
# Apply changes # Apply changes
@@ -791,11 +812,12 @@ class XML_Tree(wx.TreeCtrl):
status = 'Changes were applied' status = 'Changes were applied'
if status: g.frame.SetStatusText(status) if status: g.frame.SetStatusText(status)
# Generate view # Generate view
self.selection = item if not item:
if not self.selection.IsOk():
self.selection = None self.selection = None
return return
xxx = self.GetPyData(self.selection) else:
self.selection = item
xxx = self.GetPyData(item)
# Update panel # Update panel
g.panel.SetData(xxx) g.panel.SetData(xxx)
# Update tools # Update tools
@@ -1076,7 +1098,9 @@ class XML_Tree(wx.TreeCtrl):
def OnSizeTestWin(self, evt): def OnSizeTestWin(self, evt):
# Update highlight after size change # Update highlight after size change
hl = g.testWin.highLight hl = g.testWin.highLight
if hl: hl.Replace(self.FindNodePos(hl.item), hl.obj.GetSize()) if hl:
hl.Replace(self.FindNodePos(hl.item), hl.obj.GetSize())
hl.Refresh()
#self.HighLight(g.testWin.highLight.item) #self.HighLight(g.testWin.highLight.item)
evt.Skip() evt.Skip()
@@ -1125,15 +1149,6 @@ class XML_Tree(wx.TreeCtrl):
return False return False
return not (self.IsExpanded(item) and self.GetChildrenCount(item, False)) return not (self.IsExpanded(item) and self.GetChildrenCount(item, False))
# Override to use like single-selection tree
def GetSelection(self):
return self.selection
def SelectItem(self, item):
self.UnselectAll()
self.ChangeSelection(item)
wx.TreeCtrl.SelectItem(self, item)
# Pull-down # Pull-down
def OnRightDown(self, evt): def OnRightDown(self, evt):
pullDownMenu = g.pullDownMenu pullDownMenu = g.pullDownMenu
@@ -1359,7 +1374,7 @@ class DropTarget(wx.PyDropTarget):
if not hl or hl.item != parentItem: if not hl or hl.item != parentItem:
g.testWin.highLightDT = updateHL(hl, HighLightDTBox, pos, size) g.testWin.highLightDT = updateHL(hl, HighLightDTBox, pos, size)
g.testWin.highLightDT.item = parentItem g.testWin.highLightDT.item = parentItem
g.tree.SetItemTextColour(parentItem, COLOUR_DT) g.tree.SetItemTextColour(parentItem, g.tree.COLOUR_DT)
g.tree.EnsureVisible(parentItem) g.tree.EnsureVisible(parentItem)
g.frame.SetStatusText('Drop target: %s' % parent.treeName()) g.frame.SetStatusText('Drop target: %s' % parent.treeName())
else: else:

View File

@@ -878,7 +878,6 @@ class Frame(wx.Frame):
self.modified = True self.modified = True
self.SetStatusText(status) self.SetStatusText(status)
def OnCutDelete(self, evt): def OnCutDelete(self, evt):
selected = tree.selection selected = tree.selection
if not selected: return # key pressed event if not selected: return # key pressed event
@@ -905,6 +904,7 @@ class Frame(wx.Frame):
index = tree.ItemFullIndex(selected) index = tree.ItemFullIndex(selected)
xxx = tree.GetPyData(selected) xxx = tree.GetPyData(selected)
parent = tree.GetPyData(tree.GetItemParent(selected)).treeObject() parent = tree.GetPyData(tree.GetItemParent(selected)).treeObject()
tree.UnselectAll()
elem = tree.RemoveLeaf(selected) elem = tree.RemoveLeaf(selected)
undoMan.RegisterUndo(UndoCutDelete(index, parent, elem)) undoMan.RegisterUndo(UndoCutDelete(index, parent, elem))
if evt.GetId() == wx.ID_CUT: if evt.GetId() == wx.ID_CUT:
@@ -922,10 +922,7 @@ class Frame(wx.Frame):
else: else:
wx.MessageBox("Unable to open the clipboard", "Error") wx.MessageBox("Unable to open the clipboard", "Error")
tree.pendingHighLight = None tree.pendingHighLight = None
tree.UnselectAll()
tree.selection = None
# Update tools # Update tools
g.tools.UpdateUI()
panel.Clear() panel.Clear()
self.SetModified() self.SetModified()
self.SetStatusText(status) self.SetStatusText(status)
@@ -1400,7 +1397,7 @@ Homepage: http://xrced.sourceforge.net\
panel.RemovePage(1) panel.RemovePage(1)
if not self.IsIconized(): if not self.IsIconized():
conf.x, conf.y = self.GetPosition() conf.x, conf.y = self.GetPosition()
conf.width, conf.height = self.GetSize() conf.width, conf.height = self.GetClientSize()
if conf.embedPanel: if conf.embedPanel:
conf.sashPos = self.splitter.GetSashPosition() conf.sashPos = self.splitter.GetSashPosition()
else: else:
@@ -1766,6 +1763,7 @@ Please upgrade wxWidgets to %d.%d.%d or higher.''' % MinWxVersion)
wx.FileSystem.AddHandler(wx.MemoryFSHandler()) wx.FileSystem.AddHandler(wx.MemoryFSHandler())
# Create main frame # Create main frame
frame = Frame(pos, size) frame = Frame(pos, size)
frame.SetClientSize(size)
frame.Show(True) frame.Show(True)
# Load plugins # Load plugins