-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 @@ -1,20 +1,22 @@ #include "okeyconfigwidget.h" #include "okeyconfigwidget_p.h" #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; /** @@ -154,27 +156,27 @@ OKeyPair::List OKeyPair::hardwareKeys() { return lst; } /** * 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; } /** * Not equal operator. calls the equal operator internally */ -bool OKeyPair::operator!=( const OKeyPair& pair) { +bool OKeyPair::operator!=( const OKeyPair& pair)const { return !(*this == pair); } /** * The normal Constructor to create a OKeyConfigItem * * You can set the the key paramater of this item but if @@ -366,17 +368,17 @@ bool OKeyConfigItem::isEmpty()const { if ( m_id != -1 ) return false; return true; } /** * 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; */ if ( m_id != conf.m_id ) return false; if ( m_obj != conf.m_obj ) return false; if ( m_text != conf.m_text ) return false; @@ -384,17 +386,17 @@ bool OKeyConfigItem::operator==( const OKeyConfigItem& conf ) { if ( m_def != conf.m_def ) return false; return true; } -bool OKeyConfigItem::operator!=( const OKeyConfigItem& conf ) { +bool OKeyConfigItem::operator!=( const OKeyConfigItem& conf )const { return !( *this == conf ); } /** * \brief c'tor * The Constructor for a OKeyConfigManager * * You can use this manager in multiple ways. Either make it handle @@ -478,21 +480,21 @@ OKeyConfigManager::~OKeyConfigManager() { */ void OKeyConfigManager::load() { m_conf->setGroup( m_group ); /* * 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() ); } delete m_map; m_map = 0; } @@ -501,25 +503,25 @@ void OKeyConfigManager::load() { * to the OConfig. We will change the group. */ void OKeyConfigManager::save() { m_conf->setGroup( m_group ); /* * 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; */ m_conf->writeEntry((*it).configKey()+"key", pair.keycode() ); m_conf->writeEntry((*it).configKey()+"mod", pair.modifier() ); } @@ -571,27 +573,25 @@ int OKeyConfigManager::handleKeyEventId( QKeyEvent* ev) { return handleKeyEvent( ev ).id(); } /** * 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; } /** * Remove the Key from the Config. Internal lists will be destroyed * 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; } /** * Clears the complete list */ void OKeyConfigManager::clearKeyConfig() { m_keys.clear(); @@ -755,16 +755,19 @@ namespace Private { if ( pair.modifier() & Qt::ControlButton ) mod |= Qt::CTRL; if ( pair.modifier() & Qt::AltButton ) mod |= Qt::ALT; 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(); /* * virtual keyboard * else change the button mod only */ if ( key == 0 ) { @@ -1003,17 +1006,16 @@ void OKeyConfigWidget::slotListViewItem( QListViewItem* _item) { m_cus ->setChecked( true ); m_btn ->setEnabled( true ); m_def ->setChecked( false ); } } } void OKeyConfigWidget::slotNoKey() { - qWarning( "No Key" ); m_none->setChecked( true ); m_cus ->setChecked( false ); m_btn ->setEnabled( false ); m_def ->setChecked( false ); if ( !m_view->currentItem() || !m_view->currentItem()->parent() ) return; @@ -1063,25 +1065,59 @@ void OKeyConfigWidget::slotConfigure() { if ( QPEApplication::execDialog( &dlg ) == QDialog::Accepted ) { Opie::Ui::Private::OKeyListViewItem *item = static_cast<Opie::Ui::Private::OKeyListViewItem*>(m_view->currentItem()); updateItem( item, dlg.keyPair() ); } } +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 */ if ( m_mode == Imediate ) item->manager()->removeKeyConfig( item->item() ); item->item().setKeyPair( newItem ); @@ -1123,17 +1159,16 @@ Opie::Ui::OKeyPair OKeyChooserConfigDialog::keyPair()const{ } void OKeyChooserConfigDialog::keyPressEvent( QKeyEvent* ev ) { QDialog::keyPressEvent( ev ); if ( ev->isAutoRepeat() ) return; - qWarning( "Key Press Event" ); int mod, key; Opie::Ui::Private::fixupKeys( key,mod, ev ); /* either we used software keyboard * or we've true support */ if ( !m_virtKey && !ev->key()) { m_virtKey = true; @@ -1148,23 +1183,23 @@ void OKeyChooserConfigDialog::keyPressEvent( QKeyEvent* ev ) { mod = Qt::ShiftButton; break; case Qt::Key_Alt: mod = Qt::AltButton; 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 ); } m_lbl->setText( Opie::Ui::Private::keyToString( m_keyPair ) ); } 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 { * @since 1.2 */ class OKeyPair { 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; int modifier()const; void setKeycode( int ); void setModifier( int ); @@ -90,18 +90,18 @@ public: OKeyConfigItem( const QString& text = QString::null , const QCString& config_key = QCString(), const QPixmap& symbol = QPixmap(), int id = -1, const OKeyPair& def = OKeyPair::emptyKey(), 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; OKeyPair keyPair()const; @@ -248,18 +248,20 @@ public: private slots: void slotListViewItem( QListViewItem* ); void slotNoKey(); void slotDefaultKey(); 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; QPushButton *m_btn; QRadioButton *m_def, *m_cus, *m_none; QWidget* m_box; ChangeMode m_mode; |