| 808 | } |
| 809 | |
| 810 | void BookmarkManager::UpdateElevationMyPosition(kml::TrackId const & trackId) |
| 811 | { |
| 812 | CHECK_THREAD_CHECKER(m_threadChecker, ()); |
| 813 | |
| 814 | static_assert(TrackSelectionMark::kInvalidDistance < 0); |
| 815 | double myPositionDistance = TrackSelectionMark::kInvalidDistance; |
| 816 | if (m_myPositionMark->HasPosition()) |
| 817 | { |
| 818 | double constexpr kEps = 1e-5; |
| 819 | if (m_lastElevationMyPosition.EqualDxDy(m_myPositionMark->GetPivot(), kEps)) |
| 820 | return; |
| 821 | m_lastElevationMyPosition = m_myPositionMark->GetPivot(); |
| 822 | |
| 823 | auto const snapRect = |
| 824 | mercator::RectByCenterXYAndSizeInMeters(m_myPositionMark->GetPivot(), kMyPositionTrackSnapInMeters); |
| 825 | auto const selectionInfo = |
| 826 | FindNearestTrack(snapRect, [trackId](Track const * track) { return track->GetId() == trackId; }); |
| 827 | if (selectionInfo.m_trackId == trackId) |
| 828 | myPositionDistance = selectionInfo.m_distFromBegM; |
| 829 | } |
| 830 | else |
| 831 | { |
| 832 | m_lastElevationMyPosition = m2::PointD::Zero(); |
| 833 | } |
| 834 | |
| 835 | auto const markId = GetTrackSelectionMarkId(trackId); |
| 836 | if (markId == kml::kInvalidTrackId) |
| 837 | return; |
| 838 | |
| 839 | auto es = GetEditSession(); |
| 840 | auto trackSelectionMark = GetMarkForEdit<TrackSelectionMark>(markId); |
| 841 | |
| 842 | double constexpr kEpsMeters = 1e-2; |
| 843 | if (!AlmostEqualAbs(trackSelectionMark->GetMyPositionDistance(), myPositionDistance, kEpsMeters)) |
| 844 | { |
| 845 | trackSelectionMark->SetMyPositionDistance(myPositionDistance); |
| 846 | if (m_elevationMyPositionChanged) |
| 847 | m_elevationMyPositionChanged(); |
| 848 | } |
| 849 | } |
| 850 | |
| 851 | double BookmarkManager::GetElevationMyPosition(kml::TrackId const & trackId) const |
| 852 | { |
no test coverage detected