forked from qt-creator/qt-creator
ProjectExplorer: Allow to create corresponding header/source file
... from the project tree context menu. Task-number: QTCREATORBUG-24575 Change-Id: I65a9daf237cbbcfcfdf2b7b67191c249695a6b7b Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -491,6 +491,7 @@ public:
|
|||||||
void savePersistentSettings();
|
void savePersistentSettings();
|
||||||
|
|
||||||
void addNewFile();
|
void addNewFile();
|
||||||
|
void addNewHeaderOrSource();
|
||||||
void handleAddExistingFiles();
|
void handleAddExistingFiles();
|
||||||
void addExistingDirectory();
|
void addExistingDirectory();
|
||||||
void addNewSubproject();
|
void addNewSubproject();
|
||||||
@@ -594,6 +595,8 @@ public:
|
|||||||
QAction *m_renameFileAction;
|
QAction *m_renameFileAction;
|
||||||
QAction *m_filePropertiesAction = nullptr;
|
QAction *m_filePropertiesAction = nullptr;
|
||||||
QAction *m_diffFileAction;
|
QAction *m_diffFileAction;
|
||||||
|
QAction *m_createHeaderAction = nullptr;
|
||||||
|
QAction *m_createSourceAction = nullptr;
|
||||||
QAction *m_openFileAction;
|
QAction *m_openFileAction;
|
||||||
QAction *m_projectTreeCollapseAllAction;
|
QAction *m_projectTreeCollapseAllAction;
|
||||||
QAction *m_projectTreeExpandAllAction;
|
QAction *m_projectTreeExpandAllAction;
|
||||||
@@ -1574,6 +1577,19 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
|
|||||||
cmd = ActionManager::registerAction(dd->m_diffFileAction, Constants::DIFFFILE, projectTreeContext);
|
cmd = ActionManager::registerAction(dd->m_diffFileAction, Constants::DIFFFILE, projectTreeContext);
|
||||||
mfileContextMenu->addAction(cmd, Constants::G_FILE_OTHER);
|
mfileContextMenu->addAction(cmd, Constants::G_FILE_OTHER);
|
||||||
|
|
||||||
|
dd->m_createHeaderAction = new QAction(Tr::tr("Create Header File"), this);
|
||||||
|
cmd = ActionManager::registerAction(
|
||||||
|
dd->m_createHeaderAction,
|
||||||
|
"ProjectExplorer.CreateHeader",
|
||||||
|
projectTreeContext);
|
||||||
|
mfileContextMenu->addAction(cmd, Constants::G_FILE_OTHER);
|
||||||
|
dd->m_createSourceAction = new QAction(Tr::tr("Create Source File"), this);
|
||||||
|
cmd = ActionManager::registerAction(
|
||||||
|
dd->m_createSourceAction,
|
||||||
|
"ProjectExplorer.CreateSource",
|
||||||
|
projectTreeContext);
|
||||||
|
mfileContextMenu->addAction(cmd, Constants::G_FILE_OTHER);
|
||||||
|
|
||||||
// Not yet used by anyone, so hide for now
|
// Not yet used by anyone, so hide for now
|
||||||
// mfolder->addAction(cmd, Constants::G_FOLDER_FILES);
|
// mfolder->addAction(cmd, Constants::G_FOLDER_FILES);
|
||||||
// msubProject->addAction(cmd, Constants::G_FOLDER_FILES);
|
// msubProject->addAction(cmd, Constants::G_FOLDER_FILES);
|
||||||
@@ -1826,6 +1842,10 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
|
|||||||
dd, &ProjectExplorerPluginPrivate::deleteFile);
|
dd, &ProjectExplorerPluginPrivate::deleteFile);
|
||||||
connect(dd->m_renameFileAction, &QAction::triggered,
|
connect(dd->m_renameFileAction, &QAction::triggered,
|
||||||
dd, &ProjectExplorerPluginPrivate::handleRenameFile);
|
dd, &ProjectExplorerPluginPrivate::handleRenameFile);
|
||||||
|
connect(dd->m_createHeaderAction, &QAction::triggered,
|
||||||
|
dd, &ProjectExplorerPluginPrivate::addNewHeaderOrSource);
|
||||||
|
connect(dd->m_createSourceAction, &QAction::triggered,
|
||||||
|
dd, &ProjectExplorerPluginPrivate::addNewHeaderOrSource);
|
||||||
connect(dd->m_setStartupProjectAction, &QAction::triggered,
|
connect(dd->m_setStartupProjectAction, &QAction::triggered,
|
||||||
dd, &ProjectExplorerPluginPrivate::handleSetStartupProject);
|
dd, &ProjectExplorerPluginPrivate::handleSetStartupProject);
|
||||||
connect(dd->m_closeProjectFilesActionFileMenu, &QAction::triggered,
|
connect(dd->m_closeProjectFilesActionFileMenu, &QAction::triggered,
|
||||||
@@ -3227,6 +3247,8 @@ void ProjectExplorerPluginPrivate::updateContextMenuActions(Node *currentNode)
|
|||||||
m_deleteFileAction->setEnabled(false);
|
m_deleteFileAction->setEnabled(false);
|
||||||
m_renameFileAction->setEnabled(false);
|
m_renameFileAction->setEnabled(false);
|
||||||
m_diffFileAction->setEnabled(false);
|
m_diffFileAction->setEnabled(false);
|
||||||
|
m_createHeaderAction->setEnabled(false);
|
||||||
|
m_createSourceAction->setEnabled(false);
|
||||||
|
|
||||||
m_addExistingFilesAction->setVisible(true);
|
m_addExistingFilesAction->setVisible(true);
|
||||||
m_addExistingDirectoryAction->setVisible(true);
|
m_addExistingDirectoryAction->setVisible(true);
|
||||||
@@ -3240,6 +3262,8 @@ void ProjectExplorerPluginPrivate::updateContextMenuActions(Node *currentNode)
|
|||||||
m_runActionContextMenu->setEnabled(false);
|
m_runActionContextMenu->setEnabled(false);
|
||||||
m_defaultRunConfiguration.clear();
|
m_defaultRunConfiguration.clear();
|
||||||
m_diffFileAction->setVisible(DiffService::instance());
|
m_diffFileAction->setVisible(DiffService::instance());
|
||||||
|
m_createHeaderAction->setVisible(false);
|
||||||
|
m_createSourceAction->setVisible(false);
|
||||||
|
|
||||||
m_openTerminalHere->setVisible(true);
|
m_openTerminalHere->setVisible(true);
|
||||||
m_openTerminalHereBuildEnv->setVisible(false);
|
m_openTerminalHereBuildEnv->setVisible(false);
|
||||||
@@ -3337,10 +3361,28 @@ void ProjectExplorerPluginPrivate::updateContextMenuActions(Node *currentNode)
|
|||||||
m_diffFileAction->setEnabled(DiffService::instance()
|
m_diffFileAction->setEnabled(DiffService::instance()
|
||||||
&& currentNodeIsTextFile && TextEditor::TextDocument::currentTextDocument());
|
&& currentNodeIsTextFile && TextEditor::TextDocument::currentTextDocument());
|
||||||
|
|
||||||
const bool canDuplicate = canEditProject && supports(AddNewFile)
|
const bool canAdd = canEditProject && supports(AddNewFile) && !isTypeProject;
|
||||||
&& currentNode->asFileNode()->fileType() != FileType::Project;
|
m_duplicateFileAction->setVisible(canAdd);
|
||||||
m_duplicateFileAction->setVisible(canDuplicate);
|
m_duplicateFileAction->setEnabled(canAdd);
|
||||||
m_duplicateFileAction->setEnabled(canDuplicate);
|
|
||||||
|
const bool isHeader = fileNode->fileType() == FileType::Header;
|
||||||
|
const bool isSource = fileNode->fileType() == FileType::Source;
|
||||||
|
if (canAdd && (isHeader || isSource)) {
|
||||||
|
if (const auto parentFolder = fileNode->parentFolderNode()) {
|
||||||
|
const QString baseName = fileNode->filePath().completeBaseName();
|
||||||
|
const FileType otherType = isHeader ? FileType::Source : FileType::Header;
|
||||||
|
const auto pred = [otherType, baseName](FileNode *child) {
|
||||||
|
return child->fileType() == otherType
|
||||||
|
&& child->filePath().completeBaseName() == baseName;
|
||||||
|
};
|
||||||
|
if (!parentFolder->findChildFileNode(pred)) {
|
||||||
|
QAction * const action = isHeader ? m_createSourceAction
|
||||||
|
: m_createHeaderAction;
|
||||||
|
action->setVisible(true);
|
||||||
|
action->setEnabled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
EditorManager::populateOpenWithMenu(m_openWithMenu, currentNode->filePath());
|
EditorManager::populateOpenWithMenu(m_openWithMenu, currentNode->filePath());
|
||||||
}
|
}
|
||||||
@@ -3446,6 +3488,37 @@ void ProjectExplorerPluginPrivate::addNewFile()
|
|||||||
location, map);
|
location, map);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ProjectExplorerPluginPrivate::addNewHeaderOrSource()
|
||||||
|
{
|
||||||
|
FileNode * const fileNode = ProjectTree::currentNode() ? ProjectTree::currentNode()->asFileNode()
|
||||||
|
: nullptr;
|
||||||
|
QTC_ASSERT(fileNode, return);
|
||||||
|
const bool isHeader = fileNode->fileType() == FileType::Header;
|
||||||
|
const bool isSource = fileNode->fileType() == FileType::Source;
|
||||||
|
QTC_ASSERT(isHeader || isSource, return);
|
||||||
|
FolderNode * const folderNode = fileNode->parentFolderNode();
|
||||||
|
QTC_ASSERT(folderNode, return);
|
||||||
|
|
||||||
|
QVariantMap map;
|
||||||
|
map.insert(QLatin1String(Constants::PREFERRED_PROJECT_NODE),
|
||||||
|
QVariant::fromValue(static_cast<void *>(folderNode)));
|
||||||
|
map.insert(Constants::PREFERRED_PROJECT_NODE_PATH, folderNode->filePath().toString());
|
||||||
|
map.insert("InitialFileName", fileNode->filePath().completeBaseName());
|
||||||
|
if (Project *p = ProjectTree::currentProject()) {
|
||||||
|
const QStringList profileIds = Utils::transform(p->targets(), [](const Target *t) {
|
||||||
|
return t->id().toString();
|
||||||
|
});
|
||||||
|
map.insert(QLatin1String(Constants::PROJECT_KIT_IDS), profileIds);
|
||||||
|
map.insert(Constants::PROJECT_POINTER, QVariant::fromValue(static_cast<void *>(p)));
|
||||||
|
}
|
||||||
|
const Id factoryId = isHeader ? "B.Source" : "C.Header";
|
||||||
|
IWizardFactory * const factory = Utils::findOrDefault(
|
||||||
|
IWizardFactory::allWizardFactories(),
|
||||||
|
[factoryId](const IWizardFactory *f) { return f->id() == factoryId; });
|
||||||
|
QTC_ASSERT(factory, return);
|
||||||
|
factory->runWizard(folderNode->directory(), ICore::dialogParent(), {}, map);
|
||||||
|
}
|
||||||
|
|
||||||
void ProjectExplorerPluginPrivate::addNewSubproject()
|
void ProjectExplorerPluginPrivate::addNewSubproject()
|
||||||
{
|
{
|
||||||
Node* currentNode = ProjectTree::currentNode();
|
Node* currentNode = ProjectTree::currentNode();
|
||||||
|
Reference in New Issue
Block a user