From 7b93f62a644540c73b51260e0bf35022e109a9e5 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Wed, 10 May 2023 11:30:21 +0200 Subject: [PATCH] Study: Add time / date mode to study. --- src/Model/Study.py | 27 ++++++- src/View/ASubWindow.py | 29 ++++++- src/View/Main/NewStudyWindow.py | 45 ++++++++++- src/View/ui/NewStudy.ui | 136 +++++++++++++++++++++----------- src/tools.py | 22 ++++++ 5 files changed, 208 insertions(+), 51 deletions(-) diff --git a/src/Model/Study.py b/src/Model/Study.py index 59a2ec9c..f1a50131 100644 --- a/src/Model/Study.py +++ b/src/Model/Study.py @@ -13,6 +13,9 @@ class Study(Serializable): # Study general information self.name = "" self.description = "" + # Time system + self._time_system = "time" + self._date = datetime.fromtimestamp(0) self.creation_date = datetime.now() self.last_modification_date = datetime.now() @@ -21,13 +24,35 @@ class Study(Serializable): # Study data self.river = None + @property + def time_system(self): + return self._time_system + + def use_time(self): + self._time_system = "time" + + def use_date(self, date:datetime): + self._time_system = "date" + self._date = date + + @property + def date(self): + return self._date + + @date.setter + def date(self, timestamp): + self._date = timestamp + @classmethod def new(cls): return cls() @classmethod - def new(cls, name, description): + def new(cls, name, description, date = None): me = cls() me.name = name me.description = description + if date is not None: + me.use_date() + me.date = date return me diff --git a/src/View/ASubWindow.py b/src/View/ASubWindow.py index 3e1a138f..a7b40c9f 100644 --- a/src/View/ASubWindow.py +++ b/src/View/ASubWindow.py @@ -4,6 +4,7 @@ import os import csv from io import StringIO +from datetime import datetime from tools import trace @@ -16,9 +17,10 @@ from PyQt5.QtWidgets import ( QTimeEdit, QSpinBox, QTextEdit, QRadioButton, QComboBox, QFileDialog, QMessageBox, QTableView, QAction, + QDateTimeEdit, ) from PyQt5.QtCore import ( - QTime, + QTime, QDateTime, ) from PyQt5.uic import loadUi @@ -350,6 +352,31 @@ class ASubWindowFeatures(object): """ return self.find(QComboBox, name).currentText() + def get_datetime_edit(self, name:str): + """Get datetime of datetime edit + + Args: + name: The datetime edit component name + + Returns: + The datetime + """ + return self.find(QDateTimeEdit, name).dateTime().toPyDateTime() + + def set_datetime_edit(self, name:str, date:datetime): + """Set datetime of a datetime edit + + Args: + name: The datetime edit component name + date: The new datetime + + Returns: + Nothing + """ + qdate = QDateTime.fromString(date.isoformat(), "yyyy-MM-ddThh:mm:ss") + self.find(QDateTimeEdit, name).setDateTime(qdate) + + # Top level interface class ASubMainWindow(QMainWindow, ASubWindowFeatures, WindowToolKit): diff --git a/src/View/Main/NewStudyWindow.py b/src/View/Main/NewStudyWindow.py index 905815ea..6d313199 100644 --- a/src/View/Main/NewStudyWindow.py +++ b/src/View/Main/NewStudyWindow.py @@ -3,6 +3,11 @@ from Model.Study import Study from View.ASubWindow import ASubWindow +from PyQt5.QtWidgets import ( + QRadioButton, QLabel, QDateTimeEdit, +) + + class NewStudyWindow(ASubWindow): def __init__(self, study=None, title="New Study", parent=None): super(NewStudyWindow, self).__init__(name=title, ui="NewStudy", parent=parent) @@ -13,16 +18,50 @@ class NewStudyWindow(ASubWindow): self.study = study if not self.study is None: - self.set_line_edit_text("lineEdit_name", study.name) - self.set_text_edit_text("textEdit_description", study.description) + self.set_line_edit_text("lineEdit_name", self.study.name) + self.set_text_edit_text("textEdit_description", self.study.description) + self.set_datetime_edit("dateTimeEdit_date", self.study.date) + if self.study.time_system == "date": + self.set_radio_button("radioButton_date", True) + self.find(QLabel, "label_date").setEnabled(True) + self.find(QDateTimeEdit, "dateTimeEdit_date").setEnabled(True) + + self.connection() + + def connection(self): + time = self.find(QRadioButton, "radioButton_time") + date = self.find(QRadioButton, "radioButton_date") + + time.toggled.connect(self.set_time) + date.toggled.connect(self.set_date) + + def set_time(self): + if self.get_radio_button("radioButton_time"): + self.find(QLabel, "label_date").setEnabled(False) + self.find(QDateTimeEdit, "dateTimeEdit_date").setEnabled(False) + + def set_date(self): + if self.get_radio_button("radioButton_date"): + self.find(QLabel, "label_date").setEnabled(True) + self.find(QDateTimeEdit, "dateTimeEdit_date").setEnabled(True) + def accept(self): name = self.get_line_edit_text("lineEdit_name") description = self.get_text_edit_text("textEdit_description") if self.study is None: - self.parent.set_model(Study.new(name, description)) + study = Study.new(name, description) + if self.get_radio_button("radioButton_date"): + date = self.get_datetime_edit("dateTimeEdit_date") + study.use_date(date) + self.parent.set_model(study) else: self.study.name = name self.study.description = description + if self.get_radio_button("radioButton_date"): + date = self.get_datetime_edit("dateTimeEdit_date") + self.study.use_date(date) + else: + self.study.use_time() self.done(True) diff --git a/src/View/ui/NewStudy.ui b/src/View/ui/NewStudy.ui index 1805c10e..f95ff4a1 100644 --- a/src/View/ui/NewStudy.ui +++ b/src/View/ui/NewStudy.ui @@ -13,60 +13,104 @@ Dialog - + - + + + Name + + + + + + + MyNewStudy + + + + + + + Time system + + + + + - - - - - - - Name - - - - - - - Description - - - - - - - MyNewStudy - - - - - - - false - - - false - - - - - - - - - - - Qt::Horizontal + + + Time - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + true + + + + + + Date + + + + + + + Qt::Vertical + + + + + + + false + + + Staring date + + + + + + + false + + + + + + + + + Description + + + + + + + false + + + false + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + diff --git a/src/tools.py b/src/tools.py index d2f11917..be41a5b3 100644 --- a/src/tools.py +++ b/src/tools.py @@ -131,3 +131,25 @@ def flatten(lst): return [] return reduce(list.__add__, lst) + +def old_pamhyr_date_to_timestamp(date:str): + v = date.split(":") + if len(v) != 4: + return 0 + + m = [ + (24 * 60 * 60), # Day to sec + (60 * 60), # Hour to sec + 60, # Minute to sec + 1 # Sec + ] + + ts = reduce( + lambda acc, x: acc + x, + map( + lambda v, m: int(v) * int(m), + v, m + ) + ) + + return ts