Files
qt-migration-legatus/qt6-after/qt6-migrated-legatus/Lts/Common/LtsTimeline/track.h
T
torstenandCopilot 7a6be7474e Qt6 migration: Fix BUILD_RTI=OFF build errors in TrainingAreaBase
- training_area_telegrams.cpp: Fixed QJsonObject initializer syntax (Qt6 requires {{}} not ({}))
- training_area_telegrams.cpp: Fixed fromJson() methods to access m_* members directly
- training_area_telegrams.cpp: Fixed brace mismatches in multiple toJson() methods
- training_area_telegrams.h: Changed Header struct to public members for consistency
- tx_mixin.cpp: Fixed getEquipmentNumber() template for direct member access
- lts_coordinate.cpp: Added missing #include <iomanip>
- MIGRATION_STATUS.md: Added migration progress tracking document

C++17 constraint enforced due to RTI Connext DDS 7.7.0 incompatibility with C++20+

Build status: BUILD_RTI=OFF successful (0 errors, warnings only)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-08-23 20:49:23 +02:00

287 lines
8.0 KiB
C++

#pragma once
#include "item.h"
#include "ltstimeline_export.h"
#include <QtCore/QObject>
#include <QtCore/QSet>
#include <QtCore/QVariant>
#include <memory>
namespace LtsTimeline
{
class Track;
class TimelineModel;
typedef std::unique_ptr<Track> TrackPtr;
typedef std::vector<TrackPtr> Tracks;
typedef std::reference_wrapper<TrackPtr> TrackPtrRef;
typedef std::vector<TrackPtrRef> TrackPtrRefs;
class LTSTIMELINE_EXPORT Track
{
public:
Track(const QString& text = {}) : m_text(text) {}
Track(const QString& text, int specialTrackType) : m_text(text), m_userData(specialTrackType) {}
Track(const Track&) = delete;
Track& operator=(const Track&) = delete;
Track(Track&& t) noexcept = default;
virtual ~Track() = default;
[[deprecated("Use model's track(int) instead.")]] const Track& track(int id) const noexcept(false);
[[deprecated("Use model's track(int) instead.")]] Track& track(int id) noexcept(false);
[[deprecated("Use model's item(int) instead.")]] Item& item(int id) noexcept(false);
[[deprecated("Use model's item(int) instead.")]] const Item& item(int id) const noexcept(false);
Item& previous(int id) noexcept(false);
Item& next(int id) noexcept(false);
const Item& copyItemAt(qint64 time) const noexcept(false);
Item& itemAt(qint64 time) noexcept(false);
const Item& itemAt(qint64 time) const noexcept(false);
Track& trackAt(int index) noexcept(false);
const Track& trackAt(int index) const noexcept(false);
bool hasTrack(int id, bool recursive = false) const;
bool hasTracks() const
{
return !m_childrenTracks.empty();
}
int rowOfTrack(int id) const noexcept(false);
const Track& parentOf(int id) const noexcept(false);
const QSet<int>& copyItemIds() const
{
return m_copyItemIds;
}
void clearCopyItemIds()
{
m_copyItemIds.clear();
}
void addCopyItemIds(const QSet<int>& ids);
void addCopyItemId(int id);
bool hasItems() const
{
return !m_items.empty();
}
bool hasCopyItems() const
{
return !m_copyItemIds.empty();
}
int itemCount() const
{
return m_items.size();
}
Items& items()
{
return m_items;
}
const Items& items() const
{
return m_items;
}
int trackCount() const
{
return m_childrenTracks.size();
}
Tracks& tracks()
{
return m_childrenTracks;
}
const Tracks& tracks() const
{
return m_childrenTracks;
}
QVector<int> itemIds(bool recursive = false, bool sorted = false) const;
const QVector<int> itemIdsBetween(qint64 start, qint64 end, bool strict = false, bool complete = false,
bool recursive = false, bool sorted = false, qint64 minimumDuration = 0) const;
[[deprecated]] const QVector<int> copyItemIdsBetween(qint64 start, qint64 end, bool strict = false,
bool complete = false, bool recursive = false,
bool sorted = false, qint64 minimumDuration = 0) const;
bool isItemsBetween(qint64 start, qint64 end, const QVector<int>& ignoreIds, bool strict = false,
bool complete = false, bool recursive = false, qint64 minimumDuration = 0) const;
bool isItemsBetween(qint64 start, qint64 end, int ignoreId, bool strict = false, bool complete = false,
bool recursive = false, qint64 minimumDuration = 0) const;
int id() const
{
return m_id;
}
virtual const QString text() const
{
return m_text;
}
int parent() const
{
return m_parentId;
}
int parentId() const
{
return m_parentId;
}
void printTrackIds(bool withItems = false, int level = 0) const;
void removeCopyItem(int itemId) noexcept(false);
void removeItem(int itemId) noexcept(false);
ItemPtr takeItem(int itemId) noexcept(false);
QVariant userData() const
{
return m_userData;
}
void setUserData(const QVariant& data)
{
m_userData = data;
}
inline static void sort(Items& items)
{
std::sort(items.begin(), items.end(),
[](const ItemPtr& itemA, const ItemPtr& itemB) { return itemA->startTime() < itemB->startTime(); });
}
inline static void sort(ItemPtrNCVRefs& items)
{
std::sort(items.begin(), items.end(), [](const ItemPtrNCVRef& itemA, const ItemPtrNCVRef& itemB) {
return itemA.get()->startTime() < itemB.get()->startTime();
});
}
inline static void sort(ItemPtrRefs& items)
{
std::sort(items.begin(), items.end(), [](const ItemPtrRef& itemA, const ItemPtrRef& itemB) {
return itemA.get()->startTime() < itemB.get()->startTime();
});
}
bool hasInsertButton() const
{
return m_hasInsertButton;
}
void setInsertButton(bool hasButton)
{
m_hasInsertButton = hasButton;
}
bool hasRemoveButton() const
{
return m_hasRemoveButton;
}
void setRemoveButton(bool hasButton)
{
m_hasRemoveButton = hasButton;
}
protected:
QString m_text;
QVariant m_userData;
private:
void removeTrack(int trackId) noexcept(false);
void addItemPtr(ItemPtr&& itemPtr);
static bool isItemBetween(const Item& item, qint64 start, qint64 end, bool strict, bool complete,
qint64 minimumDuration = 0);
ItemPtrRefs _copyItems() const;
ItemPtrRefs _items(bool recursive) const;
ItemPtrNCVRefs _itemsNCV(bool recursive);
ItemPtrNCVRef _itemNCV(int id) noexcept(false);
ItemPtrRef _item(int id) const noexcept(false);
const QVector<int> _itemIds(bool recursive) const;
public:
void clearItems()
{
m_items.clear();
}
private:
friend class TimelineModel;
void sort()
{
sort(m_items);
}
template <typename TrackClass> Track* addTrack(TrackClass&& trackClass)
{
TrackClass _trackClass = std::move(trackClass);
m_childrenTracks.push_back(std::move(std::move(std::make_unique<TrackClass>(std::move(_trackClass)))));
return m_childrenTracks.back().get();
}
template <typename TrackClass>
[[deprecated("Use model's track(...) and call addTrack(TrackClass) directly on that track.")]] Track*
addTrack(int parentTrackId, TrackClass&& trackClass) noexcept(false)
{
if (m_id == parentTrackId)
return addTrack<TrackClass>(std::move(trackClass));
return track(parentTrackId).addTrack(std::move(trackClass));
}
template <typename ItemClass> Item* addItem(ItemClass&& itemClass)
{
ItemClass _itemClass(std::move(itemClass));
auto it = m_items.insert(
std::upper_bound(m_items.begin(), m_items.end(), _itemClass.startTime(),
[](qint64 startTime, const ItemPtr& other) { return (other->startTime() > startTime); }),
std::move(std::make_unique<ItemClass>(std::move(_itemClass))));
return it->get();
}
Item* addItem(ItemPtr&& itemPtr)
{
auto it = m_items.insert(
std::upper_bound(m_items.begin(), m_items.end(), itemPtr->startTime(),
[](qint64 startTime, const ItemPtr& other) { return (other->startTime() > startTime); }),
std::move(itemPtr));
return it->get();
}
template <typename ItemContainer>
[[deprecated]] QVector<int> transformItemPtrsToIds(const ItemContainer& itemContainer) const
{
QVector<int> ids;
std::transform(itemContainer.cbegin(), itemContainer.cend(), std::back_inserter(ids),
[](const ItemPtr& itemPtr) -> int { return itemPtr->id(); });
return ids;
}
int m_id{-1};
Tracks m_childrenTracks;
Items m_items;
int m_parentId{-1};
bool m_hasInsertButton{false};
bool m_hasRemoveButton{false};
QSet<int> m_copyItemIds;
};
} // namespace LtsTimeline