VisualizationGraphWidget.h
185 lines
| 7.3 KiB
| text/x-c
|
CLexer
r58 | #ifndef SCIQLOP_VISUALIZATIONGRAPHWIDGET_H | |||
#define SCIQLOP_VISUALIZATIONGRAPHWIDGET_H | ||||
r118 | #include "Visualization/IVisualizationWidget.h" | |||
r839 | #include "Visualization/VisualizationDragWidget.h" | |||
r118 | ||||
Alexandre Leroux
|
r219 | #include <QLoggingCategory> | ||
r1352 | #include <QUuid> | |||
r1420 | #include <QWidget> | |||
r58 | ||||
r118 | #include <memory> | |||
#include <Common/spimpl.h> | ||||
r1377 | #include <Data/DateTimeRange.h> | |||
Alexandre Leroux
|
r219 | Q_DECLARE_LOGGING_CATEGORY(LOG_VisualizationGraphWidget) | ||
Alexandre Leroux
|
r227 | class QCPRange; | ||
Alexandre Leroux
|
r725 | class QCustomPlot; | ||
r1420 | class Variable2; | |||
r1049 | class VisualizationWidget; | |||
r839 | class VisualizationZoneWidget; | |||
r1079 | class VisualizationSelectionZoneItem; | |||
r118 | ||||
r1420 | namespace Ui | |||
{ | ||||
r58 | class VisualizationGraphWidget; | |||
} // namespace Ui | ||||
Alexandre Leroux
|
r1271 | /// Defines options that can be associated with the graph | ||
r1420 | enum GraphFlag | |||
{ | ||||
DisableAll = 0x0, ///< Disables acquisition and synchronization | ||||
Alexandre Leroux
|
r1271 | EnableAcquisition = 0x1, ///< When this flag is set, the change of the graph's range leads to | ||
/// the acquisition of data | ||||
EnableSynchronization = 0x2, ///< When this flag is set, the change of the graph's range causes | ||||
/// the call to the synchronization of the graphs contained in the | ||||
/// same zone of this graph | ||||
EnableAll = ~DisableAll ///< Enables acquisition and synchronization | ||||
}; | ||||
Q_DECLARE_FLAGS(GraphFlags, GraphFlag) | ||||
Q_DECLARE_OPERATORS_FOR_FLAGS(GraphFlags) | ||||
r1420 | class VisualizationGraphWidget : public VisualizationDragWidget, public IVisualizationWidget | |||
{ | ||||
r58 | Q_OBJECT | |||
Alexandre Leroux
|
r730 | friend class QCustomPlotSynchronizer; | ||
Alexandre Leroux
|
r725 | friend class VisualizationGraphRenderingDelegate; | ||
r58 | public: | |||
r1420 | explicit VisualizationGraphWidget(const QString& name = {}, QWidget* parent = 0); | |||
r58 | virtual ~VisualizationGraphWidget(); | |||
r1049 | /// Returns the VisualizationZoneWidget which contains the graph or nullptr | |||
r1420 | VisualizationZoneWidget* parentZoneWidget() const noexcept; | |||
r839 | ||||
r1049 | /// Returns the main VisualizationWidget which contains the graph or nullptr | |||
r1420 | VisualizationWidget* parentVisualizationWidget() const; | |||
r1049 | ||||
Alexandre Leroux
|
r1271 | /// Sets graph options | ||
void setFlags(GraphFlags flags); | ||||
r444 | ||||
r1420 | void addVariable(std::shared_ptr<Variable2> variable, DateTimeRange range); | |||
r548 | ||||
Alexandre Leroux
|
r270 | /// Removes a variable from the graph | ||
r1420 | void removeVariable(std::shared_ptr<Variable2> variable) noexcept; | |||
r118 | ||||
r839 | /// Returns the list of all variables used in the graph | |||
r1420 | std::vector<std::shared_ptr<Variable2>> variables() const; | |||
r839 | ||||
Alexandre Leroux
|
r900 | /// Sets the y-axis range based on the data of a variable | ||
r1420 | void setYRange(std::shared_ptr<Variable2> variable); | |||
r1346 | DateTimeRange graphRange() const noexcept; | |||
r1420 | void setGraphRange(const DateTimeRange& range, bool updateVar = false, bool forward = false); | |||
r1292 | void setAutoRangeOnVariableInitialization(bool value); | |||
r437 | ||||
r1079 | // Zones | |||
r1048 | /// Returns the ranges of all the selection zones on the graph | |||
r1346 | QVector<DateTimeRange> selectionZoneRanges() const; | |||
r1048 | /// Adds new selection zones in the graph | |||
r1420 | void addSelectionZones(const QVector<DateTimeRange>& ranges); | |||
r1293 | /// Adds a new selection zone in the graph | |||
r1420 | VisualizationSelectionZoneItem* addSelectionZone( | |||
const QString& name, const DateTimeRange& range); | ||||
r1079 | /// Removes the specified selection zone | |||
r1420 | void removeSelectionZone(VisualizationSelectionZoneItem* selectionZone); | |||
r1048 | ||||
r1046 | /// Undo the last zoom done with a zoom box | |||
void undoZoom(); | ||||
r1420 | void zoom(double factor, int center, Qt::Orientation orientation, bool forward = true); | |||
void move(double factor, Qt::Orientation orientation, bool forward = true); | ||||
void move(double dx, double dy, bool forward = true); | ||||
void transform(const DateTimeRangeTransformation& tranformation, bool forward = true); | ||||
r1362 | ||||
r118 | // IVisualizationWidget interface | |||
r1420 | void accept(IVisualizationWidgetVisitor* visitor) override; | |||
bool canDrop(Variable2& variable) const override; | ||||
bool contains(Variable2& variable) const override; | ||||
Alexandre Leroux
|
r218 | QString name() const override; | ||
r118 | ||||
r839 | // VisualisationDragWidget | |||
r1420 | QMimeData* mimeData(const QPoint& position) const override; | |||
QPixmap customDragPixmap(const QPoint& dragPosition) override; | ||||
r839 | bool isDragAllowed() const override; | |||
r873 | void highlightForMerge(bool highlighted) override; | |||
r444 | ||||
r960 | // Cursors | |||
/// Adds or moves the vertical cursor at the specified value on the x-axis | ||||
void addVerticalCursor(double time); | ||||
/// Adds or moves the vertical cursor at the specified value on the x-axis | ||||
void addVerticalCursorAtViewportPosition(double position); | ||||
void removeVerticalCursor(); | ||||
/// Adds or moves the vertical cursor at the specified value on the y-axis | ||||
void addHorizontalCursor(double value); | ||||
/// Adds or moves the vertical cursor at the specified value on the y-axis | ||||
void addHorizontalCursorAtViewportPosition(double position); | ||||
void removeHorizontalCursor(); | ||||
r298 | signals: | |||
r1420 | void synchronize(const DateTimeRange& range, const DateTimeRange& oldRange); | |||
void changeRange(const std::shared_ptr<Variable2>& variable, const DateTimeRange& range); | ||||
r298 | ||||
Alexandre Leroux
|
r737 | /// Signal emitted when the variable is about to be removed from the graph | ||
r1420 | void variableAboutToBeRemoved(std::shared_ptr<Variable2> var); | |||
Alexandre Leroux
|
r737 | /// Signal emitted when the variable has been added to the graph | ||
r1420 | void variableAdded(std::shared_ptr<Variable2> var); | |||
r540 | ||||
r1373 | ||||
r1420 | void zoom_sig(double factor, int center, Qt::Orientation orientation, bool forward = true); | |||
void move_sig(double factor, Qt::Orientation orientation, bool forward = true); | ||||
void move_sig(double dx, double dy, bool forward = true); | ||||
void transform_sig(const DateTimeRangeTransformation& tranformation, bool forward = true); | ||||
void setrange_sig(const DateTimeRange& range, bool updateVar = false, bool forward = true); | ||||
r1373 | ||||
Alexandre Leroux
|
r728 | protected: | ||
r1420 | void closeEvent(QCloseEvent* event) override; | |||
void enterEvent(QEvent* event) override; | ||||
void leaveEvent(QEvent* event) override; | ||||
void wheelEvent(QWheelEvent* event) override; | ||||
void mouseMoveEvent(QMouseEvent* event) override; | ||||
void mouseReleaseEvent(QMouseEvent* event) override; | ||||
void mousePressEvent(QMouseEvent* event) override; | ||||
void mouseDoubleClickEvent(QMouseEvent* event) override; | ||||
void keyReleaseEvent(QKeyEvent* event) override; | ||||
void keyPressEvent(QKeyEvent* event) override; | ||||
QCustomPlot& plot() const noexcept; | ||||
Alexandre Leroux
|
r725 | |||
r58 | private: | |||
r1420 | Ui::VisualizationGraphWidget* ui; | |||
r118 | ||||
class VisualizationGraphWidgetPrivate; | ||||
spimpl::unique_impl_ptr<VisualizationGraphWidgetPrivate> impl; | ||||
r1364 | ||||
Alexandre Leroux
|
r179 | private slots: | ||
Alexandre Leroux
|
r269 | /// Slot called when right clicking on the graph (displays a menu) | ||
r1420 | void onGraphMenuRequested(const QPoint& pos) noexcept; | |||
Alexandre Leroux
|
r227 | |||
r444 | /// Rescale the X axe to range parameter | |||
r1420 | // void onRangeChanged(const QCPRange &newRange, const QCPRange &oldRange); | |||
Alexandre Leroux
|
r227 | |||
Alexandre Leroux
|
r1002 | /// Slot called when a mouse double click was made | ||
r1420 | void onMouseDoubleClick(QMouseEvent* event) noexcept; | |||
Alexandre Leroux
|
r481 | /// Slot called when a mouse move was made | ||
r1420 | void onMouseMove(QMouseEvent* event) noexcept; | |||
Alexandre Leroux
|
r179 | /// Slot called when a mouse wheel was made, to perform some processing before the zoom is done | ||
r1420 | void onMouseWheel(QWheelEvent* event) noexcept; | |||
r445 | /// Slot called when a mouse press was made, to activate the calibration of a graph | |||
r1420 | void onMousePress(QMouseEvent* event) noexcept; | |||
r445 | /// Slot called when a mouse release was made, to deactivate the calibration of a graph | |||
r1420 | void onMouseRelease(QMouseEvent* event) noexcept; | |||
r235 | ||||
void onDataCacheVariableUpdated(); | ||||
r571 | ||||
r1420 | void onUpdateVarDisplaying(std::shared_ptr<Variable2> variable, const DateTimeRange& range); | |||
r1352 | ||||
void variableUpdated(QUuid id); | ||||
r1420 | void variableDeleted(const std::shared_ptr<Variable2>&); | |||
r58 | }; | |||
#endif // SCIQLOP_VISUALIZATIONGRAPHWIDGET_H | ||||