diff options
Diffstat (limited to 'examples/tools/treemodelcompleter/mainwindow.cpp')
-rw-r--r-- | examples/tools/treemodelcompleter/mainwindow.cpp | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/examples/tools/treemodelcompleter/mainwindow.cpp b/examples/tools/treemodelcompleter/mainwindow.cpp new file mode 100644 index 0000000000..3f832fa6ec --- /dev/null +++ b/examples/tools/treemodelcompleter/mainwindow.cpp @@ -0,0 +1,246 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtGui> +#include "treemodelcompleter.h" +#include "mainwindow.h" + +//! [0] +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent), completer(0), lineEdit(0) +{ + createMenu(); + + completer = new TreeModelCompleter(this); + completer->setModel(modelFromFile(":/resources/treemodel.txt")); + completer->setSeparator(QLatin1String(".")); + QObject::connect(completer, SIGNAL(highlighted(QModelIndex)), + this, SLOT(highlight(QModelIndex))); + + QWidget *centralWidget = new QWidget; + + QLabel *modelLabel = new QLabel; + modelLabel->setText(tr("Tree Model<br>(Double click items to edit)")); + + QLabel *modeLabel = new QLabel; + modeLabel->setText(tr("Completion Mode")); + modeCombo = new QComboBox; + modeCombo->addItem(tr("Inline")); + modeCombo->addItem(tr("Filtered Popup")); + modeCombo->addItem(tr("Unfiltered Popup")); + modeCombo->setCurrentIndex(1); + + QLabel *caseLabel = new QLabel; + caseLabel->setText(tr("Case Sensitivity")); + caseCombo = new QComboBox; + caseCombo->addItem(tr("Case Insensitive")); + caseCombo->addItem(tr("Case Sensitive")); + caseCombo->setCurrentIndex(0); +//! [0] + +//! [1] + QLabel *separatorLabel = new QLabel; + separatorLabel->setText(tr("Tree Separator")); + + QLineEdit *separatorLineEdit = new QLineEdit; + separatorLineEdit->setText(completer->separator()); + connect(separatorLineEdit, SIGNAL(textChanged(QString)), + completer, SLOT(setSeparator(QString))); + + QCheckBox *wrapCheckBox = new QCheckBox; + wrapCheckBox->setText(tr("Wrap around completions")); + wrapCheckBox->setChecked(completer->wrapAround()); + connect(wrapCheckBox, SIGNAL(clicked(bool)), completer, SLOT(setWrapAround(bool))); + + contentsLabel = new QLabel; + contentsLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + connect(separatorLineEdit, SIGNAL(textChanged(QString)), + this, SLOT(updateContentsLabel(QString))); + + treeView = new QTreeView; + treeView->setModel(completer->model()); + treeView->header()->hide(); + treeView->expandAll(); +//! [1] + +//! [2] + connect(modeCombo, SIGNAL(activated(int)), this, SLOT(changeMode(int))); + connect(caseCombo, SIGNAL(activated(int)), this, SLOT(changeCase(int))); + + lineEdit = new QLineEdit; + lineEdit->setCompleter(completer); +//! [2] + +//! [3] + QGridLayout *layout = new QGridLayout; + layout->addWidget(modelLabel, 0, 0); layout->addWidget(treeView, 0, 1); + layout->addWidget(modeLabel, 1, 0); layout->addWidget(modeCombo, 1, 1); + layout->addWidget(caseLabel, 2, 0); layout->addWidget(caseCombo, 2, 1); + layout->addWidget(separatorLabel, 3, 0); layout->addWidget(separatorLineEdit, 3, 1); + layout->addWidget(wrapCheckBox, 4, 0); + layout->addWidget(contentsLabel, 5, 0, 1, 2); + layout->addWidget(lineEdit, 6, 0, 1, 2); + centralWidget->setLayout(layout); + setCentralWidget(centralWidget); + + changeCase(caseCombo->currentIndex()); + changeMode(modeCombo->currentIndex()); + + setWindowTitle(tr("Tree Model Completer")); + lineEdit->setFocus(); +} +//! [3] + +//! [4] +void MainWindow::createMenu() +{ + QAction *exitAction = new QAction(tr("Exit"), this); + QAction *aboutAct = new QAction(tr("About"), this); + QAction *aboutQtAct = new QAction(tr("About Qt"), this); + + connect(exitAction, SIGNAL(triggered()), qApp, SLOT(quit())); + connect(aboutAct, SIGNAL(triggered()), this, SLOT(about())); + connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt())); + + QMenu* fileMenu = menuBar()->addMenu(tr("File")); + fileMenu->addAction(exitAction); + + QMenu* helpMenu = menuBar()->addMenu(tr("About")); + helpMenu->addAction(aboutAct); + helpMenu->addAction(aboutQtAct); +} +//! [4] + +//! [5] +void MainWindow::changeMode(int index) +{ + QCompleter::CompletionMode mode; + if (index == 0) + mode = QCompleter::InlineCompletion; + else if (index == 1) + mode = QCompleter::PopupCompletion; + else + mode = QCompleter::UnfilteredPopupCompletion; + + completer->setCompletionMode(mode); +} +//! [5] + +QAbstractItemModel *MainWindow::modelFromFile(const QString& fileName) +{ + QFile file(fileName); + if (!file.open(QFile::ReadOnly)) + return new QStringListModel(completer); + +#ifndef QT_NO_CURSOR + QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); +#endif + QStringList words; + + QStandardItemModel *model = new QStandardItemModel(completer); + QVector<QStandardItem *> parents(10); + parents[0] = model->invisibleRootItem(); + + while (!file.atEnd()) { + QString line = file.readLine(); + QString trimmedLine = line.trimmed(); + if (line.isEmpty() || trimmedLine.isEmpty()) + continue; + + QRegExp re("^\\s+"); + int nonws = re.indexIn(line); + int level = 0; + if (nonws == -1) { + level = 0; + } else { + if (line.startsWith("\t")) { + level = re.cap(0).length(); + } else { + level = re.cap(0).length()/4; + } + } + + if (level+1 >= parents.size()) + parents.resize(parents.size()*2); + + QStandardItem *item = new QStandardItem; + item->setText(trimmedLine); + parents[level]->appendRow(item); + parents[level+1] = item; + } + +#ifndef QT_NO_CURSOR + QApplication::restoreOverrideCursor(); +#endif + + return model; +} + +void MainWindow::highlight(const QModelIndex &index) +{ + QAbstractItemModel *completionModel = completer->completionModel(); + QAbstractProxyModel *proxy = qobject_cast<QAbstractProxyModel *>(completionModel); + if (!proxy) + return; + QModelIndex sourceIndex = proxy->mapToSource(index); + treeView->selectionModel()->select(sourceIndex, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); + treeView->scrollTo(index); +} + +//! [6] +void MainWindow::about() +{ + QMessageBox::about(this, tr("About"), tr("This example demonstrates how " + "to use a QCompleter with a custom tree model.")); +} +//! [6] + +//! [7] +void MainWindow::changeCase(int cs) +{ + completer->setCaseSensitivity(cs ? Qt::CaseSensitive : Qt::CaseInsensitive); +} +//! [7] + +void MainWindow::updateContentsLabel(const QString& sep) +{ + contentsLabel->setText(tr("Type path from model above with items at each level separated by a '%1'").arg(sep)); +} + |