def __init__(self, parent, new_encounter, for_table, tableRef=None): super(addEncounter, self).__init__() self.ui = Ui_addEncounter() self.ui.setupUi(self) self.parent = parent self.for_table = for_table self.tableRef = tableRef self.rows_included = [] # Contains all of the active filters as well as the rows they apply to. self.filter_dict = {} self.ui.cancelButton.clicked.connect(self.cancel) self.ui.addFilterButton.clicked.connect(self.addFilter) self.ui.removeFilterButton.clicked.connect(self.removeFilter) self.ui.addButton.clicked.connect(self.addToEncounter) self.ui.removeButton.clicked.connect(self.removeFromEncounter) self.ui.acceptButton.clicked.connect(self.acceptEncounter) self.ui.instructionButton.clicked.connect(self.instruct) # Populate the Library table. self.current_library = populateTable(self.ui.libraryTable, self.parent.libraryName, False) # If we are editing an encounter load it up. if not new_encounter: self.loadEncounter() self.ui.currentEncounterTable.setSortingEnabled(False) self.ui.currentEncounterTable.setColumnCount( len(self.current_library.field_list) + 1) i = 1 for item in self.current_library.field_list: self.ui.currentEncounterTable.setHorizontalHeaderItem( i, QTableWidgetItem(item)) i += 1 self.ui.currentEncounterTable.setHorizontalHeaderItem( 0, QTableWidgetItem("Qty")) # Load the field selector. for i in range(self.ui.libraryTable.columnCount()): self.ui.filterFieldBox.addItem( self.ui.libraryTable.horizontalHeaderItem(i).text())
def __init__(self, parent, new_encounter, for_table, tableRef=None): super(addEncounter, self).__init__() self.ui = Ui_addEncounter() self.ui.setupUi(self) self.parent = parent self.for_table = for_table self.tableRef = tableRef self.rows_included = [] # Contains all of the active filters as well as the rows they apply to. self.filter_dict = {} self.ui.cancelButton.clicked.connect(self.cancel) self.ui.addFilterButton.clicked.connect(self.addFilter) self.ui.removeFilterButton.clicked.connect(self.removeFilter) self.ui.addButton.clicked.connect(self.addToEncounter) self.ui.removeButton.clicked.connect(self.removeFromEncounter) self.ui.acceptButton.clicked.connect(self.acceptEncounter) self.ui.instructionButton.clicked.connect(self.instruct) # Populate the Library table. self.current_library = populateTable(self.ui.libraryTable, self.parent.libraryName, False) # If we are editing an encounter load it up. if not new_encounter: self.loadEncounter() self.ui.currentEncounterTable.setSortingEnabled(False) self.ui.currentEncounterTable.setColumnCount(len(self.current_library.field_list) + 1) i = 1 for item in self.current_library.field_list: self.ui.currentEncounterTable.setHorizontalHeaderItem(i, QTableWidgetItem(item)) i += 1 self.ui.currentEncounterTable.setHorizontalHeaderItem(0, QTableWidgetItem("Qty")) # Load the field selector. for i in range(self.ui.libraryTable.columnCount()): self.ui.filterFieldBox.addItem(self.ui.libraryTable.horizontalHeaderItem(i).text())
class addEncounter(QWidget): def __init__(self, parent, new_encounter, for_table, tableRef=None): super(addEncounter, self).__init__() self.ui = Ui_addEncounter() self.ui.setupUi(self) self.parent = parent self.for_table = for_table self.tableRef = tableRef self.rows_included = [] # Contains all of the active filters as well as the rows they apply to. self.filter_dict = {} self.ui.cancelButton.clicked.connect(self.cancel) self.ui.addFilterButton.clicked.connect(self.addFilter) self.ui.removeFilterButton.clicked.connect(self.removeFilter) self.ui.addButton.clicked.connect(self.addToEncounter) self.ui.removeButton.clicked.connect(self.removeFromEncounter) self.ui.acceptButton.clicked.connect(self.acceptEncounter) self.ui.instructionButton.clicked.connect(self.instruct) # Populate the Library table. self.current_library = populateTable(self.ui.libraryTable, self.parent.libraryName, False) # If we are editing an encounter load it up. if not new_encounter: self.loadEncounter() self.ui.currentEncounterTable.setSortingEnabled(False) self.ui.currentEncounterTable.setColumnCount(len(self.current_library.field_list) + 1) i = 1 for item in self.current_library.field_list: self.ui.currentEncounterTable.setHorizontalHeaderItem(i, QTableWidgetItem(item)) i += 1 self.ui.currentEncounterTable.setHorizontalHeaderItem(0, QTableWidgetItem("Qty")) # Load the field selector. for i in range(self.ui.libraryTable.columnCount()): self.ui.filterFieldBox.addItem(self.ui.libraryTable.horizontalHeaderItem(i).text()) def instruct(self): msg = QMessageBox() msg.setWindowTitle("Instructions") msg.setText("How to filter:\n" + "Select field to filter from the dropdown.\n\n" + "Text Fields: Enter substring to filter.\n" + "Numeric Fields: Enter range in form of min-max, you can leave either blank.\n") msg.exec_() def cancel(self): self.close() def addFilter(self): ''' If the field type is text then the user can only search for a specific string. If the field type is int then the user can specify a range or a max or min value. ''' new_filter = self.ui.filterEdit.text() field_to_filter = self.ui.filterFieldBox.currentText() self.filter_dict[new_filter] = [] # Determine the field type. filter_type = self.current_library.field_types[field_to_filter] column_of_interest = self.current_library.field_list.index(field_to_filter) # Filter current selection based on the entered string. if filter_type == "text": for i in range(self.ui.libraryTable.rowCount()): # if not self.ui.libraryTable.isRowHidden(i): # Make the cell lowercase. current_field = self.ui.libraryTable.item(i, column_of_interest).text().lower() if new_filter.lower() not in current_field: self.filter_dict[new_filter].append(i) self.ui.libraryTable.setRowHidden(i, True) else: if re.match('\d*-?\d*', new_filter) is not None: search_list = new_filter.split('-') if len(search_list) > 1: if len(search_list) > 2: print(1) errorMessage("Invalid syntax for filter, please\nsee help button for usage.") return if search_list[0] == '': mini = 0 else: mini = int(search_list[0]) if search_list[1] == '': maxi = sys.maxsize else: maxi = int(search_list[1]) if not checkInt(mini) or not checkInt(maxi): print(2) errorMessage("Invalid syntax for filter, please\nsee help button for usage.") return for i in range(self.ui.libraryTable.rowCount()): # if not self.ui.libraryTable.isRowHidden(i): # Make the cell an int. current_field = int(self.ui.libraryTable.item(i, column_of_interest).text()) if not mini <= current_field <= maxi: self.filter_dict[new_filter].append(i) self.ui.libraryTable.setRowHidden(i, True) else: if not checkInt(new_filter): errorMessage("Invalid syntax for filter, please\nsee help button for usage.") return for i in range(self.ui.libraryTable.rowCount()): # if not self.ui.libraryTable.isRowHidden(i): # Make the cell an int. current_field = int(self.ui.libraryTable.item(i, column_of_interest).text()) if not current_field == int(new_filter): self.filter_dict[new_filter].append(i) self.ui.libraryTable.setRowHidden(i, True) else: errorMessage("Invalid syntax for filter, please\nsee help button for usage.") self.ui.filterList.addItem(field_to_filter + ": " + new_filter) print(self.filter_dict) def removeFilter(self): if self.ui.filterList.currentItem() is None: return filter_to_remove = self.ui.filterList.currentItem().text() filter_to_remove = filter_to_remove.split(':')[-1] filter_to_remove = filter_to_remove[1:] self.ui.filterList.takeItem(self.ui.filterList.currentRow()) rows_filtered = self.filter_dict[filter_to_remove] remove_rows = list(rows_filtered) for item in rows_filtered: for key in self.filter_dict: if key == filter_to_remove: continue if item in self.filter_dict[key]: remove_rows.remove(item) break self.filter_dict.pop(filter_to_remove, None) for row in remove_rows: self.ui.libraryTable.setRowHidden(row, False) def addToEncounter(self): current_row = self.ui.currentEncounterTable.rowCount() try: selected_row = self.ui.libraryTable.selectedIndexes()[0].row() except IndexError: return if selected_row in self.rows_included: errorMessage("The entry is already in the encounter, feel free\nto change the quantity.") return self.rows_included.append(selected_row) self.ui.currentEncounterTable.insertRow(self.ui.currentEncounterTable.rowCount()) for i in range(self.ui.libraryTable.columnCount()): newItem = QTableWidgetItem(self.ui.libraryTable.item(selected_row, i).text()) newItem.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) self.ui.currentEncounterTable.setItem(current_row, i+1, newItem) newItem = QTableWidgetItem(str(self.ui.qtyCount.value())) self.ui.currentEncounterTable.setItem(current_row, 0, newItem) def removeFromEncounter(self): self.ui.currentEncounterTable.removeRow(self.ui.currentEncounterTable.currentRow()) def acceptEncounter(self): if self.ui.encounterNameEdit.text() == "": errorMessage("Encounter name blank!") return if self.ui.encounterNameEdit.text() in self.parent.encounter_list: errorMessage("Encounter already exists!") return if ',' in self.ui.encounterNameEdit.text(): errorMessage("Commas not allowed in encounter name!") return if self.ui.currentEncounterTable.rowCount() == 0: errorMessage("Must have at least one entry!") return # Write the encounter to the group file. if not self.for_table: with open(self.parent.filename, 'a') as file: # Write the header. file.write("encounter:" + self.ui.encounterNameEdit.text() + '\n') for row in range(self.ui.currentEncounterTable.rowCount()): file.write('~' + self.ui.currentEncounterTable.item(row, 0).text()) file.write(',') file.write(self.ui.currentEncounterTable.item(row, 1).text() + '\n') file.write('\n') # If for a table then write to a temporary file. else: with open("groups/~temp.csv", 'a') as file: file.write("table_encounter:" + self.ui.encounterNameEdit.text() + '\n') for row in range(self.ui.currentEncounterTable.rowCount()): file.write('~' + self.ui.currentEncounterTable.item(row, 0).text()) file.write(',') file.write(self.ui.currentEncounterTable.item(row, 1).text() + '\n') file.write('\n') # Clear the current encounter table. if not self.for_table: self.parent.encounter_list.append(self.ui.encounterNameEdit.text()) self.parent.ui.encounterList.addItem(QListWidgetItem(self.ui.encounterNameEdit.text())) else: self.tableRef.ui.tableWidget.insertRow(self.tableRef.ui.tableWidget.rowCount()) newItem = QTableWidgetItem(self.ui.encounterNameEdit.text()) newItem.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) self.tableRef.ui.tableWidget.setItem(self.tableRef.ui.tableWidget.rowCount()-1, 0, newItem) self.close()
class addEncounter(QWidget): def __init__(self, parent, new_encounter, for_table, tableRef=None): super(addEncounter, self).__init__() self.ui = Ui_addEncounter() self.ui.setupUi(self) self.parent = parent self.for_table = for_table self.tableRef = tableRef self.rows_included = [] # Contains all of the active filters as well as the rows they apply to. self.filter_dict = {} self.ui.cancelButton.clicked.connect(self.cancel) self.ui.addFilterButton.clicked.connect(self.addFilter) self.ui.removeFilterButton.clicked.connect(self.removeFilter) self.ui.addButton.clicked.connect(self.addToEncounter) self.ui.removeButton.clicked.connect(self.removeFromEncounter) self.ui.acceptButton.clicked.connect(self.acceptEncounter) self.ui.instructionButton.clicked.connect(self.instruct) # Populate the Library table. self.current_library = populateTable(self.ui.libraryTable, self.parent.libraryName, False) # If we are editing an encounter load it up. if not new_encounter: self.loadEncounter() self.ui.currentEncounterTable.setSortingEnabled(False) self.ui.currentEncounterTable.setColumnCount( len(self.current_library.field_list) + 1) i = 1 for item in self.current_library.field_list: self.ui.currentEncounterTable.setHorizontalHeaderItem( i, QTableWidgetItem(item)) i += 1 self.ui.currentEncounterTable.setHorizontalHeaderItem( 0, QTableWidgetItem("Qty")) # Load the field selector. for i in range(self.ui.libraryTable.columnCount()): self.ui.filterFieldBox.addItem( self.ui.libraryTable.horizontalHeaderItem(i).text()) def instruct(self): msg = QMessageBox() msg.setWindowTitle("Instructions") msg.setText( "How to filter:\n" + "Select field to filter from the dropdown.\n\n" + "Text Fields: Enter substring to filter.\n" + "Numeric Fields: Enter range in form of min-max, you can leave either blank.\n" ) msg.exec_() def cancel(self): self.close() def addFilter(self): ''' If the field type is text then the user can only search for a specific string. If the field type is int then the user can specify a range or a max or min value. ''' new_filter = self.ui.filterEdit.text() field_to_filter = self.ui.filterFieldBox.currentText() self.filter_dict[new_filter] = [] # Determine the field type. filter_type = self.current_library.field_types[field_to_filter] column_of_interest = self.current_library.field_list.index( field_to_filter) # Filter current selection based on the entered string. if filter_type == "text": for i in range(self.ui.libraryTable.rowCount()): # if not self.ui.libraryTable.isRowHidden(i): # Make the cell lowercase. current_field = self.ui.libraryTable.item( i, column_of_interest).text().lower() if new_filter.lower() not in current_field: self.filter_dict[new_filter].append(i) self.ui.libraryTable.setRowHidden(i, True) else: if re.match('\d*-?\d*', new_filter) is not None: search_list = new_filter.split('-') if len(search_list) > 1: if len(search_list) > 2: print(1) errorMessage( "Invalid syntax for filter, please\nsee help button for usage." ) return if search_list[0] == '': mini = 0 else: mini = int(search_list[0]) if search_list[1] == '': maxi = sys.maxsize else: maxi = int(search_list[1]) if not checkInt(mini) or not checkInt(maxi): print(2) errorMessage( "Invalid syntax for filter, please\nsee help button for usage." ) return for i in range(self.ui.libraryTable.rowCount()): # if not self.ui.libraryTable.isRowHidden(i): # Make the cell an int. current_field = int( self.ui.libraryTable.item( i, column_of_interest).text()) if not mini <= current_field <= maxi: self.filter_dict[new_filter].append(i) self.ui.libraryTable.setRowHidden(i, True) else: if not checkInt(new_filter): errorMessage( "Invalid syntax for filter, please\nsee help button for usage." ) return for i in range(self.ui.libraryTable.rowCount()): # if not self.ui.libraryTable.isRowHidden(i): # Make the cell an int. current_field = int( self.ui.libraryTable.item( i, column_of_interest).text()) if not current_field == int(new_filter): self.filter_dict[new_filter].append(i) self.ui.libraryTable.setRowHidden(i, True) else: errorMessage( "Invalid syntax for filter, please\nsee help button for usage." ) self.ui.filterList.addItem(field_to_filter + ": " + new_filter) print(self.filter_dict) def removeFilter(self): if self.ui.filterList.currentItem() is None: return filter_to_remove = self.ui.filterList.currentItem().text() filter_to_remove = filter_to_remove.split(':')[-1] filter_to_remove = filter_to_remove[1:] self.ui.filterList.takeItem(self.ui.filterList.currentRow()) rows_filtered = self.filter_dict[filter_to_remove] remove_rows = list(rows_filtered) for item in rows_filtered: for key in self.filter_dict: if key == filter_to_remove: continue if item in self.filter_dict[key]: remove_rows.remove(item) break self.filter_dict.pop(filter_to_remove, None) for row in remove_rows: self.ui.libraryTable.setRowHidden(row, False) def addToEncounter(self): current_row = self.ui.currentEncounterTable.rowCount() try: selected_row = self.ui.libraryTable.selectedIndexes()[0].row() except IndexError: return if selected_row in self.rows_included: errorMessage( "The entry is already in the encounter, feel free\nto change the quantity." ) return self.rows_included.append(selected_row) self.ui.currentEncounterTable.insertRow( self.ui.currentEncounterTable.rowCount()) for i in range(self.ui.libraryTable.columnCount()): newItem = QTableWidgetItem( self.ui.libraryTable.item(selected_row, i).text()) newItem.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) self.ui.currentEncounterTable.setItem(current_row, i + 1, newItem) newItem = QTableWidgetItem(str(self.ui.qtyCount.value())) self.ui.currentEncounterTable.setItem(current_row, 0, newItem) def removeFromEncounter(self): self.ui.currentEncounterTable.removeRow( self.ui.currentEncounterTable.currentRow()) def acceptEncounter(self): if self.ui.encounterNameEdit.text() == "": errorMessage("Encounter name blank!") return if self.ui.encounterNameEdit.text() in self.parent.encounter_list: errorMessage("Encounter already exists!") return if ',' in self.ui.encounterNameEdit.text(): errorMessage("Commas not allowed in encounter name!") return if self.ui.currentEncounterTable.rowCount() == 0: errorMessage("Must have at least one entry!") return # Write the encounter to the group file. if not self.for_table: with open(self.parent.filename, 'a') as file: # Write the header. file.write("encounter:" + self.ui.encounterNameEdit.text() + '\n') for row in range(self.ui.currentEncounterTable.rowCount()): file.write( '~' + self.ui.currentEncounterTable.item(row, 0).text()) file.write(',') file.write( self.ui.currentEncounterTable.item(row, 1).text() + '\n') file.write('\n') # If for a table then write to a temporary file. else: with open("groups/~temp.csv", 'a') as file: file.write("table_encounter:" + self.ui.encounterNameEdit.text() + '\n') for row in range(self.ui.currentEncounterTable.rowCount()): file.write( '~' + self.ui.currentEncounterTable.item(row, 0).text()) file.write(',') file.write( self.ui.currentEncounterTable.item(row, 1).text() + '\n') file.write('\n') # Clear the current encounter table. if not self.for_table: self.parent.encounter_list.append(self.ui.encounterNameEdit.text()) self.parent.ui.encounterList.addItem( QListWidgetItem(self.ui.encounterNameEdit.text())) else: self.tableRef.ui.tableWidget.insertRow( self.tableRef.ui.tableWidget.rowCount()) newItem = QTableWidgetItem(self.ui.encounterNameEdit.text()) newItem.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) self.tableRef.ui.tableWidget.setItem( self.tableRef.ui.tableWidget.rowCount() - 1, 0, newItem) self.close()