summaryrefslogtreecommitdiff
path: root/grc
diff options
context:
space:
mode:
authorSebastian Koslowski <koslowski@kit.edu>2014-08-19 17:02:33 +0200
committerSebastian Koslowski <koslowski@kit.edu>2014-08-19 17:31:33 +0200
commit0dd158155c074113ec1cc6a3de7ecdd2be7d65e8 (patch)
treec29e8d9382426d23ae110187a6b2c375c8864bd9 /grc
parent842d8c9d9aac5f7a48a78a9d6babc865570b81c8 (diff)
grc: snap-to-grid (WIP)
Diffstat (limited to 'grc')
-rw-r--r--grc/gui/Block.py8
-rw-r--r--grc/gui/Constants.py5
-rw-r--r--grc/gui/FlowGraph.py11
-rw-r--r--grc/gui/Port.py10
-rw-r--r--grc/gui/Utils.py10
5 files changed, 31 insertions, 13 deletions
diff --git a/grc/gui/Block.py b/grc/gui/Block.py
index 0afb351647..589ed34de1 100644
--- a/grc/gui/Block.py
+++ b/grc/gui/Block.py
@@ -43,6 +43,8 @@ class Block(Element):
Block contructor.
Add graphics related params to the block.
"""
+ self.W = 0
+ self.H = 0
#add the position param
self.get_params().append(self.get_parent().get_parent().Param(
block=self,
@@ -85,6 +87,9 @@ class Block(Element):
y = 0
elif y >= fgH - BORDER_PROXIMITY_SENSITIVITY:
y = fgH - BORDER_PROXIMITY_SENSITIVITY
+ offset_x, offset_y = (0, self.H/2) if self.is_horizontal() else (self.H/2, 0)
+ x = Utils.align_to_grid(x + offset_x) - offset_x
+ y = Utils.align_to_grid(y + offset_y) - offset_y
return (x, y)
except:
self.set_coordinate((0, 0))
@@ -179,8 +184,7 @@ class Block(Element):
self.label_height + 2 * BLOCK_LABEL_PADDING
] +
[ # ports
- 2 * PORT_BORDER_SEPARATION +
- sum([port.H + PORT_SEPARATION for port in ports if not port.get_hide()]) - PORT_SEPARATION
+ PORT_SEPARATION * len(filter(lambda p: not p.get_hide(), ports))
for ports in (self.get_sources_gui(), self.get_sinks_gui())
] +
[ # bus ports only
diff --git a/grc/gui/Constants.py b/grc/gui/Constants.py
index 7fabcfc0a0..c82449b6b6 100644
--- a/grc/gui/Constants.py
+++ b/grc/gui/Constants.py
@@ -53,7 +53,7 @@ BLOCK_LABEL_PADDING = 7
PORT_LABEL_PADDING = 2
#port constraint dimensions
-PORT_SEPARATION = 17
+PORT_SEPARATION = 32
PORT_BORDER_SEPARATION = 9
PORT_MIN_WIDTH = 20
@@ -81,3 +81,6 @@ SCROLL_DISTANCE = 15
#How close the mouse click can be to a line and register a connection select.
LINE_SELECT_SENSITIVITY = 5
+
+# canvas grid size
+CANVAS_GRID_SIZE = 8 \ No newline at end of file
diff --git a/grc/gui/FlowGraph.py b/grc/gui/FlowGraph.py
index bfe8fbfa4f..4d2b1b6dd3 100644
--- a/grc/gui/FlowGraph.py
+++ b/grc/gui/FlowGraph.py
@@ -574,7 +574,7 @@ class FlowGraph(Element):
self.create_shapes()
self.queue_draw()
else:
- #perform autoscrolling
+ #perform auto-scrolling
width, height = self.get_size()
x, y = coordinate
h_adj = self.get_scroll_pane().get_hadjustment()
@@ -594,8 +594,11 @@ class FlowGraph(Element):
if len(self.get_selected_elements()) == 1 and self.get_selected_element().is_connection():
Actions.ELEMENT_DELETE()
#move the selected elements and record the new coordinate
- X, Y = self.get_coordinate()
- if not self.get_ctrl_mask(): self.move_selected((int(x - X), int(y - Y)))
- self.set_coordinate((x, y))
+ if not self.get_ctrl_mask():
+ X, Y = self.get_coordinate()
+ dX, dY = int(x - X), int(y - Y)
+ if abs(dX) >= Utils.CANVAS_GRID_SIZE or abs(dY) >= Utils.CANVAS_GRID_SIZE:
+ self.move_selected((dX, dY))
+ self.set_coordinate((x, y))
#queue draw for animation
self.queue_draw()
diff --git a/grc/gui/Port.py b/grc/gui/Port.py
index b81b162f6e..c56432d2b5 100644
--- a/grc/gui/Port.py
+++ b/grc/gui/Port.py
@@ -70,26 +70,26 @@ class Port(Element):
length = len(filter(lambda p: not p.get_hide(), ports))
#reverse the order of ports for these rotations
if rotation in (180, 270): index = length-index-1
- offset = (self.get_parent().H - length*self.H - (length-1)*PORT_SEPARATION)/2
+ offset = (self.get_parent().H - (length-1)*PORT_SEPARATION - self.H)/2
#create areas and connector coordinates
if (self.is_sink() and rotation == 0) or (self.is_source() and rotation == 180):
x = -1*W
- y = (PORT_SEPARATION+self.H)*index+offset
+ y = PORT_SEPARATION*index+offset
self.add_area((x, y), (W, self.H))
self._connector_coordinate = (x-1, y+self.H/2)
elif (self.is_source() and rotation == 0) or (self.is_sink() and rotation == 180):
x = self.get_parent().W
- y = (PORT_SEPARATION+self.H)*index+offset
+ y = PORT_SEPARATION*index+offset
self.add_area((x, y), (W, self.H))
self._connector_coordinate = (x+1+W, y+self.H/2)
elif (self.is_source() and rotation == 90) or (self.is_sink() and rotation == 270):
y = -1*W
- x = (PORT_SEPARATION+self.H)*index+offset
+ x = PORT_SEPARATION*index+offset
self.add_area((x, y), (self.H, W))
self._connector_coordinate = (x+self.H/2, y-1)
elif (self.is_sink() and rotation == 90) or (self.is_source() and rotation == 270):
y = self.get_parent().W
- x = (PORT_SEPARATION+self.H)*index+offset
+ x = PORT_SEPARATION*index+offset
self.add_area((x, y), (self.H, W))
self._connector_coordinate = (x+self.H/2, y+1+W)
#the connector length
diff --git a/grc/gui/Utils.py b/grc/gui/Utils.py
index ebd5aefca7..9a0a59cda7 100644
--- a/grc/gui/Utils.py
+++ b/grc/gui/Utils.py
@@ -17,7 +17,7 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
"""
-from Constants import POSSIBLE_ROTATIONS
+from Constants import POSSIBLE_ROTATIONS, CANVAS_GRID_SIZE
from Cheetah.Template import Template
import pygtk
pygtk.require('2.0')
@@ -108,3 +108,11 @@ def parse_template(tmpl_str, **kwargs):
# print tmpl_str
# print str(kwargs['param'].get_error_messages())
return str(Template(tmpl_str, kwargs))
+
+def align_to_grid(coor):
+ _align = lambda: int(round(x / (1.0 * CANVAS_GRID_SIZE)) * CANVAS_GRID_SIZE)
+ try:
+ return [_align() for x in coor]
+ except TypeError:
+ x = coor
+ return _align() \ No newline at end of file