diff options
author | Daniel Teske <daniel.teske@digia.com> | 2014-04-30 11:44:19 +0200 |
---|---|---|
committer | Daniel Teske <daniel.teske@digia.com> | 2014-04-30 15:02:22 +0200 |
commit | da79a142b5582fc431fb107350e0fa84d88348c3 (patch) | |
tree | 132cd178aa7b590a561e40520f0c4c33f4adefdc /src/libs/utils/treeviewcombobox.cpp | |
parent | f9c02faa2422080ee5bd22c329d6179c21eeb9c7 (diff) |
Move OverViewCombo to Utils::
Change-Id: I0724b6223ba9505effe151ce474f0f378671e60f
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
Diffstat (limited to 'src/libs/utils/treeviewcombobox.cpp')
-rw-r--r-- | src/libs/utils/treeviewcombobox.cpp | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/src/libs/utils/treeviewcombobox.cpp b/src/libs/utils/treeviewcombobox.cpp new file mode 100644 index 00000000000..804b0e6eb8c --- /dev/null +++ b/src/libs/utils/treeviewcombobox.cpp @@ -0,0 +1,118 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#include "treeviewcombobox.h" + +#include <QWheelEvent> + +using namespace Utils; + +TreeViewComboBoxView::TreeViewComboBoxView(QWidget *parent) + : QTreeView(parent) +{ + // TODO: Disable the root for all items (with a custom delegate?) + setRootIsDecorated(false); +} + +void TreeViewComboBoxView::adjustWidth(int width) +{ + setMaximumWidth(width); + setMinimumWidth(qMin(qMax(sizeHintForColumn(0), minimumSizeHint().width()), width)); +} + + +TreeViewComboBox::TreeViewComboBox(QWidget *parent) + : QComboBox(parent), m_skipNextHide(false) +{ + m_view = new TreeViewComboBoxView; + m_view->setHeaderHidden(true); + m_view->setItemsExpandable(true); + setView(m_view); + m_view->viewport()->installEventFilter(this); +} + +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)); + } + e->accept(); + if (!index.isValid()) + return; + + setCurrentIndex(index); + + // for compatibility we emit activated with a useless row parameter + emit activated(index.row()); +} + +void TreeViewComboBox::setCurrentIndex(const QModelIndex &index) +{ + setRootModelIndex(model()->parent(index)); + QComboBox::setCurrentIndex(index.row()); + setRootModelIndex(QModelIndex()); + m_view->setCurrentIndex(index); +} + +bool TreeViewComboBox::eventFilter(QObject *object, QEvent *event) +{ + if (event->type() == QEvent::MouseButtonPress && object == view()->viewport()) { + QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event); + QModelIndex index = view()->indexAt(mouseEvent->pos()); + if (!view()->visualRect(index).contains(mouseEvent->pos())) + m_skipNextHide = true; + } + return false; +} + +void TreeViewComboBox::showPopup() +{ + m_view->adjustWidth(topLevelWidget()->geometry().width()); + QComboBox::showPopup(); +} + +void TreeViewComboBox::hidePopup() +{ + if (m_skipNextHide) + m_skipNextHide = false; + else + QComboBox::hidePopup(); +} + +TreeViewComboBoxView *TreeViewComboBox::view() const +{ + return m_view; +} |