-rw-r--r-- | inputmethods/multikey/configdlg.cpp | 60 | ||||
-rw-r--r-- | inputmethods/multikey/configdlg.h | 9 | ||||
-rw-r--r-- | inputmethods/multikey/keyboard.cpp | 10 | ||||
-rw-r--r-- | inputmethods/multikey/keyboard.h | 1 |
4 files changed, 56 insertions, 24 deletions
diff --git a/inputmethods/multikey/configdlg.cpp b/inputmethods/multikey/configdlg.cpp index f23bf1c..7bea589 100644 --- a/inputmethods/multikey/configdlg.cpp +++ b/inputmethods/multikey/configdlg.cpp @@ -1,123 +1,143 @@ /* * TODO - * make a font selection thing + * make a font selection thing (size too) * - * FIXME - * if you open the config dialog and close it from the little (x) button on the title bar, - * you have to hit the button on the keyboard twice for it to open the next time * * */ #include <qpe/qpeapplication.h> #include <qpe/config.h> #include <qwidget.h> #include <qdialog.h> #include <qtabwidget.h> #include <qvbox.h> #include <qgrid.h> #include <qgroupbox.h> #include <qlabel.h> #include <qcheckbox.h> #include <qsizepolicy.h> #include <qpushbutton.h> -#include <qcombobox.h> +#include <qlistbox.h> #include "configdlg.h" #include "keyboard.h" ConfigDlg::ConfigDlg () : QTabWidget () { setCaption( tr("Multikey Configuration") ); /* * 'general config' tab */ QVBox *gen_box = new QVBox (this); gen_box->setMargin(3); addTab(gen_box, tr("General Settings")); - QGroupBox *map_group = new QGroupBox (2, Qt::Horizontal, tr("Keymap File"), gen_box); + QGroupBox *map_group = new QGroupBox (2, Qt::Vertical, tr("Keymap File"), gen_box); - map_combo = new QComboBox ((bool)0, map_group); - map_combo->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); + keymaps = new QListBox (map_group); + keymaps->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); + //keymaps->setMaximumHeight(150); QString cur(tr("Current Language")); - map_combo->insertItem(cur); - connect(map_combo, SIGNAL(activated(int)), SLOT(setMap(int))); + keymaps->insertItem(cur); + connect(keymaps, SIGNAL(highlighted(int)), SLOT(setMap(int))); - QString ko(tr(QPEApplication::qpeDir() + "/share/multikey/ko.keymap")); - map_combo->insertItem(ko); + QString ko(QPEApplication::qpeDir() + "/share/multikey/ko.keymap"); + keymaps->insertItem(ko); - QString en(tr(QPEApplication::qpeDir() + "/share/multikey/en.keymap")); - map_combo->insertItem(en); + QString en(QPEApplication::qpeDir() + "/share/multikey/en.keymap"); + keymaps->insertItem(en); - QString de(tr(QPEApplication::qpeDir() + "/share/multikey/de.keymap")); - map_combo->insertItem(de); + QString de(QPEApplication::qpeDir() + "/share/multikey/de.keymap"); + keymaps->insertItem(de); - QPushButton *button = new QPushButton(tr("Browse..."), map_group); - button->setFlat((bool)1); + QGrid *add_remove_grid = new QGrid(2, map_group); + add_remove_grid->setMargin(3); + add_remove_grid->setSpacing(3); + + add_button = new QPushButton(tr("Add"), add_remove_grid); + add_button->setFlat((bool)1); + + remove_button = new QPushButton(tr("Remove"), add_remove_grid); + remove_button->setFlat((bool)1); pick_button = new QCheckBox(tr("Pickboard"), gen_box); Config config ("multikey"); config.setGroup ("pickboard"); bool pick_open = config.readBoolEntry ("open", "0"); // default closed if (pick_open) { pick_button->setChecked(true); } // by connecting it after checking it, the signal isn't emmited connect (pick_button, SIGNAL(clicked()), this, SLOT(pickTog())); /* * 'color' tab */ QGrid *color_box = new QGrid(2, this); color_box->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); color_box->setMargin(3); + color_box->setSpacing(3); addTab(color_box, tr("Colors")); QLabel *label; label = new QLabel(tr("Key Color"), color_box); - button = new QPushButton(color_box); + QPushButton *button = new QPushButton(color_box); button->setFlat((bool)1); label = new QLabel(tr("Key Pressed Color"), color_box); button = new QPushButton(color_box); button->setFlat((bool)1); label = new QLabel(tr("Line Color"), color_box); button = new QPushButton(color_box); button->setFlat((bool)1); label = new QLabel(tr("Text Color"), color_box); button = new QPushButton(color_box); button->setFlat((bool)1); label = new QLabel("", color_box); // a spacer so the above buttons dont expand label->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); } void ConfigDlg::pickTog() { Config config ("multikey"); config.setGroup ("pickboard"); config.writeEntry ("open", pick_button->isChecked()); // default closed emit pickboardToggled(pick_button->isChecked()); } void ConfigDlg::setMap(int index) { if (index == 0) { + if (remove_button->isEnabled()) + remove_button->setDisabled(true); + emit setMapToDefault(); } else { - emit setMapToFile(map_combo->text(index)); + if (!remove_button->isEnabled()) + remove_button->setEnabled(true); + + emit setMapToFile(keymaps->text(index)); } } + +void ConfigDlg::addMap() { + +} + +void ConfigDlg::removeMap(int index) { + +} diff --git a/inputmethods/multikey/configdlg.h b/inputmethods/multikey/configdlg.h index 54127a0..1a64764 100644 --- a/inputmethods/multikey/configdlg.h +++ b/inputmethods/multikey/configdlg.h @@ -1,31 +1,36 @@ #include <qpe/qpeapplication.h> #include <qtabwidget.h> #include <qcheckbox.h> -#include <qcombobox.h> +#include <qlistbox.h> +#include <qpushbutton.h> #ifndef CONFIGDLG_H #define CONFIGDLG_H class ConfigDlg : public QTabWidget { Q_OBJECT public: ConfigDlg (); signals: void pickboardToggled(bool on_off); void setMapToDefault(); void setMapToFile(QString file); private slots: void pickTog(); void setMap(int index); + void addMap(); + void removeMap(int index); private: QCheckBox *pick_button; - QComboBox *map_combo; + QListBox *keymaps; + QPushButton *add_button; + QPushButton *remove_button; }; #endif diff --git a/inputmethods/multikey/keyboard.cpp b/inputmethods/multikey/keyboard.cpp index 2a80f1e..b71f929 100644 --- a/inputmethods/multikey/keyboard.cpp +++ b/inputmethods/multikey/keyboard.cpp @@ -1,127 +1,134 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include "keyboard.h" #include "configdlg.h" #include <qpe/global.h> #include <qpe/qcopenvelope_qws.h> #include <qwindowsystem_qws.h> #include <qpainter.h> #include <qfontmetrics.h> #include <qtimer.h> #include <qpe/qpeapplication.h> #include <qpe/config.h> #include <ctype.h> #include <qfile.h> #include <qtextstream.h> -#include <iostream.h> #include <sys/utsname.h> #define USE_SMALL_BACKSPACE /* Keyboard::Keyboard {{{1 */ Keyboard::Keyboard(QWidget* parent, const char* _name, WFlags f) : QFrame(parent, _name, f), shift(0), lock(0), ctrl(0), alt(0), useLargeKeys(TRUE), usePicks(0), pressedKeyRow(-1), pressedKeyCol(-1), unicode(-1), qkeycode(0), modifiers(0), schar(0), mchar(0), echar(0), configdlg(0) { // get the default font Config *config = new Config( "qpe" ); config->setGroup( "Appearance" ); QString familyStr = config->readEntry( "FontFamily", "fixed" ); delete config; config = new Config("multikey"); config->setGroup ("pickboard"); usePicks = config->readBoolEntry ("open", "0"); // default closed delete config; setFont( QFont( familyStr, 10 ) ); picks = new KeyboardPicks( this ); picks->setFont( QFont( familyStr, 10 ) ); picks->initialise(); if (usePicks) { QObject::connect( picks, SIGNAL(key(ushort,ushort,ushort,bool,bool) ), this, SIGNAL(key(ushort,ushort,ushort,bool,bool)) ); } else picks->hide(); keys = new Keys(); repeatTimer = new QTimer( this ); connect( repeatTimer, SIGNAL(timeout()), this, SLOT(repeat()) ); } +Keyboard::~Keyboard() { + + if ( configdlg ) { + delete (ConfigDlg *) configdlg; + configdlg = 0; + } + +} /* Keyboard::resizeEvent {{{1 */ void Keyboard::resizeEvent(QResizeEvent*) { int ph = picks->sizeHint().height(); picks->setGeometry( 0, 0, width(), ph ); keyHeight = (height()-(usePicks ? ph : 0))/5; int nk; // number of keys? if ( useLargeKeys ) { nk = 15; } else { nk = 19; } defaultKeyWidth = (width()/nk)/2; xoffs = (width()-defaultKeyWidth*nk)/2; // empty key spaces? } /* KeyboardPicks::initialize {{{1 */ void KeyboardPicks::initialise() { setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed)); mode = 0; dc = new KeyboardConfig(this); configs.append(dc); } /* KeyboardPicks::sizeHint {{{1 */ QSize KeyboardPicks::sizeHint() const { return QSize(240,fontMetrics().lineSpacing()); } /* KeyboardConfig::generateText {{{1 */ void KeyboardConfig::generateText(const QString &s) { #if defined(Q_WS_QWS) || defined(_WS_QWS_) for (int i=0; i<(int)backspaces; i++) { parent->emitKey( 0, Qt::Key_Backspace, 0, true, false ); parent->emitKey( 0, Qt::Key_Backspace, 0, false, false ); } for (int i=0; i<(int)s.length(); i++) { parent->emitKey( s[i].unicode(), 0, 0, true, false ); parent->emitKey( s[i].unicode(), 0, 0, false, false ); } parent->emitKey( 0, Qt::Key_Space, 0, true, false ); @@ -914,97 +921,96 @@ void Keys::setKeysFromFile(const char * filename) { ((char *)xpm[xpmLineCount])[j] = xpmBuf.at(i).latin1(); j++; } } // have to close that facker up ((char *)xpm[xpmLineCount])[j] = '\0'; xpmLineCount++; buf = t.readLine(); } if (xpmLineCount) { xpm2pix = new QPixmap((const char **)xpm); for (int i = 0; i < xpmLineCount; i++) delete [] (xpm[i]); } setKey(row, qcode, unicode, width, xpm2pix); } // shift map else if (buf.contains(QRegExp("^[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { QTextStream tmp (buf, IO_ReadOnly); ushort lower, shift; tmp >> lower >> shift; shiftMap.insert(lower, shift); buf = t.readLine(); } // other variables like lang & title else if (buf.contains(QRegExp("^\\s*[a-zA-Z]+\\s*=\\s*[a-zA-Z0-9/]+\\s*$", FALSE, FALSE))) { QTextStream tmp (buf, IO_ReadOnly); QString name, equals, value; tmp >> name >> equals >> value; if (name == "lang") { lang = value; } - cout << name << " = " << value << "\n"; buf = t.readLine(); } // comments else if (buf.contains(QRegExp("^\\s*#"))) { buf = t.readLine(); } else { // blank line, or garbage buf = t.readLine(); } } f.close(); } } // Keys::setKey {{{2 void Keys::setKey(const int row, const int qcode, const ushort unicode, const int width, QPixmap *pix) { Key * key; key = new Key; key->qcode = qcode; key->unicode = unicode; key->width = width; // share key->pressed between same keys bool found = 0; for (int i = 1; i <= 5; i++) { for (unsigned int j = 0; j < keys[i].count(); j++) if (keys[i].at(j)->qcode == qcode && keys[i].at(j)->unicode == unicode) { key->pressed = keys[i].at(j)->pressed; found = 1; } } if (!found) { key->pressed = new bool; *(key->pressed) = 0; } key->pix = pix; diff --git a/inputmethods/multikey/keyboard.h b/inputmethods/multikey/keyboard.h index c2efe10..8ca50ea 100644 --- a/inputmethods/multikey/keyboard.h +++ b/inputmethods/multikey/keyboard.h @@ -47,96 +47,97 @@ public: void initialise(); virtual QSize sizeHint() const; KeyboardConfig *dc; }; class Keys { public: Keys(); Keys(const char * filename); ushort uni(const int row, const int col); int qcode(const int row, const int col); int width(const int row, const int col); bool pressed(const int row, const int col); bool *pressedPtr(const int row, const int col); ushort shift(const ushort); QPixmap *pix(const int row, const int col); int numKeys(const int row); void setKeysFromFile(const char *filename); void setKey(const int row, const int qcode, const ushort unicode, const int width, QPixmap *pix); void setPressed(const int row, const int col, const bool pressed); QString lang; QString title; private: typedef struct Key { int qcode; // are qt key codes just unicode values? ushort unicode; int width; // not pixels but relative key width. normal key is 2 // only needed for keys like ctrl that can have multiple keys pressed at once bool *pressed; QPixmap *pix; }; QList<Key> keys[6]; QMap<ushort,ushort> shiftMap; }; class Keyboard : public QFrame { Q_OBJECT public: Keyboard( QWidget* parent=0, const char* name=0, WFlags f=0 ); + ~Keyboard(); void resetState(); void mousePressEvent(QMouseEvent*); void mouseReleaseEvent(QMouseEvent*); void resizeEvent(QResizeEvent*); void paintEvent(QPaintEvent* e); //void timerEvent(QTimerEvent* e); void drawKeyboard( QPainter &p, int row = -1, int col = -1); QSize sizeHint() const; signals: void key( ushort scancode, ushort unicode, ushort modifiers, bool, bool ); private slots: void repeat(); void togglePickboard(bool on_off); void setMapToDefault(); void setMapToFile(QString file); private: int getKey( int &w, int j = -1 ); void clearHighlight(); bool *shift; bool *lock; bool *ctrl; bool *alt; uint useLargeKeys:1; uint usePicks:1; int pressedKeyRow; int pressedKeyCol; KeyboardPicks *picks; int keyHeight; int defaultKeyWidth; int xoffs; int unicode; int qkeycode; int modifiers; int pressTid; bool pressed; |