-
Notifications
You must be signed in to change notification settings - Fork 4
/
chasewidget.cpp
130 lines (109 loc) · 2.94 KB
/
chasewidget.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include "chasewidget.h"
#include <QPoint>
#include <QApplication>
#include <QHideEvent>
#include <QPainter>
#include <QPaintEvent>
#include <QShowEvent>
ChaseWidget::ChaseWidget( QWidget *parent, QPixmap pixmap, bool pixmapEnabled ) : QWidget( parent )
, m_segment( 0 )
, m_delay( 100 )
, m_step( 40 )
, m_timerId( -1 )
, m_animated( false )
, m_pixmap( pixmap )
, m_pixmapEnabled( pixmapEnabled )
{
}
void ChaseWidget::toggleOperation( int id, bool value )
{
if( value && !m_operations.contains( id ) )
addOperation( id );
else if( !value && m_operations.contains( id ) )
removeOperation( id );
}
void ChaseWidget::addOperation( int id )
{
if( !m_operations.contains( id ) )
m_operations.push_back( id );
if( m_operations.size() != 0 && !m_animated )
setAnimated( true );
}
void ChaseWidget::removeOperation( int id )
{
if( !m_operations.contains( id ) )
return;
int index = m_operations.indexOf( id );
if( index != -1 ) {
m_operations.remove( index );
}
if( m_operations.size() == 0 )
setAnimated( false );
}
void ChaseWidget::setAnimated( bool value )
{
if ( m_animated == value )
return;
m_animated = value;
if( m_timerId != -1 ) {
killTimer( m_timerId );
m_timerId = -1;
}
if( m_animated ) {
m_segment = 0;
m_timerId = startTimer( m_delay );
}
update();
}
void ChaseWidget::paintEvent( QPaintEvent *event )
{
Q_UNUSED( event );
QPainter p( this );
if ( m_pixmapEnabled && !m_pixmap.isNull() ) {
p.drawPixmap( 0, 0, m_pixmap );
return;
}
const int extent = qMin( width(), height() );
const int displ = extent / 4;
const int ext = extent / 4 - 1;
p.setRenderHint( QPainter::Antialiasing, true );
if( m_animated )
p.setPen( Qt::gray );
else
p.setPen( QPen( palette().dark().color() ) );
p.translate( width() / 2, height() / 2 ); // center
for ( int segment = 0; segment < segmentCount(); ++segment ) {
p.rotate( QApplication::isRightToLeft() ? m_step : -m_step );
if(m_animated)
p.setBrush( colorForSegment( segment ) );
else
p.setBrush( palette().background() );
p.drawEllipse( QRect( displ, -ext / 2, ext, ext ) );
}
}
QSize ChaseWidget::sizeHint( void ) const
{
return QSize(32, 32);
}
void ChaseWidget::timerEvent( QTimerEvent *event )
{
if ( event->timerId() == m_timerId ) {
++m_segment;
update();
}
QWidget::timerEvent(event);
}
QColor ChaseWidget::colorForSegment( int seg ) const
{
int index = ( ( seg + m_segment ) % segmentCount() );
int comp = qMax( 0, 255 - ( index * ( 255 / segmentCount() ) ) );
return QColor( comp, comp, comp, 255 );
}
int ChaseWidget::segmentCount( void ) const
{
return 360 / m_step;
}
void ChaseWidget::setPixmapEnabled( bool enable )
{
m_pixmapEnabled = enable;
}