From 3fe09f81bbea17464fab2e8aab45e8e10bb47dcc Mon Sep 17 00:00:00 2001 From: kh1 <qt-info@nokia.com> Date: Wed, 14 Jul 2010 12:16:38 +0200 Subject: [PATCH] Fix broken topic chooser. Reviewed-by: con --- src/shared/help/topicchooser.cpp | 54 +++++++++++++++++++++++++++++--- src/shared/help/topicchooser.h | 5 +++ 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/shared/help/topicchooser.cpp b/src/shared/help/topicchooser.cpp index d311264cdfc..bc057d45387 100644 --- a/src/shared/help/topicchooser.cpp +++ b/src/shared/help/topicchooser.cpp @@ -32,6 +32,7 @@ #include <QtCore/QMap> #include <QtCore/QUrl> +#include <QtGui/QKeyEvent> #include <QtGui/QStandardItemModel> #include <QtGui/QSortFilterProxyModel> @@ -41,6 +42,10 @@ TopicChooser::TopicChooser(QWidget *parent, const QString &keyword, , m_filterModel(new QSortFilterProxyModel(this)) { ui.setupUi(this); + + setFocusProxy(ui.lineEdit); + ui.lineEdit->installEventFilter(this); + ui.lineEdit->setPlaceholderText(tr("Filter")); ui.label->setText(tr("Choose a topic for <b>%1</b>:").arg(keyword)); QStandardItemModel *model = new QStandardItemModel(this); @@ -59,14 +64,13 @@ TopicChooser::TopicChooser(QWidget *parent, const QString &keyword, if (m_filterModel->rowCount() != 0) ui.listWidget->setCurrentIndex(m_filterModel->index(0, 0)); - ui.listWidget->setFocus(); - connect(ui.buttonDisplay, SIGNAL(clicked()), this, SLOT(accept())); + connect(ui.buttonDisplay, SIGNAL(clicked()), this, SLOT(acceptDialog())); connect(ui.buttonCancel, SIGNAL(clicked()), this, SLOT(reject())); connect(ui.listWidget, SIGNAL(activated(QModelIndex)), this, SLOT(activated(QModelIndex))); - connect(ui.lineEdit, SIGNAL(filterChanged(QString)), m_filterModel, - SLOT(setFilterFixedString(QString))); + connect(ui.lineEdit, SIGNAL(filterChanged(QString)), this, + SLOT(setFilter(QString))); } QUrl TopicChooser::link() const @@ -76,8 +80,50 @@ QUrl TopicChooser::link() const return QUrl(); } +void TopicChooser::acceptDialog() +{ + m_activedIndex = ui.listWidget->currentIndex(); + accept(); +} + +void TopicChooser::setFilter(const QString &pattern) +{ + m_filterModel->setFilterFixedString(pattern); + if (m_filterModel->rowCount() != 0 && !ui.listWidget->currentIndex().isValid()) + ui.listWidget->setCurrentIndex(m_filterModel->index(0, 0)); +} + void TopicChooser::activated(const QModelIndex &index) { m_activedIndex = index; accept(); } + +bool TopicChooser::eventFilter(QObject *object, QEvent *event) +{ + if (object == ui.lineEdit && event->type() == QEvent::KeyPress) { + QModelIndex idx = ui.listWidget->currentIndex(); + switch ((static_cast<QKeyEvent*>(event)->key())) { + case Qt::Key_Up: + idx = m_filterModel->index(idx.row() - 1, idx.column(), + idx.parent()); + if (idx.isValid()) + ui.listWidget->setCurrentIndex(idx); + break; + + case Qt::Key_Down: + idx = m_filterModel->index(idx.row() + 1, idx.column(), + idx.parent()); + if (idx.isValid()) + ui.listWidget->setCurrentIndex(idx); + break; + + default: ; + } + } else if (ui.lineEdit && event->type() == QEvent::FocusIn + && static_cast<QFocusEvent *>(event)->reason() != Qt::MouseFocusReason) { + ui.lineEdit->selectAll(); + ui.lineEdit->setFocus(); + } + return QDialog::eventFilter(object, event); +} diff --git a/src/shared/help/topicchooser.h b/src/shared/help/topicchooser.h index 666aae1917c..f4ff17f842b 100644 --- a/src/shared/help/topicchooser.h +++ b/src/shared/help/topicchooser.h @@ -52,8 +52,13 @@ public: QUrl link() const; private slots: + void acceptDialog(); + void setFilter(const QString &pattern); void activated(const QModelIndex &index); +private: + bool eventFilter(QObject *object, QEvent *event); + private: Ui::TopicChooser ui; QList<QUrl> m_links; -- GitLab