class MenuWeekday(): """Tab to manage menu entry for each day""" global logger def __init__(self, day): #### logger.info('Inside MenuWeekday') self.menudetail_tab_1 = QWidget() self.menudetail_tab_1.setObjectName("menudetail_tab_1") self.gridLayout_20 = QGridLayout(self.menudetail_tab_1) self.gridLayout_20.setObjectName("gridLayout_20") self.menu_table = QTableWidget(self.menudetail_tab_1) self.menu_table.setSortingEnabled(True) self.menu_table.setObjectName("menu_table") self.menu_table.setColumnCount(6) self.menu_table.setRowCount(0) item = QTableWidgetItem() self.menu_table.setHorizontalHeaderItem(0, item) item = QTableWidgetItem() self.menu_table.setHorizontalHeaderItem(1, item) item = QTableWidgetItem() self.menu_table.setHorizontalHeaderItem(2, item) item = QTableWidgetItem() self.menu_table.setHorizontalHeaderItem(3, item) item = QTableWidgetItem() self.menu_table.setHorizontalHeaderItem(4, item) item = QTableWidgetItem() self.menu_table.setHorizontalHeaderItem(5, item) self.menu_table.horizontalHeader().setCascadingSectionResizes(False) self.menu_table.horizontalHeader().setStretchLastSection(True) self.menu_table.verticalHeader().setVisible(True) self.menu_table.verticalHeader().setCascadingSectionResizes(True) self.gridLayout_20.addWidget(self.menu_table, 0, 0, 1, 3) spacerItem22 = QSpacerItem(612, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.gridLayout_20.addItem(spacerItem22, 1, 0, 1, 1) self.menu_table_refresh_button = QPushButton(self.menudetail_tab_1) self.menu_table_refresh_button.setObjectName("menu_table_refresh_button") self.gridLayout_20.addWidget(self.menu_table_refresh_button, 1, 1, 1, 1) self.menu_table_add_button = QPushButton(self.menudetail_tab_1) self.menu_table_add_button.setObjectName("menu_table_add_button") self.gridLayout_20.addWidget(self.menu_table_add_button, 1, 2, 1, 1) ####retranslate self.menu_table.horizontalHeaderItem(0).setText( QApplication.translate("MainWindow", "Code", None, QApplication.UnicodeUTF8)) self.menu_table.horizontalHeaderItem(1).setText( QApplication.translate("MainWindow", "Item", None, QApplication.UnicodeUTF8)) self.menu_table.horizontalHeaderItem(2).setText( QApplication.translate("MainWindow", "Category", None, QApplication.UnicodeUTF8)) self.menu_table.horizontalHeaderItem(3).setText( QApplication.translate("MainWindow", "Rate", None, QApplication.UnicodeUTF8)) self.menu_table.horizontalHeaderItem(4).setText( QApplication.translate("MainWindow", "Per Day", None, QApplication.UnicodeUTF8)) self.menu_table.horizontalHeaderItem(5).setText( QApplication.translate("MainWindow", "Available", None, QApplication.UnicodeUTF8)) self.menu_table_refresh_button.setText( QApplication.translate("MainWindow", "Refresh", None, QApplication.UnicodeUTF8)) self.menu_table_add_button.setText( QApplication.translate("MainWindow", "Add Dish", None, QApplication.UnicodeUTF8)) ###signals and slots && other stuffs # self.mainwindow = Ui_MainWindow # just for the ease of finding the attributes in pycharm self.day = day self.menu_table_add_button.clicked.connect(self.add_menu) self.menu_table.itemDoubleClicked.connect(self.popup_edit) self.menu_table_refresh_button.clicked.connect(self.update_menu) self.menu_table.setSelectionBehavior(QAbstractItemView.SelectRows) self.menu_table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.menu_table.setShowGrid(False) self.menu_table.setAlternatingRowColors(True) self.update_menu() self.popup = object self.menudetail_tab_1.setFocusPolicy(Qt.StrongFocus) self.menudetail_tab_1.focusInEvent = self.load_rows self.assign_shortcuts() def assign_shortcuts(self): """assign shortcuts""" QShortcut(QKeySequence(settings.custom_shortcut['key_tabcon_menumgtmonsun_view']), self.menudetail_tab_1, self.row_selected) QShortcut(QKeySequence(settings.custom_shortcut['key_tabcon_menumgtmonsun_refresh']), self.menudetail_tab_1, self.update_menu) QShortcut(QKeySequence(settings.custom_shortcut['key_tabcon_menumgtmonsun_add']), self.menudetail_tab_1, self.add_menu) def row_selected(self): """selets a row entry""" rows = sorted(set(index.row() for index in self.menu_table.selectedIndexes())) if rows: code = self.menu_table.item(rows[0], 0).text() name = self.menu_table.item(rows[0], 1).text() quantity = self.menu_table.item(rows[0], 4).text() self.add_menu(code, name, quantity) def add_menu(self, *args): """ :return: Pops up a new dialogue to add the menus """ if not args: self.popup = AddMenuFromList(parent=self, day=self.day) self.popup.exec_() else: self.popup = MenuQuantityEditPopup(parent=self, day=self.day, code=args[0], name=args[1], quantity=args[2]) self.popup.exec_() def update_menu(self): """ :return:Populates the menu table """ menu = WeeklyMenu(day=self.day) menulist = menu.load_dish_per_Day() if not menulist == []: self.add_row(*menulist) else: self.menu_table.clearContents() self.menu_table.setRowCount(0) def popup_edit(self, item): """ Pops up the menu to be edited :param item: item clicked :return:none """ model_index = self.menu_table.indexFromItem(item) row = model_index.row() code = self.menu_table.item(row, 0).text() name = self.menu_table.item(row, 1).text() quantity = self.menu_table.item(row, 4).text() self.add_menu(code, name, quantity) def add_row(self, *args): """creates a new row entry""" table = self.menu_table if args: table.setRowCount(len(args)) for i, j in enumerate(args): item = QTableWidgetItem(j['item_no']) table.setItem(i, 0, item) item = QTableWidgetItem(j['item']) table.setItem(i, 1, item) item = QTableWidgetItem(j['category']) table.setItem(i, 2, item) item = QTableWidgetItem(j['rate']) table.setItem(i, 3, item) item = QTableWidgetItem(j['per_day']) table.setItem(i, 4, item) item = QTableWidgetItem(j['available']) table.setItem(i, 5, item) table.setColumnWidth(0, table.width() / 6) table.setColumnWidth(1, table.width() / 6) table.setColumnWidth(2, table.width() / 6) table.setColumnWidth(3, table.width() / 6) table.setColumnWidth(4, table.width() / 6) def load_rows(self, event): """ :return:checks and adds new rows """ self.add_row()
class FoamDictWidget(QWidget): "QWidget to view and edit simple Foam Dictionary" def __init__(self, variable_setting, parent=None): super(FoamDictWidget, self).__init__(parent) self.buttonLayout = QHBoxLayout() self.pushButtonInsert = QPushButton("Add new row") self.pushButtonRemove = QPushButton("Del selected row") self.pushButtonRestore = QPushButton("Restore table") self.pushButtonClear = QPushButton("Clear table") self.buttonLayout.addWidget(self.pushButtonInsert) self.buttonLayout.addWidget(self.pushButtonRemove) self.buttonLayout.addWidget(self.pushButtonRestore) self.buttonLayout.addWidget(self.pushButtonClear) self.tableWidget = QTableWidget() # header, should not sort, has vertical scrollbar # set column count, fixed to 2, size of TableItem self.tableWidget.setColumnCount(2) # self.tableWidget.setHorizontalHeaderItem(0, ) self.tableWidget.setHorizontalHeaderLabels(['key', 'value text']) # set a default row count, insert as needed self.tableWidget.setRowCount(0) self.buttonPreview = QPushButton('Preview FoamFile write-out') # self.buttonLoad = QPushButton('load dict from existing case ') self.buttonCustomize = QPushButton('Customize (convert into raw)') self.textPreview = QTextEdit('') self.textPreview.setVisible(False) self.textPreview.setEnabled(False) #PySide has different name other than @QtCore.pyqtSlot, but PySide.QtCore.SLOT #PySide has different name other than @QtCore.pyqtSlot, but PySide.QtCore.SLOT self.pushButtonInsert.clicked.connect(self.insertRow) self.pushButtonRemove.clicked.connect(self.removeRow) self.pushButtonRestore.clicked.connect(self.restoreDict) self.pushButtonClear.clicked.connect(self.clearDict) # self.tableWidget.doubleClicked.connect( self.showPreview) # does not work for PySide self.buttonPreview.clicked.connect(self.showPreview) self.buttonCustomize.clicked.connect(self.customizeDict) self._previewing = False self.settings = variable_setting self.previous_settings = self.settings #self.restoreDict() self.updateDictView(self.settings) self.myLayout = QVBoxLayout() self.myLayout.addLayout(self.buttonLayout) self.myLayout.addWidget(self.tableWidget) self.myLayout.addWidget(self.buttonPreview) self.myLayout.addWidget(self.textPreview) self.setLayout(self.myLayout) def dict(self): _settings = OrderedDict() for i in range(self.tableWidget.rowCount()): k = self.tableWidget.item(i, 0).text() v = self.tableWidget.item( i, 1).text() # data() will return QVariant type-> python type # validated by non-empty string if k and v: _settings[k] = v return _settings def setDict(self, settings): # self.settings = settings self.updateDictView(self.settings) def restoreDict(self): self.settings = self.previous_settings self.updateDictView(self.settings) def updateDictView(self, variable_settings): i = 0 self.clearDict() # will clear contents, but leave row text empty N = self.tableWidget.rowCount() for k, v in variable_settings.items(): # translate seq into unicode if i >= N: self.tableWidget.insertRow(i) kitem = QTableWidgetItem(k) # also set flags and state, type vitem = QTableWidgetItem( v) # automaticall convert str to unicode to feed QWidget? self.tableWidget.setItem(i, 0, kitem) self.tableWidget.setItem( i, 1, vitem) # currently only works for string value ! i += 1 #@pyqtSlot() # PySide use another name "QtCore.Slot()" def insertRow(self): nRows = self.tableWidget.rowCount() self.tableWidget.insertRow(nRows) # inset one row at the end kitem = QTableWidgetItem("") # also set flags and state, type vitem = QTableWidgetItem("") self.tableWidget.setItem(nRows, 0, kitem) self.tableWidget.setItem(nRows, 1, vitem) def removeRow( self, rowID=None): # : Optional[int] typing is not supported by python2 if rowID == None: for ind in self.tableWidget.selectedIndexes(): self.tableWidget.removeRow(ind.row()) else: nRows = self.tableWidget.rowCount() if rowID < nRows: self.tableWidget.removeRow(rowID) def clearDict(self): self.tableWidget.clearContents() # keep the header, clear all items if self._previewing: self.showPreview() def customizeDict(self): # pass def loadDefault(self): # generated by FoamBaseBuilder.BasicBuilder #TODO: load the generated from FoamCaseBuilder pass def showPreview(self): if self._previewing: self._previewing = False self.textPreview.setVisible(False) self.buttonPreview.setText('click to preview write out') else: self._previewing = True self.buttonPreview.setText('click on text to hide preview') # enable scrollbar ? self.textPreview.setText(self.printDict()) self.textPreview.setVisible(True) def printDict(self): dictText = "{\n" for k, v in self.dict().items(): dictText += " {} {};\n".format(str(k), str(v)) dictText += "}" return dictText