MyGUI  3.2.2
MyGUI_ScrollView.cpp
Go to the documentation of this file.
1 /*
2  * This source file is part of MyGUI. For the latest info, see http://mygui.info/
3  * Distributed under the MIT License
4  * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
5  */
6 
7 #include "MyGUI_Precompiled.h"
8 #include "MyGUI_ScrollView.h"
9 #include "MyGUI_SkinManager.h"
10 #include "MyGUI_ISubWidgetText.h"
11 #include "MyGUI_ScrollBar.h"
12 
13 namespace MyGUI
14 {
15 
16  const int SCROLL_VIEW_MOUSE_WHEEL = 50; // колличество пикселей для колеса мыши
17  const int SCROLL_VIEW_SCROLL_PAGE = 16; // колличество пикселей для кнопок скрола
18 
20  mContentAlign(Align::Center),
21  mRealClient(nullptr)
22  {
23  mChangeContentByResize = false;
24  }
25 
27  {
28  Base::initialiseOverride();
29 
30  // FIXME нам нужен фокус клавы
31  setNeedKeyFocus(true);
32 
34  assignWidget(mClient, "Client");
35  MyGUI::Widget* realClientOwner = this;
36  if (mClient != nullptr)
37  {
39  realClientOwner = mClient;
40  }
41 
42  // создаем холcт, реальный владелец детей
43  mRealClient = realClientOwner->createWidget<Widget>("Default", IntCoord(), Align::Default);
46 
48  assignWidget(mVScroll, "VScroll");
49  if (mVScroll != nullptr)
50  {
52  }
53 
55  assignWidget(mHScroll, "HScroll");
56  if (mHScroll != nullptr)
57  {
59  }
60 
61  updateView();
62  }
63 
65  {
66  mVScroll = nullptr;
67  mHScroll = nullptr;
68  mClient = nullptr;
69  mRealClient = nullptr;
70 
71  Base::shutdownOverride();
72  }
73 
74  void ScrollView::setPosition(const IntPoint& _point)
75  {
76  Base::setPosition(_point);
77  }
78 
79  void ScrollView::setSize(const IntSize& _size)
80  {
81  Base::setSize(_size);
82 
83  updateView();
84  }
85 
86  void ScrollView::setCoord(const IntCoord& _coord)
87  {
88  Base::setCoord(_coord);
89 
90  updateView();
91  }
92 
93  void ScrollView::notifyScrollChangePosition(ScrollBar* _sender, size_t _position)
94  {
95  if (mRealClient == nullptr)
96  return;
97 
98  if (_sender == mVScroll)
99  {
100  IntPoint point = mRealClient->getPosition();
101  point.top = -(int)_position;
102  mRealClient->setPosition(point);
103  }
104  else if (_sender == mHScroll)
105  {
106  IntPoint point = mRealClient->getPosition();
107  point.left = -(int)_position;
108  mRealClient->setPosition(point);
109  }
110  }
111 
112  void ScrollView::notifyMouseWheel(Widget* _sender, int _rel)
113  {
114  if (mRealClient == nullptr)
115  return;
116 
117  if (mVRange != 0)
118  {
119  IntPoint point = mRealClient->getPosition();
120  int offset = -point.top;
121  if (_rel < 0) offset += SCROLL_VIEW_MOUSE_WHEEL;
122  else offset -= SCROLL_VIEW_MOUSE_WHEEL;
123 
124  if (offset < 0) offset = 0;
125  else if (offset > (int)mVRange) offset = mVRange;
126 
127  if (offset != point.top)
128  {
129  point.top = -offset;
130  if (mVScroll != nullptr)
131  {
132  mVScroll->setScrollPosition(offset);
133  }
134  mRealClient->setPosition(point);
135  }
136  }
137  else if (mHRange != 0)
138  {
139  IntPoint point = mRealClient->getPosition();
140  int offset = -point.left;
141  if (_rel < 0) offset += SCROLL_VIEW_MOUSE_WHEEL;
142  else offset -= SCROLL_VIEW_MOUSE_WHEEL;
143 
144  if (offset < 0) offset = 0;
145  else if (offset > (int)mHRange) offset = mHRange;
146 
147  if (offset != point.left)
148  {
149  point.left = -offset;
150  if (mHScroll != nullptr)
151  {
152  mHScroll->setScrollPosition(offset);
153  }
154  mRealClient->setPosition(point);
155  }
156  }
157  }
158 
159  IntSize ScrollView::getContentSize()
160  {
161  return mRealClient == nullptr ? IntSize() : mRealClient->getSize();
162  }
163 
164  IntPoint ScrollView::getContentPosition()
165  {
166  return mRealClient == nullptr ? IntPoint() : (IntPoint() - mRealClient->getPosition());
167  }
168 
169  void ScrollView::setContentPosition(const IntPoint& _point)
170  {
171  if (mRealClient != nullptr)
172  mRealClient->setPosition(IntPoint() - _point);
173  }
174 
175  IntSize ScrollView::getViewSize()
176  {
177  return mClient == nullptr ? getSize() : mClient->getSize();
178  }
179 
180  size_t ScrollView::getVScrollPage()
181  {
183  }
184 
185  size_t ScrollView::getHScrollPage()
186  {
188  }
189 
191  {
194  }
195 
197  {
198  mVisibleVScroll = _value;
199  updateView();
200  }
201 
203  {
204  mVisibleHScroll = _value;
205  updateView();
206  }
207 
209  {
210  mContentAlign = _value;
211  updateView();
212  }
213 
214  void ScrollView::setCanvasSize(const IntSize& _value)
215  {
216  if (mRealClient != nullptr)
217  mRealClient->setSize(_value);
218  updateView();
219  }
220 
222  {
223  return mRealClient == nullptr ? IntSize() : mRealClient->getSize();
224  }
225 
226  void ScrollView::setPropertyOverride(const std::string& _key, const std::string& _value)
227  {
229  if (_key == "VisibleVScroll")
230  setVisibleVScroll(utility::parseValue<bool>(_value));
231 
233  else if (_key == "VisibleHScroll")
234  setVisibleHScroll(utility::parseValue<bool>(_value));
235 
237  else if (_key == "CanvasAlign")
238  setCanvasAlign(utility::parseValue<Align>(_value));
239 
241  else if (_key == "CanvasSize")
242  setCanvasSize(utility::parseValue<IntSize>(_value));
243 
244  else
245  {
246  Base::setPropertyOverride(_key, _value);
247  return;
248  }
249 
250  eventChangeProperty(this, _key, _value);
251  }
252 
253  void ScrollView::setPosition(int _left, int _top)
254  {
255  setPosition(IntPoint(_left, _top));
256  }
257 
258  void ScrollView::setSize(int _width, int _height)
259  {
260  setSize(IntSize(_width, _height));
261  }
262 
263  void ScrollView::setCoord(int _left, int _top, int _width, int _height)
264  {
265  setCoord(IntCoord(_left, _top, _width, _height));
266  }
267 
269  {
270  return mVisibleVScroll;
271  }
272 
274  {
275  return mVisibleHScroll;
276  }
277 
279  {
280  return mContentAlign;
281  }
282 
283  void ScrollView::setCanvasSize(int _width, int _height)
284  {
285  setCanvasSize(IntSize(_width, _height));
286  }
287 
288  Align ScrollView::getContentAlign()
289  {
290  return mContentAlign;
291  }
292 
294  {
295  IntPoint value = _value;
296  IntPoint currentOffset = mRealClient->getPosition();
297 
298  if (mHRange != 0)
299  {
300  if (value.left > 0)
301  value.left = 0;
302  else if (value.left < -(int)mHRange)
303  value.left = -(int)mHRange;
304  }
305  else
306  {
307  value.left = currentOffset.left;
308  }
309 
310  if (mVRange != 0)
311  {
312  if (value.top > 0)
313  value.top = 0;
314  else if (value.top < -(int)mVRange)
315  value.top = -(int)mVRange;
316  }
317  else
318  {
319  value.top = currentOffset.top;
320  }
321 
322  if (mHScroll != nullptr)
324 
325  if (mVScroll != nullptr)
326  mVScroll->setScrollPosition(-value.top);
327 
328  mRealClient->setPosition(value);
329  }
330 
332  {
333  return mRealClient->getPosition();
334  }
335 
337  {
338  return mClient == nullptr ? getCoord() : mClient->getCoord();
339  }
340 
342  {
343  return mVScroll;
344  }
345 
346 } // namespace MyGUI
MyGUI::WidgetInput::setNeedKeyFocus
void setNeedKeyFocus(bool _value)
Definition: MyGUI_WidgetInput.cpp:156
MyGUI::Widget::createWidget
T * createWidget(const std::string &_skin, const IntCoord &_coord, Align _align, const std::string &_name="")
Definition: MyGUI_Widget.h:67
MyGUI::ScrollView::setSize
virtual void setSize(const IntSize &_value)
Definition: MyGUI_ScrollView.cpp:79
MyGUI::ScrollView::setPosition
virtual void setPosition(const IntPoint &_value)
Definition: MyGUI_ScrollView.cpp:74
MyGUI::IntCoord
types::TCoord< int > IntCoord
Definition: MyGUI_Types.h:35
MyGUI::ScrollView::getCanvasAlign
Align getCanvasAlign() const
Definition: MyGUI_ScrollView.cpp:278
MyGUI::SCROLL_VIEW_MOUSE_WHEEL
const int SCROLL_VIEW_MOUSE_WHEEL
Definition: MyGUI_ScrollView.cpp:16
MyGUI::ScrollBar::eventScrollChangePosition
EventHandle_ScrollBarPtrSizeT eventScrollChangePosition
Definition: MyGUI_ScrollBar.h:130
MyGUI::Widget::setPosition
virtual void setPosition(const IntPoint &_value)
Definition: MyGUI_Widget.cpp:635
MyGUI::ScrollView::getViewOffset
IntPoint getViewOffset() const
Definition: MyGUI_ScrollView.cpp:331
MyGUI::ScrollBar
ScrollBar properties. Skin childs. ScrollBar widget description should be here.
Definition: MyGUI_ScrollBar.h:23
MyGUI::types::TPoint::top
T top
Definition: MyGUI_TPoint.h:21
MyGUI::ScrollViewBase::mVScroll
ScrollBar * mVScroll
Definition: MyGUI_ScrollViewBase.h:44
MyGUI::ScrollViewBase::updateScrollPosition
void updateScrollPosition()
Definition: MyGUI_ScrollViewBase.cpp:234
MyGUI::ScrollViewBase::mClient
Widget * mClient
Definition: MyGUI_ScrollViewBase.h:46
MyGUI::ScrollView::ScrollView
ScrollView()
Definition: MyGUI_ScrollView.cpp:19
MyGUI::Widget::eventChangeProperty
EventHandle_WidgetStringString eventChangeProperty
Definition: MyGUI_Widget.h:266
MyGUI::ScrollViewBase::mChangeContentByResize
bool mChangeContentByResize
Definition: MyGUI_ScrollViewBase.h:55
MyGUI_ScrollView.h
MyGUI::Widget
Widget properties. Skin childs. Widget widget description should be here.
Definition: MyGUI_Widget.h:29
MyGUI::types::TPoint< int >
MyGUI_ISubWidgetText.h
MyGUI::IntSize
types::TSize< int > IntSize
Definition: MyGUI_Types.h:29
MyGUI::Align
Definition: MyGUI_Align.h:19
MyGUI::ICroppedRectangle::getPosition
IntPoint getPosition() const
Definition: MyGUI_ICroppedRectangle.h:51
MyGUI::ScrollView::getCanvasSize
IntSize getCanvasSize()
Definition: MyGUI_ScrollView.cpp:221
MyGUI::ScrollView::mRealClient
Widget * mRealClient
Definition: MyGUI_ScrollView.h:106
MyGUI::ScrollView::isVisibleHScroll
bool isVisibleHScroll() const
Definition: MyGUI_ScrollView.cpp:273
MyGUI::ScrollView::setPropertyOverride
virtual void setPropertyOverride(const std::string &_key, const std::string &_value)
Definition: MyGUI_ScrollView.cpp:226
MyGUI_Precompiled.h
MyGUI::ScrollView::setCanvasSize
void setCanvasSize(const IntSize &_value)
Definition: MyGUI_ScrollView.cpp:214
MyGUI::Align::Default
@ Default
Definition: MyGUI_Align.h:36
MyGUI::ScrollView::setCanvasAlign
void setCanvasAlign(Align _value)
Definition: MyGUI_ScrollView.cpp:208
MyGUI::ScrollView::shutdownOverride
virtual void shutdownOverride()
Definition: MyGUI_ScrollView.cpp:64
MyGUI::IntPoint
types::TPoint< int > IntPoint
Definition: MyGUI_Types.h:26
MyGUI::types::TPoint::left
T left
Definition: MyGUI_TPoint.h:20
MyGUI::ScrollView::isVisibleVScroll
bool isVisibleVScroll() const
Definition: MyGUI_ScrollView.cpp:268
MyGUI::ICroppedRectangle::getCoord
const IntCoord & getCoord() const
Definition: MyGUI_ICroppedRectangle.h:61
MyGUI::ScrollView::notifyScrollChangePosition
void notifyScrollChangePosition(ScrollBar *_sender, size_t _position)
Definition: MyGUI_ScrollView.cpp:93
MyGUI::ScrollViewBase::mVRange
size_t mVRange
Definition: MyGUI_ScrollViewBase.h:51
MyGUI_ScrollBar.h
MyGUI::ScrollBar::setScrollPosition
void setScrollPosition(size_t _value)
Definition: MyGUI_ScrollBar.cpp:347
MyGUI::ScrollViewBase::mHRange
size_t mHRange
Definition: MyGUI_ScrollViewBase.h:52
MyGUI::ScrollViewBase::mHScroll
ScrollBar * mHScroll
Definition: MyGUI_ScrollViewBase.h:45
MyGUI::ScrollView::setVisibleHScroll
void setVisibleHScroll(bool _value)
Definition: MyGUI_ScrollView.cpp:202
MyGUI::types::TSize< int >
nullptr
#define nullptr
Definition: MyGUI_Prerequest.h:29
MyGUI::ScrollView::getVScroll
ScrollBar * getVScroll()
Definition: MyGUI_ScrollView.cpp:341
MyGUI::Widget::setSize
virtual void setSize(const IntSize &_value)
Definition: MyGUI_Widget.cpp:652
MyGUI::ScrollView::initialiseOverride
virtual void initialiseOverride()
Definition: MyGUI_ScrollView.cpp:26
MyGUI::Widget::assignWidget
void assignWidget(T *&_widget, const std::string &_name)
Definition: MyGUI_Widget.h:328
MyGUI::ScrollView::notifyMouseWheel
void notifyMouseWheel(Widget *_sender, int _rel)
Definition: MyGUI_ScrollView.cpp:112
MyGUI::ScrollView::mContentAlign
Align mContentAlign
Definition: MyGUI_ScrollView.h:105
MyGUI::ScrollView::setCoord
virtual void setCoord(const IntCoord &_value)
Definition: MyGUI_ScrollView.cpp:86
MyGUI_SkinManager.h
MyGUI::SCROLL_VIEW_SCROLL_PAGE
const int SCROLL_VIEW_SCROLL_PAGE
Definition: MyGUI_ScrollView.cpp:17
MyGUI::ScrollViewBase::mVisibleVScroll
bool mVisibleVScroll
Definition: MyGUI_ScrollViewBase.h:49
MyGUI::ScrollViewBase::mVisibleHScroll
bool mVisibleHScroll
Definition: MyGUI_ScrollViewBase.h:48
MyGUI::types::TCoord< int >
MyGUI::ScrollView::setVisibleVScroll
void setVisibleVScroll(bool _value)
Definition: MyGUI_ScrollView.cpp:196
MyGUI::ScrollView::updateView
void updateView()
Definition: MyGUI_ScrollView.cpp:190
MyGUI::ScrollView::setViewOffset
void setViewOffset(const IntPoint &_value)
Definition: MyGUI_ScrollView.cpp:293
MyGUI::WidgetInput::eventMouseWheel
EventHandle_WidgetInt eventMouseWheel
Definition: MyGUI_WidgetInput.h:145
MyGUI
Definition: MyGUI_ActionController.h:14
MyGUI::ScrollViewBase::updateScrollSize
void updateScrollSize()
Definition: MyGUI_ScrollViewBase.cpp:30
newDelegate
MYGUI_TEMPLATE MYGUI_TEMPLATE_PARAMS delegates::IDelegateMYGUI_SUFFIX MYGUI_TEMPLATE_ARGS * newDelegate(void(*_func)(MYGUI_PARAMS))
Definition: MyGUI_DelegateImplement.h:117
MyGUI::ScrollView::getViewCoord
IntCoord getViewCoord() const
Definition: MyGUI_ScrollView.cpp:336
MyGUI::ICroppedRectangle::getSize
IntSize getSize() const
Definition: MyGUI_ICroppedRectangle.h:56
MyGUI::Widget::setWidgetClient
void setWidgetClient(Widget *_widget)
Definition: MyGUI_Widget.cpp:1134