diff options
Diffstat (limited to 'src/plugins/boostbuildprojectmanager/selectablefilesmodel.h')
-rw-r--r-- | src/plugins/boostbuildprojectmanager/selectablefilesmodel.h | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/src/plugins/boostbuildprojectmanager/selectablefilesmodel.h b/src/plugins/boostbuildprojectmanager/selectablefilesmodel.h new file mode 100644 index 0000000000..1b4b5ef481 --- /dev/null +++ b/src/plugins/boostbuildprojectmanager/selectablefilesmodel.h @@ -0,0 +1,189 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Mateusz Ĺoskot <mateusz@loskot.net> +** +** This file, as part of Qt Creator Plugin for Boost.Build, +** was modified to accommodate OpenProjectWizard requirements. +** +** Copyright (C) 2013 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 by the Free Software +** Foundation and appearing in the file LICENSE.txt 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. +** +****************************************************************************/ + +#ifndef SELECTABLEFILESMODEL_HPP +#define SELECTABLEFILESMODEL_HPP + +#include <QAbstractItemModel> +#include <QSet> +#include <QFutureInterface> +#include <QFutureWatcher> +#include <QDialog> +#include <QTreeView> +#include <QLabel> + +QT_BEGIN_NAMESPACE +class QVBoxLayout; +QT_END_NAMESPACE + +namespace BoostBuildProjectManager { +namespace Internal { + +struct Tree +{ + QString name; + Qt::CheckState checked; + bool isDir; + QList<Tree *> childDirectories; + QList<Tree *> files; + QList<Tree *> visibleFiles; + QIcon icon; + QString fullPath; + Tree *parent; +}; + +struct Glob +{ + enum Mode { EXACT, ENDSWITH, REGEXP }; + Mode mode; + QString matchString; + mutable QRegExp matchRegexp; + + bool isMatch(const QString &text) const + { + if (mode == Glob::EXACT) { + if (text == matchString) + return true; + } else if (mode == Glob::ENDSWITH) { + if (text.endsWith(matchString)) + return true; + } else if (mode == Glob::REGEXP) { + if (matchRegexp.exactMatch(text)) + return true; + } + return false; + } +}; + +class SelectableFilesModel : public QAbstractItemModel +{ + Q_OBJECT + +public: + SelectableFilesModel(const QString &baseDir, QObject *parent); + ~SelectableFilesModel(); + + void setInitialMarkedFiles(const QStringList &files); + + int columnCount(const QModelIndex &parent) const; + int rowCount(const QModelIndex &parent) const; + QModelIndex index(int row, int column, const QModelIndex &parent) const; + QModelIndex parent(const QModelIndex &child) const; + + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + Qt::ItemFlags flags(const QModelIndex &index) const; + + QStringList selectedFiles() const; + QStringList selectedPaths() const; + QStringList preservedFiles() const; + + // only call this once + void startParsing(); + void waitForFinished(); + void cancel(); + void applyFilter(const QString &selectFilesfilter, const QString &hideFilesfilter); + +signals: + void parsingFinished(); + void parsingProgress(const QString &filename); + +private slots: + void buildTreeFinished(); + +private: + QList<Glob> parseFilter(const QString &filter); + Qt::CheckState applyFilter(const QModelIndex &index); + bool filter(Tree *t); + void init(); + void run(QFutureInterface<void> &fi); + void collectFiles(Tree *root, QStringList *result) const; + void collectPaths(Tree *root, QStringList *result) const; + void buildTree(const QString &baseDir, Tree *tree, QFutureInterface<void> &fi); + void deleteTree(Tree *tree); + void propagateUp(const QModelIndex &index); + void propagateDown(const QModelIndex &index); + Tree *m_root; + // Used in the future thread need to all not used after calling startParsing + QString m_baseDir; + QSet<QString> m_files; + QStringList m_outOfBaseDirFiles; + QFutureWatcher<void> m_watcher; + Tree *m_rootForFuture; + int m_futureCount; + bool m_allFiles; + + QList<Glob> m_hideFilesFilter; + QList<Glob> m_showFilesFilter; +}; + +class SelectableFilesDialog : public QDialog +{ + Q_OBJECT + +public: + SelectableFilesDialog(const QString &path, const QStringList files, QWidget *parent); + ~SelectableFilesDialog(); + QStringList selectedFiles() const; + +private slots: + void applyFilter(); + void parsingProgress(const QString &fileName); + void parsingFinished(); + +private: + void smartExpand(const QModelIndex &index); + void createShowFileFilterControls(QVBoxLayout *layout); + void createHideFileFilterControls(QVBoxLayout *layout); + void createApplyButton(QVBoxLayout *layout); + SelectableFilesModel *m_selectableFilesModel; + + QLabel *m_hideFilesFilterLabel; + QLineEdit *m_hideFilesfilterLineEdit; + + QLabel *m_showFilesFilterLabel; + QLineEdit *m_showFilesfilterLineEdit; + + QPushButton *m_applyFilterButton; + + QTreeView *m_view; + QLabel *m_preservedFiles; + QLabel *m_progressLabel; +}; + +} // namespace Internal +} // namespace BoostBuildProjectManager + +#endif // SELECTABLEFILESMODEL_HPP + |