/
NavigationBarWidget.cpp
104 lines (89 loc) · 2.95 KB
/
NavigationBarWidget.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include "NavigationBarWidget.h"
NavigationBarWidget::NavigationBarWidget(QWidget *parent)
:
QWidget(parent),
iSlidingTimer(0)
{
ui.setupUi(this);
// Creating the Timer
iSlidingTimer = new QTimer(this);
// Second-phase Initialization
QTimer::singleShot(0, this, SLOT(initialize()));
}
void NavigationBarWidget::initialize()
{
// Connecting necessary Signals to Slots
connect(iSlidingTimer, SIGNAL(timeout()), this, SLOT(slideTick()));
connect(ui.SlidePushButton, SIGNAL(clicked()), this, SLOT(propagateSlideClicked()));
connect(ui.SlidePushButton, SIGNAL(clicked()), this, SLOT(slide()));
// Attaching Signals and Slots for Zooming
connect(ui.ZoomInPushButton, SIGNAL(clicked()), this, SLOT(zoomIn()));
connect(ui.ZoomOutPushButton, SIGNAL(clicked()), this, SLOT(zoomOut()));
// Connecting internal Signals with external ones, for encapsulation
connect(ui.BackPushButton, SIGNAL(clicked()), this, SIGNAL(backClicked()));
connect(ui.ForwardPushButton, SIGNAL(clicked()), this, SIGNAL(forwardClicked()));
connect(ui.HomePushButton, SIGNAL(clicked()), this, SIGNAL(homeClicked()));
connect(ui.ZoomSlider, SIGNAL(valueChanged(int)), this, SIGNAL(zoomLevelChanged(int)));
}
NavigationBarWidget::~NavigationBarWidget()
{
// Nothing to do here
}
bool NavigationBarWidget::isFullyVisible()
{
return this->y() == iSlidingVPositionMin;
}
void NavigationBarWidget::slide()
{
// Understand in which position it is at the beginning of the Animation
iSlidingToInvisible = isFullyVisible();
iSlidingVPosition = this->y();
iSlidingTimer->start(ANIMATION_TICK_FREQUENCY); // "Tick" every 10ms
}
void NavigationBarWidget::slideToVisible()
{
if ( !isFullyVisible() )
slide();
}
void NavigationBarWidget::slideToInvisible()
{
if ( isFullyVisible() )
slide();
}
void NavigationBarWidget::propagateSlideClicked()
{
if ( isFullyVisible() )
emit slideToInvisibleClicked();
else
emit slideToVisibleClicked();
}
void NavigationBarWidget::slideTick()
{
iSlidingVPosition += iSlidingToInvisible ? // Normalizing the Piece
qMin(+ANIMATION_SLIDING_PIECE, iSlidingVPositionMax - iSlidingVPosition) :
qMax(-ANIMATION_SLIDING_PIECE, iSlidingVPositionMin - iSlidingVPosition);
this->move(0, iSlidingVPosition); // Move only vertically
if (
( iSlidingToInvisible && iSlidingVPosition == iSlidingVPositionMax )
|| ( !iSlidingToInvisible && iSlidingVPosition == iSlidingVPositionMin )
)
{
iSlidingTimer->stop();
}
}
void NavigationBarWidget::zoomIn()
{
ui.ZoomSlider->setValue( ui.ZoomSlider->value() + ui.ZoomSlider->singleStep() );
}
void NavigationBarWidget::zoomOut()
{
ui.ZoomSlider->setValue( ui.ZoomSlider->value() - ui.ZoomSlider->singleStep() );
}
void NavigationBarWidget::resizeEvent(QResizeEvent *event)
{
QWidget::resizeEvent(event);
// Calculating the Sliding "limits"
iSlidingVPositionMin = this->y();
iSlidingVPositionMax =
this->y() + this->height() - ui.SlidePushButton->y() - ui.SlidePushButton->height()/2;
}