瀏覽代碼

Modified drag and drop so that dragging above tree moves layer to top of tree and dragging below tree moves layer to bottom of tree.

Fixed bug in settings edit popup menu due to code left over from spin control opacity setting.

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@32535 15284696-431f-4ddb-bdfa-cd5b030d7da7
Michael Barton 16 年之前
父節點
當前提交
92bb670581
共有 1 個文件被更改,包括 30 次插入18 次删除
  1. 30 18
      gui/wxpython/gui_modules/wxgui_utils.py

+ 30 - 18
gui/wxpython/gui_modules/wxgui_utils.py

@@ -85,11 +85,11 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         self.layer_selected = None # ID of currently selected layer
         self.layer_selected = None # ID of currently selected layer
         self.saveitem = {}         # dictionary to preserve layer attributes for drag and drop
         self.saveitem = {}         # dictionary to preserve layer attributes for drag and drop
         self.first = True          # indicates if a layer is just added or not
         self.first = True          # indicates if a layer is just added or not
-        self.drag = False          # flag to indicate a drag event is in process
+        self.flag = ''             # flag for drag and drop hittest
         self.disp_idx = kargs['idx']
         self.disp_idx = kargs['idx']
         self.gismgr = kargs['gismgr']
         self.gismgr = kargs['gismgr']
         self.notebook = kargs['notebook']   # GIS Manager notebook for layer tree
         self.notebook = kargs['notebook']   # GIS Manager notebook for layer tree
-        self.treepg = parent      # notebook page holding layer tree
+        self.treepg = parent        # notebook page holding layer tree
         self.auimgr = kargs['auimgr']       # aui manager
         self.auimgr = kargs['auimgr']       # aui manager
 
 
         # init associated map display
         # init associated map display
@@ -183,6 +183,8 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         self.Bind(CT.EVT_TREE_ITEM_CHECKED,     self.OnLayerChecked)
         self.Bind(CT.EVT_TREE_ITEM_CHECKED,     self.OnLayerChecked)
         self.Bind(wx.EVT_TREE_DELETE_ITEM,      self.OnDeleteLayer)
         self.Bind(wx.EVT_TREE_DELETE_ITEM,      self.OnDeleteLayer)
         self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnLayerContextMenu)
         self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnLayerContextMenu)
+        #self.Bind(wx.EVT_TREE_BEGIN_DRAG,       self.OnDrag)
+        self.Bind(wx.EVT_TREE_END_DRAG,         self.OnEndDrag)
         #self.Bind(wx.EVT_TREE_END_LABEL_EDIT,   self.OnChangeLayerName)
         #self.Bind(wx.EVT_TREE_END_LABEL_EDIT,   self.OnChangeLayerName)
         self.Bind(wx.EVT_KEY_UP,                self.OnKeyUp)
         self.Bind(wx.EVT_KEY_UP,                self.OnKeyUp)
         # self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
         # self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
@@ -242,11 +244,6 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
                 ltype != "command": # properties
                 ltype != "command": # properties
             self.popupMenu.AppendSeparator()
             self.popupMenu.AppendSeparator()
             self.popupMenu.Append(self.popupID8, text=_("Change opacity level"))
             self.popupMenu.Append(self.popupID8, text=_("Change opacity level"))
-            if self.FindWindowById(self.GetPyData(self.layer_selected)[0]['ctrl']).GetName() == 'spinCtrl':
-                checked = True
-            else:
-                checked = False
-            self.popupMenu.Check(self.popupID8, checked)
             self.Bind(wx.EVT_MENU, self.OnPopupOpacityLevel, id=self.popupID8)
             self.Bind(wx.EVT_MENU, self.OnPopupOpacityLevel, id=self.popupID8)
             self.popupMenu.Append(self.popupID3, text=_("Properties"))
             self.popupMenu.Append(self.popupID3, text=_("Properties"))
             self.Bind(wx.EVT_MENU, self.OnPopupProperties, id=self.popupID3)
             self.Bind(wx.EVT_MENU, self.OnPopupProperties, id=self.popupID3)
@@ -829,7 +826,7 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         item    = event.GetItem()
         item    = event.GetItem()
         checked = item.IsChecked()
         checked = item.IsChecked()
         
         
-        if self.drag == False and self.first == False:
+        if self.first == False:
             # change active parameter for item in layers list in render.Map
             # change active parameter for item in layers list in render.Map
             if self.GetPyData(item)[0]['type'] == 'group':
             if self.GetPyData(item)[0]['type'] == 'group':
                 child, cookie = self.GetFirstChild(item)
                 child, cookie = self.GetFirstChild(item)
@@ -958,13 +955,21 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         self.layer_selected = event.GetItem()
         self.layer_selected = event.GetItem()
         if self.GetPyData(self.layer_selected)[0]['type'] == 'group':
         if self.GetPyData(self.layer_selected)[0]['type'] == 'group':
             self.SetItemImage(self.layer_selected, self.folder_open)
             self.SetItemImage(self.layer_selected, self.folder_open)
+    
+    def OnEndDrag(self, event):
+        self.StopDragging()
+        dropTarget = event.GetItem()
+        self.flag = self.HitTest(event.GetPoint())[1]
+        if self.IsValidDropTarget(dropTarget):
+            self.UnselectAll()
+            if dropTarget != None:
+                self.SelectItem(dropTarget)
+            self.OnDrop(dropTarget, self._dragItem)
+        elif dropTarget == None:
+            self.OnDrop(dropTarget, self._dragItem)
 
 
     def OnDrop(self, dropTarget, dragItem):
     def OnDrop(self, dropTarget, dragItem):
         # save everthing associated with item to drag
         # save everthing associated with item to drag
-        dropIndex = self.GetIndexOfItem(dropTarget)
-        dragIndex = self.GetIndexOfItem(dragItem)
-        
-        #Insert copy of layer in new position and delete original at old position
         try:
         try:
             old = dragItem  # make sure this member exists
             old = dragItem  # make sure this member exists
         except:
         except:
@@ -973,7 +978,7 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         Debug.msg (4, "LayerTree.OnDrop(): layer=%s" % \
         Debug.msg (4, "LayerTree.OnDrop(): layer=%s" % \
                    (self.GetItemText(dragItem)))
                    (self.GetItemText(dragItem)))
         
         
-        # recreate data layer
+        # recreate data layer, insert copy of layer in new position, and delete original at old position
         newItem  = self.RecreateItem (dragItem, dropTarget)
         newItem  = self.RecreateItem (dragItem, dropTarget)
 
 
         # if recreated layer is a group, also recreate its children
         # if recreated layer is a group, also recreate its children
@@ -1045,7 +1050,8 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
             windval = None
             windval = None
             data    = None
             data    = None
             
             
-        if dropTarget != None:
+        # decide where to put recreated item
+        if dropTarget != None and dropTarget != self.GetRootItem():
             if parent:
             if parent:
                 # new item is a group
                 # new item is a group
                 afteritem = parent
                 afteritem = parent
@@ -1066,10 +1072,16 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
                                        text=text, ct_type=1, wnd=newctrl, \
                                        text=text, ct_type=1, wnd=newctrl, \
                                        image=image, data=data)
                                        image=image, data=data)
         else:
         else:
-            # if dragItem not dropped on a layer or group, prepend it to the layer tree
-            newItem = self.PrependItem(self.root, text=text, \
-                                  ct_type=1, wnd=newctrl, image=image, \
-                                  data=data)
+            # if dragItem not dropped on a layer or group, append or prepend it to the layer tree
+            if self.flag & wx.TREE_HITTEST_ABOVE:
+                newItem = self.PrependItem(self.root, text=text, \
+                                      ct_type=1, wnd=newctrl, image=image, \
+                                      data=data)
+            elif (self.flag &  wx.TREE_HITTEST_BELOW) or (self.flag & wx.TREE_HITTEST_NOWHERE) \
+                     or (self.flag & wx.TREE_HITTEST_TOLEFT) or (self.flag & wx.TREE_HITTEST_TORIGHT):
+                newItem = self.AppendItem(self.root, text=text, \
+                                      ct_type=1, wnd=newctrl, image=image, \
+                                      data=data)
 
 
         #update new layer 
         #update new layer 
         self.SetPyData(newItem, self.GetPyData(dragItem))
         self.SetPyData(newItem, self.GetPyData(dragItem))