From 7b93f62a644540c73b51260e0bf35022e109a9e5 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr> 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 @@ <property name="windowTitle"> <string>Dialog</string> </property> - <layout class="QGridLayout" name="gridLayout_2"> + <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0"> - <layout class="QVBoxLayout" name="verticalLayout_3"> - <item> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <item> - <layout class="QGridLayout" name="gridLayout"> - <item row="0" column="0"> - <widget class="QLabel" name="label"> - <property name="text"> - <string>Name</string> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="label_2"> - <property name="text"> - <string>Description</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QLineEdit" name="lineEdit_name"> - <property name="text"> - <string>MyNewStudy</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QTextEdit" name="textEdit_description"> - <property name="autoFillBackground"> - <bool>false</bool> - </property> - <property name="tabChangesFocus"> - <bool>false</bool> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Name</string> + </property> + </widget> + </item> + <item row="0" column="1" colspan="2"> + <widget class="QLineEdit" name="lineEdit_name"> + <property name="text"> + <string>MyNewStudy</string> + </property> + </widget> + </item> + <item row="1" column="0" colspan="2"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Time system</string> + </property> + </widget> + </item> + <item row="1" column="2"> + <layout class="QVBoxLayout" name="verticalLayout"> <item> - <widget class="QDialogButtonBox" name="buttonBox"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> + <widget class="QRadioButton" name="radioButton_time"> + <property name="text"> + <string>Time</string> </property> - <property name="standardButtons"> - <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + <property name="checked"> + <bool>true</bool> </property> </widget> </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QRadioButton" name="radioButton_date"> + <property name="text"> + <string>Date</string> + </property> + </widget> + </item> + <item> + <widget class="Line" name="line"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_date"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Staring date</string> + </property> + </widget> + </item> + <item> + <widget class="QDateTimeEdit" name="dateTimeEdit_date"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </item> </layout> </item> + <item row="2" column="0" colspan="2"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Description</string> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QTextEdit" name="textEdit_description"> + <property name="autoFillBackground"> + <bool>false</bool> + </property> + <property name="tabChangesFocus"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="3" column="0" colspan="3"> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> </layout> </widget> <resources/> 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 -- GitLab