Mercurial > hg > classical
view widgets/TypingSelectWidget.cpp @ 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 | 94cdfacc4910 |
children |
line wrap: on
line source
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ #include <dataquay/Uri.h> #include "TypingSelectWidget.h" #include <QGridLayout> #include <QLineEdit> #include <QListWidget> #include <QLabel> #include <QApplication> #include <QMenu> #include "Matcher.h" #include "Objects.h" using namespace Dataquay; namespace ClassicalData { TypingSelectWidget::TypingSelectWidget(QWidget *parent) : QWidget(parent) { QGridLayout *layout = new QGridLayout; setLayout(layout); m_editor = new QLineEdit; layout->addWidget(m_editor); connect(m_editor, SIGNAL(textEdited(const QString &)), this, SLOT(textEdited(const QString &))); 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 TypingSelectWidget::textEdited(const QString &s) { if (m_matchers.empty()) return; GuessList results = m_matchers[0]->match(s, 10); if (results.empty()) { m_menu->hide(); return; } m_menu->clear(); foreach (Guess g, results) { Composer *c = qobject_cast<Composer *>(g.entity()); if (!c) continue; m_menu->addAction(c->getSortName(true)); } 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); } }