-rw-r--r-- | examples/applet/config.in | 4 | ||||
-rw-r--r-- | examples/applet/example.pro | 16 | ||||
-rw-r--r-- | examples/applet/simpleimpl.cpp | 149 | ||||
-rw-r--r-- | examples/applet/simpleimpl.h | 72 |
4 files changed, 241 insertions, 0 deletions
diff --git a/examples/applet/config.in b/examples/applet/config.in new file mode 100644 index 0000000..6ea55d3 --- a/dev/null +++ b/examples/applet/config.in | |||
@@ -0,0 +1,4 @@ | |||
1 | config APPLET_EXAMPLE | ||
2 | boolean "Applet Example" | ||
3 | default "y" | ||
4 | depends ( LIBQPE || LIBQPE-X11 ) && EXAMPLES | ||
diff --git a/examples/applet/example.pro b/examples/applet/example.pro new file mode 100644 index 0000000..3efd31e --- a/dev/null +++ b/examples/applet/example.pro | |||
@@ -0,0 +1,16 @@ | |||
1 | CONFIG += warn_on qt | ||
2 | |||
3 | TEMPLATE = lib | ||
4 | DESTDIR = $(OPIEDIR)/plugins/applets | ||
5 | TARGET = example | ||
6 | |||
7 | SOURCES = simpleimpl.cpp | ||
8 | HEADERS = simpleimpl.h | ||
9 | |||
10 | INCLUDEPATH += $(OPIEDIR)/include | ||
11 | DEPENDSPATH += $(OPIEDIR)/include | ||
12 | |||
13 | LIBS += -lqpe | ||
14 | |||
15 | |||
16 | include ( $(OPIEDIR)/include.pro ) | ||
diff --git a/examples/applet/simpleimpl.cpp b/examples/applet/simpleimpl.cpp new file mode 100644 index 0000000..981e0ab --- a/dev/null +++ b/examples/applet/simpleimpl.cpp | |||
@@ -0,0 +1,149 @@ | |||
1 | #include <qlabel.h> | ||
2 | #include <qpainter.h> | ||
3 | #include <qmessagebox.h> | ||
4 | |||
5 | #include <qpe/applnk.h> // for AppLnk | ||
6 | #include <qpe/resource.h> // for Resource loading | ||
7 | |||
8 | #include "simpleimpl.h" | ||
9 | |||
10 | |||
11 | SimpleApplet::SimpleApplet(QWidget *parent) | ||
12 | : QWidget( parent, "Simple Applet" ) { | ||
13 | /* | ||
14 | * we will load an Image, scale it for the right usage | ||
15 | * remember your applet might be used by different | ||
16 | * resolutions. | ||
17 | * Then we will convert the image back to an Pixmap | ||
18 | * and draw this Pimxap. We need to use Image because its | ||
19 | * the only class that allows scaling. | ||
20 | */ | ||
21 | |||
22 | QImage image = Resource::loadImage("Tux"); | ||
23 | /* | ||
24 | * smooth scale to AppLnk smallIconSize for applest | ||
25 | * smallIconSize gets adjusted to the resolution | ||
26 | * so on some displays like SIMpad and a C-750 the smallIconSize | ||
27 | * is greater than on a iPAQ h3870 | ||
28 | */ | ||
29 | image = image.smoothScale(AppLnk::smallIconSize(), AppLnk::smallIconSize() ); | ||
30 | |||
31 | /* | ||
32 | * now we need to convert the Image to a Pixmap cause these | ||
33 | * can be drawn more easily | ||
34 | */ | ||
35 | m_pix = new QPixmap(); | ||
36 | m_pix->convertFromImage( image ); | ||
37 | |||
38 | /* | ||
39 | * Now we will say that we don't want to be bigger than our | ||
40 | * Pixmap | ||
41 | */ | ||
42 | setFixedHeight(AppLnk::smallIconSize() ); | ||
43 | setFixedWidth( AppLnk::smallIconSize() ); | ||
44 | |||
45 | } | ||
46 | |||
47 | SimpleApplet::~SimpleApplet() { | ||
48 | delete m_pix; | ||
49 | } | ||
50 | |||
51 | |||
52 | /* | ||
53 | * here you would normal show or do something | ||
54 | * useful. If you want to show a widget at the top left | ||
55 | * of your icon you need to map your rect().topLeft() to | ||
56 | * global with mapToGlobal(). Then you might also need to | ||
57 | * move the widgets so it is visible | ||
58 | */ | ||
59 | void SimpleApplet::mousePressEvent(QMouseEvent* ) { | ||
60 | QMessageBox::information(this, tr("No action taken"), | ||
61 | tr("<qt>This Plugin does not yet support anything usefule aye.</qt>"), | ||
62 | QMessageBox::Ok ); | ||
63 | |||
64 | } | ||
65 | |||
66 | void SimpleApplet::paintEvent( QPaintEvent* ) { | ||
67 | QPainter p(this); | ||
68 | |||
69 | /* simpy draw the pixmap from the start of this widget */ | ||
70 | p.drawPixmap(0, 0, *m_pix ); | ||
71 | } | ||
72 | |||
73 | /* | ||
74 | * Here comes the implementation of the interface | ||
75 | */ | ||
76 | SimpleAppletImpl::SimpleAppletImpl() { | ||
77 | } | ||
78 | /* needed cause until it is only pure virtual */ | ||
79 | SimpleAppletImpl::~SimpleAppletImpl() { | ||
80 | } | ||
81 | |||
82 | /* | ||
83 | * For the taskbar interface return a Widget | ||
84 | */ | ||
85 | QWidget* SimpleAppletImpl::applet( QWidget* parent ) { | ||
86 | /* ownership has the parent */ | ||
87 | return new SimpleApplet( parent ); | ||
88 | } | ||
89 | |||
90 | /* | ||
91 | * A small hint where the Applet Should be displayed | ||
92 | */ | ||
93 | int SimpleAppletImpl::position()const { | ||
94 | return 1; | ||
95 | } | ||
96 | |||
97 | |||
98 | /* | ||
99 | * Now the important QUnkownInterface method without | ||
100 | * this one your applet won't load | ||
101 | * @param uuid The uuid of the interface | ||
102 | * @param iface The pointer to the interface ptr | ||
103 | */ | ||
104 | QRESULT SimpleAppletImpl::queryInterface( const QUuid& uuid, QUnknownInterface** iface) { | ||
105 | /* set the pointer to the interface to 0 */ | ||
106 | *iface = 0; | ||
107 | |||
108 | /* | ||
109 | * we check if we support the requested interface | ||
110 | * and then assign to the pointer. | ||
111 | * You may alos create another interface here so | ||
112 | * *iface = this is only in this simple case true you | ||
113 | * could also support more interfaces. | ||
114 | * But this example below is the most common use. | ||
115 | * Now the caller knows that the Interface Pointer | ||
116 | * is valid and the interface supported | ||
117 | */ | ||
118 | if ( uuid == IID_QUnknown ) | ||
119 | *iface = this; | ||
120 | else if ( uuid == IID_TaskbarApplet ) | ||
121 | *iface = this; | ||
122 | else | ||
123 | return QS_FALSE; | ||
124 | |||
125 | if ( *iface ) | ||
126 | (*iface)->addRef(); | ||
127 | |||
128 | return QS_OK; | ||
129 | } | ||
130 | |||
131 | |||
132 | /* | ||
133 | * Finally we need to export the Interface. | ||
134 | * CREATE_INSTANCE creates a interface and calls | ||
135 | * queryInterface for the QUnknownInterface once | ||
136 | * With out this function the applet can't be loaded. | ||
137 | * | ||
138 | * NOTE: If your applet does not load it's likely you've an | ||
139 | * unresolved symbol. Change the .pro TEMPLATE = lib to TEMPLATE= app | ||
140 | * and recompile. If the linker only complains about a missing | ||
141 | * main method the problem is more complex. In most cases it'll say | ||
142 | * you which symbols are missing and you can implement them. | ||
143 | * The main(int argc, char* argv[] ) does not need to be | ||
144 | * included in a library so it's ok that the linker complains | ||
145 | */ | ||
146 | Q_EXPORT_INTERFACE() { | ||
147 | Q_CREATE_INSTANCE( SimpleAppletImpl ) | ||
148 | } | ||
149 | |||
diff --git a/examples/applet/simpleimpl.h b/examples/applet/simpleimpl.h new file mode 100644 index 0000000..8459c96 --- a/dev/null +++ b/examples/applet/simpleimpl.h | |||
@@ -0,0 +1,72 @@ | |||
1 | /* | ||
2 | * You may use, modify and distribute without any limitation | ||
3 | */ | ||
4 | |||
5 | /** | ||
6 | * Opie and Qtopia uses a component system called QCOM | ||
7 | * which was first part of the Qt 3.0 API but was made | ||
8 | * prviate during the betas. Opie and Qtopia still use it | ||
9 | * and we're happy with it. | ||
10 | * Every starts with the QUnknownInterface. It supports functions | ||
11 | * for reference counting and the most important one | ||
12 | * is for a query. Every QCOM interface got a global unique id ( GUID,UUID ) | ||
13 | * query is used to see if a interface is supported by | ||
14 | * a dynamic shared object ( dso / plugin ) | ||
15 | * For tasks like loading Applications, InputMethods, Today, MenuButton, | ||
16 | * Taskbar, Style, Email Client there are specefic Interfaces you | ||
17 | * need to implement. The interfaces inherits from QUnknownInterface and | ||
18 | * you'll need inherit from the interface. | ||
19 | * As example we will use the Taskbar interface | ||
20 | */ | ||
21 | |||
22 | #ifndef SIMPLE_OPIE_EXAMPLE_APPLET_H | ||
23 | #define SIMPLE_OPIE_EXAMPLE_APPLET_H | ||
24 | |||
25 | /* | ||
26 | * The taskbar applet interfaces wants us to implement position() and applet() | ||
27 | * additionally we need to implement add(), release() and queryInterface for QUnknownInterface | ||
28 | * luckiy there is a macro for the reference counting | ||
29 | * We provide an Implementation of the interface. | ||
30 | */ | ||
31 | #include <qwidget.h> | ||
32 | #include <qpe/taskbarappletinterface.h> | ||
33 | |||
34 | |||
35 | /* | ||
36 | * Because we only draw an Icon in a fixed width and height | ||
37 | * we declare and define SimpleApplet here and you could use QLabel | ||
38 | * setPixmap or use QWidget and draw yourself. | ||
39 | * You might also want to reimplement mouse*Event to use some simple actions | ||
40 | */ | ||
41 | class SimpleApplet : public QWidget { | ||
42 | Q_OBJECT | ||
43 | public: | ||
44 | SimpleApplet(QWidget *parent); | ||
45 | ~SimpleApplet(); | ||
46 | private: | ||
47 | void mousePressEvent( QMouseEvent* ); | ||
48 | void paintEvent( QPaintEvent* ); | ||
49 | QPixmap *m_pix; | ||
50 | }; | ||
51 | |||
52 | class SimpleAppletImpl : public TaskbarAppletInterface { | ||
53 | public: | ||
54 | |||
55 | SimpleAppletImpl(); | ||
56 | virtual ~SimpleAppletImpl(); | ||
57 | |||
58 | QRESULT queryInterface( const QUuid&, QUnknownInterface** ); | ||
59 | |||
60 | QWidget *applet( QWidget* parent ); | ||
61 | int position()const; | ||
62 | |||
63 | /* | ||
64 | * macro for reference countint | ||
65 | * if reference drops to zero | ||
66 | * delete this is called | ||
67 | */ | ||
68 | Q_REFCOUNT | ||
69 | }; | ||
70 | |||
71 | |||
72 | #endif | ||