/** * @RDE_HEADER@ * Timeline Model for DDS * $Id$ * $HeadURL$ * $Author$ * Created by Mike Wille, SLSE, 2017-03-31 */ #pragma once #include "detail_data.h" #include #include #include #include #include #include #include #include #include namespace LtsUtils { class RequestHelper; } namespace LtsSession { class LtsSession; } namespace AudioVideoManagement { class StreamNameMapping; } namespace Timeline { struct CacheRange : public LtsTimelineClassic::Range { QVector events; bool incomplete = true; bool visible = false; // events currently visible/set on timeline? }; class DDSTimelineModel : public LtsTimelineClassic::AbstractTimelineModel { Q_OBJECT public: explicit DDSTimelineModel(QObject *parent); ~DDSTimelineModel(); bool init(const std::shared_ptr &eemForeign, const std::shared_ptr &mrkDtc, const std::shared_ptr &exmDtc, const std::shared_ptr &ppmDtc, const std::shared_ptr &pdmDtc, const std::shared_ptr &ismDtc, LtsSession::LtsSession *session, Timeline::DetailData *detailData, AudioVideoManagement::StreamNameMapping *streamNameMapping); void applyFilter(const QJsonArray &filter); void setDetailData(DetailData *detailData) { m_detailData = detailData; } void setColorPaintFun(LtsTimelineClassic::Event::EventPaintFunc &paintFunc, QColor &color, ProjectDataManagement::EventType eventType) const; void setTimeRange(qint64 min, qint64 max); void getEvents(qint64 rangeMin, qint64 rangeMax); QVector getKnownRanges() const; const QVector> &cachedEvents() const { return m_cachedEvents; } // for debug only ! const CacheRange &liveCache() const { return m_liveCache; } // for debug only ! void forceUncache(); void setLive(bool isLive = true); void setCreateFakeEvents(bool createFakeEvents = true); void setActiveEventTypeIds(const QSet &activeEventTypeIds); const QSet &activeEventTypeIds() const { return m_activeEventTypeIds; } bool hasActiveEventTypes() const { return !m_activeEventTypeIds.isEmpty(); } void getAllEventsOfType(const QSet &eventTypeIds); private: qint64 currentTime() const override; //void addExerciseEventManagementEvent(const ExerciseEventManagement::Event &data); QStringList getPathForAvsEvents(const QString &type, const QJsonObject &obj) const; QStringList getPathForBuildingEvents(const QString &type, const QJsonObject &obj) const; QStringList getPathForAesEvents(const QString &type, const QJsonObject &obj) const; void addMarkerManagementMarker(const MarkerManagement::Marker &data); void addEventsAndFilter(const QVector &eventList); void addEventAndFilter(LtsTimelineClassic::Event *event); // returns false if NOT added (so delete the event if false) void deleteMarker(int uniqueId); void modifyMarker(const MarkerManagement::Marker &data); QJsonObject createMarkerDetailData(const MarkerManagement::Marker &data) const; LtsTimelineClassic::Event *getMarker(int uniqueId); void checkCache(); void removeEvent(int eventId); void addCacheRange(const LtsTimelineClassic::Range &range, const QVector &cachedEvents, qint64 incompleteEnd, bool addToTimeline = true); bool isLive() const { return m_isLive; } LtsTimelineClassic::Event *createEvent(const ExerciseEventManagement::Event &data) const; //const QVector createEvents(const QVector &eventList) const; bool checkDetailData(const LtsTimelineClassic::Event *event) const; void processEventList(qint64 &highest, bool &incomplete, QVector &cachedEvents, QVector &eventList, const int initialCount = 0); void receivedEvents(const LtsTimelineClassic::Range &range, QVector &receivedEventsList); void requestEvents(const LtsTimelineClassic::Range &range); QVector createTestEvents(qint64 time, int count, qint64 distance, qint64 duration = 0); static bool isInsideCachedRange(const CacheRange &cacheRange, qint64 start, qint64 end); bool isCached(int eventId) const; void showCached(CacheRange &cacheRange); bool isCacheFull() const; //void forceUncache(); void uncache(CacheRange &cr); const CacheRange *getCache(int eventId) const; void addCacheRangeToTimeline(const CacheRange &cr); bool splitLowest(qint64 &rangeMin, qint64 rangeMax, qint64 &requestMin, qint64 &requestMax, const CacheRange &lowestCache) const; void rebuildTimelineKnownRanges(); void _uncache(const CacheRange &cr); void saveAndClearLiveCache(); const QJsonObject getDetailData(const ExerciseEventManagement::Event &event) const; const QJsonObject getDetailData(const QByteArray &data, int id, const ProjectDataManagement::EventType& type, qint64 startTime) const; std::shared_ptr m_eemForeign; std::shared_ptr m_dtcExm; std::shared_ptr m_ppmDtc; std::shared_ptr m_pdmDtc; std::shared_ptr m_mrkDtc; std::shared_ptr m_ismDtc; QJsonArray m_filter; LtsSession::LtsSession *m_session; int64_t m_startTime; int64_t m_endTime; DetailData *m_detailData; AudioVideoManagement::StreamNameMapping *m_streamNameMapping; bool m_isLive; int m_cacheSize; // per range in m_cachedEvents int m_maxCacheRanges; // max entries in m_cachedEvents int m_eventCount; qint64 m_lastCachedEventsId; QVector> m_cachedEvents; CacheRange m_liveCache; bool m_createFakeEvents; QSet m_activeEventTypeIds; //bool m_dtorEmergencyMode; QVector m_knownMarkerIds; NGL::INGLLogger &m_logger; public slots: void slotAddLiveEvent(const ExerciseEventManagement::Event &event); private slots: //void slotEventChanged(const ExerciseEventManagement::Event &data, DataModification modType); void slotMarkerChanged(const MarkerManagement::Marker &data, DataModification modType); void slotAddLiveEventsFake(); void slotRequestMessageReceived(const QString &message); signals: void signalTooMuchEvents(); void signalRebuildTimelineKnownRanges(); // sadly, the model cannot do this.. void signalLoading(); void signalLoadingDone(); }; class EventRequest : public QObject { Q_OBJECT public: EventRequest(const QUrl &url, qint64 start, qint64 end, const QSet &eventTypes, int limit); ~EventRequest() = default; void append(LtsTimelineClassic::Event *newEvent) { m_eventList.push_back(newEvent); } const QVector &eventList() const { return m_eventList; } qint64 start() const { return m_start; } qint64 end() const { return m_end; } private: void requestFailed(const QString &errorString); qint64 m_start; qint64 m_end; QVector m_eventList; QTimer *m_timeoutTimer; private slots: void slotRequestFailed(); void slotMessageReceived(const QString &message); signals: void signalRequestFailed(const QString &errorString); void signalMessageReceived(const QString &message); void signalDone(); void signalTimeout(); }; } // namespace Timeline