From 0a141c4a9719aa273867ad45c4293208545489b1 Mon Sep 17 00:00:00 2001 From: zecke Date: Tue, 24 Aug 2004 13:38:23 +0000 Subject: Add RightOn Hold Visual Feedback and integrate it into QPEApplication Icons and Config Option will be comitted by WIMPIE --- (limited to 'library') diff --git a/library/backend/rohfeedback.cpp b/library/backend/rohfeedback.cpp new file mode 100644 index 0000000..ff76a36 --- a/dev/null +++ b/library/backend/rohfeedback.cpp @@ -0,0 +1,125 @@ +#include + + +#include +#include +#include +#include +#include +#include + +#define SPEED 600 +#define DELAY 500 + +namespace Opie { +namespace Internal { +/* + + RightOnHold feedback + +*/ + +QPixmap * RoHFeedback::Imgs[NOOFICONS] = { 0, 0, 0, 0, 0 }; +QBitmap * RoHFeedback::Masks[NOOFICONS]; +int RoHFeedback::IconWidth; +int RoHFeedback::IconHeight; + +RoHFeedback::RoHFeedback() : + QLabel( 0, 0, Qt::WType_Popup ), Timer() { + + Receiver = 0l; + connect( &Timer, SIGNAL( timeout() ), this, SLOT( iconShow() ) ); + + if( Imgs[0] == 0 ) { + QString S; + + + for( int i = 0; i < NOOFICONS ; i ++ ) { + Imgs[i] = new QPixmap( Resource::loadPixmap("RoH/star/"+ + QString::number(i+1) + + ".png" )); + Masks[i] = new QBitmap(); + (*Masks[i]) = Resource::loadPixmap("RoH/star/"+QString::number(i+1) + + ".png" ); + } + } + + IconWidth = Imgs[0]->size().width(); + IconHeight = Imgs[0]->size().height(); + + resize( IconWidth, IconHeight ); +} + +int RoHFeedback::delay( void ) { + return DELAY+SPEED+50; +} + +RoHFeedback::~RoHFeedback() { + for ( int i = 0; i < NOOFICONS; ++i ) { + delete Imgs [i]; + delete Masks[i]; + } +} + +void RoHFeedback::init( const QPoint & P, QWidget* wid ) { + if( ! IconWidth ) + return; + + Receiver = wid; + IconNr = -1; + move( P.x()-IconWidth/2, P.y() - IconHeight/2 ); + // to initialize + Timer.start( DELAY - SPEED/NOOFICONS ); +} + +void RoHFeedback::stop( void ) { + IconNr = -2; // stop + hide(); + Timer.stop(); +} + +bool RoHFeedback::event( QEvent * E ) { + + if( E->type() >= QEvent::MouseButtonPress && + E->type() <= QEvent::MouseMove ) { + // pass the event to the receiver with translated coord + QMouseEvent QME( ((QMouseEvent *)E)->type(), + Receiver->mapFromGlobal( + ((QMouseEvent *)E)->globalPos() ), + ((QMouseEvent *)E)->globalPos(), + ((QMouseEvent *)E)->button(), + ((QMouseEvent *)E)->state() + ); + return QPEApplication::sendEvent( Receiver, &QME ); + } + + // first let the label treat the event + return QLabel::event( E ); +} + +void RoHFeedback::iconShow( void ) { + switch( IconNr ) { + case FeedbackTimerStart: + IconNr = 0; + Timer.start( SPEED/NOOFICONS ); + break; + case FeedbackStopped: + // stopped + IconNr = FeedbackTimerStart; + hide(); + break; + case FeedbackShow: // first + show(); + // FT + default : + // show + + setPixmap( *(Imgs[IconNr]) ); + setMask( *(Masks[IconNr]) ); + IconNr = (IconNr+1)%NOOFICONS; // rotate + break; + } +} + +} +} \ No newline at end of file diff --git a/library/backend/rohfeedback.h b/library/backend/rohfeedback.h new file mode 100644 index 0000000..f38a095 --- a/dev/null +++ b/library/backend/rohfeedback.h @@ -0,0 +1,62 @@ +#ifndef ROHFEEDBACK_H +#define ROHFEEDBACK_H + +/* + + RightOnHold feedback show + +*/ + +#define NOOFICONS 5 + +#include +#include + +class QEvent; +class QPixmap; +class QBitmap; +class QMouseEvent; + +namespace Opie { +namespace Internal { + +class RoHFeedback : public QLabel { + + Q_OBJECT + + enum Actions { + FeedbackStopped = -2, + FeedbackTimerStart = -1, + FeedbackShow = 0 + }; +public : + + RoHFeedback(); + ~RoHFeedback(); + + + void init( const QPoint & P, QWidget* wid ); + void stop( void ); + int delay( void ); + +public slots : + + void iconShow( void ); + +protected : + + bool event( QEvent * E ); + + QTimer Timer; + int IconNr; + QWidget * Receiver; + + static int IconWidth; + static int IconHeight; + static QPixmap * Imgs[NOOFICONS]; + static QBitmap * Masks[NOOFICONS]; +}; +} +} + +#endif diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp index 59ca61b..acad81d 100644 --- a/library/qpeapplication.cpp +++ b/library/qpeapplication.cpp @@ -97,8 +97,12 @@ #endif #include "qt_override_p.h" +#include + + static bool useBigPixmaps = 0; + class HackWidget : public QWidget { public: @@ -126,6 +130,7 @@ public: fontSize = cfg.readNumEntry( "FontSize", 10 ); smallIconSize = cfg.readNumEntry( "SmallIconSize", 14 ); bigIconSize = cfg.readNumEntry( "BigIconSize", 32 ); + RoH = 0; } int presstimer; @@ -492,6 +497,8 @@ static void qpe_show_dialog( QDialog* d, bool nomax ) } } } + + Opie::Internal::RoHFeedback * RoH; }; class ResourceMimeFactory : public QMimeSourceFactory @@ -1205,7 +1212,7 @@ QPEApplication::~QPEApplication() delete sysChannel; delete pidChannel; #endif - + delete d->RoH; delete d; } @@ -2023,16 +2030,30 @@ bool QPEApplication::eventFilter( QObject *o, QEvent *e ) switch ( me->type() ) { case QEvent::MouseButtonPress: if ( me->button() == LeftButton ) { - if (!d->presstimer ) - d->presstimer = startTimer(500); // #### pref. d->presswidget = (QWidget*)o; d->presspos = me->pos(); d->rightpressed = FALSE; + // just for the time being + static int pref = 500; +#ifdef WITHROHFEEDBACK + if( ! d->RoH ) + d->RoH = new Opie::Internal::RoHFeedback; + + d->RoH->init( me->globalPos(), d->presswidget ); + pref = d->RoH->delay(); +#endif + if (!d->presstimer ) + d->presstimer = startTimer( pref ); // #### pref. + } break; case QEvent::MouseMove: if (d->presstimer && (me->pos() - d->presspos).manhattanLength() > 8) { killTimer(d->presstimer); +#ifdef WITHROHFEEDBACK + if( d->RoH ) + d->RoH->stop( ); +#endif d->presstimer = 0; } break; @@ -2040,6 +2061,10 @@ bool QPEApplication::eventFilter( QObject *o, QEvent *e ) if ( me->button() == LeftButton ) { if ( d->presstimer ) { killTimer(d->presstimer); +#ifdef WITHROHFEEDBACK + if( d->RoH ) + d->RoH->stop( ); +#endif d->presstimer = 0; } if ( d->rightpressed && d->presswidget ) { @@ -2093,6 +2118,7 @@ void QPEApplication::timerEvent( QTimerEvent *e ) killTimer( d->presstimer ); d->presstimer = 0; d->rightpressed = TRUE; + d->RoH->stop(); } } -- cgit v0.9.0.2