2023-05-30 16:31:45 +02:00
|
|
|
/*
|
|
|
|
* Scrollable.cpp, part of VCMI engine
|
|
|
|
*
|
|
|
|
* Authors: listed in file AUTHORS in main folder
|
|
|
|
*
|
|
|
|
* License: GNU General Public License v2.0 or later
|
|
|
|
* Full text of license available in license.txt file, in main folder
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "StdInc.h"
|
|
|
|
#include "Scrollable.h"
|
2023-05-30 17:10:22 +02:00
|
|
|
|
|
|
|
Scrollable::Scrollable(int used, Point position, Orientation orientation)
|
2023-06-16 11:54:07 +02:00
|
|
|
: CIntObject(used | WHEEL | GESTURE, position)
|
2023-05-30 17:10:22 +02:00
|
|
|
, scrollStep(1)
|
|
|
|
, panningDistanceSingle(32)
|
|
|
|
, panningDistanceAccumulated(0)
|
|
|
|
, orientation(orientation)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2023-06-16 11:54:07 +02:00
|
|
|
void Scrollable::gesture(bool on, const Point & initialPosition, const Point & finalPosition)
|
2023-05-30 17:10:22 +02:00
|
|
|
{
|
|
|
|
panningDistanceAccumulated = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Scrollable::wheelScrolled(int distance)
|
|
|
|
{
|
|
|
|
if (orientation == Orientation::HORIZONTAL)
|
2023-05-30 17:53:51 +02:00
|
|
|
scrollBy(distance * scrollStep);
|
2023-05-30 17:10:22 +02:00
|
|
|
else
|
2023-05-30 17:53:51 +02:00
|
|
|
scrollBy(-distance * scrollStep);
|
2023-05-30 17:10:22 +02:00
|
|
|
}
|
|
|
|
|
2023-05-30 23:33:10 +02:00
|
|
|
void Scrollable::gesturePanning(const Point & initialPosition, const Point & currentPosition, const Point & lastUpdateDistance)
|
2023-05-30 17:10:22 +02:00
|
|
|
{
|
|
|
|
if (orientation == Orientation::HORIZONTAL)
|
2023-05-30 23:33:10 +02:00
|
|
|
panningDistanceAccumulated += -lastUpdateDistance.x;
|
2023-05-30 17:10:22 +02:00
|
|
|
else
|
2023-05-30 23:33:10 +02:00
|
|
|
panningDistanceAccumulated += lastUpdateDistance.y;
|
2023-05-30 17:10:22 +02:00
|
|
|
|
|
|
|
if (-panningDistanceAccumulated > panningDistanceSingle )
|
|
|
|
{
|
|
|
|
int scrollAmount = (-panningDistanceAccumulated) / panningDistanceSingle;
|
|
|
|
scrollBy(-scrollAmount);
|
|
|
|
panningDistanceAccumulated += scrollAmount * panningDistanceSingle;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (panningDistanceAccumulated > panningDistanceSingle )
|
|
|
|
{
|
|
|
|
int scrollAmount = panningDistanceAccumulated / panningDistanceSingle;
|
|
|
|
scrollBy(scrollAmount);
|
|
|
|
panningDistanceAccumulated += -scrollAmount * panningDistanceSingle;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int Scrollable::getScrollStep() const
|
|
|
|
{
|
|
|
|
return scrollStep;
|
|
|
|
}
|
|
|
|
|
|
|
|
Orientation Scrollable::getOrientation() const
|
|
|
|
{
|
|
|
|
return orientation;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Scrollable::scrollNext()
|
|
|
|
{
|
|
|
|
scrollBy(+1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Scrollable::scrollPrev()
|
|
|
|
{
|
|
|
|
scrollBy(-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Scrollable::setScrollStep(int to)
|
|
|
|
{
|
|
|
|
scrollStep = to;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Scrollable::setPanningStep(int to)
|
|
|
|
{
|
|
|
|
panningDistanceSingle = to;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Scrollable::setScrollingEnabled(bool on)
|
|
|
|
{
|
|
|
|
if (on)
|
2023-06-16 11:54:07 +02:00
|
|
|
addUsedEvents(WHEEL | GESTURE);
|
2023-05-30 17:10:22 +02:00
|
|
|
else
|
2023-06-16 11:54:07 +02:00
|
|
|
removeUsedEvents(WHEEL | GESTURE);
|
2023-05-30 17:10:22 +02:00
|
|
|
}
|