summaryrefslogtreecommitdiff
authorzecke <zecke>2004-08-24 13:38:23 (UTC)
committer zecke <zecke>2004-08-24 13:38:23 (UTC)
commit0a141c4a9719aa273867ad45c4293208545489b1 (patch) (unidiff)
tree4059ae180d00d33cc31dd9083d38a14b946253a2
parent102bb2b65c71da12c4f9f1ce7a5d1b37b6eb50ee (diff)
downloadopie-0a141c4a9719aa273867ad45c4293208545489b1.zip
opie-0a141c4a9719aa273867ad45c4293208545489b1.tar.gz
opie-0a141c4a9719aa273867ad45c4293208545489b1.tar.bz2
Add RightOn Hold Visual Feedback and integrate it
into QPEApplication Icons and Config Option will be comitted by WIMPIE
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--library/backend/rohfeedback.cpp125
-rw-r--r--library/backend/rohfeedback.h62
-rw-r--r--library/qpeapplication.cpp32
3 files changed, 216 insertions, 3 deletions
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 @@
1#include <rohfeedback.h>
2
3
4#include <stdio.h>
5#include <qpeapplication.h>
6#include <qevent.h>
7#include <resource.h>
8#include <qpixmap.h>
9#include <qbitmap.h>
10
11#define SPEED 600
12#define DELAY 500
13
14namespace Opie {
15namespace Internal {
16/*
17
18 RightOnHold feedback
19
20*/
21
22QPixmap * RoHFeedback::Imgs[NOOFICONS] = { 0, 0, 0, 0, 0 };
23QBitmap * RoHFeedback::Masks[NOOFICONS];
24int RoHFeedback::IconWidth;
25int RoHFeedback::IconHeight;
26
27RoHFeedback::RoHFeedback() :
28 QLabel( 0, 0, Qt::WType_Popup ), Timer() {
29
30 Receiver = 0l;
31 connect( &Timer, SIGNAL( timeout() ), this, SLOT( iconShow() ) );
32
33 if( Imgs[0] == 0 ) {
34 QString S;
35
36
37 for( int i = 0; i < NOOFICONS ; i ++ ) {
38 Imgs[i] = new QPixmap( Resource::loadPixmap("RoH/star/"+
39 QString::number(i+1) +
40 ".png" ));
41 Masks[i] = new QBitmap();
42 (*Masks[i]) = Resource::loadPixmap("RoH/star/"+QString::number(i+1) +
43 ".png" );
44 }
45 }
46
47 IconWidth = Imgs[0]->size().width();
48 IconHeight = Imgs[0]->size().height();
49
50 resize( IconWidth, IconHeight );
51}
52
53int RoHFeedback::delay( void ) {
54 return DELAY+SPEED+50;
55}
56
57RoHFeedback::~RoHFeedback() {
58 for ( int i = 0; i < NOOFICONS; ++i ) {
59 delete Imgs [i];
60 delete Masks[i];
61 }
62}
63
64void RoHFeedback::init( const QPoint & P, QWidget* wid ) {
65 if( ! IconWidth )
66 return;
67
68 Receiver = wid;
69 IconNr = -1;
70 move( P.x()-IconWidth/2, P.y() - IconHeight/2 );
71 // to initialize
72 Timer.start( DELAY - SPEED/NOOFICONS );
73}
74
75void RoHFeedback::stop( void ) {
76 IconNr = -2; // stop
77 hide();
78 Timer.stop();
79}
80
81bool RoHFeedback::event( QEvent * E ) {
82
83 if( E->type() >= QEvent::MouseButtonPress &&
84 E->type() <= QEvent::MouseMove ) {
85 // pass the event to the receiver with translated coord
86 QMouseEvent QME( ((QMouseEvent *)E)->type(),
87 Receiver->mapFromGlobal(
88 ((QMouseEvent *)E)->globalPos() ),
89 ((QMouseEvent *)E)->globalPos(),
90 ((QMouseEvent *)E)->button(),
91 ((QMouseEvent *)E)->state()
92 );
93 return QPEApplication::sendEvent( Receiver, &QME );
94 }
95
96 // first let the label treat the event
97 return QLabel::event( E );
98}
99
100void RoHFeedback::iconShow( void ) {
101 switch( IconNr ) {
102 case FeedbackTimerStart:
103 IconNr = 0;
104 Timer.start( SPEED/NOOFICONS );
105 break;
106 case FeedbackStopped:
107 // stopped
108 IconNr = FeedbackTimerStart;
109 hide();
110 break;
111 case FeedbackShow: // first
112 show();
113 // FT
114 default :
115 // show
116
117 setPixmap( *(Imgs[IconNr]) );
118 setMask( *(Masks[IconNr]) );
119 IconNr = (IconNr+1)%NOOFICONS; // rotate
120 break;
121 }
122}
123
124}
125} \ 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 @@
1#ifndef ROHFEEDBACK_H
2#define ROHFEEDBACK_H
3
4/*
5
6 RightOnHold feedback show
7
8*/
9
10#define NOOFICONS 5
11
12#include <qlabel.h>
13#include <qtimer.h>
14
15class QEvent;
16class QPixmap;
17class QBitmap;
18class QMouseEvent;
19
20namespace Opie {
21namespace Internal {
22
23class RoHFeedback : public QLabel {
24
25 Q_OBJECT
26
27 enum Actions {
28 FeedbackStopped = -2,
29 FeedbackTimerStart = -1,
30 FeedbackShow = 0
31 };
32public :
33
34 RoHFeedback();
35 ~RoHFeedback();
36
37
38 void init( const QPoint & P, QWidget* wid );
39 void stop( void );
40 int delay( void );
41
42public slots :
43
44 void iconShow( void );
45
46protected :
47
48 bool event( QEvent * E );
49
50 QTimer Timer;
51 int IconNr;
52 QWidget * Receiver;
53
54 static int IconWidth;
55 static int IconHeight;
56 static QPixmap * Imgs[NOOFICONS];
57 static QBitmap * Masks[NOOFICONS];
58};
59}
60}
61
62#endif
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp
index 59ca61b..acad81d 100644
--- a/library/qpeapplication.cpp
+++ b/library/qpeapplication.cpp
@@ -92,18 +92,22 @@
92#include <unistd.h> 92#include <unistd.h>
93#include <sys/file.h> 93#include <sys/file.h>
94#include <sys/ioctl.h> 94#include <sys/ioctl.h>
95#ifndef QT_NO_SOUND 95#ifndef QT_NO_SOUND
96#include <sys/soundcard.h> 96#include <sys/soundcard.h>
97#endif 97#endif
98#include "qt_override_p.h" 98#include "qt_override_p.h"
99 99
100#include <qpe/rohfeedback.h>
101
102
100static bool useBigPixmaps = 0; 103static bool useBigPixmaps = 0;
101 104
105
102class HackWidget : public QWidget 106class HackWidget : public QWidget
103{ 107{
104public: 108public:
105 bool needsOk() 109 bool needsOk()
106 { return (getWState() & WState_Reserved1 ); } 110 { return (getWState() & WState_Reserved1 ); }
107 111
108 QRect normalGeometry() 112 QRect normalGeometry()
109 { return topData()->normalGeometry; }; 113 { return topData()->normalGeometry; };
@@ -121,16 +125,17 @@ public:
121 { 125 {
122 Config cfg( "qpe" ); 126 Config cfg( "qpe" );
123 cfg.setGroup( "Appearance" ); 127 cfg.setGroup( "Appearance" );
124 useBigPixmaps = cfg.readBoolEntry( "useBigPixmaps", false ); 128 useBigPixmaps = cfg.readBoolEntry( "useBigPixmaps", false );
125 fontFamily = cfg.readEntry( "FontFamily", "Vera" ); 129 fontFamily = cfg.readEntry( "FontFamily", "Vera" );
126 fontSize = cfg.readNumEntry( "FontSize", 10 ); 130 fontSize = cfg.readNumEntry( "FontSize", 10 );
127 smallIconSize = cfg.readNumEntry( "SmallIconSize", 14 ); 131 smallIconSize = cfg.readNumEntry( "SmallIconSize", 14 );
128 bigIconSize = cfg.readNumEntry( "BigIconSize", 32 ); 132 bigIconSize = cfg.readNumEntry( "BigIconSize", 32 );
133 RoH = 0;
129 } 134 }
130 135
131 int presstimer; 136 int presstimer;
132 QWidget* presswidget; 137 QWidget* presswidget;
133 QPoint presspos; 138 QPoint presspos;
134 139
135 bool rightpressed : 1; 140 bool rightpressed : 1;
136 bool kbgrabbed : 1; 141 bool kbgrabbed : 1;
@@ -487,16 +492,18 @@ static void qpe_show_dialog( QDialog* d, bool nomax )
487 } 492 }
488 } 493 }
489 else { 494 else {
490 lib->unload(); 495 lib->unload();
491 delete lib; 496 delete lib;
492 } 497 }
493 } 498 }
494 } 499 }
500
501 Opie::Internal::RoHFeedback * RoH;
495}; 502};
496 503
497class ResourceMimeFactory : public QMimeSourceFactory 504class ResourceMimeFactory : public QMimeSourceFactory
498{ 505{
499public: 506public:
500 ResourceMimeFactory() : resImage( 0 ) 507 ResourceMimeFactory() : resImage( 0 )
501 { 508 {
502 setFilePath( Global::helpPath() ); 509 setFilePath( Global::helpPath() );
@@ -1200,17 +1207,17 @@ QPEApplication::~QPEApplication()
1200{ 1207{
1201 ungrabKeyboard(); 1208 ungrabKeyboard();
1202#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 1209#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
1203 // Need to delete QCopChannels early, since the display will 1210 // Need to delete QCopChannels early, since the display will
1204 // be gone by the time we get to ~QObject(). 1211 // be gone by the time we get to ~QObject().
1205 delete sysChannel; 1212 delete sysChannel;
1206 delete pidChannel; 1213 delete pidChannel;
1207#endif 1214#endif
1208 1215 delete d->RoH;
1209 delete d; 1216 delete d;
1210} 1217}
1211 1218
1212/*! 1219/*!
1213 Returns <tt>$OPIEDIR/</tt>. 1220 Returns <tt>$OPIEDIR/</tt>.
1214*/ 1221*/
1215QString QPEApplication::qpeDir() 1222QString QPEApplication::qpeDir()
1216{ 1223{
@@ -2018,33 +2025,51 @@ bool QPEApplication::eventFilter( QObject *o, QEvent *e )
2018 if ( stylusDict && e->type() >= QEvent::MouseButtonPress && e->type() <= QEvent::MouseMove ) { 2025 if ( stylusDict && e->type() >= QEvent::MouseButtonPress && e->type() <= QEvent::MouseMove ) {
2019 QMouseEvent * me = ( QMouseEvent* ) e; 2026 QMouseEvent * me = ( QMouseEvent* ) e;
2020 StylusMode mode = (StylusMode)(int)stylusDict->find(o); 2027 StylusMode mode = (StylusMode)(int)stylusDict->find(o);
2021 switch (mode) { 2028 switch (mode) {
2022 case RightOnHold: 2029 case RightOnHold:
2023 switch ( me->type() ) { 2030 switch ( me->type() ) {
2024 case QEvent::MouseButtonPress: 2031 case QEvent::MouseButtonPress:
2025 if ( me->button() == LeftButton ) { 2032 if ( me->button() == LeftButton ) {
2026 if (!d->presstimer )
2027 d->presstimer = startTimer(500); // #### pref.
2028 d->presswidget = (QWidget*)o; 2033 d->presswidget = (QWidget*)o;
2029 d->presspos = me->pos(); 2034 d->presspos = me->pos();
2030 d->rightpressed = FALSE; 2035 d->rightpressed = FALSE;
2036 // just for the time being
2037 static int pref = 500;
2038#ifdef WITHROHFEEDBACK
2039 if( ! d->RoH )
2040 d->RoH = new Opie::Internal::RoHFeedback;
2041
2042 d->RoH->init( me->globalPos(), d->presswidget );
2043 pref = d->RoH->delay();
2044#endif
2045 if (!d->presstimer )
2046 d->presstimer = startTimer( pref ); // #### pref.
2047
2031 } 2048 }
2032 break; 2049 break;
2033 case QEvent::MouseMove: 2050 case QEvent::MouseMove:
2034 if (d->presstimer && (me->pos() - d->presspos).manhattanLength() > 8) { 2051 if (d->presstimer && (me->pos() - d->presspos).manhattanLength() > 8) {
2035 killTimer(d->presstimer); 2052 killTimer(d->presstimer);
2053#ifdef WITHROHFEEDBACK
2054 if( d->RoH )
2055 d->RoH->stop( );
2056#endif
2036 d->presstimer = 0; 2057 d->presstimer = 0;
2037 } 2058 }
2038 break; 2059 break;
2039 case QEvent::MouseButtonRelease: 2060 case QEvent::MouseButtonRelease:
2040 if ( me->button() == LeftButton ) { 2061 if ( me->button() == LeftButton ) {
2041 if ( d->presstimer ) { 2062 if ( d->presstimer ) {
2042 killTimer(d->presstimer); 2063 killTimer(d->presstimer);
2064#ifdef WITHROHFEEDBACK
2065 if( d->RoH )
2066 d->RoH->stop( );
2067#endif
2043 d->presstimer = 0; 2068 d->presstimer = 0;
2044 } 2069 }
2045 if ( d->rightpressed && d->presswidget ) { 2070 if ( d->rightpressed && d->presswidget ) {
2046 // Right released 2071 // Right released
2047 postEvent( d->presswidget, 2072 postEvent( d->presswidget,
2048 new QMouseEvent( QEvent::MouseButtonRelease, me->pos(), 2073 new QMouseEvent( QEvent::MouseButtonRelease, me->pos(),
2049 RightButton, LeftButton + RightButton ) ); 2074 RightButton, LeftButton + RightButton ) );
2050 // Left released, off-widget 2075 // Left released, off-widget
@@ -2088,16 +2113,17 @@ void QPEApplication::timerEvent( QTimerEvent *e )
2088 if ( e->timerId() == d->presstimer && d->presswidget ) { 2113 if ( e->timerId() == d->presstimer && d->presswidget ) {
2089 // Right pressed 2114 // Right pressed
2090 postEvent( d->presswidget, 2115 postEvent( d->presswidget,
2091 new QMouseEvent( QEvent::MouseButtonPress, d->presspos, 2116 new QMouseEvent( QEvent::MouseButtonPress, d->presspos,
2092 RightButton, LeftButton ) ); 2117 RightButton, LeftButton ) );
2093 killTimer( d->presstimer ); 2118 killTimer( d->presstimer );
2094 d->presstimer = 0; 2119 d->presstimer = 0;
2095 d->rightpressed = TRUE; 2120 d->rightpressed = TRUE;
2121 d->RoH->stop();
2096 } 2122 }
2097} 2123}
2098 2124
2099void QPEApplication::removeSenderFromStylusDict() 2125void QPEApplication::removeSenderFromStylusDict()
2100{ 2126{
2101 stylusDict->remove 2127 stylusDict->remove
2102 ( ( void* ) sender() ); 2128 ( ( void* ) sender() );
2103 if ( d->presswidget == sender() ) 2129 if ( d->presswidget == sender() )