ElementsCollectionModel : model use multithreading itself for load collections

git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@4576 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
blacksun
2016-07-14 11:58:56 +00:00
parent 66371ae866
commit df1db0adc3
4 changed files with 66 additions and 29 deletions

View File

@@ -24,6 +24,8 @@
#include "qetproject.h" #include "qetproject.h"
#include "elementcollectionhandler.h" #include "elementcollectionhandler.h"
#include <QtConcurrent>
/** /**
* @brief ElementsCollectionModel::ElementsCollectionModel * @brief ElementsCollectionModel::ElementsCollectionModel
* Constructor * Constructor
@@ -209,6 +211,35 @@ bool ElementsCollectionModel::dropMimeData(const QMimeData *data, Qt::DropAction
return false; return false;
} }
/**
* @brief ElementsCollectionModel::loadCollections
* Load the several collections in this model.
* Prefer use this method instead of addCommonCollection, addCustomCollection and addProject,
* because it use multithreading to speed up the loading.
* This method emit loadingMaxValue(int) for know the maximum progress value
* This method emit loadingProgressValue(int) for know the current progress value
* @param common_collection : true for load the common collection
* @param custom_collection : true for load the custom collection
* @param projects : list of projects to load
*/
void ElementsCollectionModel::loadCollections(bool common_collection, bool custom_collection, QList<QETProject *> projects)
{
if (common_collection)
addCommonCollection(false);
if (custom_collection)
addCustomCollection(false);
foreach (QETProject *project, projects)
addProject(project, false);
QList <ElementCollectionItem *> list = items();
QFuture<void> futur = QtConcurrent::map(list, setUpData);
emit loadingMaxValue(futur.progressMaximum());
while (futur.isRunning()) {
emit loadingProgressValue(futur.progressValue());
}
}
/** /**
* @brief ElementsCollectionModel::addCommonCollection * @brief ElementsCollectionModel::addCommonCollection
* Add the common elements collection to this model * Add the common elements collection to this model
@@ -305,7 +336,7 @@ void ElementsCollectionModel::addProject(QETProject *project, bool set_data)
XmlProjectElementCollectionItem *xpeci = new XmlProjectElementCollectionItem(); XmlProjectElementCollectionItem *xpeci = new XmlProjectElementCollectionItem();
m_project_hash.insert(project, xpeci); m_project_hash.insert(project, xpeci);
xpeci->setProject(project); xpeci->setProject(project, set_data);
insertRow(row, xpeci); insertRow(row, xpeci);
if (set_data) if (set_data)
xpeci->setUpData(); xpeci->setUpData();

View File

@@ -41,6 +41,8 @@ class ElementsCollectionModel : public QStandardItemModel
virtual bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const; virtual bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const;
virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent); virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent);
void loadCollections(bool common_collection, bool custom_collection, QList<QETProject *> projects);
void addCommonCollection(bool set_data = true); void addCommonCollection(bool set_data = true);
void addCustomCollection(bool set_data = true); void addCustomCollection(bool set_data = true);
void addLocation(ElementsLocation location); void addLocation(ElementsLocation location);
@@ -56,6 +58,10 @@ class ElementsCollectionModel : public QStandardItemModel
bool isHideElement() {return m_hide_element;} bool isHideElement() {return m_hide_element;}
QModelIndex indexFromLocation(const ElementsLocation &location); QModelIndex indexFromLocation(const ElementsLocation &location);
signals:
void loadingMaxValue(int);
void loadingProgressValue(int);
private: private:
void elementIntegratedToCollection (QString path); void elementIntegratedToCollection (QString path);
void itemRemovedFromCollection (QString path); void itemRemovedFromCollection (QString path);

View File

@@ -35,7 +35,6 @@
#include <QDesktopServices> #include <QDesktopServices>
#include <QUrl> #include <QUrl>
#include <QTimer> #include <QTimer>
#include <QtConcurrent>
/** /**
* @brief ElementsCollectionWidget::ElementsCollectionWidget * @brief ElementsCollectionWidget::ElementsCollectionWidget
@@ -77,7 +76,14 @@ void ElementsCollectionWidget::expandFirstItems()
*/ */
void ElementsCollectionWidget::addProject(QETProject *project) { void ElementsCollectionWidget::addProject(QETProject *project) {
if (m_model) { if (m_model) {
m_model->addProject(project); QList <QETProject *> prj; prj.append(project);
m_progress_bar->show();
connect(m_model, &ElementsCollectionModel::loadingMaxValue, m_progress_bar, &QProgressBar::setMaximum);
connect(m_model, &ElementsCollectionModel::loadingProgressValue, m_progress_bar, &QProgressBar::setValue);
m_model->loadCollections(false,false, prj);
disconnect(m_model, &ElementsCollectionModel::loadingMaxValue, m_progress_bar, &QProgressBar::setMaximum);
disconnect(m_model, &ElementsCollectionModel::loadingProgressValue, m_progress_bar, &QProgressBar::setValue);
m_progress_bar->hide();
m_model->highlightUnusedElement(); m_model->highlightUnusedElement();
} }
else else
@@ -462,26 +468,21 @@ void ElementsCollectionWidget::reload()
{ {
m_progress_bar->show(); m_progress_bar->show();
ElementsCollectionModel *new_model = new ElementsCollectionModel(m_tree_view); ElementsCollectionModel *new_model = new ElementsCollectionModel(m_tree_view);
new_model->addCommonCollection(false);
new_model->addCustomCollection(false);
if (!m_waiting_project.isEmpty()) { QList <QETProject *> project_list;
foreach(QETProject *prj, m_waiting_project) project_list.append(m_waiting_project);
new_model->addProject(prj, false);
m_waiting_project.clear(); m_waiting_project.clear();
}
if (m_model) if (m_model)
foreach (QETProject *project, m_model->project()) project_list.append(m_model->project());
new_model->addProject(project, false);
QList <ElementCollectionItem *> list = new_model->items();
QFuture<void> futur = QtConcurrent::map(list, setUpData); connect(new_model, &ElementsCollectionModel::loadingMaxValue, m_progress_bar, &QProgressBar::setMaximum);
m_progress_bar->setMinimum(futur.progressMinimum()); connect(new_model, &ElementsCollectionModel::loadingProgressValue, m_progress_bar, &QProgressBar::setValue);
m_progress_bar->setMaximum(futur.progressMaximum());
while (futur.isRunning()) { new_model->loadCollections(true, true, project_list);
m_progress_bar->setValue(futur.progressValue());
} disconnect(new_model, &ElementsCollectionModel::loadingMaxValue, m_progress_bar, &QProgressBar::setMaximum);
disconnect(new_model, &ElementsCollectionModel::loadingProgressValue, m_progress_bar, &QProgressBar::setValue);
new_model->highlightUnusedElement(); new_model->highlightUnusedElement();
m_tree_view->setModel(new_model); m_tree_view->setModel(new_model);

View File

@@ -87,21 +87,20 @@ void ElementDialog::setUpWidget()
m_tree_view = new QTreeView(this); m_tree_view = new QTreeView(this);
m_model = new ElementsCollectionModel(m_tree_view); m_model = new ElementsCollectionModel(m_tree_view);
QList <QETProject *> prjs;
foreach(QETProject *prj, QETApp::registeredProjects())
prjs.append(prj);
if (m_mode == OpenElement) if (m_mode == OpenElement)
m_model->addCommonCollection(false); m_model->loadCollections(true, true, prjs);
m_model->addCustomCollection(false); else
m_model->loadCollections(false, true, prjs);
foreach (QETProject *project, QETApp::registeredProjects())
m_model->addProject(project, false);
QList <ElementCollectionItem *> list = m_model->items();
QtConcurrent::blockingMap(list, setUpData);
m_tree_view->setModel(m_model); m_tree_view->setModel(m_model);
m_tree_view->setHeaderHidden(true); m_tree_view->setHeaderHidden(true);
layout->addWidget(m_tree_view); layout->addWidget(m_tree_view);
m_buttons_box = new QDialogButtonBox(this); m_buttons_box = new QDialogButtonBox(this);
if (m_mode == SaveCategory || m_mode == SaveElement) if (m_mode == SaveCategory || m_mode == SaveElement)