-rw-r--r-- | libopie2/opieui/okeyconfigwidget.cpp | 242 | ||||
-rw-r--r-- | libopie2/opieui/okeyconfigwidget.h | 11 | ||||
-rw-r--r-- | libopie2/opieui/okeyconfigwidget_p.h | 33 |
3 files changed, 216 insertions, 70 deletions
diff --git a/libopie2/opieui/okeyconfigwidget.cpp b/libopie2/opieui/okeyconfigwidget.cpp index 41be1be..3e08416 100644 --- a/libopie2/opieui/okeyconfigwidget.cpp +++ b/libopie2/opieui/okeyconfigwidget.cpp @@ -1,23 +1,25 @@ #include "okeyconfigwidget.h" +#include "okeyconfigwidget_p.h" -#include <opie2/olistview.h> #include <qgroupbox.h> #include <qradiobutton.h> #include <qpushbutton.h> #include <qbuttongroup.h> #include <qaccel.h> #include <qlayout.h> #include <qlabel.h> +#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. * The default arguments create an Empty OKeyPair. If you @@ -536,34 +538,14 @@ OKeyConfigItem OKeyConfigManager::handleKeyEvent( QKeyEvent* e ) { * Fix Up issues with Qt/E, my keybard, and virtual input * methods * First my Keyboard delivers 256,512,1024 for shift/ctrl/alt instead of the button state * Also key() on virtual inputmethods are zero and only ascii. We need to fix upper and lower * case ascii */ - int key = e->key(); - int 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{ - int new_mod = 0; - if ( mod & 256 ) - new_mod |= Qt::ShiftButton; - else if ( mod & 512 ) - new_mod |= Qt::ControlButton; - else if ( mod & 1024 ) - new_mod |= Qt::AltButton; - - mod = new_mod == 0? mod : new_mod; - } + int key, mod; + Opie::Ui::Private::fixupKeys( key, mod, e ); OKeyConfigItem::List _keyList = keyList( key ); if ( _keyList.isEmpty() ) return OKeyConfigItem(); OKeyConfigItem item; @@ -729,38 +711,15 @@ OKeyConfigItem::List OKeyConfigManager::keyList( int keycode) { } } return (*m_map)[keycode]; } - -///////////////////////// -//////// Widget Starts Here 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 ); } @@ -798,12 +757,36 @@ namespace Private { if ( pair.modifier() & Qt::AltButton ) mod |= Qt::ALT; return QAccel::keyToString( mod + pair.keycode() ); } + 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{ + int new_mod = 0; + if ( mod & 256 ) + new_mod |= Qt::ShiftButton; + else if ( mod & 512 ) + new_mod |= Qt::ControlButton; + else if ( mod & 1024 ) + new_mod |= Qt::AltButton; + + mod = new_mod == 0? mod : new_mod; + } + } + struct OKeyConfigWidgetPrivate{ OKeyConfigWidgetPrivate(const QString& = QString::null, OKeyConfigManager* = 0); bool operator==( const OKeyConfigWidgetPrivate& ); QString name; OKeyConfigManager *manager; @@ -824,13 +807,14 @@ namespace Private { } } //////////////////////// - +//////////////////////// +//////// Widget Starts Here /** * @@ -1036,74 +1020,192 @@ void OKeyConfigWidget::slotNoKey() { /* * 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() ); - + updateItem( item, OKeyPair::emptyKey() ); } void OKeyConfigWidget::slotDefaultKey() { m_none->setChecked( false ); m_cus ->setChecked( false ); m_btn ->setEnabled( false ); m_def ->setChecked( true ); 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() ); + updateItem( item, item->item().defaultKeyPair() ); } void OKeyConfigWidget::slotCustomKey() { m_cus ->setChecked( true ); m_btn ->setEnabled( true ); m_def ->setChecked( false ); m_none->setChecked( false ); if ( !m_view->currentItem() || !m_view->currentItem()->parent() ) return; + } void OKeyConfigWidget::slotConfigure() { + if ( !m_view->currentItem() || !m_view->currentItem()->parent() ) + return; + + /* FIXME make use of OModalHelper */ + 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() ); + } + + +} + +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 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() ); } + +///// OKeyChooserConfigDialog::OKeyChooserConfigDialog( QWidget* par, const char* nam, bool mod, WFlags fl ) - : QDialog( par, nam, mod, fl ) { + : QDialog( par, nam, mod, fl ), m_virtKey( false ), m_keyPair( OKeyPair::emptyKey() ) , + m_key( 0 ), m_mod( 0 ) { + setFocusPolicy( StrongFocus ); + + QHBoxLayout *lay = new QHBoxLayout( this ); + + QLabel *lbl = new QLabel( tr("Configure Key" ), this ); + lay->addWidget( lbl ); + lbl->setFocusPolicy( NoFocus ); + + m_lbl = new QLabel( this ); + lay->addWidget( m_lbl ); + m_lbl->setFocusPolicy( NoFocus ); + + m_timer = new QTimer( this ); + connect(m_timer, SIGNAL(timeout()), + this, SLOT(slotTimeUp()) ); } OKeyChooserConfigDialog::~OKeyChooserConfigDialog() { } Opie::Ui::OKeyPair OKeyChooserConfigDialog::keyPair()const{ + return m_keyPair; } void OKeyChooserConfigDialog::keyPressEvent( QKeyEvent* ev ) { - ev->ignore(); + 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 ) { + m_mod |= mod; + }else + m_key = key; + + if ( ( !mod || m_key ) && !m_timer->isActive() ) + m_timer->start( 50, true ); + + m_keyPair = OKeyPair( m_key, m_mod ); + } + + m_lbl->setText( Opie::Ui::Private::keyToString( m_keyPair ) ); + } void OKeyChooserConfigDialog::keyReleaseEvent( QKeyEvent* ev ) { - ev->ignore(); + m_timer->stop(); + QDialog::keyPressEvent( ev ); + + if ( ev->isAutoRepeat() ) + return; + + + if ( m_virtKey && !ev->key()) { + m_virtKey = false; + slotTimeUp(); + }else { + int mod = 0; + int key = ev->key(); + 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 ) + m_mod &= ~mod; + else + m_key = key; + m_keyPair = OKeyPair( m_key, m_mod ); + m_lbl->setText( Opie::Ui::Private::keyToString( m_keyPair ) ); + } +} + + +void OKeyChooserConfigDialog::slotTimeUp() { + m_mod = m_key = 0; + QTimer::singleShot(0, this, SIGNAL(keyCaptured()) ); } diff --git a/libopie2/opieui/okeyconfigwidget.h b/libopie2/opieui/okeyconfigwidget.h index 8d2a1ef..9e26719 100644 --- a/libopie2/opieui/okeyconfigwidget.h +++ b/libopie2/opieui/okeyconfigwidget.h @@ -18,18 +18,20 @@ class QKeyEvent; class QLabel; class QPushButton; class QListViewItem; class QRadioButton; +class QTimer; namespace Opie { namespace Ui { namespace Private { class OKeyConfigWidgetPrivate; typedef QValueList<OKeyConfigWidgetPrivate> OKeyConfigWidgetPrivateList; + class OKeyListViewItem; } class OListViewItem; class OListView; /** * \brief small class representing a Key with possible modifiers @@ -248,12 +250,14 @@ private slots: void slotNoKey(); void slotDefaultKey(); void slotCustomKey(); void slotConfigure(); private: + void updateItem( Opie::Ui::Private::OKeyListViewItem* man, + 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; @@ -293,14 +297,21 @@ protected: void keyPressEvent( QKeyEvent* ); void keyReleaseEvent( QKeyEvent* ); signals: void keyCaptured(); +private slots: + void slotTimeUp(); + private: + QTimer *m_timer; + QLabel *m_lbl; + bool m_virtKey : 1; OKeyPair m_keyPair; + int m_key, m_mod; class Private; Private *d; }; } } diff --git a/libopie2/opieui/okeyconfigwidget_p.h b/libopie2/opieui/okeyconfigwidget_p.h new file mode 100644 index 0000000..e7eaba6 --- a/dev/null +++ b/libopie2/opieui/okeyconfigwidget_p.h @@ -0,0 +1,33 @@ +/* + * Only Internal implemented in the same .cpp file anyway + */ +#include <opie2/olistview.h> + + +namespace Opie { +namespace Ui { +namespace Private { + static QString keyToString( const OKeyPair& ); + static void fixupKeys( int&, int&, QKeyEvent* ); + 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; + + }; +} +} +} |