12class TrackLaneList :
public QAbstractListModel
16 bool lanesVisible READ lanesVisible WRITE setLanesVisible NOTIFY
24 TrackLanePtrRole = Qt::UserRole + 1,
30 ~TrackLaneList ()
override;
31 Q_DISABLE_COPY_MOVE (TrackLaneList)
36 QHash<int, QByteArray> roleNames ()
const override;
37 int rowCount (
const QModelIndex &parent = QModelIndex ())
const override;
39 data (
const QModelIndex &index,
int role = Qt::DisplayRole)
const override;
41 Q_INVOKABLE
TrackLane * getFirstLane ()
const
43 return lanes_.front ().get ();
46 bool lanesVisible ()
const {
return lanes_visible_; }
47 void setLanesVisible (
bool visible)
49 if (lanes_visible_ == visible)
52 lanes_visible_ = visible;
53 Q_EMIT lanesVisibleChanged (visible);
55 Q_SIGNAL
void lanesVisibleChanged (
bool visible);
61 Q_INVOKABLE
TrackLane * insertLane (
size_t index);
62 Q_INVOKABLE
void removeLane (
size_t index);
64 Q_INVOKABLE
void moveLane (
size_t from_index,
size_t to_index);
69 Q_SIGNAL
void totalHeightChanged ();
73 [[nodiscard]]
size_t size () const noexcept {
return lanes_.size (); }
75 [[nodiscard]]
bool empty () const noexcept {
return lanes_.empty (); }
77 TrackLane * at (
size_t idx)
const {
return lanes_.at (idx).get (); }
84 auto &lanes ()
const {
return lanes_; }
86 auto lanes_view ()
const
89 | std::views::transform (&utils::QObjectUniquePtr<TrackLane>::get);
100 return std::ranges::fold_left (
101 lanes_view () | std::views::transform (&TrackLane::height), 0,
116 static constexpr auto kLanesKey =
"lanes"sv;
117 static constexpr std::string_view kLanesVisibleKey =
"lanesVisible";
118 friend void to_json (nlohmann::json &j,
const TrackLaneList &p);
119 friend void from_json (
const nlohmann::json &j, TrackLaneList &p);
121 void erase (
size_t pos);
123 void update_default_lane_names ();
127 std::vector<utils::QObjectUniquePtr<TrackLane>> lanes_;
130 bool lanes_visible_ =
false;
132 BOOST_DESCRIBE_CLASS (TrackLaneList, (), (), (), (lanes_, lanes_visible_))