소스 검색

wxGUI: fix OnIdle after resizing

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@51400 15284696-431f-4ddb-bdfa-cd5b030d7da7
Markus Metz 13 년 전
부모
커밋
4670da41d6
1개의 변경된 파일43개의 추가작업 그리고 36개의 파일을 삭제
  1. 43 36
      gui/wxpython/mapdisp/mapwindow.py

+ 43 - 36
gui/wxpython/mapdisp/mapwindow.py

@@ -102,7 +102,7 @@ class BufferedWindow(MapWindow, wx.Window):
         self.redrawAll = True
         
         # will store an off screen empty bitmap for saving to file
-        self._buffer = None
+        self._buffer = wx.EmptyBitmap(max(1, self.Map.width), max(1, self.Map.height))
         
         self.Bind(wx.EVT_ERASE_BACKGROUND, lambda x:None)
         
@@ -315,7 +315,7 @@ class BufferedWindow(MapWindow, wx.Window):
         If self.redrawAll is False on self.pdcTmp content is re-drawn
         """
         Debug.msg(4, "BufferedWindow.OnPaint(): redrawAll=%s" % self.redrawAll)
-        dc = wx.BufferedPaintDC(self, self.buffer)
+        dc = wx.BufferedPaintDC(self, self._buffer)
         dc.Clear()
         
         # use PrepareDC to set position correctly
@@ -385,43 +385,50 @@ class BufferedWindow(MapWindow, wx.Window):
     def OnSize(self, event):
         """!Scale map image so that it is the same size as the Window
         """
-        Debug.msg(3, "BufferedWindow.OnSize():")
-        
-        # set size of the input image
-        self.Map.ChangeMapSize(self.GetClientSize())
-        # align extent based on center point and display resolution
-        # this causes that image is not resized when display windows is resized
-        ### self.Map.AlignExtentFromDisplay()
-        
-        # Make new off screen bitmap: this bitmap will always have the
-        # current drawing in it, so it can be used to save the image to
-        # a file, or whatever.
-        self.buffer = wx.EmptyBitmap(max(1, self.Map.width), max(1, self.Map.height))
-        
-        # get the image to be rendered
-        self.img = self.GetImage()
-        
-        # update map display
-        if self.img and self.Map.width + self.Map.height > 0: # scale image during resize
-            self.img = self.img.Scale(self.Map.width, self.Map.height)
-            if len(self.Map.GetListOfLayers()) > 0:
-                self.UpdateMap()
-        
         # re-render image on idle
-        self.resize = True
+        self.resize = time.clock()
 
-        # reposition checkbox in statusbar
-        self.parent.StatusbarReposition()
-        
-        # update statusbar
-        self.parent.StatusbarUpdate()
-        
     def OnIdle(self, event):
         """!Only re-render a composite map image from GRASS during
         idle time instead of multiple times during resizing.
         """
-        if self.resize:
-            self.UpdateMap(render = True)
+        
+        # use OnInternalIdle() instead ?
+
+        if self.resize and self.resize + 0.2 < time.clock():
+            Debug.msg(3, "BufferedWindow.OnSize():")
+            
+            # set size of the input image
+            self.Map.ChangeMapSize(self.GetClientSize())
+
+            # Make new off screen bitmap: this bitmap will always have the
+            # current drawing in it, so it can be used to save the image to
+            # a file, or whatever.
+            self._buffer.Destroy()
+            self._buffer = wx.EmptyBitmap(max(1, self.Map.width), max(1, self.Map.height))
+            
+            # get the image to be rendered
+            self.img = self.GetImage()
+            
+            # update map display
+            updatemap = True
+            if self.img and self.Map.width + self.Map.height > 0: # scale image after resize
+                self.img = self.img.Scale(self.Map.width, self.Map.height)
+                if len(self.Map.GetListOfLayers()) > 0:
+                    self.UpdateMap()
+                    updatemap = False
+
+            # reposition checkbox in statusbar
+            self.parent.StatusbarReposition()
+            
+            # update statusbar
+            self.parent.StatusbarUpdate()
+
+            if updatemap:
+                self.UpdateMap(render = True)
+            self.resize = False
+        elif self.resize:
+            event.RequestMore()
         
         event.Skip()
 
@@ -440,7 +447,7 @@ class BufferedWindow(MapWindow, wx.Window):
         
         self.Map.ChangeMapSize((width, height))
         ibuffer = wx.EmptyBitmap(max(1, width), max(1, height))
-        self.Map.Render(force = True, windres = True)
+        self.Map.Render(force = True, windres = False)
         img = self.GetImage()
         self.pdc.RemoveAll()
         self.Draw(self.pdc, img, drawid = 99)
@@ -449,7 +456,7 @@ class BufferedWindow(MapWindow, wx.Window):
         cSize = self.GetClientSizeTuple()
         ratio = float(width) / cSize[0], float(height) / cSize[1]
         
-        # redraw lagend, scalebar
+        # redraw legend, scalebar
         for img in self.GetOverlay():
             # draw any active and defined overlays
             if self.imagedict[img]['layer'].IsActive():
@@ -728,7 +735,7 @@ class BufferedWindow(MapWindow, wx.Window):
         dc.SetBackground(wx.Brush("White"))
         dc.Clear()
         
-        self.dragimg = wx.DragImage(self.buffer)
+        self.dragimg = wx.DragImage(self._buffer)
         self.dragimg.BeginDrag((0, 0), self)
         self.dragimg.GetImageRect(moveto)
         self.dragimg.Move(moveto)