diff options
author | Daniel Teske <daniel.teske@digia.com> | 2014-05-13 13:06:30 +0200 |
---|---|---|
committer | Daniel Teske <daniel.teske@digia.com> | 2014-05-13 15:35:36 +0200 |
commit | 5969c01fa625fa41f0b45907c31c411792c4ffee (patch) | |
tree | 9db7484d394e7030aaa160dd20198ffe7a58e623 /src/libs/utils/treeviewcombobox.cpp | |
parent | 4743217eac61bb7af7f04787d2558493ac390823 (diff) | |
download | qt-creator-5969c01fa625fa41f0b45907c31c411792c4ffee.tar.gz |
ProjectExtensionsPage: Rework project combo box
Show a actual tree in the combobox.
Task-number: QTCREATORBUG-12002
Change-Id: I22b62f444923193972109a096bc6eef26a31bf9f
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
Reviewed-by: Daniel Teske <daniel.teske@digia.com>
Diffstat (limited to 'src/libs/utils/treeviewcombobox.cpp')
-rw-r--r-- | src/libs/utils/treeviewcombobox.cpp | 67 |
1 files changed, 58 insertions, 9 deletions
diff --git a/src/libs/utils/treeviewcombobox.cpp b/src/libs/utils/treeviewcombobox.cpp index 804b0e6eb8..dc6e5c5fbd 100644 --- a/src/libs/utils/treeviewcombobox.cpp +++ b/src/libs/utils/treeviewcombobox.cpp @@ -57,18 +57,41 @@ TreeViewComboBox::TreeViewComboBox(QWidget *parent) m_view->viewport()->installEventFilter(this); } +QModelIndex TreeViewComboBox::indexAbove(QModelIndex index) +{ + do + index = m_view->indexAbove(index); + while (index.isValid() && !(model()->flags(index) & Qt::ItemIsSelectable)); + return index; +} + +QModelIndex TreeViewComboBox::indexBelow(QModelIndex index) +{ + do + index = m_view->indexBelow(index); + while (index.isValid() && !(model()->flags(index) & Qt::ItemIsSelectable)); + return index; +} + +QModelIndex TreeViewComboBox::lastIndex(const QModelIndex index) +{ + if (index.isValid() && !m_view->isExpanded(index)) + return index; + + int rows = m_view->model()->rowCount(index); + if (rows == 0) + return index; + return lastIndex(m_view->model()->index(rows - 1, 0, index)); +} + void TreeViewComboBox::wheelEvent(QWheelEvent *e) { QModelIndex index = m_view->currentIndex(); - if (e->delta() > 0) { - do - index = m_view->indexAbove(index); - while (index.isValid() && !(model()->flags(index) & Qt::ItemIsSelectable)); - } else if (e->delta() < 0) { - do - index = m_view->indexBelow(index); - while (index.isValid() && !(model()->flags(index) & Qt::ItemIsSelectable)); - } + if (e->delta() > 0) + index = indexAbove(index); + else if (e->delta() < 0) + index = indexBelow(index); + e->accept(); if (!index.isValid()) return; @@ -79,8 +102,34 @@ void TreeViewComboBox::wheelEvent(QWheelEvent *e) emit activated(index.row()); } +void TreeViewComboBox::keyPressEvent(QKeyEvent *e) +{ + if (e->key() == Qt::Key_Up || e->key() == Qt::Key_PageUp) { + setCurrentIndex(indexAbove(m_view->currentIndex())); + } else if (e->key() == Qt::Key_Down || e->key() == Qt::Key_PageDown) { + setCurrentIndex(indexBelow(m_view->currentIndex())); + } else if (e->key() == Qt::Key_Home) { + QModelIndex index = m_view->model()->index(0, 0); + if (index.isValid() && !model()->flags(index) & Qt::ItemIsSelectable) + index = indexBelow(index); + setCurrentIndex(index); + } else if (e->key() == Qt::Key_End) { + QModelIndex index = lastIndex(m_view->rootIndex()); + if (index.isValid() && !model()->flags(index) & Qt::ItemIsSelectable) + index = indexAbove(index); + setCurrentIndex(index); + } else { + QComboBox::keyPressEvent(e); + return; + } + + e->accept(); +} + void TreeViewComboBox::setCurrentIndex(const QModelIndex &index) { + if (!index.isValid()) + return; setRootModelIndex(model()->parent(index)); QComboBox::setCurrentIndex(index.row()); setRootModelIndex(QModelIndex()); |