| 180 | } |
| 181 | |
| 182 | std::vector<std::pair<TimelineSourceId, qint64>> TimelineScene::alignCentersToCommonOrigin() const { |
| 183 | std::vector<std::pair<TimelineSourceId, qint64>> result; |
| 184 | if (tracks_.empty()) { |
| 185 | return result; |
| 186 | } |
| 187 | // Displayed center of a track, overflow-safe: window.min + (window.max − window.min) / 2. |
| 188 | const auto displayed_center = [](const TimelineSpanInput& track) -> qint64 { |
| 189 | const TimeSpan w = displayWindow(track); |
| 190 | return w.min + ((w.max - w.min) / 2); |
| 191 | }; |
| 192 | qint64 target = displayed_center(tracks_.front()); |
| 193 | for (const TimelineSpanInput& track : tracks_) { |
| 194 | target = std::min(target, displayed_center(track)); |
| 195 | } |
| 196 | result.reserve(tracks_.size()); |
| 197 | for (const TimelineSpanInput& track : tracks_) { |
| 198 | // We need raw_center − new_offset == target, and raw_center == displayed_center + offset. |
| 199 | const qint64 raw_center = displayed_center(track) + track.offset_ns; |
| 200 | result.emplace_back(track.id, raw_center - target); |
| 201 | } |
| 202 | return result; |
| 203 | } |
| 204 | |
| 205 | std::vector<std::pair<TimelineSourceId, qint64>> TimelineScene::alignEndsToCommonOrigin() const { |
| 206 | std::vector<std::pair<TimelineSourceId, qint64>> result; |