ProjectFilesystemPlugin 1.1.0: pseudo-threaded tree rebuild

This commit is contained in:
2020-05-22 18:25:27 +03:00
parent 8406767c76
commit da939e30c7
3 changed files with 26 additions and 2 deletions

View File

@@ -1,7 +1,7 @@
{ {
\"Name\" : \"ProjectFilesystemPlugin\", \"Name\" : \"ProjectFilesystemPlugin\",
\"Version\" : \"1.0.0\", \"Version\" : \"1.1.0\",
\"CompatVersion\" : \"1.0.0\", \"CompatVersion\" : \"1.1.0\",
\"Vendor\" : \"Peri4\", \"Vendor\" : \"Peri4\",
\"Copyright\" : \"(C) Peri4\", \"Copyright\" : \"(C) Peri4\",
\"License\" : \"LGPLv3\", \"License\" : \"LGPLv3\",

View File

@@ -29,6 +29,7 @@ QFileInfo projectfs_menu_target;
ProjectFilesystemWidget::ProjectFilesystemWidget(QWidget * parent): QWidget(parent) { ProjectFilesystemWidget::ProjectFilesystemWidget(QWidget * parent): QWidget(parent) {
setupUi(this); setupUi(this);
in_proc = need_rebuild = false;
int is = style()->pixelMetric(QStyle::PM_ButtonIconSize, 0, this); int is = style()->pixelMetric(QStyle::PM_ButtonIconSize, 0, this);
label->setFixedSize(is, is); label->setFixedSize(is, is);
buttonClear->setIcon(Utils::Icons::CLEAN.icon()); buttonClear->setIcon(Utils::Icons::CLEAN.icon());
@@ -74,6 +75,7 @@ void ProjectFilesystemWidget::changeEvent(QEvent *e) {
void ProjectFilesystemWidget::createTree(QTreeWidgetItem * ti, const QString & dir) { void ProjectFilesystemWidget::createTree(QTreeWidgetItem * ti, const QString & dir) {
QFileInfoList fl = QDir(dir).entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot, QDir::LocaleAware | QDir::DirsFirst); QFileInfoList fl = QDir(dir).entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot, QDir::LocaleAware | QDir::DirsFirst);
checkProcEvents();
for (QFileInfo i: fl) { for (QFileInfo i: fl) {
QString nit = i.fileName(); QString nit = i.fileName();
if (i.isDir()) { if (i.isDir()) {
@@ -163,7 +165,20 @@ void ProjectFilesystemWidget::setExtVariable() {
} }
void ProjectFilesystemWidget::checkProcEvents() {
if (tm.elapsed() < 10) return;
QApplication::processEvents();
tm.start();
}
void ProjectFilesystemWidget::projectsChanged() { void ProjectFilesystemWidget::projectsChanged() {
if (in_proc) {
need_rebuild = true;
return;
}
in_proc = true;
tm.start();
last_expanded.clear(); last_expanded.clear();
item_map.clear(); item_map.clear();
int spos = tree->verticalScrollBar()->value(); int spos = tree->verticalScrollBar()->value();
@@ -192,6 +207,11 @@ void ProjectFilesystemWidget::projectsChanged() {
QApplication::restoreOverrideCursor(); QApplication::restoreOverrideCursor();
qApp->processEvents(); qApp->processEvents();
tree->verticalScrollBar()->setValue(spos); tree->verticalScrollBar()->setValue(spos);
in_proc = false;
if (need_rebuild) {
need_rebuild = false;
projectsChanged();
}
} }

View File

@@ -6,6 +6,7 @@
#include <extensionsystem/iplugin.h> #include <extensionsystem/iplugin.h>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
#include <QFileSystemModel> #include <QFileSystemModel>
#include <QElapsedTimer>
#include <QMenu> #include <QMenu>
extern QFileInfo projectfs_menu_target; extern QFileInfo projectfs_menu_target;
@@ -32,13 +33,16 @@ protected:
void rememberExpanded(QTreeWidgetItem * ti); void rememberExpanded(QTreeWidgetItem * ti);
void restoreExpanded(QTreeWidgetItem * ti); void restoreExpanded(QTreeWidgetItem * ti);
void setExtVariable(); void setExtVariable();
void checkProcEvents();
bool in_proc, need_rebuild;
ExtensionSystem::IPlugin * proj_plug; ExtensionSystem::IPlugin * proj_plug;
QMenu popup_menu; QMenu popup_menu;
QMap<QString, QTreeWidgetItem*> item_map; QMap<QString, QTreeWidgetItem*> item_map;
QSet<QString> last_expanded; QSet<QString> last_expanded;
FilterDialog filter_dialog; FilterDialog filter_dialog;
FilterDialog::Filter cur_filter; FilterDialog::Filter cur_filter;
QElapsedTimer tm;
public slots: public slots:
void projectsChanged(); void projectsChanged();