#pragma once #include "drape_frontend/user_marks_provider.hpp" #include "indexer/feature_decl.hpp" #include "geometry/latlon.hpp" #include "geometry/point2d.hpp" #include "base/macros.hpp" #include #include #include #include class UserMark : public df::UserPointMark { public: enum class Priority: uint16_t { Default = 0, RouteStart, RouteFinish, RouteIntermediateC, RouteIntermediateB, RouteIntermediateA, TransitStop, TransitGate, TransitTransfer, TransitKeyStop, SpeedCamera, RoadWarning, RoadWarningFirstFerry, RoadWarningFirstDirty, RoadWarningFirstToll, }; enum Type : uint32_t { BOOKMARK, // Should always be the first one API, SEARCH, STATIC, ROUTING, SPEED_CAM, ROAD_WARNING, TRANSIT, LOCAL_ADS, DEBUG_MARK, // Plain "DEBUG" results in a name collision. COLORED, USER_MARK_TYPES_COUNT, USER_MARK_TYPES_COUNT_MAX = 1000, }; UserMark(kml::MarkId id, m2::PointD const & ptOrg, UserMark::Type type); UserMark(m2::PointD const & ptOrg, UserMark::Type type); static Type GetMarkType(kml::MarkId id); Type GetMarkType() const { return GetMarkType(GetId()); } kml::MarkGroupId GetGroupId() const override { return GetMarkType(); } // df::UserPointMark overrides. bool IsDirty() const override { return m_isDirty; } void ResetChanges() const override { m_isDirty = false; } bool IsVisible() const override { return true; } m2::PointD const & GetPivot() const override; m2::PointD GetPixelOffset() const override { return {}; } dp::Anchor GetAnchor() const override { return dp::Center; } bool GetDepthTestEnabled() const override { return true; } float GetDepth() const override { return 0.0f; } df::DepthLayer GetDepthLayer() const override { return df::DepthLayer::UserMarkLayer; } drape_ptr GetTitleDecl() const override { return nullptr; } drape_ptr GetColoredSymbols() const override { return nullptr; } drape_ptr GetBadgeNames() const override { return nullptr; } drape_ptr GetSymbolSizes() const override { return nullptr; } drape_ptr GetSymbolOffsets() const override { return nullptr; } uint16_t GetPriority() const override { return static_cast(Priority::Default); } df::SpecialDisplacement GetDisplacement() const override { return df::SpecialDisplacement::UserMark; } uint32_t GetIndex() const override { return 0; } bool SymbolIsPOI() const override { return false; } bool HasTitlePriority() const override { return false; } int GetMinZoom() const override { return 1; } int GetMinTitleZoom() const override { return GetMinZoom(); } FeatureID GetFeatureID() const override { return FeatureID(); } bool HasCreationAnimation() const override { return false; } df::ColorConstant GetColorConstant() const override { return {}; } bool IsMarkAboveText() const override { return false; } ms::LatLon GetLatLon() const; virtual bool IsAvailableForSearch() const { return true; } protected: void SetDirty() { m_isDirty = true; } m2::PointD m_ptOrg; private: mutable bool m_isDirty = true; DISALLOW_COPY_AND_MOVE(UserMark); }; class StaticMarkPoint : public UserMark { public: explicit StaticMarkPoint(m2::PointD const & ptOrg); drape_ptr GetSymbolNames() const override { return nullptr; } void SetPtOrg(m2::PointD const & ptOrg); }; class MyPositionMarkPoint : public StaticMarkPoint { public: explicit MyPositionMarkPoint(m2::PointD const & ptOrg); void SetUserPosition(m2::PointD const & pt, bool hasPosition) { SetPtOrg(pt); m_hasPosition = hasPosition; } bool HasPosition() const { return m_hasPosition; } private: bool m_hasPosition = false; }; class DebugMarkPoint : public UserMark { public: explicit DebugMarkPoint(m2::PointD const & ptOrg); drape_ptr GetSymbolNames() const override; }; class ColoredMarkPoint : public UserMark { public: explicit ColoredMarkPoint(m2::PointD const & ptOrg); void SetColor(dp::Color const & color); void SetRadius(float radius); bool SymbolIsPOI() const override { return true; } drape_ptr GetSymbolNames() const override { return nullptr; } drape_ptr GetColoredSymbols() const override; private: ColoredSymbolZoomInfo m_coloredSymbols; }; string DebugPrint(UserMark::Type type);