TimeWidget.cpp
156 lines
| 4.0 KiB
| text/x-c
|
CppLexer
r134 | #include "TimeWidget/TimeWidget.h" | |||
#include "ui_TimeWidget.h" | ||||
|
r489 | #include <Common/DateUtils.h> | ||
r884 | #include <Common/MimeTypesDef.h> | |||
r890 | #include <DragAndDrop/DragDropHelper.h> | |||
r302 | #include <SqpApplication.h> | |||
#include <Time/TimeController.h> | ||||
r192 | ||||
r885 | #include <QDrag> | |||
r884 | #include <QDragEnterEvent> | |||
#include <QDropEvent> | ||||
#include <QMimeData> | ||||
r885 | ||||
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 | ||||
|
r970 | auto endDateTime = QDateTime{QDate{2012, 12, 11}, QTime{0, 0}, Qt::UTC}; | ||
auto startDateTime = QDateTime{QDate{2012, 12, 10}, QTime{0, 0}, Qt::UTC}; // one hour before | ||||
|
r489 | |||
ui->startDateTimeEdit->setDateTime(startDateTime); | ||||
ui->endDateTimeEdit->setDateTime(endDateTime); | ||||
r512 | auto dateTime = SqpRange{DateUtils::secondsSinceEpoch(startDateTime), | |||
DateUtils::secondsSinceEpoch(endDateTime)}; | ||||
r304 | ||||
sqpApp->timeController().onTimeToUpdate(dateTime); | ||||
r134 | } | |||
r302 | ||||
r134 | TimeWidget::~TimeWidget() | |||
{ | ||||
delete ui; | ||||
} | ||||
r192 | ||||
r884 | void TimeWidget::setTimeRange(SqpRange time) | |||
{ | ||||
auto startDateTime = DateUtils::dateTime(time.m_TStart); | ||||
auto endDateTime = DateUtils::dateTime(time.m_TEnd); | ||||
ui->startDateTimeEdit->setDateTime(startDateTime); | ||||
ui->endDateTimeEdit->setDateTime(endDateTime); | ||||
} | ||||
r885 | SqpRange TimeWidget::timeRange() const | |||
r192 | { | |||
r885 | return SqpRange{DateUtils::secondsSinceEpoch(ui->startDateTimeEdit->dateTime()), | |||
DateUtils::secondsSinceEpoch(ui->endDateTimeEdit->dateTime())}; | ||||
} | ||||
r192 | ||||
r885 | void TimeWidget::onTimeUpdateRequested() | |||
{ | ||||
auto dateTime = timeRange(); | ||||
r192 | emit timeUpdated(std::move(dateTime)); | |||
} | ||||
r884 | ||||
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) | ||||
{ | ||||
setStyleSheet(QString()); | ||||
} | ||||
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(); | ||||
} | ||||
setStyleSheet(QString()); | ||||
} | ||||
r885 | ||||
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); | ||||
auto pixmap = QPixmap(size()); | ||||
render(&pixmap); | ||||
drag->setPixmap(pixmap); | ||||
drag->setHotSpot(impl->m_DragStartPosition); | ||||
sqpApp->dragDropHelper().resetDragAndDrop(); | ||||
// Note: The exec() is blocking on windows but not on linux and macOS | ||||
drag->exec(Qt::MoveAction | Qt::CopyAction); | ||||
QWidget::mouseMoveEvent(event); | ||||
} | ||||