forked from qt-creator/qt-creator
Merge remote-tracking branch 'origin/13.0'
Change-Id: I0892d8e54930bb5a65dc51117b8ca7d70ce300a3
This commit is contained in:
@@ -353,7 +353,9 @@ void DiagramSceneModel::selectAllElements()
|
||||
void DiagramSceneModel::selectElement(DElement *element)
|
||||
{
|
||||
QGraphicsItem *selectItem = m_elementToItemMap.value(element);
|
||||
for (QGraphicsItem *item : std::as_const(m_selectedItems)) {
|
||||
// We have to create a copy since "setSelected" may modify m_selectedItems
|
||||
const QSet<QGraphicsItem *> copy = m_selectedItems;
|
||||
for (QGraphicsItem *item : copy) {
|
||||
if (item != selectItem)
|
||||
item->setSelected(false);
|
||||
}
|
||||
|
||||
@@ -48,7 +48,8 @@ public:
|
||||
uint ownerId(FileOwner) const override;
|
||||
QString owner(FileOwner) const override;
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
|
||||
// The FileTime change in QAbstractFileEngine, in qtbase, is in since Qt 6.7.1
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 1)
|
||||
using FileTime = QFile::FileTime;
|
||||
#endif
|
||||
bool setFileTime(const QDateTime &newDate, FileTime time) override;
|
||||
|
||||
@@ -132,7 +132,7 @@ void ActivationSequenceContextProcessor::processComment()
|
||||
|
||||
void ActivationSequenceContextProcessor::processInclude()
|
||||
{
|
||||
if (m_token.isLiteral() && !isCompletionKindStringLiteralOrSlash())
|
||||
if (m_token.isStringLiteral() && !isCompletionKindStringLiteralOrSlash())
|
||||
m_completionKind = CPlusPlus::T_EOF_SYMBOL;
|
||||
}
|
||||
|
||||
|
||||
@@ -749,12 +749,15 @@ CMakeBuildSystem::projectFileArgumentPosition(const QString &targetName, const Q
|
||||
&& func.Arguments().size() > 1 && func.Arguments().front().Value == target_name;
|
||||
});
|
||||
|
||||
for (const auto &func : {function, targetSourcesFunc, addQmlModuleFunc}) {
|
||||
auto setSourceFilePropFunc = findFunction(*cmakeListFile, [](const auto &func) {
|
||||
return func.LowerCaseName() == "set_source_files_properties";
|
||||
});
|
||||
|
||||
for (const auto &func : {function, targetSourcesFunc, addQmlModuleFunc, setSourceFilePropFunc}) {
|
||||
if (!func.has_value())
|
||||
continue;
|
||||
auto filePathArgument = Utils::findOrDefault(func->Arguments(),
|
||||
[file_name = fileName.toStdString()](
|
||||
const auto &arg) {
|
||||
auto filePathArgument = Utils::findOrDefault(
|
||||
func->Arguments(), [file_name = fileName.toStdString()](const auto &arg) {
|
||||
return arg.Value == file_name;
|
||||
});
|
||||
|
||||
@@ -925,49 +928,60 @@ bool CMakeBuildSystem::renameFile(Node *context,
|
||||
{
|
||||
if (auto n = dynamic_cast<CMakeTargetNode *>(context)) {
|
||||
const FilePath projDir = n->filePath().canonicalPath();
|
||||
const QString newRelPathName
|
||||
= newFilePath.canonicalPath().relativePathFrom(projDir).cleanPath().toString();
|
||||
const FilePath newRelPath = newFilePath.canonicalPath().relativePathFrom(projDir).cleanPath();
|
||||
const QString newRelPathName = newRelPath.toString();
|
||||
|
||||
// FilePath needs the file to exist on disk, the old file has already been renamed
|
||||
const QString oldRelPathName
|
||||
= newRelPath.parentDir().pathAppended(oldFilePath.fileName()).cleanPath().toString();
|
||||
|
||||
const QString targetName = n->buildKey();
|
||||
const QString key
|
||||
= QStringList{projDir.path(), targetName, oldFilePath.path(), newFilePath.path()}.join(
|
||||
";");
|
||||
|
||||
auto fileToRename = m_filesToBeRenamed.take(key);
|
||||
if (!fileToRename.cmakeFile.exists()) {
|
||||
std::optional<CMakeBuildSystem::ProjectFileArgumentPosition> fileToRename
|
||||
= m_filesToBeRenamed.take(key);
|
||||
if (!fileToRename->cmakeFile.exists()) {
|
||||
qCCritical(cmakeBuildSystemLog).noquote()
|
||||
<< "File" << fileToRename.cmakeFile.path() << "does not exist.";
|
||||
<< "File" << fileToRename->cmakeFile.path() << "does not exist.";
|
||||
return false;
|
||||
}
|
||||
|
||||
do {
|
||||
BaseTextEditor *editor = qobject_cast<BaseTextEditor *>(
|
||||
Core::EditorManager::openEditorAt({fileToRename.cmakeFile,
|
||||
static_cast<int>(fileToRename.argumentPosition.Line),
|
||||
static_cast<int>(fileToRename.argumentPosition.Column
|
||||
- 1)},
|
||||
Core::EditorManager::openEditorAt(
|
||||
{fileToRename->cmakeFile,
|
||||
static_cast<int>(fileToRename->argumentPosition.Line),
|
||||
static_cast<int>(fileToRename->argumentPosition.Column - 1)},
|
||||
Constants::CMAKE_EDITOR_ID,
|
||||
Core::EditorManager::DoNotMakeVisible));
|
||||
if (!editor) {
|
||||
qCCritical(cmakeBuildSystemLog).noquote()
|
||||
<< "BaseTextEditor cannot be obtained for" << fileToRename.cmakeFile.path()
|
||||
<< fileToRename.argumentPosition.Line << int(fileToRename.argumentPosition.Column);
|
||||
<< "BaseTextEditor cannot be obtained for" << fileToRename->cmakeFile.path()
|
||||
<< fileToRename->argumentPosition.Line
|
||||
<< int(fileToRename->argumentPosition.Column);
|
||||
return false;
|
||||
}
|
||||
|
||||
// If quotes were used for the source file, skip the starting quote
|
||||
if (fileToRename.argumentPosition.Delim == cmListFileArgument::Quoted)
|
||||
if (fileToRename->argumentPosition.Delim == cmListFileArgument::Quoted)
|
||||
editor->setCursorPosition(editor->position() + 1);
|
||||
|
||||
if (!fileToRename.fromGlobbing)
|
||||
editor->replace(fileToRename.relativeFileName.length(), newRelPathName);
|
||||
if (!fileToRename->fromGlobbing)
|
||||
editor->replace(fileToRename->relativeFileName.length(), newRelPathName);
|
||||
|
||||
editor->editorWidget()->autoIndent();
|
||||
if (!Core::DocumentManager::saveDocument(editor->document())) {
|
||||
qCCritical(cmakeBuildSystemLog).noquote()
|
||||
<< "Changes to" << fileToRename.cmakeFile.path() << "could not be saved.";
|
||||
<< "Changes to" << fileToRename->cmakeFile.path() << "could not be saved.";
|
||||
return false;
|
||||
}
|
||||
|
||||
// Try the next occurrence. This can happen if set_source_file_properties is used
|
||||
fileToRename = projectFileArgumentPosition(targetName, oldRelPathName);
|
||||
} while (fileToRename);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -633,7 +633,7 @@ static FolderNode *createSourceGroupNode(const QString &sourceGroupName,
|
||||
FolderNode *existingNode = currentNode->findChildFolderNode(
|
||||
[&p](const FolderNode *fn) { return fn->displayName() == p; });
|
||||
if (!existingNode) {
|
||||
auto node = createCMakeVFolder(sourceDirectory, Node::DefaultFolderPriority + 5, p, true);
|
||||
auto node = createCMakeVFolder(sourceDirectory, Node::DefaultFolderPriority + 5, p);
|
||||
node->setListInProject(false);
|
||||
node->setIcon([] { return Icon::fromTheme("edit-copy"); });
|
||||
|
||||
@@ -654,7 +654,6 @@ static void addCompileGroups(ProjectNode *targetRoot,
|
||||
const FilePath &buildDirectory,
|
||||
const TargetDetails &td)
|
||||
{
|
||||
const bool showSourceFolders = settings().showSourceSubFolders();
|
||||
const bool inSourceBuild = (sourceDirectory == buildDirectory);
|
||||
|
||||
QSet<FilePath> alreadyListed;
|
||||
@@ -685,6 +684,9 @@ static void addCompileGroups(ProjectNode *targetRoot,
|
||||
if (isPchFile(buildDirectory, sourcePath) || isUnityFile(buildDirectory, sourcePath))
|
||||
node->setIsGenerated(true);
|
||||
|
||||
const bool showSourceFolders = settings().showSourceSubFolders()
|
||||
&& sourcesOrHeadersFolder(td.sourceGroups[si.sourceGroup]);
|
||||
|
||||
// Where does the file node need to go?
|
||||
if (showSourceFolders && sourcePath.isChildOf(buildDirectory) && !inSourceBuild) {
|
||||
buildFileNodes.emplace_back(std::move(node));
|
||||
@@ -696,6 +698,9 @@ static void addCompileGroups(ProjectNode *targetRoot,
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < sourceGroupFileNodes.size(); ++i) {
|
||||
const bool showSourceFolders = settings().showSourceSubFolders()
|
||||
&& sourcesOrHeadersFolder(td.sourceGroups[i]);
|
||||
|
||||
std::vector<std::unique_ptr<FileNode>> ¤t = sourceGroupFileNodes[i];
|
||||
FolderNode *insertNode = td.sourceGroups[i] == "TREE"
|
||||
? targetRoot
|
||||
|
||||
@@ -18,15 +18,19 @@ using namespace ProjectExplorer;
|
||||
|
||||
namespace CMakeProjectManager::Internal {
|
||||
|
||||
bool sourcesOrHeadersFolder(const QString &displayName)
|
||||
{
|
||||
return displayName == "Source Files" || displayName == "Header Files";
|
||||
}
|
||||
|
||||
std::unique_ptr<FolderNode> createCMakeVFolder(const Utils::FilePath &basePath,
|
||||
int priority,
|
||||
const QString &displayName,
|
||||
bool sourcesOrHeaders)
|
||||
const QString &displayName)
|
||||
{
|
||||
auto newFolder = std::make_unique<VirtualFolderNode>(basePath);
|
||||
newFolder->setPriority(priority);
|
||||
newFolder->setDisplayName(displayName);
|
||||
newFolder->setIsSourcesOrHeaders(sourcesOrHeaders);
|
||||
newFolder->setIsSourcesOrHeaders(sourcesOrHeadersFolder(displayName));
|
||||
return newFolder;
|
||||
}
|
||||
|
||||
@@ -35,14 +39,13 @@ void addCMakeVFolder(FolderNode *base,
|
||||
int priority,
|
||||
const QString &displayName,
|
||||
std::vector<std::unique_ptr<FileNode>> &&files,
|
||||
bool sourcesOrHeaders,
|
||||
bool listInProject)
|
||||
{
|
||||
if (files.size() == 0)
|
||||
return;
|
||||
FolderNode *folder = base;
|
||||
if (!displayName.isEmpty()) {
|
||||
auto newFolder = createCMakeVFolder(basePath, priority, displayName, sourcesOrHeaders);
|
||||
auto newFolder = createCMakeVFolder(basePath, priority, displayName);
|
||||
folder = newFolder.get();
|
||||
base->addNode(std::move(newFolder));
|
||||
}
|
||||
@@ -90,7 +93,6 @@ void addCMakeInputs(FolderNode *root,
|
||||
10,
|
||||
Tr::tr("<Other Locations>"),
|
||||
removeKnownNodes(knownFiles, std::move(rootInputs)),
|
||||
/*sourcesOrHeaders=*/false,
|
||||
/*listInProject=*/false);
|
||||
|
||||
root->addNode(std::move(cmakeVFolder));
|
||||
|
||||
@@ -11,17 +11,17 @@
|
||||
|
||||
namespace CMakeProjectManager::Internal {
|
||||
|
||||
bool sourcesOrHeadersFolder(const QString &displayName);
|
||||
|
||||
std::unique_ptr<ProjectExplorer::FolderNode> createCMakeVFolder(const Utils::FilePath &basePath,
|
||||
int priority,
|
||||
const QString &displayName,
|
||||
bool sourcesOrHeaders);
|
||||
const QString &displayName);
|
||||
|
||||
void addCMakeVFolder(ProjectExplorer::FolderNode *base,
|
||||
const Utils::FilePath &basePath,
|
||||
int priority,
|
||||
const QString &displayName,
|
||||
std::vector<std::unique_ptr<ProjectExplorer::FileNode>> &&files,
|
||||
bool sourcesOrHeaders = false,
|
||||
bool listInProject = true);
|
||||
|
||||
std::vector<std::unique_ptr<ProjectExplorer::FileNode>> &&removeKnownNodes(
|
||||
|
||||
@@ -999,6 +999,7 @@ bool FakeVimUserCommandsModel::setData(const QModelIndex &index,
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef WITH_TESTS
|
||||
static void setupTest(QString *title, FakeVimHandler **handler, QWidget **edit)
|
||||
{
|
||||
*title = QString::fromLatin1("test.cpp");
|
||||
@@ -1040,7 +1041,6 @@ static void setupTest(QString *title, FakeVimHandler **handler, QWidget **edit)
|
||||
(*handler)->handleCommand("set iskeyword=@,48-57,_,192-255,a-z,A-Z");
|
||||
}
|
||||
|
||||
#ifdef WITH_TESTS
|
||||
QObject *createFakeVimTester( void (*setupTest)(QString *, FakeVimHandler **, QWidget **) ); // in fakevim_test.cpp
|
||||
#endif
|
||||
|
||||
|
||||
@@ -60,19 +60,30 @@ using namespace Tasking;
|
||||
|
||||
namespace Ios::Internal {
|
||||
|
||||
static QString identifierForRunControl(RunControl *runControl)
|
||||
{
|
||||
const IosDeviceTypeAspect::Data *data = runControl->aspectData<IosDeviceTypeAspect>();
|
||||
return data ? data->deviceType.identifier : QString();
|
||||
}
|
||||
|
||||
static void stopRunningRunControl(RunControl *runControl)
|
||||
{
|
||||
static QMap<Id, QPointer<RunControl>> activeRunControls;
|
||||
|
||||
// clean up deleted
|
||||
Utils::erase(activeRunControls, [](const QPointer<RunControl> &rc) { return !rc; });
|
||||
|
||||
Target *target = runControl->target();
|
||||
Id devId = DeviceKitAspect::deviceId(target->kit());
|
||||
const Id devId = DeviceKitAspect::deviceId(target->kit());
|
||||
const QString identifier = identifierForRunControl(runControl);
|
||||
|
||||
// The device can only run an application at a time, if an app is running stop it.
|
||||
if (activeRunControls.contains(devId)) {
|
||||
if (QPointer<RunControl> activeRunControl = activeRunControls[devId])
|
||||
if (QPointer<RunControl> activeRunControl = activeRunControls[devId]) {
|
||||
if (identifierForRunControl(activeRunControl) == identifier) {
|
||||
activeRunControl->initiateStop();
|
||||
activeRunControls.remove(devId);
|
||||
}
|
||||
}
|
||||
|
||||
if (devId.isValid())
|
||||
activeRunControls[devId] = runControl;
|
||||
|
||||
@@ -391,9 +391,9 @@ void AppOutputPane::createNewOutputWindow(RunControl *rc)
|
||||
const CommandLine thisCommand = rc->commandLine();
|
||||
const FilePath thisWorkingDirectory = rc->workingDirectory();
|
||||
const Environment thisEnvironment = rc->environment();
|
||||
const auto tab = std::find_if(m_runControlTabs.begin(), m_runControlTabs.end(),
|
||||
[&](const RunControlTab &tab) {
|
||||
if (!tab.runControl || tab.runControl->isRunning() || tab.runControl->isStarting())
|
||||
const auto tab = std::find_if(
|
||||
m_runControlTabs.begin(), m_runControlTabs.end(), [&](const RunControlTab &tab) {
|
||||
if (!tab.runControl || !tab.runControl->isStopped())
|
||||
return false;
|
||||
return thisCommand == tab.runControl->commandLine()
|
||||
&& thisWorkingDirectory == tab.runControl->workingDirectory()
|
||||
|
||||
@@ -617,7 +617,15 @@ FilePath BuildConfiguration::buildDirectoryFromTemplate(const FilePath &projectD
|
||||
[buildType] { return buildTypeName(buildType); });
|
||||
exp.registerSubProvider([kit] { return kit->macroExpander(); });
|
||||
|
||||
FilePath buildDir = FilePath::fromUserInput(buildPropertiesSettings().buildDirectoryTemplate());
|
||||
auto project = ProjectManager::projectWithProjectFilePath(mainFilePath);
|
||||
auto environment = Environment::systemEnvironment();
|
||||
// This adds the environment variables from the <project>.shared file
|
||||
if (project)
|
||||
environment.modify(project->additionalEnvironment());
|
||||
|
||||
FilePath buildDir = FilePath::fromUserInput(environment.value_or(
|
||||
Constants::QTC_DEFAULT_BUILD_DIRECTORY_TEMPLATE,
|
||||
buildPropertiesSettings().buildDirectoryTemplate()));
|
||||
qCDebug(bcLog) << "build dir template:" << buildDir.toUserOutput();
|
||||
buildDir = exp.expand(buildDir);
|
||||
qCDebug(bcLog) << "expanded build:" << buildDir.toUserOutput();
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
#include <coreplugin/dialogs/ioptionspage.h>
|
||||
|
||||
#include <utils/environment.h>
|
||||
#include <utils/layoutbuilder.h>
|
||||
|
||||
using namespace Utils;
|
||||
@@ -16,7 +17,9 @@ namespace ProjectExplorer {
|
||||
|
||||
static QString defaultBuildDirectoryTemplate()
|
||||
{
|
||||
return "./build/%{Asciify:%{Kit:FileSystemName}-%{BuildConfig:Name}}";
|
||||
return qtcEnvironmentVariable(
|
||||
Constants::QTC_DEFAULT_BUILD_DIRECTORY_TEMPLATE,
|
||||
"./build/%{Asciify:%{Kit:FileSystemName}-%{BuildConfig:Name}}");
|
||||
}
|
||||
|
||||
BuildPropertiesSettings &buildPropertiesSettings()
|
||||
|
||||
@@ -145,6 +145,8 @@ const char CUSTOM_TOOLCHAIN_TYPEID[] = "ProjectExplorer.ToolChain.Custom";
|
||||
const char DEFAULT_WORKING_DIR[] = "%{buildDir}";
|
||||
const char DEFAULT_WORKING_DIR_ALTERNATE[] = "%{sourceDir}";
|
||||
|
||||
const char QTC_DEFAULT_BUILD_DIRECTORY_TEMPLATE[] = "QTC_DEFAULT_BUILD_DIRECTORY_TEMPLATE";
|
||||
|
||||
// Desktop Device related ids:
|
||||
const char DESKTOP_DEVICE_ID[] = "Desktop Device";
|
||||
const char DESKTOP_DEVICE_TYPE[] = "Desktop";
|
||||
|
||||
@@ -24,6 +24,21 @@
|
||||
" <sub-class-of type='text/plain'/>",
|
||||
" <glob pattern='*.dts' weight='80'/>",
|
||||
" </mime-type>",
|
||||
" <mime-type type='text/x-yacc'>",
|
||||
" <comment>Yacc/Bison source files</comment>",
|
||||
" <sub-class-of type='text/plain'/>",
|
||||
" <glob pattern='*.y'/>",
|
||||
" <glob pattern='*.yy'/>",
|
||||
" <glob pattern='*.ypp'/>",
|
||||
" <glob pattern='*.y++'/>",
|
||||
" </mime-type>",
|
||||
" <mime-type type='text/x-lex'>",
|
||||
" <comment>Lex/Flex source files</comment>",
|
||||
" <sub-class-of type='text/plain'/>",
|
||||
" <glob pattern='*.l'/>",
|
||||
" <glob pattern='*.lex'/>",
|
||||
" <glob pattern='*.flex'/>",
|
||||
" </mime-type>",
|
||||
"</mime-info>"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -524,7 +524,7 @@ def __getSupportedPlatforms__(text, templateName, getAsStrings=False, ignoreVali
|
||||
version = res.group("version")
|
||||
else:
|
||||
version = None
|
||||
if templateName == "Qt Quick Application":
|
||||
if templateName in ("Qt Quick 2 Extension Plugin", "Qt Quick Application"):
|
||||
result = set([Targets.DESKTOP_6_2_4])
|
||||
elif 'Supported Platforms' in text:
|
||||
supports = text[text.find('Supported Platforms'):].split(":")[1].strip().split("\n")
|
||||
|
||||
@@ -82,7 +82,8 @@ def __clickCommit__(count):
|
||||
test.verify(waitFor('str(fileName.currentText) == expected', 5000),
|
||||
"Verifying editor switches to Git Show.")
|
||||
description = waitForObject(":Qt Creator_DiffEditor::Internal::DescriptionEditorWidget")
|
||||
waitFor('len(str(description.plainText)) != 0', 5000)
|
||||
waitFor('len(str(description.plainText)) != 0 '
|
||||
'and str(description.plainText) != "Waiting for data..."', 5000)
|
||||
show = str(description.plainText)
|
||||
id = "Nobody <nobody@nowhere\.com>"
|
||||
time = "\w{3} \w{3} \d{1,2} \d{2}:\d{2}:\d{2} \d{4}.* seconds ago\)"
|
||||
|
||||
Reference in New Issue
Block a user