summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--grc/gui/DrawingArea.py31
-rw-r--r--grc/gui/Notebook.py1
-rw-r--r--grc/gui/Utils.py2
-rw-r--r--grc/gui/canvas/block.py60
-rw-r--r--grc/gui/canvas/drawable.py5
-rw-r--r--grc/gui/canvas/flowgraph.py9
-rw-r--r--grc/gui/canvas/port.py18
7 files changed, 71 insertions, 55 deletions
diff --git a/grc/gui/DrawingArea.py b/grc/gui/DrawingArea.py
index 746666c287..2e26c265a9 100644
--- a/grc/gui/DrawingArea.py
+++ b/grc/gui/DrawingArea.py
@@ -43,6 +43,7 @@ class DrawingArea(Gtk.DrawingArea):
self._flow_graph = flow_graph
self.zoom_factor = 1.0
+ self._update_after_zoom = False
self.ctrl_mask = False
self.mod1_mask = False
self.button_state = [False] * 10
@@ -61,7 +62,7 @@ class DrawingArea(Gtk.DrawingArea):
Gdk.EventMask.SCROLL_MASK |
Gdk.EventMask.LEAVE_NOTIFY_MASK |
Gdk.EventMask.ENTER_NOTIFY_MASK
- #Gdk.EventMask.FOCUS_CHANGE_MASK
+ # Gdk.EventMask.FOCUS_CHANGE_MASK
)
# setup drag and drop
@@ -73,7 +74,9 @@ class DrawingArea(Gtk.DrawingArea):
# setup the focus flag
self._focus_flag = False
self.get_focus_flag = lambda: self._focus_flag
- def _handle_notify_event(widget, event, focus_flag): self._focus_flag = focus_flag
+
+ def _handle_notify_event(widget, event, focus_flag):
+ self._focus_flag = focus_flag
self.connect('leave-notify-event', _handle_notify_event, False)
self.connect('enter-notify-event', _handle_notify_event, True)
# todo: fix
@@ -81,7 +84,7 @@ class DrawingArea(Gtk.DrawingArea):
# self.connect('focus-out-event', self._handle_focus_lost_event)
##########################################################################
- ## Handlers
+ # Handlers
##########################################################################
def _handle_drag_data_received(self, widget, drag_context, x, y, selection_data, info, time):
"""
@@ -90,19 +93,13 @@ class DrawingArea(Gtk.DrawingArea):
self._flow_graph.add_new_block(selection_data.get_text(), (x, y))
def _handle_mouse_scroll(self, widget, event):
- if event.get_state() & Gdk.ModifierType.SHIFT_MASK:
- if event.direction == Gdk.ScrollDirection.UP:
- event.direction = Gdk.ScrollDirection.LEFT
- else:
- event.direction = Gdk.ScrollDirection.RIGHT
-
- elif event.get_state() & Gdk.ModifierType.CONTROL_MASK:
+ if event.get_state() & Gdk.ModifierType.CONTROL_MASK:
change = 1.2 if event.direction == Gdk.ScrollDirection.UP else 1/1.2
zoom_factor = min(max(self.zoom_factor * change, 0.1), 5.0)
if zoom_factor != self.zoom_factor:
self.zoom_factor = zoom_factor
- self._update_size()
+ self._update_after_zoom = True
self.queue_draw()
return True
@@ -157,7 +154,7 @@ class DrawingArea(Gtk.DrawingArea):
)
def _update_size(self):
- w, h = self._flow_graph.extent[2:]
+ w, h = self._flow_graph.get_extents()[2:]
self.set_size_request(w * self.zoom_factor + 100, h * self.zoom_factor + 100)
def _auto_scroll(self, event):
@@ -191,11 +188,19 @@ class DrawingArea(Gtk.DrawingArea):
def draw(self, widget, cr):
width = widget.get_allocated_width()
height = widget.get_allocated_height()
+
cr.set_source_rgba(*Colors.FLOWGRAPH_BACKGROUND_COLOR)
cr.rectangle(0, 0, width, height)
+ cr.fill()
cr.scale(self.zoom_factor, self.zoom_factor)
- cr.fill()
+ cr.set_line_width(2.0 / self.zoom_factor)
+
+ if self._update_after_zoom:
+ self._flow_graph.create_labels(cr)
+ self._flow_graph.create_shapes()
+ self._update_size()
+ self._update_after_zoom = False
self._flow_graph.draw(cr)
diff --git a/grc/gui/Notebook.py b/grc/gui/Notebook.py
index 080505acc9..e78b748326 100644
--- a/grc/gui/Notebook.py
+++ b/grc/gui/Notebook.py
@@ -37,7 +37,6 @@ class Notebook(Gtk.Notebook):
self.set_scrollable(True)
self.connect('switch-page', self._handle_page_change)
-
def _handle_page_change(self, notebook, page, page_num):
"""
Handle a page change. When the user clicks on a new tab,
diff --git a/grc/gui/Utils.py b/grc/gui/Utils.py
index 97c648c0a8..9c19daf0ba 100644
--- a/grc/gui/Utils.py
+++ b/grc/gui/Utils.py
@@ -114,7 +114,7 @@ def make_screenshot(flow_graph, file_path, transparent_bg=False):
if not file_path:
return
- x_min, y_min, x_max, y_max = flow_graph.extent
+ x_min, y_min, x_max, y_max = flow_graph.get_extents()
padding = Constants.CANVAS_GRID_SIZE
width = x_max - x_min + 2 * padding
height = y_max - y_min + 2 * padding
diff --git a/grc/gui/canvas/block.py b/grc/gui/canvas/block.py
index 182e29d197..3c1d7daa5a 100644
--- a/grc/gui/canvas/block.py
+++ b/grc/gui/canvas/block.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 __future__ import absolute_import
+from __future__ import absolute_import, division
import math
@@ -51,10 +51,10 @@ class Block(CoreBlock, Drawable):
Drawable.__init__(self) # needs the states and initial sizes
self._surface_layouts = [
- Gtk.DrawingArea().create_pango_layout(''), # title
- Gtk.DrawingArea().create_pango_layout(''), # params
+ None, # title
+ None, # params
]
- self._surface_layout_offsets = 0, 0
+ self._surface_layouts_offsets = 0, 0
self._comment_layout = None
self._area = []
@@ -149,9 +149,18 @@ class Block(CoreBlock, Drawable):
port.connector_length = Constants.CONNECTOR_EXTENSION_MINIMAL + \
Constants.CONNECTOR_EXTENSION_INCREMENT * index
- def create_labels(self):
+ def create_labels(self, cr=None):
"""Create the labels for the signal block."""
- title_layout, params_layout = self._surface_layouts
+
+ # (Re-)creating layouts here, because layout.context_changed() doesn't seems to work (after zoom)
+ title_layout, params_layout = self._surface_layouts = [
+ Gtk.DrawingArea().create_pango_layout(''), # title
+ Gtk.DrawingArea().create_pango_layout(''), # params
+ ]
+
+ if cr: # to fix up extents after zooming
+ PangoCairo.update_layout(cr, title_layout)
+ PangoCairo.update_layout(cr, params_layout)
title_layout.set_markup(
'<span {foreground} font_desc="{font}"><b>{name}</b></span>'.format(
@@ -159,7 +168,7 @@ class Block(CoreBlock, Drawable):
name=Utils.encode(self.name)
)
)
- title_width, title_height = title_layout.get_pixel_size()
+ title_width, title_height = title_layout.get_size()
# update the params layout
if not self.is_dummy_block:
@@ -170,13 +179,12 @@ class Block(CoreBlock, Drawable):
params_layout.set_spacing(LABEL_SEPARATION * Pango.SCALE)
params_layout.set_markup('\n'.join(markups))
- params_width, params_height = params_layout.get_pixel_size() if markups else (0, 0)
-
- label_width = max(title_width, params_width)
- label_height = title_height + LABEL_SEPARATION + params_height
+ params_width, params_height = params_layout.get_size() if markups else (0, 0)
- title_layout.set_width(label_width * Pango.SCALE)
- title_layout.set_alignment(Pango.Alignment.CENTER)
+ label_width = max(title_width, params_width) / Pango.SCALE
+ label_height = title_height / Pango.SCALE
+ if markups:
+ label_height += LABEL_SEPARATION + params_height / Pango.SCALE
# calculate width and height needed
width = label_width + 2 * BLOCK_LABEL_PADDING
@@ -207,11 +215,15 @@ class Block(CoreBlock, Drawable):
self.width, self.height = width, height = Utils.align_to_grid((width, height))
- self._surface_layout_offsets = [
- (width - label_width) / 2.0,
- (height - label_height) / 2.0
+ self._surface_layouts_offsets = [
+ (0, (height - label_height) / 2.0),
+ (0, (height - label_height) / 2.0 + LABEL_SEPARATION + title_height / Pango.SCALE)
]
+ title_layout.set_width(width * Pango.SCALE)
+ title_layout.set_alignment(Pango.Alignment.CENTER)
+ params_layout.set_indent((width - label_width) / 2.0 * Pango.SCALE)
+
self.create_comment_layout()
def create_port_labels(self):
@@ -269,14 +281,13 @@ class Block(CoreBlock, Drawable):
if self.is_vertical():
cr.rotate(-math.pi / 2)
cr.translate(-self.width, 0)
- cr.translate(*self._surface_layout_offsets)
-
cr.set_source_rgba(*self._font_color)
- for layout in self._surface_layouts:
+ for layout, offset in zip(self._surface_layouts, self._surface_layouts_offsets):
+ cr.save()
+ cr.translate(*offset)
PangoCairo.update_layout(cr, layout)
PangoCairo.show_layout(cr, layout)
- _, h = layout.get_pixel_size()
- cr.translate(0, h + LABEL_SEPARATION)
+ cr.restore()
def what_is_selected(self, coor, coor_m=None):
"""
@@ -314,13 +325,12 @@ class Block(CoreBlock, Drawable):
PangoCairo.show_layout(cr, self._comment_layout)
cr.restore()
- @property
- def extent(self):
- extent = Drawable.extent.fget(self)
+ def get_extents(self):
+ extent = Drawable.get_extents(self)
x, y = self.coordinate
for port in self.active_ports():
extent = (min_or_max(xy, offset + p_xy) for offset, min_or_max, xy, p_xy in zip(
- (x, y, x, y), (min, min, max, max), extent, port.extent
+ (x, y, x, y), (min, min, max, max), extent, port.get_extents()
))
return tuple(extent)
diff --git a/grc/gui/canvas/drawable.py b/grc/gui/canvas/drawable.py
index 12f88c27e8..d755d4418d 100644
--- a/grc/gui/canvas/drawable.py
+++ b/grc/gui/canvas/drawable.py
@@ -96,7 +96,7 @@ class Drawable(object):
dx, dy = delta_coor
self.coordinate = (x + dx, y + dy)
- def create_labels(self):
+ def create_labels(self, cr=None):
"""
Create labels (if applicable) and call on all children.
Call this base method before creating labels in the element.
@@ -168,8 +168,7 @@ class Drawable(object):
if x <= x1 <= x_m and y <= y1 <= y_m:
return self
- @property
- def extent(self):
+ def get_extents(self):
x_min, y_min = x_max, y_max = self.coordinate
x_min += min(x for x, y in self._bounding_points)
y_min += min(y for x, y in self._bounding_points)
diff --git a/grc/gui/canvas/flowgraph.py b/grc/gui/canvas/flowgraph.py
index ab432b382f..2aa0d7c12f 100644
--- a/grc/gui/canvas/flowgraph.py
+++ b/grc/gui/canvas/flowgraph.py
@@ -464,9 +464,9 @@ class FlowGraph(CoreFlowgraph, Drawable):
continue # skip hidden disabled blocks and connections
self._elements_to_draw.append(element)
- def create_labels(self):
+ def create_labels(self, cr=None):
for element in self._elements_to_draw:
- element.create_labels()
+ element.create_labels(cr)
def create_shapes(self):
for element in self._elements_to_draw:
@@ -743,11 +743,10 @@ class FlowGraph(CoreFlowgraph, Drawable):
self.coordinate = (x, y)
self.drawing_area.queue_draw()
- @property
- def extent(self):
+ def get_extents(self):
extent = 100000, 100000, 0, 0
for element in self._elements_to_draw:
extent = (min_or_max(xy, e_xy) for min_or_max, xy, e_xy in zip(
- (min, min, max, max), extent, element.extent
+ (min, min, max, max), extent, element.get_extents()
))
return tuple(extent)
diff --git a/grc/gui/canvas/port.py b/grc/gui/canvas/port.py
index bc40c9c56c..2ea55aaa22 100644
--- a/grc/gui/canvas/port.py
+++ b/grc/gui/canvas/port.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 __future__ import absolute_import
+from __future__ import absolute_import, division
import math
@@ -55,8 +55,7 @@ class Port(CorePort, Drawable):
self.width_with_label = self.height = 0
self.connector_length = 0
- self.label_layout = Gtk.DrawingArea().create_pango_layout('')
- self.label_layout.set_alignment(Pango.Alignment.CENTER)
+ self.label_layout = None
@property
def width(self):
@@ -103,8 +102,13 @@ class Port(CorePort, Drawable):
270: (self.height / 2, self.width)
}[self.get_connector_direction()]
- def create_labels(self):
+ def create_labels(self, cr=None):
"""Create the labels for the socket."""
+ self.label_layout = Gtk.DrawingArea().create_pango_layout('')
+ self.label_layout.set_alignment(Pango.Alignment.CENTER)
+
+ if cr:
+ PangoCairo.update_layout(cr, self.label_layout)
if self.domain in (Constants.GR_MESSAGE_DOMAIN, Constants.DEFAULT_DOMAIN):
self._line_width_factor = 1.0
@@ -117,10 +121,10 @@ class Port(CorePort, Drawable):
layout.set_markup('<span font_desc="{font}">{name}</span>'.format(
name=Utils.encode(self.name), font=Constants.PORT_FONT
))
- label_width, label_height = self.label_layout.get_pixel_size()
+ label_width, label_height = self.label_layout.get_size()
- self.width = 2 * Constants.PORT_LABEL_PADDING + label_width
- self.height = 2 * Constants.PORT_LABEL_PADDING + label_height
+ self.width = 2 * Constants.PORT_LABEL_PADDING + label_width / Pango.SCALE
+ self.height = 2 * Constants.PORT_LABEL_PADDING + label_height / Pango.SCALE
self._label_layout_offsets = [0, Constants.PORT_LABEL_PADDING]
if self.get_type() == 'bus':
self.height += Constants.PORT_EXTRA_BUS_HEIGHT