Merge remote-tracking branch 'origin/4.5'
Change-Id: I16e3bb9ee3a1e6dc6edf7a65f8a137a25cda4fe3
BIN
doc/images/qtcreator-android-sdk-manager.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 60 KiB |
BIN
doc/images/qtcreator-options-android2.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 37 KiB |
BIN
doc/images/qtcreator-qbs-profile-settings.png
Normal file
|
After Width: | Height: | Size: 9.7 KiB |
@@ -133,18 +133,37 @@
|
||||
|
||||
For more information, see \l{Qt for Android}.
|
||||
|
||||
\section2 Specifying Android Device Settings
|
||||
|
||||
To configure connections between \QC and Android devices:
|
||||
|
||||
\list 1
|
||||
|
||||
\li Select \uicontrol Tools > \uicontrol Options > \uicontrol Devices >
|
||||
\uicontrol Android to add paths to the Android NDK and SDK.
|
||||
\uicontrol Android.
|
||||
|
||||
\image qtcreator-options-android1.png "Android options"
|
||||
|
||||
\li In the \uicontrol {JDK location} field, add the path to the JDK.
|
||||
|
||||
You can use the \inlineimage download.png
|
||||
(\uicontrol Download) button to go to the site where you can
|
||||
download the JDK. \QC checks the JDK installation and reports
|
||||
errors.
|
||||
|
||||
\li In the \uicontrol {Android Settings} group, add paths to the Android
|
||||
NDK and SDK.
|
||||
|
||||
You can use the \inlineimage download.png
|
||||
(\uicontrol Download) buttons to go to the sites where you can download
|
||||
the Android NDK and SDK.
|
||||
|
||||
\image qtcreator-options-android1.png "Android options"
|
||||
The SDK Manager checks the Android NDK and SDK installations,
|
||||
reports errors, and offers to install the necessary packages.
|
||||
|
||||
\image qtcreator-options-android2.png "Android NDK and SDK checks"
|
||||
|
||||
For more information, see \l {Managing Android SDK Packages}.
|
||||
|
||||
\li Select the \uicontrol {Automatically create kits for Android tool chains}
|
||||
check box to allow \QC to create the kits for you. \QC displays a
|
||||
@@ -174,6 +193,46 @@
|
||||
\uicontrol {Select Android Devices} dialog.
|
||||
\endlist
|
||||
|
||||
\section2 Managing Android SDK Packages
|
||||
|
||||
Since Android SDK Tools version 25.3.0, only a command-line tool,
|
||||
\l{https://developer.android.com/studio/command-line/sdkmanager.html}
|
||||
{sdkmanager}, is provided by Android for SDK package management. To make SDK
|
||||
management easier, \QC provides an SDK Manager for installing, updating, and
|
||||
removing SDK packages. You can still use sdkmanager for advanced SDK
|
||||
management.
|
||||
|
||||
When you add paths to the Anroid NDK and SDK in the device options, the
|
||||
SDK Manager checks that all the necessary SDK packages have been installed.
|
||||
If packages are missing or updates are needed, the SDK Manager offers to
|
||||
add and remove packages, as necessary. Before taking action, it prompts you
|
||||
to accept the changes it is about to make. In addition, it prompts you to
|
||||
accept Google licenses, as necessary.
|
||||
|
||||
To view the installed Android SDK packages, select \uicontrol Tools >
|
||||
\uicontrol Options > \uicontrol Devices > \uicontrol Android >
|
||||
\uicontrol {SDK Manager}.
|
||||
|
||||
\image qtcreator-android-sdk-manager.png "Android SDK Manager"
|
||||
|
||||
To filter the packages, select \uicontrol Available, \uicontrol Installed,
|
||||
or \uicontrol All in \uicontrol {Show Packages}.
|
||||
|
||||
To update the installed Android SDK packages, select
|
||||
\uicontrol {Update Installed}. Select the packages to update, and then
|
||||
select \uicontrol Apply.
|
||||
|
||||
To specify advanced sdkmanager settings, select
|
||||
\uicontrol {Advanced Options} and enter arguments in the
|
||||
\uicontrol {SDK Manager arguments} field. The available arguments are listed
|
||||
and described in \uicontrol {Available arguments}.
|
||||
|
||||
To manage packages installed from Android SDK Tools version 25.2.5, or
|
||||
earlier, you can use the native Android SDK Manager. The \QC SDK Manager and
|
||||
the native SDK Manager are mutually exclusive, because they are used for
|
||||
different Android SDK Tools versions. If you have the native SDK Manager
|
||||
installed, you can open it by selecting \uicontrol {Native SDK Manager}.
|
||||
|
||||
\section1 Selecting Android Devices
|
||||
|
||||
When you deploy an application to an Android device with Android
|
||||
|
||||
@@ -37,9 +37,8 @@
|
||||
|
||||
\title Using External Tools
|
||||
|
||||
You can use external tools directly from \QC. Qt Linguist,
|
||||
QML preview tools, the
|
||||
default text editor for your system, and the \c sort tool are preconfigured
|
||||
You can use external tools directly from \QC. Qt Linguist, QML preview
|
||||
tools, and the default text editor for your system are preconfigured
|
||||
for use. You can change their default configurations and configure new
|
||||
tools.
|
||||
|
||||
@@ -93,16 +92,6 @@
|
||||
\QC looks for the editor path in the PATH environment variable
|
||||
of your operating system.
|
||||
|
||||
\section1 Sorting Text Alphabetically
|
||||
|
||||
To sort selected text alphabetically, select \uicontrol {Tools > External > Text
|
||||
> Sort Selection}. The \c sort tool takes the selected text as input and
|
||||
returns it in alphabetic order. By default, the output replaces the
|
||||
original selection in the code editor.
|
||||
|
||||
To change the default configuration, select \uicontrol {Tools > External >
|
||||
Configure}.
|
||||
|
||||
\section1 Configuring External Tools
|
||||
|
||||
You can change the configuration of preconfigured tools and configure
|
||||
|
||||
@@ -257,4 +257,10 @@
|
||||
history, press \key {Ctrl+Shift+V} until the clip appears.
|
||||
The number of clips in the history is fixed to 10.
|
||||
|
||||
\section1 Sorting Lines Alphabetically
|
||||
|
||||
To sort selected lines alphabetically, select \uicontrol Edit >
|
||||
\uicontrol Advanced > \uicontrol {Sort Selected Lines} or press
|
||||
\key {Alt+Shift+S} (or \key Ctrl+Shift+S on \macos).
|
||||
|
||||
*/
|
||||
|
||||
@@ -57,10 +57,8 @@
|
||||
To change the location of the project directory, and to specify settings
|
||||
for building and running projects, select \uicontrol Tools >
|
||||
\uicontrol Options > \uicontrol {Build & Run} > \uicontrol General. The
|
||||
\uicontrol CMake tab contains additional CMake settings.
|
||||
|
||||
To specify build profiles for Qbs, select \uicontrol Tools >
|
||||
\uicontrol Options > \uicontrol Qbs.
|
||||
\uicontrol CMake and \uicontrol Qbs tabs contain additional settings for
|
||||
those build systems.
|
||||
|
||||
To specify build and run settings for different target platforms,
|
||||
select \uicontrol Projects. For more information on the options you have,
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
kit. You can edit the build profiles by adding new keys and values.
|
||||
|
||||
To check which Qbs version is being used, select \uicontrol Tools >
|
||||
\uicontrol Options > \uicontrol Qbs > \uicontrol {Version Info}.
|
||||
\uicontrol Options > \uicontrol {Build & Run} > \uicontrol Qbs.
|
||||
|
||||
\section1 Building Qbs
|
||||
|
||||
@@ -57,46 +57,24 @@
|
||||
|
||||
\endlist
|
||||
|
||||
\section1 Editing Build Profiles
|
||||
\section1 Specifying Qbs Settings
|
||||
|
||||
To specify settings for Qbs, select \uicontrol Tools > \uicontrol Options >
|
||||
\uicontrol {Build & Run} > \uicontrol Qbs.
|
||||
|
||||
\image qtcreator-options-qbs.png
|
||||
|
||||
You can modify a build profile that is associated with a build and run kit
|
||||
by editing the values of the keys generated by \QC and by adding new values:
|
||||
By default, Qbs profiles are stored in the \c qbs directory in the \QC
|
||||
settings directory to ensure that different \QC instances do not overwrite
|
||||
each other's profiles. If you only run one \QC instance, you can store the
|
||||
profiles in the Qbs settings directory instead, by deselecting the
|
||||
\uicontrol {Store profiles in Qt Creator settings directory} check box.
|
||||
|
||||
\list 1
|
||||
|
||||
\li Select \uicontrol Tools > \uicontrol Options > \uicontrol Qbs.
|
||||
|
||||
\li By default, Qbs profiles are stored in the \c qbs directory in the
|
||||
\QC settings directory to ensure that different \QC instances do not
|
||||
overwrite each other's profiles. If you only run one \QC instance,
|
||||
you can store the profiles in the Qbs settings directory instead,
|
||||
by deselecting the \uicontrol {Store profiles in Qt Creator settings
|
||||
directory} check box.
|
||||
|
||||
\li In the \uicontrol Kit field, select a build and run kit.
|
||||
|
||||
\li Select \uicontrol Edit to edit the profile associated with the kit.
|
||||
|
||||
\li Select \uicontrol Add to add keys and values to the profile or to
|
||||
modify existing values.
|
||||
|
||||
\li In the \uicontrol Key column, spefify the key to add or modify as:
|
||||
\c <module_name>.<property_name>.
|
||||
|
||||
\li In the \uicontrol Value column, specify a value as a JSON literal.
|
||||
|
||||
\li Click \uicontrol OK.
|
||||
|
||||
\endlist
|
||||
|
||||
The values that you have modified are displayed in red in the
|
||||
\uicontrol {Profile properties} field.
|
||||
|
||||
For a list of available keys and values, see the
|
||||
\l{http://doc.qt.io/qbs/list-of-modules.html}{List of Modules} in the
|
||||
Qbs Manual.
|
||||
In the \uicontrol Kit field, select a build and run kit to view the
|
||||
properties of the associated Qbs profile. To modify the properties of the
|
||||
Qbs profile associated with a kit, select \uicontrol Tools >
|
||||
\uicontrol Options > \uicontrol {Build & Run} > \uicontrol Kits. For more
|
||||
information, see \l{Editing Qbs Profiles}.
|
||||
|
||||
\section1 Related Topics
|
||||
|
||||
|
||||
@@ -142,7 +142,7 @@
|
||||
|
||||
\li In the \uicontrol {Additional Qbs profile settings} field, select
|
||||
\uicontrol Change to add settings to Qbs build profiles. For more
|
||||
information, see \l {Editing Build Profiles}.
|
||||
information, see \l {Editing Qbs Profiles}.
|
||||
|
||||
\endlist
|
||||
|
||||
@@ -150,4 +150,38 @@
|
||||
choose the kit to use. To set the selected kit as the default kit,
|
||||
select \uicontrol {Make Default}.
|
||||
|
||||
\section1 Editing Qbs Profiles
|
||||
|
||||
To view the Qbs profile associated with the kit, select \uicontrol Tools >
|
||||
\uicontrol Options > \uicontrol {Build & Run} > \uicontrol Qbs.
|
||||
|
||||
You can add keys and values to the profile or remove them from it, as well
|
||||
as modify existing values. For a list of available keys and values, see
|
||||
\l{http://doc.qt.io/qbs/list-of-modules.html}{List of Modules} in the Qbs
|
||||
Manual.
|
||||
|
||||
To edit the Qbs profile associated with the kit:
|
||||
|
||||
\list 1
|
||||
|
||||
\li Select \uicontrol Change next to the
|
||||
\uicontrol {Additional Qbs Profile Settings} field.
|
||||
|
||||
\image qtcreator-qbs-profile-settings.
|
||||
|
||||
\li Select \uicontrol Add.
|
||||
|
||||
\li In the \uicontrol Key column, spefify the key to add or modify as:
|
||||
\c <module_name>.<property_name>.
|
||||
|
||||
\li In the \uicontrol Value column, specify a value as a JSON literal.
|
||||
|
||||
\li Click \uicontrol OK.
|
||||
|
||||
\endlist
|
||||
|
||||
To modify an existing value, double-click it in the \uicontrol Value field.
|
||||
|
||||
To remove the selected property, select \uicontrol Remove.
|
||||
|
||||
*/
|
||||
|
||||
@@ -140,8 +140,16 @@ def qdump__CPlusPlus__Symbol(d, value):
|
||||
def qdump__CPlusPlus__Class(d, value):
|
||||
qdump__CPlusPlus__Symbol(d, value)
|
||||
|
||||
def kindName(d, value):
|
||||
e = value.integer()
|
||||
if e:
|
||||
kindType = d.lookupType("CPlusPlus::Kind")
|
||||
return kindType.typeData().enumDisplay(e, value.address())[11:]
|
||||
else:
|
||||
return ''
|
||||
|
||||
def qdump__CPlusPlus__IntegerType(d, value):
|
||||
d.putValue(value["_kind"])
|
||||
d.putValue(kindName(d, value["_kind"]))
|
||||
d.putPlainChildren(value)
|
||||
|
||||
def qdump__CPlusPlus__FullySpecifiedType(d, value):
|
||||
@@ -202,11 +210,7 @@ def qdump__Utf8String(d, value):
|
||||
def qdump__CPlusPlus__Token(d, value):
|
||||
k = value["f"]["kind"]
|
||||
e = k.lvalue
|
||||
if e:
|
||||
kindType = d.lookupType("CPlusPlus::Kind")
|
||||
type = kindType.typeData().enumDisplay(e, k.address())[11:]
|
||||
else:
|
||||
type = ''
|
||||
type = kindName(d, k)
|
||||
try:
|
||||
if e == 6:
|
||||
type = readLiteral(d, value["identifier"]) + " (%s)" % type
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"supportedProjectTypes": [ "CMakeProjectManager.CMakeProject", "Qbs.QbsProject", "Qt4ProjectManager.Qt4Project" ],
|
||||
"id": "V.QtQuickApplicationSwipe",
|
||||
"category": "F.Application",
|
||||
"trDescription": "Creates a Qt Quick Controls application with a with a StackView to display content, and a Drawer and ToolBar for navigation.",
|
||||
"trDescription": "Creates a Qt Quick Controls application with a SwipeView for navigation.",
|
||||
"trDisplayName": "Qt Quick Application - Swipe",
|
||||
"trDisplayCategory": "Application",
|
||||
"icon": "icon.png",
|
||||
|
||||
@@ -51,7 +51,6 @@ Product {
|
||||
"lupdate.xml",
|
||||
"qmlscene.xml",
|
||||
"qmlviewer.xml",
|
||||
"sort.xml",
|
||||
]
|
||||
if (qbs.targetOS.contains("windows"))
|
||||
list.push("notepad_win.xml");
|
||||
|
||||
@@ -285,11 +285,8 @@ void CMakeProject::updateProjectData(CMakeBuildConfiguration *bc)
|
||||
|
||||
createGeneratedCodeModelSupport();
|
||||
|
||||
ToolChain *tc = ToolChainKitInformation::toolChain(k, ProjectExplorer::Constants::CXX_LANGUAGE_ID);
|
||||
if (!tc) {
|
||||
emit fileListChanged();
|
||||
return;
|
||||
}
|
||||
ToolChain *tcC = ToolChainKitInformation::toolChain(k, ProjectExplorer::Constants::C_LANGUAGE_ID);
|
||||
ToolChain *tcCxx = ToolChainKitInformation::toolChain(k, ProjectExplorer::Constants::CXX_LANGUAGE_ID);
|
||||
|
||||
CppTools::ProjectPart::QtVersion activeQtVersion = CppTools::ProjectPart::NoQt;
|
||||
if (QtSupport::BaseQtVersion *qtVersion = QtSupport::QtKitInformation::qtVersion(k)) {
|
||||
@@ -307,11 +304,13 @@ void CMakeProject::updateProjectData(CMakeBuildConfiguration *bc)
|
||||
for (CppTools::RawProjectPart &rpp : rpps) {
|
||||
// TODO: Set the Qt version only if target actually depends on Qt.
|
||||
rpp.setQtVersion(activeQtVersion);
|
||||
// TODO: Support also C
|
||||
rpp.setFlagsForCxx({tc, rpp.flagsForCxx.commandLineFlags});
|
||||
if (tcCxx)
|
||||
rpp.setFlagsForCxx({tcCxx, rpp.flagsForCxx.commandLineFlags});
|
||||
if (tcC)
|
||||
rpp.setFlagsForC({tcC, rpp.flagsForC.commandLineFlags});
|
||||
}
|
||||
|
||||
m_cppCodeModelUpdater->update({this, nullptr, tc, k, rpps});
|
||||
m_cppCodeModelUpdater->update({this, tcC, tcCxx, k, rpps});
|
||||
|
||||
updateQmlJSCodeModel();
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
|
||||
#include "icore.h"
|
||||
#include "idocument.h"
|
||||
#include "idocumentfactory.h"
|
||||
#include "coreconstants.h"
|
||||
|
||||
#include <coreplugin/diffservice.h>
|
||||
@@ -710,6 +711,33 @@ bool DocumentManager::saveDocument(IDocument *document, const QString &fileName,
|
||||
return ret;
|
||||
}
|
||||
|
||||
template<typename FactoryType>
|
||||
QSet<QString> filterStrings()
|
||||
{
|
||||
QSet<QString> filters;
|
||||
for (FactoryType *factory : ExtensionSystem::PluginManager::getObjects<FactoryType>()) {
|
||||
for (const QString &mt : factory->mimeTypes()) {
|
||||
const QString filter = mimeTypeForName(mt).filterString();
|
||||
if (!filter.isEmpty())
|
||||
filters.insert(filter);
|
||||
}
|
||||
}
|
||||
return filters;
|
||||
}
|
||||
|
||||
QString DocumentManager::allDocumentFactoryFiltersString(QString *allFilesFilter = 0)
|
||||
{
|
||||
const QSet<QString> uniqueFilters = filterStrings<IDocumentFactory>()
|
||||
+ filterStrings<IEditorFactory>();
|
||||
QStringList filters = uniqueFilters.toList();
|
||||
filters.sort();
|
||||
const QString allFiles = Utils::allFilesFilterString();
|
||||
if (allFilesFilter)
|
||||
*allFilesFilter = allFiles;
|
||||
filters.prepend(allFiles);
|
||||
return filters.join(QLatin1String(";;"));
|
||||
}
|
||||
|
||||
QString DocumentManager::getSaveFileName(const QString &title, const QString &pathIn,
|
||||
const QString &filter, QString *selectedFilter)
|
||||
{
|
||||
@@ -771,7 +799,7 @@ QString DocumentManager::getSaveFileNameWithExtension(const QString &title, cons
|
||||
QString DocumentManager::getSaveAsFileName(const IDocument *document)
|
||||
{
|
||||
QTC_ASSERT(document, return QString());
|
||||
const QString filter = Utils::allFiltersString();
|
||||
const QString filter = allDocumentFactoryFiltersString();
|
||||
const QString filePath = document->filePath().toString();
|
||||
QString selectedFilter;
|
||||
QString fileDialogPath = filePath;
|
||||
|
||||
@@ -84,6 +84,8 @@ public:
|
||||
const QString &fileName = QString(),
|
||||
bool *isReadOnly = nullptr);
|
||||
|
||||
static QString allDocumentFactoryFiltersString(QString *allFilesFilter);
|
||||
|
||||
static QStringList getOpenFileNames(const QString &filters,
|
||||
const QString &path = QString(),
|
||||
QString *selectedFilter = nullptr);
|
||||
|
||||
@@ -2726,7 +2726,7 @@ void EditorManager::addCloseEditorListener(const std::function<bool (IEditor *)>
|
||||
QStringList EditorManager::getOpenFileNames()
|
||||
{
|
||||
QString selectedFilter;
|
||||
const QString &fileFilters = Utils::allFiltersString(&selectedFilter);
|
||||
const QString &fileFilters = DocumentManager::allDocumentFactoryFiltersString(&selectedFilter);
|
||||
return DocumentManager::getOpenFileNames(fileFilters, QString(), &selectedFilter);
|
||||
}
|
||||
|
||||
|
||||
@@ -4750,7 +4750,7 @@ public:
|
||||
scopeAtInsertPos);
|
||||
QString funcDef = prefix + funcDec;
|
||||
const int startPosition = m_fromFile->endOf(funcAST->declarator);
|
||||
const int endPosition = m_fromFile->endOf(funcAST->function_body);
|
||||
const int endPosition = m_fromFile->endOf(funcAST);
|
||||
funcDef += m_fromFile->textOf(startPosition, endPosition);
|
||||
funcDef += suffix;
|
||||
|
||||
|
||||
@@ -83,8 +83,11 @@ QList<Core::LocatorFilterEntry> CppLocatorFilter::matchesFor(
|
||||
m_data->filterAllFiles([&](const IndexItem::Ptr &info) -> IndexItem::VisitorResult {
|
||||
if (future.isCanceled())
|
||||
return IndexItem::Break;
|
||||
if (info->type() & wanted) {
|
||||
const IndexItem::ItemType type = info->type();
|
||||
if (type & wanted) {
|
||||
QString matchString = hasColonColon ? info->scopedSymbolName() : info->symbolName();
|
||||
if (type == IndexItem::Function)
|
||||
matchString += info->symbolType();
|
||||
QRegularExpressionMatch match = regexp.match(matchString);
|
||||
if (match.hasMatch()) {
|
||||
Core::LocatorFilterEntry filterEntry = filterEntryFromIndexItem(info);
|
||||
|
||||
@@ -196,10 +196,26 @@ void CppToolsPlugin::test_cpplocatorfilters_CppLocatorFilter_data()
|
||||
<< _("pos")
|
||||
<< (QList<ResultData>()
|
||||
<< ResultData(_("positiveNumber()"), testFileShort)
|
||||
<< ResultData(_("getPosition()"), testFileShort)
|
||||
<< ResultData(_("matchArgument(Pos)"), testFileShort)
|
||||
<< ResultData(_("pointOfService()"), testFileShort)
|
||||
);
|
||||
|
||||
QTest::newRow("CppFunctionsFilter-arguments")
|
||||
<< testFile
|
||||
<< cppFunctionsFilter
|
||||
<< _("function*bool")
|
||||
<< (QList<ResultData>()
|
||||
<< ResultData(_("functionDefinedInClass(bool, int)"),
|
||||
_("MyClass (file1.cpp)"))
|
||||
<< ResultData(_("functionDefinedInClass(bool, int)"),
|
||||
_("MyNamespace::MyClass (file1.cpp)"))
|
||||
<< ResultData(_("functionDefinedInClass(bool, int)"),
|
||||
_("<anonymous namespace>::MyClass (file1.cpp)"))
|
||||
<< ResultData(_("myFunction(bool, int)"), testFileShort)
|
||||
<< ResultData(_("myFunction(bool, int)"), _("MyNamespace (file1.cpp)"))
|
||||
<< ResultData(_("myFunction(bool, int)"), _("<anonymous namespace> (file1.cpp)"))
|
||||
);
|
||||
|
||||
QTest::newRow("CppFunctionsFilter-WithNamespacePrefix")
|
||||
<< testFile
|
||||
<< cppFunctionsFilter
|
||||
@@ -290,8 +306,9 @@ void CppToolsPlugin::test_cpplocatorfilters_CppCurrentDocumentFilter()
|
||||
QList<ResultData> expectedResults = QList<ResultData>()
|
||||
<< ResultData(_("int myVariable"), _(""))
|
||||
<< ResultData(_("myFunction(bool, int)"), _(""))
|
||||
<< ResultData(_("Pos"), _(""))
|
||||
<< ResultData(_("pointOfService()"), _(""))
|
||||
<< ResultData(_("getPosition()"), _(""))
|
||||
<< ResultData(_("matchArgument(Pos)"), _(""))
|
||||
<< ResultData(_("positiveNumber()"), _(""))
|
||||
<< ResultData(_("MyEnum"), _(""))
|
||||
<< ResultData(_("int V1"), _("MyEnum"))
|
||||
|
||||
@@ -163,16 +163,17 @@ ProjectInfoGenerator::ProjectInfoGenerator(const QFutureInterface<void> &futureI
|
||||
|
||||
ProjectInfo ProjectInfoGenerator::generate()
|
||||
{
|
||||
m_projectInfo = ProjectInfo(m_projectUpdateInfo.project);
|
||||
ProjectInfo projectInfo(m_projectUpdateInfo.project);
|
||||
|
||||
for (const RawProjectPart &rpp : m_projectUpdateInfo.rawProjectParts) {
|
||||
if (m_futureInterface.isCanceled())
|
||||
return ProjectInfo();
|
||||
|
||||
createProjectParts(rpp);
|
||||
for (ProjectPart::Ptr part : createProjectParts(rpp))
|
||||
projectInfo.appendProjectPart(part);
|
||||
}
|
||||
|
||||
return m_projectInfo;
|
||||
return projectInfo;
|
||||
}
|
||||
|
||||
static ProjectPart::Ptr projectPartFromRawProjectPart(const RawProjectPart &rawProjectPart,
|
||||
@@ -196,8 +197,9 @@ static ProjectPart::Ptr projectPartFromRawProjectPart(const RawProjectPart &rawP
|
||||
return part;
|
||||
}
|
||||
|
||||
void ProjectInfoGenerator::createProjectParts(const RawProjectPart &rawProjectPart)
|
||||
QVector<ProjectPart::Ptr> ProjectInfoGenerator::createProjectParts(const RawProjectPart &rawProjectPart)
|
||||
{
|
||||
QVector<ProjectPart::Ptr> result;
|
||||
ProjectFileCategorizer cat(rawProjectPart.displayName,
|
||||
rawProjectPart.files,
|
||||
rawProjectPart.fileClassifier);
|
||||
@@ -210,49 +212,50 @@ void ProjectInfoGenerator::createProjectParts(const RawProjectPart &rawProjectPa
|
||||
if (rawProjectPart.qtVersion == ProjectPart::Qt4_8_6AndOlder)
|
||||
defaultVersion = ProjectPart::CXX11;
|
||||
if (cat.hasCxxSources()) {
|
||||
createProjectPart(rawProjectPart,
|
||||
part,
|
||||
cat.cxxSources(),
|
||||
cat.partName("C++"),
|
||||
defaultVersion,
|
||||
ProjectPart::NoExtensions);
|
||||
result << createProjectPart(rawProjectPart,
|
||||
part,
|
||||
cat.cxxSources(),
|
||||
cat.partName("C++"),
|
||||
defaultVersion,
|
||||
ProjectPart::NoExtensions);
|
||||
}
|
||||
|
||||
if (cat.hasObjcxxSources()) {
|
||||
createProjectPart(rawProjectPart,
|
||||
part,
|
||||
cat.objcxxSources(),
|
||||
cat.partName("Obj-C++"),
|
||||
defaultVersion,
|
||||
ProjectPart::ObjectiveCExtensions);
|
||||
result << createProjectPart(rawProjectPart,
|
||||
part,
|
||||
cat.objcxxSources(),
|
||||
cat.partName("Obj-C++"),
|
||||
defaultVersion,
|
||||
ProjectPart::ObjectiveCExtensions);
|
||||
}
|
||||
|
||||
if (cat.hasCSources()) {
|
||||
createProjectPart(rawProjectPart,
|
||||
part,
|
||||
cat.cSources(),
|
||||
cat.partName("C"),
|
||||
ProjectPart::LatestCVersion,
|
||||
ProjectPart::NoExtensions);
|
||||
result << createProjectPart(rawProjectPart,
|
||||
part,
|
||||
cat.cSources(),
|
||||
cat.partName("C"),
|
||||
ProjectPart::LatestCVersion,
|
||||
ProjectPart::NoExtensions);
|
||||
}
|
||||
|
||||
if (cat.hasObjcSources()) {
|
||||
createProjectPart(rawProjectPart,
|
||||
part,
|
||||
cat.objcSources(),
|
||||
cat.partName("Obj-C"),
|
||||
ProjectPart::LatestCVersion,
|
||||
ProjectPart::ObjectiveCExtensions);
|
||||
result << createProjectPart(rawProjectPart,
|
||||
part,
|
||||
cat.objcSources(),
|
||||
cat.partName("Obj-C"),
|
||||
ProjectPart::LatestCVersion,
|
||||
ProjectPart::ObjectiveCExtensions);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void ProjectInfoGenerator::createProjectPart(const RawProjectPart &rawProjectPart,
|
||||
const ProjectPart::Ptr &templateProjectPart,
|
||||
const ProjectFiles &projectFiles,
|
||||
const QString &partName,
|
||||
ProjectPart::LanguageVersion languageVersion,
|
||||
ProjectPart::LanguageExtensions languageExtensions)
|
||||
ProjectPart::Ptr ProjectInfoGenerator::createProjectPart(const RawProjectPart &rawProjectPart,
|
||||
const ProjectPart::Ptr &templateProjectPart,
|
||||
const ProjectFiles &projectFiles,
|
||||
const QString &partName,
|
||||
ProjectPart::LanguageVersion languageVersion,
|
||||
ProjectPart::LanguageExtensions languageExtensions)
|
||||
{
|
||||
ProjectPart::Ptr part(templateProjectPart->copy());
|
||||
part->displayName = partName;
|
||||
@@ -277,7 +280,7 @@ void ProjectInfoGenerator::createProjectPart(const RawProjectPart &rawProjectPar
|
||||
part->languageExtensions |= languageExtensions;
|
||||
part->updateLanguageFeatures();
|
||||
|
||||
m_projectInfo.appendProjectPart(part);
|
||||
return part;
|
||||
}
|
||||
|
||||
} // namespace Internal
|
||||
|
||||
@@ -41,19 +41,17 @@ public:
|
||||
ProjectInfo generate();
|
||||
|
||||
private:
|
||||
void createProjectParts(const RawProjectPart &rawProjectPart);
|
||||
void createProjectPart(const RawProjectPart &rawProjectPart,
|
||||
const ProjectPart::Ptr &templateProjectPart,
|
||||
const ProjectFiles &projectFiles,
|
||||
const QString &partName,
|
||||
ProjectPart::LanguageVersion languageVersion,
|
||||
ProjectPart::LanguageExtensions languageExtensions);
|
||||
QVector<ProjectPart::Ptr> createProjectParts(const RawProjectPart &rawProjectPart);
|
||||
ProjectPart::Ptr createProjectPart(const RawProjectPart &rawProjectPart,
|
||||
const ProjectPart::Ptr &templateProjectPart,
|
||||
const ProjectFiles &projectFiles,
|
||||
const QString &partName,
|
||||
ProjectPart::LanguageVersion languageVersion,
|
||||
ProjectPart::LanguageExtensions languageExtensions);
|
||||
|
||||
private:
|
||||
const QFutureInterface<void> &m_futureInterface;
|
||||
const QFutureInterface<void> m_futureInterface;
|
||||
const ProjectUpdateInfo &m_projectUpdateInfo;
|
||||
|
||||
ProjectInfo m_projectInfo;
|
||||
};
|
||||
} // namespace Internal
|
||||
} // namespace CppTools
|
||||
|
||||
@@ -62,9 +62,8 @@ void CppProjectUpdater::update(const ProjectUpdateInfo &projectUpdateInfo)
|
||||
this, &CppProjectUpdater::onToolChainRemoved);
|
||||
|
||||
// Run the project info generator in a worker thread and continue if that one is finished.
|
||||
const QFutureInterface<void> &futureInterface = m_futureInterface;
|
||||
const QFuture<ProjectInfo> future = Utils::runAsync([=]() {
|
||||
Internal::ProjectInfoGenerator generator(futureInterface, projectUpdateInfo);
|
||||
Internal::ProjectInfoGenerator generator(m_futureInterface, projectUpdateInfo);
|
||||
return generator.generate();
|
||||
});
|
||||
m_generateFutureWatcher.setFuture(future);
|
||||
|
||||
@@ -88,7 +88,7 @@ AbiWidget::AbiWidget(QWidget *parent) : QWidget(parent),
|
||||
d->m_architectureComboBox->addItem(Abi::toString(static_cast<Abi::Architecture>(i)), i);
|
||||
d->m_architectureComboBox->setCurrentIndex(static_cast<int>(Abi::UnknownArchitecture));
|
||||
connect(d->m_architectureComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
|
||||
this, &AbiWidget::customAbiChanged);
|
||||
this, &AbiWidget::updateCustomItemData);
|
||||
|
||||
QLabel *separator1 = new QLabel(this);
|
||||
separator1->setText(QLatin1String("-"));
|
||||
@@ -111,7 +111,7 @@ AbiWidget::AbiWidget(QWidget *parent) : QWidget(parent),
|
||||
d->m_osFlavorComboBox = new QComboBox(this);
|
||||
layout->addWidget(d->m_osFlavorComboBox);
|
||||
connect(d->m_osFlavorComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
|
||||
this, &AbiWidget::customAbiChanged);
|
||||
this, &AbiWidget::updateCustomItemData);
|
||||
|
||||
QLabel *separator3 = new QLabel(this);
|
||||
separator3->setText(QLatin1String("-"));
|
||||
@@ -124,7 +124,7 @@ AbiWidget::AbiWidget(QWidget *parent) : QWidget(parent),
|
||||
d->m_binaryFormatComboBox->addItem(Abi::toString(static_cast<Abi::BinaryFormat>(i)), i);
|
||||
d->m_binaryFormatComboBox->setCurrentIndex(static_cast<int>(Abi::UnknownFormat));
|
||||
connect(d->m_binaryFormatComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
|
||||
this, &AbiWidget::customAbiChanged);
|
||||
this, &AbiWidget::updateCustomItemData);
|
||||
|
||||
QLabel *separator4 = new QLabel(this);
|
||||
separator4->setText(QLatin1String("-"));
|
||||
@@ -139,7 +139,7 @@ AbiWidget::AbiWidget(QWidget *parent) : QWidget(parent),
|
||||
d->m_wordWidthComboBox->addItem(Abi::toString(0), 0);
|
||||
d->m_wordWidthComboBox->setCurrentIndex(2);
|
||||
connect(d->m_wordWidthComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
|
||||
this, &AbiWidget::customAbiChanged);
|
||||
this, &AbiWidget::updateCustomItemData);
|
||||
|
||||
layout->setStretchFactor(d->m_abi, 1);
|
||||
|
||||
@@ -164,24 +164,23 @@ void AbiWidget::setAbis(const QList<Abi> &abiList, const Abi ¤t)
|
||||
defaultAbi = Abi::hostAbi();
|
||||
}
|
||||
|
||||
d->m_abi->addItem(tr("<custom>"), defaultAbi.toString());
|
||||
d->m_abi->addItem(tr("<custom>"));
|
||||
d->m_abi->setCurrentIndex(0);
|
||||
setCustomAbi(defaultAbi);
|
||||
|
||||
for (int i = 0; i < abiList.count(); ++i) {
|
||||
int index = i + 1;
|
||||
const QString abiString = abiList.at(i).toString();
|
||||
|
||||
d->m_abi->insertItem(index, abiString, abiString);
|
||||
if (abiList.at(i) == current)
|
||||
if (abiList.at(i) == defaultAbi)
|
||||
d->m_abi->setCurrentIndex(index);
|
||||
}
|
||||
|
||||
d->m_abi->setVisible(!abiList.isEmpty());
|
||||
if (d->isCustom()) {
|
||||
if (!current.isValid() && !abiList.isEmpty())
|
||||
d->m_abi->setCurrentIndex(1); // default to the first Abi if none is selected.
|
||||
else
|
||||
setCustomAbi(current);
|
||||
}
|
||||
if (d->isCustom() && !current.isValid() && !abiList.isEmpty())
|
||||
d->m_abi->setCurrentIndex(1); // default to the first Abi if none is selected.
|
||||
|
||||
modeChanged();
|
||||
}
|
||||
|
||||
@@ -215,7 +214,7 @@ void AbiWidget::osChanged()
|
||||
d->m_osFlavorComboBox->addItem(Abi::toString(f), static_cast<int>(f));
|
||||
d->m_osFlavorComboBox->setCurrentIndex(0); // default to generic flavor
|
||||
}
|
||||
customAbiChanged();
|
||||
updateCustomItemData();
|
||||
}
|
||||
|
||||
void AbiWidget::modeChanged()
|
||||
@@ -230,11 +229,8 @@ void AbiWidget::modeChanged()
|
||||
setCustomAbi(currentAbi());
|
||||
}
|
||||
|
||||
void AbiWidget::customAbiChanged()
|
||||
void AbiWidget::updateCustomItemData()
|
||||
{
|
||||
if (signalsBlocked())
|
||||
return;
|
||||
|
||||
Abi current(static_cast<Abi::Architecture>(d->m_architectureComboBox->currentIndex()),
|
||||
static_cast<Abi::OS>(d->m_osComboBox->currentIndex()),
|
||||
static_cast<Abi::OSFlavor>(d->m_osFlavorComboBox->itemData(d->m_osFlavorComboBox->currentIndex()).toInt()),
|
||||
@@ -265,8 +261,7 @@ void AbiWidget::setCustomAbi(const Abi ¤t)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (d->isCustom())
|
||||
d->m_abi->setItemData(0, current.toString());
|
||||
updateCustomItemData();
|
||||
}
|
||||
|
||||
emit abiChanged();
|
||||
|
||||
@@ -57,7 +57,7 @@ signals:
|
||||
private:
|
||||
void osChanged();
|
||||
void modeChanged();
|
||||
void customAbiChanged();
|
||||
void updateCustomItemData();
|
||||
|
||||
void setCustomAbi(const Abi &a);
|
||||
|
||||
|
||||
@@ -177,6 +177,13 @@ QList<HeaderPath> GccToolChain::gccHeaderPaths(const FileName &gcc, const QStrin
|
||||
return systemHeaderPaths;
|
||||
}
|
||||
|
||||
void GccToolChain::toolChainUpdated()
|
||||
{
|
||||
m_predefinedMacrosCache->invalidate();
|
||||
m_headerPathsCache->invalidate();
|
||||
ToolChain::toolChainUpdated();
|
||||
}
|
||||
|
||||
static QList<Abi> guessGccAbi(const QString &m, const ProjectExplorer::Macros ¯os)
|
||||
{
|
||||
QList<Abi> abiList;
|
||||
@@ -245,7 +252,7 @@ GccToolChain::GccToolChain(Detection d) :
|
||||
|
||||
GccToolChain::GccToolChain(Core::Id typeId, Detection d) :
|
||||
ToolChain(typeId, d),
|
||||
m_predefinedMacrosCache(std::make_shared<Cache<QVector<Macro>>>()),
|
||||
m_predefinedMacrosCache(std::make_shared<Cache<QVector<Macro>, 64>>()),
|
||||
m_headerPathsCache(std::make_shared<Cache<QList<HeaderPath>>>())
|
||||
{ }
|
||||
|
||||
@@ -385,7 +392,7 @@ ToolChain::PredefinedMacrosRunner GccToolChain::createPredefinedMacrosRunner() c
|
||||
const QStringList platformCodeGenFlags = m_platformCodeGenFlags;
|
||||
OptionsReinterpreter reinterpretOptions = m_optionsReinterpreter;
|
||||
QTC_CHECK(reinterpretOptions);
|
||||
std::shared_ptr<Cache<QVector<Macro>>> macroCache = m_predefinedMacrosCache;
|
||||
std::shared_ptr<Cache<QVector<Macro>, 64>> macroCache = m_predefinedMacrosCache;
|
||||
Core::Id lang = language();
|
||||
|
||||
// This runner must be thread-safe!
|
||||
|
||||
@@ -104,6 +104,12 @@ public:
|
||||
return checkImpl(compilerArguments);
|
||||
}
|
||||
|
||||
void invalidate()
|
||||
{
|
||||
QMutexLocker locker(&m_mutex);
|
||||
m_cache.clear();
|
||||
}
|
||||
|
||||
private:
|
||||
Utils::optional<T> checkImpl(const QStringList &compilerArguments)
|
||||
{
|
||||
@@ -217,6 +223,7 @@ protected:
|
||||
bool m_doesEnable = false;
|
||||
bool m_triggered = false;
|
||||
};
|
||||
void toolChainUpdated() override;
|
||||
|
||||
private:
|
||||
explicit GccToolChain(Detection d);
|
||||
@@ -235,7 +242,7 @@ private:
|
||||
mutable QList<HeaderPath> m_headerPaths;
|
||||
mutable QString m_version;
|
||||
|
||||
mutable std::shared_ptr<Cache<QVector<Macro>>> m_predefinedMacrosCache;
|
||||
mutable std::shared_ptr<Cache<QVector<Macro>, 64>> m_predefinedMacrosCache;
|
||||
mutable std::shared_ptr<Cache<QList<HeaderPath>>> m_headerPathsCache;
|
||||
|
||||
friend class Internal::GccToolChainConfigWidget;
|
||||
|
||||
@@ -158,7 +158,7 @@ protected:
|
||||
explicit ToolChain(Core::Id typeId, Detection d);
|
||||
explicit ToolChain(const ToolChain &);
|
||||
|
||||
void toolChainUpdated();
|
||||
virtual void toolChainUpdated();
|
||||
|
||||
// Make sure to call this function when deriving!
|
||||
virtual bool fromMap(const QVariantMap &data);
|
||||
|
||||
@@ -44,20 +44,21 @@ namespace QmakeProjectManager {
|
||||
*/
|
||||
|
||||
QmakePriFileNode::QmakePriFileNode(QmakeProject *project, QmakeProFileNode *qmakeProFileNode,
|
||||
const FileName &filePath) :
|
||||
const FileName &filePath, QmakePriFile *pf) :
|
||||
ProjectNode(filePath),
|
||||
m_project(project),
|
||||
m_qmakeProFileNode(qmakeProFileNode)
|
||||
m_qmakeProFileNode(qmakeProFileNode),
|
||||
m_qmakePriFile(pf)
|
||||
{ }
|
||||
|
||||
QmakePriFile *QmakePriFileNode::priFile() const
|
||||
{
|
||||
return m_project->rootProFile()->findPriFile(filePath());
|
||||
return m_qmakePriFile;
|
||||
}
|
||||
|
||||
bool QmakePriFileNode::deploysFolder(const QString &folder) const
|
||||
{
|
||||
QmakePriFile *pri = priFile();
|
||||
const QmakePriFile *pri = priFile();
|
||||
return pri ? pri->deploysFolder(folder) : false;
|
||||
}
|
||||
|
||||
@@ -145,7 +146,7 @@ bool QmakePriFileNode::supportsAction(ProjectAction action, const Node *node) co
|
||||
|
||||
bool QmakePriFileNode::canAddSubProject(const QString &proFilePath) const
|
||||
{
|
||||
QmakePriFile *pri = priFile();
|
||||
const QmakePriFile *pri = priFile();
|
||||
return pri ? pri->canAddSubProject(proFilePath) : false;
|
||||
}
|
||||
|
||||
@@ -213,8 +214,8 @@ QmakeProFileNode *QmakeProFileNode::findProFileFor(const FileName &fileName) con
|
||||
\class QmakeProFileNode
|
||||
Implements abstract ProjectNode class
|
||||
*/
|
||||
QmakeProFileNode::QmakeProFileNode(QmakeProject *project, const FileName &filePath) :
|
||||
QmakePriFileNode(project, this, filePath)
|
||||
QmakeProFileNode::QmakeProFileNode(QmakeProject *project, const FileName &filePath, QmakeProFile *pf) :
|
||||
QmakePriFileNode(project, this, filePath, pf)
|
||||
{ }
|
||||
|
||||
bool QmakeProFileNode::showInSimpleTree() const
|
||||
@@ -224,7 +225,7 @@ bool QmakeProFileNode::showInSimpleTree() const
|
||||
|
||||
QmakeProFile *QmakeProFileNode::proFile() const
|
||||
{
|
||||
return m_project->rootProFile()->findProFile(filePath());
|
||||
return static_cast<QmakeProFile*>(QmakePriFileNode::priFile());
|
||||
}
|
||||
|
||||
FolderNode::AddNewInformation QmakeProFileNode::addNewInformation(const QStringList &files, Node *context) const
|
||||
|
||||
@@ -42,7 +42,7 @@ class QMAKEPROJECTMANAGER_EXPORT QmakePriFileNode : public ProjectExplorer::Proj
|
||||
{
|
||||
public:
|
||||
QmakePriFileNode(QmakeProject *project, QmakeProFileNode *qmakeProFileNode,
|
||||
const Utils::FileName &filePath);
|
||||
const Utils::FileName &filePath, QmakePriFile *pf);
|
||||
|
||||
QmakePriFile *priFile() const;
|
||||
|
||||
@@ -73,13 +73,14 @@ protected:
|
||||
|
||||
private:
|
||||
QmakeProFileNode *m_qmakeProFileNode = nullptr;
|
||||
QmakePriFile *m_qmakePriFile = nullptr;
|
||||
};
|
||||
|
||||
// Implements ProjectNode for qmake .pro files
|
||||
class QMAKEPROJECTMANAGER_EXPORT QmakeProFileNode : public QmakePriFileNode
|
||||
{
|
||||
public:
|
||||
QmakeProFileNode(QmakeProject *project, const Utils::FileName &filePath);
|
||||
QmakeProFileNode(QmakeProject *project, const Utils::FileName &filePath, QmakeProFile *pf);
|
||||
|
||||
QmakeProFile *proFile() const;
|
||||
|
||||
|
||||
@@ -183,12 +183,12 @@ static void createTree(const QmakePriFile *pri, QmakePriFileNode *node, const Fi
|
||||
}
|
||||
|
||||
// Virtual folders:
|
||||
for (const QmakePriFile *c : pri->children()) {
|
||||
for (QmakePriFile *c : pri->children()) {
|
||||
QmakePriFileNode *newNode = nullptr;
|
||||
if (dynamic_cast<const QmakeProFile *>(c))
|
||||
newNode = new QmakeProFileNode(c->project(), c->filePath());
|
||||
if (auto pf = dynamic_cast<QmakeProFile *>(c))
|
||||
newNode = new QmakeProFileNode(c->project(), c->filePath(), pf);
|
||||
else
|
||||
newNode = new QmakePriFileNode(c->project(), node->proFileNode(), c->filePath());
|
||||
newNode = new QmakePriFileNode(c->project(), node->proFileNode(), c->filePath(), c);
|
||||
createTree(c, newNode, toExclude);
|
||||
node->addNode(newNode);
|
||||
}
|
||||
@@ -203,7 +203,7 @@ QmakeProFileNode *QmakeNodeTreeBuilder::buildTree(QmakeProject *project)
|
||||
|
||||
const FileNameList toExclude = qt ? qt->directoriesToIgnoreInProjectTree() : FileNameList();
|
||||
|
||||
auto root = new QmakeProFileNode(project, project->projectFilePath());
|
||||
auto root = new QmakeProFileNode(project, project->projectFilePath(), project->rootProFile());
|
||||
createTree(project->rootProFile(), root, toExclude);
|
||||
|
||||
return root;
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
#include <qtsupport/profilereader.h>
|
||||
|
||||
#include <utils/algorithm.h>
|
||||
#include <utils/asconst.h>
|
||||
#include <utils/qtcprocess.h>
|
||||
#include <utils/mimetypes/mimedatabase.h>
|
||||
#include <utils/stringutils.h>
|
||||
@@ -199,12 +200,22 @@ QmakePriFile *QmakePriFile::findPriFile(const FileName &fileName)
|
||||
{
|
||||
if (fileName == filePath())
|
||||
return this;
|
||||
for (QmakePriFile *n : children()) {
|
||||
for (QmakePriFile *n : Utils::asConst(m_children)) {
|
||||
if (QmakePriFile *result = n->findPriFile(fileName))
|
||||
return result;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const QmakePriFile *QmakePriFile::findPriFile(const FileName &fileName) const
|
||||
{
|
||||
if (fileName == filePath())
|
||||
return this;
|
||||
for (const QmakePriFile *n : Utils::asConst(m_children)) {
|
||||
if (const QmakePriFile *result = n->findPriFile(fileName))
|
||||
return result;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void QmakePriFile::makeEmpty()
|
||||
@@ -1009,7 +1020,12 @@ static ProjectType proFileTemplateTypeToProjectType(ProFileEvaluator::TemplateTy
|
||||
|
||||
QmakeProFile *QmakeProFile::findProFile(const FileName &fileName)
|
||||
{
|
||||
return dynamic_cast<QmakeProFile *>(findPriFile(fileName));
|
||||
return static_cast<QmakeProFile *>(findPriFile(fileName));
|
||||
}
|
||||
|
||||
const QmakeProFile *QmakeProFile::findProFile(const FileName &fileName) const
|
||||
{
|
||||
return static_cast<const QmakeProFile *>(findPriFile(fileName));
|
||||
}
|
||||
|
||||
QString QmakeProFile::makefile() const
|
||||
@@ -1406,6 +1422,7 @@ QmakeEvalResult *QmakeProFile::evaluate(const QmakeEvalInput &input)
|
||||
result->newVarValues[Variable::IncludePath] = includePaths(exactReader, input.sysroot,
|
||||
input.buildDirectory, input.projectDir);
|
||||
result->newVarValues[Variable::CppFlags] = exactReader->values(QLatin1String("QMAKE_CXXFLAGS"));
|
||||
result->newVarValues[Variable::CFlags] = exactReader->values(QLatin1String("QMAKE_CFLAGS"));
|
||||
result->newVarValues[Variable::Source] =
|
||||
fileListForVar(exactSourceFiles, QLatin1String("SOURCES")) +
|
||||
fileListForVar(cumulativeSourceFiles, QLatin1String("SOURCES")) +
|
||||
@@ -1421,7 +1438,7 @@ QmakeEvalResult *QmakeProFile::evaluate(const QmakeEvalInput &input)
|
||||
result->newVarValues[Variable::CumulativeResource] = fileListForVar(cumulativeSourceFiles, QLatin1String("RESOURCES"));
|
||||
result->newVarValues[Variable::PkgConfig] = exactReader->values(QLatin1String("PKGCONFIG"));
|
||||
result->newVarValues[Variable::PrecompiledHeader] = ProFileEvaluator::sourcesToFiles(exactReader->fixifiedValues(
|
||||
QLatin1String("PRECOMPILED_HEADER"), input.projectDir, input.buildDirectory.toString()));
|
||||
QLatin1String("PRECOMPILED_HEADER"), input.projectDir, input.buildDirectory.toString(), false));
|
||||
result->newVarValues[Variable::LibDirectories] = libDirectories(exactReader);
|
||||
result->newVarValues[Variable::Config] = exactReader->values(QLatin1String("CONFIG"));
|
||||
result->newVarValues[Variable::QmlImportPath] = exactReader->absolutePathValues(
|
||||
@@ -1475,7 +1492,7 @@ void QmakeProFile::asyncEvaluate(QFutureInterface<QmakeEvalResult *> &fi, QmakeE
|
||||
void QmakeProFile::applyAsyncEvaluate()
|
||||
{
|
||||
applyEvaluate(m_parseFutureWatcher.result());
|
||||
m_project->decrementPendingEvaluateFutures(validParse());
|
||||
m_project->decrementPendingEvaluateFutures();
|
||||
}
|
||||
|
||||
bool sortByParserNodes(Node *a, Node *b)
|
||||
@@ -1659,7 +1676,8 @@ QStringList QmakeProFile::includePaths(QtSupport::ProFileReader *reader, const F
|
||||
}
|
||||
|
||||
foreach (const ProFileEvaluator::SourceFile &el,
|
||||
reader->fixifiedValues(QLatin1String("INCLUDEPATH"), projectDir, buildDir.toString())) {
|
||||
reader->fixifiedValues(QLatin1String("INCLUDEPATH"), projectDir, buildDir.toString(),
|
||||
false)) {
|
||||
paths << sysrootify(el.fileName, sysroot.toString(), projectDir, buildDir.toString());
|
||||
}
|
||||
// paths already contains moc dir and ui dir, due to corrrectly parsing uic.prf and moc.prf
|
||||
@@ -1816,7 +1834,7 @@ InstallsList QmakeProFile::installsList(const QtSupport::ProFileReader *reader,
|
||||
result.targetPath = itemPath;
|
||||
} else {
|
||||
const auto &itemFiles = reader->fixifiedValues(
|
||||
item + QLatin1String(".files"), projectDir, buildDir);
|
||||
item + QLatin1String(".files"), projectDir, buildDir, true);
|
||||
result.items << InstallsItem(itemPath, itemFiles, active);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,6 +64,7 @@ enum class Variable {
|
||||
Defines = 1,
|
||||
IncludePath,
|
||||
CppFlags,
|
||||
CFlags,
|
||||
Source,
|
||||
ExactResource,
|
||||
CumulativeResource,
|
||||
@@ -121,6 +122,7 @@ public:
|
||||
QVector<QmakePriFile *> children() const;
|
||||
|
||||
QmakePriFile *findPriFile(const Utils::FileName &fileName);
|
||||
const QmakePriFile *findPriFile(const Utils::FileName &fileName) const;
|
||||
|
||||
bool knowsFile(const Utils::FileName &filePath) const;
|
||||
|
||||
@@ -280,6 +282,7 @@ public:
|
||||
|
||||
QList<QmakeProFile *> allProFiles();
|
||||
QmakeProFile *findProFile(const Utils::FileName &fileName);
|
||||
const QmakeProFile *findProFile(const Utils::FileName &fileName) const;
|
||||
|
||||
ProjectType projectType() const;
|
||||
|
||||
|
||||
@@ -294,8 +294,8 @@ void QmakeProject::updateCppCodeModel()
|
||||
rpp.setBuildTargetType(isExecutable ? CppTools::ProjectPart::Executable
|
||||
: CppTools::ProjectPart::Library);
|
||||
|
||||
// TODO: Handle QMAKE_CFLAGS
|
||||
rpp.setFlagsForCxx({cxxToolChain, pro->variableValue(Variable::CppFlags)});
|
||||
rpp.setFlagsForC({cToolChain, pro->variableValue(Variable::CFlags)});
|
||||
rpp.setMacros(ProjectExplorer::Macro::toMacros(pro->cxxDefines()));
|
||||
rpp.setPreCompiledHeaders(pro->variableValue(Variable::PrecompiledHeader));
|
||||
rpp.setSelectedForBuilding(pro->includedInExactParse());
|
||||
@@ -500,24 +500,20 @@ void QmakeProject::startAsyncTimer(QmakeProFile::AsyncUpdateDelay delay)
|
||||
void QmakeProject::incrementPendingEvaluateFutures()
|
||||
{
|
||||
++m_pendingEvaluateFuturesCount;
|
||||
if (m_pendingEvaluateFuturesCount == 1)
|
||||
m_totalEvaluationSuccess = true;
|
||||
m_asyncUpdateFutureInterface->setProgressRange(m_asyncUpdateFutureInterface->progressMinimum(),
|
||||
m_asyncUpdateFutureInterface->progressMaximum() + 1);
|
||||
}
|
||||
|
||||
void QmakeProject::decrementPendingEvaluateFutures(bool success)
|
||||
void QmakeProject::decrementPendingEvaluateFutures()
|
||||
{
|
||||
--m_pendingEvaluateFuturesCount;
|
||||
|
||||
m_totalEvaluationSuccess = m_totalEvaluationSuccess && success;
|
||||
|
||||
m_asyncUpdateFutureInterface->setProgressValue(m_asyncUpdateFutureInterface->progressValue() + 1);
|
||||
if (m_pendingEvaluateFuturesCount == 0) {
|
||||
// We are done!
|
||||
setRootProjectNode(QmakeNodeTreeBuilder::buildTree(this));
|
||||
|
||||
if (!m_totalEvaluationSuccess)
|
||||
if (!m_rootProFile->validParse())
|
||||
m_asyncUpdateFutureInterface->reportCanceled();
|
||||
|
||||
m_asyncUpdateFutureInterface->reportFinished();
|
||||
|
||||
@@ -100,7 +100,7 @@ public:
|
||||
/// \internal
|
||||
void incrementPendingEvaluateFutures();
|
||||
/// \internal
|
||||
void decrementPendingEvaluateFutures(bool success);
|
||||
void decrementPendingEvaluateFutures();
|
||||
/// \internal
|
||||
bool wasEvaluateCanceled();
|
||||
|
||||
@@ -186,7 +186,6 @@ private:
|
||||
// cached data during project rescan
|
||||
QMakeGlobals *m_qmakeGlobals = nullptr;
|
||||
int m_qmakeGlobalsRefCnt = 0;
|
||||
bool m_totalEvaluationSuccess = false;
|
||||
|
||||
QString m_qmakeSysroot;
|
||||
|
||||
|
||||
@@ -455,6 +455,9 @@ static Core::MiniSplitter *createCentralSplitter(const QList<WidgetInfo> &widget
|
||||
outputPlaceholderSplitter->setStretchFactor(1, 0);
|
||||
outputPlaceholderSplitter->setOrientation(Qt::Vertical);
|
||||
|
||||
QString sheet = QString::fromUtf8(Utils::FileReader::fetchQrc(":/qmldesigner/stylesheet.css"));
|
||||
outputPlaceholderSplitter->setStyleSheet(Theme::replaceCssColors(sheet));
|
||||
|
||||
SwitchSplitTabWidget *switchSplitTabWidget = new SwitchSplitTabWidget();
|
||||
|
||||
foreach (const WidgetInfo &widgetInfo, widgetInfos) {
|
||||
|
||||
@@ -257,18 +257,19 @@ public:
|
||||
QPalette pal;
|
||||
pal.setColor(QPalette::Base, themeColor(Theme::Welcome_BackgroundColor));
|
||||
|
||||
m_lineEdit = new QLineEdit;
|
||||
m_lineEdit = new FancyLineEdit;
|
||||
m_lineEdit->setFiltering(true);
|
||||
m_lineEdit->setFrame(false);
|
||||
m_lineEdit->setFont(sizedFont(14, this));
|
||||
m_lineEdit->setAttribute(Qt::WA_MacShowFocusRect, false);
|
||||
m_lineEdit->setPalette(pal);
|
||||
|
||||
auto box = new QHBoxLayout(this);
|
||||
box->setContentsMargins(15, 3, 15, 3);
|
||||
box->setContentsMargins(10, 3, 3, 3);
|
||||
box->addWidget(m_lineEdit);
|
||||
}
|
||||
|
||||
QLineEdit *m_lineEdit;
|
||||
FancyLineEdit *m_lineEdit;
|
||||
};
|
||||
|
||||
class GridView : public QTableView
|
||||
|
||||
@@ -9,7 +9,6 @@ STATIC_INSTALL_BASE = $$INSTALL_DATA_PATH
|
||||
STATIC_FILES = \
|
||||
$$PWD/externaltools/lrelease.xml \
|
||||
$$PWD/externaltools/lupdate.xml \
|
||||
$$PWD/externaltools/sort.xml \
|
||||
$$PWD/externaltools/qmlviewer.xml \
|
||||
$$PWD/externaltools/qmlscene.xml
|
||||
unix {
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2016 The Qt Company Ltd.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of Qt Creator.
|
||||
**
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
-->
|
||||
<externaltool id="sort">
|
||||
<description>Sorts the selected text</description>
|
||||
<displayname>Sort Selection</displayname>
|
||||
<category>Text</category>
|
||||
<executable output="replaceselection" error="ignore">
|
||||
<path>sort</path>
|
||||
<input>%{CurrentDocument:Selection}</input>
|
||||
<workingdirectory>%{CurrentDocument:Path}</workingdirectory>
|
||||
</executable>
|
||||
</externaltool>
|
||||
@@ -77,7 +77,8 @@ QStringList ProFileEvaluator::values(const QString &variableName) const
|
||||
}
|
||||
|
||||
QVector<ProFileEvaluator::SourceFile> ProFileEvaluator::fixifiedValues(
|
||||
const QString &variable, const QString &baseDirectory, const QString &buildDirectory) const
|
||||
const QString &variable, const QString &baseDirectory, const QString &buildDirectory,
|
||||
bool expandWildcards) const
|
||||
{
|
||||
QVector<SourceFile> result;
|
||||
foreach (const ProString &str, d->values(ProKey(variable))) {
|
||||
@@ -86,11 +87,29 @@ QVector<ProFileEvaluator::SourceFile> ProFileEvaluator::fixifiedValues(
|
||||
result << SourceFile{QDir::cleanPath(el), str.sourceFile()};
|
||||
} else {
|
||||
QString fn = QDir::cleanPath(baseDirectory + QLatin1Char('/') + el);
|
||||
if (IoUtils::exists(fn))
|
||||
if (IoUtils::exists(fn)) {
|
||||
result << SourceFile{fn, str.sourceFile()};
|
||||
else
|
||||
result << SourceFile{QDir::cleanPath(buildDirectory + QLatin1Char('/') + el),
|
||||
str.sourceFile()};
|
||||
} else {
|
||||
QStringRef fileNamePattern;
|
||||
if (expandWildcards) {
|
||||
fileNamePattern = IoUtils::fileName(fn);
|
||||
expandWildcards = fileNamePattern.contains('*')
|
||||
|| fileNamePattern.contains('?');
|
||||
}
|
||||
if (expandWildcards) {
|
||||
const QString patternBaseDir = IoUtils::pathName(fn).toString();
|
||||
const QDir::Filters filters = QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot;
|
||||
for (const QString &fileName : QDir(patternBaseDir).entryList(
|
||||
QStringList(fileNamePattern.toString()), filters)) {
|
||||
const QString fullFilePath
|
||||
= QDir::cleanPath(patternBaseDir + '/' + fileName);
|
||||
result << SourceFile({fullFilePath, str.sourceFile()});
|
||||
}
|
||||
} else {
|
||||
result << SourceFile{QDir::cleanPath(buildDirectory + QLatin1Char('/') + el),
|
||||
str.sourceFile()};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
|
||||
@@ -81,7 +81,8 @@ public:
|
||||
QString value(const QString &variableName) const;
|
||||
QStringList values(const QString &variableName) const;
|
||||
QVector<SourceFile> fixifiedValues(
|
||||
const QString &variable, const QString &baseDirectory, const QString &buildDirectory) const;
|
||||
const QString &variable, const QString &baseDirectory, const QString &buildDirectory,
|
||||
bool expandWildcards) const;
|
||||
QStringList absolutePathValues(const QString &variable, const QString &baseDirectory) const;
|
||||
QVector<SourceFile> absoluteFileValues(
|
||||
const QString &variable, const QString &baseDirectory, const QStringList &searchDirs,
|
||||
|
||||
@@ -12,8 +12,9 @@ int myVariable;
|
||||
|
||||
int myFunction(bool yesno, int number) {}
|
||||
|
||||
struct Pos {};
|
||||
void pointOfService() {}
|
||||
int getPosition() { return 0; }
|
||||
int matchArgument(Pos p) { return 0; }
|
||||
int positiveNumber() { return 2; }
|
||||
|
||||
enum MyEnum { V1, V2 };
|
||||
|
||||