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)
Exemple #3
0
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"))