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
|