Welcome to mirror list, hosted at ThFree Co, Russian Federation.

user_mark_container.hpp « map - github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 4ca9549e4e75572ffa5e3c8728526ee09512a539 (plain)
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#pragma once

#include "user_mark.hpp"
#include "user_mark_dl_cache.hpp"

#include "render/events.hpp"

#include "geometry/point2d.hpp"
#include "geometry/rect2d.hpp"

#include "std/deque.hpp"
#include "std/noncopyable.hpp"
#include "std/unique_ptr.hpp"

class Framework;

namespace anim
{
  class Task;
}

namespace graphics
{
  class DisplayList;
  class Screen;
}

class UserMarkContainer : private noncopyable
{
public:
  using UserMarksListT = deque<unique_ptr<UserMark>>;

  class Controller
  {
  public:
    Controller(UserMarkContainer * container)
      : m_container(container) {}

    UserMark * CreateUserMark(m2::PointD const & ptOrg) { return m_container->CreateUserMark(ptOrg); }
    size_t GetUserMarkCount() const { return m_container->GetUserMarkCount(); }
    UserMark const * GetUserMark(size_t index) const { return m_container->GetUserMark(index); }
    UserMark * GetUserMarkForEdit(size_t index) { return m_container->GetUserMark(index); }
    void DeleteUserMark(size_t index) { m_container->DeleteUserMark(index); }
    void DeleteUserMark(UserMark const * mark) { m_container->DeleteUserMark(mark); }

    // Returns index of the mark if exists, otherwise returns
    // number of user marks.
    size_t FindUserMark(UserMark const * mark) const { return m_container->FindUserMark(mark); }

  private:
    UserMarkContainer * m_container;
  };

  enum Type
  {
    SEARCH_MARK,
    API_MARK,
    DEBUG_MARK,
    BOOKMARK_MARK
  };

  UserMarkContainer(double layerDepth, Framework & fm);
  virtual ~UserMarkContainer();

  void SetScreen(graphics::Screen * cacheScreen);
  virtual Type GetType() const = 0;

  bool IsVisible() const { return m_isVisible; }
  void SetVisible(bool isVisible) { m_isVisible = isVisible; }

  bool IsDrawable() const { return m_isDrawable; }
  void SetIsDrawable(bool isDrawable) { m_isDrawable = isDrawable; }

  // If not found mark on rect result is NULL
  // If mark is found in "d" return distance from rect center
  // In multiple select choose mark with min(d)
  UserMark const * FindMarkInRect(m2::AnyRectD const & rect, double & d) const;

  void Draw(PaintOverlayEvent const & e, UserMarkDLCache * cache) const;
  void ActivateMark(UserMark const * mark);
  void DiactivateMark();

  void Clear(size_t skipCount = 0);

  double GetDepth() const { return m_layerDepth; }

  static void InitStaticMarks(UserMarkContainer * container);
  static PoiMarkPoint * UserMarkForPoi();
  static MyPositionMarkPoint * UserMarkForMyPostion();

  Controller const & GetController() const { return m_controller; }
  Controller & GetController() { return m_controller; }

  virtual string GetActiveTypeName() const = 0;

protected:
  virtual string GetTypeName() const = 0;
  virtual UserMark * AllocateUserMark(m2::PointD const & ptOrg) = 0;

private:
  friend class Controller;
  UserMark * CreateUserMark(m2::PointD const & ptOrg);
  size_t GetUserMarkCount() const;
  UserMark const * GetUserMark(size_t index) const;
  UserMark * GetUserMark(size_t index);
  void DeleteUserMark(size_t index);
  void DeleteUserMark(UserMark const * mark);
  size_t FindUserMark(UserMark const * mark);

  template <class ToDo> void ForEachInRect(m2::RectD const & rect, ToDo toDo) const;

protected:
  Framework & m_framework;

private:
  Controller m_controller;
  bool m_isVisible;
  bool m_isDrawable;
  double m_layerDepth;
  UserMarksListT m_userMarks;
};

class SearchUserMarkContainer : public UserMarkContainer
{
public:
  SearchUserMarkContainer(double layerDepth, Framework & framework);

  virtual Type GetType() const { return SEARCH_MARK; }

  virtual string GetActiveTypeName() const;
protected:
  virtual string GetTypeName() const;
  virtual UserMark * AllocateUserMark(m2::PointD const & ptOrg);
};

class ApiUserMarkContainer : public UserMarkContainer
{
public:
  ApiUserMarkContainer(double layerDepth, Framework & framework);

  virtual Type GetType() const { return API_MARK; }

  virtual string GetActiveTypeName() const;
protected:
  virtual string GetTypeName() const;
  virtual UserMark * AllocateUserMark(m2::PointD const & ptOrg);
};

class DebugUserMarkContainer : public UserMarkContainer
{
public:
  DebugUserMarkContainer(double layerDepth, Framework & framework);

  virtual Type GetType() const { return DEBUG_MARK; }

  virtual string GetActiveTypeName() const;
protected:
  virtual string GetTypeName() const;
  virtual UserMark * AllocateUserMark(m2::PointD const & ptOrg);
};

class SelectionContainer
{
public:
  SelectionContainer(Framework & fm);

  void ActivateMark(UserMark const * userMark, bool needAnim);
  void Draw(PaintOverlayEvent const & e, UserMarkDLCache * cache) const;
  bool IsActive() const;

private:
  /// animation support
  void StartActivationAnim();
  void KillActivationAnim();
  double GetActiveMarkScale() const;

  shared_ptr<anim::Task> m_animTask;

private:
  friend class BookmarkManager;
  UserMarkContainer const * m_container;
  m2::PointD m_ptOrg;
  Framework & m_fm;
};