# HG changeset patch # User laurent # Date 1333288299 -7200 # Node ID baab9eb5b8ad0e1141c60db487de57e1830b09d0 # Parent d4bb66691248bf62b0d7bb5df658a7c43a60cb06 Improving move of elements using arrow keys in Viewer diff -r d4bb66691248 -r baab9eb5b8ad Viewer.py --- a/Viewer.py Sat Mar 31 15:08:18 2012 +0200 +++ b/Viewer.py Sun Apr 01 15:51:39 2012 +0200 @@ -23,6 +23,7 @@ #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import math +import time from types import TupleType from threading import Lock @@ -542,6 +543,7 @@ self.InstancePath = instancepath self.StartMousePos = None self.StartScreenPos = None + self.Buffering = False # Initialize Cursors ResetCursors() @@ -881,9 +883,24 @@ # Buffer the last model state def RefreshBuffer(self): self.Controler.BufferProject() - self.ParentWindow.RefreshTitle() - self.ParentWindow.RefreshFileMenu() - self.ParentWindow.RefreshEditMenu() + if self.ParentWindow: + self.ParentWindow.RefreshTitle() + self.ParentWindow.RefreshFileMenu() + self.ParentWindow.RefreshEditMenu() + + def StartBuffering(self): + if not self.Buffering: + self.Buffering = True + self.Controler.StartBuffering() + if self.ParentWindow: + self.ParentWindow.RefreshTitle() + self.ParentWindow.RefreshFileMenu() + self.ParentWindow.RefreshEditMenu() + + def ResetBuffer(self): + if self.Buffering: + self.Controler.EndBuffering() + self.Buffering = False def GetBufferState(self): if not self.Debug: @@ -976,6 +993,7 @@ # Start by reseting Viewer self.Flush() self.ResetView() + self.ResetBuffer() instance = {} # List of ids of already loaded blocks ids = [] @@ -1439,6 +1457,7 @@ def OnViewerMouseEvent(self, event): if not event.Entering(): + self.ResetBuffer() element = None if not event.Leaving() and not event.LeftUp() and not event.LeftDClick(): element = self.FindElement(event, True, False) @@ -1808,6 +1827,13 @@ # Keyboard event functions #------------------------------------------------------------------------------- + ARROW_KEY_MOVE = { + wx.WXK_LEFT: (-1, 0), + wx.WXK_RIGHT: (1, 0), + wx.WXK_UP: (0, -1), + wx.WXK_DOWN: (0, 1), + } + def OnChar(self, event): xpos, ypos = self.GetScrollPos(wx.HORIZONTAL), self.GetScrollPos(wx.VERTICAL) xmax = self.GetScrollRange(wx.HORIZONTAL) - self.GetScrollThumb(wx.HORIZONTAL) @@ -1827,62 +1853,29 @@ self.RefreshRect(self.GetScrolledRect(rect), False) elif not self.Debug and keycode == wx.WXK_RETURN and self.SelectedElement is not None: self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling) - elif keycode == wx.WXK_LEFT: + elif self.ARROW_KEY_MOVE.has_key(keycode): + move = self.ARROW_KEY_MOVE[keycode] if event.ControlDown() and event.ShiftDown(): - self.Scroll(0, ypos) + self.Scroll({-1: 0, 0: xpos, 1: xmax}[move[0]], + {-1: 0, 0: ypos, 1: ymax}[move[1]]) self.RefreshVisibleElements() elif event.ControlDown(): - self.Scroll(xpos - 1, ypos) + self.Scroll(xpos + move[0], ypos + move[1]) self.RefreshScrollBars() self.RefreshVisibleElements() elif not self.Debug and self.SelectedElement is not None: - self.SelectedElement.Move(-scaling[0], 0) + movex, movey = move + if not event.AltDown() or event.ShiftDown(): + movex *= scaling[0] + movey *= scaling[1] + if event.ShiftDown() and not event.AltDown(): + movex *= 10 + movey *= 10 + self.SelectedElement.Move(movex, movey) + self.StartBuffering() self.SelectedElement.RefreshModel() - self.RefreshBuffer() self.RefreshScrollBars() - self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(-scaling[0], 0)), False) - elif keycode == wx.WXK_RIGHT: - if event.ControlDown() and event.ShiftDown(): - self.Scroll(xmax, ypos) - self.RefreshVisibleElements() - elif event.ControlDown(): - self.RefreshScrollBars(width_incr=max(0, xpos + 1 - xmax)) - self.Scroll(xpos + 1, ypos) - self.RefreshVisibleElements() - elif not self.Debug and self.SelectedElement is not None: - self.SelectedElement.Move(scaling[0], 0) - self.SelectedElement.RefreshModel() - self.RefreshBuffer() - self.RefreshScrollBars() - self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(scaling[0], 0)), False) - elif keycode == wx.WXK_UP: - if event.ControlDown() and event.ShiftDown(): - self.Scroll(xpos, 0) - self.RefreshVisibleElements() - elif event.ControlDown(): - self.Scroll(xpos, ypos - 1) - self.RefreshScrollBars() - self.RefreshVisibleElements() - elif not self.Debug and self.SelectedElement is not None: - self.SelectedElement.Move(0, -scaling[1]) - self.SelectedElement.RefreshModel() - self.RefreshBuffer() - self.RefreshScrollBars() - self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(0, -scaling[1])), False) - elif keycode == wx.WXK_DOWN: - if event.ControlDown() and event.ShiftDown(): - self.Scroll(xpos, ymax) - self.RefreshVisibleElements() - elif event.ControlDown(): - self.RefreshScrollBars(height_incr=max(0, ypos + 1 - ymax)) - self.Scroll(xpos, ypos + 1) - self.RefreshVisibleElements() - elif not self.Debug and self.SelectedElement is not None: - self.SelectedElement.Move(0, scaling[1]) - self.SelectedElement.RefreshModel() - self.RefreshBuffer() - self.RefreshScrollBars() - self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(0, scaling[1])), False) + self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)), False) elif not self.Debug and keycode == wx.WXK_SPACE and self.SelectedElement is not None and self.SelectedElement.Dragging: if self.IsBlock(self.SelectedElement) or self.IsComment(self.SelectedElement): block = self.CopyBlock(self.SelectedElement, wx.Point(*self.SelectedElement.GetPosition())) diff -r d4bb66691248 -r baab9eb5b8ad graphics/GraphicCommons.py --- a/graphics/GraphicCommons.py Sat Mar 31 15:08:18 2012 +0200 +++ b/graphics/GraphicCommons.py Sun Apr 01 15:51:39 2012 +0200 @@ -933,8 +933,8 @@ # Moves the element def Move(self, dx, dy, exclude = []): - self.Pos.x += dx - self.Pos.y += dy + self.Pos.x += max(-self.BoundingBox.x, dx) + self.Pos.y += max(-self.BoundingBox.y, dy) self.RefreshConnected(exclude) self.RefreshBoundingBox() @@ -1311,6 +1311,8 @@ # Move this group of elements def Move(self, movex, movey): + movex = max(-self.BoundingBox.x, movex) + movey = max(-self.BoundingBox.y, movey) # Move all the elements of the group for element in self.Elements: if not isinstance(element, Wire):