mirror of
https://github.com/gnuradio/gnuradio-companion.git
synced 2025-12-11 04:34:56 -06:00
163 lines
5.9 KiB
Python
163 lines
5.9 KiB
Python
# Copyright 2007-2016 Free Software Foundation, Inc.
|
|
# This file is part of GNU Radio
|
|
#
|
|
# GNU Radio Companion is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# GNU Radio Companion is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# 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 .drawable import Drawable
|
|
|
|
from .. import ParamWidgets, Utils, Constants
|
|
|
|
from ...core.Param import Param as CoreParam
|
|
|
|
|
|
class Param(CoreParam):
|
|
"""The graphical parameter."""
|
|
|
|
make_cls_with_base = classmethod(Drawable.make_cls_with_base.__func__)
|
|
|
|
def get_input(self, *args, **kwargs):
|
|
"""
|
|
Get the graphical gtk class to represent this parameter.
|
|
An enum requires and combo parameter.
|
|
A non-enum with options gets a combined entry/combo parameter.
|
|
All others get a standard entry parameter.
|
|
|
|
Returns:
|
|
gtk input class
|
|
"""
|
|
dtype = self.dtype
|
|
if dtype in ('file_open', 'file_save'):
|
|
input_widget_cls = ParamWidgets.FileParam
|
|
|
|
elif dtype == 'enum':
|
|
input_widget_cls = ParamWidgets.EnumParam
|
|
|
|
elif self.options:
|
|
input_widget_cls = ParamWidgets.EnumEntryParam
|
|
|
|
elif dtype == '_multiline':
|
|
input_widget_cls = ParamWidgets.MultiLineEntryParam
|
|
|
|
elif dtype == '_multiline_python_external':
|
|
input_widget_cls = ParamWidgets.PythonEditorParam
|
|
|
|
else:
|
|
input_widget_cls = ParamWidgets.EntryParam
|
|
|
|
return input_widget_cls(self, *args, **kwargs)
|
|
|
|
def format_label_markup(self, have_pending_changes=False):
|
|
block = self.parent
|
|
# fixme: using non-public attribute here
|
|
has_callback = \
|
|
hasattr(block, 'templates') and \
|
|
any(self.key in callback for callback in block.templates.get('callbacks', ''))
|
|
|
|
return '<span {underline} {foreground} font_desc="Sans 9">{label}</span>'.format(
|
|
underline='underline="low"' if has_callback else '',
|
|
foreground='foreground="blue"' if have_pending_changes else
|
|
'foreground="red"' if not self.is_valid() else '',
|
|
label=Utils.encode(self.name)
|
|
)
|
|
|
|
def format_tooltip_text(self):
|
|
errors = self.get_error_messages()
|
|
tooltip_lines = ['Key: ' + self.key, 'Type: ' + self.dtype]
|
|
if self.is_valid():
|
|
value = str(self.get_evaluated())
|
|
if len(value) > 100:
|
|
value = '{}...{}'.format(value[:50], value[-50:])
|
|
tooltip_lines.append('Value: ' + value)
|
|
elif len(errors) == 1:
|
|
tooltip_lines.append('Error: ' + errors[0])
|
|
elif len(errors) > 1:
|
|
tooltip_lines.append('Error:')
|
|
tooltip_lines.extend(' * ' + msg for msg in errors)
|
|
return '\n'.join(tooltip_lines)
|
|
|
|
def pretty_print(self):
|
|
"""
|
|
Get the repr (nice string format) for this param.
|
|
|
|
Returns:
|
|
the string representation
|
|
"""
|
|
##################################################
|
|
# Truncate helper method
|
|
##################################################
|
|
def _truncate(string, style=0):
|
|
max_len = max(27 - len(self.name), 3)
|
|
if len(string) > max_len:
|
|
if style < 0: # Front truncate
|
|
string = '...' + string[3-max_len:]
|
|
elif style == 0: # Center truncate
|
|
string = string[:max_len//2 - 3] + '...' + string[-max_len//2:]
|
|
elif style > 0: # Rear truncate
|
|
string = string[:max_len-3] + '...'
|
|
return string
|
|
|
|
##################################################
|
|
# Simple conditions
|
|
##################################################
|
|
value = self.get_value()
|
|
if not self.is_valid():
|
|
return _truncate(value)
|
|
if value in self.options:
|
|
return self.options[value] # its name
|
|
|
|
##################################################
|
|
# Split up formatting by type
|
|
##################################################
|
|
# Default center truncate
|
|
truncate = 0
|
|
e = self.get_evaluated()
|
|
t = self.dtype
|
|
if isinstance(e, bool):
|
|
return str(e)
|
|
elif isinstance(e, Constants.COMPLEX_TYPES):
|
|
dt_str = Utils.num_to_str(e)
|
|
elif isinstance(e, Constants.VECTOR_TYPES):
|
|
# Vector types
|
|
if len(e) > 8:
|
|
# Large vectors use code
|
|
dt_str = self.get_value()
|
|
truncate = 1
|
|
else:
|
|
# Small vectors use eval
|
|
dt_str = ', '.join(map(Utils.num_to_str, e))
|
|
elif t in ('file_open', 'file_save'):
|
|
dt_str = self.get_value()
|
|
truncate = -1
|
|
else:
|
|
# Other types
|
|
dt_str = str(e)
|
|
|
|
# Done
|
|
return _truncate(dt_str, truncate)
|
|
|
|
def format_block_surface_markup(self):
|
|
"""
|
|
Get the markup for this param.
|
|
|
|
Returns:
|
|
a pango markup string
|
|
"""
|
|
return '<span {foreground} font_desc="{font}"><b>{label}:</b> {value}</span>'.format(
|
|
foreground='foreground="red"' if not self.is_valid() else '', font=Constants.PARAM_FONT,
|
|
label=Utils.encode(self.name), value=Utils.encode(self.pretty_print().replace('\n', ' '))
|
|
)
|