class DefaultAttributeHandler(QGroupBox, AbstractAttributeHandler): def __init__(self, attribute, values, parent=None): QGroupBox.__init__(self, attribute, parent) self._attribute = attribute self._current_items = [] self._defaults = {} self._inputField = None self._inputFieldType = None self._insertIndex = -1 self._insertAtEnd = False self._shortcuts = {} # Setup GUI self._layout = FloatingLayout() self.setLayout(self._layout) self._buttons = {} # Add interface elements self.updateValues(values) def focusInputField(self, selectInput=True): if self._inputField is not None: if selectInput: self._inputField.selectAll() self._inputField.setFocus(Qt.ShortcutFocusReason) def addShortcut(self, shortcut, widget, value): if widget is not None: if shortcut not in self._shortcuts: sc = QShortcut(QKeySequence(shortcut), self) self._shortcuts[shortcut] = sc if isinstance(widget, QPushButton): sc.activated.connect(bind(lambda w: w.click() if not w.isChecked() else None, widget)) elif isinstance(widget, QLineEdit): sc.activated.connect(self.focusInputField) else: raise ImproperlyConfigured("Shortcut '%s' defined more than once" % shortcut) else: raise ImproperlyConfigured("Shortcut '%s' defined for value '%s' which is hidden" % (shortcut, value)) def updateValues(self, values): if isinstance(values, type): self.addInputField(values) else: for val in values: v = val shortcut = None widget = None # Handle the case of the value being a 2-tuple consisting of (value, shortcut) if type(val) is tuple or type(val) is list: if len(val) == 2: v = val[0] shortcut = val[1] else: raise ImproperlyConfigured("Values must be types, strings, numbers, or tuples of length 2: '%s'" % str(val)) # Handle the case where value is a Python type if isinstance(v, type): if v is float or v is int or v is str: self.addInputField(v) widget = self._inputField else: raise ImproperlyConfigured("Input field with type '%s' not supported" % v) # * marks the position where buttons for new values will be insered elif val == "*" or val == "<*": self._insertIndex = self._layout.count() elif val == "*>": self._insertIndex = self._layout.count() self._insertAtEnd = True # Add the value button else: self.addValue(v) widget = self._buttons[v] # If defined, add the specified shortcut if shortcut is not None: self.addShortcut(shortcut, widget, v) def defaults(self): return self._defaults def autoAddEnabled(self): return self._insertIndex >= 0 def onInputFieldReturnPressed(self): val = str(self._inputField.text()) self.addValue(val, True) for item in self._current_items: item[self._attribute] = val self.updateButtons() self.updateInputField() self._inputField.clearFocus() def addInputField(self, _type): if self._inputField is None: self._inputFieldType = _type self._inputField = QLineEdit() if _type is float: self._inputField.setValidator(QDoubleValidator()) elif _type is int: self._inputField.setValidator(QIntValidator()) self._layout.addWidget(self._inputField) self._inputField.returnPressed.connect(self.onInputFieldReturnPressed) elif self._inputFieldType is not _type: raise ImproperlyConfigured("Input field for attribute '%s' configured twice with different types %s != %s"\ % (self._attribute, self._inputFieldType, _type)) def addValue(self, v, autoAddValue=False): if v in self._buttons: return if autoAddValue and self._insertIndex < 0: return button = QPushButton(v, self) button.setFlat(True) button.setCheckable(True) self._buttons[v] = button if autoAddValue: self._layout.insertWidget(self._insertIndex, button) if self._insertAtEnd: self._insertIndex += 1 else: self._layout.addWidget(button) button.clicked.connect(bind(self.onButtonClicked, v)) def reset(self): self._current_items = [] for v, button in self._buttons.items(): button.setChecked(False) button.setFlat(True) def getSelectedValues(self): return set([str(item[self._attribute]) for item in self._current_items if self._attribute in item and item[self._attribute] is not None]) def updateInputField(self): if self._inputField is not None: self._inputField.clear() selected_values = self.getSelectedValues() if len(selected_values) > 1: self._inputField.setPlaceholderText(", ".join(selected_values)) elif len(selected_values) == 1: it = iter(selected_values) self._inputField.setText(next(it)) def updateButtons(self): selected_values = self.getSelectedValues() for val, button in self._buttons.items(): if val in selected_values: if len(selected_values) > 1: button.setFlat(False) button.setChecked(False) else: button.setFlat(True) button.setChecked(True) else: button.setFlat(True) button.setChecked(False) def setItems(self, items, showItemClasses=False): self.reset() if showItemClasses: title = ", ".join(set([item['class'] for item in items])) self.setTitle(self._attribute + " (" + title + ")") else: self.setTitle(self._attribute) self._current_items = items self.updateButtons() self.updateInputField() def onButtonClicked(self, val): attr = self._attribute LOG.debug("Button %s: %s clicked" % (attr, val)) button = self._buttons[val] # Update model item for item in self._current_items: if button.isChecked(): item[attr] = val else: item[attr] = None # Unpress all other buttons for v, but in self._buttons.items(): but.setFlat(True) if but is not button: but.setChecked(False) # Update input field self.updateInputField()
class DefaultAttributeHandler(QGroupBox, AbstractAttributeHandler): def __init__(self, attribute, values, parent=None): QGroupBox.__init__(self, attribute, parent) self._attribute = attribute self._current_items = [] self._defaults = {} self._inputField = None self._inputFieldType = None self._insertIndex = -1 self._insertAtEnd = False self._shortcuts = {} # Setup GUI self._layout = FloatingLayout() self.setLayout(self._layout) self._buttons = {} # Add interface elements self.updateValues(values) def focusInputField(self, selectInput=True): if self._inputField is not None: if selectInput: self._inputField.selectAll() self._inputField.setFocus(Qt.ShortcutFocusReason) def addShortcut(self, shortcut, widget, value): if widget is not None: if shortcut not in self._shortcuts: sc = QShortcut(QKeySequence(shortcut), self) self._shortcuts[shortcut] = sc if isinstance(widget, QPushButton): sc.activated.connect( bind( lambda w: w.click() if not w.isChecked() else None, widget)) elif isinstance(widget, QLineEdit): sc.activated.connect(self.focusInputField) else: raise ImproperlyConfigured( "Shortcut '%s' defined more than once" % shortcut) else: raise ImproperlyConfigured( "Shortcut '%s' defined for value '%s' which is hidden" % (shortcut, value)) def updateValues(self, values): if isinstance(values, type): self.addInputField(values) else: for val in values: v = val shortcut = None widget = None # Handle the case of the value being a 2-tuple consisting of (value, shortcut) if type(val) is tuple or type(val) is list: if len(val) == 2: v = val[0] shortcut = val[1] else: raise ImproperlyConfigured( "Values must be types, strings, numbers, or tuples of length 2: '%s'" % str(val)) # Handle the case where value is a Python type if isinstance(v, type): if v is float or v is int or v is str: self.addInputField(v) widget = self._inputField else: raise ImproperlyConfigured( "Input field with type '%s' not supported" % v) # * marks the position where buttons for new values will be insered elif val == "*" or val == "<*": self._insertIndex = self._layout.count() elif val == "*>": self._insertIndex = self._layout.count() self._insertAtEnd = True # Add the value button else: self.addValue(v) widget = self._buttons[v] # If defined, add the specified shortcut if shortcut is not None: self.addShortcut(shortcut, widget, v) def defaults(self): return self._defaults def autoAddEnabled(self): return self._insertIndex >= 0 def onInputFieldReturnPressed(self): val = str(self._inputField.text()) self.addValue(val, True) for item in self._current_items: item[self._attribute] = val self.updateButtons() self.updateInputField() self._inputField.clearFocus() def addInputField(self, _type): if self._inputField is None: self._inputFieldType = _type self._inputField = QLineEdit() if _type is float: self._inputField.setValidator(QDoubleValidator()) elif _type is int: self._inputField.setValidator(QIntValidator()) self._layout.addWidget(self._inputField) self._inputField.returnPressed.connect( self.onInputFieldReturnPressed) elif self._inputFieldType is not _type: raise ImproperlyConfigured("Input field for attribute '%s' configured twice with different types %s != %s"\ % (self._attribute, self._inputFieldType, _type)) def addValue(self, v, autoAddValue=False): if v in self._buttons: return if autoAddValue and self._insertIndex < 0: return button = QPushButton(v, self) button.setFlat(True) button.setCheckable(True) self._buttons[v] = button if autoAddValue: self._layout.insertWidget(self._insertIndex, button) if self._insertAtEnd: self._insertIndex += 1 else: self._layout.addWidget(button) button.clicked.connect(bind(self.onButtonClicked, v)) def reset(self): self._current_items = [] for v, button in self._buttons.items(): button.setChecked(False) button.setFlat(True) def getSelectedValues(self): return set([ str(item[self._attribute]) for item in self._current_items if self._attribute in item and item[self._attribute] is not None ]) def updateInputField(self): if self._inputField is not None: self._inputField.clear() selected_values = self.getSelectedValues() if len(selected_values) > 1: self._inputField.setPlaceholderText(", ".join(selected_values)) elif len(selected_values) == 1: it = iter(selected_values) self._inputField.setText(next(it)) def updateButtons(self): selected_values = self.getSelectedValues() for val, button in self._buttons.items(): if val in selected_values: if len(selected_values) > 1: button.setFlat(False) button.setChecked(False) else: button.setFlat(True) button.setChecked(True) else: button.setFlat(True) button.setChecked(False) def setItems(self, items, showItemClasses=False): self.reset() if showItemClasses: title = ", ".join(set([item['class'] for item in items])) self.setTitle(self._attribute + " (" + title + ")") else: self.setTitle(self._attribute) self._current_items = items self.updateButtons() self.updateInputField() def onButtonClicked(self, val): attr = self._attribute LOG.debug("Button %s: %s clicked" % (attr, val)) button = self._buttons[val] # Update model item for item in self._current_items: if button.isChecked(): item[attr] = val else: item[attr] = None # Unpress all other buttons for v, but in self._buttons.items(): but.setFlat(True) if but is not button: but.setChecked(False) # Update input field self.updateInputField()
class DefaultAttributeHandler(QGroupBox, AbstractAttributeHandler): def __init__(self, attribute, values, parent=None): QGroupBox.__init__(self, attribute, parent) self._attribute = attribute self._current_items = [] self._defaults = {} self._inputField = None self._inputFieldType = None self._insertIndex = -1 self._insertAtEnd = False self._shortcuts = {} # Setup GUI self._layout = FloatingLayout() self.setLayout(self._layout) self._buttons = {} self._labels = {} #Abhishek : Add Label Dropdown self.ann_input_combo = ExtendedCombo(self) self._layout.insertWidget(0,self.ann_input_combo) self.ann_input_combo.show() self.modelItem = QStandardItemModel() self.ann_input_combo.setModel(self.modelItem) self.ann_input_combo.setModelColumn(0) self.ann_input_combo.currentIndexChanged.connect(self.onAnnotationValueSelected) # Add interface elements self.updateValues(values) def updateValues(self, values): if isinstance(values, type): self.addInputField(values) else: for i, val in enumerate(values): v = val shortcut = None widget = None # Handle the case of the value being a 2-tuple consisting of (value, shortcut) if type(val) is tuple or type(val) is list: if len(val) == 2: v = val[0] shortcut = val[1] else: raise ImproperlyConfigured("Values must be types, strings, numbers, or tuples of length 2: '%s'" % str(val)) # Handle the case where value is a Python type if isinstance(v, type): if v is float or v is int or v is str: self.addInputField(v) widget = self._inputField else: raise ImproperlyConfigured("Input field with type '%s' not supported" % v) # * marks the position where buttons for new values will be insered elif val == "*" or val == "<*": self._insertIndex = self._layout.count() elif val == "*>": self._insertIndex = self._layout.count() self._insertAtEnd = True # Add the value button else: self.addValue(i,v) # Set default value if val[0] is not None: self.ann_input_combo.setCurrentIndex(0) def defaults(self): return self._defaults def autoAddEnabled(self): return self._insertIndex >= 0 def addValue(self, i ,v, autoAddValue=False): if v in self._labels: return if autoAddValue and self._insertIndex < 0: return self._labels[i] = v item = QStandardItem(v) self.modelItem.setItem(i, 0, item) def reset(self): self._current_items = [] for v, button in self._buttons.items(): button.setChecked(False) button.setFlat(True) def getSelectedValues(self): return set([str(item[self._attribute]) for item in self._current_items if self._attribute in item and item[self._attribute] is not None]) def updateInputField(self): if self._inputField is not None: self._inputField.clear() selected_values = self.getSelectedValues() if len(selected_values) > 1: self._inputField.setPlaceholderText(", ".join(selected_values)) elif len(selected_values) == 1: it = iter(selected_values) self._inputField.setText(next(it)) def updateButtons(self): return selected_values = self.getSelectedValues() for val, button in self._buttons.items(): if val in selected_values: if len(selected_values) > 1: button.setFlat(False) button.setChecked(False) else: button.setFlat(True) button.setChecked(True) else: button.setFlat(True) button.setChecked(False) def setItems(self, items, showItemClasses=False): self.reset() if showItemClasses: title = ", ".join(set([item['class'] for item in items])) self.setTitle(self._attribute + " (" + title + ")") else: self.setTitle(self._attribute) self._current_items = items self.updateButtons() self.updateInputField() def onAnnotationValueSelected(self, val): attr = self._attribute LOG.debug("%s: %s selected" % (attr, val)) selectedVal = str(self.ann_input_combo.currentText()) # Update model item for item in self._current_items: item[attr] = selectedVal # Update input field self.updateInputField()