annotate widgets/TypingSelectWidget.cpp @ 53:bcea875d8d2f tip

More build fixes
author Chris Cannam
date Thu, 16 Oct 2014 19:03:51 +0100
parents a42493a3baf8
children
rev   line source
Chris@28 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@28 2
Chris@41 3 #include <dataquay/Uri.h>
Chris@41 4
Chris@28 5 #include "TypingSelectWidget.h"
Chris@28 6
Chris@28 7 #include <QGridLayout>
Chris@28 8 #include <QLineEdit>
Chris@30 9 #include <QListWidget>
Chris@39 10 #include <QLabel>
Chris@41 11 #include <QApplication>
Chris@41 12 #include <QMenu>
Chris@30 13
Chris@30 14 #include "Matcher.h"
Chris@30 15
Chris@30 16 #include "Objects.h"
Chris@30 17
Chris@30 18 using namespace Dataquay;
Chris@28 19
Chris@28 20 namespace ClassicalData {
Chris@28 21
Chris@28 22 TypingSelectWidget::TypingSelectWidget(QWidget *parent) :
Chris@28 23 QWidget(parent)
Chris@28 24 {
Chris@28 25 QGridLayout *layout = new QGridLayout;
Chris@28 26 setLayout(layout);
Chris@28 27
Chris@30 28 m_editor = new QLineEdit;
Chris@30 29 layout->addWidget(m_editor);
Chris@30 30
Chris@30 31 connect(m_editor, SIGNAL(textEdited(const QString &)),
Chris@30 32 this, SLOT(textEdited(const QString &)));
Chris@30 33
Chris@41 34 m_menu = new TypingSelectListMenu(this);
Chris@41 35 connect(m_menu, SIGNAL(keyPressed(QKeyEvent *)),
Chris@41 36 this, SLOT(menuKeyPressed(QKeyEvent *)));
Chris@41 37 connect(m_menu, SIGNAL(itemSelected(QString)),
Chris@41 38 this, SLOT(menuItemSelected(QString)));
Chris@41 39 }
Chris@41 40
Chris@41 41 void
Chris@41 42 TypingSelectWidget::menuKeyPressed(QKeyEvent *ev)
Chris@41 43 {
Chris@41 44 m_editor->setFocus();
Chris@41 45 QApplication::sendEvent(m_editor, ev);
Chris@41 46 }
Chris@41 47
Chris@41 48 void
Chris@41 49 TypingSelectWidget::menuItemSelected(QString s)
Chris@41 50 {
Chris@41 51 m_editor->setFocus();
Chris@41 52 m_editor->setText(s);
Chris@41 53 m_menu->hide();
Chris@30 54 }
Chris@30 55
Chris@30 56 void
Chris@30 57 TypingSelectWidget::textEdited(const QString &s)
Chris@30 58 {
Chris@30 59 if (m_matchers.empty()) return;
Chris@39 60
Chris@30 61 GuessList results = m_matchers[0]->match(s, 10);
Chris@39 62
Chris@30 63 if (results.empty()) {
Chris@41 64 m_menu->hide();
Chris@30 65 return;
Chris@30 66 }
Chris@30 67
Chris@41 68 m_menu->clear();
Chris@39 69
Chris@30 70 foreach (Guess g, results) {
Chris@30 71 Composer *c = qobject_cast<Composer *>(g.entity());
Chris@30 72 if (!c) continue;
Chris@41 73 m_menu->addAction(c->getSortName(true));
Chris@30 74 }
Chris@41 75 m_menu->popup(m_editor->mapToGlobal(QPoint(0, m_editor->height())));
Chris@30 76
Chris@30 77 std::cerr << std::endl;
Chris@30 78 }
Chris@30 79
Chris@41 80 void
Chris@41 81 TypingSelectListMenu::keyPressEvent(QKeyEvent *e)
Chris@41 82 {
Chris@41 83 switch (e->key()) {
Chris@41 84 // permit QMenu to have all its normal keystrokes, except for
Chris@41 85 // left, right, and space which are used by the text field
Chris@41 86 case Qt::Key_Tab:
Chris@41 87 case Qt::Key_Backtab:
Chris@41 88 case Qt::Key_PageUp:
Chris@41 89 case Qt::Key_PageDown:
Chris@41 90 case Qt::Key_Up:
Chris@41 91 case Qt::Key_Down:
Chris@41 92 case Qt::Key_Escape:
Chris@41 93 case Qt::Key_Back:
Chris@41 94 QMenu::keyPressEvent(e);
Chris@41 95 return;
Chris@41 96 }
Chris@41 97
Chris@41 98 if (e->key() == Qt::Key_Select ||
Chris@41 99 e->key() == Qt::Key_Return ||
Chris@41 100 e->key() == Qt::Key_Enter) {
Chris@41 101 QAction *a = activeAction();
Chris@41 102 if (a) {
Chris@41 103 emit itemSelected(a->text());
Chris@41 104 return;
Chris@41 105 }
Chris@41 106 }
Chris@41 107
Chris@41 108 emit keyPressed(e);
Chris@41 109 }
Chris@41 110
Chris@41 111 void
Chris@41 112 TypingSelectListMenu::keyReleaseEvent(QKeyEvent *e)
Chris@41 113 {
Chris@41 114 std::cerr << "keyReleaseEvent " << this << std::endl;
Chris@41 115 QMenu::keyReleaseEvent(e);
Chris@41 116 }
Chris@28 117
Chris@28 118 }
Chris@28 119