Viewer.py
changeset 331 9106d66bd204
parent 330 d803ba077da0
child 332 555124c752ec
--- a/Viewer.py	Wed Mar 18 16:42:12 2009 +0100
+++ b/Viewer.py	Thu Mar 19 18:10:12 2009 +0100
@@ -1068,6 +1068,14 @@
                 elements.append(element)
         return elements
 
+    def SelectAll(self):
+        if self.SelectedElement is not None:
+            self.SelectedElement.SetSelected(False)
+        self.SelectedElement = Graphic_Group(self)
+        for element in self.GetElements():
+            self.SelectedElement.SelectElement(element)
+        self.SelectedElement.SetSelected(True)
+    
 #-------------------------------------------------------------------------------
 #                           Popup menu functions
 #-------------------------------------------------------------------------------
@@ -1285,7 +1293,7 @@
         if self.Mode == MODE_SELECTION:
             dc = self.GetLogicalDC()
             pos = event.GetLogicalPosition(dc)
-            if event.ShiftDown() and self.SelectedElement is not None:
+            if event.ShiftDown() and not event.ControlDown() and self.SelectedElement is not None:
                 element = self.FindElement(pos, True)
                 if element is not None:
                     if isinstance(self.SelectedElement, Graphic_Group):
@@ -1487,8 +1495,15 @@
         if self.Mode == MODE_SELECTION and self.SelectedElement is not None:
             if self.Debug:
                 Graphic_Element.OnLeftDClick(self.SelectedElement, event, self.GetLogicalDC(), self.Scaling)
-            elif event.ControlDown() and self.IsBlock(self.SelectedElement) and self.SelectedElement.GetType() in self.Controler.GetProjectPouNames(self.Debug):
-                self.ParentWindow.EditProjectElement(ITEM_POU, self.SelectedElement.GetType())
+            elif event.ControlDown() and not event.ShiftDown():
+                if self.IsBlock(self.SelectedElement) and self.SelectedElement.GetType() in self.Controler.GetProjectPouNames(self.Debug):
+                    self.ParentWindow.EditProjectElement(ITEM_POU, self.SelectedElement.GetType())
+            elif event.ControlDown() and event.ShiftDown():
+                movex, movey = self.SelectedElement.AdjustToScaling(self.Scaling)
+                self.SelectedElement.RefreshModel()
+                self.RefreshBuffer()
+                if movex != 0 or movey != 0:
+                    self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)), False)
             else:
                 self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling)
         event.Skip()
@@ -1502,8 +1517,8 @@
                 new_pos = event.GetPosition()
                 xmax = self.GetScrollRange(wx.HORIZONTAL) - self.GetScrollThumb(wx.HORIZONTAL)
                 ymax = self.GetScrollRange(wx.VERTICAL) - self.GetScrollThumb(wx.VERTICAL)
-                scrollx = max(0, self.StartScreenPos[0] + (new_pos[0] - self.StartMousePos[0]) * self.ViewScale[0] / SCROLLBAR_UNIT)
-                scrolly = max(0, self.StartScreenPos[1] + (new_pos[1] - self.StartMousePos[1]) * self.ViewScale[1] / SCROLLBAR_UNIT)
+                scrollx = max(0, self.StartScreenPos[0] - (new_pos[0] - self.StartMousePos[0]) / SCROLLBAR_UNIT)
+                scrolly = max(0, self.StartScreenPos[1] - (new_pos[1] - self.StartMousePos[1]) / SCROLLBAR_UNIT)
                 if scrollx > xmax or scrolly > ymax:
                     self.RefreshScrollBars(max(0, scrollx - xmax), max(0, scrolly - ymax))
                     self.Scroll(scrollx, scrolly)
@@ -2692,8 +2707,10 @@
                 dc = self.GetLogicalDC()
                 pos = event.GetLogicalPosition(dc)
                 mouse_pos = event.GetPosition()
-                factor = 0.75 ** rotation
-                self.SetScale(self.ViewScale[0] * factor, self.ViewScale[1] * factor)
+                factor = 1.414 ** rotation
+                xscale = max(0.125, min(self.ViewScale[0] * factor, 8))
+                yscale = max(0.125, min(self.ViewScale[0] * factor, 8))
+                self.SetScale(xscale, yscale)
                 self.Scroll(round(pos.x * self.ViewScale[0] - mouse_pos.x) / SCROLLBAR_UNIT,
                             round(pos.y * self.ViewScale[1] - mouse_pos.y) / SCROLLBAR_UNIT)
                 self.RefreshScrollBars()
@@ -2731,17 +2748,17 @@
             width, height = self.GetVirtualSize()
             width = int(max(width, xstart * SCROLLBAR_UNIT + window_size[0]) / self.ViewScale[0])
             height = int(max(height, ystart * SCROLLBAR_UNIT + window_size[1]) / self.ViewScale[1])
-            dc.DrawRectangle(0, 0, width, height)
+            dc.DrawRectangle(1, 1, width, height)
         if self.PageSize is not None and not printing:
             dc.SetPen(self.PagePen)
             xstart, ystart = self.GetViewStart()
             window_size = self.GetClientSize()
-            for x in xrange(self.PageSize[0] - (xstart * SCROLLBAR_UNIT) % self.PageSize[0], window_size[0], self.PageSize[0]):
-                dc.DrawLine(xstart * SCROLLBAR_UNIT + x + 1, ystart * SCROLLBAR_UNIT, 
-                            xstart * SCROLLBAR_UNIT + x + 1, ystart * SCROLLBAR_UNIT + window_size[1])
-            for y in xrange(self.PageSize[1] - (ystart * SCROLLBAR_UNIT) % self.PageSize[1], window_size[1], self.PageSize[1]):
-                dc.DrawLine(xstart * SCROLLBAR_UNIT, ystart * SCROLLBAR_UNIT + y + 1, 
-                            xstart * SCROLLBAR_UNIT + window_size[0], ystart * SCROLLBAR_UNIT + y + 1)
+            for x in xrange(self.PageSize[0] - (xstart * SCROLLBAR_UNIT) % self.PageSize[0], int(window_size[0] / self.ViewScale[0]), self.PageSize[0]):
+                dc.DrawLine(xstart * SCROLLBAR_UNIT + x + 1, int(ystart * SCROLLBAR_UNIT / self.ViewScale[0]), 
+                            xstart * SCROLLBAR_UNIT + x + 1, int((ystart * SCROLLBAR_UNIT + window_size[1]) / self.ViewScale[0]))
+            for y in xrange(self.PageSize[1] - (ystart * SCROLLBAR_UNIT) % self.PageSize[1], int(window_size[1] / self.ViewScale[1]), self.PageSize[1]):
+                dc.DrawLine(int(xstart * SCROLLBAR_UNIT / self.ViewScale[0]), ystart * SCROLLBAR_UNIT + y + 1, 
+                            int((xstart * SCROLLBAR_UNIT + window_size[0]) / self.ViewScale[1]), ystart * SCROLLBAR_UNIT + y + 1)
         
         # Draw all elements
         for comment in self.Comments: