summaryrefslogtreecommitdiff
path: root/libopie2/opieui
Side-by-side diff
Diffstat (limited to 'libopie2/opieui') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opieui/okeyconfigwidget.cpp242
-rw-r--r--libopie2/opieui/okeyconfigwidget.h11
-rw-r--r--libopie2/opieui/okeyconfigwidget_p.h33
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;
+
+ };
+}
+}
+}