Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

zkbwidget.cpp

Go to the documentation of this file.
00001 #include <opie2/otaskbarapplet.h>
00002 #include <opie2/okeyfilter.h>
00003 #include <opie2/oresource.h>
00004 #include <qpe/qcopenvelope_qws.h>
00005 #include <qpe/applnk.h>
00006 #include <qpe/qpeapplication.h>
00007 //#include <stdio.h>
00008 //#include <unistd.h>
00009 #include "zkbwidget.h"
00010 #include "zkbcfg.h"
00011 
00012 using namespace Opie::Ui;
00013 
00014 ZkbWidget::ZkbWidget(QWidget* parent)
00015     :QLabel(parent),keymap(0),disabled(Opie::Core::OResource::loadPixmap("zkb-disabled", Opie::Core::OResource::SmallIcon)) {
00016 
00017     labels = new QPopupMenu();
00018     connect(labels, SIGNAL(activated(int)), this,
00019         SLOT(labelChanged(int)));
00020 
00021     loadKeymap();
00022 
00023     channel = new QCopChannel("QPE/zkb", this);
00024     connect(channel, SIGNAL(received(const QCString&,const QByteArray&)),
00025         this, SLOT(signalReceived(const QCString&,const QByteArray&)));
00026     setFixedWidth ( AppLnk::smallIconSize()  );
00027     setFixedHeight ( AppLnk::smallIconSize()  );
00028 }
00029 
00030 ZkbWidget::~ZkbWidget()
00031 {
00032     delete keymap;
00033     keymap = 0;
00034 }
00035 
00036 int ZkbWidget::position()
00037 {
00038     return 8;
00039 }
00040 
00041 bool ZkbWidget::loadKeymap() {
00042     ZkbConfig c(Global::applicationFileName("zkb", QString::null) );
00043     QFontMetrics fm(font());
00044 
00045     delete keymap;
00046     keymap = 0;
00047 
00048     Keymap* km = new Keymap();
00049 
00050     if (!c.load("zkb.xml", *km, "")) {
00051         delete km;
00052         setPixmap(disabled);
00053         return false;
00054     }
00055 
00056     connect(km, SIGNAL(stateChanged(const QString&)),
00057         this, SLOT(stateChanged(const QString&)));
00058 
00059     Opie::Core::OKeyFilter::inst()->addHandler(km);
00060 
00061     Keymap* oldkm = keymap;
00062     keymap = km;
00063 
00064     if (oldkm != 0) {
00065         delete oldkm;
00066     }
00067 
00068     QString ltext = keymap->getCurrentLabel();
00069     if (ltext.length()==0) ltext = "??";
00070     setText(ltext);
00071 
00072     labels->clear();
00073     QStringList l = keymap->listLabels();
00074     labels->insertItem(disabled, 0, 0);
00075     int n = 1;
00076     w = 0;
00077     for(QStringList::Iterator it = l.begin(); it != l.end();
00078         ++it, n++) {
00079 
00080 //      printf("label: %s\n", (const char*) (*it).utf8());
00081 
00082         labels->insertItem(*it, n, n);
00083         int lw = fm.width(*it);
00084         if (lw > w) {
00085             w = lw;
00086         }
00087     }
00088 
00089     if (w == 0) {
00090         hide();
00091     } else {
00092         show();
00093     }
00094     return true;
00095 }
00096 
00097 void ZkbWidget::stateChanged(const QString& s) {
00098 //  odebug << "stateChanged: " << s.utf8() << "\n" << oendl;
00099     setText(s);
00100 }
00101 
00102 void ZkbWidget::labelChanged(int id) {
00103     if (id == 0) {
00104         keymap->disable();
00105         setPixmap(disabled);
00106         return;
00107     }
00108 
00109     keymap->enable();
00110 
00111     QStringList l = keymap->listLabels();
00112     QString lbl = l[id-1];
00113 
00114 //  printf("labelChanged: %s\n", (const char*) lbl.utf8());
00115     State* state = keymap->getStateByLabel(lbl);
00116     if (state != 0) {
00117         keymap->setCurrentState(state);
00118         setText(lbl);
00119     }
00120 }
00121 
00122 void ZkbWidget::mouseReleaseEvent(QMouseEvent*) {
00123     QSize sh = labels->sizeHint();
00124     QPoint p = mapToGlobal(QPoint((width()-sh.width())/2,-sh.height()));
00125     labels->exec(p);
00126 }
00127 
00128 void ZkbWidget::signalReceived(const QCString& msg, const QByteArray& data) {
00129     QDataStream stream(data, IO_ReadOnly);
00130 
00131     if (msg == "enable()") {
00132         keymap->enable();
00133     } else if (msg == "disable()") {
00134         keymap->disable();
00135     } else if (msg == "reload()") {
00136         QCopEnvelope("QPE/System", "busy()");
00137         QTimer::singleShot(0, this, SLOT(reload()));
00138     } else if (msg == "switch(QString)") {
00139         QString lbl;
00140         stream >> lbl;
00141 
00142         if (keymap != 0) {
00143             State* state = keymap->getStateByLabel(lbl);
00144             if (state != 0) {
00145                 keymap->setCurrentState(state);
00146                 setText(lbl);
00147             }
00148         }
00149     } else if (msg == "debug(QString)") {
00150         QString flag;
00151         stream >> flag;
00152     }
00153 }
00154 
00155 void ZkbWidget::reload() {
00156     loadKeymap();
00157     QCopEnvelope("QPE/System", "notBusy()");
00158 }
00159 
00160 EXPORT_OPIE_APPLET_v1( ZkbWidget )

Generated on Sat Nov 5 16:16:46 2005 for OPIE by  doxygen 1.4.2