forked from mapsme/omim
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoverlay_tree.hpp
107 lines (80 loc) · 2.68 KB
/
overlay_tree.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#pragma once
#include "drape/overlay_handle.hpp"
#include "geometry/screenbase.hpp"
#include "geometry/tree4d.hpp"
#include "base/buffer_vector.hpp"
#include "std/array.hpp"
#include "std/vector.hpp"
#include "std/unordered_set.hpp"
namespace dp
{
//#define COLLECT_DISPLACEMENT_INFO
namespace detail
{
struct OverlayTraits
{
ScreenBase m_modelView;
inline m2::RectD const LimitRect(ref_ptr<OverlayHandle> const & handle)
{
return handle->GetExtendedPixelRect(m_modelView);
}
};
struct OverlayHasher
{
hash<OverlayHandle*> m_hasher;
size_t operator()(ref_ptr<OverlayHandle> const & handle) const
{
return m_hasher(handle.get());
}
};
}
using TOverlayContainer = buffer_vector<ref_ptr<OverlayHandle>, 8>;
class OverlayTree : public m4::Tree<ref_ptr<OverlayHandle>, detail::OverlayTraits>
{
using TBase = m4::Tree<ref_ptr<OverlayHandle>, detail::OverlayTraits>;
public:
OverlayTree();
bool Frame();
bool IsNeedUpdate() const;
void StartOverlayPlacing(ScreenBase const & screen);
void Add(ref_ptr<OverlayHandle> handle);
void Remove(ref_ptr<OverlayHandle> handle);
void EndOverlayPlacing();
void Select(m2::RectD const & rect, TOverlayContainer & result) const;
void Select(m2::PointD const & glbPoint, TOverlayContainer & result) const;
void SetFollowingMode(bool mode);
void SetDisplacementEnabled(bool enabled);
void SetDisplacementMode(int displacementMode);
void SetSelectedFeature(FeatureID const & featureID);
#ifdef COLLECT_DISPLACEMENT_INFO
struct DisplacementData
{
m2::PointF m_arrowStart;
m2::PointF m_arrowEnd;
dp::Color m_arrowColor;
DisplacementData(m2::PointF const & arrowStart, m2::PointF const & arrowEnd, dp::Color const & arrowColor)
: m_arrowStart(arrowStart), m_arrowEnd(arrowEnd), m_arrowColor(arrowColor)
{}
};
using TDisplacementInfo = vector<DisplacementData>;
TDisplacementInfo const & GetDisplacementInfo() const;
#endif
private:
ScreenBase const & GetModelView() const { return m_traits.m_modelView; }
void InsertHandle(ref_ptr<OverlayHandle> handle,
ref_ptr<OverlayHandle> const & parentOverlay);
bool CheckHandle(ref_ptr<OverlayHandle> handle, int currentRank,
ref_ptr<OverlayHandle> & parentOverlay) const;
void DeleteHandle(ref_ptr<OverlayHandle> const & handle);
int m_frameCounter;
array<vector<ref_ptr<OverlayHandle>>, dp::OverlayRanksCount> m_handles;
unordered_set<ref_ptr<OverlayHandle>, detail::OverlayHasher> m_handlesCache;
bool m_followingMode;
bool m_isDisplacementEnabled;
int m_displacementMode;
FeatureID m_selectedFeatureID;
#ifdef COLLECT_DISPLACEMENT_INFO
TDisplacementInfo m_displacementInfo;
#endif
};
} // namespace dp