summaryrefslogtreecommitdiff
path: root/noncore/applets/zkbapplet/applet/zkbwidget.cpp
Unidiff
Diffstat (limited to 'noncore/applets/zkbapplet/applet/zkbwidget.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/applets/zkbapplet/applet/zkbwidget.cpp168
1 files changed, 168 insertions, 0 deletions
diff --git a/noncore/applets/zkbapplet/applet/zkbwidget.cpp b/noncore/applets/zkbapplet/applet/zkbwidget.cpp
new file mode 100644
index 0000000..8499500
--- a/dev/null
+++ b/noncore/applets/zkbapplet/applet/zkbwidget.cpp
@@ -0,0 +1,168 @@
1#include <opie2/otaskbarapplet.h>
2#include <opie2/okeyfilter.h>
3#include <qpe/qcopenvelope_qws.h>
4#include <qpe/applnk.h>
5#include <qpe/qpeapplication.h>
6#include <qpe/resource.h>
7#include <stdio.h>
8#include <unistd.h>
9#include "zkbwidget.h"
10#include "zkbcfg.h"
11
12using namespace Opie::Ui;
13
14ZkbWidget::ZkbWidget(QWidget* parent)
15 :QLabel(parent),keymap(0),disabled(Resource::loadPixmap("zkb-disabled")) {
16
17 labels = new QPopupMenu();
18 connect(labels, SIGNAL(activated(int)), this,
19 SLOT(labelChanged(int)));
20
21 loadKeymap();
22
23 channel = new QCopChannel("QPE/zkb", this);
24 connect(channel, SIGNAL(received(const QCString&,const QByteArray&)),
25 this, SLOT(signalReceived(const QCString&,const QByteArray&)));
26 setFixedWidth ( AppLnk::smallIconSize() );
27 setFixedHeight ( AppLnk::smallIconSize() );
28}
29
30ZkbWidget::~ZkbWidget()
31{
32 if (keymap != 0) {
33 delete keymap;
34 keymap = 0;
35 }
36}
37
38int ZkbWidget::position()
39{
40 return 8;
41}
42
43bool ZkbWidget::loadKeymap() {
44 ZkbConfig c(QPEApplication::qpeDir()+"/share/zkb");
45 QFontMetrics fm(font());
46
47 if (keymap != 0) {
48 delete keymap;
49 keymap = 0;
50 }
51
52 Keymap* km = new Keymap();
53
54 if (!c.load("zkb.xml", *km, "")) {
55 delete km;
56 setPixmap(disabled);
57 return false;
58 }
59
60 connect(km, SIGNAL(stateChanged(const QString&)),
61 this, SLOT(stateChanged(const QString&)));
62
63 Opie::Core::OKeyFilter::inst()->addHandler(km);
64
65 Keymap* oldkm = keymap;
66 keymap = km;
67
68 if (oldkm != 0) {
69 delete oldkm;
70 }
71
72 QString ltext = keymap->getCurrentLabel();
73 if (ltext.length()==0) ltext = "??";
74 setText(ltext);
75
76 labels->clear();
77 QStringList l = keymap->listLabels();
78 labels->insertItem(disabled, 0, 0);
79 int n = 1;
80 w = 0;
81 for(QStringList::Iterator it = l.begin(); it != l.end();
82 ++it, n++) {
83
84// printf("label: %s\n", (const char*) (*it).utf8());
85
86 labels->insertItem(*it, n, n);
87 int lw = fm.width(*it);
88 if (lw > w) {
89 w = lw;
90 }
91 }
92
93 if (w == 0) {
94 hide();
95 } else {
96 show();
97 }
98 return true;
99}
100
101QSize ZkbWidget::sizeHint() const {
102 return QSize(AppLnk::smallIconSize(),AppLnk::smallIconSize());
103}
104
105void ZkbWidget::stateChanged(const QString& s) {
106// odebug << "stateChanged: " << s.utf8() << "\n" << oendl;
107 setText(s);
108}
109
110void ZkbWidget::labelChanged(int id) {
111 if (id == 0) {
112 keymap->disable();
113 setPixmap(disabled);
114 return;
115 }
116
117 keymap->enable();
118
119 QStringList l = keymap->listLabels();
120 QString lbl = l[id-1];
121
122// printf("labelChanged: %s\n", (const char*) lbl.utf8());
123 State* state = keymap->getStateByLabel(lbl);
124 if (state != 0) {
125 keymap->setCurrentState(state);
126 setText(lbl);
127 }
128}
129
130void ZkbWidget::mouseReleaseEvent(QMouseEvent*) {
131 QSize sh = labels->sizeHint();
132 QPoint p = mapToGlobal(QPoint((width()-sh.width())/2,-sh.height()));
133 labels->exec(p);
134}
135
136void ZkbWidget::signalReceived(const QCString& msg, const QByteArray& data) {
137 QDataStream stream(data, IO_ReadOnly);
138
139 if (msg == "enable()") {
140 keymap->enable();
141 } else if (msg == "disable()") {
142 keymap->disable();
143 } else if (msg == "reload()") {
144 QCopEnvelope("QPE/System", "busy()");
145 QTimer::singleShot(0, this, SLOT(reload()));
146 } else if (msg == "switch(QString)") {
147 QString lbl;
148 stream >> lbl;
149
150 if (keymap != 0) {
151 State* state = keymap->getStateByLabel(lbl);
152 if (state != 0) {
153 keymap->setCurrentState(state);
154 setText(lbl);
155 }
156 }
157 } else if (msg == "debug(QString)") {
158 QString flag;
159 stream >> flag;
160 }
161}
162
163void ZkbWidget::reload() {
164 loadKeymap();
165 QCopEnvelope("QPE/System", "notBusy()");
166}
167
168EXPORT_OPIE_APPLET_v1( ZkbWidget )