-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,24 +1,26 @@ #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; /** * The default Constructor of a OKeyPair. * A Key and a Modifier ( Alt/Shift/Ctrl ) * needs to be supplied. * Use Qt::Key for the information. @@ -150,35 +152,35 @@ OKeyPair::List OKeyPair::hardwareKeys() { for ( QValueList<Opie::Core::ODeviceButton>::ConstIterator it = but.begin(); it != but.end(); ++it ) lst.append( OKeyPair( (*it).keycode(), 0 ) ); 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 * you use this item with the OKeyConfigManager your setting * will be overwritten. * You can also specify a QObject and slot which sould get called * once this item is activated. This slot only works if you @@ -362,43 +364,43 @@ void OKeyConfigItem::setId( int id ) { bool OKeyConfigItem::isEmpty()const { if ( !m_def.isEmpty() ) return false; if ( !m_key.isEmpty() ) return false; if ( !m_text.isEmpty() ) return false; 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; if ( m_key != conf.m_key ) return false; 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 * QKeyEvents * * \code * Opie::Core::Config conf = oApp->config(); @@ -474,56 +476,56 @@ OKeyConfigManager::~OKeyConfigManager() { * make it be the empty key paur * We will change the group of the OConfig Item! * * @see OKeyPair::emptyKey */ 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; } /** * We will save the current configuration * 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() ); } } /** * This is function uses a QMap internally but you can have the same keycode @@ -567,35 +569,33 @@ OKeyConfigItem OKeyConfigManager::handleKeyEvent( QKeyEvent* e ) { * * @see handleKeyEvent */ 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(); delete m_map; m_map = 0; } /** @@ -751,24 +751,27 @@ namespace Private { QString keyToString( const OKeyPair& pair ) { int mod = 0; if ( pair.modifier() & Qt::ShiftButton ) mod |= Qt::SHIFT; 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 ) { key = e->ascii(); if ( key > 96 && key < 123) key -= 32; }else{ @@ -999,25 +1002,24 @@ void OKeyConfigWidget::slotListViewItem( QListViewItem* _item) { m_def ->setChecked( false ); m_cus ->setChecked( false ); }else { m_none->setChecked( false ); 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; /* * If immediate we need to remove and readd the key @@ -1059,33 +1061,67 @@ void OKeyConfigWidget::slotConfigure() { OKeyChooserConfigDialog dlg( this, "Dialog Name", true ); dlg.setCaption(tr("Configure Key")); connect(&dlg, SIGNAL(keyCaptured()), &dlg, SLOT(accept()) ); 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 ); item->updateText(); if ( m_mode == Imediate ) item->manager()->addKeyConfig( item->item() ); @@ -1119,56 +1155,55 @@ OKeyChooserConfigDialog::~OKeyChooserConfigDialog() { } Opie::Ui::OKeyPair OKeyChooserConfigDialog::keyPair()const{ return m_keyPair; } 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; m_keyPair = OKeyPair( key, mod ); }else{ mod = 0; switch( key ) { case Qt::Key_Control: mod = Qt::ControlButton; break; case Qt::Key_Shift: 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 ) ); } void OKeyChooserConfigDialog::keyReleaseEvent( QKeyEvent* ev ) { m_timer->stop(); QDialog::keyPressEvent( ev ); 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 @@ -40,26 +40,26 @@ namespace Private { * functions. * There are also static methods to get special keys. * OKeyPair will be used with \see OKeyConfigItem * * @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 ); static OKeyPair returnKey(); static OKeyPair leftArrowKey(); static OKeyPair rightArrowKey(); @@ -86,26 +86,26 @@ private: class OKeyConfigItem { friend class OKeyConfigManager; public: typedef QValueList<OKeyConfigItem> List; 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; OKeyPair defaultKeyPair()const; QCString configKey()const; @@ -244,26 +244,28 @@ public: void load(); void save(); 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; class Private; Private *d; }; |