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);
}

}