-rw-r--r-- | core/launcher/launcherview.cpp | 98 | ||||
-rw-r--r-- | core/launcher/launcherview.h | 36 |
2 files changed, 131 insertions, 3 deletions
diff --git a/core/launcher/launcherview.cpp b/core/launcher/launcherview.cpp index cd9c14b..1317bda 100644 --- a/core/launcher/launcherview.cpp +++ b/core/launcher/launcherview.cpp @@ -24,16 +24,18 @@ #include <opie2/odebug.h> #include <qtopia/qpeapplication.h> #include <qtopia/private/categories.h> #include <qtopia/categoryselect.h> #include <qtopia/mimetype.h> #include <qtopia/resource.h> using namespace Opie::Core; +#include <qpe/qcopenvelope_qws.h> + /* QT */ #include <qtimer.h> #include <qfileinfo.h> #include <qiconview.h> #include <qobjectlist.h> // These define how the busy icon is animated and highlighted @@ -74,28 +76,35 @@ public: LauncherItem( QIconView *parent, AppLnk* applnk, bool bigIcon=TRUE ); ~LauncherItem(); AppLnk *appLnk() const { return app; } AppLnk *takeAppLnk() { AppLnk* r=app; app=0; return r; } void animateIcon(); void resetIcon(); + bool isEyeImage()const{return m_EyeImage;} virtual int compare ( QIconViewItem * i ) const; void paintItem( QPainter *p, const QColorGroup &cg ); void setBusyIndicatorType ( BusyIndicatorType t ) { busyType = t; } + void setEyePixmap(const QPixmap&aIcon); protected: bool isBigIcon; int iteration; AppLnk* app; + private: void paintAnimatedIcon( QPainter *p ); BusyIndicatorType busyType; + int psize; + QPixmap m_iPixmap; + bool m_EyeImage; + LauncherThumbReceiver*m_EyeCallback; }; class LauncherIconView : public QIconView { public: LauncherIconView( QWidget* parent, const char* name=0 ) : QIconView(parent,name), tf(""), @@ -372,26 +381,36 @@ void LauncherView::setBusyIndicatorType( const QString& type ) { icons->setBusyIndicatorType( BIT_Normal ) ; } LauncherItem::LauncherItem( QIconView *parent, AppLnk *applnk, bool bigIcon ) : QIconViewItem( parent, applnk->name(), bigIcon ? applnk->bigPixmap() :applnk->pixmap() ), isBigIcon( bigIcon ), iteration(0), - app(applnk) // Takes ownership + app(applnk), // Takes ownership + psize( (bigIcon ? applnk->bigPixmap().width() :applnk->pixmap().width() ) ), + m_iPixmap(), + m_EyeImage(false) { + m_EyeCallback = new LauncherThumbReceiver(this); + if (applnk->type().lower().startsWith("image/") && applnk->exec().contains("opie-eye",false)) { + m_EyeImage = true; + m_iPixmap = (bigIcon ? applnk->bigPixmap():applnk->pixmap()); + m_EyeCallback->requestThumb(applnk->file(),m_iPixmap.width(),m_iPixmap.height()); + } } LauncherItem::~LauncherItem() { LauncherIconView* liv = (LauncherIconView*)iconView(); if ( liv->busyItem() == this ) liv->setBusy(FALSE); delete app; + if (m_EyeCallback) delete m_EyeCallback; } int LauncherItem::compare ( QIconViewItem * i ) const { LauncherIconView* view = (LauncherIconView*)iconView(); return view->compare(app,((LauncherItem *)i)->appLnk()); } @@ -455,17 +474,17 @@ void LauncherItem::animateIcon() { LauncherIconView* liv = (LauncherIconView*)iconView(); if ( liv->busyItem() != this || !app ) return; // Highlight the icon if ( iteration == 0 ) { - QPixmap src = isBigIcon ? app->bigPixmap() : app->pixmap(); + QPixmap src = (isEyeImage()?m_iPixmap:(isBigIcon ? app->bigPixmap() : app->pixmap())); QImage img = src.convertToImage(); QRgb *rgb; int count; if ( img.depth() == 32 ) { rgb = (QRgb*)img.bits(); count = img.bytesPerLine()/sizeof(QRgb)*img.height(); } else { rgb = img.colorTable(); @@ -491,17 +510,24 @@ void LauncherItem::animateIcon() // Paint animation overlay QPainter p( liv->viewport() ); paintAnimatedIcon( &p ); } void LauncherItem::resetIcon() { iteration = 0; - setPixmap( isBigIcon ? app->bigPixmap() : app->pixmap() ); + setPixmap((isEyeImage()?m_iPixmap:(isBigIcon ? app->bigPixmap() : app->pixmap()))); +} + +void LauncherItem::setEyePixmap(const QPixmap&aIcon) +{ + if (!isEyeImage()) return; + m_iPixmap = aIcon; + setPixmap(aIcon); } //=========================================================================== QStringList LauncherIconView::mimeTypes() const { QStringList r; QDictIterator<void> it(mimes); @@ -1054,8 +1080,74 @@ void LauncherView::flushBgCache() ++it; if ( (*curr)->ref == 0 ) { delete (*curr); bgCache->remove( curr ); } } } +/* special image handling - based on opie eye */ +QDataStream &operator>>( QDataStream& s, PixmapInfo& inf ) { + s >> inf.file >> inf.pixmap >> inf.width >> inf.height; + return s; +} + +QDataStream &operator<<( QDataStream& s, const PixmapInfo& inf) { + return s << inf.file << inf.width << inf.height; +} + +LauncherThumbReceiver::LauncherThumbReceiver(LauncherItem*parent) + :QObject() +{ + m_parent = parent; + QCopChannel * chan = new QCopChannel( "QPE/opie-eye",this ); + connect(chan, SIGNAL(received(const QCString&,const QByteArray&)), + this, SLOT(recieve(const QCString&,const QByteArray&)) ); + + { + QCopEnvelope( "QPE/Application/opie-eye_slave", "refUp()" ); + } + m_waiting = false; +} + +LauncherThumbReceiver::~LauncherThumbReceiver() +{ + { + QCopEnvelope( "QPE/Application/opie-eye_slave", "refDown()" ); + } +} + +void LauncherThumbReceiver::recieve( const QCString&str, const QByteArray&at ) +{ + PixmapInfos pixinfos; + QDataStream stream( at, IO_ReadOnly ); + if (!m_parent || !m_waiting) return; + /* we are just interested in thumbmails */ + if ( str == "pixmapsHandled(PixmapList)" ) + stream >> pixinfos; + + for ( PixmapInfos::Iterator it = pixinfos.begin(); it != pixinfos.end(); ++it ) { + if ((*it).file==m_reqFile) { + m_parent->setEyePixmap((*it).pixmap); + m_waiting = false; + break; + } + } +} + +void LauncherThumbReceiver::requestThumb(const QString&file,int width,int height) +{ + m_reqFile = file; + rItem.file = file; + rItem.width = width; + rItem.height = height; + QTimer::singleShot(1, this, SLOT(sendRequest())); +} + +void LauncherThumbReceiver::sendRequest() +{ + PixmapInfos m_inThumbNail; + m_inThumbNail.append(rItem); + QCopEnvelope env("QPE/opie-eye_slave", "pixmapInfos(PixmapInfos)" ); + env << m_inThumbNail; + m_waiting = true; +} diff --git a/core/launcher/launcherview.h b/core/launcher/launcherview.h index e40a006..a9ff9eb 100644 --- a/core/launcher/launcherview.h +++ b/core/launcher/launcherview.h @@ -22,16 +22,17 @@ #include <qtopia/storage.h> #include <qtopia/applnk.h> #include <qvbox.h> class CategorySelect; class LauncherIconView; +class LauncherItem; class QIconView; class QIconViewItem; class QLabel; class QWidgetStack; class MenuButton; class QComboBox; @@ -111,9 +112,44 @@ private: BackgroundType bgType; QString bgName; QColor textCol; QImage loadBackgroundImage(QString &fname); }; +/* taken from opie-eye */ + +struct PixmapInfo { + PixmapInfo() : width( -1 ), height( -1 ) {} + bool operator==( const PixmapInfo& r ) { + if ( width != r.width ) return false; + if ( height != r.height ) return false; + if ( file != r.file ) return false; + return true; + } + int width, height; + QString file; + QPixmap pixmap; +}; + +class LauncherThumbReceiver:public QObject +{ + Q_OBJECT + typedef QValueList<PixmapInfo> PixmapInfos; +public: + LauncherThumbReceiver(LauncherItem*parent); + ~LauncherThumbReceiver(); + void requestThumb(const QString&file,int width,int height); + +public slots: + void recieve( const QCString&, const QByteArray& ); +protected slots: + virtual void sendRequest(); +protected: + LauncherItem*m_parent; + QString m_reqFile; + PixmapInfo rItem; + bool m_waiting:1; +}; + #endif // LAUNCHERVIEW_H |