class SurveyTableWidget(SurveyTableView): combineSignal = pyqtSignal() addSurveySignal = pyqtSignal() editSurveySignal = pyqtSignal() loadSurveyAudioSignal = pyqtSignal() selectionChangeSignal = pyqtSignal() def __init__(self): super().__init__() # init table model TODO: make vars private self.surveyTableModel = QSqlRelationalTableModel() self.surveyTableModel.setTable(R.tableName) self.surveyTableModel.setEditStrategy(QSqlTableModel.OnRowChange) self.surveyTableModel.select() self.surveyTableView.setModel(self.surveyTableModel) self.surveyTableSelectionModel = self.surveyTableView.selectionModel() self.surveyTableSelectionModel.selectionChanged.connect( self.onSurveySelectionChange) self.surveyTableView.horizontalHeader().sortIndicatorChanged.connect( self.onSurveySelectionChange) # TODO # connect buttons self.addSurveyButton.clicked.connect(self.addSurveySignal.emit) self.editSurveyButton.clicked.connect(self.editSurveySignal.emit) self.deleteSurveyButton.clicked.connect(self.deleteSurveyButtonAction) self.loadAudioButton.clicked.connect(self.loadSurveyAudioSignal.emit) self.combineButton.clicked.connect(self.combineSignal.emit) # info to populate AddSurveyDialog def getDialogArgs(self): recorderIds = [] query = QSqlQuery("SELECT DISTINCT recorder_id FROM survey") while query.next(): print(query.value(0)) kwargs = {"recorderIds": recorderIds} return kwargs def select(self, index): self.surveyTableView.selectRow(index) def sortByKey(self): self.surveyTableView.sortByColumn(0, Qt.DescendingOrder) # TODO: keep selection after sort def onSort(self): pass def getSelectedRows(self): return self.surveyTableSelectionModel.selectedRows() def onPlaylistMediaChange(self, hasMedia): self.addSurveyButton.setEnabled(hasMedia) self.selectionChangeSignal.emit() def getSelectedData(self, row=0, column=Column.SURVEY_DATETIME): key = self.getSelectedRows()[row] return self.surveyTableModel.data(key.sibling(key.row(), column.value)) def getDataFromKey(self, keyIndex, column=Column.SURVEY_DATETIME): return self.surveyTableModel.data( keyIndex.sibling(keyIndex.row(), column.value)) def getSelectedKeys(self): list = [] for row in self.getSelectedRows(): list.append(str(self.surveyTableModel.data(row))) return list def singlePathSelected(self): if len(self.getSelectedRows()) > 0: firstPath = self.getDataFromKey(self.getSelectedRows()[0], Column.FILE) for row in self.getSelectedRows(): # self.getSelectedRows(): if self.getDataFromKey(row, Column.FILE) != firstPath: return None return firstPath return None def addRecord(self, record): sqlRecord = record.getQSQLRecord(self.surveyTableModel.record()) self.surveyTableModel.insertRecord(0, sqlRecord) self.sortByKey() self.select(0) QApplication.processEvents() # allow for selection highlight def editRecord(self, record): index = self.getSelectedRows()[0] record.editData(model=self.surveyTableModel, index=index) QApplication.processEvents() # TODO maybe remove @pyqtSlot() def deleteSurveyButtonAction(self): for row in self.getSelectedRows(): self.surveyTableModel.removeRow(row.row()) self.surveyTableSelectionModel.clearSelection() self.surveyTableModel.select() QApplication.processEvents() @pyqtSlot() def onSurveySelectionChange(self): # enable/disable buttons then signal MainWindow selectionCount = len(self.getSelectedRows()) self.deleteSurveyButton.setEnabled(selectionCount > 0) self.loadAudioButton.setEnabled(selectionCount > 0) self.editSurveyButton.setEnabled(selectionCount == 1) self.combineButton.setEnabled( selectionCount > 1 and self.singlePathSelected() is not None) self.selectionChangeSignal.emit()
class StampTableWidget(StampTableView): addStampSignal = pyqtSignal(str) # deleteStampSignal = pyqtSignal() surveyModeSignal = pyqtSignal(bool) def __init__(self): super().__init__() self.hasSelection = False # todo self.surveyDatetime = None # init table model self.stampTableModel = QSqlRelationalTableModel() self.stampTableModel.setTable(R.tableName) self.stampTableModel.setEditStrategy(QSqlTableModel.OnFieldChange) self.stampTableModel.setFilter("survey_datetime = None") self.stampTableModel.select() self.stampTableView.setModel(self.stampTableModel) self.stampTableSelectionModel = self.stampTableView.selectionModel() self.stampTableSelectionModel.selectionChanged.connect( self.onStampSelectionChange) # connect buttons self.addStampButton.clicked.connect( lambda ignore, key="-": self.addStampSignal.emit(key)) self.deleteStampButton.clicked.connect(self.deleteButtonAction) self.hotkeyButton.clicked.connect(self.enableHotkeys) # self.recordButton.clicked.connect(self.surveyMode) # hotkeys self.hotkeys = self.initHotkeys() # copy selection to clipboard self.installEventFilter(self) def eventFilter(self, source, event): if (event.type() == QEvent.KeyPress and event.matches(QKeySequence.Copy)): self.copySelection() return True return super().eventFilter(source, event) def copySelection(self): selection = self.stampTableView.selectedIndexes() if selection: rows = sorted(index.row() for index in selection) columns = sorted(index.column() for index in selection) rowcount = rows[-1] - rows[0] + 1 colcount = columns[-1] - columns[0] + 1 table = [[''] * colcount for _ in range(rowcount)] for index in selection: row = index.row() - rows[0] column = index.column() - columns[0] table[row][column] = index.data() stream = io.StringIO() csv.writer(stream).writerows(table) QApplication.clipboard().setText(stream.getvalue()) def initHotkeys(self): keyList = [] shortcut = QShortcut( QKeySequence(Qt.Key_Space, QKeySequence.NativeText), self) keyList.append(shortcut) shortcut.activated.connect( lambda key="-": self.addStampSignal.emit(key)) for i in range(0, 10): print(i) shortcut = QShortcut(QKeySequence(str(i), QKeySequence.NativeText), self) keyList.append(shortcut) shortcut.activated.connect( lambda key=str(i): self.addStampSignal.emit(key)) return keyList def enableHotkeys(self, isClicked): for shortcut in self.hotkeys: shortcut.setEnabled(isClicked) def onDeselection(self): self.enableHotkeys(False) self.hotkeyButton.setChecked(False) # TODO delete def testHotKey(self, key): print("test") print(key) # TODO maybe repaint def loadSurveyStamps(self, keys): print("LSS") self.surveyDatetime = keys[0] filter = self.createFilter(keys) self.stampTableModel.setFilter(filter) self.stampTableModel.select() print("survey_datetime = " + self.surveyDatetime) QApplication.processEvents() self.repaint() def createFilter(self, keys): filter = "survey_datetime = \"" + self.surveyDatetime + "\"" for i in range(1, len(keys)): filter = filter + " OR survey_datetime = \"" + keys[i] + "\"" print(filter) return filter @pyqtSlot() def deleteButtonAction(self): for row in self.stampTableSelectionModel.selectedRows(): self.stampTableModel.removeRow(row.row()) self.stampTableSelectionModel.clearSelection() self.stampTableModel.select() QApplication.processEvents() def clearSurveyStamps(self): self.surveyDatetime = None # self.stampTableModel.setFilter("") # TODO will this work? self.stampTableModel.setFilter("survey_datetime = None") print("survey_datetime = None") def addStamp(self, stamp, key="-"): stampRecord = StampRecord(miliseconds=stamp, surveyDatetime=self.surveyDatetime, label=key, note="") sqlRecord = stampRecord.getQSQLRecord(self.stampTableModel.record()) self.stampTableModel.insertRecord(0, sqlRecord) # self.surveyWidget.sortByKey() # self.surveyWidget.select(0) QApplication.processEvents() # allow for selection highlight def addRecord(self, stampRecord): sqlRecord = stampRecord.getQSQLRecord(self.stampTableModel.record()) print(self.stampTableModel.insertRowIntoTable(sqlRecord)) # self.repaint() # TODO # self.surveyModeSignal.emit(modeOn) # @pyqtSlot(bool) # def enableSurvey(self, canSurvey): # print(canSurvey) # self.recordButton.setEnabled(canSurvey) @pyqtSlot() def testButtonAction(self): print("Test") @pyqtSlot(bool) def surveyMode(self, modeOn): self.addStampButton.setEnabled(modeOn) self.hotkeyButton.setEnabled(modeOn) self.enableHotkeys(self.hotkeyButton.isChecked()) @pyqtSlot(QItemSelection) def onStampSelectionChange(self, selection): self.hasSelection = selection.count() > 0 self.deleteStampButton.setEnabled(self.hasSelection) @pyqtSlot(bool) def enableStamps(self, modeOn): self.addStampButton.setEnabled(modeOn) self.hotkeyButton.setEnabled(modeOn) if not modeOn and self.hotkeyButton.isChecked(): self.hotkeyButton.setChecked(False) self.enableHotkeys(False)
class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(1200, 800) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.tabWidget = QtWidgets.QTabWidget(self.centralwidget) self.tabWidget.setGeometry(QtCore.QRect(0, 0, 1200, 800)) self.tabWidget.setObjectName("tabWidget") # TAB 1 self.tab = QtWidgets.QWidget() self.tab.setObjectName("tab") self.tabWidget.addTab(self.tab, "") # Admin site integration self.webView = QtWebEngineWidgets.QWebEngineView(self.tab) self.webView.setUrl(QtCore.QUrl("http://185.188.182.76:8000/admin")) self.webView.resize(1200, 800) self.webView.setObjectName("webView") # TAB 2 self.tab_2 = QtWidgets.QWidget() self.tab_2.setObjectName("tab_2") # Desktop Database integration self.devices_table = QtWidgets.QTableView(self.tab_2) self.devices_table.setGeometry(QtCore.QRect(0, 0, 1200, 800)) self.devices_table.setObjectName("tableView") self.devices_table_UI() self.add_record() # !!! last_month_day = calendar.monthrange(int(strftime("%Y", gmtime())), int(strftime("%m", gmtime())))[1] today = strftime("%d", gmtime()) if last_month_day == today: self.add_record() self.tabWidget.addTab(self.tab_2, "") MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) MainWindow.setWindowIcon(QtGui.QIcon('label.ico')) self.retranslateUi(MainWindow) self.tabWidget.setCurrentIndex(1) QtCore.QMetaObject.connectSlotsByName(MainWindow) def devices_table_UI(self): conn = sqlite3.connect("database.db") c = conn.cursor() c.execute( "CREATE TABLE IF NOT EXISTS devices(id INTEGER PRIMARY KEY AUTOINCREMENT, mac_address TEXT, os_version TEXT, architecture TEXT, locale TEXT, timezone TEXT, last_update TEXT)" ) c.close() self.devices_model = QSqlRelationalTableModel(db=createConnection()) self.devices_model.setTable('devices') self.devices_model.select() # self.drivers_table.setEditTriggers(QAbstractItemView.CurrentChanged) self.devices_table.setModel(self.devices_model) self.devices_table.hideColumn(self.devices_model.fieldIndex('id')) # Делаем ресайз колонок по содержимому self.devices_table.resizeColumnsToContents() def add_record(self): rec = self.devices_model.record() data = [ get_mac(), # mac-address platform.platform(), platform.machine(), locale.getdefaultlocale()[0], str(timezone / 3600.0), strftime("%Y-%m-%d %H:%M:%S", gmtime()) ] for i in range(len(data)): rec.setValue(rec.field(i + 1).name(), data[i]) self.devices_model.insertRecord(-1, rec) self.devices_model.submit() self.devices_model.select() self.devices_table.resizeColumnsToContents() def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Polydroid Desktop")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "AdminSite")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Desktop DB"))