Chris@28: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@28: Chris@41: #include Chris@41: Chris@28: #include "TypingSelectWidget.h" Chris@28: Chris@28: #include Chris@28: #include Chris@30: #include Chris@39: #include Chris@41: #include Chris@41: #include Chris@30: Chris@30: #include "Matcher.h" Chris@30: Chris@30: #include "Objects.h" Chris@30: Chris@30: using namespace Dataquay; Chris@28: Chris@28: namespace ClassicalData { Chris@28: Chris@28: TypingSelectWidget::TypingSelectWidget(QWidget *parent) : Chris@28: QWidget(parent) Chris@28: { Chris@28: QGridLayout *layout = new QGridLayout; Chris@28: setLayout(layout); Chris@28: Chris@30: m_editor = new QLineEdit; Chris@30: layout->addWidget(m_editor); Chris@30: Chris@30: connect(m_editor, SIGNAL(textEdited(const QString &)), Chris@30: this, SLOT(textEdited(const QString &))); Chris@30: Chris@41: m_menu = new TypingSelectListMenu(this); Chris@41: connect(m_menu, SIGNAL(keyPressed(QKeyEvent *)), Chris@41: this, SLOT(menuKeyPressed(QKeyEvent *))); Chris@41: connect(m_menu, SIGNAL(itemSelected(QString)), Chris@41: this, SLOT(menuItemSelected(QString))); Chris@41: } Chris@41: Chris@41: void Chris@41: TypingSelectWidget::menuKeyPressed(QKeyEvent *ev) Chris@41: { Chris@41: m_editor->setFocus(); Chris@41: QApplication::sendEvent(m_editor, ev); Chris@41: } Chris@41: Chris@41: void Chris@41: TypingSelectWidget::menuItemSelected(QString s) Chris@41: { Chris@41: m_editor->setFocus(); Chris@41: m_editor->setText(s); Chris@41: m_menu->hide(); Chris@30: } Chris@30: Chris@30: void Chris@30: TypingSelectWidget::textEdited(const QString &s) Chris@30: { Chris@30: if (m_matchers.empty()) return; Chris@39: Chris@30: GuessList results = m_matchers[0]->match(s, 10); Chris@39: Chris@30: if (results.empty()) { Chris@41: m_menu->hide(); Chris@30: return; Chris@30: } Chris@30: Chris@41: m_menu->clear(); Chris@39: Chris@30: foreach (Guess g, results) { Chris@30: Composer *c = qobject_cast(g.entity()); Chris@30: if (!c) continue; Chris@41: m_menu->addAction(c->getSortName(true)); Chris@30: } Chris@41: m_menu->popup(m_editor->mapToGlobal(QPoint(0, m_editor->height()))); Chris@30: Chris@30: std::cerr << std::endl; Chris@30: } Chris@30: Chris@41: void Chris@41: TypingSelectListMenu::keyPressEvent(QKeyEvent *e) Chris@41: { Chris@41: switch (e->key()) { Chris@41: // permit QMenu to have all its normal keystrokes, except for Chris@41: // left, right, and space which are used by the text field Chris@41: case Qt::Key_Tab: Chris@41: case Qt::Key_Backtab: Chris@41: case Qt::Key_PageUp: Chris@41: case Qt::Key_PageDown: Chris@41: case Qt::Key_Up: Chris@41: case Qt::Key_Down: Chris@41: case Qt::Key_Escape: Chris@41: case Qt::Key_Back: Chris@41: QMenu::keyPressEvent(e); Chris@41: return; Chris@41: } Chris@41: Chris@41: if (e->key() == Qt::Key_Select || Chris@41: e->key() == Qt::Key_Return || Chris@41: e->key() == Qt::Key_Enter) { Chris@41: QAction *a = activeAction(); Chris@41: if (a) { Chris@41: emit itemSelected(a->text()); Chris@41: return; Chris@41: } Chris@41: } Chris@41: Chris@41: emit keyPressed(e); Chris@41: } Chris@41: Chris@41: void Chris@41: TypingSelectListMenu::keyReleaseEvent(QKeyEvent *e) Chris@41: { Chris@41: std::cerr << "keyReleaseEvent " << this << std::endl; Chris@41: QMenu::keyReleaseEvent(e); Chris@41: } Chris@28: Chris@28: } Chris@28: