From baf8c7fca294f7d6d849d68f8c9cab2b236ad863 2017-11-17 08:17:24 From: leroux Date: 2017-11-17 08:17:24 Subject: [PATCH] Merge pull request #341 from SciQLop-fork develop Develop --- diff --git a/core/include/Variable/VariableController.h b/core/include/Variable/VariableController.h index 984e738..66aab49 100644 --- a/core/include/Variable/VariableController.h +++ b/core/include/Variable/VariableController.h @@ -102,6 +102,9 @@ public slots: /// Update the temporal parameters of every selected variable to dateTime void onDateTimeOnSelection(const SqpRange &dateTime); + /// Update the temporal parameters of the specified variable + void onUpdateDateTime(std::shared_ptr variable, const SqpRange &dateTime); + void onDataProvided(QUuid vIdentifier, const SqpRange &rangeRequested, const SqpRange &cacheRangeRequested, diff --git a/core/include/Variable/VariableModel.h b/core/include/Variable/VariableModel.h index f3928f8..ea0bdca 100644 --- a/core/include/Variable/VariableModel.h +++ b/core/include/Variable/VariableModel.h @@ -94,6 +94,7 @@ public: signals: void abortProgessRequested(std::shared_ptr variable); void requestVariable(const QVariantHash &productData); + void requestVariableRangeUpdate(std::shared_ptr variable, const SqpRange &range); private: class VariableModelPrivate; diff --git a/core/src/Variable/VariableController.cpp b/core/src/Variable/VariableController.cpp index 0a6fbb1..848d1f2 100644 --- a/core/src/Variable/VariableController.cpp +++ b/core/src/Variable/VariableController.cpp @@ -187,6 +187,8 @@ VariableController::VariableController(QObject *parent) connect(&impl->m_VariableAcquisitionWorkerThread, &QThread::finished, impl->m_VariableAcquisitionWorker.get(), &VariableAcquisitionWorker::finalize); + connect(impl->m_VariableModel, &VariableModel::requestVariableRangeUpdate, this, + &VariableController::onUpdateDateTime); impl->m_VariableAcquisitionWorkerThread.start(); } @@ -385,21 +387,7 @@ void VariableController::onDateTimeOnSelection(const SqpRange &dateTime) if (auto selectedVariable = impl->m_VariableModel->variable(qAsConst(selectedRows).first().row())) { - auto itVar = impl->m_VariableToIdentifierMap.find(selectedVariable); - if (itVar == impl->m_VariableToIdentifierMap.cend()) { - qCCritical(LOG_VariableController()) - << tr("Impossible to onDateTimeOnSelection request for unknown variable"); - return; - } - - // notify that rescale operation has to be done - emit rangeChanged(selectedVariable, dateTime); - - auto synchro = impl->m_VariableIdGroupIdMap.find(itVar->second) - != impl->m_VariableIdGroupIdMap.cend(); - - this->onRequestDataLoading(QVector >{selectedVariable}, - dateTime, synchro); + onUpdateDateTime(selectedVariable, dateTime); } } else if (selectedRows.size() > 1) { @@ -412,6 +400,25 @@ void VariableController::onDateTimeOnSelection(const SqpRange &dateTime) } } +void VariableController::onUpdateDateTime(std::shared_ptr variable, + const SqpRange &dateTime) +{ + auto itVar = impl->m_VariableToIdentifierMap.find(variable); + if (itVar == impl->m_VariableToIdentifierMap.cend()) { + qCCritical(LOG_VariableController()) + << tr("Impossible to onDateTimeOnSelection request for unknown variable"); + return; + } + + // notify that rescale operation has to be done + emit rangeChanged(variable, dateTime); + + auto synchro + = impl->m_VariableIdGroupIdMap.find(itVar->second) != impl->m_VariableIdGroupIdMap.cend(); + + this->onRequestDataLoading(QVector >{variable}, dateTime, synchro); +} + void VariableController::onDataProvided(QUuid vIdentifier, const SqpRange &rangeRequested, const SqpRange &cacheRangeRequested, QVector dataAcquired) diff --git a/core/src/Variable/VariableModel.cpp b/core/src/Variable/VariableModel.cpp index f85f179..9c91f18 100644 --- a/core/src/Variable/VariableModel.cpp +++ b/core/src/Variable/VariableModel.cpp @@ -13,6 +13,7 @@ #include #include +#include #include Q_LOGGING_CATEGORY(LOG_VariableModel, "VariableModel") @@ -322,7 +323,9 @@ bool VariableModel::canDropMimeData(const QMimeData *data, Qt::DropAction action int column, const QModelIndex &parent) const { // drop of a product - return data->hasFormat(MIME_TYPE_PRODUCT_LIST); + return data->hasFormat(MIME_TYPE_PRODUCT_LIST) + || (data->hasFormat(MIME_TYPE_TIME_RANGE) && parent.isValid() + && !data->hasFormat(MIME_TYPE_VARIABLE_LIST)); } bool VariableModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, @@ -341,6 +344,14 @@ bool VariableModel::dropMimeData(const QMimeData *data, Qt::DropAction action, i dropDone = true; } + else if (data->hasFormat(MIME_TYPE_TIME_RANGE) && parent.isValid()) { + auto variable = this->variable(parent.row()); + auto range = TimeController::timeRangeForMimeData(data->data(MIME_TYPE_TIME_RANGE)); + + emit requestVariableRangeUpdate(variable, range); + + dropDone = true; + } return dropDone; } diff --git a/gui/include/Visualization/MacScrollBarStyle.h b/gui/include/Visualization/MacScrollBarStyle.h index 9ddebc3..abcb8df 100644 --- a/gui/include/Visualization/MacScrollBarStyle.h +++ b/gui/include/Visualization/MacScrollBarStyle.h @@ -10,7 +10,7 @@ class MacScrollBarStyle : public QProxyStyle { public: int styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget, - QStyleHintReturn *returnData) const; + QStyleHintReturn *returnData) const override; void selfInstallOn(QWidget *widget, bool installOnSubWidgets); }; diff --git a/gui/include/Visualization/VisualizationDragDropContainer.h b/gui/include/Visualization/VisualizationDragDropContainer.h index d100bff..68a4aff 100644 --- a/gui/include/Visualization/VisualizationDragDropContainer.h +++ b/gui/include/Visualization/VisualizationDragDropContainer.h @@ -23,7 +23,7 @@ signals: void dropOccuredOnWidget(VisualizationDragWidget *dragWidget, const QMimeData *mimeData); public: - enum class DropBehavior { Inserted, Merged, InsertedAndMerged }; + enum class DropBehavior { Inserted, Merged, InsertedAndMerged, Forbidden }; using AcceptMimeDataFunction = std::function; VisualizationDragDropContainer(QWidget *parent = nullptr); @@ -31,7 +31,7 @@ public: void addDragWidget(VisualizationDragWidget *dragWidget); void insertDragWidget(int index, VisualizationDragWidget *dragWidget); - void addAcceptedMimeType(const QString &mimeType, DropBehavior behavior); + void setMimeType(const QString &mimeType, DropBehavior behavior); int countDragWidget() const; diff --git a/gui/resources/icones/time.png b/gui/resources/icones/time.png new file mode 100644 index 0000000000000000000000000000000000000000..9fc37044330025630250fcd2ce3184d6216aea15 GIT binary patch literal 3014 zc$@*o3pwxySkqkNC3K%d3 zm<`MVrUO%ek&fzm3wRmW2E0&`1CHuy(g!WTLg1&stH>|Xr|bfL0$fAy7o~|YLx9D= zD&RQ&JH0RI0v-Yu0fU`bqQRI5+zA}Sf9FP(H-Qzv1aqr20P}&T@!yFSQUIO=t~9k! z2FU?SfWP9u(_G1R;Imc+%My!#9r*8{q+}~_wTb0Y&SYRC{yW5%JPCYMZN(Ha0$2(3 z;J*`m%W2>aV7SVnDPjTeI{pnGn(QIt6UE`c&+%{Qkfi|Jjcj&himAw6x^DxgMP5SY zN10$La>(M_sA-dvz!zfJI~WEb`}MvJnRdAg$VarjcSa&h9N)&viadd=oXl}?96TC$ z3Yg}g>?j-uc2~)Mu}(IoTP?*SeLCMDCXSbQ7_S~-Jz zd+b8u9KA9U_osM0$fve5p*C4C0k|Lcj<5|!tAlzNg!`r5v%n{kYLEjiMFK}%+Gs7F z_6b~W@*D)doLp0!k^^o+mT#`?bys4oDY4W@@mjJ5INwlLtv*&W*HI#U~RvX$RyM$!*O$}_ZskNM>>b*03a7wT*O4YgyW^Li}U== z$dxTugy;YOZAfgOwLR~4rSJj=%5K2@GA2|909i&`$3zx@dDe=)5BpEnD&)qGYeIGa z5F4yE(6dtZ0K+VmTxqP}Dw4aH8oC33*uvTg?yypBGPcpX8%XAtUnUI>0AiEh8|Yh> z)4(Mbidl|Pn@N7_GA#}OGAFQ{7_QeUw8&7Iy~t)r(xk}&KvoC)6#7=ng1Cz0usi5^ z2l!N6MU zMBkP-86bPvVuMP02rF(qD-LimHeZ2-m4#LZ6Iz57tw!z$G_hqb@TfsKefDt+Z~~oo zy^GwV3yG|J0YK(e+RG=$=p&=)LS?~4DlqHm5p$%O-{s*$JtSKbPyZ&)-;Q&SChjSZ#hlLh&Z8!t^Tc{xh zfmGtk0m|ZYSTJ#bBg#S=aR{g-K86ML5RgYdlWbM~eOBtR9b07onwKzo+pn#IUO%?GZBg)z#%Kb%K4f;5Ew`t^F` zM$LDTB-csfa#+yX{!kvt0IIJ83KG0{e@VKXf}~@$ox%H|Fs}VoU{#@8nY20@F663 zu`efxJ0wjrsQaRFVgFSYbW6-egv908rN*mQjv)>hhvf!!pXE7aVQXVHA~XgeNiC0( zj01c{p{w@AwsS6)Xw$)Wm5i4aE<`S1x_k*#bFpJE`nk)>$^x%5XwYSf28GHD+&t@Y z3d#8sm$?QyEU7H875$q4_bD0_GCAZ^ZTarsx0O0QV4%YXs|($%Ebtg%Jm&0*^MRkC z&(yU8-EcV^xs9dKVP~y^f21t5h`gembuK0Tq`3!KzG=8IX5E!i^QBRX1kvgjDpJH! z-~iF=WAToUMUtqiY85;beRNO({bkcM(Te<<>Iti}c*$!D`jyF1`ibMbM_G6g*;Q*a zCINq-{~yL&gL;0|PaXBjgZ))7%bgledkiYE zXmDB?fgC-*gV^E#aGpWA52Ejv0}PNX8sK{d6`dj72SgT3KqkdY2KpcCU>Y`wqJLOV zWu4e;fj&<rm94VBqS^D0??w4x97t`w6{y$;}{ zp;8+OKdFQdhGIAIE+Usz*<*xIx}j7^_At>;kS(*fmuQ0ltN8v~gOc8~6d)&al=e9l&Gw?*w1+ zTN*c;$~jyGJd6JhNlG>WSDIKZV_bnm3j6LLSF#0IXlAVpGacDZ&cceJfP}eSZfcjTV z1U3LqBNN#kkGe!AjSf)FNMwAS2Yd$ELTz_cR~PUyunkF`u?aZnsIElFf&+Z#MLyNtB{_u*F-MShl-@vYE$u^|nfrH=jYxw3199aRqNb?f2LJ#707*qo IM6N<$g5ZmaTmS$7 literal 0 Hc$@icones/previous.png icones/unplot.png icones/up.png + icones/time.png diff --git a/gui/src/TimeWidget/TimeWidget.cpp b/gui/src/TimeWidget/TimeWidget.cpp index 050eae3..d3939b0 100644 --- a/gui/src/TimeWidget/TimeWidget.cpp +++ b/gui/src/TimeWidget/TimeWidget.cpp @@ -94,7 +94,7 @@ void TimeWidget::dragEnterEvent(QDragEnterEvent *event) void TimeWidget::dragLeaveEvent(QDragLeaveEvent *event) { - setStyleSheet(QString()); + setStyleSheet(QString{}); } void TimeWidget::dropEvent(QDropEvent *event) @@ -109,7 +109,7 @@ void TimeWidget::dropEvent(QDropEvent *event) event->ignore(); } - setStyleSheet(QString()); + setStyleSheet(QString{}); } @@ -142,10 +142,8 @@ void TimeWidget::mouseMoveEvent(QMouseEvent *event) drag->setMimeData(mimeData); - auto pixmap = QPixmap(size()); - render(&pixmap); - drag->setPixmap(pixmap); - drag->setHotSpot(impl->m_DragStartPosition); + auto pixmap = QPixmap{":/icones/time.png"}; + drag->setPixmap(pixmap.scaledToWidth(22)); sqpApp->dragDropHelper().resetDragAndDrop(); diff --git a/gui/src/Visualization/VisualizationDragDropContainer.cpp b/gui/src/Visualization/VisualizationDragDropContainer.cpp index e8136ba..df5b3f0 100644 --- a/gui/src/Visualization/VisualizationDragDropContainer.cpp +++ b/gui/src/Visualization/VisualizationDragDropContainer.cpp @@ -14,6 +14,8 @@ Q_LOGGING_CATEGORY(LOG_VisualizationDragDropContainer, "VisualizationDragDropContainer") +auto DRAGGED_MINIATURE_WIDTH = 200; // in pixels + struct VisualizationDragDropContainer::VisualizationDragDropContainerPrivate { QVBoxLayout *m_Layout; @@ -34,18 +36,33 @@ struct VisualizationDragDropContainer::VisualizationDragDropContainerPrivate { bool acceptMimeData(const QMimeData *data) const { - for (const auto &type : m_AcceptedMimeTypes.keys()) { - if (data->hasFormat(type) && m_AcceptMimeDataFun(data)) { - return true; + auto accepted = false; + for (auto it = m_AcceptedMimeTypes.constBegin(); it != m_AcceptedMimeTypes.constEnd(); + ++it) { + const auto &type = it.key(); + const auto &behavior = it.value(); + + if (data->hasFormat(type)) { + if (behavior != DropBehavior::Forbidden) { + accepted = true; + } + else { + accepted = false; + break; + } } } - return false; + if (accepted) { + accepted = m_AcceptMimeDataFun(data); + } + + return accepted; } bool allowMergeForMimeData(const QMimeData *data) const { - bool result = false; + auto result = false; for (auto it = m_AcceptedMimeTypes.constBegin(); it != m_AcceptedMimeTypes.constEnd(); ++it) { @@ -106,7 +123,9 @@ struct VisualizationDragDropContainer::VisualizationDragDropContainerPrivate { bool cursorIsInContainer(QWidget *container) const { - return container->isAncestorOf(sqpApp->widgetAt(QCursor::pos())); + auto widgetUnderMouse = sqpApp->widgetAt(QCursor::pos()); + return container->isAncestorOf(widgetUnderMouse) && widgetUnderMouse != container + && sqpApp->dragDropHelper().placeHolder().isAncestorOf(widgetUnderMouse); } int countDragWidget(const QWidget *parent, bool onlyVisible = false) const @@ -151,7 +170,7 @@ void VisualizationDragDropContainer::insertDragWidget(int index, &VisualizationDragDropContainer::startDrag); } -void VisualizationDragDropContainer::addAcceptedMimeType( +void VisualizationDragDropContainer::setMimeType( const QString &mimeType, VisualizationDragDropContainer::DropBehavior behavior) { impl->m_AcceptedMimeTypes[mimeType] = behavior; @@ -183,14 +202,14 @@ void VisualizationDragDropContainer::startDrag(VisualizationDragWidget *dragWidg // Note: The management of the drag object is done by Qt auto drag = new QDrag{dragWidget}; - drag->setHotSpot(dragPosition); auto mimeData = dragWidget->mimeData(); drag->setMimeData(mimeData); auto pixmap = QPixmap(dragWidget->size()); dragWidget->render(&pixmap); - drag->setPixmap(pixmap); + drag->setPixmap(pixmap.scaled(DRAGGED_MINIATURE_WIDTH, DRAGGED_MINIATURE_WIDTH, + Qt::KeepAspectRatio, Qt::SmoothTransformation)); auto image = pixmap.toImage(); mimeData->setImageData(image); @@ -374,7 +393,7 @@ void VisualizationDragDropContainer::VisualizationDragDropContainerPrivate::find auto &helper = sqpApp->dragDropHelper(); auto absPos = container->mapToGlobal(pos); - auto isOnPlaceHolder = sqpApp->widgetAt(absPos) == &(helper.placeHolder()); + auto isOnPlaceHolder = helper.placeHolder().isAncestorOf(sqpApp->widgetAt(absPos)); if (countDragWidget(container, true) == 0) { // Drop on an empty container, just add the placeHolder at the top diff --git a/gui/src/Visualization/VisualizationTabWidget.cpp b/gui/src/Visualization/VisualizationTabWidget.cpp index 136412e..0269164 100644 --- a/gui/src/Visualization/VisualizationTabWidget.cpp +++ b/gui/src/Visualization/VisualizationTabWidget.cpp @@ -79,13 +79,14 @@ VisualizationTabWidget::VisualizationTabWidget(const QString &name, QWidget *par #endif ui->dragDropContainer->setPlaceHolderType(DragDropHelper::PlaceHolderType::Zone, "Zone"); - ui->dragDropContainer->layout()->setContentsMargins(0, 0, 0, 5); - ui->dragDropContainer->addAcceptedMimeType( - MIME_TYPE_GRAPH, VisualizationDragDropContainer::DropBehavior::Inserted); - ui->dragDropContainer->addAcceptedMimeType( - MIME_TYPE_ZONE, VisualizationDragDropContainer::DropBehavior::Inserted); - ui->dragDropContainer->addAcceptedMimeType( - MIME_TYPE_VARIABLE_LIST, VisualizationDragDropContainer::DropBehavior::Inserted); + ui->dragDropContainer->layout()->setContentsMargins(0, 0, 0, 12); + ui->dragDropContainer->layout()->setSpacing(0); + ui->dragDropContainer->setMimeType(MIME_TYPE_GRAPH, + VisualizationDragDropContainer::DropBehavior::Inserted); + ui->dragDropContainer->setMimeType(MIME_TYPE_ZONE, + VisualizationDragDropContainer::DropBehavior::Inserted); + ui->dragDropContainer->setMimeType(MIME_TYPE_VARIABLE_LIST, + VisualizationDragDropContainer::DropBehavior::Inserted); ui->dragDropContainer->setAcceptMimeDataFunction([this](auto mimeData) { return sqpApp->dragDropHelper().checkMimeDataForVisualization(mimeData, diff --git a/gui/src/Visualization/VisualizationZoneWidget.cpp b/gui/src/Visualization/VisualizationZoneWidget.cpp index f32c34d..3a52978 100644 --- a/gui/src/Visualization/VisualizationZoneWidget.cpp +++ b/gui/src/Visualization/VisualizationZoneWidget.cpp @@ -102,12 +102,14 @@ VisualizationZoneWidget::VisualizationZoneWidget(const QString &name, QWidget *p ui->zoneNameLabel->setText(name); ui->dragDropContainer->setPlaceHolderType(DragDropHelper::PlaceHolderType::Graph); - ui->dragDropContainer->addAcceptedMimeType( - MIME_TYPE_GRAPH, VisualizationDragDropContainer::DropBehavior::Inserted); - ui->dragDropContainer->addAcceptedMimeType( + ui->dragDropContainer->setMimeType(MIME_TYPE_GRAPH, + VisualizationDragDropContainer::DropBehavior::Inserted); + ui->dragDropContainer->setMimeType( MIME_TYPE_VARIABLE_LIST, VisualizationDragDropContainer::DropBehavior::InsertedAndMerged); - ui->dragDropContainer->addAcceptedMimeType( - MIME_TYPE_TIME_RANGE, VisualizationDragDropContainer::DropBehavior::Merged); + ui->dragDropContainer->setMimeType(MIME_TYPE_TIME_RANGE, + VisualizationDragDropContainer::DropBehavior::Merged); + ui->dragDropContainer->setMimeType(MIME_TYPE_ZONE, + VisualizationDragDropContainer::DropBehavior::Forbidden); ui->dragDropContainer->setAcceptMimeDataFunction([this](auto mimeData) { return sqpApp->dragDropHelper().checkMimeDataForVisualization(mimeData, ui->dragDropContainer); @@ -332,6 +334,11 @@ QMimeData *VisualizationZoneWidget::mimeData() const auto mimeData = new QMimeData; mimeData->setData(MIME_TYPE_ZONE, QByteArray{}); + if (auto firstGraph = impl->firstGraph(this)) { + auto timeRangeData = TimeController::mimeDataForTimeRange(firstGraph->graphRange()); + mimeData->setData(MIME_TYPE_TIME_RANGE, timeRangeData); + } + return mimeData; } diff --git a/gui/ui/Visualization/VisualizationZoneWidget.ui b/gui/ui/Visualization/VisualizationZoneWidget.ui index 4cd71e7..241a376 100644 --- a/gui/ui/Visualization/VisualizationZoneWidget.ui +++ b/gui/ui/Visualization/VisualizationZoneWidget.ui @@ -27,7 +27,7 @@ 0 - 0 + 6