changeset 41:a42493a3baf8

* Make the typing select widget more useful (with working menu!)
author Chris Cannam
date Fri, 09 Apr 2010 16:19:50 +0100
parents 40e3f0049c00
children add3570c6035
files widgets/TypingSelectWidget.cpp widgets/TypingSelectWidget.h
diffstat 2 files changed, 93 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/widgets/TypingSelectWidget.cpp	Tue Apr 06 17:36:27 2010 +0100
+++ b/widgets/TypingSelectWidget.cpp	Fri Apr 09 16:19:50 2010 +0100
@@ -1,13 +1,15 @@
 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
 
+#include <dataquay/Uri.h>
+
 #include "TypingSelectWidget.h"
 
-#include <dataquay/Uri.h>
-
 #include <QGridLayout>
 #include <QLineEdit>
 #include <QListWidget>
 #include <QLabel>
+#include <QApplication>
+#include <QMenu>
 
 #include "Matcher.h"
 
@@ -29,12 +31,26 @@
     connect(m_editor, SIGNAL(textEdited(const QString &)),
 	    this, SLOT(textEdited(const QString &)));
 
-//    m_list = new QListWidget();
-    m_list = new QFrame;
-    m_listLayout = new QGridLayout;
-    m_list->setLayout(m_listLayout);
-    m_list->setWindowFlags(Qt::Window | Qt::Tool | Qt::FramelessWindowHint);
-    m_list->hide();
+    m_menu = new TypingSelectListMenu(this);
+    connect(m_menu, SIGNAL(keyPressed(QKeyEvent *)),
+            this, SLOT(menuKeyPressed(QKeyEvent *)));
+    connect(m_menu, SIGNAL(itemSelected(QString)),
+            this, SLOT(menuItemSelected(QString)));
+}
+
+void
+TypingSelectWidget::menuKeyPressed(QKeyEvent *ev)
+{
+    m_editor->setFocus();
+    QApplication::sendEvent(m_editor, ev);
+}
+
+void
+TypingSelectWidget::menuItemSelected(QString s)
+{
+    m_editor->setFocus();
+    m_editor->setText(s);
+    m_menu->hide();
 }
 
 void
@@ -44,36 +60,60 @@
 
     GuessList results = m_matchers[0]->match(s, 10);
 
-//    m_list->clear();
-
     if (results.empty()) {
-	m_list->hide();
+        m_menu->hide();
 	return;
     }
 
-    foreach (QWidget *w, m_listEntries) delete w;
-    m_listEntries.clear();    
+    m_menu->clear();
 
     foreach (Guess g, results) {
 	Composer *c = qobject_cast<Composer *>(g.entity());
 	if (!c) continue;
-        QLabel *l = new QLabel;
-        l->setText(c->getSortName(true));
-        m_listLayout->addWidget(l);
-        m_listEntries.push_back(l);
-
+        m_menu->addAction(c->getSortName(true));
     }
-
-    m_list->show();
-    m_list->move(m_editor->mapToGlobal(QPoint(0, m_editor->height())));
-    m_list->resize(m_list->sizeHint());
-//    m_list->setMinimumWidth((width()*3)/4);
-//    m_list->setMinimumHeight(height() * 5);
+    m_menu->popup(m_editor->mapToGlobal(QPoint(0, m_editor->height())));
 
     std::cerr << std::endl;
 }
-   
 
+void
+TypingSelectListMenu::keyPressEvent(QKeyEvent *e)
+{
+    switch (e->key()) {
+        // permit QMenu to have all its normal keystrokes, except for
+        // left, right, and space which are used by the text field
+    case Qt::Key_Tab:
+    case Qt::Key_Backtab:
+    case Qt::Key_PageUp:
+    case Qt::Key_PageDown:
+    case Qt::Key_Up:
+    case Qt::Key_Down:
+    case Qt::Key_Escape:
+    case Qt::Key_Back:
+        QMenu::keyPressEvent(e);
+        return;
+    }
+
+    if (e->key() == Qt::Key_Select ||
+        e->key() == Qt::Key_Return ||
+        e->key() == Qt::Key_Enter) {
+        QAction *a = activeAction();
+        if (a) {
+            emit itemSelected(a->text());
+            return;
+        }
+    }
+
+    emit keyPressed(e);
+}
+
+void
+TypingSelectListMenu::keyReleaseEvent(QKeyEvent *e)
+{
+    std::cerr << "keyReleaseEvent " << this << std::endl;
+    QMenu::keyReleaseEvent(e);
+}
 
 }
 
--- a/widgets/TypingSelectWidget.h	Tue Apr 06 17:36:27 2010 +0100
+++ b/widgets/TypingSelectWidget.h	Fri Apr 09 16:19:50 2010 +0100
@@ -5,16 +5,23 @@
 
 #include <QWidget>
 #include <QList>
+#include <QLabel>
+#include <QMenu>
+#include <QMouseEvent>
+#include <QShortcut>
 
 class QLineEdit;
 class QListWidget;
 class QGridLayout;
 class QFrame;
 
+
 namespace ClassicalData
 {
 
 class Matcher;
+class TypingSelectListEntry;
+class TypingSelectListMenu;
 
 class TypingSelectWidget : public QWidget
 {
@@ -27,15 +34,33 @@
 
 private slots:
     void textEdited(const QString &);
+    void menuKeyPressed(QKeyEvent *);
+    void menuItemSelected(QString);
 
 private:
     QList<Matcher *> m_matchers;
     QLineEdit *m_editor;
-    QFrame *m_list;
-    QGridLayout *m_listLayout;
-    QList<QWidget *> m_listEntries;
+    TypingSelectListMenu *m_menu;
+    QList<TypingSelectListEntry *> m_listEntries;
 };
 
+class TypingSelectListMenu : public QMenu
+{
+    Q_OBJECT
+    
+public:
+    TypingSelectListMenu(QWidget *parent = 0) : QMenu(parent) { }
+
+signals:
+    void keyPressed(QKeyEvent *e);
+    void itemSelected(QString);
+
+protected:
+    void keyPressEvent(QKeyEvent *e);
+    void keyReleaseEvent(QKeyEvent *e);
+};
+    
+
 }
 
 #endif