|
@@
-1,156
+1,154
|
|
1
|
#include "TimeWidget/TimeWidget.h"
|
|
1
|
#include "TimeWidget/TimeWidget.h"
|
|
2
|
#include "ui_TimeWidget.h"
|
|
2
|
#include "ui_TimeWidget.h"
|
|
3
|
|
|
3
|
|
|
4
|
#include <Common/DateUtils.h>
|
|
4
|
#include <Common/DateUtils.h>
|
|
5
|
#include <Common/MimeTypesDef.h>
|
|
5
|
#include <Common/MimeTypesDef.h>
|
|
6
|
|
|
6
|
|
|
7
|
#include <DragAndDrop/DragDropHelper.h>
|
|
7
|
#include <DragAndDrop/DragDropHelper.h>
|
|
8
|
#include <SqpApplication.h>
|
|
8
|
#include <SqpApplication.h>
|
|
9
|
#include <Time/TimeController.h>
|
|
9
|
#include <Time/TimeController.h>
|
|
10
|
|
|
10
|
|
|
11
|
#include <QDrag>
|
|
11
|
#include <QDrag>
|
|
12
|
#include <QDragEnterEvent>
|
|
12
|
#include <QDragEnterEvent>
|
|
13
|
#include <QDropEvent>
|
|
13
|
#include <QDropEvent>
|
|
14
|
#include <QMimeData>
|
|
14
|
#include <QMimeData>
|
|
15
|
|
|
15
|
|
|
16
|
|
|
16
|
|
|
17
|
struct TimeWidget::TimeWidgetPrivate {
|
|
17
|
struct TimeWidget::TimeWidgetPrivate {
|
|
18
|
|
|
18
|
|
|
19
|
explicit TimeWidgetPrivate() {}
|
|
19
|
explicit TimeWidgetPrivate() {}
|
|
20
|
|
|
20
|
|
|
21
|
QPoint m_DragStartPosition;
|
|
21
|
QPoint m_DragStartPosition;
|
|
22
|
};
|
|
22
|
};
|
|
23
|
|
|
23
|
|
|
24
|
TimeWidget::TimeWidget(QWidget *parent)
|
|
24
|
TimeWidget::TimeWidget(QWidget *parent)
|
|
25
|
: QWidget{parent},
|
|
25
|
: QWidget{parent},
|
|
26
|
ui{new Ui::TimeWidget},
|
|
26
|
ui{new Ui::TimeWidget},
|
|
27
|
impl{spimpl::make_unique_impl<TimeWidgetPrivate>()}
|
|
27
|
impl{spimpl::make_unique_impl<TimeWidgetPrivate>()}
|
|
28
|
{
|
|
28
|
{
|
|
29
|
ui->setupUi(this);
|
|
29
|
ui->setupUi(this);
|
|
30
|
|
|
30
|
|
|
31
|
ui->applyToolButton->setIcon(sqpApp->style()->standardIcon(QStyle::SP_DialogApplyButton));
|
|
31
|
ui->applyToolButton->setIcon(sqpApp->style()->standardIcon(QStyle::SP_DialogApplyButton));
|
|
32
|
|
|
32
|
|
|
33
|
// Connection
|
|
33
|
// Connection
|
|
34
|
connect(ui->startDateTimeEdit, &QDateTimeEdit::dateTimeChanged, this,
|
|
34
|
connect(ui->startDateTimeEdit, &QDateTimeEdit::dateTimeChanged, this,
|
|
35
|
&TimeWidget::onTimeUpdateRequested);
|
|
35
|
&TimeWidget::onTimeUpdateRequested);
|
|
36
|
|
|
36
|
|
|
37
|
connect(ui->endDateTimeEdit, &QDateTimeEdit::dateTimeChanged, this,
|
|
37
|
connect(ui->endDateTimeEdit, &QDateTimeEdit::dateTimeChanged, this,
|
|
38
|
&TimeWidget::onTimeUpdateRequested);
|
|
38
|
&TimeWidget::onTimeUpdateRequested);
|
|
39
|
|
|
39
|
|
|
40
|
|
|
40
|
|
|
41
|
connect(ui->applyToolButton, &QToolButton::clicked, &sqpApp->timeController(),
|
|
41
|
connect(ui->applyToolButton, &QToolButton::clicked, &sqpApp->timeController(),
|
|
42
|
&TimeController::onTimeNotify);
|
|
42
|
&TimeController::onTimeNotify);
|
|
43
|
|
|
43
|
|
|
44
|
// Initialisation
|
|
44
|
// Initialisation
|
|
45
|
auto endDateTime = QDateTime::currentDateTimeUtc();
|
|
45
|
auto endDateTime = QDateTime::currentDateTimeUtc();
|
|
46
|
auto startDateTime = endDateTime.addSecs(-3600); // one hour before
|
|
46
|
auto startDateTime = endDateTime.addSecs(-3600); // one hour before
|
|
47
|
|
|
47
|
|
|
48
|
ui->startDateTimeEdit->setDateTime(startDateTime);
|
|
48
|
ui->startDateTimeEdit->setDateTime(startDateTime);
|
|
49
|
ui->endDateTimeEdit->setDateTime(endDateTime);
|
|
49
|
ui->endDateTimeEdit->setDateTime(endDateTime);
|
|
50
|
|
|
50
|
|
|
51
|
auto dateTime = SqpRange{DateUtils::secondsSinceEpoch(startDateTime),
|
|
51
|
auto dateTime = SqpRange{DateUtils::secondsSinceEpoch(startDateTime),
|
|
52
|
DateUtils::secondsSinceEpoch(endDateTime)};
|
|
52
|
DateUtils::secondsSinceEpoch(endDateTime)};
|
|
53
|
|
|
53
|
|
|
54
|
sqpApp->timeController().onTimeToUpdate(dateTime);
|
|
54
|
sqpApp->timeController().onTimeToUpdate(dateTime);
|
|
55
|
}
|
|
55
|
}
|
|
56
|
|
|
56
|
|
|
57
|
|
|
57
|
|
|
58
|
TimeWidget::~TimeWidget()
|
|
58
|
TimeWidget::~TimeWidget()
|
|
59
|
{
|
|
59
|
{
|
|
60
|
delete ui;
|
|
60
|
delete ui;
|
|
61
|
}
|
|
61
|
}
|
|
62
|
|
|
62
|
|
|
63
|
void TimeWidget::setTimeRange(SqpRange time)
|
|
63
|
void TimeWidget::setTimeRange(SqpRange time)
|
|
64
|
{
|
|
64
|
{
|
|
65
|
auto startDateTime = DateUtils::dateTime(time.m_TStart);
|
|
65
|
auto startDateTime = DateUtils::dateTime(time.m_TStart);
|
|
66
|
auto endDateTime = DateUtils::dateTime(time.m_TEnd);
|
|
66
|
auto endDateTime = DateUtils::dateTime(time.m_TEnd);
|
|
67
|
|
|
67
|
|
|
68
|
ui->startDateTimeEdit->setDateTime(startDateTime);
|
|
68
|
ui->startDateTimeEdit->setDateTime(startDateTime);
|
|
69
|
ui->endDateTimeEdit->setDateTime(endDateTime);
|
|
69
|
ui->endDateTimeEdit->setDateTime(endDateTime);
|
|
70
|
}
|
|
70
|
}
|
|
71
|
|
|
71
|
|
|
72
|
SqpRange TimeWidget::timeRange() const
|
|
72
|
SqpRange TimeWidget::timeRange() const
|
|
73
|
{
|
|
73
|
{
|
|
74
|
return SqpRange{DateUtils::secondsSinceEpoch(ui->startDateTimeEdit->dateTime()),
|
|
74
|
return SqpRange{DateUtils::secondsSinceEpoch(ui->startDateTimeEdit->dateTime()),
|
|
75
|
DateUtils::secondsSinceEpoch(ui->endDateTimeEdit->dateTime())};
|
|
75
|
DateUtils::secondsSinceEpoch(ui->endDateTimeEdit->dateTime())};
|
|
76
|
}
|
|
76
|
}
|
|
77
|
|
|
77
|
|
|
78
|
void TimeWidget::onTimeUpdateRequested()
|
|
78
|
void TimeWidget::onTimeUpdateRequested()
|
|
79
|
{
|
|
79
|
{
|
|
80
|
auto dateTime = timeRange();
|
|
80
|
auto dateTime = timeRange();
|
|
81
|
emit timeUpdated(std::move(dateTime));
|
|
81
|
emit timeUpdated(std::move(dateTime));
|
|
82
|
}
|
|
82
|
}
|
|
83
|
|
|
83
|
|
|
84
|
void TimeWidget::dragEnterEvent(QDragEnterEvent *event)
|
|
84
|
void TimeWidget::dragEnterEvent(QDragEnterEvent *event)
|
|
85
|
{
|
|
85
|
{
|
|
86
|
if (event->mimeData()->hasFormat(MIME_TYPE_TIME_RANGE)) {
|
|
86
|
if (event->mimeData()->hasFormat(MIME_TYPE_TIME_RANGE)) {
|
|
87
|
event->acceptProposedAction();
|
|
87
|
event->acceptProposedAction();
|
|
88
|
setStyleSheet("QDateTimeEdit{background-color: #BBD5EE; border:2px solid #2A7FD4}");
|
|
88
|
setStyleSheet("QDateTimeEdit{background-color: #BBD5EE; border:2px solid #2A7FD4}");
|
|
89
|
}
|
|
89
|
}
|
|
90
|
else {
|
|
90
|
else {
|
|
91
|
event->ignore();
|
|
91
|
event->ignore();
|
|
92
|
}
|
|
92
|
}
|
|
93
|
}
|
|
93
|
}
|
|
94
|
|
|
94
|
|
|
95
|
void TimeWidget::dragLeaveEvent(QDragLeaveEvent *event)
|
|
95
|
void TimeWidget::dragLeaveEvent(QDragLeaveEvent *event)
|
|
96
|
{
|
|
96
|
{
|
|
97
|
setStyleSheet(QString());
|
|
97
|
setStyleSheet(QString());
|
|
98
|
}
|
|
98
|
}
|
|
99
|
|
|
99
|
|
|
100
|
void TimeWidget::dropEvent(QDropEvent *event)
|
|
100
|
void TimeWidget::dropEvent(QDropEvent *event)
|
|
101
|
{
|
|
101
|
{
|
|
102
|
if (event->mimeData()->hasFormat(MIME_TYPE_TIME_RANGE)) {
|
|
102
|
if (event->mimeData()->hasFormat(MIME_TYPE_TIME_RANGE)) {
|
|
103
|
auto mimeData = event->mimeData()->data(MIME_TYPE_TIME_RANGE);
|
|
103
|
auto mimeData = event->mimeData()->data(MIME_TYPE_TIME_RANGE);
|
|
104
|
auto timeRange = TimeController::timeRangeForMimeData(mimeData);
|
|
104
|
auto timeRange = TimeController::timeRangeForMimeData(mimeData);
|
|
105
|
|
|
105
|
|
|
106
|
setTimeRange(timeRange);
|
|
106
|
setTimeRange(timeRange);
|
|
107
|
}
|
|
107
|
}
|
|
108
|
else {
|
|
108
|
else {
|
|
109
|
event->ignore();
|
|
109
|
event->ignore();
|
|
110
|
}
|
|
110
|
}
|
|
111
|
|
|
111
|
|
|
112
|
setStyleSheet(QString());
|
|
112
|
setStyleSheet(QString());
|
|
113
|
}
|
|
113
|
}
|
|
114
|
|
|
114
|
|
|
115
|
|
|
115
|
|
|
116
|
void TimeWidget::mousePressEvent(QMouseEvent *event)
|
|
116
|
void TimeWidget::mousePressEvent(QMouseEvent *event)
|
|
117
|
{
|
|
117
|
{
|
|
118
|
if (event->button() == Qt::LeftButton) {
|
|
118
|
if (event->button() == Qt::LeftButton) {
|
|
119
|
impl->m_DragStartPosition = event->pos();
|
|
119
|
impl->m_DragStartPosition = event->pos();
|
|
120
|
}
|
|
120
|
}
|
|
121
|
|
|
121
|
|
|
122
|
QWidget::mousePressEvent(event);
|
|
122
|
QWidget::mousePressEvent(event);
|
|
123
|
}
|
|
123
|
}
|
|
124
|
|
|
124
|
|
|
125
|
void TimeWidget::mouseMoveEvent(QMouseEvent *event)
|
|
125
|
void TimeWidget::mouseMoveEvent(QMouseEvent *event)
|
|
126
|
{
|
|
126
|
{
|
|
127
|
if (!(event->buttons() & Qt::LeftButton)) {
|
|
127
|
if (!(event->buttons() & Qt::LeftButton)) {
|
|
128
|
return;
|
|
128
|
return;
|
|
129
|
}
|
|
129
|
}
|
|
130
|
|
|
130
|
|
|
131
|
if ((event->pos() - impl->m_DragStartPosition).manhattanLength()
|
|
131
|
if ((event->pos() - impl->m_DragStartPosition).manhattanLength()
|
|
132
|
< QApplication::startDragDistance()) {
|
|
132
|
< QApplication::startDragDistance()) {
|
|
133
|
return;
|
|
133
|
return;
|
|
134
|
}
|
|
134
|
}
|
|
135
|
|
|
135
|
|
|
136
|
// Note: The management of the drag object is done by Qt
|
|
136
|
// Note: The management of the drag object is done by Qt
|
|
137
|
auto drag = new QDrag{this};
|
|
137
|
auto drag = new QDrag{this};
|
|
138
|
|
|
138
|
|
|
139
|
auto mimeData = new QMimeData;
|
|
139
|
auto mimeData = new QMimeData;
|
|
140
|
auto timeData = TimeController::mimeDataForTimeRange(timeRange());
|
|
140
|
auto timeData = TimeController::mimeDataForTimeRange(timeRange());
|
|
141
|
mimeData->setData(MIME_TYPE_TIME_RANGE, timeData);
|
|
141
|
mimeData->setData(MIME_TYPE_TIME_RANGE, timeData);
|
|
142
|
|
|
142
|
|
|
143
|
drag->setMimeData(mimeData);
|
|
143
|
drag->setMimeData(mimeData);
|
|
144
|
|
|
144
|
|
|
145
|
auto pixmap = QPixmap(size());
|
|
145
|
auto pixmap = QPixmap{":/icones/time.png"};
|
|
146
|
render(&pixmap);
|
|
146
|
drag->setPixmap(pixmap.scaledToWidth(22));
|
|
147
|
drag->setPixmap(pixmap);
|
|
|
|
|
148
|
drag->setHotSpot(impl->m_DragStartPosition);
|
|
|
|
|
149
|
|
|
147
|
|
|
150
|
sqpApp->dragDropHelper().resetDragAndDrop();
|
|
148
|
sqpApp->dragDropHelper().resetDragAndDrop();
|
|
151
|
|
|
149
|
|
|
152
|
// Note: The exec() is blocking on windows but not on linux and macOS
|
|
150
|
// Note: The exec() is blocking on windows but not on linux and macOS
|
|
153
|
drag->exec(Qt::MoveAction | Qt::CopyAction);
|
|
151
|
drag->exec(Qt::MoveAction | Qt::CopyAction);
|
|
154
|
|
|
152
|
|
|
155
|
QWidget::mouseMoveEvent(event);
|
|
153
|
QWidget::mouseMoveEvent(event);
|
|
156
|
}
|
|
154
|
}
|