Implement DateTime to fix QML bugs on Javascript and daylights. (Windows was a failing case)

This commit is contained in:
Julien Wadel 2022-12-02 16:41:35 +01:00
parent 1b8b57664c
commit 19231ec29f
12 changed files with 657 additions and 71 deletions

View file

@ -216,6 +216,9 @@ set(SOURCES
src/components/other/colors/ColorListModel.cpp src/components/other/colors/ColorListModel.cpp
src/components/other/colors/ColorProxyModel.cpp src/components/other/colors/ColorProxyModel.cpp
src/components/other/colors/ImageColorsProxyModel.cpp src/components/other/colors/ImageColorsProxyModel.cpp
src/components/other/date/LDate.cpp
src/components/other/date/LDateTime.cpp
src/components/other/date/LTime.cpp
src/components/other/images/ImageModel.cpp src/components/other/images/ImageModel.cpp
src/components/other/images/ImageListModel.cpp src/components/other/images/ImageListModel.cpp
src/components/other/images/ImageProxyModel.cpp src/components/other/images/ImageProxyModel.cpp
@ -351,6 +354,9 @@ set(HEADERS
src/components/other/colors/ColorListModel.hpp src/components/other/colors/ColorListModel.hpp
src/components/other/colors/ColorProxyModel.hpp src/components/other/colors/ColorProxyModel.hpp
src/components/other/colors/ImageColorsProxyModel.hpp src/components/other/colors/ImageColorsProxyModel.hpp
src/components/other/date/LDate.hpp
src/components/other/date/LDateTime.hpp
src/components/other/date/LTime.hpp
src/components/other/images/ImageModel.hpp src/components/other/images/ImageModel.hpp
src/components/other/images/ImageListModel.hpp src/components/other/images/ImageListModel.hpp
src/components/other/images/ImageProxyModel.hpp src/components/other/images/ImageProxyModel.hpp

View file

@ -653,12 +653,20 @@ void App::registerTypes () {
qRegisterMetaType<QSharedPointer<ChatCallModel>>(); qRegisterMetaType<QSharedPointer<ChatCallModel>>();
qRegisterMetaType<QSharedPointer<ConferenceInfoModel>>(); qRegisterMetaType<QSharedPointer<ConferenceInfoModel>>();
//qRegisterMetaType<std::shared_ptr<ChatEvent>>(); //qRegisterMetaType<std::shared_ptr<ChatEvent>>();
LinphoneEnums::registerMetaTypes(); LinphoneEnums::registerMetaTypes();
registerType<AssistantModel>("AssistantModel"); registerType<AssistantModel>("AssistantModel");
registerType<AuthenticationNotifier>("AuthenticationNotifier"); registerType<AuthenticationNotifier>("AuthenticationNotifier");
registerType<CallsListProxyModel>("CallsListProxyModel"); registerType<CallsListProxyModel>("CallsListProxyModel");
registerType<Camera>("Camera"); registerType<Camera>("Camera");
registerType<LDate>("LDate");
qRegisterMetaType<LDate*>();
registerType<LDate>("LDateTime");
qRegisterMetaType<LDateTime*>();
registerType<LDate>("LTime");
qRegisterMetaType<LTime*>();
registerType<ChatRoomProxyModel>("ChatRoomProxyModel"); registerType<ChatRoomProxyModel>("ChatRoomProxyModel");
registerType<ConferenceHelperModel>("ConferenceHelperModel"); registerType<ConferenceHelperModel>("ConferenceHelperModel");
registerType<ConferenceProxyModel>("ConferenceProxyModel"); registerType<ConferenceProxyModel>("ConferenceProxyModel");
@ -753,6 +761,9 @@ void App::registerToolTypes () {
qInfo() << QStringLiteral("Registering tool types..."); qInfo() << QStringLiteral("Registering tool types...");
registerToolType<Clipboard>("Clipboard"); registerToolType<Clipboard>("Clipboard");
registerToolType<LDate>("DateTools");
registerToolType<LDateTime>("DateTimeTools");
registerToolType<LTime>("TimeTools");
registerToolType<DesktopTools>("DesktopTools"); registerToolType<DesktopTools>("DesktopTools");
registerToolType<TextToSpeech>("TextToSpeech"); registerToolType<TextToSpeech>("TextToSpeech");
registerToolType<Units>("Units"); registerToolType<Units>("Units");

View file

@ -94,6 +94,9 @@
#include "other/colors/ColorProxyModel.hpp" #include "other/colors/ColorProxyModel.hpp"
#include "other/colors/ImageColorsProxyModel.hpp" #include "other/colors/ImageColorsProxyModel.hpp"
#include "other/clipboard/Clipboard.hpp" #include "other/clipboard/Clipboard.hpp"
#include "other/date/LDate.hpp"
#include "other/date/LDateTime.hpp"
#include "other/date/LTime.hpp"
#include "other/desktop-tools/DesktopTools.hpp" #include "other/desktop-tools/DesktopTools.hpp"
#include "other/images/ImageModel.hpp" #include "other/images/ImageModel.hpp"
#include "other/images/ImageListModel.hpp" #include "other/images/ImageListModel.hpp"

View file

@ -0,0 +1,110 @@
/*
* Copyright (c) 2010-2022 Belledonne Communications SARL.
*
* This file is part of linphone-desktop
* (see https://www.linphone.org).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "LDate.hpp"
#include "app/App.hpp"
#include <QLocale>
// =============================================================================
LDate::LDate(QObject *parent) : QObject(parent) {
}
LDate::LDate(const QDate& date, QObject *parent) : QObject(parent)
, mDate(date){
}
LDate::LDate(const int& year, const int& month, const int& day, QObject *parent) : QObject(parent)
, mDate(year, month, day){
}
LDate * LDate::create(){
return new LDate(QDate::currentDate());
}
LDate * LDate::create(const QDateTime& dateTime){
return new LDate(dateTime.date());
}
LDate * LDate::create(const int& year, const int& month, const int& day){
return new LDate(year, month, day);
}
QString LDate::toDateString(const QString& format) const{
if(format == "")
return QLocale().toString(mDate, QLocale::ShortFormat);
else
return QLocale().toString(mDate,format);
}
bool LDate::isToday() const{
return mDate == QDate::currentDate();
}
bool LDate::isFuture() const{
return mDate > QDate::currentDate();
}
bool LDate::isGreatherThan(LDate* date) const{
return date && mDate >= date->mDate;
}
bool LDate::isEqual(LDate* date) const{
return date && mDate == date->mDate;
}
QDate LDate::getDate()const{
return mDate;
}
int LDate::getDay()const{
return mDate.day();
}
int LDate::getWeekDay()const{
return mDate.dayOfWeek();
}
int LDate::getMonth()const{
return mDate.month();
}
int LDate::getYear()const{
return mDate.year();
}
void LDate::setDay(const int& data){
if(getDay() != data){
mDate = QDate(getYear(), getMonth(), data);
emit dayChanged();
}
}
void LDate::setMonth(const int& data){
if(getMonth() != data){
mDate = QDate(getYear(), data, getDay());
emit monthChanged();
}
}
void LDate::setYear(const int& data){
if(getYear() != data){
mDate = QDate(data, getMonth(), getDay());
emit yearChanged();
}
}

View file

@ -0,0 +1,72 @@
/*
* Copyright (c) 2010-2022 Belledonne Communications SARL.
*
* This file is part of linphone-desktop
* (see https://www.linphone.org).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef DATE_H_
#define DATE_H_
// Used to replace QML Date because of Times bugs (local timezones that changes date)
#include <QObject>
#include <QDate>
// =============================================================================
class LDate : public QObject {
Q_OBJECT
public:
Q_PROPERTY(int day READ getDay WRITE setDay NOTIFY dayChanged)
Q_PROPERTY(int weekday READ getWeekDay NOTIFY dayChanged)
Q_PROPERTY(int month READ getMonth WRITE setMonth NOTIFY monthChanged)
Q_PROPERTY(int year READ getYear WRITE setYear NOTIFY yearChanged)
LDate (QObject *parent = Q_NULLPTR);
LDate(const QDate& date, QObject *parent = Q_NULLPTR);
LDate(const int& year, const int& month, const int& day, QObject *parent = Q_NULLPTR);
Q_INVOKABLE static LDate * create();
Q_INVOKABLE static LDate * create(const QDateTime& dateTime);
Q_INVOKABLE static LDate * create(const int& year, const int& month, const int& day);
Q_INVOKABLE QString toDateString(const QString& format = "") const;// Do not use toString as it's a conflict with JS toString()
Q_INVOKABLE bool isToday() const;
Q_INVOKABLE bool isFuture() const;
Q_INVOKABLE bool isGreatherThan(LDate* date) const;
Q_INVOKABLE bool isEqual(LDate* date) const;
QDate getDate()const;
int getDay()const;
int getWeekDay()const;
int getMonth()const;
int getYear()const;
void setDay(const int& data);
void setMonth(const int& data);
void setYear(const int& data);
signals:
void dayChanged();
void monthChanged();
void yearChanged();
private:
QDate mDate;
};
Q_DECLARE_METATYPE(LDate*);
#endif

View file

@ -0,0 +1,144 @@
/*
* Copyright (c) 2010-2022 Belledonne Communications SARL.
*
* This file is part of linphone-desktop
* (see https://www.linphone.org).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "LDateTime.hpp"
#include "LDate.hpp"
#include "LTime.hpp"
#include "app/App.hpp"
#include <QLocale>
// =============================================================================
LDateTime::LDateTime(QObject *parent) : QObject(parent) {
}
LDateTime::LDateTime(const QDateTime& dateTime, QObject *parent) : QObject(parent)
, mDateTime(dateTime){
}
LDateTime::LDateTime(LDate * date, LTime * time, QObject *parent) : QObject(parent)
, mDateTime(date->getDate(), time->getTime()){
}
LDateTime::LDateTime(const int& year, const int& month, const int& day, const int& hour, const int& minute, const int& second, QObject *parent) : QObject(parent)
, mDateTime(QDate(year, month, day), QTime(hour, minute, second)){
}
LDateTime * LDateTime::create(){
return new LDateTime(QDateTime::currentDateTime());
}
LDateTime * LDateTime::create(LDate * date, LTime * time){
return new LDateTime(date, time);
}
LDateTime * LDateTime::create(const int& year, const int& month, const int& day, const int& hour, const int& minute, const int& second){
return new LDateTime(year, month, day, hour, minute, second);
}
QString LDateTime::toDateTimeString(const QString& format) const{
if(format == "")
return QLocale().toString(mDateTime, QLocale::ShortFormat);
else
return QLocale().toString(mDateTime,format);
}
bool LDateTime::isToday() const{
return mDateTime.date() == QDate::currentDate();
}
bool LDateTime::isFuture() const{
return mDateTime > QDateTime::currentDateTime();
}
int LDateTime::getDay()const{
return mDateTime.date().day();
}
int LDateTime::getWeekDay()const{
return mDateTime.date().dayOfWeek();
}
int LDateTime::getMonth()const{
return mDateTime.date().month();
}
int LDateTime::getYear()const{
return mDateTime.date().year();
}
int LDateTime::getSecond()const{
return mDateTime.time().second();
}
int LDateTime::getMinute()const{
return mDateTime.time().minute();
}
int LDateTime::getHour()const{
return mDateTime.time().hour();
}
//-----------------------------------------------------------------------
void LDateTime::setDay(const int& data){
if(getDay() != data){
mDateTime.setDate(QDate(getYear(), getMonth(), data));
emit dayChanged();
emit dateTimeChanged();
}
}
void LDateTime::setMonth(const int& data){
if(getMonth() != data){
mDateTime.setDate(QDate(getYear(), data, getDay()));
emit monthChanged();
emit dateTimeChanged();
}
}
void LDateTime::setYear(const int& data){
if(getYear() != data){
mDateTime.setDate(QDate(data, getMonth(), getDay()));
emit yearChanged();
emit dateTimeChanged();
}
}
void LDateTime::setSecond(const int& data){
if(getSecond() != data){
mDateTime.setTime(QTime(getHour(), getMinute(), data));
emit secondChanged();
emit dateTimeChanged();
}
}
void LDateTime::setMinute(const int& data){
if(getMinute() != data){
mDateTime.setTime(QTime(getHour(), data, getSecond()));
emit minuteChanged();
emit dateTimeChanged();
}
}
void LDateTime::setHour(const int& data){
if(getHour() != data){
mDateTime.setTime(QTime(data, getMinute(), getSecond()));
emit hourChanged();
emit dateTimeChanged();
}
}

View file

@ -0,0 +1,92 @@
/*
* Copyright (c) 2010-2022 Belledonne Communications SARL.
*
* This file is part of linphone-desktop
* (see https://www.linphone.org).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef DATE_TIME_H_
#define DATE_TIME_H_
// Used to replace QML Date because of Times bugs (local timezones that changes date)
#include <QObject>
#include <QDate>
// =============================================================================
class LDate;
class LTime;
// Note: we don't inherit because we are using a QDateTime and not : QDate and QTime
class LDateTime : public QObject {
Q_OBJECT
public:
Q_PROPERTY(int day READ getDay WRITE setDay NOTIFY dayChanged)
Q_PROPERTY(int weekday READ getWeekDay NOTIFY dayChanged)
Q_PROPERTY(int month READ getMonth WRITE setMonth NOTIFY monthChanged)
Q_PROPERTY(int year READ getYear WRITE setYear NOTIFY yearChanged)
Q_PROPERTY(int second READ getSecond WRITE setSecond NOTIFY secondChanged)
Q_PROPERTY(int minute READ getMinute WRITE setMinute NOTIFY minuteChanged)
Q_PROPERTY(int hour READ getHour WRITE setHour NOTIFY hourChanged)
Q_PROPERTY(QDateTime dateTime MEMBER mDateTime NOTIFY dateTimeChanged)
LDateTime (QObject *parent = Q_NULLPTR);
LDateTime(const QDateTime& date, QObject *parent = Q_NULLPTR);
LDateTime(LDate * date, LTime * time, QObject *parent = Q_NULLPTR);
LDateTime(const int& year, const int& month, const int& day, const int& hour, const int& minute, const int& second, QObject *parent = Q_NULLPTR);
Q_INVOKABLE static LDateTime * create();
Q_INVOKABLE static LDateTime * create(LDate * date, LTime * time);
Q_INVOKABLE static LDateTime * create(const int& year, const int& month, const int& day, const int& hout, const int& minute, const int& second);
Q_INVOKABLE QString toDateTimeString(const QString& format = "") const;// Do not use toString as it's a conflict with JS toString()
Q_INVOKABLE bool isToday() const;
Q_INVOKABLE bool isFuture() const;
int getDay()const;
int getWeekDay()const;
int getMonth()const;
int getYear()const;
int getSecond()const;
int getMinute()const;
int getHour()const;
//-------------------------------------
void setDay(const int& data);
void setMonth(const int& data);
void setYear(const int& data);
void setSecond(const int& data);
void setMinute(const int& data);
void setHour(const int& data);
signals:
void dayChanged();
void monthChanged();
void yearChanged();
void secondChanged();
void minuteChanged();
void hourChanged();
void dateTimeChanged();
private:
QDateTime mDateTime;
};
Q_DECLARE_METATYPE(LDateTime*);
#endif

View file

@ -0,0 +1,90 @@
/*
* Copyright (c) 2010-2022 Belledonne Communications SARL.
*
* This file is part of linphone-desktop
* (see https://www.linphone.org).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "LTime.hpp"
#include "app/App.hpp"
#include <QLocale>
// =============================================================================
LTime::LTime(QObject *parent) : QObject(parent) {
}
LTime::LTime(const QTime& time, QObject *parent) : QObject(parent)
, mTime(time){
}
LTime::LTime(const int& hour, const int& minute, const int& second, QObject *parent) : QObject(parent)
, mTime(hour, minute, second){
}
LTime * LTime::create(){
return new LTime(QTime::currentTime());
}
LTime * LTime::create(const QDateTime& dateTime){
return new LTime(dateTime.time());
}
LTime * LTime::create(const int& hour, const int& minute, const int& second){
return new LTime(hour, minute, second);
}
QString LTime::toTimeString(const QString& format) const{
if(format == "")
return QLocale().toString(mTime, QLocale::ShortFormat);
else
return QLocale().toString(mTime,format);
}
QTime LTime::getTime() const{
return mTime;
}
int LTime::getSecond()const{
return mTime.second();
}
int LTime::getMinute()const{
return mTime.minute();
}
int LTime::getHour()const{
return mTime.hour();
}
void LTime::setSecond(const int& data){
if(getSecond() != data){
mTime = QTime(getHour(), getMinute(), data);
emit secondChanged();
}
}
void LTime::setMinute(const int& data){
if(getMinute() != data){
mTime = QTime(getHour(), data, getSecond());
emit minuteChanged();
}
}
void LTime::setHour(const int& data){
if(getHour() != data){
mTime = QTime(data, getMinute(), getSecond());
emit hourChanged();
}
}

View file

@ -0,0 +1,66 @@
/*
* Copyright (c) 2010-2022 Belledonne Communications SARL.
*
* This file is part of linphone-desktop
* (see https://www.linphone.org).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef TIME_H_
#define TIME_H_
// Used to replace QML Date because of Times bugs (local timezones that changes date)
#include <QObject>
#include <QTime>
// =============================================================================
class LTime : public QObject {
Q_OBJECT
public:
Q_PROPERTY(int second READ getSecond WRITE setSecond NOTIFY secondChanged)
Q_PROPERTY(int minute READ getMinute WRITE setMinute NOTIFY minuteChanged)
Q_PROPERTY(int hour READ getHour WRITE setHour NOTIFY hourChanged)
LTime (QObject *parent = Q_NULLPTR);
LTime(const QTime& date, QObject *parent = Q_NULLPTR);
LTime(const int& hour, const int& minute, const int& second, QObject *parent = Q_NULLPTR);
Q_INVOKABLE static LTime* create();
Q_INVOKABLE static LTime* create(const QDateTime& dateTime);
Q_INVOKABLE static LTime* create(const int& hour, const int& minute, const int& second);
Q_INVOKABLE QString toTimeString(const QString& format = "") const;// Do not use toString as it's a conflict with JS toString()
QTime getTime() const;
int getSecond()const;
int getMinute()const;
int getHour()const;
void setSecond(const int& data);
void setMinute(const int& data);
void setHour(const int& data);
signals:
void secondChanged();
void minuteChanged();
void hourChanged();
private:
QTime mTime;
};
Q_DECLARE_METATYPE(LTime*);
#endif

View file

@ -3,15 +3,20 @@ import QtQuick.Layouts 1.3
import Common 1.0 import Common 1.0
import Common.Styles 1.0 import Common.Styles 1.0
import Linphone 1.0
import Units 1.0 import Units 1.0
import DateTools 1.0
import 'qrc:/ui/scripts/Utils/utils.js' as Utils
Item{ Item{
id: mainItem id: mainItem
property bool allYears : false // if false : years from today property bool allYears : false // if false : years from today
property alias selectedDate: monthList.selectedDate property alias selectedDate: monthList.selectedDate
property bool hideOldDates : false property bool hideOldDates : false
signal clicked(date date); signal clicked(var date);
RowLayout { RowLayout {
id: headerRow id: headerRow
@ -33,7 +38,8 @@ Item{
Layout.fillWidth: true Layout.fillWidth: true
Layout.alignment: Qt.AlignCenter Layout.alignment: Qt.AlignCenter
horizontalAlignment: Qt.AlignCenter horizontalAlignment: Qt.AlignCenter
text: new Date(monthList.currentYear, monthList.currentMonth, 1).toLocaleString(Qt.locale(), 'MMMM yyyy') text: DateTools.create(monthList.currentYear, monthList.currentMonth, 1).toDateString('MMMM yyyy')
onTextChanged: console.log(monthList.currentYear + "/"+monthList.currentMonth + " => " + text)
color: DatePickerStyle.title.color color: DatePickerStyle.title.color
font.pointSize: DatePickerStyle.title.pointSize font.pointSize: DatePickerStyle.title.pointSize
} }
@ -56,28 +62,29 @@ Item{
property int maxYears: 5 // Max years to be requested. property int maxYears: 5 // Max years to be requested.
function set(date) { function set(date) {
selectedDate = new Date(date) selectedDate = date
var moveTo = (selectedDate.getFullYear()-minYear) * 12 + selectedDate.getMonth() var moveTo = (selectedDate.year-minYear) * 12 + (selectedDate.month-1)
currentIndex = moveTo currentIndex = moveTo
} }
property date selectedDate: new Date() property var selectedDate: DateTools.create()
property int minYear: mainItem.allYears ? new Date(0,0,0).getFullYear() : new Date().getFullYear() property int minYear: mainItem.allYears ? DateTools.create(0,0,0).year : DateTools.create().year
snapMode: ListView.SnapOneItem snapMode: ListView.SnapOneItem
orientation: Qt.Horizontal orientation: Qt.Horizontal
clip: true clip: true
// One model per month // One model per month
model: (new Date().getFullYear()- minYear + maxYears) * 12 model: (DateTools.create().year- minYear + maxYears) * 12
property int currentYear: Math.floor(currentIndex / 12) + minYear property int currentYear: Math.floor(currentIndex / 12) + minYear
property int currentMonth: currentIndex % 12 property int currentMonth: currentIndex % 12 + 1
highlightFollowsCurrentItem: true highlightFollowsCurrentItem: true
highlightRangeMode: ListView.StrictlyEnforceRange highlightRangeMode: ListView.StrictlyEnforceRange
highlightMoveDuration: 100 highlightMoveDuration: 100
Component.onCompleted: monthList.set(mainItem.selectedDate) Component.onCompleted: monthList.set(mainItem.selectedDate)
delegate: Item { delegate: Item {
@ -85,8 +92,8 @@ Item{
height: monthList.height == 0 ? 100 : monthList.height height: monthList.height == 0 ? 100 : monthList.height
property int year: Math.floor(index / 12) + monthList.minYear property int year: Math.floor(index / 12) + monthList.minYear
property int month: index % 12 property int month: index % 12 + 1
property int firstDay: new Date(year, month, 1).getDay() property int firstDay: DateTools.create(year, month, 1).weekday % 7
GridLayout { // 1 month calender GridLayout { // 1 month calender
id: grid id: grid
@ -107,7 +114,9 @@ Item{
id: cellItem id: cellItem
property int day: index - 7 // 0 = top left below Sunday (-7 to 41) property int day: index - 7 // 0 = top left below Sunday (-7 to 41)
property int date: day - firstDay + 1 // 1-31 property int date: day - firstDay + 1 // 1-31
property bool selected : text.text != '-' && new Date(year, month, date).toDateString() == monthList.selectedDate.toDateString() && text.text && day >= 0 property var currentDate: DateTools.create(year, month, date)
property bool selected : text.text != '-' && currentDate.isEqual(monthList.selectedDate) && text.text && day >= 0
width: grid.cellMinSize width: grid.cellMinSize
height: width height: width
@ -132,12 +141,12 @@ Item{
: cellItem.day < 0 : cellItem.day < 0
? DatePickerStyle.cell.dayHeaderPointSize ? DatePickerStyle.cell.dayHeaderPointSize
: DatePickerStyle.cell.dayPointSize : DatePickerStyle.cell.dayPointSize
font.bold: cellItem.day < 0 || cellItem.selected || new Date(year, month, cellItem.date).toDateString() == new Date().toDateString() // today font.bold: cellItem.day < 0 || cellItem.selected || cellItem.currentDate.isToday()
text: { text: {
if(cellItem.day < 0) if(cellItem.day < 0){
// Magic date to set day names in this order : 'S', 'M', 'T', 'W', 'T', 'F', 'S' in Locale // Magic date to set day names in this order : 'S', 'M', 'T', 'W', 'T', 'F', 'S' in Locale
return new Date(1,3,index).toLocaleString(Qt.locale(), 'ddd')[0] return DateTools.create(2000,10,index+1).toDateString("ddd")[0].toUpperCase()
else if(new Date(year, month, cellItem.date).getMonth() == month && (!hideOldDates || new Date(year, month, cellItem.date+1) >= new Date())) // new Date use time too }else if(cellItem.currentDate.month == month && (!hideOldDates || cellItem.currentDate.isFuture() || cellItem.currentDate.isToday() )) // new Date use time too
return cellItem.date return cellItem.date
else else
return '-' return '-'
@ -152,7 +161,7 @@ Item{
enabled: text.text && text.text != '-' && cellItem.day >= 0 enabled: text.text && text.text != '-' && cellItem.day >= 0
onClicked: { onClicked: {
monthList.selectedDate = new Date(year, month, cellItem.date) monthList.selectedDate = cellItem.currentDate
mainItem.clicked(monthList.selectedDate) mainItem.clicked(monthList.selectedDate)
} }
} }

View file

@ -5,27 +5,31 @@ import Common 1.0
import Common.Styles 1.0 import Common.Styles 1.0
import Units 1.0 import Units 1.0
import TimeTools 1.0
import 'qrc:/ui/scripts/Utils/utils.js' as Utils
Item{ Item{
id: mainItem id: mainItem
property date selectedTime property var selectedTime: TimeTools.create()
property int border: 25 property int border: 25
property int centerPosition: Math.min(height, width)/2 property int centerPosition: Math.min(height, width)/2
property int middleMinSize: centerPosition - border // Minus border property int middleMinSize: centerPosition - border // Minus border
signal newDate(date date) signal newDate(var date)
signal clicked(date date) signal clicked(var date)
onNewDate: selectedTime = date onNewDate: selectedTime = date
function getDate(hText, mText){ function getDate(hText, mText){
var d = new Date() var d = TimeTools.create()
if(hText || outer.currentItem) if(hText || outer.currentItem)
d.setHours(hText ? hText : outer.currentItem.text) d.hour = (hText ? hText : outer.currentItem.text)
if(mText || inner.currentItem) if(mText || inner.currentItem)
d.setMinutes(mText ? mText : inner.currentItem.text) d.minute = (mText ? mText : inner.currentItem.text)
d.setSeconds(0) d.second = 0
return d; return d;
} }
@ -39,9 +43,9 @@ Item{
currentIndex: 0 currentIndex: 0
Connections{// startX/Y begin from currentIndex. It must be set to 0 at first. Connections{// startX/Y begin from currentIndex. It must be set to 0 at first.
target: mainItem target: mainItem
onSelectedTimeChanged: outer.currentIndex = mainItem.selectedTime.getHours() % 24 onSelectedTimeChanged: outer.currentIndex = mainItem.selectedTime.hour % 24
} }
Component.onCompleted: currentIndex = mainItem.selectedTime.getHours() % 24 Component.onCompleted: currentIndex = mainItem.selectedTime.hour % 24
highlight: Rectangle { highlight: Rectangle {
id: rect id: rect
@ -100,9 +104,9 @@ Item{
currentIndex: 0 currentIndex: 0
Connections{// startX/Y begin from currentIndex. It must be set to 0 at first. Connections{// startX/Y begin from currentIndex. It must be set to 0 at first.
target: mainItem target: mainItem
onSelectedTimeChanged: inner.currentIndex = mainItem.selectedTime.getMinutes() / 5 onSelectedTimeChanged: inner.currentIndex = mainItem.selectedTime.minute / 5
} }
Component.onCompleted: currentIndex = mainItem.selectedTime.getMinutes() / 5 Component.onCompleted: currentIndex = mainItem.selectedTime.minute / 5
highlight: Rectangle { highlight: Rectangle {
width: 30 * 1.5 width: 30 * 1.5

View file

@ -11,7 +11,9 @@ import Common.Styles 1.0
import Units 1.0 import Units 1.0
import UtilsCpp 1.0 import UtilsCpp 1.0
import ColorsList 1.0 import ColorsList 1.0
import DateTools 1.0
import TimeTools 1.0
import DateTimeTools 1.0
import 'qrc:/ui/scripts/Utils/utils.js' as Utils import 'qrc:/ui/scripts/Utils/utils.js' as Utils
// ============================================================================= // =============================================================================
@ -20,8 +22,8 @@ DialogPlus {
property bool isNew: !conferenceInfoModel || conferenceInfoModel.uri === '' property bool isNew: !conferenceInfoModel || conferenceInfoModel.uri === ''
property ConferenceInfoModel conferenceInfoModel: ConferenceInfoModel{} property ConferenceInfoModel conferenceInfoModel: ConferenceInfoModel{}
onConferenceInfoModelChanged: { onConferenceInfoModelChanged: {
dateField.setDate(conferenceManager.conferenceInfoModel.dateTimeUtc); dateField.setDate(DateTools.create(conferenceManager.conferenceInfoModel.dateTimeUtc));
timeField.setTime(conferenceManager.conferenceInfoModel.dateTimeUtc); timeField.setTime(TimeTools.create(conferenceManager.conferenceInfoModel.dateTimeUtc));
selectedParticipants.setAddresses(conferenceInfoModel) selectedParticipants.setAddresses(conferenceInfoModel)
} }
property bool forceSchedule : false property bool forceSchedule : false
@ -130,11 +132,11 @@ DialogPlus {
} }
conferenceManager.creationState = 1 conferenceManager.creationState = 1
if( scheduledSwitch.checked){ if( scheduledSwitch.checked){
var startDateTime = Utils.buildDate(dateField.getDate(), timeField.getTime()) var startDateTime = DateTimeTools.create(dateField.getDate(), timeField.getTime())
conferenceInfoModel.isScheduled = true conferenceInfoModel.isScheduled = true
startDateTime.setSeconds(0) startDateTime.second = 0
conferenceInfoModel.timeZoneModel = timeZoneField.model.getAt(timeZoneField.currentIndex) conferenceInfoModel.timeZoneModel = timeZoneField.model.getAt(timeZoneField.currentIndex)
conferenceInfoModel.dateTime = startDateTime conferenceInfoModel.dateTime = startDateTime.dateTime
conferenceInfoModel.duration = durationField.model[durationField.currentIndex].value conferenceInfoModel.duration = durationField.model[durationField.currentIndex].value
}else }else
conferenceInfoModel.isScheduled = false conferenceInfoModel.isScheduled = false
@ -271,7 +273,7 @@ DialogPlus {
Layout.margins: 10 Layout.margins: 10
columns: 4 columns: 4
property var locale: Qt.locale() property var locale: Qt.locale()
property date currentDate: new Date() property var currentDate: DateTools.create()
property int cellWidth: (parent.width-15-20)/columns property int cellWidth: (parent.width-15-20)/columns
@ -293,20 +295,22 @@ DialogPlus {
Layout.preferredWidth: parent.cellWidth; wrapMode: Text.WordWrap; color: NewConferenceStyle.titles.textColor; font.weight: NewConferenceStyle.titles.weight; font.pointSize: NewConferenceStyle.titles.pointSize } Layout.preferredWidth: parent.cellWidth; wrapMode: Text.WordWrap; color: NewConferenceStyle.titles.textColor; font.weight: NewConferenceStyle.titles.weight; font.pointSize: NewConferenceStyle.titles.pointSize }
TextField{id: dateField; Layout.preferredWidth: parent.cellWidth TextField{id: dateField; Layout.preferredWidth: parent.cellWidth
color: NewConferenceStyle.fields.textColor; font.weight: NewConferenceStyle.fields.weight; font.pointSize: NewConferenceStyle.fields.pointSize color: NewConferenceStyle.fields.textColor; font.weight: NewConferenceStyle.fields.weight; font.pointSize: NewConferenceStyle.fields.pointSize
property date currentDate: new Date() property var currentDate: DateTools.create()
function getDate(){ function getDate(){
return currentDate return currentDate
} }
function setDate(date){ function setDate(date){
console.log(date + " => " +Utils.printObject(date))
currentDate = date currentDate = date
text = date.toLocaleDateString(scheduleForm.locale, Qt.ISODate) text = date.toDateString()
} }
text: conferenceManager.conferenceInfoModel ? conferenceManager.conferenceInfoModel.dateTime.toLocaleDateString(scheduleForm.locale, Qt.ISODate) : '' text: conferenceManager.conferenceInfoModel && conferenceManager.conferenceInfoModel.isScheduled ? conferenceManager.conferenceInfoModel.dateTime.toLocaleDateString(scheduleForm.locale, Qt.ISODate) : DateTools.create().toDateString()
icon: 'drop_down_custom' icon: 'drop_down_custom'
MouseArea{ MouseArea{
anchors.fill: parent anchors.fill: parent
onClicked: { onClicked: {
window.attachVirtualWindow(Utils.buildCommonDialogUri('DateTimeDialog'), {hideOldDates:true, showDatePicker:true, selectedDate: new Date(dateField.getDate())} window.attachVirtualWindow(Utils.buildCommonDialogUri('DateTimeDialog'), {hideOldDates:true, showDatePicker:true, selectedDate: dateField.getDate()}
, function (status) { , function (status) {
if(status){ if(status){
dateField.setDate(status.selectedDate) dateField.setDate(status.selectedDate)
@ -318,16 +322,16 @@ DialogPlus {
} }
TextField{id: timeField; Layout.preferredWidth: parent.cellWidth TextField{id: timeField; Layout.preferredWidth: parent.cellWidth
color: NewConferenceStyle.fields.textColor; font.weight: NewConferenceStyle.fields.weight; font.pointSize: NewConferenceStyle.fields.pointSize color: NewConferenceStyle.fields.textColor; font.weight: NewConferenceStyle.fields.weight; font.pointSize: NewConferenceStyle.fields.pointSize
property var currentTime: TimeTools.create()
function getTime(){ function getTime(){
return Date.fromLocaleTimeString(scheduleForm.locale, timeField._text, 'hh:mm') return currentTime
} }
function setTime(date){ function setTime(time){
_text = date.toLocaleTimeString(scheduleForm.locale, 'hh:mm') currentTime = time
text = UtilsCpp.toTimeString(date, 'hh:mm')// Display the unchanged time text = time.toTimeString('hh:mm')
} }
// hidden time to be used from JS : JS Local time can be wrong on Windows because of daylights that are not takken account.
property string _text: conferenceManager.conferenceInfoModel? conferenceManager.conferenceInfoModel.dateTime.toLocaleTimeString(scheduleForm.locale, 'hh:mm') : '' text: conferenceManager.conferenceInfoModel && conferenceManager.conferenceInfoModel.isScheduled ? UtilsCpp.toTimeString(conferenceManager.conferenceInfoModel.dateTimeUtc, 'hh:mm') : TimeTools.create().toTimeString('hh:mm')
text: conferenceManager.conferenceInfoModel? UtilsCpp.toTimeString(conferenceManager.conferenceInfoModel.dateTimeUtc, 'hh:mm') : ''
icon: 'drop_down_custom' icon: 'drop_down_custom'
onEditingFinished: if(rightStackView.currentItemType === 2) { onEditingFinished: if(rightStackView.currentItemType === 2) {
@ -341,7 +345,7 @@ DialogPlus {
anchors.right: parent.right anchors.right: parent.right
width: parent.width-50 width: parent.width-50
onClicked: { onClicked: {
window.attachVirtualWindow(Utils.buildCommonDialogUri('DateTimeDialog'), {showTimePicker:true, selectedTime: new Date(timeField.getTime())} window.attachVirtualWindow(Utils.buildCommonDialogUri('DateTimeDialog'), {showTimePicker:true, selectedTime: timeField.getTime()}
, function (status) { , function (status) {
if(status){ if(status){
timeField.setTime(status.selectedTime) timeField.setTime(status.selectedTime)
@ -374,31 +378,6 @@ DialogPlus {
selectionWidth: 500 selectionWidth: 500
rootItem: conferenceManager rootItem: conferenceManager
} }
function updateDateTime(){
var storedDate
if( dateField.text != '' && timeField.text != ''){
storedDate = Utils.buildDate(dateField.getDate(), timeField.getTime() )
}else
storedDate = new Date()
var currentDate = new Date()
if(currentDate >= storedDate){
var nextStoredDate = UtilsCpp.addMinutes(new Date(), 1)
dateField.setDate(nextStoredDate)
timeField.setTime(nextStoredDate)
if(rightStackView.currentItemType === 2) rightStackView.currentItem.selectedTime = nextStoredDate
}
}
Timer{
running: scheduleForm.visible && conferenceManager.isNew
repeat: true
interval: 1000
triggeredOnStart: true
onTriggered: {
if(conferenceManager.isNew)
scheduleForm.updateDateTime()
}
}
} }
ColumnLayout { ColumnLayout {