-
Notifications
You must be signed in to change notification settings - Fork 60
/
Copy pathwaveanimation.cpp
89 lines (76 loc) · 2.69 KB
/
waveanimation.cpp
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
/***************************************************************************
* QGeoView is a Qt / C ++ widget for visualizing geographic data.
* Copyright (C) 2018-2024 Andrey Yaroshenko.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, see https://www.gnu.org/licenses.
****************************************************************************/
#include "waveanimation.h"
WaveAnimation::WaveAnimation(QGVLayer* layer, double waveWidth, int msecs)
: mLayer(layer)
, mWaveWidth(waveWidth)
, mDuration(msecs)
{
prepareWaves();
}
int WaveAnimation::duration() const
{
return mDuration;
}
void WaveAnimation::updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState)
{
if (newState == QAbstractAnimation::Running && oldState == QAbstractAnimation::Stopped) {
mCurrentWave = 0;
}
if (newState == QAbstractAnimation::Stopped && oldState != QAbstractAnimation::Stopped) {
showWave(mCurrentWave, false);
}
}
void WaveAnimation::updateCurrentTime(int currentTime)
{
double progress = static_cast<double>(currentTime) / duration();
if (direction() == Direction::Backward) {
progress = 1.0 - progress;
}
const int newWave = static_cast<int>(progress * mWaves.length());
if (newWave == mCurrentWave) {
return;
}
showWave(mCurrentWave, false);
mCurrentWave = newWave;
showWave(mCurrentWave, true);
}
void WaveAnimation::prepareWaves()
{
QMap<int, QList<QGVDrawItem*>> waves;
for (int index = 0; index < mLayer->countItems(); index++) {
auto* drawItem = dynamic_cast<QGVDrawItem*>(mLayer->getItem(index));
if (drawItem == nullptr) {
continue;
}
const double x = drawItem->projShape().boundingRect().center().x();
const int wave = static_cast<int>(x / mWaveWidth);
waves[wave].append(drawItem);
}
mWaves = waves.values();
mCurrentWave = 0;
}
void WaveAnimation::showWave(int num, bool show)
{
if (num >= mWaves.size()) {
return;
}
for (QGVDrawItem* drawItem : mWaves[num]) {
drawItem->setFlag(QGV::ItemFlag::Highlighted, show);
}
}