add project actions Clean and Rebuild

now watch for all directories and update tree immediately
This commit is contained in:
2021-05-25 17:18:29 +03:00
parent 83cf72d9a3
commit 7dfcd37a87
4 changed files with 80 additions and 6 deletions

View File

@@ -0,0 +1,7 @@
#cmake_minimum_required(VERSION 3.17)
#project(ProjectFilesystemPlugin)
#include($ENV{SDK_QTCREATOR_SRC}/cmake/QtCreatorAPI.cmake)
file(GLOB SRC "*.h" "*.cpp" "*.ui" "*.qrc")
add_qtc_plugin(ProjectFilesystemPlugin
PLUGIN_DEPENDS Core ProjectExplorer
SOURCES ${SRC})

View File

@@ -28,7 +28,6 @@
#include <QClipboard> #include <QClipboard>
QFileInfo projectfs_menu_target; QFileInfo projectfs_menu_target;
QTreeWidgetItem * item_target = nullptr;
enum ItemType { enum ItemType {
itProject = 1, itProject = 1,
@@ -50,6 +49,7 @@ QAction * newSeparator() {
ProjectFilesystemWidget::ProjectFilesystemWidget(QWidget * parent): QWidget(parent) { ProjectFilesystemWidget::ProjectFilesystemWidget(QWidget * parent): QWidget(parent) {
setupUi(this); setupUi(this);
item_target = nullptr;
in_proc = need_rebuild = false; 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);
@@ -62,10 +62,13 @@ ProjectFilesystemWidget::ProjectFilesystemWidget(QWidget * parent): QWidget(pare
actionCopy_name->setIcon(Utils::Icons::COPY.icon()); actionCopy_name->setIcon(Utils::Icons::COPY.icon());
actionCopy_path->setIcon(Utils::Icons::COPY.icon()); actionCopy_path->setIcon(Utils::Icons::COPY.icon());
actionBuild->setIcon(ProjectExplorer::Icons::BUILD_SMALL.icon()); actionBuild->setIcon(ProjectExplorer::Icons::BUILD_SMALL.icon());
actionClean->setIcon(Utils::Icons::CLEAN.icon());
actionRun->setIcon(ProjectExplorer::Icons::RUN_FLAT.icon()); actionRun->setIcon(ProjectExplorer::Icons::RUN_FLAT.icon());
actionClose_project->setIcon(Utils::Icons::CLOSE_TOOLBAR.icon()); actionClose_project->setIcon(Utils::Icons::CLOSE_TOOLBAR.icon());
this_actions << actionSet_as_startup << actionBuild << actionRun; this_actions << actionSet_as_startup << actionBuild << actionRun;
this_actions << newSeparator(); this_actions << newSeparator();
this_actions << actionRebuild << actionClean;
this_actions << newSeparator();
this_actions << actionClose_project; this_actions << actionClose_project;
this_actions << newSeparator(); this_actions << newSeparator();
this_actions << actionOpen_here << actionOpen_external << actionShow_external << actionOpen_terminal; this_actions << actionOpen_here << actionOpen_external << actionShow_external << actionOpen_terminal;
@@ -78,7 +81,8 @@ ProjectFilesystemWidget::ProjectFilesystemWidget(QWidget * parent): QWidget(pare
connect(ProjectExplorer::SessionManager::instance(), SIGNAL(projectDisplayNameChanged(ProjectExplorer::Project*)), this, SLOT(projectsChanged())); connect(ProjectExplorer::SessionManager::instance(), SIGNAL(projectDisplayNameChanged(ProjectExplorer::Project*)), this, SLOT(projectsChanged()));
connect(ProjectExplorer::SessionManager::instance(), SIGNAL(projectRemoved(ProjectExplorer::Project*)), this, SLOT(projectsChanged())); connect(ProjectExplorer::SessionManager::instance(), SIGNAL(projectRemoved(ProjectExplorer::Project*)), this, SLOT(projectsChanged()));
//connect(ProjectExplorer::SessionManager::instance(), SIGNAL(), this, SLOT(startupProjectChanged())); //connect(ProjectExplorer::SessionManager::instance(), SIGNAL(), this, SLOT(startupProjectChanged()));
connect(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor*)), this, SLOT(fileChanged())); connect(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor*)), this, SLOT(currentFileChanged()));
connect(&fs_watcher, SIGNAL(directoryChanged(const QString &)), this, SLOT(directoryChanged(const QString &)));
projectsChanged(); projectsChanged();
} }
@@ -102,8 +106,13 @@ void ProjectFilesystemWidget::changeEvent(QEvent *e) {
void ProjectFilesystemWidget::createTree(QTreeWidgetItem * ti, const QString & dir) { void ProjectFilesystemWidget::createTree(QTreeWidgetItem * ti, const QString & dir) {
if (ti->childCount() > 0) {
qDeleteAll(ti->takeChildren());
}
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(); checkProcEvents();
fs_watcher.addPath(dir);
item_map[dir] = ti;
for (QFileInfo i: fl) { for (QFileInfo i: fl) {
QString nit = i.fileName(); QString nit = i.fileName();
if (i.isDir()) { if (i.isDir()) {
@@ -121,7 +130,7 @@ void ProjectFilesystemWidget::createTree(QTreeWidgetItem * ti, const QString & d
ni->setData(0, roleIsDir, i.isDir()); ni->setData(0, roleIsDir, i.isDir());
item_map[i.absoluteFilePath()] = ni; item_map[i.absoluteFilePath()] = ni;
if (i.isDir()) { if (i.isDir()) {
createTree(ni, dir + QDir::separator() + i.fileName()); createTree(ni, dir + "/" + i.fileName());
} }
ti->addChild(ni); ti->addChild(ni);
} }
@@ -219,6 +228,7 @@ void ProjectFilesystemWidget::projectsChanged() {
int spos = tree->verticalScrollBar()->value(); int spos = tree->verticalScrollBar()->value();
rememberExpanded(tree->invisibleRootItem()); rememberExpanded(tree->invisibleRootItem());
tree->clear(); tree->clear();
fs_watcher.removePaths(fs_watcher.directories());
QApplication::setOverrideCursor(Qt::WaitCursor); QApplication::setOverrideCursor(Qt::WaitCursor);
QList<ProjectExplorer::Project *> pl = ProjectExplorer::SessionManager::projects(); QList<ProjectExplorer::Project *> pl = ProjectExplorer::SessionManager::projects();
for (ProjectExplorer::Project * p: pl) { for (ProjectExplorer::Project * p: pl) {
@@ -238,7 +248,7 @@ void ProjectFilesystemWidget::projectsChanged() {
tree->addTopLevelItem(ri); tree->addTopLevelItem(ri);
} }
startupProjectChanged(); startupProjectChanged();
fileChanged(); currentFileChanged();
filter(); filter();
restoreExpanded(tree->invisibleRootItem()); restoreExpanded(tree->invisibleRootItem());
QApplication::restoreOverrideCursor(); QApplication::restoreOverrideCursor();
@@ -259,7 +269,7 @@ void ProjectFilesystemWidget::filterClicked() {
} }
void ProjectFilesystemWidget::fileChanged() { void ProjectFilesystemWidget::currentFileChanged() {
Core::IDocument * cd = Core::EditorManager::instance()->currentDocument(); Core::IDocument * cd = Core::EditorManager::instance()->currentDocument();
if (!cd) return; if (!cd) return;
QString np = cd->filePath().toString(); QString np = cd->filePath().toString();
@@ -284,6 +294,29 @@ void ProjectFilesystemWidget::startupProjectChanged() {
} }
void ProjectFilesystemWidget::directoryChanged(const QString & path) {
QTreeWidgetItem * ti = item_map.value(path);
//QMessageBox::information(0, "", "changed " + path + " " + QString::number((qulonglong)ti));
if (!ti) return;
int spos = tree->verticalScrollBar()->value();
rememberExpanded(tree->invisibleRootItem());
createTree(ti, path);
filter();
restoreExpanded(tree->invisibleRootItem());
QList<QTreeWidgetItem*> ail = tree->findItems("", Qt::MatchContains | Qt::MatchRecursive), map_values = item_map.values();
QSet<QTreeWidgetItem*> ais;
//QString removed;
for (auto * i: ail) ais << i;
for (auto * i: map_values)
if (!ais.contains(i)) {
//removed += item_map.key(i) + "\n";
item_map.remove(item_map.key(i));
}
//QMessageBox::information(0, "", "map " + QString::number(ais.size()));
//QMessageBox::information(0, "", "remove " + removed);
}
void ProjectFilesystemWidget::on_tree_itemDoubleClicked(QTreeWidgetItem * item, int) { void ProjectFilesystemWidget::on_tree_itemDoubleClicked(QTreeWidgetItem * item, int) {
if (!item) return; if (!item) return;
QString afp = item->data(0, roleFullPath).toString(); QString afp = item->data(0, roleFullPath).toString();
@@ -346,10 +379,14 @@ void ProjectFilesystemWidget::on_tree_customContextMenuRequested(const QPoint &
can_run = p->activeTarget()->activeRunConfiguration(); can_run = p->activeTarget()->activeRunConfiguration();
} }
actionBuild->setVisible(can_build); actionBuild->setVisible(can_build);
actionClean->setVisible(can_build);
actionRebuild->setVisible(can_build);
actionRun->setVisible(can_run); actionRun->setVisible(can_run);
} else { } else {
actionSet_as_startup->setVisible(false); actionSet_as_startup->setVisible(false);
actionBuild->setVisible(false); actionBuild->setVisible(false);
actionClean->setVisible(false);
actionRebuild->setVisible(false);
actionRun->setVisible(false); actionRun->setVisible(false);
} }
actionClose_project->setVisible(p); actionClose_project->setVisible(p);
@@ -412,6 +449,20 @@ void ProjectFilesystemWidget::on_actionBuild_triggered() {
} }
void ProjectFilesystemWidget::on_actionRebuild_triggered() {
ProjectExplorer::Project * p = (ProjectExplorer::Project *)itemProject(item_target);
if (!p) return;
ProjectExplorer::BuildManager::rebuildProjectWithDependencies(p, ProjectExplorer::ConfigSelection::Active);
}
void ProjectFilesystemWidget::on_actionClean_triggered() {
ProjectExplorer::Project * p = (ProjectExplorer::Project *)itemProject(item_target);
if (!p) return;
ProjectExplorer::BuildManager::cleanProjectWithoutDependencies(p);
}
void ProjectFilesystemWidget::on_actionRun_triggered() { void ProjectFilesystemWidget::on_actionRun_triggered() {
ProjectExplorer::Project * p = (ProjectExplorer::Project *)itemProject(item_target); ProjectExplorer::Project * p = (ProjectExplorer::Project *)itemProject(item_target);
if (!p) return; if (!p) return;

View File

@@ -6,6 +6,7 @@
#include <extensionsystem/iplugin.h> #include <extensionsystem/iplugin.h>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
#include <QFileSystemModel> #include <QFileSystemModel>
#include <QFileSystemWatcher>
#include <QElapsedTimer> #include <QElapsedTimer>
#include <QMenu> #include <QMenu>
@@ -45,14 +46,17 @@ protected:
FilterDialog filter_dialog; FilterDialog filter_dialog;
FilterDialog::Filter cur_filter; FilterDialog::Filter cur_filter;
QElapsedTimer tm; QElapsedTimer tm;
QFileSystemWatcher fs_watcher;
QTreeWidgetItem * item_target;
public slots: public slots:
void projectsChanged(); void projectsChanged();
void filterClicked(); void filterClicked();
private slots: private slots:
void fileChanged(); void currentFileChanged();
void startupProjectChanged(); void startupProjectChanged();
void directoryChanged(const QString & path);
void on_tree_itemDoubleClicked(QTreeWidgetItem * item, int ); void on_tree_itemDoubleClicked(QTreeWidgetItem * item, int );
void on_lineFilter_textChanged(const QString &); void on_lineFilter_textChanged(const QString &);
@@ -66,6 +70,8 @@ private slots:
void on_actionCopy_path_triggered(); void on_actionCopy_path_triggered();
void on_actionSet_as_startup_triggered(); void on_actionSet_as_startup_triggered();
void on_actionBuild_triggered(); void on_actionBuild_triggered();
void on_actionRebuild_triggered();
void on_actionClean_triggered();
void on_actionRun_triggered(); void on_actionRun_triggered();
void on_actionClose_project_triggered(); void on_actionClose_project_triggered();

View File

@@ -146,6 +146,16 @@
<string>Close project</string> <string>Close project</string>
</property> </property>
</action> </action>
<action name="actionClean">
<property name="text">
<string>Clean</string>
</property>
</action>
<action name="actionRebuild">
<property name="text">
<string>Rebuild</string>
</property>
</action>
</widget> </widget>
<resources> <resources>
<include location="projectfilesystem.qrc"/> <include location="projectfilesystem.qrc"/>