TimeWidget.cpp
156 lines
| 4.1 KiB
| text/x-c
|
CppLexer
r134 | #include "TimeWidget/TimeWidget.h" | |||
#include "ui_TimeWidget.h" | ||||
Alexandre Leroux
|
r489 | #include <Common/DateUtils.h> | ||
r878 | #include <Common/MimeTypesDef.h> | |||
r1075 | #include <DragAndDrop/DragDropGuiController.h> | |||
r302 | #include <SqpApplication.h> | |||
#include <Time/TimeController.h> | ||||
r192 | ||||
r879 | #include <QDrag> | |||
r878 | #include <QDragEnterEvent> | |||
#include <QDropEvent> | ||||
#include <QMimeData> | ||||
r1347 | #include <QStyle> | |||
r878 | ||||
r879 | ||||
struct TimeWidget::TimeWidgetPrivate { | ||||
explicit TimeWidgetPrivate() {} | ||||
QPoint m_DragStartPosition; | ||||
}; | ||||
TimeWidget::TimeWidget(QWidget *parent) | ||||
: QWidget{parent}, | ||||
ui{new Ui::TimeWidget}, | ||||
impl{spimpl::make_unique_impl<TimeWidgetPrivate>()} | ||||
r134 | { | |||
ui->setupUi(this); | ||||
r192 | ||||
r302 | ui->applyToolButton->setIcon(sqpApp->style()->standardIcon(QStyle::SP_DialogApplyButton)); | |||
r192 | // Connection | |||
connect(ui->startDateTimeEdit, &QDateTimeEdit::dateTimeChanged, this, | ||||
&TimeWidget::onTimeUpdateRequested); | ||||
connect(ui->endDateTimeEdit, &QDateTimeEdit::dateTimeChanged, this, | ||||
&TimeWidget::onTimeUpdateRequested); | ||||
r302 | ||||
connect(ui->applyToolButton, &QToolButton::clicked, &sqpApp->timeController(), | ||||
&TimeController::onTimeNotify); | ||||
r304 | ||||
// Initialisation | ||||
Alexandre Leroux
|
r489 | auto endDateTime = QDateTime::currentDateTimeUtc(); | ||
auto startDateTime = endDateTime.addSecs(-3600); // one hour before | ||||
ui->startDateTimeEdit->setDateTime(startDateTime); | ||||
ui->endDateTimeEdit->setDateTime(endDateTime); | ||||
r1346 | auto dateTime = DateTimeRange{DateUtils::secondsSinceEpoch(startDateTime), | |||
r512 | DateUtils::secondsSinceEpoch(endDateTime)}; | |||
r304 | ||||
r1345 | sqpApp->timeController().setDateTimeRange(dateTime); | |||
r134 | } | |||
r302 | ||||
r134 | TimeWidget::~TimeWidget() | |||
{ | ||||
delete ui; | ||||
} | ||||
r192 | ||||
r1346 | void TimeWidget::setTimeRange(DateTimeRange time) | |||
r878 | { | |||
auto startDateTime = DateUtils::dateTime(time.m_TStart); | ||||
auto endDateTime = DateUtils::dateTime(time.m_TEnd); | ||||
ui->startDateTimeEdit->setDateTime(startDateTime); | ||||
ui->endDateTimeEdit->setDateTime(endDateTime); | ||||
} | ||||
r1346 | DateTimeRange TimeWidget::timeRange() const | |||
r192 | { | |||
r1346 | return DateTimeRange{DateUtils::secondsSinceEpoch(ui->startDateTimeEdit->dateTime()), | |||
r879 | DateUtils::secondsSinceEpoch(ui->endDateTimeEdit->dateTime())}; | |||
} | ||||
r192 | ||||
r879 | void TimeWidget::onTimeUpdateRequested() | |||
{ | ||||
auto dateTime = timeRange(); | ||||
r192 | emit timeUpdated(std::move(dateTime)); | |||
r1351 | sqpApp->timeController().setDateTimeRange(dateTime); | |||
r192 | } | |||
r878 | ||||
void TimeWidget::dragEnterEvent(QDragEnterEvent *event) | ||||
{ | ||||
if (event->mimeData()->hasFormat(MIME_TYPE_TIME_RANGE)) { | ||||
event->acceptProposedAction(); | ||||
setStyleSheet("QDateTimeEdit{background-color: #BBD5EE; border:2px solid #2A7FD4}"); | ||||
} | ||||
else { | ||||
event->ignore(); | ||||
} | ||||
} | ||||
void TimeWidget::dragLeaveEvent(QDragLeaveEvent *event) | ||||
{ | ||||
r939 | setStyleSheet(QString{}); | |||
r878 | } | |||
void TimeWidget::dropEvent(QDropEvent *event) | ||||
{ | ||||
if (event->mimeData()->hasFormat(MIME_TYPE_TIME_RANGE)) { | ||||
auto mimeData = event->mimeData()->data(MIME_TYPE_TIME_RANGE); | ||||
auto timeRange = TimeController::timeRangeForMimeData(mimeData); | ||||
setTimeRange(timeRange); | ||||
} | ||||
else { | ||||
event->ignore(); | ||||
} | ||||
r939 | setStyleSheet(QString{}); | |||
r878 | } | |||
r879 | ||||
void TimeWidget::mousePressEvent(QMouseEvent *event) | ||||
{ | ||||
if (event->button() == Qt::LeftButton) { | ||||
impl->m_DragStartPosition = event->pos(); | ||||
} | ||||
QWidget::mousePressEvent(event); | ||||
} | ||||
void TimeWidget::mouseMoveEvent(QMouseEvent *event) | ||||
{ | ||||
if (!(event->buttons() & Qt::LeftButton)) { | ||||
return; | ||||
} | ||||
if ((event->pos() - impl->m_DragStartPosition).manhattanLength() | ||||
< QApplication::startDragDistance()) { | ||||
return; | ||||
} | ||||
// Note: The management of the drag object is done by Qt | ||||
auto drag = new QDrag{this}; | ||||
auto mimeData = new QMimeData; | ||||
auto timeData = TimeController::mimeDataForTimeRange(timeRange()); | ||||
mimeData->setData(MIME_TYPE_TIME_RANGE, timeData); | ||||
drag->setMimeData(mimeData); | ||||
r935 | auto pixmap = QPixmap{":/icones/time.png"}; | |||
drag->setPixmap(pixmap.scaledToWidth(22)); | ||||
r879 | ||||
r1075 | sqpApp->dragDropGuiController().resetDragAndDrop(); | |||
r879 | ||||
// Note: The exec() is blocking on windows but not on linux and macOS | ||||
drag->exec(Qt::MoveAction | Qt::CopyAction); | ||||
QWidget::mouseMoveEvent(event); | ||||
} | ||||