[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] [gnuradio] 09/24: grc: tabbed PropsDialog
From: |
git |
Subject: |
[Commit-gnuradio] [gnuradio] 09/24: grc: tabbed PropsDialog |
Date: |
Tue, 18 Mar 2014 17:51:40 +0000 (UTC) |
This is an automated email from the git hooks/post-receive script.
trondeau pushed a commit to branch master
in repository gnuradio.
commit 8fc80149c385d36e8eb44c7ccf5f05649aaed335
Author: Sebastian Koslowski <address@hidden>
Date: Fri Mar 14 21:20:32 2014 +0100
grc: tabbed PropsDialog
---
grc/base/Block.py | 17 +++++--
grc/base/Constants.py | 4 ++
grc/base/Param.py | 4 ++
grc/gui/PropsDialog.py | 133 +++++++++++++++++++++++++++++--------------------
grc/python/block.dtd | 6 ++-
5 files changed, 103 insertions(+), 61 deletions(-)
diff --git a/grc/base/Block.py b/grc/base/Block.py
index 668675c..faa48d9 100644
--- a/grc/base/Block.py
+++ b/grc/base/Block.py
@@ -18,11 +18,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA
"""
from . import odict
+from . Constants import ADVANCED_PARAM_TAB, DEFAULT_PARAM_TAB
from Element import Element
from Cheetah.Template import Template
from UserDict import UserDict
-from .. gui import Actions
+
class TemplateArg(UserDict):
"""
@@ -76,6 +77,11 @@ class Block(Element):
self._block_wrapper_path = n.find('block_wrapper_path')
self._bussify_sink = n.find('bus_sink')
self._bussify_source = n.find('bus_source')
+
+ # get list of param tabs
+ n_tabs = n.find('param_tab_order') or None
+ self._param_tab_labels = n_tabs.findall('tab') if n_tabs is not None
else [DEFAULT_PARAM_TAB]
+
#create the param objects
self._params = list()
#add the id param
@@ -142,6 +148,7 @@ class Block(Element):
'key': 'affinity',
'type': 'int_vector',
'hide': 'part',
+ 'tab': ADVANCED_PARAM_TAB
})
))
if len(sources) and is_not_virtual_or_pad:
@@ -151,7 +158,8 @@ class Block(Element):
'key': 'minoutbuf',
'type': 'int',
'hide': 'part',
- 'value': '0'
+ 'value': '0',
+ 'tab': ADVANCED_PARAM_TAB
})
))
self.get_params().append(self.get_parent().get_parent().Param(
@@ -160,14 +168,14 @@ class Block(Element):
'key': 'maxoutbuf',
'type': 'int',
'hide': 'part',
- 'value': '0'
+ 'value': '0',
+ 'tab': ADVANCED_PARAM_TAB
})
))
def back_ofthe_bus(self, portlist):
portlist.sort(key=lambda a: a.get_type() == 'bus');
-
def filter_bus_port(self, ports):
buslist = [i for i in ports if i.get_type() == 'bus'];
@@ -213,6 +221,7 @@ class Block(Element):
##############################################
# Access Params
##############################################
+ def get_param_tab_labels(self): return self._param_tab_labels
def get_param_keys(self): return _get_keys(self._params)
def get_param(self, key): return _get_elem(self._params, key)
def get_params(self): return self._params
diff --git a/grc/base/Constants.py b/grc/base/Constants.py
index ef45be8..e5026d9 100644
--- a/grc/base/Constants.py
+++ b/grc/base/Constants.py
@@ -23,3 +23,7 @@ import os
DATA_DIR = os.path.dirname(__file__)
FLOW_GRAPH_DTD = os.path.join(DATA_DIR, 'flow_graph.dtd')
BLOCK_TREE_DTD = os.path.join(DATA_DIR, 'block_tree.dtd')
+
+# Param tabs
+DEFAULT_PARAM_TAB = "General"
+ADVANCED_PARAM_TAB = "Advanced"
diff --git a/grc/base/Param.py b/grc/base/Param.py
index 8b8362a..f8bfe0d 100644
--- a/grc/base/Param.py
+++ b/grc/base/Param.py
@@ -74,6 +74,9 @@ class Param(Element):
value = n.find('value') or ''
self._type = n.find('type')
self._hide = n.find('hide') or ''
+ self._tab_label = n.find('tab') or block.get_param_tab_labels()[0]
+ if not self._tab_label in block.get_param_tab_labels():
+ block.get_param_tab_labels().append(self._tab_label)
#build the param
Element.__init__(self, block)
#create the Option objects from the n data
@@ -143,6 +146,7 @@ class Param(Element):
def set_value(self, value): self._value = str(value) #must be a string
def get_type(self): return
self.get_parent().resolve_dependencies(self._type)
+ def get_tab_label(self): return self._tab_label
def is_enum(self): return self._type == 'enum'
def __repr__(self):
diff --git a/grc/gui/PropsDialog.py b/grc/gui/PropsDialog.py
index 5c09f7c..0e85a4b 100644
--- a/grc/gui/PropsDialog.py
+++ b/grc/gui/PropsDialog.py
@@ -23,6 +23,12 @@ import gtk
from Dialogs import TextDisplay
from Constants import MIN_DIALOG_WIDTH, MIN_DIALOG_HEIGHT
+import Utils
+
+TAB_LABEL_MARKUP_TMPL="""\
+#set $foreground = $valid and 'black' or 'red'
+<span foreground="$foreground">$encode($tab)</span>"""
+
def get_title_label(title):
"""
@@ -41,6 +47,7 @@ def get_title_label(title):
hbox.pack_start(label, False, False, padding=11)
return hbox
+
class PropsDialog(gtk.Dialog):
"""
A dialog to set block parameters, view errors, and view documentation.
@@ -48,57 +55,69 @@ class PropsDialog(gtk.Dialog):
def __init__(self, block):
"""
- Properties dialog contructor.
+ Properties dialog constructor.
Args:
block: a block instance
"""
self._hash = 0
- LABEL_SPACING = 7
- gtk.Dialog.__init__(self,
- title='Properties: %s'%block.get_name(),
+
+ gtk.Dialog.__init__(
+ self,
+ title='Properties: %s' % block.get_name(),
buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK,
gtk.RESPONSE_ACCEPT),
)
self._block = block
self.set_size_request(MIN_DIALOG_WIDTH, MIN_DIALOG_HEIGHT)
- vbox = gtk.VBox()
- #Create the scrolled window to hold all the parameters
- scrolled_window = gtk.ScrolledWindow()
- scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
- scrolled_window.add_with_viewport(vbox)
- self.vbox.pack_start(scrolled_window, True)
- #Params box for block parameters
- self._params_box = gtk.VBox()
- self._params_box.pack_start(get_title_label('Parameters'), False)
- self._input_object_params = list()
- #Error Messages for the block
- self._error_box = gtk.VBox()
- self._error_messages_text_display = TextDisplay()
- self._error_box.pack_start(gtk.Label(), False, False, LABEL_SPACING)
- self._error_box.pack_start(get_title_label('Error Messages'), False)
- self._error_box.pack_start(self._error_messages_text_display, False)
- #Docs for the block
- self._docs_box = err_box = gtk.VBox()
+
+ vpaned = gtk.VPaned()
+ self.vbox.pack_start(vpaned)
+
+ # Notebook to hold param boxes
+ notebook = gtk.Notebook()
+ notebook.set_show_border(False)
+ notebook.set_scrollable(True) # scroll arrows for page tabs
+ notebook.set_tab_pos(gtk.POS_TOP)
+ vpaned.pack1(notebook, True)
+
+ # Params boxes for block parameters
+ self._params_boxes = list()
+ for tab in block.get_param_tab_labels():
+ label = gtk.Label()
+ vbox = gtk.VBox()
+ input_objects = []
+ scroll_box = gtk.ScrolledWindow()
+ scroll_box.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+ scroll_box.add_with_viewport(vbox)
+ notebook.append_page(scroll_box, label)
+ self._params_boxes.append((tab, label, vbox, input_objects))
+
+ # Docs for the block
self._docs_text_display = TextDisplay()
- self._docs_box.pack_start(gtk.Label(), False, False, LABEL_SPACING)
- self._docs_box.pack_start(get_title_label('Documentation'), False)
- self._docs_box.pack_start(self._docs_text_display, False)
- #Add the boxes
- vbox.pack_start(self._params_box, False)
- vbox.pack_start(self._error_box, False)
- vbox.pack_start(self._docs_box, False)
- #connect events
+ self._docs_box = gtk.ScrolledWindow()
+ self._docs_box.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+ self._docs_box.add_with_viewport(self._docs_text_display)
+ notebook.append_page(self._docs_box, gtk.Label("Documentation"))
+
+ # Error Messages for the block
+ self._error_messages_text_display = TextDisplay()
+ self._error_box = gtk.ScrolledWindow()
+ self._error_box.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+ self._error_box.add_with_viewport(self._error_messages_text_display)
+ self._error_box.set_size_request(-1, 40)
+ vpaned.pack2(self._error_box)
+
+ # Connect events
self.connect('key-press-event', self._handle_key_press)
self.connect('show', self._update_gui)
- #show all (performs initial gui update)
- self.show_all()
+ self.show_all() # show all (performs initial gui update)
def _params_changed(self):
"""
Have the params in this dialog changed?
Ex: Added, removed, type change, hide change...
To the props dialog, the hide setting of 'none' and 'part' are
identical.
- Therfore, the props dialog only cares if the hide setting is/not 'all'.
+ Therefore, the props dialog only cares if the hide setting is/not
'all'.
Make a hash that uniquely represents the params' state.
Returns:
@@ -113,7 +132,7 @@ class PropsDialog(gtk.Dialog):
def _handle_changed(self, *args):
"""
- A change occured within a param:
+ A change occurred within a param:
Rewrite/validate the block and update the gui.
"""
#update for the block
@@ -123,7 +142,7 @@ class PropsDialog(gtk.Dialog):
def _update_gui(self, *args):
"""
- Repopulate the parameters box (if changed).
+ Repopulate the parameters boxes (if changed).
Update all the input parameters.
Update the error messages box.
Hide the box if there are no errors.
@@ -133,28 +152,32 @@ class PropsDialog(gtk.Dialog):
#update the params box
if self._params_changed():
#hide params box before changing
- self._params_box.hide_all()
- #empty the params box
- for io_param in list(self._input_object_params):
- self._params_box.remove(io_param)
- self._input_object_params.remove(io_param)
- io_param.destroy()
- #repopulate the params box
- for param in self._block.get_params():
- if param.get_hide() == 'all': continue
- io_param = param.get_input(self._handle_changed)
- self._input_object_params.append(io_param)
- self._params_box.pack_start(io_param, False)
- #show params box with new params
- self._params_box.show_all()
+ for tab, label, vbox, input_objects in self._params_boxes:
+ vbox.hide_all()
+ # empty the params box
+ for io_param in input_objects:
+ vbox.remove(io_param)
+ input_objects.remove(io_param)
+ io_param.destroy()
+ # repopulate the params box
+ box_all_valid = True
+ for param in filter(lambda p: p.get_tab_label() == tab,
self._block.get_params()):
+ if param.get_hide() == 'all': continue
+ io_param = param.get_input(self._handle_changed)
+ input_objects.append(io_param)
+ vbox.pack_start(io_param, False)
+ box_all_valid = box_all_valid and param.is_valid()
+ label.set_markup(Utils.parse_template(TAB_LABEL_MARKUP_TMPL,
valid=box_all_valid, tab=tab))
+ #show params box with new params
+ vbox.show_all()
#update the errors box
- if self._block.is_valid(): self._error_box.hide()
- else: self._error_box.show()
+ if self._block.is_valid():
+ self._error_box.hide()
+ else:
+ self._error_box.show()
messages = '\n\n'.join(self._block.get_error_messages())
self._error_messages_text_display.set_text(messages)
#update the docs box
- if self._block.get_doc(): self._docs_box.show()
- else: self._docs_box.hide()
self._docs_text_display.set_text(self._block.get_doc())
def _handle_key_press(self, widget, event):
@@ -167,8 +190,8 @@ class PropsDialog(gtk.Dialog):
"""
if event.keyval == gtk.keysyms.Return:
self.response(gtk.RESPONSE_ACCEPT)
- return True #handled here
- return False #forward the keypress
+ return True # handled here
+ return False # forward the keypress
def run(self):
"""
diff --git a/grc/python/block.dtd b/grc/python/block.dtd
index 21ffbe0..b37c0ff 100644
--- a/grc/python/block.dtd
+++ b/grc/python/block.dtd
@@ -25,11 +25,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA
Top level element.
A block contains a name, ...parameters list, and list of IO ports.
-->
-<!ELEMENT block (name, key, category?, throttle?, import*, var_make?, make,
callback*, param*, bus_sink?, bus_source?, check*, sink*, source*,
bus_structure_sink?, bus_structure_source?, doc?, grc_source?)>
+<!ELEMENT block (name, key, category?, throttle?, import*, var_make?, make,
callback*, param_tab_order?, param*, bus_sink?, bus_source?, check*, sink*,
source*, bus_structure_sink?, bus_structure_source?, doc?, grc_source?)>
<!--
Sub level elements.
-->
-<!ELEMENT param (name, key, value?, type, hide?, option*)>
+<!ELEMENT param_tab_order (tab+)>
+<!ELEMENT param (name, key, value?, type, hide?, option*, tab?)>
<!ELEMENT option (name, key, opt*)>
<!ELEMENT sink (name, type, vlen?, nports?, optional?)>
<!ELEMENT source (name, type, vlen?, nports?, optional?)>
@@ -41,6 +42,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA
<!ELEMENT import (#PCDATA)>
<!ELEMENT doc (#PCDATA)>
<!ELEMENT grc_source (#PCDATA)>
+<!ELEMENT tab (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT key (#PCDATA)>
<!ELEMENT check (#PCDATA)>
- [Commit-gnuradio] [gnuradio] 17/24: Merge remote-tracking branch 'smunaut/qtgui_fixes', (continued)
- [Commit-gnuradio] [gnuradio] 17/24: Merge remote-tracking branch 'smunaut/qtgui_fixes', git, 2014/03/18
- [Commit-gnuradio] [gnuradio] 05/24: grc: fix some PyGTK backwards compatibilty issues, git, 2014/03/18
- [Commit-gnuradio] [gnuradio] 07/24: gr-qtgui: Use dummy void* return value for pywidget if !ENABLE_PYTHON, git, 2014/03/18
- [Commit-gnuradio] [gnuradio] 11/24: grc: show dummy blocks when opening grc blocks, git, 2014/03/18
- [Commit-gnuradio] [gnuradio] 15/24: grc: tabbed probs: fix initial error box height, git, 2014/03/18
- [Commit-gnuradio] [gnuradio] 14/24: grc: tabbed props: no more double entries, git, 2014/03/18
- [Commit-gnuradio] [gnuradio] 06/24: qtgui: Adding a Number sink with options to set autoscale, layout style, colors, averaging., git, 2014/03/18
- [Commit-gnuradio] [gnuradio] 04/24: Simplify some more., git, 2014/03/18
- [Commit-gnuradio] [gnuradio] 03/24: Move correlate_access_code_tag_bb to non-deprecated GRC category and deprecate the older correlate_access_code_bb., git, 2014/03/18
- [Commit-gnuradio] [gnuradio] 20/24: Merge remote-tracking branch 'skoslowski/grc_show_missing_blocks', git, 2014/03/18
- [Commit-gnuradio] [gnuradio] 09/24: grc: tabbed PropsDialog,
git <=
- [Commit-gnuradio] [gnuradio] 19/24: Merge remote-tracking branch 'gnuradio-wg-grc/grc_pygtk_backw_compat_fixes', git, 2014/03/18
- [Commit-gnuradio] [gnuradio] 12/24: grc: special colors for missing blocks, git, 2014/03/18
- [Commit-gnuradio] [gnuradio] 18/24: qtgui: fixes number sink to handle Python/C++ exposure (see: 6a78af5919133 and d9dbb6b489deb), git, 2014/03/18
- [Commit-gnuradio] [gnuradio] 22/24: qtgui: fixing up a few minor details; include file and ability to set accumulate checkable on startup., git, 2014/03/18
- [Commit-gnuradio] [gnuradio] 10/24: Merge branch 'qtgui_numsink', git, 2014/03/18
- [Commit-gnuradio] [gnuradio] 02/24: Simplify correlate_access_code_tag_bb and fix bug leading to false trigger., git, 2014/03/18
- [Commit-gnuradio] [gnuradio] 23/24: Merge remote-tracking branch 'mbant/doxygen-updates', git, 2014/03/18
- [Commit-gnuradio] [gnuradio] 16/24: qtgui: fixed number display for qwt 5.2, 6.0, and 6.1., git, 2014/03/18
- [Commit-gnuradio] [gnuradio] 08/24: gr-qtgui: Expose the qwidget() method in the public interface, git, 2014/03/18
- [Commit-gnuradio] [gnuradio] 21/24: Merge remote-tracking branch 'bistromath/corr_tag', git, 2014/03/18