Falkon Develop
Cross-platform Qt-based web browser
animatedwidget.cpp
Go to the documentation of this file.
1/* ============================================================
2* Falkon - Qt web browser
3* Copyright (C) 2010-2014 David Rosca <nowrep@gmail.com>
4*
5* This program is free software: you can redistribute it and/or modify
6* it under the terms of the GNU General Public License as published by
7* the Free Software Foundation, either version 3 of the License, or
8* (at your option) any later version.
9*
10* This program is distributed in the hope that it will be useful,
11* but WITHOUT ANY WARRANTY; without even the implied warranty of
12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13* GNU General Public License for more details.
14*
15* You should have received a copy of the GNU General Public License
16* along with this program. If not, see <http://www.gnu.org/licenses/>.
17* ============================================================ */
18#include "animatedwidget.h"
19
20#include <QResizeEvent>
21
22AnimatedWidget::AnimatedWidget(const Direction &direction, int duration, QWidget* parent)
23 : QWidget(parent)
24 , m_direction(direction)
25 , m_stepHeight(0)
26 , m_stepY(0)
27 , m_startY(0)
28 , m_widget(new QWidget(this))
29{
30 m_timeLine.setDuration(duration);
31 m_timeLine.setFrameRange(0, 100);
32 connect(&m_timeLine, &QTimeLine::frameChanged, this, &AnimatedWidget::animateFrame);
33
34 setMaximumHeight(0);
35}
36
38{
39 if (m_timeLine.state() == QTimeLine::Running) {
40 return;
41 }
42
43 int shown = 0;
44 int hidden = 0;
45
46 if (m_direction == Down) {
47 shown = 0;
48 hidden = -m_widget->height();
49 }
50
51 m_widget->move(QPoint(m_widget->pos().x(), hidden));
52
53 m_stepY = (hidden - shown) / 100.0;
54 m_startY = hidden;
55 m_stepHeight = m_widget->height() / 100.0;
56
57 m_timeLine.setDirection(QTimeLine::Forward);
58 m_timeLine.start();
59}
60
61void AnimatedWidget::animateFrame(int frame)
62{
63 setFixedHeight(frame * m_stepHeight);
64 m_widget->move(pos().x(), m_startY - frame * m_stepY);
65}
66
68{
69 if (m_timeLine.state() == QTimeLine::Running) {
70 return;
71 }
72
73 m_timeLine.setDirection(QTimeLine::Backward);
74 m_timeLine.start();
75
76 connect(&m_timeLine, &QTimeLine::finished, this, &QWidget::close);
77
78 QWidget* p = parentWidget();
79 if (p) {
80 p->setFocus();
81 }
82}
83
84void AnimatedWidget::resizeEvent(QResizeEvent* event)
85{
86 if (event->size().width() != m_widget->width()) {
87 m_widget->resize(event->size().width(), m_widget->height());
88 }
89
90 QWidget::resizeEvent(event);
91}
AnimatedWidget(const Direction &direction=Down, int duration=300, QWidget *parent=nullptr)