progressBox.cpp 3.86 KB
Newer Older
1
2
/***********************************************************************
* Copyright 2003-2004  Max Howell <max.howell@methylblue.com>
3
* Copyright 2008-2009  Martin Sandsmark <martin.sandsmark@kde.org>
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License or (at your option) version 3 or any later version
* accepted by the membership of KDE e.V. (or its successor approved
* by the membership of KDE e.V.), which shall act as a proxy
* defined in Section 14 of version 3 of the license.
*
* 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 General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
***********************************************************************/
21
22
23

#include "progressBox.h"

24
25
#include "scan.h"

26
27
#include <KGlobal>
#include <KGlobalSettings>
28
#include <KColorScheme>
29
30
31
#include <KIO/Job>
#include <KLocale>

32
#include <QtGui/QLabel>
33
34
#include <QPainter>
#include <QtCore/QDebug>
35

36
37
#include <math.h>

38

39
ProgressBox::ProgressBox(QWidget *parent, QObject *part, Filelight::ScanManager *m)
40
        : QWidget(parent)
41
        , m_manager(m)
42
{
43
44
    hide();

45
    setObjectName(QLatin1String( "ProgressBox" ));
46

47
48
    setFont(KGlobalSettings::fixedFont());
    setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
49

50
    setText(999999);
51
52
    setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
    setMinimumSize(200, 200);
53

54
55
56
    connect(&m_timer, SIGNAL(timeout()), SLOT(report()));
    connect(part, SIGNAL(started(KIO::Job*)), SLOT(start()));
    connect(part, SIGNAL(completed()), SLOT(stop()));
Laurent Montel's avatar
Laurent Montel committed
57
    connect(part, SIGNAL(canceled(QString)), SLOT(halt()));
58
59
60
61
62
}

void
ProgressBox::start() //slot
{
63
64
65
    m_timer.start(50); //20 times per second - very smooth
    report();
    show();
66
67
68
69
70
}

void
ProgressBox::report() //slot
{
71
    setText(m_manager->files());
72
    repaint();
73
74
75
76
77
}

void
ProgressBox::stop()
{
78
    m_timer.stop();
79
80
81
82
83
}

void
ProgressBox::halt()
{
84
85
86
    // canceled by stop button
    m_timer.stop();
    QTimer::singleShot(2000, this, SLOT(hide()));
87
88
89
}

void
90
ProgressBox::setText(int files)
91
{
92
93
94
    m_text = i18np("%1 File", "%1 Files", files);
    m_textWidth = fontMetrics().width(m_text);
    m_textHeight = fontMetrics().height();
95
96
}

97
98
99
100
101
static const int pieces = 4;
static const float angleFactor[] = { -0.75, 0.5, 1.0, -0.3 };
static const int length[] = { 30, 40, 50, 60 };
static const int angleOffset[] = { 5760, 0, 0, -5760 };
static const int aLength[] = { 300, 2000, 200, 2000 };
102

103
void ProgressBox::paintEvent(QPaintEvent*)
104
{
105
106
    KColorScheme view = KColorScheme(QPalette::Active, KColorScheme::Tooltip);

107
108
    QPainter paint(this);
    paint.setRenderHint(QPainter::Antialiasing);
109
110
    static int tick = 0;
    tick+=16;
111

112
    for (int i=0; i<pieces; i++) {
113
        const QRect rect(length[i]/2, length[i]/2, 200- length[i], 200-length[i]);
114
        int angle = angleFactor[i] + tick*angleFactor[i];
115
116
117
118
119
120
        QRadialGradient gradient(rect.center(), sin(angle/160.0f) * 100);
        gradient.setColorAt(0, QColor::fromHsv(abs(angle/16) % 360 , 160, 255));
        gradient.setColorAt(1, QColor::fromHsv(abs(angle/16) % 360 , 160, 128));
        QBrush brush(gradient);
        paint.setBrush(brush);
        paint.drawPie(QRect(rect), angle, aLength[i]);
121
    }
122
123

    paint.setBrush(view.background(KColorScheme::ActiveBackground));
124
    paint.setPen(view.foreground().color());
125
    paint.translate(0.5, 0.5);
126
    paint.drawRoundedRect(95-m_textWidth/2, 85, m_textWidth+10, m_textHeight+10, 5, 5);
127
    paint.translate(-0.5, -0.5);
128
    paint.drawText(100 - m_textWidth/2, 100, m_text);
129
130
131
}


132
#include "progressBox.moc"