summaryrefslogtreecommitdiff
path: root/noncore/graphics/opie-eye/gui/iconview.cpp
authorzecke <zecke>2004-03-22 23:32:41 (UTC)
committer zecke <zecke>2004-03-22 23:32:41 (UTC)
commit428b687982966dc2efabaf6dbcc55ad0ea30aa10 (patch) (unidiff)
tree86da20abd2e4b97a59dc32e17996bde5ee74cc91 /noncore/graphics/opie-eye/gui/iconview.cpp
parent7ce623c6351646ce738a81e103632d73c5454ecc (diff)
downloadopie-428b687982966dc2efabaf6dbcc55ad0ea30aa10.zip
opie-428b687982966dc2efabaf6dbcc55ad0ea30aa10.tar.gz
opie-428b687982966dc2efabaf6dbcc55ad0ea30aa10.tar.bz2
Initial Check in of the Eye Of Zilla. This ImageViewer features
Image Infos, EXIF, Jpeg,Png,Gif support. It supports scaled loading of Jpegs. an smart image cache.... GUI needs some work and we need to find a bug in QCOP as well. TODO: Add Image Service for example Mailer Add ImageCanvas/Zoomer/Display
Diffstat (limited to 'noncore/graphics/opie-eye/gui/iconview.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/graphics/opie-eye/gui/iconview.cpp296
1 files changed, 296 insertions, 0 deletions
diff --git a/noncore/graphics/opie-eye/gui/iconview.cpp b/noncore/graphics/opie-eye/gui/iconview.cpp
new file mode 100644
index 0000000..0b80012
--- a/dev/null
+++ b/noncore/graphics/opie-eye/gui/iconview.cpp
@@ -0,0 +1,296 @@
1/*
2 * GPLv2 zecke@handhelds.org
3 * No WArranty...
4 */
5
6#include "iconview.h"
7
8#include <lib/imagecache.h>
9
10#include <iface/dirview.h>
11#include <iface/dirlister.h>
12
13#include <qpe/config.h>
14#include <qpe/resource.h>
15#include <qpe/qpemessagebox.h>
16#include <qpe/ir.h>
17#include <qpe/qcopenvelope_qws.h>
18
19#include <qiconview.h>
20#include <qlabel.h>
21#include <qhbox.h>
22#include <qcombobox.h>
23#include <qdir.h>
24#include <qapplication.h>
25#include <qmainwindow.h>
26#include <qtimer.h>
27#include <qstyle.h>
28
29
30
31namespace {
32 QPixmap* _dirPix = 0;
33 QPixmap* _unkPix = 0;
34 class IconViewItem : public QIconViewItem {
35 public:
36 IconViewItem( QIconView*, const QString& path, const QString& name, bool isDir = false);
37 QPixmap* pixmap()const;
38 QString path()const { return m_path; }
39 bool isDir()const { return m_isDir; }
40 void setText( const QString& );
41 private:
42 mutable QPixmap* m_pix;
43 QString m_path;
44 bool m_isDir : 1;
45 bool m_noInfo :1;
46 };
47
48
49/*
50 * If we request an Image or String
51 * we add it to the map
52 */
53 QMap<QString, IconViewItem*> g_stringInf;
54 QMap<QString, IconViewItem*> g_stringPix;
55
56 IconViewItem::IconViewItem( QIconView* view,const QString& path,
57 const QString& name, bool isDir )
58 : QIconViewItem( view ), m_path( path ), m_isDir( isDir ),
59 m_noInfo( false )
60 {
61 QIconViewItem::setText( name );
62 if ( isDir && !_dirPix )
63 _dirPix = new QPixmap( Resource::loadPixmap("advancedfm/FileBrowser"));
64 else if ( !isDir && !_unkPix )
65 _unkPix = new QPixmap( Resource::loadPixmap( "UnknownDocument" ) );
66 }
67 inline QPixmap* IconViewItem::pixmap()const {
68 if ( m_isDir )
69 return _dirPix;
70 else{
71 if (!m_noInfo && !g_stringInf.contains( m_path ) ) {
72 currentView()->dirLister()->imageInfo( m_path );
73 g_stringInf.insert( m_path, const_cast<IconViewItem*>(this));
74 }
75
76 m_pix = PPixmapCache::self()->cachedImage( m_path, 64, 64 );
77 if ( !m_pix && !g_stringPix.contains( m_path )) {
78 currentView()->dirLister()->thumbNail( m_path, 64, 64 );
79 g_stringPix.insert( m_path, const_cast<IconViewItem*>(this));
80 }
81 return m_pix ? m_pix : _unkPix;
82 }
83 }
84 inline void IconViewItem::setText( const QString& str ) {
85 QString text = QIconViewItem::text()+"\n"+str;
86 m_noInfo = true;
87 QIconViewItem::setText( text );
88 }
89}
90
91
92PIconView::PIconView( QWidget* wid, Config* cfg )
93 : QVBox( wid ), m_cfg( cfg )
94{
95 {
96 QCopEnvelope( "QPE/Application/opie-eye_slave", "foo()" );
97 }
98 m_path = QDir::homeDirPath();
99
100 QHBox *hbox = new QHBox( this );
101 QLabel* lbl = new QLabel( hbox );
102 lbl->setText( tr("View as" ) );
103
104 m_views = new QComboBox( hbox, "View As" );
105 connect( m_views, SIGNAL(activated(int)),
106 this, SLOT(slotViewChanged(int)) );
107
108 m_view= new QIconView( this );
109 connect(m_view, SIGNAL(clicked(QIconViewItem*) ),
110 this, SLOT(slotClicked(QIconViewItem*)) );
111
112 m_view->setArrangement( QIconView::LeftToRight );
113 m_view->setItemTextPos( QIconView::Right );
114
115
116 int dw = QApplication::desktop()->width();
117 int viewerWidth = dw-style().scrollBarExtent().width();
118 m_view->setGridX( viewerWidth-2*m_view->spacing() );
119 m_view->setGridY( fontMetrics().height()*2+40 );
120 loadViews();
121 slotViewChanged( m_views->currentItem() );
122}
123
124PIconView::~PIconView() {
125}
126
127void PIconView::slotDirUp() {
128 QDir dir( m_path );
129 dir.cdUp();
130 slotChangeDir( dir.absPath() );
131
132}
133
134void PIconView::slotChangeDir(const QString& path) {
135 if ( !currentView() )
136 return;
137
138 PDirLister *lister = currentView()->dirLister();
139 if (!lister )
140 return;
141
142 lister->setStartPath( path );
143 m_path = lister->currentPath();
144
145 m_view->clear();
146 addFolders( lister->folders() );
147 addFiles( lister->files() );
148
149 // looks ugly
150 static_cast<QMainWindow*>(parent())->setCaption( QObject::tr("%1 - O View", "Name of the dir").arg( m_path ) );
151}
152
153QString PIconView::currentFileName(bool &isDir)const {
154 isDir = false;
155 QIconViewItem* _it = m_view->currentItem();
156 if ( !_it )
157 return QString::null;
158
159 IconViewItem* it = static_cast<IconViewItem*>( _it );
160 isDir = it->isDir();
161 return it->path();
162}
163
164void PIconView::slotTrash() {
165 bool isDir;
166 QString pa = currentFileName( isDir );
167 if ( isDir && pa.isEmpty() )
168 return;
169
170 if (!QPEMessageBox::confirmDelete( this,
171 tr("Delete Image" ),
172 tr("the Image %1" ).arg(pa)))
173 return
174
175
176 currentView()->dirLister()->deleteImage( pa );
177 delete m_view->currentItem();
178}
179void PIconView::loadViews() {
180 ViewMap::Iterator it;
181 ViewMap* map = viewMap();
182 for ( it = map->begin(); it != map->end(); ++it )
183 m_views->insertItem( QObject::tr(it.key() ) );
184}
185
186void PIconView::resetView() {
187 slotViewChanged(m_views->currentItem());
188}
189
190void PIconView::slotViewChanged( int i) {
191 if (!m_views->count() ) {
192 setCurrentView( 0l);
193 return;
194 }
195
196 PDirView* cur = currentView();
197 delete cur;
198 QString str = m_views->text(i);
199 cur = (*(*viewMap())[str])(*m_cfg);
200 setCurrentView( cur );
201
202 /* connect to the signals of the lister */
203 PDirLister* lis = cur->dirLister();
204 connect(lis, SIGNAL(sig_thumbInfo(const QString&, const QString& )),
205 this, SLOT( slotThumbInfo(const QString&, const QString&)));
206 connect(lis, SIGNAL( sig_thumbNail(const QString&, const QPixmap&)),
207 this, SLOT(slotThumbNail(const QString&, const QPixmap&)));
208 connect(lis, SIGNAL(sig_start()),
209 this, SLOT(slotStart()));
210 connect(lis, SIGNAL(sig_end()) ,
211 this, SLOT(slotEnd()) );
212
213
214 /* reload now */
215 QTimer::singleShot( 0, this, SLOT(slotReloadDir()));
216}
217
218
219void PIconView::slotReloadDir() {
220 slotChangeDir( m_path );
221}
222
223
224void PIconView::addFolders( const QStringList& lst) {
225 QStringList::ConstIterator it;
226
227 for(it=lst.begin(); it != lst.end(); ++it ) {
228 (void)new IconViewItem( m_view, m_path+"/"+(*it), (*it), true );
229 }
230
231}
232
233void PIconView::addFiles( const QStringList& lst) {
234 QStringList::ConstIterator it;
235 for (it=lst.begin(); it!= lst.end(); ++it )
236 (void)new IconViewItem( m_view, m_path+"/"+(*it), (*it) );
237
238}
239
240void PIconView::slotClicked(QIconViewItem* _it) {
241 if(!_it )
242 return;
243
244 IconViewItem* it = static_cast<IconViewItem*>(_it);
245 if( it->isDir() )
246 slotChangeDir( it->path() );
247 else // view image
248 ;
249}
250
251void PIconView::slotThumbInfo( const QString& _path, const QString& str ) {
252 if ( g_stringInf.contains( _path ) ) {
253 IconViewItem* item = g_stringInf[_path];
254 item->setText( str );
255 item->repaint();
256 g_stringInf.remove( _path );
257 }
258}
259void PIconView::slotThumbNail(const QString& _path, const QPixmap &pix) {
260 if ( g_stringPix.contains( _path ) ) {
261 IconViewItem* item = g_stringPix[_path];
262 PPixmapCache::self()->insertImage( _path, pix, 64, 64 );
263 item->repaint();
264 g_stringPix.remove( _path );
265 }
266}
267
268
269void PIconView::slotRename() {
270
271}
272
273void PIconView::slotBeam() {
274 bool isDir;
275 QString pa = currentFileName( isDir );
276 if ( isDir && pa.isEmpty() )
277 return;
278
279 Ir* ir = new Ir( this );
280 connect( ir, SIGNAL(done(Ir*)),
281 this, SLOT(slotBeamDone(Ir*)));
282 ir->send(pa, tr( "Image" ) );
283
284}
285
286void PIconView::slotBeamDone( Ir* ir) {
287 delete ir;
288}
289
290void PIconView::slotStart() {
291 m_view->setUpdatesEnabled( false );
292}
293
294void PIconView::slotEnd() {
295 m_view->setUpdatesEnabled( true );
296}