diff --git a/application.py b/application.py new file mode 100644 index 0000000..eb31f48 --- /dev/null +++ b/application.py @@ -0,0 +1,179 @@ +import ast +import sys + +from PyQt6 import QtWidgets + +from src.transform import Transform +from src.ui.graph import Graph +from src.ui.Ui_diagram import Ui_MainWindow as MainWindow + + +class Application(QtWidgets.QMainWindow, MainWindow): + def __init__(self): + super().__init__() + self.setupUi(self) + # set Name to Diagram + self.setWindowTitle("Zeitschriftennutzung") + self.start_date.setEnabled(False) + self.end_Date.setEnabled(False) + self.load_data.clicked.connect(self.load_data_clicked) + self.creatediagram.clicked.connect(self.create_diagram) + self.removeLastGraph.clicked.connect(self.remove_last_graph) + # if cursor drags something to data_source, add path to data_source + self.data_source.setAcceptDrops(True) + self.data_source.dropEvent = self.dropEvent + self.data_source.dragEnterEvent = self.dragEnterEvent + self.widgetCount = 2 + if self.widgetCount == 2: + self.removeLastGraph.setEnabled(False) + + def dragEnterEvent(self, event): + if event.mimeData().hasUrls(): + event.accept() + else: + event.ignore() + + def dropEvent(self, event): + for url in event.mimeData().urls(): + if url.isLocalFile(): + if url.toLocalFile().endswith(".json"): + self.data_source.setText(url.toLocalFile()) + else: + # Show error message in dialog + msg = QtWidgets.QMessageBox() + msg.setIcon(QtWidgets.QMessageBox.Icon.Warning) + msg.setText("Only JSON files are supported") + msg.setWindowTitle("Error") + msg.exec() + + event.accept() + + def load_data_clicked(self): + print("Load data clicked") + source = self.data_source.text() + if source == "": + # Show error message in dialog + msg = QtWidgets.QMessageBox() + msg.setIcon(QtWidgets.QMessageBox.Icon.Warning) + msg.setText("Data source is empty") + msg.setWindowTitle("Error") + msg.exec() + else: + print("Data source:", source) + if self.useSensorTimeData.isChecked(): + data = ( + Transform(source) + .load_data() + .transform_data(addMissing=self.addMissingDays.isChecked()) + ) + else: + start_date = self.start_date.text().replace(".", "-") + end_date = self.end_Date.text().replace(".", "-") + print("Start date:", start_date, type(start_date)) + data = ( + Transform(source) + .load_data() + .transform_data( + addMissing=self.addMissingDays.isChecked(), + start_date=start_date, + end_date=end_date, + split=True, + ) + ) + print("Data:", data) + # add data to table + self.dataTable.setRowCount(0) + self.insertIntoTable(data) + + def insertIntoTable(self, data): + for sensor in data: + self.dataTable.insertRow(self.dataTable.rowCount()) + self.dataTable.setItem( + self.dataTable.rowCount() - 1, 0, QtWidgets.QTableWidgetItem(sensor) + ) + self.dataTable.setItem( + self.dataTable.rowCount() - 1, + 2, + QtWidgets.QTableWidgetItem(str((data[sensor]))), + ) + + def create_diagram(self): + selectedRowCount = len(self.dataTable.selectionModel().selectedRows()) + if selectedRowCount == 0: + # Show error message in dialog + msg = QtWidgets.QMessageBox() + msg.setIcon(QtWidgets.QMessageBox.Icon.Warning) + msg.setText("No sensor selected") + msg.setWindowTitle("Error") + msg.exec() + else: + if selectedRowCount == 1: + # get selected sensor + sensor = self.dataTable.item(self.dataTable.currentRow(), 0).text() + try: + alias = self.dataTable.item(self.dataTable.currentRow(), 1).text() + except AttributeError: + alias = None + data = self.dataTable.item(self.dataTable.currentRow(), 2).text() + # convert data to dict + data = ast.literal_eval(data) + graph_data = { + alias if alias else sensor: {"x": data["x"], "y": data["y"]} + } + else: + graph_data = [] + for row in range(selectedRowCount): + sensor = self.dataTable.item( + self.dataTable.selectionModel().selectedRows()[row].row(), 0 + ).text() + try: + alias = self.dataTable.item( + self.dataTable.selectionModel().selectedRows()[row].row(), 1 + ).text() + except AttributeError: + alias = None + data = self.dataTable.item( + self.dataTable.selectionModel().selectedRows()[row].row(), 2 + ).text() + # convert data to dict + data = ast.literal_eval(data) + row_data = { + alias if alias else sensor: {"x": data["x"], "y": data["y"]} + } + graph_data.append(row_data) + graph = Graph(graph_data) + self.centralWidget().layout().addWidget(graph.graph) + self.widgetCount += 1 + self.check_widget_count() + # set heigth of frame / data table to be 150 + + def check_widget_count(self): + if self.widgetCount > 2: + self.removeLastGraph.setEnabled(True) + else: + self.removeLastGraph.setEnabled(False) + + def remove_last_graph(self): + print("Remove last graph") + # remove last graph + persistentItems = 2 + Item_count = self.centralWidget().layout().count() + print(Item_count) + if Item_count > persistentItems: + self.centralWidget().layout().removeWidget( + self.centralWidget().layout().itemAt(Item_count - 1).widget() + ) + self.widgetCount -= 1 + self.check_widget_count() + # self.dataTable.setMaximumHeight(300) + + +def launch(): + app = QtWidgets.QApplication(sys.argv) + window = Application() + window.show() + sys.exit(app.exec()) + + +if __name__ == "__main__": + launch()