summaryrefslogtreecommitdiff
path: root/libopie2/opieui
Unidiff
Diffstat (limited to 'libopie2/opieui') (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,4 +1,4 @@
1#include "okeyconfigwidget.h" 1#include "okeyconfigwidget.h"
2#include "okeyconfigwidget_p.h"
2 3
3#include <opie2/olistview.h>
4 4
@@ -12,2 +12,3 @@
12#include <qlabel.h> 12#include <qlabel.h>
13#include <qtimer.h>
13 14
@@ -17,2 +18,3 @@ using namespace Opie::Ui;
17 18
19
18/** 20/**
@@ -541,24 +543,4 @@ OKeyConfigItem OKeyConfigManager::handleKeyEvent( QKeyEvent* e ) {
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
@@ -734,5 +716,2 @@ OKeyConfigItem::List OKeyConfigManager::keyList( int keycode) {
734 716
735
736/////////////////////////
737//////// Widget Starts Here
738namespace Opie { 717namespace Opie {
@@ -740,22 +719,2 @@ namespace 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
@@ -803,2 +762,26 @@ namespace Private {
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{
@@ -829,3 +812,4 @@ namespace Private {
829//////////////////////// 812////////////////////////
830 813////////////////////////
814//////// Widget Starts Here
831 815
@@ -1041,10 +1025,3 @@ void OKeyConfigWidget::slotNoKey() {
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}
@@ -1061,14 +1038,3 @@ void OKeyConfigWidget::slotDefaultKey() {
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}
@@ -1084,2 +1050,3 @@ void OKeyConfigWidget::slotCustomKey() {
1084 1050
1051
1085} 1052}
@@ -1087,3 +1054,39 @@ void OKeyConfigWidget::slotCustomKey() {
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}
@@ -1091,5 +1094,23 @@ void OKeyConfigWidget::slotConfigure() {
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}
@@ -1100,2 +1121,3 @@ OKeyChooserConfigDialog::~OKeyChooserConfigDialog() {
1100Opie::Ui::OKeyPair OKeyChooserConfigDialog::keyPair()const{ 1121Opie::Ui::OKeyPair OKeyChooserConfigDialog::keyPair()const{
1122 return m_keyPair;
1101} 1123}
@@ -1103,3 +1125,45 @@ Opie::Ui::OKeyPair OKeyChooserConfigDialog::keyPair()const{
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}
@@ -1107,3 +1171,41 @@ void OKeyChooserConfigDialog::keyPressEvent( QKeyEvent* ev ) {
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
@@ -23,2 +23,3 @@ class QListViewItem;
23class QRadioButton; 23class QRadioButton;
24class QTimer;
24 25
@@ -29,2 +30,3 @@ namespace Private {
29 typedef QValueList<OKeyConfigWidgetPrivate> OKeyConfigWidgetPrivateList; 30 typedef QValueList<OKeyConfigWidgetPrivate> OKeyConfigWidgetPrivateList;
31 class OKeyListViewItem;
30} 32}
@@ -253,2 +255,4 @@ private slots:
253private: 255private:
256 void updateItem( Opie::Ui::Private::OKeyListViewItem* man,
257 const OKeyPair& newItem);
254 void initUi(); 258 void initUi();
@@ -298,4 +302,11 @@ signals:
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;
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}