MyGUI_ScrollViewBase.cpp
Go to the documentation of this file.
/*
* This source file is part of MyGUI. For the latest info, see http://mygui.info/
* Distributed under the MIT License
* (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
*/
#include "MyGUI_Precompiled.h"
#include "MyGUI_ScrollViewBase.h"
#include "MyGUI_ScrollBar.h"
namespace MyGUI
{
void ScrollViewBase::updateScrollSize()
{
if (mScrollViewClient == nullptr)
return;
eraseContent();
IntSize contentSize = getContentSize();
IntSize viewSize = getViewSize();
// вертикальный контент не помещается
if (contentSize.height > viewSize.height)
{
if (mVScroll != nullptr)
{
if (!mVScroll->getVisible() && mVisibleVScroll)
{
mVScroll->setVisible(true);
mScrollViewClient->setSize(
mScrollViewClient->getWidth() - mVScroll->getWidth(),
mScrollViewClient->getHeight());
// размер может измениться
if (mChangeContentByResize)
{
eraseContent();
contentSize = getContentSize();
viewSize = getViewSize();
}
if (mHScroll != nullptr)
{
mHScroll->setSize(mHScroll->getWidth() - mVScroll->getWidth(), mHScroll->getHeight());
// если показали вертикальный скрол бар, уменьшилось вью по горизонтали,
// пересчитываем горизонтальный скрол на предмет показа
if ((contentSize.width > viewSize.width) && (!mHScroll->getVisible()) && (mVisibleHScroll))
{
mHScroll->setVisible(true);
mScrollViewClient->setSize(
mScrollViewClient->getWidth(),
mScrollViewClient->getHeight() - mHScroll->getHeight());
mVScroll->setSize(mVScroll->getWidth(), mVScroll->getHeight() - mHScroll->getHeight());
// размер может измениться
if (mChangeContentByResize)
{
eraseContent();
contentSize = getContentSize();
viewSize = getViewSize();
}
}
}
}
}
}
// вертикальный контент помещается
else
{
if (mVScroll != nullptr)
{
if (mVScroll->getVisible())
{
mVScroll->setVisible(false);
mScrollViewClient->setSize(
mScrollViewClient->getWidth() + mVScroll->getWidth(),
mScrollViewClient->getHeight());
// размер может измениться
if (mChangeContentByResize)
{
eraseContent();
contentSize = getContentSize();
viewSize = getViewSize();
}
if (mHScroll != nullptr)
{
mHScroll->setSize(mHScroll->getWidth() + mVScroll->getWidth(), mHScroll->getHeight());
// если скрыли вертикальный скрол бар, увеличилось вью по горизонтали,
// пересчитываем горизонтальный скрол на предмет скрытия
if ((contentSize.width <= viewSize.width) && (mHScroll->getVisible()))
{
mHScroll->setVisible(false);
mScrollViewClient->setSize(
mScrollViewClient->getWidth(),
mScrollViewClient->getHeight() + mHScroll->getHeight());
mVScroll->setSize(mVScroll->getWidth(), mVScroll->getHeight() + mHScroll->getHeight());
// размер может измениться
if (mChangeContentByResize)
{
eraseContent();
contentSize = getContentSize();
viewSize = getViewSize();
}
}
}
}
}
}
// горизонтальный контент не помещается
if (contentSize.width > viewSize.width)
{
if (mHScroll != nullptr)
{
if (!mHScroll->getVisible() && mVisibleHScroll)
{
mHScroll->setVisible(true);
mScrollViewClient->setSize(
mScrollViewClient->getWidth(),
mScrollViewClient->getHeight() - mHScroll->getHeight());
// размер может измениться
if (mChangeContentByResize)
{
eraseContent();
contentSize = getContentSize();
viewSize = getViewSize();
}
if (mVScroll != nullptr)
{
mVScroll->setSize(mVScroll->getWidth(), mVScroll->getHeight() - mHScroll->getHeight());
// если показали горизонтальный скрол бар, уменьшилось вью по вертикали,
// пересчитываем вертикальный скрол на предмет показа
if ((contentSize.height > viewSize.height) && (!mVScroll->getVisible()) && (mVisibleVScroll))
{
mVScroll->setVisible(true);
mScrollViewClient->setSize(
mScrollViewClient->getWidth() - mVScroll->getWidth(),
mScrollViewClient->getHeight());
mHScroll->setSize(mHScroll->getWidth() - mVScroll->getWidth(), mHScroll->getHeight());
// размер может измениться
if (mChangeContentByResize)
{
eraseContent();
contentSize = getContentSize();
viewSize = getViewSize();
}
}
}
}
}
}
// горизонтальный контент помещается
else
{
if (mHScroll != nullptr)
{
if (mHScroll->getVisible())
{
mHScroll->setVisible(false);
mScrollViewClient->setSize(
mScrollViewClient->getWidth(),
mScrollViewClient->getHeight() + mHScroll->getHeight());
// размер может измениться
if (mChangeContentByResize)
{
eraseContent();
contentSize = getContentSize();
viewSize = getViewSize();
}
if (mVScroll != nullptr)
{
mVScroll->setSize(mVScroll->getWidth(), mVScroll->getHeight() + mHScroll->getHeight());
// если скрыли горизонтальный скрол бар, увеличилось вью по вертикали,
// пересчитываем вертикальный скрол на предмет скрытия
if ((contentSize.height <= viewSize.height) && (mVScroll->getVisible()))
{
mVScroll->setVisible(false);
mScrollViewClient->setSize(
mScrollViewClient->getWidth() + mVScroll->getWidth(),
mScrollViewClient->getHeight());
mHScroll->setSize(mHScroll->getWidth() + mVScroll->getWidth(), mHScroll->getHeight());
// размер может измениться
if (mChangeContentByResize)
{
eraseContent();
contentSize = getContentSize();
viewSize = getViewSize();
}
}
}
}
}
}
mVRange = (viewSize.height >= contentSize.height) ? 0 : contentSize.height - viewSize.height;
mHRange = (viewSize.width >= contentSize.width) ? 0 : contentSize.width - viewSize.width;
if (mVScroll != nullptr)
{
size_t page = getVScrollPage();
mVScroll->setScrollPage(page);
mVScroll->setScrollViewPage(viewSize.height > (int)page ? viewSize.height : page);
mVScroll->setScrollRange(mVRange + 1);
if (contentSize.height)
mVScroll->setTrackSize(
int(float(mVScroll->getLineSize() * viewSize.height) / float(contentSize.height)));
}
if (mHScroll != nullptr)
{
size_t page = getHScrollPage();
mHScroll->setScrollPage(page);
mHScroll->setScrollViewPage(viewSize.width > (int)page ? viewSize.width : page);
mHScroll->setScrollRange(mHRange + 1);
if (contentSize.width)
mHScroll->setTrackSize(int(float(mHScroll->getLineSize() * viewSize.width) / float(contentSize.width)));
}
}
void ScrollViewBase::updateScrollPosition()
{
// размер контекста
IntSize contentSize = getContentSize();
// текущее смещение контекста
IntPoint contentPoint = getContentPosition();
// расчетное смещение
IntPoint offset = contentPoint;
IntSize viewSize = getViewSize();
Align align = getContentAlign();
if (contentSize.width > viewSize.width)
{
// максимальный выход влево
if ((offset.left + viewSize.width) > contentSize.width)
{
offset.left = contentSize.width - viewSize.width;
}
// максимальный выход вправо
else if (offset.left < 0)
{
offset.left = 0;
}
}
else
{
if (align.isLeft())
{
offset.left = 0;
}
else if (align.isRight())
{
offset.left = contentSize.width - viewSize.width;
}
else
{
offset.left = (contentSize.width - viewSize.width) / 2;
}
}
if (contentSize.height > viewSize.height)
{
// максимальный выход вверх
if ((offset.top + viewSize.height) > contentSize.height)
{
offset.top = contentSize.height - viewSize.height;
}
// максимальный выход вниз
else if (offset.top < 0)
{
offset.top = 0;
}
}
else
{
if (align.isTop())
{
offset.top = 0;
}
else if (align.isBottom())
{
offset.top = contentSize.height - viewSize.height;
}
else
{
offset.top = (contentSize.height - viewSize.height) / 2;
}
}
if (offset != contentPoint)
{
if (nullptr != mVScroll)
mVScroll->setScrollPosition(offset.top);
if (nullptr != mHScroll)
mHScroll->setScrollPosition(offset.left);
setContentPosition(offset);
}
}
IntSize ScrollViewBase::getContentSize() const
{
return {};
}
IntPoint ScrollViewBase::getContentPosition() const
{
return {};
}
void ScrollViewBase::setContentPosition(const IntPoint& _value)
{
}
IntSize ScrollViewBase::getViewSize() const
{
return {};
}
size_t ScrollViewBase::getHScrollPage() const
{
return 1;
}
size_t ScrollViewBase::getVScrollPage() const
{
return 1;
}
Align ScrollViewBase::getContentAlign() const
{
return Align::Center;
}
void ScrollViewBase::eraseContent()
{
}
} // namespace MyGUI
MyGUI_Precompiled.h
MyGUI_ScrollBar.h
MyGUI_ScrollViewBase.h
MyGUI::ScrollViewBase::getViewSize
virtual IntSize getViewSize() const
Definition MyGUI_ScrollViewBase.cpp:329
MyGUI::ScrollViewBase::mHScroll
ScrollBar * mHScroll
Definition MyGUI_ScrollViewBase.h:44
MyGUI::ScrollViewBase::mVRange
size_t mVRange
Definition MyGUI_ScrollViewBase.h:50
MyGUI::ScrollViewBase::getHScrollPage
virtual size_t getHScrollPage() const
Definition MyGUI_ScrollViewBase.cpp:334
MyGUI::ScrollViewBase::updateScrollPosition
void updateScrollPosition()
Definition MyGUI_ScrollViewBase.cpp:234
MyGUI::ScrollViewBase::setContentPosition
virtual void setContentPosition(const IntPoint &_value)
Definition MyGUI_ScrollViewBase.cpp:325
MyGUI::ScrollViewBase::mHRange
size_t mHRange
Definition MyGUI_ScrollViewBase.h:51
MyGUI::ScrollViewBase::mScrollViewClient
Widget * mScrollViewClient
Definition MyGUI_ScrollViewBase.h:45
MyGUI::ScrollViewBase::mVisibleVScroll
bool mVisibleVScroll
Definition MyGUI_ScrollViewBase.h:48
MyGUI::ScrollViewBase::getContentPosition
virtual IntPoint getContentPosition() const
Definition MyGUI_ScrollViewBase.cpp:320
MyGUI::ScrollViewBase::mChangeContentByResize
bool mChangeContentByResize
Definition MyGUI_ScrollViewBase.h:54
MyGUI::ScrollViewBase::mVisibleHScroll
bool mVisibleHScroll
Definition MyGUI_ScrollViewBase.h:47
MyGUI::ScrollViewBase::getContentAlign
virtual Align getContentAlign() const
Definition MyGUI_ScrollViewBase.cpp:344
MyGUI::ScrollViewBase::getContentSize
virtual IntSize getContentSize() const
Definition MyGUI_ScrollViewBase.cpp:315
MyGUI::ScrollViewBase::updateScrollSize
void updateScrollSize()
Definition MyGUI_ScrollViewBase.cpp:14
MyGUI::ScrollViewBase::mVScroll
ScrollBar * mVScroll
Definition MyGUI_ScrollViewBase.h:43
MyGUI::ScrollViewBase::eraseContent
virtual void eraseContent()
Definition MyGUI_ScrollViewBase.cpp:349
MyGUI::ScrollViewBase::getVScrollPage
virtual size_t getVScrollPage() const
Definition MyGUI_ScrollViewBase.cpp:339
MyGUI
Definition MyGUI_ActionController.h:15
MyGUI::IntPoint
types::TPoint< int > IntPoint
Definition MyGUI_Types.h:27
MyGUI::IntSize
types::TSize< int > IntSize
Definition MyGUI_Types.h:30
MyGUI::Align
Definition MyGUI_Align.h:20
MyGUI::Align::Center
@ Center
Definition MyGUI_Align.h:25
MyGUI::Align::isTop
bool isTop() const
Definition MyGUI_Align.h:74
MyGUI::Align::isRight
bool isRight() const
Definition MyGUI_Align.h:64
MyGUI::Align::isLeft
bool isLeft() const
Definition MyGUI_Align.h:59
MyGUI::Align::isBottom
bool isBottom() const
Definition MyGUI_Align.h:79
MyGUI::types::TPoint::left
T left
Definition MyGUI_TPoint.h:19
MyGUI::types::TPoint::top
T top
Definition MyGUI_TPoint.h:20
MyGUI::types::TSize::width
T width
Definition MyGUI_TSize.h:19
MyGUI::types::TSize::height
T height
Definition MyGUI_TSize.h:20