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
46
47
57
58
59
60
61
62
63
64
65
66
67
68
69
70
76
77
83
84
91
92
96
97
102
103
104
105
109
110
111
112
113
114
115
120
121
122
123
124
125
126
127
128
132
133
134
135
136
137
138
143
144
145
146
147
148
149
150
166
167
183
184
188
189
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
215
216
217
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
/* ... */
#include <gui/common/Carousel.hpp>
#include <BitmapDatabase.hpp>
Carousel::Carousel() :
currentAnimation(NO_ANIMATION),
carouselAnimationDuration(10),
currentNumberOfElements(0),
carouselAnimationEndedAction(0),
zoomAnimationCallback(this, &Carousel::handleZoomAnimationEvent)
{
add(visibleElements[0]);
add(visibleElements[6]);
add(visibleElements[1]);
add(visibleElements[5]);
add(visibleElements[2]);
add(visibleElements[4]);
add(visibleElements[3]);
visibleElements[0].setAnimationEndedCallback(zoomAnimationCallback);
visibleElements[2].setAnimationEndedCallback(zoomAnimationCallback);
visibleElements[6].setAnimationEndedCallback(zoomAnimationCallback);
}{ ... }
Carousel::~Carousel()
{
}{ ... }
void Carousel::setHighlightedNoAnimation()
{
for (int i = 1; i < NUMBER_OF_VISIBLE_ELEMENTS-1; i++)
{
if (i != 3)
{
visibleElements[i].setPosition(visibleElements[i].getX() + visibleElements[i].getWidth()/2, visibleElements[i].getY() + visibleElements[i].getHeight()/2, 0, 0);
}if (i != 3) { ... }
}for (int i = 1; i < NUMBER_OF_VISIBLE_ELEMENTS-1; i++) { ... }
}{ ... }
void Carousel::setPositionOfCarouselElement(uint8_t index, int16_t x, int16_t y, uint16_t width, uint16_t height)
{
assert(index < NUMBER_OF_VISIBLE_ELEMENTS && "Illegal index of visible element");
visibleElementPositions[index].x = x;
visibleElementPositions[index].y = y;
visibleElementPositions[index].width = width;
visibleElementPositions[index].height = height;
visibleElements[index].setPosition(x, y, width, height);
}{ ... }
int16_t Carousel::getXPositionOfVisibleElement(uint8_t index)
{
assert(index < NUMBER_OF_VISIBLE_ELEMENTS && "Illegal index of visible element");
return visibleElementPositions[index].x;
}{ ... }
int16_t Carousel::getYPositionOfVisibleElement(uint8_t index)
{
assert(index < NUMBER_OF_VISIBLE_ELEMENTS && "Illegal index of visible element");
return visibleElementPositions[index].y;
}{ ... }
void Carousel::addElement(const Bitmap& smallBitmap, const Bitmap& mediumBitmap, const Bitmap& largeBitmap)
{
elements[currentNumberOfElements].smallBmp = smallBitmap;
elements[currentNumberOfElements].mediumBmp = mediumBitmap;
elements[currentNumberOfElements].largeBmp = largeBitmap;
currentNumberOfElements++;
}{ ... }
void Carousel::setDuration(uint16_t duration)
{
carouselAnimationDuration = duration;
}{ ... }
void Carousel::setSelectedElement(uint8_t index)
{
selectedElement = index;
updateVisibleElements();
}{ ... }
void Carousel::selectedNext()
{
if (currentAnimation != NO_ANIMATION)
{
return;
}if (currentAnimation != NO_ANIMATION) { ... }
currentAnimation = ANIMATE_LEFT;
visibleElements[1].startFadeAnimation(0, carouselAnimationDuration);
visibleElements[6].startFadeAnimation(255, carouselAnimationDuration);
for (int i = 1; i < NUMBER_OF_VISIBLE_ELEMENTS; i++)
{
visibleElements[i].startZoomAndMoveAnimation(visibleElementPositions[i-1].x, visibleElementPositions[i-1].y, visibleElementPositions[i-1].width, visibleElementPositions[i-1].height, carouselAnimationDuration, ZoomAnimationImage::FIXED_LEFT_AND_TOP);
}for (int i = 1; i < NUMBER_OF_VISIBLE_ELEMENTS; i++) { ... }
remove(visibleElements[4]);
insert(&visibleElements[3], visibleElements[4]);
}{ ... }
void Carousel::selectedPrevious()
{
if (currentAnimation != NO_ANIMATION)
{
return;
}if (currentAnimation != NO_ANIMATION) { ... }
currentAnimation = ANIMATE_RIGHT;
visibleElements[0].startFadeAnimation(255, carouselAnimationDuration);
visibleElements[5].startFadeAnimation(0, carouselAnimationDuration);
for (int i = 0; i < NUMBER_OF_VISIBLE_ELEMENTS-1; i++)
{
visibleElements[i].startZoomAndMoveAnimation(visibleElementPositions[i+1].x, visibleElementPositions[i+1].y, visibleElementPositions[i+1].width, visibleElementPositions[i+1].height, carouselAnimationDuration, ZoomAnimationImage::FIXED_LEFT_AND_TOP, EasingEquations::linearEaseNone, EasingEquations::linearEaseNone, EasingEquations::quadEaseIn);
}for (int i = 0; i < NUMBER_OF_VISIBLE_ELEMENTS-1; i++) { ... }
remove(visibleElements[2]);
insert(&visibleElements[3], visibleElements[2]);
}{ ... }
void Carousel::highlightSelectedElement()
{
if (currentAnimation != NO_ANIMATION)
{
return;
}if (currentAnimation != NO_ANIMATION) { ... }
currentAnimation = ANIMATE_ELEMENT_SELECTED;
for (int i = 1; i < NUMBER_OF_VISIBLE_ELEMENTS-1; i++)
{
if (i != 3)
{
visibleElements[i].startZoomAnimation(0, 0, carouselAnimationDuration, ZoomAnimationImage::FIXED_CENTER);
}if (i != 3) { ... }
}for (int i = 1; i < NUMBER_OF_VISIBLE_ELEMENTS-1; i++) { ... }
}{ ... }
void Carousel::cancelHighlightOfSelectedElement()
{
if (currentAnimation != NO_ANIMATION)
{
return;
}if (currentAnimation != NO_ANIMATION) { ... }
currentAnimation = ANIMATE_ELEMENT_SELECTED;
for (int i = 1; i < NUMBER_OF_VISIBLE_ELEMENTS-1; i++)
{
if (i != 3)
{
visibleElements[i].startZoomAnimation(visibleElementPositions[i].width, visibleElementPositions[i].height, carouselAnimationDuration, ZoomAnimationImage::FIXED_CENTER);
}if (i != 3) { ... }
}for (int i = 1; i < NUMBER_OF_VISIBLE_ELEMENTS-1; i++) { ... }
}{ ... }
uint8_t Carousel::prevElement(uint8_t index)
{
return (index == 0) ? currentNumberOfElements - 1 : index - 1;
}{ ... }
uint8_t Carousel::nextElement(uint8_t index)
{
return (index == currentNumberOfElements-1) ? 0 : index + 1;
}{ ... }
void Carousel::handleZoomAnimationEvent(const ZoomAnimationImage& element)
{
if (currentAnimation == ANIMATE_LEFT)
{
remove(visibleElements[4]);
insert(&visibleElements[2], visibleElements[4]);
setSelectedElement(nextElement(selectedElement));
}if (currentAnimation == ANIMATE_LEFT) { ... }
else if (currentAnimation == ANIMATE_RIGHT)
{
remove(visibleElements[2]);
insert(&visibleElements[5], visibleElements[2]);
setSelectedElement(prevElement(selectedElement));
}else if (currentAnimation == ANIMATE_RIGHT) { ... }
else if (currentAnimation == ANIMATE_ELEMENT_SELECTED)
{
}else if (currentAnimation == ANIMATE_ELEMENT_SELECTED) { ... }
currentAnimation = NO_ANIMATION;
if (carouselAnimationEndedAction && carouselAnimationEndedAction->isValid())
{
carouselAnimationEndedAction->execute(*this);
}if (carouselAnimationEndedAction && carouselAnimationEndedAction->isValid()) { ... }
}{ ... }
void Carousel::updateVisibleElements()
{
uint8_t currentElement = prevElement(prevElement(prevElement(selectedElement)));
for (uint8_t i = 0; i < NUMBER_OF_VISIBLE_ELEMENTS; i++)
{
visibleElements[i].setBitmaps(elements[currentElement].smallBmp, elements[currentElement].mediumBmp, elements[currentElement].largeBmp);
visibleElements[i].setPosition(visibleElementPositions[i].x, visibleElementPositions[i].y, visibleElementPositions[i].width, visibleElementPositions[i].height);
visibleElements[i].setAlpha(255);
visibleElements[i].invalidate();
currentElement = nextElement(currentElement);
}for (uint8_t i = 0; i < NUMBER_OF_VISIBLE_ELEMENTS; i++) { ... }
visibleElements[0].setAlpha(0);
visibleElements[NUMBER_OF_VISIBLE_ELEMENTS-1].setAlpha(0);
}{ ... }