summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opieui/okeyconfigwidget.cpp73
-rw-r--r--libopie2/opieui/okeyconfigwidget.h12
2 files changed, 61 insertions, 24 deletions
diff --git a/libopie2/opieui/okeyconfigwidget.cpp b/libopie2/opieui/okeyconfigwidget.cpp
index 3e08416..8967d77 100644
--- a/libopie2/opieui/okeyconfigwidget.cpp
+++ b/libopie2/opieui/okeyconfigwidget.cpp
@@ -1,20 +1,22 @@
1#include "okeyconfigwidget.h" 1#include "okeyconfigwidget.h"
2#include "okeyconfigwidget_p.h" 2#include "okeyconfigwidget_p.h"
3 3
4 4
5#include <qgroupbox.h> 5#include <qgroupbox.h>
6#include <qradiobutton.h> 6#include <qradiobutton.h>
7#include <qpushbutton.h> 7#include <qpushbutton.h>
8#include <qbuttongroup.h> 8#include <qbuttongroup.h>
9 9#include <qmessagebox.h>
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
14/* non gui */
13#include <qtimer.h> 15#include <qtimer.h>
14 16
15 17
16using namespace Opie::Ui; 18using namespace Opie::Ui;
17 19
18 20
19 21
20/** 22/**
@@ -154,27 +156,27 @@ OKeyPair::List OKeyPair::hardwareKeys() {
154 156
155 return lst; 157 return lst;
156} 158}
157 159
158/** 160/**
159 * Equals operator. Check if two OKeyPairs have the same key and modifier 161 * Equals operator. Check if two OKeyPairs have the same key and modifier
160 * @see operator!= 162 * @see operator!=
161 */ 163 */
162bool OKeyPair::operator==( const OKeyPair& pair) { 164bool OKeyPair::operator==( const OKeyPair& pair)const {
163 if ( m_key != pair.m_key ) return false; 165 if ( m_key != pair.m_key ) return false;
164 if ( m_mod != pair.m_mod ) return false; 166 if ( m_mod != pair.m_mod ) return false;
165 167
166 return true; 168 return true;
167} 169}
168 170
169/** 171/**
170 * Not equal operator. calls the equal operator internally 172 * Not equal operator. calls the equal operator internally
171 */ 173 */
172bool OKeyPair::operator!=( const OKeyPair& pair) { 174bool OKeyPair::operator!=( const OKeyPair& pair)const {
173 return !(*this == pair); 175 return !(*this == pair);
174} 176}
175 177
176 178
177/** 179/**
178 * The normal Constructor to create a OKeyConfigItem 180 * The normal Constructor to create a OKeyConfigItem
179 * 181 *
180 * You can set the the key paramater of this item but if 182 * You can set the the key paramater of this item but if
@@ -366,17 +368,17 @@ bool OKeyConfigItem::isEmpty()const {
366 if ( m_id != -1 ) return false; 368 if ( m_id != -1 ) return false;
367 369
368 return true; 370 return true;
369} 371}
370 372
371/** 373/**
372 * Check if the KeyPairs are the same 374 * Check if the KeyPairs are the same
373 */ 375 */
374bool OKeyConfigItem::operator==( const OKeyConfigItem& conf ) { 376bool OKeyConfigItem::operator==( const OKeyConfigItem& conf )const {
375/* if ( isEmpty() == conf.isEmpty() ) return true; 377/* if ( isEmpty() == conf.isEmpty() ) return true;
376 else if ( isEmpty() != conf.isEmpty() ) return false; 378 else if ( isEmpty() != conf.isEmpty() ) return false;
377 else if ( !isEmpty()!= conf.isEmpty() ) return false; 379 else if ( !isEmpty()!= conf.isEmpty() ) return false;
378*/ 380*/
379 381
380 if ( m_id != conf.m_id ) return false; 382 if ( m_id != conf.m_id ) return false;
381 if ( m_obj != conf.m_obj ) return false; 383 if ( m_obj != conf.m_obj ) return false;
382 if ( m_text != conf.m_text ) return false; 384 if ( m_text != conf.m_text ) return false;
@@ -384,17 +386,17 @@ bool OKeyConfigItem::operator==( const OKeyConfigItem& conf ) {
384 if ( m_def != conf.m_def ) return false; 386 if ( m_def != conf.m_def ) return false;
385 387
386 388
387 389
388 return true; 390 return true;
389 391
390} 392}
391 393
392bool OKeyConfigItem::operator!=( const OKeyConfigItem& conf ) { 394bool OKeyConfigItem::operator!=( const OKeyConfigItem& conf )const {
393 return !( *this == conf ); 395 return !( *this == conf );
394} 396}
395 397
396/** 398/**
397 * \brief c'tor 399 * \brief c'tor
398 * The Constructor for a OKeyConfigManager 400 * The Constructor for a OKeyConfigManager
399 * 401 *
400 * You can use this manager in multiple ways. Either make it handle 402 * You can use this manager in multiple ways. Either make it handle
@@ -478,21 +480,21 @@ OKeyConfigManager::~OKeyConfigManager() {
478 */ 480 */
479void OKeyConfigManager::load() { 481void OKeyConfigManager::load() {
480 m_conf->setGroup( m_group ); 482 m_conf->setGroup( m_group );
481 483
482 /* 484 /*
483 * Read each item 485 * Read each item
484 */ 486 */
485 int key, mod; 487 int key, mod;
486 for( OKeyConfigItem::List::Iterator it = m_keys.begin(); 488 for( OKeyConfigItem::List::Iterator it = m_keys.begin(); it != m_keys.end(); ++it ) {
487 it != m_keys.end(); ++it ) {
488 key = m_conf->readNumEntry( (*it).configKey()+"key", (*it).defaultKeyPair().keycode() ); 489 key = m_conf->readNumEntry( (*it).configKey()+"key", (*it).defaultKeyPair().keycode() );
489 mod = m_conf->readNumEntry( (*it).configKey()+"mod", (*it).defaultKeyPair().modifier() ); 490 mod = m_conf->readNumEntry( (*it).configKey()+"mod", (*it).defaultKeyPair().modifier() );
490 OKeyPair okey( key, mod ); 491 OKeyPair okey( key, mod );
492
491 if ( !m_blackKeys.contains( okey ) && key != -1 && mod != -1 ) 493 if ( !m_blackKeys.contains( okey ) && key != -1 && mod != -1 )
492 (*it).setKeyPair( OKeyPair(key, mod) ); 494 (*it).setKeyPair( OKeyPair(key, mod) );
493 else 495 else
494 (*it).setKeyPair( OKeyPair::emptyKey() ); 496 (*it).setKeyPair( OKeyPair::emptyKey() );
495 } 497 }
496 delete m_map; m_map = 0; 498 delete m_map; m_map = 0;
497} 499}
498 500
@@ -501,25 +503,25 @@ void OKeyConfigManager::load() {
501 * to the OConfig. We will change the group. 503 * to the OConfig. We will change the group.
502 */ 504 */
503void OKeyConfigManager::save() { 505void OKeyConfigManager::save() {
504 m_conf->setGroup( m_group ); 506 m_conf->setGroup( m_group );
505 507
506 /* 508 /*
507 * Write each item 509 * Write each item
508 */ 510 */
509 for( OKeyConfigItem::List::Iterator it = m_keys.begin(); 511 for( OKeyConfigItem::List::Iterator it = m_keys.begin();it != m_keys.end(); ++it ) {
510 it != m_keys.end(); ++it ) { 512 /* skip empty items */
511 if ( (*it).isEmpty() ) 513 if ( (*it).isEmpty() )
512 continue; 514 continue;
513 OKeyPair pair = (*it).keyPair(); 515 OKeyPair pair = (*it).keyPair();
514 OKeyPair deft = (*it).defaultKeyPair(); 516 OKeyPair deft = (*it).defaultKeyPair();
515 /* 517 /*
516 * don't write if it is the default setting 518 * don't write if it is the default setting
517 * FIXME allow to remove Keys 519 * FIXME allow to remove Keys from config
518 if ( (pair.keycode() == deft.keycode()) && 520 if ( (pair.keycode() == deft.keycode()) &&
519 (pair.modifier()== deft.modifier() ) ) 521 (pair.modifier()== deft.modifier() ) )
520 return; 522 return;
521 */ 523 */
522 524
523 m_conf->writeEntry((*it).configKey()+"key", pair.keycode() ); 525 m_conf->writeEntry((*it).configKey()+"key", pair.keycode() );
524 m_conf->writeEntry((*it).configKey()+"mod", pair.modifier() ); 526 m_conf->writeEntry((*it).configKey()+"mod", pair.modifier() );
525 } 527 }
@@ -571,27 +573,25 @@ int OKeyConfigManager::handleKeyEventId( QKeyEvent* ev) {
571 return handleKeyEvent( ev ).id(); 573 return handleKeyEvent( ev ).id();
572} 574}
573 575
574/** 576/**
575 * Add Key Config to the List of items 577 * Add Key Config to the List of items
576 */ 578 */
577void OKeyConfigManager::addKeyConfig( const OKeyConfigItem& item ) { 579void OKeyConfigManager::addKeyConfig( const OKeyConfigItem& item ) {
578 m_keys.append( item ); 580 m_keys.append( item );
579 qWarning( "m_keys count is now %d", m_keys.count() );
580 delete m_map; m_map = 0; 581 delete m_map; m_map = 0;
581} 582}
582 583
583/** 584/**
584 * Remove the Key from the Config. Internal lists will be destroyed 585 * Remove the Key from the Config. Internal lists will be destroyed
585 * and rebuild on demand later 586 * and rebuild on demand later
586 */ 587 */
587void OKeyConfigManager::removeKeyConfig( const OKeyConfigItem& item ) { 588void OKeyConfigManager::removeKeyConfig( const OKeyConfigItem& item ) {
588 m_keys.remove( item ); 589 m_keys.remove( item );
589 qWarning( "m_keys count is now %d", m_keys.count() );
590 delete m_map; m_map = 0; 590 delete m_map; m_map = 0;
591} 591}
592 592
593/** 593/**
594 * Clears the complete list 594 * Clears the complete list
595 */ 595 */
596void OKeyConfigManager::clearKeyConfig() { 596void OKeyConfigManager::clearKeyConfig() {
597 m_keys.clear(); 597 m_keys.clear();
@@ -755,16 +755,19 @@ namespace Private {
755 if ( pair.modifier() & Qt::ControlButton ) 755 if ( pair.modifier() & Qt::ControlButton )
756 mod |= Qt::CTRL; 756 mod |= Qt::CTRL;
757 if ( pair.modifier() & Qt::AltButton ) 757 if ( pair.modifier() & Qt::AltButton )
758 mod |= Qt::ALT; 758 mod |= Qt::ALT;
759 759
760 return QAccel::keyToString( mod + pair.keycode() ); 760 return QAccel::keyToString( mod + pair.keycode() );
761 } 761 }
762 762
763 /*
764 * the virtual and hardware key events have both issues...
765 */
763 void fixupKeys( int& key, int &mod, QKeyEvent* e ) { 766 void fixupKeys( int& key, int &mod, QKeyEvent* e ) {
764 key = e->key(); 767 key = e->key();
765 mod = e->state(); 768 mod = e->state();
766 /* 769 /*
767 * virtual keyboard 770 * virtual keyboard
768 * else change the button mod only 771 * else change the button mod only
769 */ 772 */
770 if ( key == 0 ) { 773 if ( key == 0 ) {
@@ -1003,17 +1006,16 @@ void OKeyConfigWidget::slotListViewItem( QListViewItem* _item) {
1003 m_cus ->setChecked( true ); 1006 m_cus ->setChecked( true );
1004 m_btn ->setEnabled( true ); 1007 m_btn ->setEnabled( true );
1005 m_def ->setChecked( false ); 1008 m_def ->setChecked( false );
1006 } 1009 }
1007 } 1010 }
1008} 1011}
1009 1012
1010void OKeyConfigWidget::slotNoKey() { 1013void OKeyConfigWidget::slotNoKey() {
1011 qWarning( "No Key" );
1012 m_none->setChecked( true ); 1014 m_none->setChecked( true );
1013 m_cus ->setChecked( false ); 1015 m_cus ->setChecked( false );
1014 m_btn ->setEnabled( false ); 1016 m_btn ->setEnabled( false );
1015 m_def ->setChecked( false ); 1017 m_def ->setChecked( false );
1016 1018
1017 if ( !m_view->currentItem() || !m_view->currentItem()->parent() ) 1019 if ( !m_view->currentItem() || !m_view->currentItem()->parent() )
1018 return; 1020 return;
1019 1021
@@ -1063,25 +1065,59 @@ void OKeyConfigWidget::slotConfigure() {
1063 if ( QPEApplication::execDialog( &dlg ) == QDialog::Accepted ) { 1065 if ( QPEApplication::execDialog( &dlg ) == QDialog::Accepted ) {
1064 Opie::Ui::Private::OKeyListViewItem *item = static_cast<Opie::Ui::Private::OKeyListViewItem*>(m_view->currentItem()); 1066 Opie::Ui::Private::OKeyListViewItem *item = static_cast<Opie::Ui::Private::OKeyListViewItem*>(m_view->currentItem());
1065 updateItem( item, dlg.keyPair() ); 1067 updateItem( item, dlg.keyPair() );
1066 } 1068 }
1067 1069
1068 1070
1069} 1071}
1070 1072
1073bool OKeyConfigWidget::sanityCheck( Opie::Ui::Private::OKeyListViewItem* item,
1074 const OKeyPair& newItem ) {
1075 OKeyPair::List bList = item->manager()->blackList();
1076 for ( OKeyPair::List::Iterator it = bList.begin(); it != bList.end(); ++it ) {
1077 /* black list matched */
1078 if ( *it == newItem ) {
1079 QMessageBox::warning( 0, tr("Key is on BlackList" ),
1080 tr("<qt>The Key you choose is on the black list "
1081 "and may not be used with this manager. Please "
1082 "use a different key.</qt>" ) );
1083 return false;
1084 }
1085 }
1086 /* no we need to check the other items which is dog slow */
1087 QListViewItemIterator it( item->parent() );
1088 while ( it.current() ) {
1089 /* if not our parent and not us */
1090 if (it.current()->parent() && it.current() != item) {
1091 /* damn already given away*/
1092 if ( newItem == static_cast<Opie::Ui::Private::OKeyListViewItem*>(it.current() )->item().keyPair() ) {
1093 QMessageBox::warning( 0, tr("Key is already assigned" ),
1094 tr("<qt>The Key you choose is already taken by "
1095 "a different Item of your config. Please try"
1096 "using a different key.</qt>" ) );
1097 return false;
1098 }
1099 }
1100 ++it;
1101 }
1102
1103 return true;
1104}
1105
1071void OKeyConfigWidget::updateItem( Opie::Ui::Private::OKeyListViewItem *item, 1106void OKeyConfigWidget::updateItem( Opie::Ui::Private::OKeyListViewItem *item,
1072 const OKeyPair& newItem) { 1107 const OKeyPair& newItem) {
1073 /* sanity check 1108 /* sanity check
1074 * check against the blacklist of the manager 1109 * check against the blacklist of the manager
1075 * check if another item uses this key which is o(n) at least 1110 * check if another item uses this key which is o(n) at least
1076 */ 1111 */
1077 if ( !newItem.isEmpty() ) { 1112 if ( !newItem.isEmpty() && !sanityCheck(item, newItem ))
1113 return;
1114
1078 1115
1079 }
1080 1116
1081 /* 1117 /*
1082 * If immediate we need to remove and readd the key 1118 * If immediate we need to remove and readd the key
1083 */ 1119 */
1084 if ( m_mode == Imediate ) 1120 if ( m_mode == Imediate )
1085 item->manager()->removeKeyConfig( item->item() ); 1121 item->manager()->removeKeyConfig( item->item() );
1086 1122
1087 item->item().setKeyPair( newItem ); 1123 item->item().setKeyPair( newItem );
@@ -1123,17 +1159,16 @@ Opie::Ui::OKeyPair OKeyChooserConfigDialog::keyPair()const{
1123} 1159}
1124 1160
1125void OKeyChooserConfigDialog::keyPressEvent( QKeyEvent* ev ) { 1161void OKeyChooserConfigDialog::keyPressEvent( QKeyEvent* ev ) {
1126 QDialog::keyPressEvent( ev ); 1162 QDialog::keyPressEvent( ev );
1127 1163
1128 if ( ev->isAutoRepeat() ) 1164 if ( ev->isAutoRepeat() )
1129 return; 1165 return;
1130 1166
1131 qWarning( "Key Press Event" );
1132 int mod, key; 1167 int mod, key;
1133 Opie::Ui::Private::fixupKeys( key,mod, ev ); 1168 Opie::Ui::Private::fixupKeys( key,mod, ev );
1134 1169
1135 /* either we used software keyboard 1170 /* either we used software keyboard
1136 * or we've true support 1171 * or we've true support
1137 */ 1172 */
1138 if ( !m_virtKey && !ev->key()) { 1173 if ( !m_virtKey && !ev->key()) {
1139 m_virtKey = true; 1174 m_virtKey = true;
@@ -1148,23 +1183,23 @@ void OKeyChooserConfigDialog::keyPressEvent( QKeyEvent* ev ) {
1148 mod = Qt::ShiftButton; 1183 mod = Qt::ShiftButton;
1149 break; 1184 break;
1150 case Qt::Key_Alt: 1185 case Qt::Key_Alt:
1151 mod = Qt::AltButton; 1186 mod = Qt::AltButton;
1152 break; 1187 break;
1153 default: 1188 default:
1154 break; 1189 break;
1155 } 1190 }
1156 if (mod ) { 1191 if (mod )
1157 m_mod |= mod; 1192 m_mod |= mod;
1158 }else 1193 else
1159 m_key = key; 1194 m_key = key;
1160 1195
1161 if ( ( !mod || m_key ) && !m_timer->isActive() ) 1196 if ( ( !mod || m_key ) && !m_timer->isActive() )
1162 m_timer->start( 50, true ); 1197 m_timer->start( 150, true );
1163 1198
1164 m_keyPair = OKeyPair( m_key, m_mod ); 1199 m_keyPair = OKeyPair( m_key, m_mod );
1165 } 1200 }
1166 1201
1167 m_lbl->setText( Opie::Ui::Private::keyToString( m_keyPair ) ); 1202 m_lbl->setText( Opie::Ui::Private::keyToString( m_keyPair ) );
1168 1203
1169} 1204}
1170 1205
diff --git a/libopie2/opieui/okeyconfigwidget.h b/libopie2/opieui/okeyconfigwidget.h
index 9e26719..f75ed99 100644
--- a/libopie2/opieui/okeyconfigwidget.h
+++ b/libopie2/opieui/okeyconfigwidget.h
@@ -44,18 +44,18 @@ namespace Private {
44 * @since 1.2 44 * @since 1.2
45 */ 45 */
46class OKeyPair { 46class OKeyPair {
47public: 47public:
48 typedef QValueList<OKeyPair> List; 48 typedef QValueList<OKeyPair> List;
49 OKeyPair( int key = -1, int modifier = -1); 49 OKeyPair( int key = -1, int modifier = -1);
50 ~OKeyPair(); 50 ~OKeyPair();
51 51
52 bool operator==( const OKeyPair& ); 52 bool operator==( const OKeyPair& )const;
53 bool operator!=( const OKeyPair& ); 53 bool operator!=( const OKeyPair& )const;
54 54
55 bool isEmpty()const; 55 bool isEmpty()const;
56 56
57 int keycode()const; 57 int keycode()const;
58 int modifier()const; 58 int modifier()const;
59 59
60 void setKeycode( int ); 60 void setKeycode( int );
61 void setModifier( int ); 61 void setModifier( int );
@@ -90,18 +90,18 @@ public:
90 OKeyConfigItem( const QString& text = QString::null , const QCString& config_key = QCString(), 90 OKeyConfigItem( const QString& text = QString::null , const QCString& config_key = QCString(),
91 const QPixmap& symbol = QPixmap(), 91 const QPixmap& symbol = QPixmap(),
92 int id = -1, 92 int id = -1,
93 const OKeyPair& def = OKeyPair::emptyKey(), 93 const OKeyPair& def = OKeyPair::emptyKey(),
94 QObject *caller = 0, const char* slot = 0); 94 QObject *caller = 0, const char* slot = 0);
95 OKeyConfigItem( const Opie::Core::ODeviceButton& ); 95 OKeyConfigItem( const Opie::Core::ODeviceButton& );
96 ~OKeyConfigItem(); 96 ~OKeyConfigItem();
97 97
98 bool operator==( const OKeyConfigItem& ); 98 bool operator==( const OKeyConfigItem& )const;
99 bool operator!=( const OKeyConfigItem& ); 99 bool operator!=( const OKeyConfigItem& )const;
100 100
101 QString text()const; 101 QString text()const;
102 QPixmap pixmap()const; 102 QPixmap pixmap()const;
103 int id()const; 103 int id()const;
104 104
105 105
106 106
107 OKeyPair keyPair()const; 107 OKeyPair keyPair()const;
@@ -248,18 +248,20 @@ public:
248private slots: 248private slots:
249 void slotListViewItem( QListViewItem* ); 249 void slotListViewItem( QListViewItem* );
250 void slotNoKey(); 250 void slotNoKey();
251 void slotDefaultKey(); 251 void slotDefaultKey();
252 void slotCustomKey(); 252 void slotCustomKey();
253 void slotConfigure(); 253 void slotConfigure();
254 254
255private: 255private:
256 static bool sanityCheck( Opie::Ui::Private::OKeyListViewItem* man,
257 const OKeyPair& newItem );
256 void updateItem( Opie::Ui::Private::OKeyListViewItem* man, 258 void updateItem( Opie::Ui::Private::OKeyListViewItem* man,
257 const OKeyPair& newItem); 259 const OKeyPair& newItem);
258 void initUi(); 260 void initUi();
259 Opie::Ui::OListView *m_view; 261 Opie::Ui::OListView *m_view;
260 Opie::Ui::Private::OKeyConfigWidgetPrivateList m_list; 262 Opie::Ui::Private::OKeyConfigWidgetPrivateList m_list;
261 QLabel *m_lbl; 263 QLabel *m_lbl;
262 QPushButton *m_btn; 264 QPushButton *m_btn;
263 QRadioButton *m_def, *m_cus, *m_none; 265 QRadioButton *m_def, *m_cus, *m_none;
264 QWidget* m_box; 266 QWidget* m_box;
265 ChangeMode m_mode; 267 ChangeMode m_mode;