#pragma once #include #include namespace LtsScriptTimeline { class TrackEntry; enum class TrackEntryType; class TrackWidget; class ScriptTimeline; class Tools; class DragHandler; class ResizeHandler; class SelectHandler; LTSSCRIPTTIMELINE_EXPORT QDataStream &operator<<(QDataStream &ds, const TrackEntry &te); LTSSCRIPTTIMELINE_EXPORT QDataStream &operator>>(QDataStream &ds, TrackEntry &te); LTSSCRIPTTIMELINE_EXPORT bool isCollision(int start_s, int end_s, int toCompare_start_s, int toCompare_end_s); LTSSCRIPTTIMELINE_EXPORT bool isCollision2(int startPreview_s, int endPreview_s, const TrackEntry *pTrackEntry); class LTSSCRIPTTIMELINE_EXPORT TrackContentWidget : public QWidget { Q_OBJECT public: explicit TrackContentWidget(QWidget *parent = nullptr, bool isFilter = false, Tools *tools = nullptr, int mainTopicId = -1); ~TrackContentWidget() override; bool addTrackEntry(TrackEntry *te, bool selectTrackEntry); void removeTrackEntryByTopicId(TrackEntry *te); void selectAll(); void unselectAll(); const QVector &getTrackEntries() const { return m_entryList; } const QVector &getSelectedEntries() const { return m_selected; } void setIndicatorTime(int time); void setTrackName(const QString &trackName); void deleteSelectedTopics(); void selectEntry(int topicId); void setTopicFilterId(int id) { m_topicFilterId = id; } int topicFilterId() const { return m_topicFilterId; } void setReadonly(bool readonly); void addAllowedType(const TrackEntryType &tet) { m_allowedTypes.append(tet); } void addDisallowedType(const TrackEntryType &tet) { m_disallowedTypes.append(tet); } void setTrackWidget(TrackWidget *trackWidget); void setScriptTimeline(ScriptTimeline *scriptTimeline) { m_scriptTimeline = scriptTimeline; } void setTools(Tools *tools); void addCorrespondingTrackWidget(TrackContentWidget *pCorrespondingTrackWidget); static QString parallelError(); bool isMultiLineMultiSelectionMode() const { return m_isMultiLineMultiSelectionMode; } void setMultiLineMultiSelectionMode(bool active) { m_isMultiLineMultiSelectionMode = active; } bool isDragPossible() const { return (!m_isMultiLineMultiSelectionMode || m_dragPossible); } void selectEntriesAtPositions(int fromPos, int toPos); void forceLocalUnselect(); static bool checkForParallelTopics(const TrackContentWidget *pTCW, const QVector &vecPreviewTrackEntries, int dropTime_s, bool hack = false); static bool checkForParallelTopics(const TrackContentWidget *tcw, const QVector &preview, int dropTime_s, QVector &vecParallelTopics, bool ignoreSelectedTopics = false, bool hack = false); static bool checkForCollisions(const TrackContentWidget *tcw, const QVector &preview, int dropTime_s, QVector &vecCollisions, bool ignoreSelected = false, bool ignoreSelfCheck = false); static bool checkForCollisions(const TrackContentWidget *pTCW, const QVector &vecPreviewTrackEntries, int dropTime_s); bool checkForCollisionsSimple(const TrackEntry &previewEntry) const; QByteArray selectedItemsToData(int dragPosTime = 0, bool calculateFirstTeTime = true); static QByteArray itemsToData(const QVector &items, int dragPosTime = 0, bool calculateFirstTeTime = true); static QVector dataToItems(const QByteArray &data, int &offset); bool canPasteTopics(const QVector &topics, int offsetTime, int pasteTime) const; void forcePasteTopics(const QVector &topics, int offsetTime, int pasteTime); bool canMoveAll(int offset) const; void forceMoveAll(int offset); bool setDescriptionForSelected(); static QString mime; void dragEnd(); void setDragPossible(bool possible); void dragLeave(); bool dragEnter(const QByteArray &itemData); bool dragMove(int pos); bool dragDrop(int pos); void clearDrag(); int getDropPos() const; TrackWidget *trackWidget() { return m_trackWidget; } TrackEntry *trackEntryAtPos(int x) const; void keyPressEvent(QKeyEvent *event) override; protected: void paintEvent(QPaintEvent *event) override; void dragEnterEvent(QDragEnterEvent *event) override; void dragLeaveEvent(QDragLeaveEvent *event) override; void dropEvent(QDropEvent *event) override; void dragMoveEvent(QDragMoveEvent *event) override; void resizeEvent(QResizeEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override; private: TrackEntry *getTrackEntryOnPos(QPoint globalPos); bool allowedByType(const TrackEntry *te) const; TrackEntry *getParentTopicOfFilter(TrackEntry *filterTe) const; int m_topicFilterId = -1; // only for filter content widgets! friend class SelectHandler; SelectHandler *m_selectHandler; friend class ResizeHandler; ResizeHandler *m_resizeHandler; friend class DragHandler; DragHandler *m_dragHandler; //void addSelectEntry(TrackEntry *te); void selectEntry(TrackEntry *te); void addFilterType(const TrackEntryType &tet); void unselect(); void moveAll(int offset); bool handleResize(int cursorTime, bool leftButton); bool handleDrag(int cursorTime, bool leftButton); void cancelResize(); TrackEntry *getTrackEntryAt(int clickedTime); void clearPreview(); int dragPos() const { return m_dragPos; } //QPoint getDragStartPos() const { return ((m_dragHandler == nullptr) ? QPoint() : m_dragHandler->m_dragStartPos); } int m_dragOffsetTime; int m_dragPos; QVector m_entryList; QVector m_selected; //QVector m_toCopy; TrackEntry *m_mainSelected; QVector m_preview; int m_width; bool m_cursorSet; int m_oldEntryLength; bool m_unselectAllImmune; int m_indicatorTime; QString m_trackName; QVector m_allowedTypes; QVector m_disallowedTypes; bool m_isFilter; bool m_readonly; TrackWidget *m_trackWidget; // important for getting and adding track entries WITH filters ! ScriptTimeline *m_scriptTimeline; Tools *m_tools; QVector m_tcwCorresponding; bool m_isMultiLineMultiSelectionMode; bool m_multiLineMultiSelectionOkay; bool m_dragPossible; bool m_moveValid; int m_mainTopicId; signals: void signalUnselectAll(); void signalTrackEntrySelectionChanged(TrackEntry *); // parameter deprecated! unused! void signalChangesMade(); void signalTrackEntryAdded(TrackEntry *te); void signalTrackEntryDeleted(const int topicId); void signalEditEntry(const int topicId); void signalMultiLineMultiSelectionFailed(); void signalMultiLineMultiSelectionOkay(); void signalMultiLineMultiSelectionDone(int dropPos); void signalMultiLineMultiSelectionStart(int dragPosTime); void signalMultiLineMultiSelectionMove(int x); void signalStartRubberband(QPoint pos); void signalStopRubberband(); void signalEscapeRubberband(); void signalModifyRubberband(); void signalSelectAllGlobal(); void signalCopyTopics(); void signalPasteTopics(); void signalCutTopics(); void signalDeleteSelectedTopics(); void signalSave(); void signalMoveAll(int offset); void signalScroll(int incr); }; } // namespace LtsScriptTimeline