/** * @RDE_HEADER@ * MVC view (QTreeView) - shows items (rows), events, date-time lines and more * $Id: TimelineView.h 49755 2020-02-04 08:44:47Z ehrlicher $ * $HeadURL: svn://192.168.133.21/TDS/branches/product/features/hotline/Lts/Common/LtsTimelineClassic/TimelineView.h $ * $Author: ehrlicher $ * Created by Mike Wille, SLSE, 2014-10-01 */ #pragma once #include "timeline_view_drag_handler.h" #include "timeline_view_resize_handler.h" #include "timeline_view_selection_handler.h" #include "timeline_view_track_handler.h" #include "timeline_header_view.h" #include "timeline_model.h" #include #include #include #include class QAbstractProxyModel; namespace LtsTimeline { class TimelineViewDragHandler; class TimelineViewResizeHandler; class TimelineViewSelectHandler; class TimelineViewTrackHandler; class TimelineWidget; class LTSTIMELINE_EXPORT TimelineView : public QTreeView { Q_OBJECT friend class ItemDelegate; friend class TimelineHeaderView; friend class TimelineViewDragHandler; friend class TimelineViewResizeHandler; friend class TimelineViewSelectHandler; friend class TimelineViewTrackHandler; friend class TimelineWidget; public: static const int s_textHeight; /** * @brief creates a specialized QTreeView * @param parent parent of this widget */ explicit TimelineView(QWidget *parent = nullptr); TimelineHeaderView *header() { return m_header; } void setHeader(QHeaderView *header); QAbstractItemModel *model() { return m_model; } TimelineModel *timelineModel() { return m_timelineModel; } void setModel(QAbstractItemModel *model) override; QAbstractProxyModel *proxyModel() { return m_proxyModel; } void setProxyModel(QAbstractProxyModel *proxy) noexcept(false); void setItemDelegate(QAbstractItemDelegate *delegate); ItemDelegate *itemDelegate() const { return m_delegate; } ZoomFactor zoomFactor() const { return m_zoomFactor; } /* NOTE: Do NOT call this function unless you know what you are doing! * Call setZoomFactor from TimelineWidget instead. That way, the zoom combo box is populated correctly BEFORE the zoom * factor is set. */ void setZoomFactor(ZoomFactor zoomFactor); ZoomFactor minimumZoomFactor() const { return m_minZoomFactor; } void setMinimumZoomFactor(ZoomFactor zoomFactor); ZoomFactor maximumZoomFactor() const { return m_maxZoomFactor; } void setMaximumZoomFactor(ZoomFactor zoomFactor); ZoomFactor upperZoomFactor() const { return m_upperZoomFactor; } qint64 startTime() const { return m_startTime; } void setStartTime(qint64 time); qint64 currentTime() const { return m_currentTime; } void setCurrentTime(qint64 time); qint64 endTime() const { return m_startTime + m_duration; } void setEndTime(qint64 time); int duration() const { return m_duration; } void setDuration(int duration); void setRange(qint64 start, qint64 end); bool isCursorTextVisible() const { return m_isCursorTextVisible; } void setCursorTextVisible(bool visible); void setCursorText(const QString &text); int toPixel(qint64 time) const; qint64 toTime(int pixel) const; qint64 toDuration(int pixel) const; int fromDuration(qint64 time) const; const QVector &selectedItemIds() const { return m_selectedItemIds; } bool hasSelectedItems() const { return !m_selectedItemIds.isEmpty(); } void clearSelectedItems(); void selectAllItems(); void selectItem(int itemId, bool reset = true); void selectItems(const QVector &itemIds, bool reset = true); void unselectItem(int itemId); TimelineViewDragHandler *dragHandler() { return m_dragHandler; } void setDragHandler(TimelineViewDragHandler *dragHandler) { m_dragHandler = dragHandler; } TimelineViewResizeHandler *resizeHandler() { return m_resizeHandler; } void setResizeHandler(TimelineViewResizeHandler *resizeHandler) { m_resizeHandler = resizeHandler; } TimelineViewSelectHandler *selectHandler() { return m_selectHandler; } void setSelectHandler(TimelineViewSelectHandler *selectHandler) { m_selectHandler = selectHandler; } TimelineViewTrackHandler *trackHandler() { return m_trackHandler; } void setTrackHandler(TimelineViewTrackHandler *trackHandler) { m_trackHandler = trackHandler; } bool isCursorWithinRange(const QPoint &pos) const { return isCursorWithinRangeX(pos.x()) && isCursorWithinRangeY(pos.y()); } bool isCursorWithinRangeX(int x) const; bool isCursorWithinRangeY(int y) const; protected: void dragEnterEvent(QDragEnterEvent *event) override; void dragMoveEvent(QDragMoveEvent *event) override; void dragLeaveEvent(QDragLeaveEvent *event) override; void dropEvent(QDropEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void keyPressEvent(QKeyEvent *event) override; void wheelEvent(QWheelEvent *event) override; virtual void paintEvent(QPaintEvent *event) override; signals: void rangeChanged(qint64, qint64); void currentTimeChanged(qint64); void zoomChanged(ZoomFactor); void trackActivated(int); void selectedItemsChanged(const QVector &); void itemActivated(int); void currentItemTimeChanged(); private: TimelineHeaderView *m_header{nullptr}; TimelineModel *m_timelineModel{nullptr}; QAbstractItemModel *m_model{nullptr}; QAbstractProxyModel *m_proxyModel{nullptr}; ItemDelegate *m_delegate{nullptr}; TimelineViewDragHandler *m_dragHandler{nullptr}; TimelineViewResizeHandler *m_resizeHandler{nullptr}; TimelineViewSelectHandler *m_selectHandler{nullptr}; TimelineViewTrackHandler *m_trackHandler{nullptr}; ZoomFactor m_zoomFactor{ZoomFactor::ThirtyMinutes}; // NOTE: do NOT choose SixtyMinutes because the zoom combobox of the timeline would update initially ZoomFactor m_upperZoomFactor{ZoomFactor::OneDay}; // you cannot zoom out to see more than duration ZoomFactor m_minZoomFactor{ZoomFactor::FifteenSeconds}; ZoomFactor m_maxZoomFactor{ZoomFactor::OneDay}; qint64 m_startTime{-1}; qint64 m_currentTime{-1}; int m_duration{-1}; bool m_isCursorTextVisible{false}; QString m_cursorText; QPoint m_cursorPosition; QVector m_selectedItemIds; NGL::INGLLogger &m_logger; }; } // namespace LtsTimeline