-rw-r--r-- | libopie2/opieui/okeyconfigwidget.cpp | 93 | ||||
-rw-r--r-- | libopie2/opieui/okeyconfigwidget.h | 41 |
2 files changed, 119 insertions, 15 deletions
diff --git a/libopie2/opieui/okeyconfigwidget.cpp b/libopie2/opieui/okeyconfigwidget.cpp index 273f15b..41be1be 100644 --- a/libopie2/opieui/okeyconfigwidget.cpp +++ b/libopie2/opieui/okeyconfigwidget.cpp @@ -352,41 +352,46 @@ void OKeyConfigItem::setId( int id ) { m_id = id; } /** * If the item is not configured isEmpty() will return true * It is empty if no text is present and no default * and no configured key */ 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 ) { - if ( isEmpty() == conf.isEmpty() ) return true; +/* 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 ) { return !( *this == conf ); } /** * \brief c'tor * The Constructor for a OKeyConfigManager * @@ -496,28 +501,31 @@ void OKeyConfigManager::load() { void OKeyConfigManager::save() { m_conf->setGroup( m_group ); /* * Write each item */ for( OKeyConfigItem::List::Iterator it = m_keys.begin(); it != m_keys.end(); ++it ) { if ( (*it).isEmpty() ) continue; OKeyPair pair = (*it).keyPair(); OKeyPair deft = (*it).defaultKeyPair(); - /* don't write if it is the default setting */ + /* + * don't write if it is the default setting + * FIXME allow to remove Keys 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 * with different modifier key. The behaviour is undefined if you add a OKeyConfigItem * with same keycode and modifier key. The GUI takes care that a user can't * cofigure two keys. * @@ -538,27 +546,27 @@ OKeyConfigItem OKeyConfigManager::handleKeyEvent( QKeyEvent* e ) { * virtual keyboard * else change the button mod only */ if ( key == 0 ) { key = e->ascii(); if ( key > 96 && key < 123) key -= 32; }else{ int new_mod = 0; if ( mod & 256 ) new_mod |= Qt::ShiftButton; else if ( mod & 512 ) - new_mod |= Qt::AltButton; - else if ( mod & 1024 ) new_mod |= Qt::ControlButton; + else if ( mod & 1024 ) + new_mod |= Qt::AltButton; mod = new_mod == 0? mod : new_mod; } OKeyConfigItem::List _keyList = keyList( key ); if ( _keyList.isEmpty() ) return OKeyConfigItem(); OKeyConfigItem item; for ( OKeyConfigItem::List::Iterator it = _keyList.begin(); it != _keyList.end(); ++it ) { if ( (*it).keyPair().modifier() == mod ) { @@ -577,33 +585,35 @@ 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; } /** @@ -728,50 +738,64 @@ OKeyConfigItem::List OKeyConfigManager::keyList( int keycode) { namespace Opie { namespace Ui { namespace Private { static QString keyToString( const OKeyPair& ); class OKeyListViewItem : public Opie::Ui::OListViewItem { public: OKeyListViewItem( const OKeyConfigItem& item, OKeyConfigManager*, Opie::Ui::OListViewItem* parent); ~OKeyListViewItem(); void setDefault(); OKeyConfigItem& item(); + OKeyConfigItem origItem()const; void setItem( const OKeyConfigItem& item ); + void updateText(); OKeyConfigManager *manager(); private: OKeyConfigItem m_item; + OKeyConfigItem m_origItem; OKeyConfigManager* m_manager; }; OKeyListViewItem::OKeyListViewItem( const OKeyConfigItem& item, OKeyConfigManager* man, OListViewItem* parent) : Opie::Ui::OListViewItem( parent ), m_manager( man ) { + m_origItem = item; setItem( item ); } OKeyListViewItem::~OKeyListViewItem() {} OKeyConfigItem &OKeyListViewItem::item(){ return m_item; } + OKeyConfigItem OKeyListViewItem::origItem() const{ + return m_origItem; + } OKeyConfigManager* OKeyListViewItem::manager() { return m_manager; } void OKeyListViewItem::setItem( const OKeyConfigItem& item ) { m_item = item; setPixmap( 0, m_item.pixmap() ); setText ( 1, m_item.text() ); - setText ( 2, keyToString( m_item.keyPair() ) ); - setText ( 3, keyToString( m_item.defaultKeyPair() ) ); + m_item.keyPair().isEmpty() ? setText( 2, QObject::tr( "None" ) ) : + setText( 2, keyToString( m_item.keyPair() ) ); + + m_item.defaultKeyPair().isEmpty() ? setText( 3, QObject::tr( "None" ) ) : + setText ( 3, keyToString( m_item.defaultKeyPair() ) ); + } + void OKeyListViewItem::updateText() { + m_item.keyPair().isEmpty() ? setText( 2, QObject::tr( "None" ) ) : + setText( 2, keyToString( m_item.keyPair() ) ); } 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() ); @@ -839,24 +863,25 @@ void OKeyConfigWidget::initUi() { gridLay->setRowStretch( 1, 10 ); // let only the ListView strecth /* * LISTVIEW with the Keys */ m_view = new Opie::Ui::OListView( this ); m_view->setFocus(); m_view->setAllColumnsShowFocus( true ); m_view->addColumn( tr("Pixmap") ); m_view->addColumn( tr("Name","Name of the Action in the ListView Header" ) ); m_view->addColumn( tr("Key" ) ); m_view->addColumn( tr("Default Key" ) ); + m_view->setRootIsDecorated( true ); connect(m_view, SIGNAL(currentChanged(QListViewItem*)), this, SLOT(slotListViewItem(QListViewItem*)) ); gridLay->addMultiCellWidget( m_view, 1, 1, 0, 1 ); /* * GROUP with button info */ QGroupBox *box = new QGroupBox( this ); box ->setTitle( tr("Shortcut for Selected Action") ); box ->setFrameStyle( QFrame::Box | QFrame::Sunken ); @@ -888,26 +913,28 @@ void OKeyConfigWidget::initUi() { connect( rad, SIGNAL(clicked()), this, SLOT(slotCustomKey()) ); gr->insert( rad, 12 ); gridLay->addWidget( rad, 1, 2 ); m_cus = rad; m_btn = new QPushButton( tr("Configure Key"), box ); gridLay->addWidget( m_btn, 1, 4 ); m_lbl= new QLabel( tr( "Default: " ), box ); gridLay->addWidget( m_lbl, 2, 0 ); + connect(m_btn, SIGNAL(clicked()), + this, SLOT(slotConfigure())); - m_box = gr; + m_box = box; } /** * Set the ChangeMode. * You need to call this function prior to load * If you call this function past load the behaviour is undefined * But caling load again is safe */ void OKeyConfigWidget::setChangeMode( enum ChangeMode mode) { m_mode = mode; } @@ -940,105 +967,143 @@ void OKeyConfigWidget::load() { for (OKeyConfigItem::List::Iterator keyIt = list.begin(); keyIt != list.end();++keyIt ) (void )new Opie::Ui::Private::OKeyListViewItem(*keyIt, (*it).manager, item ); } } /** * Saves if in Queue Mode. It'll update the supplied * OKeyConfigManager objects. * If in Queue mode it'll just return */ void OKeyConfigWidget::save() { + /* + * Iterate over all config items + */ + QListViewItemIterator it( m_view ); + while ( it.current() ) { + if (it.current()->parent() ) { + Opie::Ui::Private::OKeyListViewItem *item = static_cast<Opie::Ui::Private::OKeyListViewItem*>( it.current() ); + OKeyConfigManager *man = item->manager(); + man->removeKeyConfig( item->origItem() ); + man->addKeyConfig( item->item() ); + } + ++it; + } + } /** * @internal */ void OKeyConfigWidget::slotListViewItem( QListViewItem* _item) { if ( !_item || !_item->parent() ) { m_box->setEnabled( false ); m_none->setChecked( true ); m_btn ->setEnabled( false ); m_def ->setChecked( false ); m_cus ->setChecked( false ); }else{ m_box->setEnabled( true ); Opie::Ui::Private::OKeyListViewItem *item = static_cast<Opie::Ui::Private::OKeyListViewItem*>( _item ); OKeyConfigItem keyItem= item->item(); + m_lbl->setText( tr("Default: " )+ item->text( 3 ) ); if ( keyItem.keyPair().isEmpty() ) { m_none->setChecked( true ); m_btn ->setEnabled( false ); 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() ) + if ( !m_view->currentItem() || !m_view->currentItem()->parent() ) return; /* * If immediate we need to remove and readd the key */ Opie::Ui::Private::OKeyListViewItem *item = static_cast<Opie::Ui::Private::OKeyListViewItem*>(m_view->currentItem()); if ( m_mode == Imediate ) item->manager()->removeKeyConfig( item->item() ); item->item().setKeyPair( OKeyPair::emptyKey() ); + item->updateText(); if ( m_mode == Imediate ) item->manager()->addKeyConfig( item->item() ); } void OKeyConfigWidget::slotDefaultKey() { - qWarning( "Slot Default Key" ); - m_none->setChecked( true ); + m_none->setChecked( false ); m_cus ->setChecked( false ); m_btn ->setEnabled( false ); - m_def ->setChecked( false ); + m_def ->setChecked( true ); - if ( !m_view->currentItem() || m_view->currentItem()->parent() ) + if ( !m_view->currentItem() || !m_view->currentItem()->parent() ) return; Opie::Ui::Private::OKeyListViewItem *item = static_cast<Opie::Ui::Private::OKeyListViewItem*>(m_view->currentItem()); /* * If immediate we need to remove and readd the key */ if ( m_mode == Imediate ) item->manager()->removeKeyConfig( item->item() ); item->item().setKeyPair( item->item().defaultKeyPair() ); + item->updateText(); if ( m_mode == Imediate ) item->manager()->addKeyConfig( item->item() ); } void OKeyConfigWidget::slotCustomKey() { - qWarning( "SlotCustom Key" ); m_cus ->setChecked( true ); m_btn ->setEnabled( true ); m_def ->setChecked( false ); m_none->setChecked( false ); - if ( !m_view->currentItem() || m_view->currentItem()->parent() ) + if ( !m_view->currentItem() || !m_view->currentItem()->parent() ) return; } +void OKeyConfigWidget::slotConfigure() { + +} + + +OKeyChooserConfigDialog::OKeyChooserConfigDialog( QWidget* par, const char* nam, + bool mod, WFlags fl ) + : QDialog( par, nam, mod, fl ) { +} + +OKeyChooserConfigDialog::~OKeyChooserConfigDialog() { +} + +Opie::Ui::OKeyPair OKeyChooserConfigDialog::keyPair()const{ +} + +void OKeyChooserConfigDialog::keyPressEvent( QKeyEvent* ev ) { + ev->ignore(); +} + +void OKeyChooserConfigDialog::keyReleaseEvent( QKeyEvent* ev ) { + ev->ignore(); +} diff --git a/libopie2/opieui/okeyconfigwidget.h b/libopie2/opieui/okeyconfigwidget.h index a7a5f48..8d2a1ef 100644 --- a/libopie2/opieui/okeyconfigwidget.h +++ b/libopie2/opieui/okeyconfigwidget.h @@ -239,32 +239,71 @@ public: ChangeMode changeMode()const; void insert( const QString& name, OKeyConfigManager* ); void load(); void save(); private slots: void slotListViewItem( QListViewItem* ); void slotNoKey(); void slotDefaultKey(); void slotCustomKey(); - + void slotConfigure(); private: 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; }; + +/** + * This is a small dialog that allows you to + * capture a key sequence. + * If you want it to close after a key was captured you + * can use this code snippet. + * + * \code + * OKeyChooserConfigDialog diag(0,0,true); + * connect(&diag,SIGNAL(keyCaptured()), + * this,SLOT(accept())); + * if( QPEApplication::execDialog(&diag) == QDialog::Accept ){ + * take_the_key_and_do_something + * } + * + * \endcode + * + */ +class OKeyChooserConfigDialog : public QDialog { + Q_OBJECT +public: + OKeyChooserConfigDialog( QWidget* parent = 0, const char* name = 0, bool modal = false, WFlags fl = 0 ); + ~OKeyChooserConfigDialog(); + + OKeyPair keyPair()const; + +protected: + void keyPressEvent( QKeyEvent* ); + void keyReleaseEvent( QKeyEvent* ); + +signals: + void keyCaptured(); + +private: + OKeyPair m_keyPair; + class Private; + Private *d; +}; + } } #endif |