-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,4 +1,4 @@ #include "okeyconfigwidget.h" +#include "okeyconfigwidget_p.h" -#include <opie2/olistview.h> @@ -12,2 +12,3 @@ #include <qlabel.h> +#include <qtimer.h> @@ -17,2 +18,3 @@ using namespace Opie::Ui; + /** @@ -541,24 +543,4 @@ OKeyConfigItem OKeyConfigManager::handleKeyEvent( QKeyEvent* e ) { */ - 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 ); @@ -734,5 +716,2 @@ OKeyConfigItem::List OKeyConfigManager::keyList( int keycode) { - -///////////////////////// -//////// Widget Starts Here namespace Opie { @@ -740,22 +719,2 @@ 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; - - }; @@ -803,2 +762,26 @@ namespace Private { + 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{ @@ -829,3 +812,4 @@ namespace Private { //////////////////////// - +//////////////////////// +//////// Widget Starts Here @@ -1041,10 +1025,3 @@ void OKeyConfigWidget::slotNoKey() { 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() ); } @@ -1061,14 +1038,3 @@ void OKeyConfigWidget::slotDefaultKey() { 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() ); } @@ -1084,2 +1050,3 @@ void OKeyConfigWidget::slotCustomKey() { + } @@ -1087,3 +1054,39 @@ void OKeyConfigWidget::slotCustomKey() { 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() ); } @@ -1091,5 +1094,23 @@ void OKeyConfigWidget::slotConfigure() { + +///// 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()) ); } @@ -1100,2 +1121,3 @@ OKeyChooserConfigDialog::~OKeyChooserConfigDialog() { Opie::Ui::OKeyPair OKeyChooserConfigDialog::keyPair()const{ + return m_keyPair; } @@ -1103,3 +1125,45 @@ Opie::Ui::OKeyPair OKeyChooserConfigDialog::keyPair()const{ 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 ) ); + } @@ -1107,3 +1171,41 @@ void OKeyChooserConfigDialog::keyPressEvent( QKeyEvent* ev ) { 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 @@ -23,2 +23,3 @@ class QListViewItem; class QRadioButton; +class QTimer; @@ -29,2 +30,3 @@ namespace Private { typedef QValueList<OKeyConfigWidgetPrivate> OKeyConfigWidgetPrivateList; + class OKeyListViewItem; } @@ -253,2 +255,4 @@ private slots: private: + void updateItem( Opie::Ui::Private::OKeyListViewItem* man, + const OKeyPair& newItem); void initUi(); @@ -298,4 +302,11 @@ signals: +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; 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; + + }; +} +} +} |