mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2025-12-17 20:50:34 +01:00
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:
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user