class WeekViewWidget(SubFrame): def __init__(self, parent): super(WeekViewWidget, self).__init__("Week", None, parent) self._table_model = QStandardItemModel(1, 2, None) self._table_model.setHorizontalHeaderLabels( [_("# Ord."), _("Customer")]) self.table_view = LeftRightTableView(self) self.table_view.setModel(self._table_model) self.table_view.verticalHeader().hide() self.table_view.setAlternatingRowColors(True) self.table_view.setSelectionBehavior(QAbstractItemView.SelectRows) self.table_view.setSelectionMode(QAbstractItemView.SingleSelection) self.table_view.setEditTriggers(QAbstractItemView.NoEditTriggers) self.table_view.horizontalHeader().setResizeMode( 0, QHeaderView.ResizeToContents) self.table_view.horizontalHeader().setStretchLastSection(True) self.preorder_brush = QBrush(QColor(255, 255, 128)) self.completed_order_brush = QBrush(QColor(128, 255, 128)) self.layout().addWidget(self.table_view) def _set_last_row(self, data, role): for i in range(self._table_model.columnCount()): self._table_model.setData( self._table_model.index(self._table_model.rowCount() - 1, i), data, role) def set_data(self, data, base_date): self.set_title(date_to_dm(base_date)) self._table_model.removeRows(0, self._table_model.rowCount()) current_ndx = 0 for d in data: order, customer_name = d number = order.preorder_label if order.accounting_label: number = order.accounting_label self._table_model.appendRow( [QStandardItem(str(number)), QStandardItem(customer_name)]) self._table_model.setData(self._table_model.index(current_ndx, 0), order.order_id, Qt.UserRole) if order.state == OrderStatusType.order_completed: self._set_last_row(self.completed_order_brush, Qt.BackgroundRole) elif order.state == OrderStatusType.preorder_definition: self._set_last_row(self.preorder_brush, Qt.BackgroundRole) current_ndx += 1 # Not the slightest idea why this works # and not resizeColumnsToContents for i in range(self._table_model.columnCount()): self.table_view.resizeColumnToContents(i)
class FilteredTable(QWidget): def __init__(self, parent): super(FilteredTable, self).__init__(parent) self.model = QStandardItemModel(600, 600) for i in range(self.model.rowCount()): for j in range(self.model.columnCount()): self.model.setData(self.model.index(i, j), str(i * j), Qt.DisplayRole) self.m = FilteringModel(self) self.m.setSourceModel(self.model) d = ['a'] * 300 + ['b'] * 200 + ['c'] * 99 + ['d'] self.m.setIndexData(d) t = QTableView(self) t.setModel(self.m) self.line_in = QLineEdit(self) self.line_in.textChanged.connect(self.m.setFilterFixedString) l = QVBoxLayout() l.addWidget(self.line_in) l.addWidget(t) self.setLayout(l)
class DialogLookup(QtGui.QDialog): def __init__(self, lookup): super().__init__() self._lookup = lookup self._model = QStandardItemModel() # (4, 4) self.initUI() self.initDB() def initUI(self): global _compatible self.result = userCancelled # create our window # define window xLoc,yLoc,xDim,yDim self.setGeometry(250, 250, 640, 480) self.setWindowTitle(translate('Rocket', "Component lookup...")) self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) searchLabel = QtGui.QLabel(translate('Rocket', "Search"), self) self._searchInput = QtGui.QLineEdit(self) self._searchInput.setFixedWidth(80) self._searchInput.textEdited.connect(self.onSearch) lookupTypeLabel = QtGui.QLabel(translate('Rocket', "Component"), self) self._lookupTypeCombo = QtGui.QComboBox(self) self._lookupTypeCombo.addItems(_compatible[self._lookup]) self._lookupTypeCombo.setCurrentText(self._lookup) self._lookupTypeCombo.currentTextChanged.connect(self.onLookupType) self._dbTable = QtGui.QTableView(self) self._dbTable.setModel(self._model) self._dbTable.setSelectionBehavior(QtGui.QTableView.SelectRows) self._dbTable.setSelectionMode(QtGui.QTableView.SingleSelection) self._dbTable.setSortingEnabled(True) self._dbTable.doubleClicked.connect(self.onTableDoubleClick) # cancel button cancelButton = QtGui.QPushButton('Cancel', self) cancelButton.clicked.connect(self.onCancel) cancelButton.setAutoDefault(True) # OK button okButton = QtGui.QPushButton('OK', self) okButton.setDefault(True) okButton.clicked.connect(self.onOk) layout = QVBoxLayout() line = QHBoxLayout() line.addWidget(searchLabel) line.addWidget(self._searchInput) line.addStretch() line.addWidget(lookupTypeLabel) line.addWidget(self._lookupTypeCombo) layout.addLayout(line) layout.addWidget(self._dbTable) line = QHBoxLayout() line.addStretch() line.addWidget(okButton) line.addWidget(cancelButton) layout.addLayout(line) self.setLayout(layout) # now make the window visible self.show() def initDB(self): self._connection = sqlite3.connect( "file:" + FreeCAD.getUserAppDataDir() + "Mod/Rocket/Resources/parts/Parts.db?mode=ro", uri=True) self._connection.row_factory = sqlite3.Row self._updateModel() def onLookupType(self, value): self._updateModel() def onSearch(self, value): rows = [] value = str(value).strip() if len(value) > 0: for column in range(self._model.columnCount()): items = self._model.findItems(value, Qt.MatchContains, column) for item in items: row = item.row() if not row in rows: rows.append(row) for row in range(self._model.rowCount()): if row in rows: self._dbTable.showRow(row) else: self._dbTable.hideRow(row) else: for row in range(self._model.rowCount()): self._dbTable.showRow(row) def onTableDoubleClick(self, selected): self.result = self._getSelected(selected.row()) self.close() def onCancel(self): self.result = {} self.close() def onOk(self): selected = self._dbTable.selectedIndexes() if len(selected) > 0: row = selected[0].row() self.result = self._getSelected(row) else: self.result = {} self.close() def _getSelectedBodyTube(self, row): try: index = int(self._model.item(row, 0).text()) cone = getBodyTube(self._connection, index) return cone except NotFoundError: _err(translate('Rocket', "Body tube not found")) except MultipleEntryError: _err(translate('Rocket', "Multiple identical entries found")) return {} def _getSelectedNose(self, row): try: index = int(self._model.item(row, 0).text()) cone = getNoseCone(self._connection, index) return cone except NotFoundError: _err(translate('Rocket', "Nose cone not found")) except MultipleEntryError: _err(translate('Rocket', "Multiple identical entries found")) return {} def _getSelectedTransition(self, row): try: index = int(self._model.item(row, 0).text()) tran = getTransition(self._connection, index) return tran except NotFoundError: _err(translate('Rocket', "Transition not found")) except MultipleEntryError: _err(translate('Rocket', "Multiple identical entries found")) return {} def _getSelected(self, row): queryType = str(self._lookupTypeCombo.currentText()) if queryType == COMPONENT_TYPE_ANY: query = self._lookup else: query = queryType if query in [ COMPONENT_TYPE_BODYTUBE, COMPONENT_TYPE_COUPLER, COMPONENT_TYPE_ENGINEBLOCK, COMPONENT_TYPE_LAUNCHLUG, COMPONENT_TYPE_CENTERINGRING, COMPONENT_TYPE_BULKHEAD ]: return self._getSelectedBodyTube(row) elif query == COMPONENT_TYPE_NOSECONE: return self._getSelectedNose(row) elif query == COMPONENT_TYPE_TRANSITION: return self._getSelectedTransition(row) # elif query == COMPONENT_TYPE_PARACHUTE: # pass # elif query == COMPONENT_TYPE_STREAMER: # pass return {} def _itemWithDimension(self, value, dim): return self._newItem(_valueWithUnits(value, dim)) def _newItem(self, text): item = QStandardItem(text) item.setEditable(False) return item def _queryBodyTube(self, queryType): rows = listBodyTubes(self._connection, queryType) self._model.setRowCount(len(rows)) if queryType == COMPONENT_TYPE_BULKHEAD: self._model.setColumnCount(7) else: self._model.setColumnCount(8) self._dbTable.hideColumn(0) # This holds index for lookups self._dbTable.setVerticalHeader(None) # Add the column headers self._model.setHorizontalHeaderItem( 1, self._newItem(translate('Rocket', "Type"))) self._model.setHorizontalHeaderItem( 2, self._newItem(translate('Rocket', "Manufacturer"))) self._model.setHorizontalHeaderItem( 3, self._newItem(translate('Rocket', "Part Number"))) self._model.setHorizontalHeaderItem( 4, self._newItem(translate('Rocket', "Description"))) self._model.setHorizontalHeaderItem( 5, self._newItem(translate('Rocket', "Outer Diameter"))) if queryType == COMPONENT_TYPE_BULKHEAD: self._model.setHorizontalHeaderItem( 6, self._newItem(translate('Rocket', "Length"))) else: self._model.setHorizontalHeaderItem( 6, self._newItem(translate('Rocket', "Inner Diameter"))) self._model.setHorizontalHeaderItem( 7, self._newItem(translate('Rocket', "Length"))) rowCount = 0 for row in rows: self._model.setItem(rowCount, 0, self._newItem(str(row["body_tube_index"]))) self._model.setItem(rowCount, 1, self._newItem(str(row["type"]))) self._model.setItem(rowCount, 2, self._newItem(str(row["manufacturer"]))) self._model.setItem(rowCount, 3, self._newItem(str(row["part_number"]))) self._model.setItem(rowCount, 4, self._newItem(str(row["description"]))) self._model.setItem( rowCount, 5, self._newItem( self._itemWithDimension(row["outer_diameter"], row["outer_diameter_units"]))) if queryType == COMPONENT_TYPE_BULKHEAD: self._model.setItem( rowCount, 6, self._newItem( self._itemWithDimension(row["length"], row["length_units"]))) else: self._model.setItem( rowCount, 6, self._newItem( self._itemWithDimension(row["inner_diameter"], row["inner_diameter_units"]))) self._model.setItem( rowCount, 7, self._newItem( self._itemWithDimension(row["length"], row["length_units"]))) rowCount += 1 def _queryNoseCone(self): rows = listNoseCones(self._connection) self._model.setRowCount(len(rows)) self._model.setColumnCount(9) self._dbTable.hideColumn(0) # This holds index for lookups self._dbTable.setVerticalHeader(None) # Add the column headers self._model.setHorizontalHeaderItem( 1, self._newItem(translate('Rocket', "Manufacturer"))) self._model.setHorizontalHeaderItem( 2, self._newItem(translate('Rocket', "Part Number"))) self._model.setHorizontalHeaderItem( 3, self._newItem(translate('Rocket', "Description"))) self._model.setHorizontalHeaderItem( 4, self._newItem(translate('Rocket', "Diameter"))) self._model.setHorizontalHeaderItem( 5, self._newItem(translate('Rocket', "Length"))) self._model.setHorizontalHeaderItem( 6, self._newItem(translate('Rocket', "Shoulder Diameter"))) self._model.setHorizontalHeaderItem( 7, self._newItem(translate('Rocket', "Shoulder Length"))) self._model.setHorizontalHeaderItem( 8, self._newItem(translate('Rocket', "Shape"))) rowCount = 0 for row in rows: self._model.setItem(rowCount, 0, self._newItem(str(row["nose_index"]))) self._model.setItem(rowCount, 1, self._newItem(str(row["manufacturer"]))) self._model.setItem(rowCount, 2, self._newItem(str(row["part_number"]))) self._model.setItem(rowCount, 3, self._newItem(str(row["description"]))) self._model.setItem( rowCount, 4, self._newItem( self._itemWithDimension(row["diameter"], row["diameter_units"]))) self._model.setItem( rowCount, 5, self._newItem( self._itemWithDimension(row["length"], row["length_units"]))) self._model.setItem( rowCount, 6, self._newItem( self._itemWithDimension(row["shoulder_diameter"], row["shoulder_diameter_units"]))) self._model.setItem( rowCount, 7, self._newItem( self._itemWithDimension(row["shoulder_length"], row["shoulder_length_units"]))) self._model.setItem(rowCount, 8, self._newItem(str(row["shape"]))) rowCount += 1 def _queryTransition(self): rows = listTransitions(self._connection) self._model.setRowCount(len(rows)) self._model.setColumnCount(12) self._dbTable.hideColumn(0) # This holds index for lookups self._dbTable.setVerticalHeader(None) # Add the column headers self._model.setHorizontalHeaderItem( 1, self._newItem(translate('Rocket', "Manufacturer"))) self._model.setHorizontalHeaderItem( 2, self._newItem(translate('Rocket', "Part Number"))) self._model.setHorizontalHeaderItem( 3, self._newItem(translate('Rocket', "Description"))) self._model.setHorizontalHeaderItem( 4, self._newItem(translate('Rocket', "Fore Diameter"))) self._model.setHorizontalHeaderItem( 5, self._newItem(translate('Rocket', "Aft Diameter"))) self._model.setHorizontalHeaderItem( 6, self._newItem(translate('Rocket', "Length"))) self._model.setHorizontalHeaderItem( 7, self._newItem(translate('Rocket', "Fore Shoulder Diameter"))) self._model.setHorizontalHeaderItem( 8, self._newItem(translate('Rocket', "Fore Shoulder Length"))) self._model.setHorizontalHeaderItem( 9, self._newItem(translate('Rocket', "Aft Shoulder Diameter"))) self._model.setHorizontalHeaderItem( 10, self._newItem(translate('Rocket', "Aft Shoulder Length"))) self._model.setHorizontalHeaderItem( 11, self._newItem(translate('Rocket', "Shape"))) rowCount = 0 for row in rows: self._model.setItem(rowCount, 0, self._newItem(str(row["transition_index"]))) self._model.setItem(rowCount, 1, self._newItem(str(row["manufacturer"]))) self._model.setItem(rowCount, 2, self._newItem(str(row["part_number"]))) self._model.setItem(rowCount, 3, self._newItem(str(row["description"]))) self._model.setItem( rowCount, 4, self._newItem( self._itemWithDimension( row["fore_outside_diameter"], row["fore_outside_diameter_units"]))) self._model.setItem( rowCount, 5, self._newItem( self._itemWithDimension( row["aft_outside_diameter"], row["aft_outside_diameter_units"]))) self._model.setItem( rowCount, 6, self._newItem( self._itemWithDimension(row["length"], row["length_units"]))) self._model.setItem( rowCount, 7, self._newItem( self._itemWithDimension( row["fore_shoulder_diameter"], row["fore_shoulder_diameter_units"]))) self._model.setItem( rowCount, 8, self._newItem( self._itemWithDimension( row["fore_shoulder_length"], row["fore_shoulder_length_units"]))) self._model.setItem( rowCount, 9, self._newItem( self._itemWithDimension( row["aft_shoulder_diameter"], row["aft_shoulder_diameter_units"]))) self._model.setItem( rowCount, 10, self._newItem( self._itemWithDimension(row["aft_shoulder_length"], row["aft_shoulder_length_units"]))) self._model.setItem(rowCount, 11, self._newItem(str(row["shape"]))) rowCount += 1 def _updateModel(self): queryType = str(self._lookupTypeCombo.currentText()) if queryType == COMPONENT_TYPE_ANY: query = self._lookup else: query = queryType if query in [ COMPONENT_TYPE_BODYTUBE, COMPONENT_TYPE_COUPLER, COMPONENT_TYPE_ENGINEBLOCK, COMPONENT_TYPE_LAUNCHLUG, COMPONENT_TYPE_CENTERINGRING, COMPONENT_TYPE_BULKHEAD ]: self._queryBodyTube(queryType) elif query == COMPONENT_TYPE_NOSECONE: self._queryNoseCone() elif query == COMPONENT_TYPE_TRANSITION: self._queryTransition() # elif query == COMPONENT_TYPE_PARACHUTE: # pass # elif query == COMPONENT_TYPE_STREAMER: # pass def update(self): # Update the SQL query pass