Mercurial > hg > classical
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