]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/wx/tools/XRCed/undo.py
fall back to DirectFB's builtin font if no fonts are configured
[wxWidgets.git] / wxPython / wx / tools / XRCed / undo.py
index a064264b946b830ae73931b3dc2017005ad427e8..52b20ecf9608eab24146007c84f82bc371dabc7a 100644 (file)
@@ -134,11 +134,11 @@ class UndoReplace:
         item = g.tree.ItemAtFullIndex(self.itemIndex)
         xxx = g.tree.GetPyData(item)
         # Replace with old element
-        parent = xxx.parent.element
+        parent = xxx.parent.node
         if xxx is self.xxx:   # sizeritem or notebookpage - replace child
-            parent.replaceChild(self.xxx.child.element, xxx.child.element)
+            parent.replaceChild(self.xxx.child.node, xxx.child.node)
         else:
-            parent.replaceChild(self.xxx.element, xxx.element)
+            parent.replaceChild(self.xxx.node, xxx.node)
         self.xxx.parent = xxx.parent
         xxx = self.xxx
         g.tree.SetPyData(item, xxx)
@@ -167,20 +167,23 @@ class UndoReplace:
 
 class UndoMove:
     def __init__(self, oldParent, oldIndex, newParent, newIndex):
-        self.oldParent = oldParent
+        # Store indexes because items can be invalid already
+        self.oldParentIndex = g.tree.ItemFullIndex(oldParent)
         self.oldIndex = oldIndex
-        self.newParent = newParent
+        self.newParentIndex = g.tree.ItemFullIndex(newParent)
         self.newIndex = newIndex
     def destroy(self):
         pass
     def undo(self):
-        item = g.tree.GetFirstChild(self.newParent)[0]
+        oldParent = g.tree.ItemAtFullIndex(self.oldParentIndex)
+        newParent = g.tree.ItemAtFullIndex(self.newParentIndex)
+        item = g.tree.GetFirstChild(newParent)[0]
         for i in range(self.newIndex): item = g.tree.GetNextSibling(item)
         elem = g.tree.RemoveLeaf(item)
-        nextItem = g.tree.GetFirstChild(self.oldParent)[0]
+        nextItem = g.tree.GetFirstChild(oldParent)[0]
         for i in range(self.oldIndex): nextItem = g.tree.GetNextSibling(nextItem) 
 
-        parent = g.tree.GetPyData(self.oldParent).treeObject()
+        parent = g.tree.GetPyData(oldParent).treeObject()
 
         # Check parent and child relationships.
         # If parent is sizer or notebook, child is of wrong class or
@@ -191,9 +194,9 @@ class UndoMove:
            ((parent.isSizer and not isinstance(xxx, xxxSizerItem)) or \
             (isinstance(parent, xxxNotebook) and not isinstance(xxx, xxxNotebookPage)) or \
            not (parent.isSizer or isinstance(parent, xxxNotebook))):
-            elem.removeChild(xxx.child.element) # detach child
+            elem.removeChild(xxx.child.node) # detach child
             elem.unlink()           # delete child container
-            elem = xxx.child.element # replace
+            elem = xxx.child.node # replace
             # This may help garbage collection
             xxx.child.parent = None
             isChildContainer = False
@@ -208,15 +211,21 @@ class UndoMove:
             pageElem.appendChild(elem)
             elem = pageElem
 
-        selected = g.tree.InsertNode(self.oldParent, parent, elem, nextItem)
+        selected = g.tree.InsertNode(oldParent, parent, elem, nextItem)
         g.tree.EnsureVisible(selected)
+        # Highlight is outdated
+        if g.testWin and g.testWin.highLight:
+            g.testWin.highLight.Remove()
+            g.tree.needUpdate = True
         g.tree.SelectItem(selected)
     def redo(self):
-        item = g.tree.GetFirstChild(self.oldParent)[0]
+        oldParent = g.tree.ItemAtFullIndex(self.oldParentIndex)
+        newParent = g.tree.ItemAtFullIndex(self.newParentIndex)
+        item = g.tree.GetFirstChild(oldParent)[0]
         for i in range(self.oldIndex): item = g.tree.GetNextSibling(item)
         elem = g.tree.RemoveLeaf(item)
 
-        parent = g.tree.GetPyData(self.newParent).treeObject()
+        parent = g.tree.GetPyData(newParent).treeObject()
 
         # Check parent and child relationships.
         # If parent is sizer or notebook, child is of wrong class or
@@ -227,9 +236,9 @@ class UndoMove:
            ((parent.isSizer and not isinstance(xxx, xxxSizerItem)) or \
             (isinstance(parent, xxxNotebook) and not isinstance(xxx, xxxNotebookPage)) or \
            not (parent.isSizer or isinstance(parent, xxxNotebook))):
-            elem.removeChild(xxx.child.element) # detach child
+            elem.removeChild(xxx.child.node) # detach child
             elem.unlink()           # delete child container
-            elem = xxx.child.element # replace
+            elem = xxx.child.node # replace
             # This may help garbage collection
             xxx.child.parent = None
             isChildContainer = False
@@ -244,10 +253,14 @@ class UndoMove:
             pageElem.appendChild(elem)
             elem = pageElem
 
-        nextItem = g.tree.GetFirstChild(self.newParent)[0]
+        nextItem = g.tree.GetFirstChild(newParent)[0]
         for i in range(self.newIndex): nextItem = g.tree.GetNextSibling(nextItem) 
-        selected = g.tree.InsertNode(self.newParent, parent, elem, nextItem)
+        selected = g.tree.InsertNode(newParent, parent, elem, nextItem)
         g.tree.EnsureVisible(selected)
+        # Highlight is outdated
+        if g.testWin and g.testWin.highLight:
+            g.testWin.highLight.Remove()
+            g.tree.needUpdate = True
         g.tree.SelectItem(selected)
 
 class UndoEdit:
@@ -274,7 +287,8 @@ class UndoEdit:
         # Save current state for redo
         map(ParamPage.SaveState, g.panel.pages)
         pages = map(ParamPage.GetState, g.panel.pages)
-        map(ParamPage.SetState, g.panel.pages, self.pages)
+        if self.pages:
+            map(ParamPage.SetState, g.panel.pages, self.pages)
         self.pages = pages
         self.update(selected)
     def redo(self):