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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
|
//Author: Max Howell <max.howell@methylblue.com>, (C) 2003-4
//Copyright: See COPYING file that comes with this distribution
#include <kcursor.h> //ctor
#include <klocale.h>
#include <kurl.h>
#include <qapplication.h> //sendEvent
#include <qbitmap.h> //ctor - finding cursor size
#include <qcursor.h> //slotPostMouseEvent()
#include <qtimer.h> //member
#include "Config.h"
#include "debug.h"
#include "fileTree.h"
#include "radialMap.h" //constants
#include "widget.h"
RadialMap::Widget::Widget( QWidget *parent, const char *name )
: QWidget( parent, name, Qt::WNoAutoErase )
, m_tree( 0 )
, m_focus( 0 )
, m_tip( KCursor::handCursor().bitmap()->height() ) //needs to know cursor height
, m_rootSegment( 0 ) //TODO we don't delete it, *shrug*
{
setBackgroundColor( Qt::white );
connect( this, SIGNAL(created( const Directory* )), SLOT(sendFakeMouseEvent()) );
connect( this, SIGNAL(created( const Directory* )), SLOT(update()) );
connect( &m_timer, SIGNAL(timeout()), SLOT(resizeTimeout()) );
}
QString
RadialMap::Widget::path() const
{
if( m_tree == 0 )
return QString::null;
return m_tree->fullPath();
}
KURL
RadialMap::Widget::url( File const * const file ) const
{
if( file == 0 && m_tree == 0 )
return KURL();
return KURL::fromPathOrURL( file ? file->fullPath() : m_tree->fullPath() );
}
void
RadialMap::Widget::invalidate( const bool b )
{
if( isValid() )
{
//**** have to check that only way to invalidate is this function frankly
//**** otherwise you may get bugs..
//disable mouse tracking
setMouseTracking( false );
KURL urlInv = url();
//ensure this class won't think we have a map still
m_tree = 0;
m_focus = 0;
delete m_rootSegment;
m_rootSegment = 0;
//FIXME move this disablement thing no?
// it is confusing in other areas, like the whole createFromCache() thing
m_map.invalidate( b ); //b signifies whether the pixmap is made to look disabled or not
if( b )
update();
//tell rest of Filelight
emit invalidated( urlInv );
}
}
void
RadialMap::Widget::create( const Directory *tree )
{
//it is not the responsibility of create() to invalidate first
//skip invalidation at your own risk
//FIXME make it the responsibility of create to invalidate first
if( tree )
{
m_focus = 0;
//generate the filemap image
m_map.make( tree );
//this is the inner circle in the center
m_rootSegment = new Segment( tree, 0, 16*360 );
setMouseTracking( true );
}
m_tree = tree;
//tell rest of Filelight
emit created( tree );
}
void
RadialMap::Widget::createFromCache( const Directory *tree )
{
//no scan was necessary, use cached tree, however we MUST still emit invalidate
invalidate( false );
create( tree );
}
void
RadialMap::Widget::sendFakeMouseEvent() //slot
{
QMouseEvent me( QEvent::MouseMove, mapFromGlobal( QCursor::pos() ), Qt::NoButton, Qt::NoButton );
QApplication::sendEvent( this, &me );
}
void
RadialMap::Widget::resizeTimeout() //slot
{
// the segments are about to erased!
// this was a horrid bug, and proves the OO programming should be obeyed always!
m_focus = 0;
if( m_tree )
m_map.make( m_tree, true );
update();
}
void
RadialMap::Widget::refresh( int filth )
{
//TODO consider a more direct connection
if( !m_map.isNull() )
{
switch( filth )
{
case 1:
m_focus = 0;
if( m_tree )
m_map.make( m_tree, true ); //true means refresh only
break;
case 2:
m_map.aaPaint();
break;
case 3:
m_map.colorise(); //FALL THROUGH!
case 4:
m_map.paint();
default:
break;
}
update();
}
}
void
RadialMap::Widget::zoomIn() //slot
{
if( m_map.m_visibleDepth > MIN_RING_DEPTH )
{
m_focus = 0;
--m_map.m_visibleDepth;
if( m_tree )
m_map.make( m_tree );
Config::defaultRingDepth = m_map.m_visibleDepth;
update();
}
}
void
RadialMap::Widget::zoomOut() //slot
{
m_focus = 0;
++m_map.m_visibleDepth;
if( m_tree )
m_map.make( m_tree );
if( m_map.m_visibleDepth > Config::defaultRingDepth )
Config::defaultRingDepth = m_map.m_visibleDepth;
update();
}
RadialMap::Segment::~Segment()
{
if( isFake() )
delete m_file; //created by us in Builder::build()
}
#include "widget.moc"
|