-rw-r--r-- | libopie2/opieui/okeyconfigwidget.cpp | 73 | ||||
-rw-r--r-- | libopie2/opieui/okeyconfigwidget.h | 12 |
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 @@ -5,12 +5,14 @@ #include <qgroupbox.h> #include <qradiobutton.h> #include <qpushbutton.h> #include <qbuttongroup.h> - +#include <qmessagebox.h> #include <qaccel.h> #include <qlayout.h> #include <qlabel.h> + +/* non gui */ #include <qtimer.h> using namespace Opie::Ui; @@ -158,9 +160,9 @@ OKeyPair::List OKeyPair::hardwareKeys() { /** * Equals operator. Check if two OKeyPairs have the same key and modifier * @see operator!= */ -bool OKeyPair::operator==( const OKeyPair& pair) { +bool OKeyPair::operator==( const OKeyPair& pair)const { if ( m_key != pair.m_key ) return false; if ( m_mod != pair.m_mod ) return false; return true; @@ -168,9 +170,9 @@ bool OKeyPair::operator==( const OKeyPair& pair) { /** * Not equal operator. calls the equal operator internally */ -bool OKeyPair::operator!=( const OKeyPair& pair) { +bool OKeyPair::operator!=( const OKeyPair& pair)const { return !(*this == pair); } @@ -370,9 +372,9 @@ bool OKeyConfigItem::isEmpty()const { /** * Check if the KeyPairs are the same */ -bool OKeyConfigItem::operator==( const OKeyConfigItem& conf ) { +bool OKeyConfigItem::operator==( const OKeyConfigItem& conf )const { /* if ( isEmpty() == conf.isEmpty() ) return true; else if ( isEmpty() != conf.isEmpty() ) return false; else if ( !isEmpty()!= conf.isEmpty() ) return false; */ @@ -388,9 +390,9 @@ bool OKeyConfigItem::operator==( const OKeyConfigItem& conf ) { return true; } -bool OKeyConfigItem::operator!=( const OKeyConfigItem& conf ) { +bool OKeyConfigItem::operator!=( const OKeyConfigItem& conf )const { return !( *this == conf ); } /** @@ -482,13 +484,13 @@ void OKeyConfigManager::load() { /* * Read each item */ int key, mod; - for( OKeyConfigItem::List::Iterator it = m_keys.begin(); - it != m_keys.end(); ++it ) { + for( OKeyConfigItem::List::Iterator it = m_keys.begin(); it != m_keys.end(); ++it ) { key = m_conf->readNumEntry( (*it).configKey()+"key", (*it).defaultKeyPair().keycode() ); mod = m_conf->readNumEntry( (*it).configKey()+"mod", (*it).defaultKeyPair().modifier() ); OKeyPair okey( key, mod ); + if ( !m_blackKeys.contains( okey ) && key != -1 && mod != -1 ) (*it).setKeyPair( OKeyPair(key, mod) ); else (*it).setKeyPair( OKeyPair::emptyKey() ); @@ -505,17 +507,17 @@ void OKeyConfigManager::save() { /* * Write each item */ - for( OKeyConfigItem::List::Iterator it = m_keys.begin(); - it != m_keys.end(); ++it ) { + for( OKeyConfigItem::List::Iterator it = m_keys.begin();it != m_keys.end(); ++it ) { + /* skip empty items */ if ( (*it).isEmpty() ) continue; OKeyPair pair = (*it).keyPair(); OKeyPair deft = (*it).defaultKeyPair(); /* * don't write if it is the default setting - * FIXME allow to remove Keys + * FIXME allow to remove Keys from config if ( (pair.keycode() == deft.keycode()) && (pair.modifier()== deft.modifier() ) ) return; */ @@ -575,9 +577,8 @@ int OKeyConfigManager::handleKeyEventId( QKeyEvent* ev) { * Add Key Config to the List of items */ void OKeyConfigManager::addKeyConfig( const OKeyConfigItem& item ) { m_keys.append( item ); - qWarning( "m_keys count is now %d", m_keys.count() ); delete m_map; m_map = 0; } /** @@ -585,9 +586,8 @@ void OKeyConfigManager::addKeyConfig( const OKeyConfigItem& item ) { * and rebuild on demand later */ void OKeyConfigManager::removeKeyConfig( const OKeyConfigItem& item ) { m_keys.remove( item ); - qWarning( "m_keys count is now %d", m_keys.count() ); delete m_map; m_map = 0; } /** @@ -759,8 +759,11 @@ namespace Private { return QAccel::keyToString( mod + pair.keycode() ); } + /* + * the virtual and hardware key events have both issues... + */ void fixupKeys( int& key, int &mod, QKeyEvent* e ) { key = e->key(); mod = e->state(); /* @@ -1007,9 +1010,8 @@ void OKeyConfigWidget::slotListViewItem( QListViewItem* _item) { } } void OKeyConfigWidget::slotNoKey() { - qWarning( "No Key" ); m_none->setChecked( true ); m_cus ->setChecked( false ); m_btn ->setEnabled( false ); m_def ->setChecked( false ); @@ -1067,17 +1069,51 @@ void OKeyConfigWidget::slotConfigure() { } +bool OKeyConfigWidget::sanityCheck( Opie::Ui::Private::OKeyListViewItem* item, + const OKeyPair& newItem ) { + OKeyPair::List bList = item->manager()->blackList(); + for ( OKeyPair::List::Iterator it = bList.begin(); it != bList.end(); ++it ) { + /* black list matched */ + if ( *it == newItem ) { + QMessageBox::warning( 0, tr("Key is on BlackList" ), + tr("<qt>The Key you choose is on the black list " + "and may not be used with this manager. Please " + "use a different key.</qt>" ) ); + return false; + } + } + /* no we need to check the other items which is dog slow */ + QListViewItemIterator it( item->parent() ); + while ( it.current() ) { + /* if not our parent and not us */ + if (it.current()->parent() && it.current() != item) { + /* damn already given away*/ + if ( newItem == static_cast<Opie::Ui::Private::OKeyListViewItem*>(it.current() )->item().keyPair() ) { + QMessageBox::warning( 0, tr("Key is already assigned" ), + tr("<qt>The Key you choose is already taken by " + "a different Item of your config. Please try" + "using a different key.</qt>" ) ); + return false; + } + } + ++it; + } + + return true; +} + void OKeyConfigWidget::updateItem( Opie::Ui::Private::OKeyListViewItem *item, const OKeyPair& newItem) { /* sanity check * check against the blacklist of the manager * check if another item uses this key which is o(n) at least */ - if ( !newItem.isEmpty() ) { + if ( !newItem.isEmpty() && !sanityCheck(item, newItem )) + return; + - } /* * If immediate we need to remove and readd the key */ @@ -1127,9 +1163,8 @@ void OKeyChooserConfigDialog::keyPressEvent( QKeyEvent* ev ) { if ( ev->isAutoRepeat() ) return; - qWarning( "Key Press Event" ); int mod, key; Opie::Ui::Private::fixupKeys( key,mod, ev ); /* either we used software keyboard @@ -1152,15 +1187,15 @@ void OKeyChooserConfigDialog::keyPressEvent( QKeyEvent* ev ) { break; default: break; } - if (mod ) { + if (mod ) m_mod |= mod; - }else + else m_key = key; if ( ( !mod || m_key ) && !m_timer->isActive() ) - m_timer->start( 50, true ); + m_timer->start( 150, true ); m_keyPair = OKeyPair( m_key, m_mod ); } 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 @@ -48,10 +48,10 @@ public: typedef QValueList<OKeyPair> List; OKeyPair( int key = -1, int modifier = -1); ~OKeyPair(); - bool operator==( const OKeyPair& ); - bool operator!=( const OKeyPair& ); + bool operator==( const OKeyPair& )const; + bool operator!=( const OKeyPair& )const; bool isEmpty()const; int keycode()const; @@ -94,10 +94,10 @@ public: QObject *caller = 0, const char* slot = 0); OKeyConfigItem( const Opie::Core::ODeviceButton& ); ~OKeyConfigItem(); - bool operator==( const OKeyConfigItem& ); - bool operator!=( const OKeyConfigItem& ); + bool operator==( const OKeyConfigItem& )const; + bool operator!=( const OKeyConfigItem& )const; QString text()const; QPixmap pixmap()const; int id()const; @@ -252,10 +252,12 @@ private slots: void slotCustomKey(); void slotConfigure(); private: + static bool sanityCheck( Opie::Ui::Private::OKeyListViewItem* man, + const OKeyPair& newItem ); void updateItem( Opie::Ui::Private::OKeyListViewItem* man, - const OKeyPair& newItem); + const OKeyPair& newItem); void initUi(); Opie::Ui::OListView *m_view; Opie::Ui::Private::OKeyConfigWidgetPrivateList m_list; QLabel *m_lbl; |