def createCustomFillBox(self): # create layout for custom fill scroll_area = ForceResizeScrollArea() grid_layout = DynamicGridLayout(400) dynamic_widget = QtGui.QWidget() dynamic_widget.setLayout(grid_layout) scroll_area.setWidgetResizable(True) level_names = self.object.level_names grid_widgets = [] # populate rows for index, label in enumerate(level_names): color = self.object.level_color(index) item = CustomFillWidget(index, label, color) item.colorChanged.connect(self.object.set_level_color) item.opacityChanged.connect(self.object.set_level_opacity) item.buttonColorChanged.connect(self.updateButtonColor) item.patternChanged.connect(self.object.set_level_pattern) item.colormapChanged.connect(self.updateButtonColor) item.createColormapRequest.connect(self.createColormap) item.setColor(color) item.changeOpacity(100) item.attributeChanged.connect(self.preview.update) grid_widgets.append(item) # adding widgets(plural) only calls build grid once instead of once for each widget grid_layout.setColumnWidth(int(grid_widgets[-1].minimumSizeHint().width())) grid_layout.addNewWidgets(grid_widgets) scroll_area.setWidget(dynamic_widget) return scroll_area
def __init__(self): super(DictEditorWidget, self).__init__() self.valid_keys = None self.key_value_rows = [] self.grid = DynamicGridLayout(350) self.clearing = False wrap = QVBoxLayout() add_button = QPushButton() add_button.setText("New Line") add_button.clicked.connect(self.insertRow) self.setLayout(wrap) wrap.addLayout(self.grid) wrap.addWidget(add_button)
def createCustomFillBox(self): # create layout for custom fill scroll_area = ForceResizeScrollArea() grid_layout = DynamicGridLayout(400) dynamic_widget = QtGui.QWidget() dynamic_widget.setLayout(grid_layout) scroll_area.setWidgetResizable(True) level_names = self.object.level_names grid_widgets = [] # populate rows for index, label in enumerate(level_names): color = self.object.level_color(index) item = CustomFillWidget(index, label, color) item.colorChanged.connect(self.object.set_level_color) item.opacityChanged.connect(self.object.set_level_opacity) item.buttonColorChanged.connect(self.updateButtonColor) item.patternChanged.connect(self.object.set_level_pattern) item.colormapChanged.connect(self.updateButtonColor) item.createColormapRequest.connect(self.createColormap) item.setColor(color) item.changeOpacity(100) item.attributeChanged.connect(self.preview.update) grid_widgets.append(item) # adding widgets(plural) only calls build grid once instead of once for each widget grid_layout.setColumnWidth( int(grid_widgets[-1].minimumSizeHint().width())) grid_layout.addNewWidgets(grid_widgets) scroll_area.setWidget(dynamic_widget) return scroll_area
class DictEditorWidget(QWidget): dictEdited = Signal(dict) def __init__(self): super(DictEditorWidget, self).__init__() self.valid_keys = None self.key_value_rows = [] self.grid = DynamicGridLayout(350) self.clearing = False wrap = QVBoxLayout() add_button = QPushButton() add_button.setText("New Line") add_button.clicked.connect(self.insertRow) self.setLayout(wrap) wrap.addLayout(self.grid) wrap.addWidget(add_button) # Update Combo Boxes def updateCBoxes(self, cur_row): cur_text = cur_row.key() for row in self.key_value_rows: check_text = row.key() # check if boxes match and set to blank if so if row != cur_row: if check_text == cur_text: # accessing edit_key here row.edit_key.setCurrentIndex(0) # check if valid for emission def checkKeyValues(self): keys = [] values = [] for row in self.key_value_rows: l_text = row.key() r_text = row.value() if l_text and l_text not in keys: keys.append(l_text) values.append(r_text) return keys, values def emitSignal(self): keys, values = self.checkKeyValues() if keys and values: self.dictEdited.emit(dict(zip(keys, values))) # populate if dictionary is given def insertRow(self, key="", value=""): if self.valid_keys and len( self.grid.getWidgets()) >= len(self.valid_keys) - 1: return new_row = KeyValueRow(key, value, self.valid_keys, self) new_row.updatedKey.connect(self.emitSignal) new_row.updatedValue.connect(self.emitSignal) new_row.clickedRemove.connect(self.removeRow) if not self.valid_keys: validator = InputChecker(new_row, self.grid.getWidgets()) new_row.setKeyValidator(validator) if self.valid_keys: new_row.updatedKey.connect(self.updateCBoxes) self.grid.addNewWidget(new_row) self.key_value_rows.append(new_row) def removeRow(self, row_widget): # Remove from list self.key_value_rows.remove(row_widget) # remove from reflow self.grid.removeWidget(row_widget) # delete widget row_widget.deleteLater() if not self.clearing: self.emitSignal() # set valid keys to be selected # must call setValidKeys before calling setDict def setValidKeys(self, keys): self.valid_keys = keys self.valid_keys.insert(0, "") # set inital dictionary values def setDict(self, dictionary): self.clear() for key in sorted(dictionary.keys()): self.insertRow(key, dictionary[key]) # return valid keys def validKeys(self): return self.valid_keys # return dictionary def dict(self): keys = [] values = [] for row in self.key_value_rows: keys.append(row.key()) values.append(row.value()) return dict(zip(keys, values)) def clear(self): self.grid.clearWidget() self.clearing = True while self.key_value_rows: row = self.key_value_rows[0] self.removeRow(row) self.clearing = False
class DictEditorWidget(QWidget): dictEdited = Signal(dict) def __init__(self): super(DictEditorWidget, self).__init__() self.valid_keys = None self.key_value_rows = [] self.grid = DynamicGridLayout(350) self.clearing = False wrap = QVBoxLayout() add_button = QPushButton() add_button.setText("New Line") add_button.clicked.connect(self.insertRow) self.setLayout(wrap) wrap.addLayout(self.grid) wrap.addWidget(add_button) # Update Combo Boxes def updateCBoxes(self, cur_row): cur_text = cur_row.key() for row in self.key_value_rows: check_text = row.key() # check if boxes match and set to blank if so if row != cur_row: if check_text == cur_text: # accessing edit_key here row.edit_key.setCurrentIndex(0) # check if valid for emission def checkKeyValues(self): keys = [] values = [] for row in self.key_value_rows: l_text = row.key() r_text = row.value() if l_text and l_text not in keys: keys.append(l_text) values.append(r_text) return keys, values def emitSignal(self): keys, values = self.checkKeyValues() if keys and values: self.dictEdited.emit(dict(zip(keys, values))) # populate if dictionary is given def insertRow(self, key="", value=""): if self.valid_keys and len(self.grid.getWidgets()) >= len(self.valid_keys) - 1: return new_row = KeyValueRow(key, value, self.valid_keys, self) new_row.updatedKey.connect(self.emitSignal) new_row.updatedValue.connect(self.emitSignal) new_row.clickedRemove.connect(self.removeRow) if not self.valid_keys: validator = InputChecker(new_row, self.grid.getWidgets()) new_row.setKeyValidator(validator) if self.valid_keys: new_row.updatedKey.connect(self.updateCBoxes) self.grid.addNewWidget(new_row) self.key_value_rows.append(new_row) def removeRow(self, row_widget): # Remove from list self.key_value_rows.remove(row_widget) # remove from reflow self.grid.removeWidget(row_widget) # delete widget row_widget.deleteLater() if not self.clearing: self.emitSignal() # set valid keys to be selected # must call setValidKeys before calling setDict def setValidKeys(self, keys): self.valid_keys = keys self.valid_keys.insert(0, "") # set inital dictionary values def setDict(self, dictionary): self.clear() for key in sorted(dictionary.keys()): self.insertRow(key, dictionary[key]) # return valid keys def validKeys(self): return self.valid_keys # return dictionary def dict(self): keys = [] values = [] for row in self.key_value_rows: keys.append(row.key()) values.append(row.value()) return dict(zip(keys, values)) def clear(self): self.grid.clearWidget() self.clearing = True while self.key_value_rows: row = self.key_value_rows[0] self.removeRow(row) self.clearing = False