summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--libopie2/opieui/okeyconfigwidget.cpp242
-rw-r--r--libopie2/opieui/okeyconfigwidget.h11
-rw-r--r--libopie2/opieui/okeyconfigwidget_p.h33
3 files changed, 216 insertions, 70 deletions
diff --git a/libopie2/opieui/okeyconfigwidget.cpp b/libopie2/opieui/okeyconfigwidget.cpp
index 41be1be..3e08416 100644
--- a/libopie2/opieui/okeyconfigwidget.cpp
+++ b/libopie2/opieui/okeyconfigwidget.cpp
@@ -1,6 +1,6 @@
1#include "okeyconfigwidget.h" 1#include "okeyconfigwidget.h"
2#include "okeyconfigwidget_p.h"
2 3
3#include <opie2/olistview.h>
4 4
5#include <qgroupbox.h> 5#include <qgroupbox.h>
6#include <qradiobutton.h> 6#include <qradiobutton.h>
@@ -10,11 +10,13 @@
10#include <qaccel.h> 10#include <qaccel.h>
11#include <qlayout.h> 11#include <qlayout.h>
12#include <qlabel.h> 12#include <qlabel.h>
13#include <qtimer.h>
13 14
14 15
15using namespace Opie::Ui; 16using namespace Opie::Ui;
16 17
17 18
19
18/** 20/**
19 * The default Constructor of a OKeyPair. 21 * The default Constructor of a OKeyPair.
20 * A Key and a Modifier ( Alt/Shift/Ctrl ) 22 * A Key and a Modifier ( Alt/Shift/Ctrl )
@@ -539,28 +541,8 @@ OKeyConfigItem OKeyConfigManager::handleKeyEvent( QKeyEvent* e ) {
539 * Also key() on virtual inputmethods are zero and only ascii. We need to fix upper and lower 541 * Also key() on virtual inputmethods are zero and only ascii. We need to fix upper and lower
540 * case ascii 542 * case ascii
541 */ 543 */
542 int key = e->key(); 544 int key, mod;
543 int mod = e->state(); 545 Opie::Ui::Private::fixupKeys( key, mod, e );
544
545/*
546 * virtual keyboard
547 * else change the button mod only
548 */
549 if ( key == 0 ) {
550 key = e->ascii();
551 if ( key > 96 && key < 123)
552 key -= 32;
553 }else{
554 int new_mod = 0;
555 if ( mod & 256 )
556 new_mod |= Qt::ShiftButton;
557 else if ( mod & 512 )
558 new_mod |= Qt::ControlButton;
559 else if ( mod & 1024 )
560 new_mod |= Qt::AltButton;
561
562 mod = new_mod == 0? mod : new_mod;
563 }
564 546
565 OKeyConfigItem::List _keyList = keyList( key ); 547 OKeyConfigItem::List _keyList = keyList( key );
566 if ( _keyList.isEmpty() ) 548 if ( _keyList.isEmpty() )
@@ -732,32 +714,9 @@ OKeyConfigItem::List OKeyConfigManager::keyList( int keycode) {
732} 714}
733 715
734 716
735
736/////////////////////////
737//////// Widget Starts Here
738namespace Opie { 717namespace Opie {
739namespace Ui { 718namespace Ui {
740namespace Private { 719namespace Private {
741 static QString keyToString( const OKeyPair& );
742 class OKeyListViewItem : public Opie::Ui::OListViewItem {
743 public:
744 OKeyListViewItem( const OKeyConfigItem& item, OKeyConfigManager*, Opie::Ui::OListViewItem* parent);
745 ~OKeyListViewItem();
746
747 void setDefault();
748
749 OKeyConfigItem& item();
750 OKeyConfigItem origItem()const;
751 void setItem( const OKeyConfigItem& item );
752 void updateText();
753
754 OKeyConfigManager *manager();
755 private:
756 OKeyConfigItem m_item;
757 OKeyConfigItem m_origItem;
758 OKeyConfigManager* m_manager;
759
760 };
761 720
762 OKeyListViewItem::OKeyListViewItem( const OKeyConfigItem& item, OKeyConfigManager* man, OListViewItem* parent) 721 OKeyListViewItem::OKeyListViewItem( const OKeyConfigItem& item, OKeyConfigManager* man, OListViewItem* parent)
763 : Opie::Ui::OListViewItem( parent ), m_manager( man ) { 722 : Opie::Ui::OListViewItem( parent ), m_manager( man ) {
@@ -801,6 +760,30 @@ namespace Private {
801 return QAccel::keyToString( mod + pair.keycode() ); 760 return QAccel::keyToString( mod + pair.keycode() );
802 } 761 }
803 762
763 void fixupKeys( int& key, int &mod, QKeyEvent* e ) {
764 key = e->key();
765 mod = e->state();
766 /*
767 * virtual keyboard
768 * else change the button mod only
769 */
770 if ( key == 0 ) {
771 key = e->ascii();
772 if ( key > 96 && key < 123)
773 key -= 32;
774 }else{
775 int new_mod = 0;
776 if ( mod & 256 )
777 new_mod |= Qt::ShiftButton;
778 else if ( mod & 512 )
779 new_mod |= Qt::ControlButton;
780 else if ( mod & 1024 )
781 new_mod |= Qt::AltButton;
782
783 mod = new_mod == 0? mod : new_mod;
784 }
785 }
786
804 struct OKeyConfigWidgetPrivate{ 787 struct OKeyConfigWidgetPrivate{
805 OKeyConfigWidgetPrivate(const QString& = QString::null, 788 OKeyConfigWidgetPrivate(const QString& = QString::null,
806 OKeyConfigManager* = 0); 789 OKeyConfigManager* = 0);
@@ -827,7 +810,8 @@ namespace Private {
827 810
828 811
829//////////////////////// 812////////////////////////
830 813////////////////////////
814//////// Widget Starts Here
831 815
832 816
833 817
@@ -1039,14 +1023,7 @@ void OKeyConfigWidget::slotNoKey() {
1039 * If immediate we need to remove and readd the key 1023 * If immediate we need to remove and readd the key
1040 */ 1024 */
1041 Opie::Ui::Private::OKeyListViewItem *item = static_cast<Opie::Ui::Private::OKeyListViewItem*>(m_view->currentItem()); 1025 Opie::Ui::Private::OKeyListViewItem *item = static_cast<Opie::Ui::Private::OKeyListViewItem*>(m_view->currentItem());
1042 if ( m_mode == Imediate ) 1026 updateItem( item, OKeyPair::emptyKey() );
1043 item->manager()->removeKeyConfig( item->item() );
1044 item->item().setKeyPair( OKeyPair::emptyKey() );
1045 item->updateText();
1046
1047 if ( m_mode == Imediate )
1048 item->manager()->addKeyConfig( item->item() );
1049
1050} 1027}
1051 1028
1052void OKeyConfigWidget::slotDefaultKey() { 1029void OKeyConfigWidget::slotDefaultKey() {
@@ -1059,18 +1036,7 @@ void OKeyConfigWidget::slotDefaultKey() {
1059 return; 1036 return;
1060 1037
1061 Opie::Ui::Private::OKeyListViewItem *item = static_cast<Opie::Ui::Private::OKeyListViewItem*>(m_view->currentItem()); 1038 Opie::Ui::Private::OKeyListViewItem *item = static_cast<Opie::Ui::Private::OKeyListViewItem*>(m_view->currentItem());
1062 1039 updateItem( item, item->item().defaultKeyPair() );
1063 /*
1064 * If immediate we need to remove and readd the key
1065 */
1066 if ( m_mode == Imediate )
1067 item->manager()->removeKeyConfig( item->item() );
1068
1069 item->item().setKeyPair( item->item().defaultKeyPair() );
1070 item->updateText();
1071
1072 if ( m_mode == Imediate )
1073 item->manager()->addKeyConfig( item->item() );
1074} 1040}
1075 1041
1076void OKeyConfigWidget::slotCustomKey() { 1042void OKeyConfigWidget::slotCustomKey() {
@@ -1082,28 +1048,164 @@ void OKeyConfigWidget::slotCustomKey() {
1082 if ( !m_view->currentItem() || !m_view->currentItem()->parent() ) 1048 if ( !m_view->currentItem() || !m_view->currentItem()->parent() )
1083 return; 1049 return;
1084 1050
1051
1085} 1052}
1086 1053
1087void OKeyConfigWidget::slotConfigure() { 1054void OKeyConfigWidget::slotConfigure() {
1055 if ( !m_view->currentItem() || !m_view->currentItem()->parent() )
1056 return;
1057
1058 /* FIXME make use of OModalHelper */
1059 OKeyChooserConfigDialog dlg( this, "Dialog Name", true );
1060 dlg.setCaption(tr("Configure Key"));
1061 connect(&dlg, SIGNAL(keyCaptured()), &dlg, SLOT(accept()) );
1062
1063 if ( QPEApplication::execDialog( &dlg ) == QDialog::Accepted ) {
1064 Opie::Ui::Private::OKeyListViewItem *item = static_cast<Opie::Ui::Private::OKeyListViewItem*>(m_view->currentItem());
1065 updateItem( item, dlg.keyPair() );
1066 }
1067
1068
1069}
1070
1071void OKeyConfigWidget::updateItem( Opie::Ui::Private::OKeyListViewItem *item,
1072 const OKeyPair& newItem) {
1073 /* sanity check
1074 * check against the blacklist of the manager
1075 * check if another item uses this key which is o(n) at least
1076 */
1077 if ( !newItem.isEmpty() ) {
1078
1079 }
1080
1081 /*
1082 * If immediate we need to remove and readd the key
1083 */
1084 if ( m_mode == Imediate )
1085 item->manager()->removeKeyConfig( item->item() );
1086
1087 item->item().setKeyPair( newItem );
1088 item->updateText();
1088 1089
1090 if ( m_mode == Imediate )
1091 item->manager()->addKeyConfig( item->item() );
1089} 1092}
1090 1093
1091 1094
1095
1096/////
1092OKeyChooserConfigDialog::OKeyChooserConfigDialog( QWidget* par, const char* nam, 1097OKeyChooserConfigDialog::OKeyChooserConfigDialog( QWidget* par, const char* nam,
1093 bool mod, WFlags fl ) 1098 bool mod, WFlags fl )
1094 : QDialog( par, nam, mod, fl ) { 1099 : QDialog( par, nam, mod, fl ), m_virtKey( false ), m_keyPair( OKeyPair::emptyKey() ) ,
1100 m_key( 0 ), m_mod( 0 ) {
1101 setFocusPolicy( StrongFocus );
1102
1103 QHBoxLayout *lay = new QHBoxLayout( this );
1104
1105 QLabel *lbl = new QLabel( tr("Configure Key" ), this );
1106 lay->addWidget( lbl );
1107 lbl->setFocusPolicy( NoFocus );
1108
1109 m_lbl = new QLabel( this );
1110 lay->addWidget( m_lbl );
1111 m_lbl->setFocusPolicy( NoFocus );
1112
1113 m_timer = new QTimer( this );
1114 connect(m_timer, SIGNAL(timeout()),
1115 this, SLOT(slotTimeUp()) );
1095} 1116}
1096 1117
1097OKeyChooserConfigDialog::~OKeyChooserConfigDialog() { 1118OKeyChooserConfigDialog::~OKeyChooserConfigDialog() {
1098} 1119}
1099 1120
1100Opie::Ui::OKeyPair OKeyChooserConfigDialog::keyPair()const{ 1121Opie::Ui::OKeyPair OKeyChooserConfigDialog::keyPair()const{
1122 return m_keyPair;
1101} 1123}
1102 1124
1103void OKeyChooserConfigDialog::keyPressEvent( QKeyEvent* ev ) { 1125void OKeyChooserConfigDialog::keyPressEvent( QKeyEvent* ev ) {
1104 ev->ignore(); 1126 QDialog::keyPressEvent( ev );
1127
1128 if ( ev->isAutoRepeat() )
1129 return;
1130
1131 qWarning( "Key Press Event" );
1132 int mod, key;
1133 Opie::Ui::Private::fixupKeys( key,mod, ev );
1134
1135 /* either we used software keyboard
1136 * or we've true support
1137 */
1138 if ( !m_virtKey && !ev->key()) {
1139 m_virtKey = true;
1140 m_keyPair = OKeyPair( key, mod );
1141 }else{
1142 mod = 0;
1143 switch( key ) {
1144 case Qt::Key_Control:
1145 mod = Qt::ControlButton;
1146 break;
1147 case Qt::Key_Shift:
1148 mod = Qt::ShiftButton;
1149 break;
1150 case Qt::Key_Alt:
1151 mod = Qt::AltButton;
1152 break;
1153 default:
1154 break;
1155 }
1156 if (mod ) {
1157 m_mod |= mod;
1158 }else
1159 m_key = key;
1160
1161 if ( ( !mod || m_key ) && !m_timer->isActive() )
1162 m_timer->start( 50, true );
1163
1164 m_keyPair = OKeyPair( m_key, m_mod );
1165 }
1166
1167 m_lbl->setText( Opie::Ui::Private::keyToString( m_keyPair ) );
1168
1105} 1169}
1106 1170
1107void OKeyChooserConfigDialog::keyReleaseEvent( QKeyEvent* ev ) { 1171void OKeyChooserConfigDialog::keyReleaseEvent( QKeyEvent* ev ) {
1108 ev->ignore(); 1172 m_timer->stop();
1173 QDialog::keyPressEvent( ev );
1174
1175 if ( ev->isAutoRepeat() )
1176 return;
1177
1178
1179 if ( m_virtKey && !ev->key()) {
1180 m_virtKey = false;
1181 slotTimeUp();
1182 }else {
1183 int mod = 0;
1184 int key = ev->key();
1185 switch( key ) {
1186 case Qt::Key_Control:
1187 mod = Qt::ControlButton;
1188 break;
1189 case Qt::Key_Shift:
1190 mod = Qt::ShiftButton;
1191 break;
1192 case Qt::Key_Alt:
1193 mod = Qt::AltButton;
1194 break;
1195 default:
1196 break;
1197 }
1198 if (mod )
1199 m_mod &= ~mod;
1200 else
1201 m_key = key;
1202 m_keyPair = OKeyPair( m_key, m_mod );
1203 m_lbl->setText( Opie::Ui::Private::keyToString( m_keyPair ) );
1204 }
1205}
1206
1207
1208void OKeyChooserConfigDialog::slotTimeUp() {
1209 m_mod = m_key = 0;
1210 QTimer::singleShot(0, this, SIGNAL(keyCaptured()) );
1109} 1211}
diff --git a/libopie2/opieui/okeyconfigwidget.h b/libopie2/opieui/okeyconfigwidget.h
index 8d2a1ef..9e26719 100644
--- a/libopie2/opieui/okeyconfigwidget.h
+++ b/libopie2/opieui/okeyconfigwidget.h
@@ -21,12 +21,14 @@ class QLabel;
21class QPushButton; 21class QPushButton;
22class QListViewItem; 22class QListViewItem;
23class QRadioButton; 23class QRadioButton;
24class QTimer;
24 25
25namespace Opie { 26namespace Opie {
26namespace Ui { 27namespace Ui {
27namespace Private { 28namespace Private {
28 class OKeyConfigWidgetPrivate; 29 class OKeyConfigWidgetPrivate;
29 typedef QValueList<OKeyConfigWidgetPrivate> OKeyConfigWidgetPrivateList; 30 typedef QValueList<OKeyConfigWidgetPrivate> OKeyConfigWidgetPrivateList;
31 class OKeyListViewItem;
30} 32}
31 class OListViewItem; 33 class OListViewItem;
32 class OListView; 34 class OListView;
@@ -251,6 +253,8 @@ private slots:
251 void slotConfigure(); 253 void slotConfigure();
252 254
253private: 255private:
256 void updateItem( Opie::Ui::Private::OKeyListViewItem* man,
257 const OKeyPair& newItem);
254 void initUi(); 258 void initUi();
255 Opie::Ui::OListView *m_view; 259 Opie::Ui::OListView *m_view;
256 Opie::Ui::Private::OKeyConfigWidgetPrivateList m_list; 260 Opie::Ui::Private::OKeyConfigWidgetPrivateList m_list;
@@ -296,8 +300,15 @@ protected:
296signals: 300signals:
297 void keyCaptured(); 301 void keyCaptured();
298 302
303private slots:
304 void slotTimeUp();
305
299private: 306private:
307 QTimer *m_timer;
308 QLabel *m_lbl;
309 bool m_virtKey : 1;
300 OKeyPair m_keyPair; 310 OKeyPair m_keyPair;
311 int m_key, m_mod;
301 class Private; 312 class Private;
302 Private *d; 313 Private *d;
303}; 314};
diff --git a/libopie2/opieui/okeyconfigwidget_p.h b/libopie2/opieui/okeyconfigwidget_p.h
new file mode 100644
index 0000000..e7eaba6
--- a/dev/null
+++ b/libopie2/opieui/okeyconfigwidget_p.h
@@ -0,0 +1,33 @@
1/*
2 * Only Internal implemented in the same .cpp file anyway
3 */
4#include <opie2/olistview.h>
5
6
7namespace Opie {
8namespace Ui {
9namespace Private {
10 static QString keyToString( const OKeyPair& );
11 static void fixupKeys( int&, int&, QKeyEvent* );
12 class OKeyListViewItem : public Opie::Ui::OListViewItem {
13 public:
14 OKeyListViewItem( const OKeyConfigItem& item, OKeyConfigManager*, Opie::Ui::OListViewItem* parent);
15 ~OKeyListViewItem();
16
17 void setDefault();
18
19 OKeyConfigItem& item();
20 OKeyConfigItem origItem()const;
21 void setItem( const OKeyConfigItem& item );
22 void updateText();
23
24 OKeyConfigManager *manager();
25 private:
26 OKeyConfigItem m_item;
27 OKeyConfigItem m_origItem;
28 OKeyConfigManager* m_manager;
29
30 };
31}
32}
33}