def update_editor ( self ): """ Updates the editor when the object trait changes externally to the editor. """ self.mapper = QtCore.QSignalMapper(self.control) # Disconnect the editor from any control about to be destroyed: self._dispose_items() list_pane = self._list_pane layout = list_pane.layout() # Create all of the list item trait editors: trait_handler = self._trait_handler resizable = ((trait_handler.minlen != trait_handler.maxlen) and self.mutable) item_trait = trait_handler.item_trait is_fake = (resizable and (len( self.value ) == 0)) if is_fake: self.empty_list() else: # Asking the mapper to send the sender to the callback method self.mapper.mapped[QtCore.QObject].connect(self.popup_menu) editor = self._editor for index, value in enumerate(self.value): row, column = divmod(index, self.factory.columns) # Account for the fact that we have <columns> number of # pairs column = column * 2 if resizable: # Connecting the new button to the mapper control = IconButton('list_editor.png', self.mapper.map) # Setting the mapping and asking it to send the index of the # sender to the callback method self.mapper.setMapping(control, control) layout.addWidget(control, row, column) proxy = ListItemProxy( self.object, self.name, index, item_trait, value ) if resizable: control.proxy = proxy peditor = editor( self.ui, proxy, 'value', self.description, list_pane ).set( object_name = '' ) peditor.prepare( list_pane ) pcontrol = peditor.control pcontrol.proxy = proxy if isinstance(pcontrol, QtGui.QWidget): layout.addWidget(pcontrol, row, column+1) else: layout.addLayout(pcontrol, row, column+1) # QScrollArea can have problems if the widget being scrolled is set too # early (ie. before it contains something). if self.control.widget() is None: self.control.setWidget(list_pane)
def update_editor(self): """ Updates the editor when the object trait changes externally to the editor. """ self.mapper = QtCore.QSignalMapper(self.control) # Disconnect the editor from any control about to be destroyed: self._dispose_items() list_pane = self._list_pane layout = list_pane.layout() # Create all of the list item trait editors: trait_handler = self._trait_handler resizable = ((trait_handler.minlen != trait_handler.maxlen) and self.mutable) item_trait = trait_handler.item_trait is_fake = (resizable and (len(self.value) == 0)) if is_fake: self.empty_list() else: # Asking the mapper to send the sender to the callback method self.mapper.mapped[QtCore.QObject].connect(self.popup_menu) editor = self._editor for index, value in enumerate(self.value): row, column = divmod(index, self.factory.columns) # Account for the fact that we have <columns> number of # pairs column = column * 2 if resizable: # Connecting the new button to the mapper control = IconButton('list_editor.png', self.mapper.map) # Setting the mapping and asking it to send the index of the # sender to the callback method self.mapper.setMapping(control, control) layout.addWidget(control, row, column) proxy = ListItemProxy(self.object, self.name, index, item_trait, value) if resizable: control.proxy = proxy peditor = editor(self.ui, proxy, 'value', self.description, list_pane).set(object_name='') peditor.prepare(list_pane) pcontrol = peditor.control pcontrol.proxy = proxy if isinstance(pcontrol, QtGui.QWidget): layout.addWidget(pcontrol, row, column + 1) else: layout.addLayout(pcontrol, row, column + 1) # QScrollArea can have problems if the widget being scrolled is set too # early (ie. before it contains something). if self.control.widget() is None: self.control.setWidget(list_pane)
def empty_list ( self ): """ Creates an empty list entry (so the user can add a new item). """ control = IconButton('list_editor.png', self.popup_empty_menu) control.is_empty = True self._cur_control = control proxy = ListItemProxy( self.object, self.name, -1, None, None ) pcontrol = QtGui.QLabel(' (Empty List)') pcontrol.proxy = control.proxy = proxy layout = self._list_pane.layout() layout.addWidget(control, 0, 0) layout.addWidget(pcontrol, 0, 1)
def empty_list(self): """ Creates an empty list entry (so the user can add a new item). """ control = IconButton('list_editor.png', self.popup_empty_menu) control.is_empty = True self._cur_control = control proxy = ListItemProxy(self.object, self.name, -1, None, None) pcontrol = QtGui.QLabel(' (Empty List)') pcontrol.proxy = control.proxy = proxy layout = self._list_pane.layout() layout.addWidget(control, 0, 0) layout.addWidget(pcontrol, 0, 1)
def update_editor ( self ): """ Updates the editor when the object trait changes externally to the editor. """ # Disconnect the editor from any control about to be destroyed: self._dispose_items() list_pane = self._list_pane layout = list_pane.layout() # Create all of the list item trait editors: trait_handler = self._trait_handler resizable = ((trait_handler.minlen != trait_handler.maxlen) and self.mutable) item_trait = trait_handler.item_trait is_fake = (resizable and (len( self.value ) == 0)) if is_fake: self.empty_list() editor = self._editor # FIXME: Add support for more than one column. for index, value in enumerate(self.value): if resizable: control = IconButton('list_editor.png', self.popup_menu) layout.addWidget(control, index, 0) proxy = ListItemProxy( self.object, self.name, index, item_trait, value ) if resizable: control.proxy = proxy peditor = editor( self.ui, proxy, 'value', self.description, list_pane ).set( object_name = '' ) peditor.prepare( list_pane ) pcontrol = peditor.control pcontrol.proxy = proxy if isinstance(pcontrol, QtGui.QWidget): layout.addWidget(pcontrol, index, 1) else: layout.addLayout(pcontrol, index, 1) # QScrollArea can have problems if the widget being scrolled is set too # early (ie. before it contains something). if self.control.widget() is None: self.control.setWidget(list_pane)
def empty_list(self): """ Creates an empty list entry (so the user can add a new item). """ # Connecting the new button to the mapper control = IconButton('list_editor.png', self.mapper.map) # Setting the mapping and asking it to send the sender to the # callback method self.mapper.setMapping(control, control) self.mapper.mapped[QtCore.QObject].connect(self.popup_empty_menu) control.is_empty = True self._cur_control = control proxy = ListItemProxy(self.object, self.name, -1, None, None) pcontrol = QtGui.QLabel(' (Empty List)') pcontrol.proxy = control.proxy = proxy layout = self._list_pane.layout() layout.addWidget(control, 0, 0) layout.addWidget(pcontrol, 0, 1)
def empty_list ( self ): """ Creates an empty list entry (so the user can add a new item). """ # Connecting the new button to the mapper control = IconButton('list_editor.png', self.mapper.map) # Setting the mapping and asking it to send the sender to the # callback method self.mapper.setMapping(control, control) self.mapper.mapped[QtCore.QObject].connect(self.popup_empty_menu) control.is_empty = True self._cur_control = control proxy = ListItemProxy( self.object, self.name, -1, None, None ) pcontrol = QtGui.QLabel(' (Empty List)') pcontrol.proxy = control.proxy = proxy layout = self._list_pane.layout() layout.addWidget(control, 0, 0) layout.addWidget(pcontrol, 0, 1)
def empty_list(self): """ Creates an empty list entry (so the user can add a new item). """ # Connecting the new button to the mapper control = IconButton('list_editor.png', self.mapper.map) # Setting the mapping and asking it to send the index of the sender to # callback method. Unfortunately just sending the control does not # work for PyQt (tested on 4.11) self.mapper.setMapping(control, 0) self.mapper.mapped.connect(self.popup_empty_menu) control.is_empty = True self._cur_control = control self.buttons = [control] proxy = ListItemProxy(self.object, self.name, -1, None, None) pcontrol = QtGui.QLabel(' (Empty List)') pcontrol.proxy = control.proxy = proxy layout = self._list_pane.layout() layout.addWidget(control, 0, 1) layout.addWidget(pcontrol, 0, 0)
def init(self, parent): """ Finishes initializing the editor by creating the underlying toolkit widget. """ self.control = QtGui.QWidget() layout = QtGui.QHBoxLayout(self.control) layout.setContentsMargins(0, 0, 0, 0) self._file_name = control = QtGui.QLineEdit() layout.addWidget(control) if self.factory.auto_set: signal = QtCore.SIGNAL('textEdited(QString)') else: # Assume enter_set is set, or else the value will never get updated. signal = QtCore.SIGNAL('editingFinished()') QtCore.QObject.connect(control, signal, self.update_object) button = IconButton(QtGui.QStyle.SP_DirIcon, self.show_file_dialog) layout.addWidget(button) self.set_tooltip(control)
def init(self, parent): """ Finishes initializing the editor by creating the underlying toolkit widget. """ factory = self.factory # Initialize using the factory range defaults: self.low = factory.low self.high = factory.high self.evaluate = factory.evaluate # Hook up the traits to listen to the object. self.sync_value(factory.low_name, 'low', 'from') self.sync_value(factory.high_name, 'high', 'from') self.sync_value(factory.evaluate_name, 'evaluate', 'from') self.init_range() low = self.cur_low high = self.cur_high self._set_format() self.control = QtGui.QWidget() panel = QtGui.QHBoxLayout(self.control) panel.setContentsMargins(0, 0, 0, 0) fvalue = self.value try: fvalue_text = self._format % fvalue 1 / (low <= fvalue <= high) except: fvalue_text = '' fvalue = low if high > low: ivalue = int((float(fvalue - low) / (high - low)) * 10000) else: ivalue = low # Lower limit label: self.control.label_lo = label_lo = QtGui.QLabel() label_lo.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) panel.addWidget(label_lo) # Lower limit button: self.control.button_lo = IconButton(QtGui.QStyle.SP_ArrowLeft, self.reduce_range) panel.addWidget(self.control.button_lo) # Slider: self.control.slider = slider = QtGui.QSlider(QtCore.Qt.Horizontal) slider.setTracking(factory.auto_set) slider.setMinimum(0) slider.setMaximum(10000) slider.setPageStep(1000) slider.setSingleStep(100) slider.setValue(ivalue) slider.valueChanged.connect(self.update_object_on_scroll) panel.addWidget(slider) # Upper limit button: self.control.button_hi = IconButton(QtGui.QStyle.SP_ArrowRight, self.increase_range) panel.addWidget(self.control.button_hi) # Upper limit label: self.control.label_hi = label_hi = QtGui.QLabel() panel.addWidget(label_hi) # Text entry: self.control.text = text = QtGui.QLineEdit(fvalue_text) text.editingFinished.connect(self.update_object_on_enter) # The default size is a bit too big and probably doesn't need to grow. sh = text.sizeHint() sh.setWidth(sh.width() / 2) text.setMaximumSize(sh) panel.addWidget(text) label_lo.setText(str(low)) label_hi.setText(str(high)) self.set_tooltip(slider) self.set_tooltip(label_lo) self.set_tooltip(label_hi) self.set_tooltip(text) # Update the ranges and button just in case. self.update_range_ui()