summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Koslowski <koslowski@kit.edu>2016-07-30 14:31:05 +0200
committerSebastian Koslowski <koslowski@kit.edu>2016-08-03 21:43:24 +0200
commitab8ceb0c223c6521b112668df4580e93027e38e0 (patch)
treeaed6b62b879c0461ced7c672562299730b2bd69d
parent9b39ca3a9a2550c51ee934633ff9c655e1676a3b (diff)
grc: gtk3: draw ports before blocks and simplyfied draw code
-rw-r--r--grc/gui/Block.py23
-rw-r--r--grc/gui/Connection.py26
-rw-r--r--grc/gui/Element.py54
-rw-r--r--grc/gui/Port.py16
4 files changed, 52 insertions, 67 deletions
diff --git a/grc/gui/Block.py b/grc/gui/Block.py
index d1f67d6586..65039943d3 100644
--- a/grc/gui/Block.py
+++ b/grc/gui/Block.py
@@ -107,12 +107,10 @@ class Block(CoreBlock, Element):
def create_shapes(self):
"""Update the block, parameters, and ports when a change occurs."""
- self.clear()
-
if self.is_horizontal():
- self.areas.append([0, 0, self.width, self.height])
+ self.area = [0, 0, self.width, self.height]
elif self.is_vertical():
- self.areas.append([0, 0, self.height, self.width])
+ self.area = [0, 0, self.height, self.width]
bussified = self.current_bus_structure['source'], self.current_bus_structure['sink']
for ports, has_busses in zip((self.active_sources, self.active_sinks), bussified):
@@ -241,19 +239,24 @@ class Block(CoreBlock, Element):
else:
self._comment_layout = None
- def draw(self, widget, cr, border_color=None, bg_color=None):
+ def draw(self, widget, cr):
"""
Draw the signal block with label and inputs/outputs.
"""
- bg_color = self._bg_color
border_color = Colors.HIGHLIGHT_COLOR if self.highlighted else self._border_color
- # draw main block
- Element.draw(self, widget, cr, border_color, bg_color)
- for port in self.active_ports():
+ cr.translate(*self.coordinate)
+
+ for port in self.active_ports(): # ports first
cr.save()
- port.draw(widget, cr, border_color, bg_color)
+ port.draw(widget, cr, border_color)
cr.restore()
+ cr.rectangle(*self.area)
+ cr.set_source_rgb(*self._bg_color)
+ cr.fill_preserve()
+ cr.set_source_rgb(*border_color)
+ cr.stroke()
+
# title and params label
if self.is_vertical():
cr.rotate(-math.pi / 2)
diff --git a/grc/gui/Connection.py b/grc/gui/Connection.py
index 1c00845356..b1ae32ddcc 100644
--- a/grc/gui/Connection.py
+++ b/grc/gui/Connection.py
@@ -104,7 +104,6 @@ class Connection(Element, _Connection):
def _update_after_move(self):
"""Calculate coordinates."""
- self.clear()
source = self.source_port
sink = self.sink_port
source_dir = source.get_connector_direction()
@@ -136,7 +135,7 @@ class Connection(Element, _Connection):
points, alt = alt, points
# create 3-line connector
i1, i2 = points
- self.lines.append([p0, p1, i1, i2, p2, p3])
+ self.line = [p0, p1, i1, i2, p2, p3]
else:
# 2 possible points to create a right-angled connector
point, alt = [(x1, y2), (x2, y1)]
@@ -150,7 +149,7 @@ class Connection(Element, _Connection):
if Utils.get_angle_from_coordinates(point, p1) == source_dir:
point, alt = alt, point
# create right-angled connector
- self.lines.append([p0, p1, point, p2, p3])
+ self.line = [p0, p1, point, p2, p3]
def draw(self, widget, cr, border_color=None, bg_color=None):
"""
@@ -169,22 +168,27 @@ class Connection(Element, _Connection):
self._sink_coor = sink.parent_block.coordinate
self._source_coor = source.parent_block.coordinate
# draw
- color1, color2 = (
+ color1, color2, arrow_color = (
Colors.HIGHLIGHT_COLOR if self.highlighted else
Colors.CONNECTION_DISABLED_COLOR if not self.enabled else
- color for color in (self._color, self._color2))
+ color for color in (self._color, self._color2, self._arrow_color))
- Element.draw(self, widget, cr, color1, Colors.FLOWGRAPH_BACKGROUND_COLOR)
+ cr.translate(*self.coordinate)
+ for point in self.line:
+ cr.line_to(*point)
+ cr.set_source_rgb(*color1)
+ cr.stroke_preserve()
if color1 != color2:
cr.save()
- x_pos, y_pos = self.coordinate
- cr.translate(-x_pos, -y_pos)
cr.set_dash([5.0, 5.0], 5.0)
- Element.draw(self, widget, cr, color2, Colors.FLOWGRAPH_BACKGROUND_COLOR)
+ cr.set_source_rgb(*color2)
+ cr.stroke()
cr.restore()
- # draw arrow on sink port
- cr.set_source_rgb(*self._arrow_color)
+ else:
+ cr.new_path()
+
+ cr.set_source_rgb(*arrow_color)
cr.move_to(*self._arrow[0])
cr.line_to(*self._arrow[1])
cr.line_to(*self._arrow[2])
diff --git a/grc/gui/Element.py b/grc/gui/Element.py
index cdbf548941..30bc640127 100644
--- a/grc/gui/Element.py
+++ b/grc/gui/Element.py
@@ -45,13 +45,8 @@ class Element(object):
self.rotation = 0
self.highlighted = False
- self.areas = []
- self.lines = []
-
- def clear(self):
- """Empty the lines and areas."""
- del self.areas[:]
- del self.lines[:]
+ self.area = []
+ self.line = []
def is_horizontal(self, rotation=None):
"""
@@ -94,34 +89,11 @@ class Element(object):
Create shapes (if applicable) and call on all children.
Call this base method before creating shapes in the element.
"""
- self.clear()
for child in self.get_children():
child.create_shapes()
- def draw(self, widget, cr, border_color, bg_color):
- """
- Draw in the given window.
-
- Args:
- widget:
- cr:
- border_color: the color for lines and rectangle borders
- bg_color: the color for the inside of the rectangle
- """
- cr.translate(*self.coordinate)
- for area in self.areas:
- cr.set_source_rgb(*bg_color)
- cr.rectangle(*area)
- cr.fill()
- cr.set_source_rgb(*border_color)
- cr.rectangle(*area)
- cr.stroke()
-
- cr.set_source_rgb(*border_color)
- for line in self.lines:
- for point in line:
- cr.line_to(*point)
- cr.stroke()
+ def draw(self, widget, cr):
+ raise NotImplementedError()
def rotate(self, rotation):
"""
@@ -168,7 +140,8 @@ class Element(object):
if coor_m:
x_m, y_m = [a - b for a, b in zip(coor_m, self.coordinate)]
# handle rectangular areas
- for x1, y1, w, h in self.areas:
+ if self.area:
+ x1, y1, w, h = self.area
if (
in_between(x1, x, x_m) and in_between(y1, y, y_m) or
in_between(x1 + w, x, x_m) and in_between(y1, y, y_m) or
@@ -177,9 +150,9 @@ class Element(object):
):
return self
# handle horizontal or vertical lines
- for line in self.lines:
- last_point = line[0]
- for x2, y2 in line[1:]:
+ elif self.line:
+ last_point = self.line[0]
+ for x2, y2 in self.line[1:]:
(x1, y1), last_point = last_point, (x2, y2)
if (
in_between(x1, x, x_m) and in_between(y1, y, y_m) or
@@ -189,13 +162,14 @@ class Element(object):
return None
else:
# handle rectangular areas
- for x1, y1, w, h in self.areas:
+ if self.area:
+ x1, y1, w, h = self.area
if in_between(x, x1, x1+w) and in_between(y, y1, y1+h):
return self
# handle horizontal or vertical lines
- for line in self.lines:
- last_point = line[0]
- for x2, y2 in line[1:]:
+ elif self.line:
+ last_point = self.line[0]
+ for x2, y2 in self.line[1:]:
(x1, y1), last_point = last_point, (x2, y2)
if x1 == x2:
x1, x2 = x1 - LINE_SELECT_SENSITIVITY, x2 + LINE_SELECT_SENSITIVITY
diff --git a/grc/gui/Port.py b/grc/gui/Port.py
index 6776963c63..5e7d9cab68 100644
--- a/grc/gui/Port.py
+++ b/grc/gui/Port.py
@@ -78,12 +78,10 @@ class Port(_Port, Element):
def create_shapes(self):
"""Create new areas and labels for the port."""
- self.clear()
-
if self.is_horizontal():
- self.areas.append([0, 0, self.width, self.height])
+ self.area = [0, 0, self.width, self.height]
elif self.is_vertical():
- self.areas.append([0, 0, self.height, self.width])
+ self.area = [0, 0, self.height, self.width]
self._connector_coordinate = {
0: (self.width, self.height / 2),
@@ -116,12 +114,18 @@ class Port(_Port, Element):
self._label_layout_offsets[1] += Constants.PORT_EXTRA_BUS_HEIGHT / 2
self.height += self.height % 2 # uneven height
- def draw(self, widget, cr, border_color, bg_color):
+ def draw(self, widget, cr, border_color):
"""
Draw the socket with a label.
"""
cr.set_line_width(self._line_width_factor * cr.get_line_width())
- Element.draw(self, widget, cr, border_color, self._bg_color)
+ cr.translate(*self.coordinate)
+
+ cr.rectangle(*self.area)
+ cr.set_source_rgb(*self._bg_color)
+ cr.fill_preserve()
+ cr.set_source_rgb(*border_color)
+ cr.stroke()
if not self._show_label:
return # this port is folded (no label)