def set_expanded(control_instance, resize_button, state): """ Expand or collapse a 'ControllerControlWidget'. Parameters ---------- control_instance: QFrame (mandatory) the list widget item resize_button: QToolButton the signal sender state: bool expanded (True) or collapsed (False) """ # Change the icon depending on the button status icon = QtGui.QIcon() # Hide the control if not state: control_instance.hide() icon.addPixmap( QtGui.QPixmap(_fromUtf8(":/soma_widgets_icons/nav_right")), QtGui.QIcon.Normal, QtGui.QIcon.Off) # Show the control else: control_instance.show() icon.addPixmap( QtGui.QPixmap(_fromUtf8(":/soma_widgets_icons/nav_down")), QtGui.QIcon.Normal, QtGui.QIcon.Off) # Set the new button icon resize_button.setIcon(icon)
def expand_or_collapse(control_instance, resize_button): """ Callback to expand or collapse a 'DictControlWidget'. Parameters ---------- control_instance: QFrame (mandatory) the dict widget item resize_button: QToolButton the signal sender """ # Change the icon depending on the button status icon = QtGui.QIcon() # Hide the control if control_instance.isVisible(): control_instance.hide() icon.addPixmap(QtGui.QPixmap(_fromUtf8( ":/soma_widgets_icons/nav_right")), QtGui.QIcon.Normal, QtGui.QIcon.Off) # Show the control else: control_instance.show() icon.addPixmap(QtGui.QPixmap(_fromUtf8( ":/soma_widgets_icons/nav_down")), QtGui.QIcon.Normal, QtGui.QIcon.Off) # Set the new button icon resize_button.setIcon(icon)
def _create_group_widget(self, group): group_widget = QtGui.QGroupBox() last_row = self._grid_layout.rowCount() self._grid_layout.addWidget(group_widget, last_row, 0, 1, 2) lay1 = QtGui.QVBoxLayout() lay1.setContentsMargins(0, 0, 0, 0) lay2 = QtGui.QHBoxLayout() lay1.addLayout(lay2) lay2.setContentsMargins(10, 0, 0, 0) lay2.addWidget(QtGui.QLabel('<html><em>%s</em></html>' % group)) lay2.addStretch(1) icon = QtGui.QIcon() icon.addPixmap( QtGui.QPixmap(_fromUtf8(":/soma_widgets_icons/nav_down")), QtGui.QIcon.Normal, QtGui.QIcon.Off) group_widget.fold_button = QtGui.QPushButton(icon, '') group_widget.fold_button.setFixedSize(30, 20) lay2.addWidget(group_widget.fold_button) widget = QtGui.QWidget() group_widget.setLayout(lay1) lay1.addWidget(widget) group_widget.hideable_widget = widget layout = QtGui.QGridLayout() widget.setLayout(layout) layout.setAlignment(QtCore.Qt.AlignTop) layout.setSpacing(3) layout.setContentsMargins(5, 5, 5, 5) group_widget.setAlignment(QtCore.Qt.AlignLeft) visible_groups = getattr(self.controller, 'visible_groups', set()) if group in visible_groups: show = True else: show = False group_widget.hideable_widget.setVisible(show) if not show: icon = QtGui.QIcon() icon.addPixmap( QtGui.QPixmap(_fromUtf8(":/soma_widgets_icons/nav_right")), QtGui.QIcon.Normal, QtGui.QIcon.Off) group_widget.fold_button.setIcon(icon) #group_widget.fold_button.clicked.connect(SomaPartial( #self._toggle_group_visibility, group)) # FIXME: if we use this, self gets deleted somewhere. This is not # normal. group_widget.fold_button.clicked.connect( partial(self.__class__._toggle_group_visibility, weak_proxy(self), group)) return group_widget
def _set_group_visibility(self, group, checked): group_widget = self._groups[group] group_widget.hideable_widget.setVisible(checked) icon = QtGui.QIcon() if checked: icon.addPixmap( QtGui.QPixmap(_fromUtf8(":/soma_widgets_icons/nav_down")), QtGui.QIcon.Normal, QtGui.QIcon.Off) else: icon.addPixmap( QtGui.QPixmap(_fromUtf8(":/soma_widgets_icons/nav_right")), QtGui.QIcon.Normal, QtGui.QIcon.Off) group_widget.fold_button.setIcon(icon)
def __init__(self, viewer_node_name, pipeline, study_config): """ Method to initialize a ViewerWidget class. Parameters ---------- viewer_node_name: str the name of the node containing the viewer process pipeline: str the full pipeline in order to get the viewer input trait values since the viewer node is unactivated """ # Inheritance super(ViewerWidget, self).__init__() # Default parameters self.viewer_node_name = viewer_node_name self.pipeline = pipeline self.study_config = study_config # Build control button = QtGui.QToolButton(self) button.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) button.setMinimumHeight(50) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/icones/view_result")), QtGui.QIcon.Normal, QtGui.QIcon.Off) button.setIcon(icon) button.clicked.connect(self.onCreateViewerClicked)
def update(self): image = tempfile.NamedTemporaryFile(suffix=".png") dot = tempfile.NamedTemporaryFile(suffix=".png") self.write(dot) dot.flush() check_call(["dot", "-Tpng", "-o", image.name, dot.name]) self.pixmap = QtGui.QPixmap(image.name) # .scaledToHeight(600) self.label.setPixmap(self.pixmap)
def __init__(self, text=None, parent=None): super(DeletableLineEdit, self).__init__(parent) layout = QtGui.QHBoxLayout() self.setLayout(layout) delete_button = QtGui.QToolButton() layout.addWidget(delete_button) # Set the tool icons icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/soma_widgets_icons/delete")), QtGui.QIcon.Normal, QtGui.QIcon.Off) delete_button.setIcon(icon) self.line_edit = TimeredQLineEdit(text) layout.addWidget(self.line_edit) self.line_edit.userModification.connect(self.userModification) delete_button.pressed.connect(self.buttonPressed)
def __init__(self, app=None): QtGui.QDialog.__init__(self) self.ui = uic.loadUi("locateleds.ui", self) self.pb = plasticbrain.PlasticBrain() self.ui.startLocaButton.clicked.connect(self.start) self.ui.loadMeshButton.clicked.connect(self.loadMesh) self.ui.deviceCombo.currentIndexChanged.connect( self.updatedDeviceCombo) self.ui.saveButton.clicked.connect(self.save) self.ui.nextLedButton.clicked.connect(self.nextLed) self.ui.previousLedButton.clicked.connect(self.previousLed) self.ui.ReceiveLSLButton.clicked.connect(self.ReceiveAndDisplayEEG) self.ui.StopReceiveData.clicked.connect(self.StopReceiveData) self.a = anatomist.Anatomist('-b') #Batch mode (hide Anatomist window) self.a.onCursorNotifier.add(self.clickHandler) pix = QtGui.QPixmap('control.xpm') self.app = app anatomistControl.cpp.IconDictionary.instance().addIcon( 'MyControl', pix) ad = anatomistControl.cpp.ActionDictionary.instance() ad.addAction('MyAction', lambda: MyAction()) cd = anatomistControl.cpp.ControlDictionary.instance() cd.addControl('MyControl', lambda: MyControl(), 25) cm = anatomistControl.cpp.ControlManager.instance() cm.addControl('QAGLWidget3D', '', 'MyControl') self.axWindow = self.a.createWindow('Axial') layoutAx = QtGui.QHBoxLayout(self.frame) self.axWindow.setParent(self.frame) layoutAx.addWidget(self.axWindow.getInternalRep()) self.currentElec = 0 self.coords = [ [0, 0, 0], ] self.mesh = None self.aimsMesh = None self.texture = None self.currentObj = None self.TextObj = None
def create_widget(parent, control_name, control_value, trait, label_class=None): """ Method to create the dict widget. Parameters ---------- parent: QWidget (mandatory) the parent widget control_name: str (mandatory) the name of the control we want to create control_value: dict of items (mandatory) the default control value trait: Tait (mandatory) the trait associated to the control label_class: Qt widget class (optional, default: None) the label widget will be an instance of this class. Its constructor will be called using 2 arguments: the label string and the parent widget. Returns ------- out: 2-uplet a two element tuple of the form (control widget: , associated labels: (a label QLabel, the tools QWidget)) """ # Get the inner trait: expect only one inner trait # note: trait.inner_traits might be a method (ListInt) or a tuple # (List), whereas trait.handler.inner_trait is always a method if len(trait.handler.inner_traits()) != 2: raise Exception( "Expect two inner traits in Dict control. Trait '{0}' " "inner traits are '{1}'.".format( control_name, trait.inner_traits)) inner_trait = trait.handler.inner_traits()[1] # Create the dict widget: a frame frame = QtGui.QFrame(parent=parent) frame.setFrameShape(QtGui.QFrame.StyledPanel) # Create tools to interact with the dict widget: expand or collapse - # add a dict item - remove a dict item tool_widget = QtGui.QWidget(parent) layout = QtGui.QHBoxLayout() layout.addStretch(1) tool_widget.setLayout(layout) # Create the tool buttons resize_button = QtGui.QToolButton() add_button = QtGui.QToolButton() layout.addWidget(resize_button) layout.addWidget(add_button) # Set the tool icons icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/soma_widgets_icons/add")), QtGui.QIcon.Normal, QtGui.QIcon.Off) add_button.setIcon(icon) icon = QtGui.QIcon() icon.addPixmap( QtGui.QPixmap(_fromUtf8(":/soma_widgets_icons/nav_down")), QtGui.QIcon.Normal, QtGui.QIcon.Off) resize_button.setIcon(icon) resize_button.setFixedSize(30, 22) add_button.setFixedSize(30, 22) # Create a new controller that contains length 'control_value' inner # trait elements controller = DictController() for name, inner_control_values in six.iteritems(control_value): controller.add_trait(str(name), inner_trait) setattr(controller, str(name), inner_control_values) # Create the associated controller widget controller_widget = ControllerWidget(controller, parent=frame, live=True, editable_labels=True) # Store some parameters in the dict widget frame.inner_trait = inner_trait frame.trait = trait frame.controller = controller frame.controller_widget = controller_widget frame.connected = False # Add the dict controller widget to the dict widget frame.setLayout(controller_widget.layout()) # Set some callback on the dict control tools # Resize callback resize_hook = partial( DictControlWidget.expand_or_collapse, weak_proxy(frame), weak_proxy(resize_button)) resize_button.clicked.connect(resize_hook) # Add dict item callback add_hook = partial( DictControlWidget.add_dict_item, parent, control_name, frame) add_button.clicked.connect(add_hook) # Create the label associated with the dict widget control_label = trait.label if control_label is None: control_label = control_name if label_class is None: label_class = QtGui.QLabel if control_label is not None: label = label_class(control_label, parent) else: label = None controller_widget.main_controller_def = (DictControlWidget, parent, control_name, frame) return (frame, (label, tool_widget))
# -*- coding: utf-8 -*- from soma.qt_gui.qt_backend import QtGui, QtCore imageExpand = QtGui.QPixmap() imageExpand.loadFromData( "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" "\x49\x48\x44\x52\x00\x00\x00\x09\x00\x00\x00\x0b" "\x08\x06\x00\x00\x00\xad\x59\xa7\x1b\x00\x00\x00" "\x4f\x49\x44\x41\x54\x18\x95\x63\x7c\xf6\xec\x19" "\x03\x21\xc0\x04\x63\x48\x49\x49\xfd\x47\x96\x40" "\xe1\x43\x4d\xfa\x8f\x0b\x3f\x7b\xf6\x0c\x62\xd2" "\xb3\x67\xcf\x18\xb1\x59\x03\x13\x67\x42\x17\xc0" "\xc6\x67\xc2\x26\x81\xae\x81\x91\x24\xdf\xe1\x03" "\x2c\x30\xc6\xdd\xbb\x77\xff\xa3\x4b\x2a\x2b\x2b" "\xa3\x3a\x1c\x1f\x20\xca\x4d\x00\x23\x1d\x2b\x53" "\x5e\xdc\x34\x20\x00\x00\x00\x00\x49\x45\x4e\x44" "\xae\x42\x60\x82" ) imageCollapse = QtGui.QPixmap() imageCollapse.loadFromData( "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" "\x49\x48\x44\x52\x00\x00\x00\x09\x00\x00\x00\x0b" "\x08\x06\x00\x00\x00\xad\x59\xa7\x1b\x00\x00\x00" "\x52\x49\x44\x41\x54\x18\x95\x8d\x90\xbb\x0d\x00" "\x31\x08\x43\x0d\xba\x29\xdc\xb2\xff\x48\xb4\x5e" "\x23\x57\xe5\x14\x91\x9c\x02\x15\x9f\x27\x1b\x30" "\x49\xb8\xc5\x33\x93\xcc\x1c\x75\x18\x11\x06\x00" "\x7e\x95\x01\x60\x1d\xbb\x96\xd2\x06\x91\xdc\x76" "\xf3\x13\x50\x41\xaf\xc0\xa9\xf6\x3f\x8b\xb5\xff"
def create_widget(parent, control_name, control_value, trait, label_class=None, user_data=None): """ Method to create the list widget. Parameters ---------- parent: QWidget (mandatory) the parent widget control_name: str (mandatory) the name of the control we want to create control_value: list of items (mandatory) the default control value trait: Tait (mandatory) the trait associated to the control label_class: Qt widget class (optional, default: None) the label widget will be an instance of this class. Its constructor will be called using 2 arguments: the label string and the parent widget. Returns ------- out: 2-uplet a two element tuple of the form (control widget: , associated labels: (a label QLabel, the tools QWidget)) """ # Get the inner trait: expect only one inner trait # note: trait.inner_traits might be a method (ListInt) or a tuple # (List), whereas trait.handler.inner_trait is always a method if len(trait.handler.inner_traits()) != 1: raise Exception( "Expect only one inner trait in List control. Trait '{0}' " "inner trait is '{1}'.".format(control_name, trait.handler.inner_traits())) inner_trait = trait.handler.inner_traits()[0] # Create the widget frame = QtGui.QFrame() frame.setFrameShape(QtGui.QFrame.StyledPanel) frame.user_data = user_data layout = QtGui.QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) frame.setLayout(layout) #item = QtGui.QLabel('<list of %s>' #% str(inner_trait.trait_type.__class__.__name__)) #item.setTextInteractionFlags(QtCore.Qt.TextSelectableByKeyboard | #QtCore.Qt.TextSelectableByMouse) #item.setFrameStyle(QtGui.QFrame.StyledPanel | QtGui.QFrame.Sunken) #layout.addWidget(item) # Create tools to interact with the list widget: expand or collapse - # add a list item - remove a list item tool_widget = QtGui.QWidget(parent) layout.addWidget(tool_widget) layout = QtGui.QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(2) tool_widget.setLayout(layout) # Store some parameters in the list widget frame.inner_trait = inner_trait frame.trait = trait frame.connected = False if control_value is traits.Undefined: control_value = [] elif not isinstance(control_value, (list, tuple)): # in nipype MultiPath, single values are not in a list control_value = [control_value] frame.trait_name = control_name # Create the label associated with the list widget control_label = trait.label if control_label is None: control_label = control_name if label_class is None: label_class = QtGui.QLabel if control_label is not None: label = label_class(control_label, parent) else: label = None frame.label_class = label_class # view the model items = OffscreenListControlWidget.partial_view_widget( weak_proxy(parent), weak_proxy(frame), control_value) layout.addWidget(items) #layout.addWidget(QtGui.QLabel('...')) frame.control_widget = items frame.controller = items.control_widget.controller frame.controller_widget = items.control_widget.controller_widget # Create the tool buttons edit_button = QtGui.QToolButton() layout.addWidget(edit_button) # Set the tool icons icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/soma_widgets_icons/add")), QtGui.QIcon.Normal, QtGui.QIcon.Off) edit_button.setIcon(icon) edit_button.setFixedSize(30, 22) #layout.addStretch(1) # Set some callback on the list control tools # Resize callback edit_hook = partial(OffscreenListControlWidget.edit_elements, weak_proxy(parent), weak_proxy(frame), weak_proxy(edit_button)) edit_button.clicked.connect(edit_hook) return (frame, label)
def create_widget(parent, control_name, control_value, trait, label_class=None, max_items=0): """ Method to create the list widget. Parameters ---------- parent: QWidget (mandatory) the parent widget control_name: str (mandatory) the name of the control we want to create control_value: list of items (mandatory) the default control value trait: Tait (mandatory) the trait associated to the control label_class: Qt widget class (optional, default: None) the label widget will be an instance of this class. Its constructor will be called using 2 arguments: the label string and the parent widget. max_items: int (optional) display at most this number of items. Defaults to 0: no limit. Returns ------- out: 2-uplet a two element tuple of the form (control widget: , associated labels: (a label QLabel, the tools QWidget)) """ # Get the inner trait: expect only one inner trait # note: trait.inner_traits might be a method (ListInt) or a tuple # (List), whereas trait.handler.inner_trait is always a method if len(trait.handler.inner_traits()) == 1: inner_trait = trait.handler.inner_traits()[0] elif len(trait.handler.inner_traits()) == 0: # maybe a generic list, or a compount trait if hasattr(trait.handler, 'handlers') \ and len(trait.handler.handlers) > 0 \ and hasattr(trait.handler.handlers[0], 'inner_traits') \ and len(trait.handler.handlers[0].inner_traits()) > 0: inner_trait = trait.handler.handlers[0].inner_traits()[0] else: # can't determine type, fallback to string inner_trait = traits.Str() else: raise Exception( "Expect only one inner trait in List control. Trait '{0}' " "inner trait is '{1}'.".format(control_name, trait.handler.inner_traits())) if control_value is traits.Undefined: control_value = [] # Create the list widget: a frame parent = get_ref(parent) frame = QtGui.QFrame(parent=parent) #frame.setFrameShape(QtGui.QFrame.StyledPanel) frame.setFrameShape(QtGui.QFrame.NoFrame) # Create tools to interact with the list widget: expand or collapse - # add a list item - remove a list item tool_widget = QtGui.QWidget(parent) layout = QtGui.QHBoxLayout() layout.addStretch(1) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(2) tool_widget.setLayout(layout) # Create the tool buttons resize_button = QtGui.QToolButton() add_button = QtGui.QToolButton() delete_button = QtGui.QToolButton() layout.addWidget(resize_button) layout.addWidget(add_button) layout.addWidget(delete_button) # Set the tool icons icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/soma_widgets_icons/add")), QtGui.QIcon.Normal, QtGui.QIcon.Off) add_button.setIcon(icon) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/soma_widgets_icons/delete")), QtGui.QIcon.Normal, QtGui.QIcon.Off) delete_button.setIcon(icon) icon = QtGui.QIcon() icon.addPixmap( QtGui.QPixmap(_fromUtf8(":/soma_widgets_icons/nav_down")), QtGui.QIcon.Normal, QtGui.QIcon.Off) resize_button.setIcon(icon) resize_button.setFixedSize(30, 22) add_button.setFixedSize(40, 22) delete_button.setFixedSize(40, 22) menu = QtGui.QMenu() menu.addAction( 'Enter list', partial(ListControlWidget.enter_list, weak_proxy(parent), control_name, weak_proxy(frame))) menu.addAction( 'Load list', partial(ListControlWidget.load_list, weak_proxy(parent), control_name, weak_proxy(frame))) if isinstance(inner_trait.trait_type, traits.File) \ or isinstance(inner_trait.trait_type, traits.Directory): menu.addAction( 'Select files', partial(ListControlWidget.select_files, weak_proxy(parent), control_name, weak_proxy(frame))) add_button.setMenu(menu) menu = QtGui.QMenu() menu.addAction( 'Clear all', partial(ListControlWidget.clear_all, weak_proxy(parent), control_name, weak_proxy(frame), trait.trait_type.minlen)) delete_button.setMenu(menu) # Create a new controller that contains length 'control_value' inner # trait elements controller = ListController() if inner_trait.groups: del inner_trait.groups n = max_items if n == 0: n = len(control_value) for cnt, inner_control_values in enumerate(control_value[:n]): controller.add_trait(str(cnt), inner_trait) #if inner_trait.groups: #del trait(str(cnt)).groups setattr(controller, str(cnt), inner_control_values) # Create the associated controller widget controller_widget = ControllerWidget(controller, parent=frame, live=True) controller_widget.setObjectName('inner_controller') controller_widget.setStyleSheet( 'ControllerWidget#inner_controller { padding: 0px; }') # Store some parameters in the list widget frame.inner_trait = inner_trait frame.trait = trait frame.controller = controller frame.controller_widget = controller_widget frame.connected = False frame.max_items = max_items # Add the list controller widget to the list widget frame.setLayout(controller_widget.layout()) frame.layout().setContentsMargins(0, 0, 0, 0) frame.setObjectName('inner_frame') frame.setStyleSheet('QFrame#inner_frame { padding: 0px; }') # Set some callback on the list control tools # Resize callback resize_hook = partial(ListControlWidget.expand_or_collapse, weak_proxy(frame), weak_proxy(resize_button)) resize_button.clicked.connect(resize_hook) # Add list item callback add_hook = partial(ListControlWidget.add_list_item, weak_proxy(parent), control_name, weak_proxy(frame)) add_button.clicked.connect(add_hook) # Delete list item callback delete_hook = partial(ListControlWidget.delete_list_item, weak_proxy(parent), control_name, weak_proxy(frame)) delete_button.clicked.connect(delete_hook) # Create the label associated with the list widget control_label = trait.label if control_label is None: control_label = control_name if label_class is None: label_class = QtGui.QLabel if control_label is not None: label = label_class(control_label, parent) else: label = None return (frame, (label, tool_widget))
def create_widget(parent, control_name, control_value, trait, label_class=None): """ Method to create the controller widget. Parameters ---------- parent: QWidget (mandatory) the parent widget control_name: str (mandatory) the name of the control we want to create control_value: instance of Controller (mandatory) the default control value trait: Tait (mandatory) the trait associated to the control label_class: Qt widget class (optional, default: None) the label widget will be an instance of this class. Its constructor will be called using 2 arguments: the label string and the parent widget. Returns ------- out: 2-uplet a two element tuple of the form (control widget: , associated labels: (a label QLabel, the tools QWidget)) """ # Create the list widget: a frame frame = QtGui.QFrame(parent=parent) frame.setFrameShape(QtGui.QFrame.StyledPanel) # Create tools to interact with the list widget: expand or collapse - # add a list item - remove a list item tool_widget = QtGui.QWidget(parent) layout = QtGui.QHBoxLayout() layout.addStretch(1) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(2) tool_widget.setLayout(layout) # Create the tool buttons resize_button = QtGui.QToolButton() layout.addWidget(resize_button) # Set the tool icons icon = QtGui.QIcon() icon.addPixmap( QtGui.QPixmap(_fromUtf8(":/soma_widgets_icons/nav_down")), QtGui.QIcon.Normal, QtGui.QIcon.Off) resize_button.setIcon(icon) resize_button.setFixedSize(30, 22) editable_labels = False if trait.handler.inner_traits(): editable_labels = True frame.inner_trait = trait.handler.inner_traits()[0] add_button = QtGui.QToolButton() delete_button = QtGui.QToolButton() layout.addWidget(add_button) # Set the tool icons icon = QtGui.QIcon() icon.addPixmap( QtGui.QPixmap(_fromUtf8(":/soma_widgets_icons/add")), QtGui.QIcon.Normal, QtGui.QIcon.Off) add_button.setIcon(icon) add_button.setFixedSize(30, 22) delete_button.setFixedSize(30, 22) # Add list item callback add_hook = partial(ControllerControlWidget.add_item, weak_proxy(parent), control_name, weak_proxy(frame)) add_button.clicked.connect(add_hook) # Create the associated controller widget controller_widget = ControllerWidget(control_value, parent=frame, live=True, editable_labels=editable_labels) # Store some parameters in the list widget frame.trait = trait frame.controller = control_value frame.controller_widget = controller_widget frame.connected = False # Add the list controller widget to the list widget frame.setLayout(controller_widget.layout()) # Set some callback on the controller control tools # Resize callback resize_hook = partial(ControllerControlWidget.expand_or_collapse, weak_proxy(frame), weak_proxy(resize_button)) resize_button.clicked.connect(resize_hook) if getattr(trait, 'expanded') is False: ControllerControlWidget.set_expanded(frame, resize_button, False) # Create the label associated with the controller widget control_label = trait.label if control_label is None: control_label = control_name if label_class is None: label_class = QtGui.QLabel if control_label is not None: label = label_class(control_label, parent) else: label = None return (frame, (label, tool_widget))