diff options
Diffstat (limited to 'grc')
-rw-r--r-- | grc/base/Block.py | 2 | ||||
-rw-r--r-- | grc/base/FlowGraph.py | 2 | ||||
-rw-r--r-- | grc/blocks/pad_sink.xml | 15 | ||||
-rw-r--r-- | grc/blocks/pad_source.xml | 16 | ||||
-rw-r--r-- | grc/grc_gnuradio/usrp/dual_usrp.py | 2 | ||||
-rw-r--r-- | grc/grc_gnuradio/usrp/simple_usrp.py | 2 | ||||
-rw-r--r-- | grc/grc_gnuradio/wxgui/top_block_gui.py | 1 | ||||
-rw-r--r-- | grc/gui/ActionHandler.py | 1 | ||||
-rw-r--r-- | grc/gui/Block.py | 21 | ||||
-rw-r--r-- | grc/gui/Dialogs.py | 1 | ||||
-rw-r--r-- | grc/gui/Element.py | 3 | ||||
-rw-r--r-- | grc/gui/FlowGraph.py | 1 | ||||
-rw-r--r-- | grc/gui/Param.py | 10 | ||||
-rw-r--r-- | grc/gui/Port.py | 13 | ||||
-rw-r--r-- | grc/gui/Utils.py | 23 | ||||
-rw-r--r-- | grc/python/Constants.py | 1 | ||||
-rw-r--r-- | grc/python/FlowGraph.py | 36 | ||||
-rw-r--r-- | grc/python/Param.py | 1 | ||||
-rw-r--r-- | grc/python/convert_hier.py | 14 | ||||
-rw-r--r-- | grc/python/flow_graph.tmpl | 18 |
20 files changed, 94 insertions, 89 deletions
diff --git a/grc/base/Block.py b/grc/base/Block.py index b2015cc40..42eb6b3fb 100644 --- a/grc/base/Block.py +++ b/grc/base/Block.py @@ -19,8 +19,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA from . import odict from Element import Element -from Param import Param -from Port import Port from Cheetah.Template import Template from UserDict import UserDict diff --git a/grc/base/FlowGraph.py b/grc/base/FlowGraph.py index 7c51ef42a..b4ac8fc3a 100644 --- a/grc/base/FlowGraph.py +++ b/grc/base/FlowGraph.py @@ -19,8 +19,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA from . import odict from Element import Element -from Block import Block -from Connection import Connection from .. gui import Messages class FlowGraph(Element): diff --git a/grc/blocks/pad_sink.xml b/grc/blocks/pad_sink.xml index 734526793..2e9495260 100644 --- a/grc/blocks/pad_sink.xml +++ b/grc/blocks/pad_sink.xml @@ -9,10 +9,10 @@ <key>pad_sink</key> <make></make> <param> - <name>Num Inputs</name> - <key>nports</key> - <value>1</value> - <type>int</type> + <name>Label</name> + <key>label</key> + <value>out</value> + <type>string</type> </param> <param> <name>Input Type</name> @@ -51,15 +51,14 @@ <type>int</type> </param> <check>$vlen > 0</check> - <check>0 < $nports</check> <sink> <name>in</name> <type>$type</type> <vlen>$vlen</vlen> - <nports>$nports</nports> </sink> <doc> -The inputs of this block will become the outputs to this flow graph when it is instantiated as a hierarchical block. \ -Limit one sink pad block per flow graph. +The inputs of this block will become the outputs to this flow graph when it is instantiated as a hierarchical block. + +Pad sink will be ordered alphabetically by their ids. The first pad sink will have an index of 0. </doc> </block> diff --git a/grc/blocks/pad_source.xml b/grc/blocks/pad_source.xml index f44d96238..7b2210cbb 100644 --- a/grc/blocks/pad_source.xml +++ b/grc/blocks/pad_source.xml @@ -9,10 +9,10 @@ <key>pad_source</key> <make></make> <param> - <name>Num Outputs</name> - <key>nports</key> - <value>1</value> - <type>int</type> + <name>Label</name> + <key>label</key> + <value>in</value> + <type>string</type> </param> <param> <name>Output Type</name> @@ -51,16 +51,14 @@ <type>int</type> </param> <check>$vlen > 0</check> - <check>0 < $nports</check> <source> <name>out</name> <type>$type</type> <vlen>$vlen</vlen> - <nports>$nports</nports> </source> <doc> -The outputs of this block will become the inputs to this flow graph when it is instantiated as a hierarchical block. \ -Limit one source pad block per flow graph. \ -The "pad sink id" will be ignored in this mode. +The outputs of this block will become the inputs to this flow graph when it is instantiated as a hierarchical block. + +Pad sources will be ordered alphabetically by their ids. The first pad source will have an index of 0. </doc> </block> diff --git a/grc/grc_gnuradio/usrp/dual_usrp.py b/grc/grc_gnuradio/usrp/dual_usrp.py index 3692e1760..b26dbddd4 100644 --- a/grc/grc_gnuradio/usrp/dual_usrp.py +++ b/grc/grc_gnuradio/usrp/dual_usrp.py @@ -19,7 +19,7 @@ # import common -from gnuradio import gr, usrp +from gnuradio import gr #################################################################### # Dual USRP Source diff --git a/grc/grc_gnuradio/usrp/simple_usrp.py b/grc/grc_gnuradio/usrp/simple_usrp.py index fc4c75bf0..fb7a39570 100644 --- a/grc/grc_gnuradio/usrp/simple_usrp.py +++ b/grc/grc_gnuradio/usrp/simple_usrp.py @@ -19,7 +19,7 @@ # import common -from gnuradio import gr, usrp +from gnuradio import gr #################################################################### # Simple USRP Source diff --git a/grc/grc_gnuradio/wxgui/top_block_gui.py b/grc/grc_gnuradio/wxgui/top_block_gui.py index 998575897..333ccf1c1 100644 --- a/grc/grc_gnuradio/wxgui/top_block_gui.py +++ b/grc/grc_gnuradio/wxgui/top_block_gui.py @@ -19,7 +19,6 @@ # import wx -import sys, os from gnuradio import gr import panel diff --git a/grc/gui/ActionHandler.py b/grc/gui/ActionHandler.py index ee3e19a6c..108e23a23 100644 --- a/grc/gui/ActionHandler.py +++ b/grc/gui/ActionHandler.py @@ -29,7 +29,6 @@ import Preferences from threading import Thread import Messages from .. base import ParseXML -import random from MainWindow import MainWindow from PropsDialog import PropsDialog import Dialogs diff --git a/grc/gui/Block.py b/grc/gui/Block.py index 8c65bf06f..27143e070 100644 --- a/grc/gui/Block.py +++ b/grc/gui/Block.py @@ -29,6 +29,7 @@ from Constants import \ import pygtk pygtk.require('2.0') import gtk +import pango BLOCK_MARKUP_TMPL="""\ #set $foreground = $block.is_valid() and 'black' or 'red' @@ -130,8 +131,11 @@ class Block(Element): layout.set_markup(Utils.parse_template(BLOCK_MARKUP_TMPL, block=self)) self.label_width, self.label_height = layout.get_pixel_size() #display the params - for param in filter(lambda p: p.get_hide() not in ('all', 'part'), self.get_params()): - layout = param.get_layout() + markups = [param.get_markup() for param in self.get_params() if param.get_hide() not in ('all', 'part')] + if markups: + layout = gtk.DrawingArea().create_pango_layout('') + layout.set_spacing(LABEL_SEPARATION*pango.SCALE) + layout.set_markup('\n'.join(markups)) layouts.append(layout) w,h = layout.get_pixel_size() self.label_width = max(w, self.label_width) @@ -151,12 +155,11 @@ class Block(Element): else: w_off = 0 pixmap.draw_layout(gc, w_off, h_off, layout) h_off = h + h_off + LABEL_SEPARATION - #create vertical and horizontal images - self.horizontal_label = image = pixmap.get_image(0, 0, width, height) + #create vertical and horizontal pixmaps + self.horizontal_label = pixmap if self.is_vertical(): - self.vertical_label = vimage = gtk.gdk.Image(gtk.gdk.IMAGE_NORMAL, pixmap.get_visual(), height, width) - for i in range(width): - for j in range(height): vimage.put_pixel(j, width-i-1, image.get_pixel(i, j)) + self.vertical_label = self.get_parent().new_pixmap(height, width) + Utils.rotate_pixmap(gc, self.horizontal_label, self.vertical_label) #calculate width and height needed self.W = self.label_width + 2*BLOCK_LABEL_PADDING self.H = max(*( @@ -179,9 +182,9 @@ class Block(Element): ) #draw label image if self.is_horizontal(): - window.draw_image(gc, self.horizontal_label, 0, 0, x+BLOCK_LABEL_PADDING, y+(self.H-self.label_height)/2, -1, -1) + window.draw_drawable(gc, self.horizontal_label, 0, 0, x+BLOCK_LABEL_PADDING, y+(self.H-self.label_height)/2, -1, -1) elif self.is_vertical(): - window.draw_image(gc, self.vertical_label, 0, 0, x+(self.H-self.label_height)/2, y+BLOCK_LABEL_PADDING, -1, -1) + window.draw_drawable(gc, self.vertical_label, 0, 0, x+(self.H-self.label_height)/2, y+BLOCK_LABEL_PADDING, -1, -1) #draw ports for port in self.get_ports(): port.draw(gc, window) diff --git a/grc/gui/Dialogs.py b/grc/gui/Dialogs.py index af40f47c0..473c796af 100644 --- a/grc/gui/Dialogs.py +++ b/grc/gui/Dialogs.py @@ -20,7 +20,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA import pygtk pygtk.require('2.0') import gtk -import Preferences import Utils class TextDisplay(gtk.TextView): diff --git a/grc/gui/Element.py b/grc/gui/Element.py index f0518ee12..e020c5caa 100644 --- a/grc/gui/Element.py +++ b/grc/gui/Element.py @@ -17,9 +17,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA """ -import pygtk -pygtk.require('2.0') -import gtk from Constants import LINE_SELECT_SENSITIVITY from Constants import POSSIBLE_ROTATIONS diff --git a/grc/gui/FlowGraph.py b/grc/gui/FlowGraph.py index 8feb171f1..5adecccc1 100644 --- a/grc/gui/FlowGraph.py +++ b/grc/gui/FlowGraph.py @@ -22,7 +22,6 @@ import Actions import Colors import Utils from Element import Element -from .. base import FlowGraph as _FlowGraph import pygtk pygtk.require('2.0') import gtk diff --git a/grc/gui/Param.py b/grc/gui/Param.py index cb8bfdc52..b3018dab2 100644 --- a/grc/gui/Param.py +++ b/grc/gui/Param.py @@ -165,11 +165,9 @@ class Param(Element): if self.get_options(): return EnumEntryParam(self, *args, **kwargs) return EntryParam(self, *args, **kwargs) - def get_layout(self): + def get_markup(self): """ - Create a layout based on the current markup. - @return the pango layout + Get the markup for this param. + @return a pango markup string """ - layout = gtk.DrawingArea().create_pango_layout('') - layout.set_markup(Utils.parse_template(PARAM_MARKUP_TMPL, param=self)) - return layout + return Utils.parse_template(PARAM_MARKUP_TMPL, param=self) diff --git a/grc/gui/Port.py b/grc/gui/Port.py index 6763f6cbd..2896d04c1 100644 --- a/grc/gui/Port.py +++ b/grc/gui/Port.py @@ -97,12 +97,11 @@ class Port(Element): gc.set_foreground(self._bg_color) pixmap.draw_rectangle(gc, True, 0, 0, self.w, self.h) pixmap.draw_layout(gc, 0, 0, layout) - #create the images - self.horizontal_label = image = pixmap.get_image(0, 0, self.w, self.h) + #create vertical and horizontal pixmaps + self.horizontal_label = pixmap if self.is_vertical(): - self.vertical_label = vimage = gtk.gdk.Image(gtk.gdk.IMAGE_NORMAL, pixmap.get_visual(), self.h, self.w) - for i in range(self.w): - for j in range(self.h): vimage.put_pixel(j, self.w-i-1, image.get_pixel(i, j)) + self.vertical_label = self.get_parent().get_parent().new_pixmap(self.h, self.w) + Utils.rotate_pixmap(gc, self.horizontal_label, self.vertical_label) def draw(self, gc, window): """ @@ -117,9 +116,9 @@ class Port(Element): X,Y = self.get_coordinate() (x,y),(w,h) = self._areas_list[0] #use the first area's sizes to place the labels if self.is_horizontal(): - window.draw_image(gc, self.horizontal_label, 0, 0, x+X+(self.W-self.w)/2, y+Y+(self.H-self.h)/2, -1, -1) + window.draw_drawable(gc, self.horizontal_label, 0, 0, x+X+(self.W-self.w)/2, y+Y+(self.H-self.h)/2, -1, -1) elif self.is_vertical(): - window.draw_image(gc, self.vertical_label, 0, 0, x+X+(self.H-self.h)/2, y+Y+(self.W-self.w)/2, -1, -1) + window.draw_drawable(gc, self.vertical_label, 0, 0, x+X+(self.H-self.h)/2, y+Y+(self.W-self.w)/2, -1, -1) def get_connector_coordinate(self): """ diff --git a/grc/gui/Utils.py b/grc/gui/Utils.py index 83036a4b8..b5489d56e 100644 --- a/grc/gui/Utils.py +++ b/grc/gui/Utils.py @@ -19,8 +19,31 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA from Constants import POSSIBLE_ROTATIONS from Cheetah.Template import Template +import pygtk +pygtk.require('2.0') +import gtk import gobject +def rotate_pixmap(gc, src_pixmap, dst_pixmap, angle=gtk.gdk.PIXBUF_ROTATE_COUNTERCLOCKWISE): + """ + Load the destination pixmap with a rotated version of the source pixmap. + The source pixmap will be loaded into a pixbuf, rotated, and drawn to the destination pixmap. + The pixbuf is a client-side drawable, where a pixmap is a server-side drawable. + @param gc the graphics context + @param src_pixmap the source pixmap + @param dst_pixmap the destination pixmap + @param angle the angle to rotate by + """ + width, height = src_pixmap.get_size() + pixbuf = gtk.gdk.Pixbuf( + colorspace=gtk.gdk.COLORSPACE_RGB, + has_alpha=False, bits_per_sample=8, + width=width, height=height, + ) + pixbuf.get_from_drawable(src_pixmap, src_pixmap.get_colormap(), 0, 0, 0, 0, -1, -1) + pixbuf = pixbuf.rotate_simple(angle) + dst_pixmap.draw_pixbuf(gc, pixbuf, 0, 0, 0, 0) + def get_rotated_coordinate(coor, rotation): """ Rotate the coordinate by the given rotation. diff --git a/grc/python/Constants.py b/grc/python/Constants.py index 439a52420..e661c3927 100644 --- a/grc/python/Constants.py +++ b/grc/python/Constants.py @@ -18,7 +18,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA """ import os -import sys import stat from gnuradio import gr diff --git a/grc/python/FlowGraph.py b/grc/python/FlowGraph.py index 4dd18a81f..b2d406bbd 100644 --- a/grc/python/FlowGraph.py +++ b/grc/python/FlowGraph.py @@ -20,8 +20,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA import expr_utils from .. base.FlowGraph import FlowGraph as _FlowGraph from .. gui.FlowGraph import FlowGraph as _GUIFlowGraph -from Block import Block -from Connection import Connection import re _variable_matcher = re.compile('^(variable\w*)$') @@ -50,44 +48,36 @@ class FlowGraph(_FlowGraph, _GUIFlowGraph): #return from cache return self._eval_cache[my_hash] - def _get_io_signature(self, pad_key): + def _get_io_signaturev(self, pad_key): """ - Get an io signature for this flow graph. + Get a list of io signatures for this flow graph. The pad key determines the directionality of the io signature. @param pad_key a string of pad_source or pad_sink - @return a dict with: type, nports, vlen, size + @return a list of dicts with: type, label, vlen, size """ pads = filter(lambda b: b.get_key() == pad_key, self.get_enabled_blocks()) - if not pads: return { - 'nports': '0', - 'type': '', - 'vlen': '0', - 'size': '0', - } - pad = pads[0] #take only the first, user should not have more than 1 + sorted_pads = sorted(pads, lambda x, y: cmp(x.get_id(), y.get_id())) #load io signature - return { - 'nports': str(pad.get_param('nports').get_evaluated()), + return [{ + 'label': str(pad.get_param('label').get_evaluated()), 'type': str(pad.get_param('type').get_evaluated()), 'vlen': str(pad.get_param('vlen').get_evaluated()), 'size': pad.get_param('type').get_opt('size'), - } + } for pad in sorted_pads] - def get_input_signature(self): + def get_input_signaturev(self): """ Get the io signature for the input side of this flow graph. - The io signature with be "0", "0" if no pad source is present. - @return a string tuple of type, num_ports, port_size + @return a list of io signature structures """ - return self._get_io_signature('pad_source') + return self._get_io_signaturev('pad_source') - def get_output_signature(self): + def get_output_signaturev(self): """ Get the io signature for the output side of this flow graph. - The io signature with be "0", "0" if no pad sink is present. - @return a string tuple of type, num_ports, port_size + @return a list of io signature structures """ - return self._get_io_signature('pad_sink') + return self._get_io_signaturev('pad_sink') def get_imports(self): """ diff --git a/grc/python/Param.py b/grc/python/Param.py index 81fb6ba7a..febb112ad 100644 --- a/grc/python/Param.py +++ b/grc/python/Param.py @@ -17,7 +17,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA """ -import expr_utils from .. base.Param import Param as _Param from .. gui.Param import Param as _GUIParam from .. gui.Param import EntryParam diff --git a/grc/python/convert_hier.py b/grc/python/convert_hier.py index bdafbcbc1..befddccea 100644 --- a/grc/python/convert_hier.py +++ b/grc/python/convert_hier.py @@ -23,8 +23,8 @@ from .. base import odict def convert_hier(flow_graph, python_file): #extract info from the flow graph - input_sig = flow_graph.get_input_signature() - output_sig = flow_graph.get_output_signature() + input_sigs = flow_graph.get_input_signaturev() + output_sigs = flow_graph.get_output_signaturev() parameters = flow_graph.get_parameters() block_key = flow_graph.get_option('id') block_name = flow_graph.get_option('title') @@ -56,20 +56,18 @@ def convert_hier(flow_graph, python_file): params_n.append(param_n) block_n['param'] = params_n #sink data - if int(input_sig['nports']): + for input_sig in input_sigs: sink_n = odict() - sink_n['name'] = 'in' + sink_n['name'] = input_sig['label'] sink_n['type'] = input_sig['type'] sink_n['vlen'] = input_sig['vlen'] - sink_n['nports'] = input_sig['nports'] block_n['sink'] = sink_n #source data - if int(output_sig['nports']): + for output_sig in output_sigs: source_n = odict() - source_n['name'] = 'out' + source_n['name'] = output_sig['label'] source_n['type'] = output_sig['type'] source_n['vlen'] = output_sig['vlen'] - source_n['nports'] = output_sig['nports'] block_n['source'] = source_n #doc data block_n['doc'] = "%s\n%s\n%s"%(block_author, block_desc, python_file) diff --git a/grc/python/flow_graph.tmpl b/grc/python/flow_graph.tmpl index ab764006c..a1a9308aa 100644 --- a/grc/python/flow_graph.tmpl +++ b/grc/python/flow_graph.tmpl @@ -65,15 +65,25 @@ class $(class_name)(gr.top_block): def __init__($param_str): gr.top_block.__init__(self, "$title") #elif $generate_options == 'hb' - #set $in_sig = $flow_graph.get_input_signature() - #set $out_sig = $flow_graph.get_output_signature() + #set $in_sigs = $flow_graph.get_input_signaturev() + #set $out_sigs = $flow_graph.get_output_signaturev() class $(class_name)(gr.hier_block2): +#def make_io_sig($io_sigs) + #set $size_strs = ['%s*%s'%(io_sig['size'], io_sig['vlen']) for io_sig in $io_sigs] + #if len($io_sigs) == 0 +gr.io_signature(0, 0, 0)#slurp + #elif len($io_sigs) == 1 +gr.io_signature(1, 1, $size_strs[0])#slurp + #else +gr.io_signaturev($(len($io_sigs)), $(len($io_sigs)), [$(', '.join($size_strs))])#slurp + #end if +#end def def __init__($param_str): gr.hier_block2.__init__( self, "$title", - gr.io_signature($in_sig.nports, $in_sig.nports, $in_sig.size*$in_sig.vlen), - gr.io_signature($out_sig.nports, $out_sig.nports, $out_sig.size*$out_sig.vlen), + $make_io_sig($in_sigs), + $make_io_sig($out_sigs), ) #end if ######################################################## |