Merge remote-tracking branch 'origin/11.0'

Change-Id: Ibb433d3e1ea2c0632dd2f710c8ec995de7599978
This commit is contained in:
Eike Ziller
2023-06-19 10:08:56 +02:00
65 changed files with 412 additions and 734 deletions

View File

@@ -30,7 +30,18 @@ function(_extract_ts_data_from_targets outprefix)
set(_target_sources "") set(_target_sources "")
if(_source_files) if(_source_files)
list(FILTER _source_files EXCLUDE REGEX ".*[.]json[.]in|.*[.]svg|.*[.]pro|.*[.]css") # exclude various funny source files, and anything generated
# like *metatypes.json.gen, moc_*.cpp, qrc_*.cpp, */qmlcache/*.cpp,
# *qmltyperegistrations.cpp
set(_exclude_patterns
.*[.]json[.]in
.*[.]svg
.*[.]pro
.*[.]css
"${PROJECT_BINARY_DIR}/.*"
)
list(JOIN _exclude_patterns "|" _exclude_pattern)
list(FILTER _source_files EXCLUDE REGEX "${_exclude_pattern}")
list(APPEND _target_sources ${_source_files}) list(APPEND _target_sources ${_source_files})
endif() endif()
if(_extra_translations) if(_extra_translations)

View File

@@ -108,7 +108,8 @@ Editing
([QTCREATORBUG-312](https://bugreports.qt.io/browse/QTCREATORBUG-312)) ([QTCREATORBUG-312](https://bugreports.qt.io/browse/QTCREATORBUG-312))
* Added highlighting for typed string literals and user-defined literals * Added highlighting for typed string literals and user-defined literals
([QTCREATORBUG-28869](https://bugreports.qt.io/browse/QTCREATORBUG-28869)) ([QTCREATORBUG-28869](https://bugreports.qt.io/browse/QTCREATORBUG-28869))
* Added the option to create class members from assignments * Extended the `Add Class Member` refactoring action to create class
members from assignments
([QTCREATORBUG-1918](https://bugreports.qt.io/browse/QTCREATORBUG-1918)) ([QTCREATORBUG-1918](https://bugreports.qt.io/browse/QTCREATORBUG-1918))
* Fixed that locator showed both the declaration and the definition of symbols * Fixed that locator showed both the declaration and the definition of symbols
([QTCREATORBUG-13894](https://bugreports.qt.io/browse/QTCREATORBUG-13894)) ([QTCREATORBUG-13894](https://bugreports.qt.io/browse/QTCREATORBUG-13894))
@@ -119,7 +120,8 @@ Editing
### Language Server Protocol ### Language Server Protocol
* Added missing actions for opening the `Call Hierarchy` * Added actions for opening the `Call Hierarchy` to the context menu of the
editor
([QTCREATORBUG-28839](https://bugreports.qt.io/browse/QTCREATORBUG-28839), ([QTCREATORBUG-28839](https://bugreports.qt.io/browse/QTCREATORBUG-28839),
[QTCREATORBUG-28842](https://bugreports.qt.io/browse/QTCREATORBUG-28842)) [QTCREATORBUG-28842](https://bugreports.qt.io/browse/QTCREATORBUG-28842))
@@ -140,13 +142,19 @@ Editing
interpreter selector and the wizard interpreter selector and the wizard
([PYSIDE-2152](https://bugreports.qt.io/browse/PYSIDE-2152)) ([PYSIDE-2152](https://bugreports.qt.io/browse/PYSIDE-2152))
([Documentation](https://doc-snapshots.qt.io/qtcreator-11.0/creator-python-development.html))
Projects Projects
-------- --------
* Made it possible to add devices without going through the wizard * Made it possible to add devices in `Preferences > Devices > Add` without going
* Added support for moving files to a different directory when renaming through the wizard
* Added support for moving files to a different directory when renaming them in
the `File System` view
([QTCREATORBUG-15981](https://bugreports.qt.io/browse/QTCREATORBUG-15981)) ([QTCREATORBUG-15981](https://bugreports.qt.io/browse/QTCREATORBUG-15981))
([Documentation](https://doc.qt.io/qtcreator/creator-file-system-view.html))
### CMake ### CMake
* Implemented adding files to the project * Implemented adding files to the project
@@ -158,17 +166,23 @@ Projects
[QTCREATORBUG-28904](https://bugreports.qt.io/browse/QTCREATORBUG-28904), [QTCREATORBUG-28904](https://bugreports.qt.io/browse/QTCREATORBUG-28904),
[QTCREATORBUG-28985](https://bugreports.qt.io/browse/QTCREATORBUG-28985), [QTCREATORBUG-28985](https://bugreports.qt.io/browse/QTCREATORBUG-28985),
[QTCREATORBUG-29006](https://bugreports.qt.io/browse/QTCREATORBUG-29006)) [QTCREATORBUG-29006](https://bugreports.qt.io/browse/QTCREATORBUG-29006))
* Added `Build > Reload CMake Presets` to reload CMake presets after making
changes to them
* Fixed that CMake Presets were not visible in `Projects` view
([QTCREATORBUG-28966](https://bugreports.qt.io/browse/QTCREATORBUG-28966))
* Fixed issues with detecting a configured Qt version when importing a build * Fixed issues with detecting a configured Qt version when importing a build
([QTCREATORBUG-29075](https://bugreports.qt.io/browse/QTCREATORBUG-29075)) ([QTCREATORBUG-29075](https://bugreports.qt.io/browse/QTCREATORBUG-29075))
### Python ### Python
* Added an option for the interpreter to the wizards * Added an option for selecting the interpreter to the wizards in
`File > New Project > Application (Qt for Python)`
Debugging Debugging
--------- ---------
* Improved the UI for enabling and disabling debuggers * Improved the UI for enabling and disabling debuggers in `Projects > Run >
Debugger settings`
([QTCREATORBUG-28627](https://bugreports.qt.io/browse/QTCREATORBUG-28627)) ([QTCREATORBUG-28627](https://bugreports.qt.io/browse/QTCREATORBUG-28627))
### C++ ### C++

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -1,4 +1,4 @@
// Copyright (C) 2022 The Qt Company Ltd. // Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
// ********************************************************************** // **********************************************************************
@@ -44,6 +44,11 @@
example, and use the results to make the tests more efficient and example, and use the results to make the tests more efficient and
complete. complete.
\li \l{Static Code Analysis}{Axivion}
Do static code analysis and architecture analysis to detect and
eliminate unnecessary complexity of code.
\li \l{Using Valgrind Code Analysis Tools}{Valgrind Code Analysis Tools} \li \l{Using Valgrind Code Analysis Tools}{Valgrind Code Analysis Tools}
Detect problems in memory management by using the Memcheck Detect problems in memory management by using the Memcheck

View File

@@ -0,0 +1,109 @@
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\previouspage creator-coco.html
\page creator-axivion.html
\nextpage creator-valgrind-overview.html
\title Static Code Analysis
\l{https://www.axivion.com/en/products/axivion-suite/}{Axivion Suite} is
a tool suite for protecting software from erosion. Static code analysis,
architecture analysis, and code-smells-detection enable you to:
\list
\li Check the source code for potential runtime errors.
\li Use metrics to generate quantitative information about the
internal quality of the source code.
\li Run style checks to achieve compliance with coding guidelines.
\li Detect both duplicates and similar pieces of code in the source code.
\li Recognize cyclical dependencies at different levels.
\li Detect unreachable code.
\endlist
The experimental Axivion plugin integrates the Axivion dashboard server into
\QC.
To use the plugin, you must set up a project in the Axivion dashboard
server and link to it from \QC. You can then see style violations in the
\uicontrol Edit mode and descriptions and issue counts in the
\uicontrol Axivion view.
The editor shows style violations as inline annotations. Hover the mouse over
an annotation to bring up a tool tip with a short description of the issue.
\image qtcreator-axivion-annotation.webp {Annotation popup}
Select the \inlineimage icons/info.png
button to view detailed information about the issue in the \uicontrol Axivion
view.
\image qtcreator-axivion-view-rule.webp {Axivion view}
To view the issue counts, select \inlineimage icons/home.png
(\uicontrol {Show Dashboard}).
\section1 Enabling the Axivion Plugin
To enable the Axivion plugin:
\list 1
\li Select \uicontrol Help > \uicontrol {About Plugins} >
\uicontrol {Code Analyzer} > \uicontrol Axivion to enable the plugin.
\li Select \uicontrol {Restart Now} to restart \QC and load the plugin.
\endlist
\section1 Connecting to Axivion Dashboard Servers
To connect to Axivion:
\list 1
\li Select \uicontrol Edit > \uicontrol Preferences > \uicontrol Axivion.
\image qtcreator-preferences-axivion.webp {General tab in Axivion Preferences}
\li Select \uicontrol Edit to create a connection to the Axivion
dashboard server.
\image qtcreator-edit-dashboard-configuration.webp {Edit Dashboard Configuration dialog}
\li In \uicontrol {Dashboard URL}, enter the URL of the server.
\li In \uicontrol Description, enter a free-text description of the
server.
\li In \uicontrol {Access token}, enter the IDE application token that
you created in the server, in user preferences.
\endlist
\section1 Linking to Dashboards
To link a project to a dashboard:
\list 1
\li \uicontrol Projects > \uicontrol {Project Settings} >
\uicontrol Axivion.
\image qtcreator-preferences-axivion-project.webp {Axivion settings in Project Settings}
\li Select \uicontrol {Fetch Projects} to list projects from Axivion.
\li Select a project, and then select \uicontrol {Link Project} to link
to it.
\endlist
To unlink a project, select \uicontrol {Unlink Project}.
\section1 Viewing Issue Counts
\image qtcreator-axivion-view.webp {Axivion view}
The \uicontrol Axivion view lists the numbers of the following types of
issues that Axivion found in the linked project:
\list
\li \uicontrol AV - architecture violations, such as hidden dependencies
\li \uicontrol CL - duplicates and similar pieces of code
\li \uicontrol CY - call, component, and include cycles
\li \uicontrol DE - dead code
\li \uicontrol MV - violations of metrics based on lines and tokens,
nesting, cyclomatic complexity, control flow, and so on.
\li \uicontrol SV - style violations, such as deviations from the naming
or coding conventions
\endlist
To clear the view, select \inlineimage icons/clean_pane_small.png
(\uicontrol Clear).
*/

View File

@@ -4,7 +4,7 @@
/*! /*!
\previouspage creator-qml-performance-monitor.html \previouspage creator-qml-performance-monitor.html
\page creator-coco.html \page creator-coco.html
\nextpage creator-valgrind-overview.html \nextpage creator-axivion.html
\title Checking Code Coverage \title Checking Code Coverage

View File

@@ -8,7 +8,7 @@
// ********************************************************************** // **********************************************************************
/*! /*!
\previouspage creator-coco.html \previouspage creator-axivion.html
\page creator-valgrind-overview.html \page creator-valgrind-overview.html
\nextpage creator-analyzer.html \nextpage creator-analyzer.html

View File

@@ -190,6 +190,10 @@
If you use custom API, \QC uses \c {target_sources()} to add the files. If you use custom API, \QC uses \c {target_sources()} to add the files.
For Qt Quick projects, the files are added to the \c {qt_add_qml_module()}
function, prefixed with the \c QML_FILES, \c SOURCES, or \c RESOURCES
function argument.
When you rename or remove files in the \l {Projects} or \l {File System} When you rename or remove files in the \l {Projects} or \l {File System}
view, \QC renames them in the CMakeLists.txt file or removes them from it. view, \QC renames them in the CMakeLists.txt file or removes them from it.

View File

@@ -8,7 +8,7 @@
// ********************************************************************** // **********************************************************************
/*! /*!
\previouspage creator-project-vcpkg.html \previouspage creator-vcpkg.html
\page creator-cli.html \page creator-cli.html
\nextpage creator-keyboard-shortcuts.html \nextpage creator-keyboard-shortcuts.html

View File

@@ -205,6 +205,7 @@
\list \list
\li \l{Profiling QML Applications} \li \l{Profiling QML Applications}
\li \l{Checking Code Coverage} \li \l{Checking Code Coverage}
\li \l{Static Code Analysis}
\li \l{Using Valgrind Code Analysis Tools} \li \l{Using Valgrind Code Analysis Tools}
\list \list
\li \l{Detecting Memory Leaks with Memcheck} \li \l{Detecting Memory Leaks with Memcheck}

View File

@@ -392,6 +392,10 @@
\li \uicontrol{General Messages} \li \uicontrol{General Messages}
\if defined(qtcreator)
\li \l {Static Code Analysis}{Axivion}
\endif
\li \uicontrol{Version Control} \li \uicontrol{Version Control}
\if defined(qtcreator) \if defined(qtcreator)
@@ -476,6 +480,9 @@
\list \list
\if defined(qtdesignstudio) \if defined(qtdesignstudio)
\li \uicontrol {Asset Export} - Errors and warnings encountered
while exporting assets.
\li \uicontrol {Asset Importer Error} - Errors and warnings encountered \li \uicontrol {Asset Importer Error} - Errors and warnings encountered
while importing assets from a design tool. while importing assets from a design tool.
\else \else
@@ -490,6 +497,8 @@
\li \uicontrol {Clang Code Model} - \li \uicontrol {Clang Code Model} -
\l {Parsing C++ Files with the Clang Code Model} \l {Parsing C++ Files with the Clang Code Model}
{Errors and warnings from the current editor}. {Errors and warnings from the current editor}.
\li \uicontrol {Clang Tools} - Errors and warnings from
\l {Using Clang Tools}{Clang-Tidy and Clazy}
\endif \endif
\li \uicontrol Compile - Selected output from the compiler. Open \li \uicontrol Compile - Selected output from the compiler. Open
@@ -521,14 +530,19 @@
\l{JavaScript and QML Error Codes} \l{JavaScript and QML Error Codes}
{QML and JavaScript syntax errors}. {QML and JavaScript syntax errors}.
\if defined(qtcreator)
\li \uicontrol Sanitizer - Tasks created when you run an application if
you used an \e {address sanitizer} to detect memory handling issues.
\endif
\endlist \endlist
The view filters out irrelevant output from the build tools and presents the The view filters out irrelevant output from the build tools and presents the
issues in an organized way. To further filter the output by type, select issues in an organized way. To further filter the output by type, select
\inlineimage icons/filtericon.png \inlineimage icons/filtericon.png
(\uicontrol {Filter Tree}) and then select a filter. (\uicontrol {Filter Tree}) and then select a filter. To find output in the
view, enter search criteria in the \uicontrol Filter field.
\image qtcreator-issues.png "Issues" \image qtcreator-issues.webp {Issues}
Select one or several lines to apply context-menu actions to their contents. Select one or several lines to apply context-menu actions to their contents.
You can remove the selected lines or copy their contents to the clipboard. You can remove the selected lines or copy their contents to the clipboard.
@@ -536,15 +550,20 @@
contents of the line as search criteria or open a version control contents of the line as search criteria or open a version control
annotation view of the line that causes the error message. annotation view of the line that causes the error message.
To view detailed information about the selected line (where available), press
\key Space.
To navigate to the corresponding source code, click an issue or To navigate to the corresponding source code, click an issue or
select \uicontrol {Show in Editor} in the context menu. The entry must contain the select \uicontrol {Show in Editor} in the context menu. The entry must contain the
name of the file where the issue was found. name of the file where the issue was found.
To view more information about an issue in \l {Compile Output}, To view more information about an issue in \l {Compile Output},
select \uicontrol {Show Output} in the context menu. select \uicontrol {Show Compile Output} in the context menu.
To jump from one issue to the next or previous one, press \key F6 and To jump from one issue to the next or previous
\key Shift+F6. one, select \inlineimage icons/arrowup.png
and \inlineimage icons/arrowdown.png
or press \key F6 and \key Shift+F6.
By default, a new build clears the \uicontrol Issues view. To keep By default, a new build clears the \uicontrol Issues view. To keep
the issues from the previous build rounds, deselect \uicontrol Edit > the issues from the previous build rounds, deselect \uicontrol Edit >

View File

@@ -1,4 +1,4 @@
// Copyright (C) 2020 The Qt Company Ltd. // Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*! /*!
@@ -109,12 +109,29 @@
\endomit \endomit
\endtable \endtable
\section1 Solutions
\QC uses object libraries that are independent of any \QC-specific code, and
are threfore ready to be a part of Qt.
\table
\header
\li Solution Name
\li Description
\row
\li \l{Tasking Solution}{Tasking}
\li Enables you to build extensible, declarative task tree structures
that contain possibly asynchronous tasks.
\endtable
\section1 Reference \section1 Reference
\list \list
\li \l {Qt Creator C++ Classes} \li \l {Qt Creator C++ Classes}
\li \l {Qt Creator Namespaces} \li \l {Qt Creator Namespaces}
\li \l {Qt Creator Functions} \li \l {Qt Creator Functions}
\li \l {Solutions}
\endlist \endlist
*/ */

View File

@@ -0,0 +1,12 @@
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
/*!
\page solutions-index.html
\title Solutions
\brief A collection of reusable object libraries.
This topic lists the available solutions:
\annotatedlist solutions-modules
*/

View File

@@ -495,6 +495,10 @@ int main(int argc, char **argv)
Options options = parseCommandLine(argc, argv); Options options = parseCommandLine(argc, argv);
applicationDirPath(argv[0]); applicationDirPath(argv[0]);
const bool hasStyleOption = Utils::findOrDefault(options.appArguments, [](char *arg) {
return strcmp(arg, "-style") == 0;
});
if (qEnvironmentVariableIsSet("QTC_DO_NOT_PROPAGATE_LD_PRELOAD")) { if (qEnvironmentVariableIsSet("QTC_DO_NOT_PROPAGATE_LD_PRELOAD")) {
Utils::Environment::modifySystemEnvironment( Utils::Environment::modifySystemEnvironment(
{{"LD_PRELOAD", "", Utils::EnvironmentItem::Unset}}); {{"LD_PRELOAD", "", Utils::EnvironmentItem::Unset}});
@@ -607,10 +611,8 @@ int main(int argc, char **argv)
setPixmapCacheLimit(); setPixmapCacheLimit();
loadFonts(); loadFonts();
if (Utils::HostOsInfo::isWindowsHost() if (Utils::HostOsInfo::isWindowsHost() && !qFuzzyCompare(qApp->devicePixelRatio(), 1.0)
&& !qFuzzyCompare(qApp->devicePixelRatio(), 1.0) && !hasStyleOption) {
&& QApplication::style()->objectName().startsWith(
QLatin1String("windows"), Qt::CaseInsensitive)) {
QApplication::setStyle(QLatin1String("fusion")); QApplication::setStyle(QLatin1String("fusion"));
} }
const int threadCount = QThreadPool::globalInstance()->maxThreadCount(); const int threadCount = QThreadPool::globalInstance()->maxThreadCount();

View File

@@ -46,3 +46,23 @@ integrated into Qt when they:
- Have full docs. - Have full docs.
- Have auto tests. - Have auto tests.
- Have at least one example (however, autotests often play this role, too). - Have at least one example (however, autotests often play this role, too).
## Documentation
The common Solutions doc (doc/qtcreatordev/src/solutions-index.qdoc)
lists all the solutions added to the solutions-modules group.
In order to gather all the available solutions in this common page,
define the module and refer to it like:
/*!
\module TaskingSolution
\title The Tasking Solution
\ingroup solutions-modules
\brief (... add a brief description here...)
*/
The \ingroup will put the item above to the common Solutions page.
Don't add more \ingroup references from class docs, add \inmodule instead.

View File

@@ -42,11 +42,25 @@ private:
Guard &m_guard; Guard &m_guard;
}; };
/*!
\module TaskingSolution
\title Tasking Solution
\ingroup solutions-modules
\brief Contains a general purpose Tasking solution.
The Tasking solution depends on Qt only, and doesn't depend on any \QC specific code.
*/
/*!
\namespace Tasking
\inmodule TaskingSolution
\brief The Tasking namespace encloses all classes and global functions of the Tasking solution.
*/
/*! /*!
\class Tasking::GroupItem \class Tasking::GroupItem
\inheaderfile solutions/tasking/tasktree.h \inheaderfile solutions/tasking/tasktree.h
\inmodule QtCreator \inmodule TaskingSolution
\ingroup mainclasses
\brief The GroupItem class represents the basic element for composing nested tree structures. \brief The GroupItem class represents the basic element for composing nested tree structures.
*/ */
@@ -1104,22 +1118,11 @@ void TaskNode::invokeEndHandler(bool success)
m_container.m_constData.m_taskTreePrivate->advanceProgress(1); m_container.m_constData.m_taskTreePrivate->advanceProgress(1);
} }
/*!
\namespace Tasking
\inmodule QtCreator
\brief The Tasking namespace contains a general purpose TaskTree solution.
The Tasking namespace depends on Qt only, and doesn't depend on any \QC
specific code.
*/
/*! /*!
\class Tasking::TaskTree \class Tasking::TaskTree
\inheaderfile solutions/tasking/tasktree.h \inheaderfile solutions/tasking/tasktree.h
\inmodule QtCreator \inmodule TaskingSolution
\ingroup mainclasses \brief The TaskTree class runs an async task tree structure defined in a declarative way.
\brief The TaskTree class runs an async task tree structure defined in a
declarative way.
Use the Tasking namespace to build extensible, declarative task tree Use the Tasking namespace to build extensible, declarative task tree
structures that contain possibly asynchronous tasks, such as Process, structures that contain possibly asynchronous tasks, such as Process,

View File

@@ -392,16 +392,8 @@ void TerminalInterface::start()
m_setup.m_commandLine.executable().fileName()); m_setup.m_commandLine.executable().fileName());
if (m_setup.m_runAsRoot && !HostOsInfo::isWindowsHost()) { if (m_setup.m_runAsRoot && !HostOsInfo::isWindowsHost()) {
CommandLine rootCommand(FilePath("sudo").searchInPath(), {"-A"}); CommandLine rootCommand("sudo", {});
rootCommand.addCommandLineAsArgs(cmd); rootCommand.addCommandLineAsArgs(cmd);
const FilePath askPassPath = FilePath::fromUserInput(QCoreApplication::applicationDirPath())
.pathAppended(QLatin1String(RELATIVE_LIBEXEC_PATH))
.pathAppended(QLatin1String("qtc-askpass"));
if (askPassPath.exists())
stubSetupData.m_environment.setFallback("SUDO_ASKPASS", askPassPath.toUserOutput());
stubSetupData.m_commandLine = rootCommand; stubSetupData.m_commandLine = rootCommand;
} else { } else {
stubSetupData.m_commandLine = cmd; stubSetupData.m_commandLine = cmd;

View File

@@ -2058,7 +2058,10 @@ void CMakeBuildConfiguration::addToEnvironment(Utils::Environment &env) const
Environment CMakeBuildConfiguration::configureEnvironment() const Environment CMakeBuildConfiguration::configureEnvironment() const
{ {
return aspect<ConfigureEnvironmentAspect>()->environment(); Environment env = aspect<ConfigureEnvironmentAspect>()->environment();
addToEnvironment(env);
return env;
} }
QString CMakeBuildSystem::cmakeBuildType() const QString CMakeBuildSystem::cmakeBuildType() const

View File

@@ -194,7 +194,7 @@ CMakeBuildStep::CMakeBuildStep(BuildStepList *bsl, Id id) :
m_useStaging = addAspect<BoolAspect>(); m_useStaging = addAspect<BoolAspect>();
m_useStaging->setSettingsKey(USE_STAGING_KEY); m_useStaging->setSettingsKey(USE_STAGING_KEY);
m_useStaging->setLabelPlacement(BoolAspect::LabelPlacement::AtCheckBox); m_useStaging->setLabel(Tr::tr("Stage for installation"), BoolAspect::LabelPlacement::AtCheckBox);
m_useStaging->setDefaultValue(!buildAndRunOnSameDevice(kit())); m_useStaging->setDefaultValue(!buildAndRunOnSameDevice(kit()));
m_stagingDir = addAspect<FilePathAspect>(); m_stagingDir = addAspect<FilePathAspect>();
@@ -503,8 +503,10 @@ QWidget *CMakeBuildStep::createConfigWidget()
m_stagingDir->setEnabled(m_useStaging->value()); m_stagingDir->setEnabled(m_useStaging->value());
if (m_useStaging->value()) { if (m_useStaging->value()) {
summaryText.append(" " + Tr::tr("and stage at %2 for %3") //: Stage (for installation) at <staging_dir> for <installation_dir>
.arg(currentStagingDir(), currentInstallPrefix())); summaryText.append(
"; "
+ Tr::tr("Stage at %2 for %3").arg(currentStagingDir(), currentInstallPrefix()));
} }
if (!m_buildPreset.isEmpty()) { if (!m_buildPreset.isEmpty()) {
@@ -567,7 +569,8 @@ QWidget *CMakeBuildStep::createConfigWidget()
Layouting::Form builder; Layouting::Form builder;
builder.addRow({m_cmakeArguments}); builder.addRow({m_cmakeArguments});
builder.addRow({m_toolArguments}); builder.addRow({m_toolArguments});
builder.addRow({Tr::tr("Stage for installation:"), Layouting::Row{m_useStaging, m_stagingDir}}); builder.addRow({m_useStaging});
builder.addRow({m_stagingDir});
if (m_useiOSAutomaticProvisioningUpdates) if (m_useiOSAutomaticProvisioningUpdates)
builder.addRow({m_useiOSAutomaticProvisioningUpdates}); builder.addRow({m_useiOSAutomaticProvisioningUpdates});

View File

@@ -233,18 +233,18 @@ void CMakeManager::reloadCMakePresets()
{ {
auto settings = CMakeSpecificSettings::instance(); auto settings = CMakeSpecificSettings::instance();
QMessageBox::StandardButton clickedButton QMessageBox::StandardButton clickedButton = CheckableMessageBox::question(
= CheckableMessageBox::question(Core::ICore::dialogParent(), Core::ICore::dialogParent(),
Tr::tr("Reload CMake Presets"), Tr::tr("Reload CMake Presets"),
Tr::tr("Re-generates the CMake presets kits. The manual " Tr::tr("Re-generates the kits that were created for CMake presets. All manual "
"CMake project modifications will be lost."), "modifications to the CMake project settings will be lost."),
settings->askBeforePresetsReload.checkableDecider(), settings->askBeforePresetsReload.checkableDecider(),
QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Yes | QMessageBox::Cancel,
QMessageBox::Yes, QMessageBox::Yes,
QMessageBox::Yes, QMessageBox::Yes,
{ {
{QMessageBox::Yes, Tr::tr("Reload")}, {QMessageBox::Yes, Tr::tr("Reload")},
}); });
if (clickedButton == QMessageBox::Cancel) if (clickedButton == QMessageBox::Cancel)
return; return;

View File

@@ -621,8 +621,9 @@ void CppHighlighterTest::test()
const QChar c = m_doc.characterAt(pos); const QChar c = m_doc.characterAt(pos);
if (c == QChar::ParagraphSeparator) if (c == QChar::ParagraphSeparator)
continue; continue;
const QTextCharFormat expectedFormat = c.isSpace() const QTextCharFormat expectedFormat = asSyntaxHighlight(
? whitespacified(formatForStyle) : formatForStyle; c.isSpace() ? whitespacified(formatForStyle) : formatForStyle);
const QTextCharFormat actualFormat = getActualFormat(pos); const QTextCharFormat actualFormat = getActualFormat(pos);
if (actualFormat != expectedFormat) { if (actualFormat != expectedFormat) {
int posLine; int posLine;

View File

@@ -4055,6 +4055,20 @@ void QuickfixTest::testInsertMemberFromUse_data()
"};\n"; "};\n";
QTest::addRow("add member function to this (implicit)") << original << expected; QTest::addRow("add member function to this (implicit)") << original << expected;
original =
"class C {\n"
"public:\n"
" int value() const { return @valueInternal(); }\n"
"};\n";
expected =
"class C {\n"
"public:\n"
" int value() const { return valueInternal(); }\n"
"private:\n"
" int valueInternal() const;\n"
"};\n";
QTest::addRow("add const member function to this (implicit)") << original << expected;
original = original =
"class C {\n" "class C {\n"
"public:\n" "public:\n"

View File

@@ -311,7 +311,7 @@ QString nameString(const NameAST *name)
// FIXME: Needs to consider the scope at the insertion site. // FIXME: Needs to consider the scope at the insertion site.
QString declFromExpr(const TypeOrExpr &typeOrExpr, const CallAST *call, const NameAST *varName, QString declFromExpr(const TypeOrExpr &typeOrExpr, const CallAST *call, const NameAST *varName,
const Snapshot &snapshot, const LookupContext &context, const Snapshot &snapshot, const LookupContext &context,
const CppRefactoringFilePtr &file) const CppRefactoringFilePtr &file, bool makeConst)
{ {
const auto getTypeFromUser = [varName, call]() -> QString { const auto getTypeFromUser = [varName, call]() -> QString {
if (call) if (call)
@@ -353,6 +353,7 @@ QString declFromExpr(const TypeOrExpr &typeOrExpr, const CallAST *call, const Na
return type.isValid() ? oo.prettyType(type, varName->name) : getTypeFromUser(); return type.isValid() ? oo.prettyType(type, varName->name) : getTypeFromUser();
Function func(file->cppDocument()->translationUnit(), 0, varName->name); Function func(file->cppDocument()->translationUnit(), 0, varName->name);
func.setConst(makeConst);
for (ExpressionListAST *it = call->expression_list; it; it = it->next) { for (ExpressionListAST *it = call->expression_list; it; it = it->next) {
Argument * const arg = new Argument(nullptr, 0, nullptr); Argument * const arg = new Argument(nullptr, 0, nullptr);
arg->setType(getTypeOfExpr(it->value)); arg->setType(getTypeOfExpr(it->value));
@@ -1671,7 +1672,7 @@ private:
if (currentFile->cppDocument()->languageFeatures().cxx11Enabled && settings->useAuto) if (currentFile->cppDocument()->languageFeatures().cxx11Enabled && settings->useAuto)
return "auto " + oo.prettyName(simpleNameAST->name); return "auto " + oo.prettyName(simpleNameAST->name);
return declFromExpr(binaryAST->right_expression, nullptr, simpleNameAST, snapshot(), return declFromExpr(binaryAST->right_expression, nullptr, simpleNameAST, snapshot(),
context(), currentFile); context(), currentFile, false);
} }
const BinaryExpressionAST *binaryAST; const BinaryExpressionAST *binaryAST;
@@ -2939,10 +2940,11 @@ public:
const TypeOrExpr &typeOrExpr, const TypeOrExpr &typeOrExpr,
const CallAST *call, const CallAST *call,
InsertionPointLocator::AccessSpec accessSpec, InsertionPointLocator::AccessSpec accessSpec,
bool makeStatic) bool makeStatic,
bool makeConst)
: CppQuickFixOperation(interface), : CppQuickFixOperation(interface),
m_class(theClass), m_memberName(memberName), m_typeOrExpr(typeOrExpr), m_call(call), m_class(theClass), m_memberName(memberName), m_typeOrExpr(typeOrExpr), m_call(call),
m_accessSpec(accessSpec), m_makeStatic(makeStatic) m_accessSpec(accessSpec), m_makeStatic(makeStatic), m_makeConst(makeConst)
{ {
if (call) if (call)
setDescription(Tr::tr("Add Member Function \"%1\"").arg(nameString(memberName))); setDescription(Tr::tr("Add Member Function \"%1\"").arg(nameString(memberName)));
@@ -2954,7 +2956,7 @@ private:
void perform() override void perform() override
{ {
QString decl = declFromExpr(m_typeOrExpr, m_call, m_memberName, snapshot(), context(), QString decl = declFromExpr(m_typeOrExpr, m_call, m_memberName, snapshot(), context(),
currentFile()); currentFile(), m_makeConst);
if (decl.isEmpty()) if (decl.isEmpty())
return; return;
if (m_makeStatic) if (m_makeStatic)
@@ -2983,6 +2985,7 @@ private:
const CallAST * m_call; const CallAST * m_call;
const InsertionPointLocator::AccessSpec m_accessSpec; const InsertionPointLocator::AccessSpec m_accessSpec;
const bool m_makeStatic; const bool m_makeStatic;
const bool m_makeConst;
}; };
void AddDeclarationForUndeclaredIdentifier::match(const CppQuickFixInterface &interface, void AddDeclarationForUndeclaredIdentifier::match(const CppQuickFixInterface &interface,
@@ -3198,7 +3201,7 @@ bool AddDeclarationForUndeclaredIdentifier::checkForMemberInitializer(
result << new InsertMemberFromInitializationOp( result << new InsertMemberFromInitializationOp(
interface, theClass, memInitializer->name->asSimpleName(), memInitializer->expression, interface, theClass, memInitializer->name->asSimpleName(), memInitializer->expression,
nullptr, InsertionPointLocator::Private, false); nullptr, InsertionPointLocator::Private, false, false);
return false; return false;
} }
@@ -3268,7 +3271,8 @@ void AddDeclarationForUndeclaredIdentifier::maybeAddMember(
} }
} }
result << new InsertMemberFromInitializationOp(interface, theClass, path.last()->asName(), result << new InsertMemberFromInitializationOp(interface, theClass, path.last()->asName(),
typeOrExpr, call, accessSpec, needsStatic); typeOrExpr, call, accessSpec, needsStatic,
func->symbol->isConst());
} }
void AddDeclarationForUndeclaredIdentifier::maybeAddStaticMember( void AddDeclarationForUndeclaredIdentifier::maybeAddStaticMember(
@@ -3311,7 +3315,7 @@ void AddDeclarationForUndeclaredIdentifier::maybeAddStaticMember(
if (theClass) { if (theClass) {
result << new InsertMemberFromInitializationOp( result << new InsertMemberFromInitializationOp(
interface, theClass, path.last()->asName(), typeOrExpr, call, interface, theClass, path.last()->asName(), typeOrExpr, call,
InsertionPointLocator::Public, true); InsertionPointLocator::Public, true, false);
} }
} }

View File

@@ -157,6 +157,7 @@ public:
Utils::FilePath debugInfoLocation; // Gdb "set-debug-file-directory". Utils::FilePath debugInfoLocation; // Gdb "set-debug-file-directory".
QStringList debugSourceLocation; // Gdb "directory" QStringList debugSourceLocation; // Gdb "directory"
QString qtPackageSourceLocation; QString qtPackageSourceLocation;
Utils::FilePath qtSourceLocation;
bool isSnapshot = false; // Set if created internally. bool isSnapshot = false; // Set if created internally.
ProjectExplorer::Abi toolChainAbi; ProjectExplorer::Abi toolChainAbi;

View File

@@ -863,8 +863,10 @@ DebuggerRunTool::DebuggerRunTool(RunControl *runControl, AllowTerminal allowTerm
m_runParameters.debugger = DebuggerKitAspect::runnable(kit); m_runParameters.debugger = DebuggerKitAspect::runnable(kit);
m_runParameters.cppEngineType = DebuggerKitAspect::engineType(kit); m_runParameters.cppEngineType = DebuggerKitAspect::engineType(kit);
if (QtSupport::QtVersion *qtVersion = QtSupport::QtKitAspect::qtVersion(kit)) if (QtSupport::QtVersion *qtVersion = QtSupport::QtKitAspect::qtVersion(kit)) {
m_runParameters.qtPackageSourceLocation = qtVersion->qtPackageSourcePath().toString(); m_runParameters.qtPackageSourceLocation = qtVersion->qtPackageSourcePath().toString();
m_runParameters.qtSourceLocation = qtVersion->sourcePath();
}
if (auto aspect = runControl->aspect<DebuggerRunConfigurationAspect>()) { if (auto aspect = runControl->aspect<DebuggerRunConfigurationAspect>()) {
if (!aspect->useCppDebugger) if (!aspect->useCppDebugger)

View File

@@ -415,47 +415,18 @@ void DebuggerSourcePathMappingWidget::slotEditTargetFieldChanged()
} }
} }
// Find Qt installation by running qmake
static QString findQtInstallPath(const FilePath &qmakePath)
{
if (qmakePath.isEmpty())
return QString();
Process proc;
proc.setCommand({qmakePath, {"-query", "QT_INSTALL_HEADERS"}});
proc.start();
if (!proc.waitForFinished()) {
qWarning("%s: Timeout running '%s'.", Q_FUNC_INFO, qPrintable(qmakePath.toString()));
return QString();
}
if (proc.exitStatus() != QProcess::NormalExit) {
qWarning("%s: '%s' crashed.", Q_FUNC_INFO, qPrintable(qmakePath.toString()));
return QString();
}
const QByteArray ba = proc.readAllRawStandardOutput().trimmed();
QDir dir(QString::fromLocal8Bit(ba));
if (dir.exists() && dir.cdUp())
return dir.absolutePath();
return QString();
}
/* Merge settings for an installed Qt (unless another setting is already in the map. */ /* Merge settings for an installed Qt (unless another setting is already in the map. */
SourcePathMap mergePlatformQtPath(const DebuggerRunParameters &sp, const SourcePathMap &in) SourcePathMap mergePlatformQtPath(const DebuggerRunParameters &sp, const SourcePathMap &in)
{ {
const FilePath qmake = BuildableHelperLibrary::findSystemQt(sp.inferior.environment); static const QString qglobal = "qtbase/src/corelib/global/qglobal.h";
// FIXME: Get this from the profile? const FilePath sourceLocation = sp.qtSourceLocation;
// We could query the QtVersion for this information directly, but then we if (!(sourceLocation / qglobal).exists())
// will need to add a dependency on QtSupport to the debugger.
//
// The profile could also get a function to extract the required information from
// its information to avoid this dependency (as we do for the environment).
const QString qtInstallPath = findQtInstallPath(qmake);
if (qtInstallPath.isEmpty())
return in; return in;
SourcePathMap rc = in; SourcePathMap rc = in;
for (const QString &buildPath : qtBuildPaths()) { for (const QString &buildPath : qtBuildPaths()) {
if (!rc.contains(buildPath)) // Do not overwrite user settings. if (!rc.contains(buildPath)) // Do not overwrite user settings.
rc.insert(buildPath, qtInstallPath + "/../Src"); rc.insert(buildPath, sourceLocation.path());
} }
return rc; return rc;
} }

View File

@@ -435,6 +435,8 @@ void TaskWindow::triggerDefaultHandler(const QModelIndex &index)
QModelIndex taskIndex = index; QModelIndex taskIndex = index;
if (index.parent().isValid()) if (index.parent().isValid())
taskIndex = index.parent(); taskIndex = index.parent();
if (taskIndex.column() == 1)
taskIndex = taskIndex.siblingAtColumn(0);
Task task(d->m_filter->task(taskIndex)); Task task(d->m_filter->task(taskIndex));
if (task.isNull()) if (task.isNull())
return; return;

View File

@@ -13,11 +13,13 @@
#include <utils/hostosinfo.h> #include <utils/hostosinfo.h>
#include <utils/pathchooser.h> #include <utils/pathchooser.h>
#include <utils/process.h> #include <utils/process.h>
#include <utils/qtcsettings.h>
#include <QCoreApplication> #include <QCoreApplication>
#include <QCheckBox> #include <QCheckBox>
#include <QFormLayout> #include <QFormLayout>
#include <QLabel> #include <QLabel>
#include <QPushButton>
using namespace Utils; using namespace Utils;
@@ -52,12 +54,17 @@ static bool operator!=(const QbsSettingsData &s1, const QbsSettingsData &s2)
FilePath QbsSettings::qbsExecutableFilePath() FilePath QbsSettings::qbsExecutableFilePath()
{ {
const QString fileName = HostOsInfo::withExecutableSuffix("qbs");
FilePath candidate = instance().m_settings.qbsExecutableFilePath; FilePath candidate = instance().m_settings.qbsExecutableFilePath;
if (!candidate.exists()) { if (!candidate.exists())
candidate = FilePath::fromString(QCoreApplication::applicationDirPath()) candidate = defaultQbsExecutableFilePath();
.pathAppended(fileName); return candidate;
} }
FilePath QbsSettings::defaultQbsExecutableFilePath()
{
const QString fileName = HostOsInfo::withExecutableSuffix("qbs");
FilePath candidate = FilePath::fromString(QCoreApplication::applicationDirPath())
.pathAppended(fileName);
if (!candidate.exists()) if (!candidate.exists())
candidate = Environment::systemEnvironment().searchInPath(fileName); candidate = Environment::systemEnvironment().searchInPath(fileName);
return candidate; return candidate;
@@ -136,7 +143,8 @@ void QbsSettings::loadSettings()
void QbsSettings::storeSettings() const void QbsSettings::storeSettings() const
{ {
QSettings * const s = Core::ICore::settings(); QSettings * const s = Core::ICore::settings();
s->setValue(QBS_EXE_KEY, m_settings.qbsExecutableFilePath.toString()); QtcSettings::setValueWithDefault(s, QBS_EXE_KEY, m_settings.qbsExecutableFilePath.toString(),
defaultQbsExecutableFilePath().toString());
s->setValue(QBS_DEFAULT_INSTALL_DIR_KEY, m_settings.defaultInstallDirTemplate); s->setValue(QBS_DEFAULT_INSTALL_DIR_KEY, m_settings.defaultInstallDirTemplate);
s->setValue(USE_CREATOR_SETTINGS_KEY, m_settings.useCreatorSettings); s->setValue(USE_CREATOR_SETTINGS_KEY, m_settings.useCreatorSettings);
} }
@@ -148,6 +156,7 @@ public:
{ {
m_qbsExePathChooser.setExpectedKind(PathChooser::ExistingCommand); m_qbsExePathChooser.setExpectedKind(PathChooser::ExistingCommand);
m_qbsExePathChooser.setFilePath(QbsSettings::qbsExecutableFilePath()); m_qbsExePathChooser.setFilePath(QbsSettings::qbsExecutableFilePath());
m_resetQbsExeButton.setText(Tr::tr("Reset"));
m_defaultInstallDirLineEdit.setText(QbsSettings::defaultInstallDirTemplate()); m_defaultInstallDirLineEdit.setText(QbsSettings::defaultInstallDirTemplate());
m_versionLabel.setText(getQbsVersionString()); m_versionLabel.setText(getQbsVersionString());
//: %1 == "Qt Creator" or "Qt Design Studio" //: %1 == "Qt Creator" or "Qt Design Studio"
@@ -157,13 +166,19 @@ public:
const auto layout = new QFormLayout(this); const auto layout = new QFormLayout(this);
layout->addRow(&m_settingsDirCheckBox); layout->addRow(&m_settingsDirCheckBox);
layout->addRow(Tr::tr("Path to qbs executable:"), &m_qbsExePathChooser); const auto qbsExeLayout = new QHBoxLayout;
qbsExeLayout->addWidget(&m_qbsExePathChooser);
qbsExeLayout->addWidget(&m_resetQbsExeButton);
layout->addRow(Tr::tr("Path to qbs executable:"), qbsExeLayout);
layout->addRow(Tr::tr("Default installation directory:"), &m_defaultInstallDirLineEdit); layout->addRow(Tr::tr("Default installation directory:"), &m_defaultInstallDirLineEdit);
layout->addRow(Tr::tr("Qbs version:"), &m_versionLabel); layout->addRow(Tr::tr("Qbs version:"), &m_versionLabel);
connect(&m_qbsExePathChooser, &PathChooser::textChanged, [this] { connect(&m_qbsExePathChooser, &PathChooser::textChanged, [this] {
m_versionLabel.setText(getQbsVersionString()); m_versionLabel.setText(getQbsVersionString());
}); });
connect(&m_resetQbsExeButton, &QPushButton::clicked, [this] {
m_qbsExePathChooser.setFilePath(QbsSettings::defaultQbsExecutableFilePath());
});
} }
void apply() final void apply() final
@@ -185,6 +200,7 @@ private:
} }
PathChooser m_qbsExePathChooser; PathChooser m_qbsExePathChooser;
QPushButton m_resetQbsExeButton;
QLabel m_versionLabel; QLabel m_versionLabel;
QCheckBox m_settingsDirCheckBox; QCheckBox m_settingsDirCheckBox;
FancyLineEdit m_defaultInstallDirLineEdit; FancyLineEdit m_defaultInstallDirLineEdit;

View File

@@ -27,6 +27,7 @@ public:
static QbsSettings &instance(); static QbsSettings &instance();
static Utils::FilePath qbsExecutableFilePath(); static Utils::FilePath qbsExecutableFilePath();
static Utils::FilePath defaultQbsExecutableFilePath();
static Utils::FilePath qbsConfigFilePath(); static Utils::FilePath qbsConfigFilePath();
static bool hasQbsExecutable(); static bool hasQbsExecutable();
static QString defaultInstallDirTemplate(); static QString defaultInstallDirTemplate();

View File

@@ -1129,13 +1129,8 @@ extend_qtc_plugin(componentsplugin
extend_qtc_plugin(componentsplugin extend_qtc_plugin(componentsplugin
SOURCES_PREFIX componentsplugin SOURCES_PREFIX componentsplugin
SOURCES SOURCES
addtabdesigneraction.cpp addtabdesigneraction.h
addtabtotabviewdialog.cpp addtabtotabviewdialog.h
addtabtotabviewdialog.ui
componentsplugin.cpp componentsplugin.h componentsplugin.cpp componentsplugin.h
componentsplugin.qrc componentsplugin.qrc
entertabdesigneraction.cpp entertabdesigneraction.h
tabviewindexmodel.cpp tabviewindexmodel.h
) )
add_qtc_plugin(qmlpreviewplugin add_qtc_plugin(qmlpreviewplugin

View File

@@ -42,9 +42,6 @@ namespace {
bool itemIsResizable(const ModelNode &modelNode) bool itemIsResizable(const ModelNode &modelNode)
{ {
if (modelNode.metaInfo().isQtQuickControlsTab())
return false;
return NodeHints::fromModelNode(modelNode).isResizable(); return NodeHints::fromModelNode(modelNode).isResizable();
} }

View File

@@ -1,118 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "addtabdesigneraction.h"
#include "addtabtotabviewdialog.h"
#include <QCoreApplication>
#include <QMessageBox>
#include <QUrl>
#include <QFileInfo>
#include <coreplugin/icore.h>
#include <coreplugin/messagebox.h>
#include <documentmanager.h>
#include <nodemetainfo.h>
#include <modelnode.h>
#include <nodeabstractproperty.h>
#include <qmldesignerplugin.h>
namespace QmlDesigner {
bool isTabView(const ModelNode &modelNode)
{
return modelNode.metaInfo().isQtQuickControlsTabView();
}
bool isTabAndParentIsTabView(const ModelNode &modelNode)
{
return modelNode.metaInfo().isQtQuickControlsTab() && modelNode.hasParentProperty()
&& modelNode.parentProperty().parentModelNode().metaInfo().isQtQuickControlsTabView();
}
AddTabDesignerAction::AddTabDesignerAction()
: AbstractAction(QCoreApplication::translate("TabViewToolAction","Add Tab..."))
{
connect(action(), &QAction::triggered, this, &AddTabDesignerAction::addNewTab);
}
QByteArray AddTabDesignerAction::category() const
{
return QByteArray();
}
QByteArray AddTabDesignerAction::menuId() const
{
return "TabViewAction";
}
int AddTabDesignerAction::priority() const
{
return CustomActionsPriority;
}
ActionInterface::Type AddTabDesignerAction::type() const
{
return ContextMenuAction;
}
bool AddTabDesignerAction::isVisible(const SelectionContext &selectionContext) const
{
if (selectionContext.singleNodeIsSelected()) {
ModelNode selectedModelNode = selectionContext.currentSingleSelectedNode();
return isTabView(selectedModelNode) || isTabAndParentIsTabView(selectedModelNode);
}
return false;
}
bool AddTabDesignerAction::isEnabled(const SelectionContext &selectionContext) const
{
return isVisible(selectionContext);
}
static ModelNode findTabViewModelNode(const ModelNode &currentModelNode)
{
if (currentModelNode.metaInfo().isQtQuickControlsTabView())
return currentModelNode;
else
return findTabViewModelNode(currentModelNode.parentProperty().parentModelNode());
}
void AddTabDesignerAction::addNewTab()
{
QString tabName = AddTabToTabViewDialog::create(QStringLiteral("Tab"),
Core::ICore::dialogParent());
if (!tabName.isEmpty()) {
QString directoryPath = QFileInfo(selectionContext().view()->model()->fileUrl().toLocalFile()).absolutePath();
QString newFilePath = directoryPath +QStringLiteral("/") + tabName + QStringLiteral(".qml");
if (QFileInfo::exists(newFilePath)) {
Core::AsynchronousMessageBox::warning(tr("Naming Error"), tr("Component already exists."));
} else {
const QString sourceString = QStringLiteral("import QtQuick 2.1\nimport QtQuick.Controls 1.0\n\nItem {\n anchors.fill: parent\n}");
bool fileCreated = DocumentManager::createFile(newFilePath, sourceString);
if (fileCreated) {
DocumentManager::addFileToVersionControl(directoryPath, newFilePath);
ModelNode tabViewModelNode = findTabViewModelNode(selectionContext().currentSingleSelectedNode());
PropertyListType propertyList;
propertyList.append(QPair<PropertyName, QVariant>("source", QString(tabName + QStringLiteral(".qml"))));
propertyList.append(QPair<PropertyName, QVariant>("title", tabName));
ModelNode newTabModelNode = selectionContext().view()->createModelNode("QtQuick.Controls.Tab",
tabViewModelNode.majorVersion(),
tabViewModelNode.minorVersion(),
propertyList);
newTabModelNode.setIdWithRefactoring(newTabModelNode.model()->generateNewId(tabName));
tabViewModelNode.defaultNodeAbstractProperty().reparentHere(newTabModelNode);
}
}
}
}
} // namespace QmlDesigner

View File

@@ -1,29 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include "abstractaction.h"
namespace QmlDesigner {
class AddTabDesignerAction : public QObject, public AbstractAction
{
Q_OBJECT
public:
AddTabDesignerAction();
QByteArray category() const override;
QByteArray menuId() const override;
int priority() const override;
Type type() const override;
protected:
bool isVisible(const SelectionContext &selectionContext) const override;
bool isEnabled(const SelectionContext &selectionContext) const override;
private:
void addNewTab();
};
} // namespace QmlDesigner

View File

@@ -1,39 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "addtabtotabviewdialog.h"
#include "ui_addtabtotabviewdialog.h"
namespace QmlDesigner {
AddTabToTabViewDialog::AddTabToTabViewDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::AddTabToTabViewDialog)
{
ui->setupUi(this);
ui->addTabLineEdit->setForceFirstCapitalLetter(true);
}
AddTabToTabViewDialog::~AddTabToTabViewDialog()
{
delete ui;
}
QString AddTabToTabViewDialog::create(const QString &tabName, QWidget *parent)
{
AddTabToTabViewDialog addTabToTabViewDialog(parent);
Utils::FileNameValidatingLineEdit *fileNameValidatingLineEdit = addTabToTabViewDialog.ui->addTabLineEdit;
fileNameValidatingLineEdit->setText(tabName);
int result = addTabToTabViewDialog.exec();
if (result == QDialog::Accepted && fileNameValidatingLineEdit->isValid())
return fileNameValidatingLineEdit->text();
else
return QString();
}
} // namespace QmlDesigner

View File

@@ -1,25 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include <QDialog>
namespace QmlDesigner {
namespace Ui { class AddTabToTabViewDialog; }
class AddTabToTabViewDialog : public QDialog
{
Q_OBJECT
public:
explicit AddTabToTabViewDialog(QWidget *parent = nullptr);
~AddTabToTabViewDialog() override;
static QString create(const QString &tabName, QWidget *parent);
private:
Ui::AddTabToTabViewDialog *ui;
};
} // namespace QmlDesigner

View File

@@ -1,85 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>QmlDesigner::AddTabToTabViewDialog</class>
<widget class="QDialog" name="QmlDesigner::AddTabToTabViewDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>362</width>
<height>80</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="addTabLabel">
<property name="text">
<string>Add tab:</string>
</property>
</widget>
</item>
<item>
<widget class="Utils::FileNameValidatingLineEdit" name="addTabLineEdit"/>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>Utils::FileNameValidatingLineEdit</class>
<extends>QLineEdit</extends>
<header location="global">utils/filenamevalidatinglineedit.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>QmlDesigner::AddTabToTabViewDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>QmlDesigner::AddTabToTabViewDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@@ -3,22 +3,12 @@
#include "componentsplugin.h" #include "componentsplugin.h"
#include "tabviewindexmodel.h"
#include "addtabdesigneraction.h"
#include "entertabdesigneraction.h"
#include <designeractionmanager.h>
#include <viewmanager.h>
#include <qmldesignerplugin.h> #include <qmldesignerplugin.h>
namespace QmlDesigner { namespace QmlDesigner {
ComponentsPlugin::ComponentsPlugin() ComponentsPlugin::ComponentsPlugin()
{ {
TabViewIndexModel::registerDeclarativeType();
DesignerActionManager *actionManager = &QmlDesignerPlugin::instance()->viewManager().designerActionManager();
actionManager->addDesignerAction(new AddTabDesignerAction);
actionManager->addDesignerAction(new EnterTabDesignerAction);
} }
QString ComponentsPlugin::pluginName() const QString ComponentsPlugin::pluginName() const

View File

@@ -1,116 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "entertabdesigneraction.h"
#include <abstractaction.h>
#include <documentmanager.h>
#include <modelnode.h>
#include <nodeabstractproperty.h>
#include <nodemetainfo.h>
#include <qmlitemnode.h>
#include <QCoreApplication>
namespace QmlDesigner {
class EnterTabAction : public DefaultAction
{
public:
EnterTabAction(const QString &description)
: DefaultAction(description)
{ }
public:
void actionTriggered(bool) override
{
DocumentManager::goIntoComponent(m_selectionContext.targetNode());
}
};
EnterTabDesignerAction::EnterTabDesignerAction()
: AbstractActionGroup(QCoreApplication::translate("TabViewToolAction", "Step into Tab"))
{
}
QByteArray EnterTabDesignerAction::category() const
{
return QByteArray();
}
QByteArray EnterTabDesignerAction::menuId() const
{
return "TabViewAction";
}
int EnterTabDesignerAction::priority() const
{
//Editing tabs is above adding tabs
return CustomActionsPriority + 10;
}
void EnterTabDesignerAction::updateContext()
{
menu()->clear();
if (selectionContext().isValid()) {
action()->setEnabled(isEnabled(selectionContext()));
action()->setVisible(isVisible(selectionContext()));
if (action()->isEnabled()) {
const ModelNode selectedModelNode = selectionContext().currentSingleSelectedNode();
if (selectedModelNode.metaInfo().isValid()
&& selectedModelNode.metaInfo().isQtQuickControlsTabView()) {
const NodeAbstractProperty defaultProperty = selectedModelNode
.defaultNodeAbstractProperty();
const QList<QmlDesigner::ModelNode> childModelNodes = defaultProperty.directSubNodes();
for (const QmlDesigner::ModelNode &childModelNode : childModelNodes) {
createActionForTab(childModelNode);
}
}
}
}
}
bool EnterTabDesignerAction::isVisible(const SelectionContext &selectionContext) const
{
if (selectionContext.singleNodeIsSelected()) {
ModelNode selectedModelNode = selectionContext.currentSingleSelectedNode();
return selectedModelNode.metaInfo().isQtQuickControlsTabView();
}
return false;
}
static bool tabViewIsNotEmpty(const SelectionContext &selectionContext)
{
return selectionContext.currentSingleSelectedNode().defaultNodeAbstractProperty().isNodeListProperty();
}
bool EnterTabDesignerAction::isEnabled(const SelectionContext &selectionContext) const
{
return isVisible(selectionContext) && tabViewIsNotEmpty(selectionContext);
}
void EnterTabDesignerAction::createActionForTab(const ModelNode &modelNode)
{
if (modelNode.metaInfo().isQtQuickControlsTab()) {
QmlDesigner::QmlItemNode itemNode(modelNode);
if (itemNode.isValid()) {
QString what = tr("Step into: %1").
arg(itemNode.instanceValue("title").toString());
auto selectionAction = new EnterTabAction(what);
SelectionContext nodeSelectionContext = selectionContext();
nodeSelectionContext.setTargetNode(modelNode);
selectionAction->setSelectionContext(nodeSelectionContext);
menu()->addAction(selectionAction);
}
}
}
} // namespace QmlDesigner

View File

@@ -1,32 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include <abstractactiongroup.h>
#include <QCoreApplication>
namespace QmlDesigner {
class EnterTabDesignerAction : public AbstractActionGroup
{
Q_DECLARE_TR_FUNCTIONS(EnterTabDesignerAction)
public:
EnterTabDesignerAction();
QByteArray category() const override;
QByteArray menuId() const override;
int priority() const override;
void updateContext() override;
protected:
bool isVisible(const SelectionContext &selectionContext) const override;
bool isEnabled(const SelectionContext &selectionContext) const override;
private:
void createActionForTab(const ModelNode &modelNode);
};
} // namespace QmlDesigner

View File

@@ -1,61 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "tabviewindexmodel.h"
#include <metainfo.h>
#include <variantproperty.h>
#include <nodelistproperty.h>
TabViewIndexModel::TabViewIndexModel(QObject *parent) :
QObject(parent)
{
}
void TabViewIndexModel::setModelNodeBackend(const QVariant &modelNodeBackend)
{
auto modelNodeBackendObject = modelNodeBackend.value<QObject*>();
if (modelNodeBackendObject)
setModelNode(modelNodeBackendObject->property("modelNode").value<QmlDesigner::ModelNode>());
setupModel();
emit modelNodeBackendChanged();
}
void TabViewIndexModel::setModelNode(const QmlDesigner::ModelNode &modelNode)
{
m_modelNode = modelNode;
}
QStringList TabViewIndexModel::tabViewIndexModel() const
{
return m_tabViewIndexModel;
}
void TabViewIndexModel::setupModel()
{
m_tabViewIndexModel.clear();
if (m_modelNode.metaInfo().isQtQuickControlsTabView()) {
const QList<QmlDesigner::ModelNode> childModelNodes
= m_modelNode.defaultNodeAbstractProperty().directSubNodes();
for (const QmlDesigner::ModelNode &childModelNode : childModelNodes) {
if (childModelNode.metaInfo().isQtQuickControlsTab()) {
QmlDesigner::QmlItemNode itemNode(childModelNode);
if (itemNode.isValid()) {
m_tabViewIndexModel.append(itemNode.instanceValue("title").toString());
}
}
}
}
}
void TabViewIndexModel::registerDeclarativeType()
{
qmlRegisterType<TabViewIndexModel>("HelperWidgets",2,0,"TabViewIndexModel");
}
QVariant TabViewIndexModel::modelNodeBackend() const
{
return QVariant::fromValue(m_modelNode);
}

View File

@@ -1,38 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include <qmlitemnode.h>
#include <QObject>
#include <QtQml>
class TabViewIndexModel : public QObject
{
Q_OBJECT
Q_PROPERTY(QVariant modelNodeBackendProperty READ modelNodeBackend WRITE setModelNodeBackend NOTIFY modelNodeBackendChanged)
Q_PROPERTY(QStringList tabViewIndexModel READ tabViewIndexModel NOTIFY modelNodeBackendChanged)
public:
explicit TabViewIndexModel(QObject *parent = nullptr);
void setModelNodeBackend(const QVariant &modelNodeBackend);
void setModelNode(const QmlDesigner::ModelNode &modelNode);
QStringList tabViewIndexModel() const;
void setupModel();
static void registerDeclarativeType();
signals:
void modelNodeBackendChanged();
private:
QVariant modelNodeBackend() const;
QmlDesigner::ModelNode m_modelNode;
QStringList m_tabViewIndexModel;
};
QML_DECLARE_TYPE(TabViewIndexModel)

View File

@@ -145,9 +145,7 @@ public:
bool isQtQuick3DView3D() const; bool isQtQuick3DView3D() const;
bool isQtQuickBorderImage() const; bool isQtQuickBorderImage() const;
bool isQtQuickControlsSwipeView() const; bool isQtQuickControlsSwipeView() const;
bool isQtQuickControlsTab() const;
bool isQtQuickControlsTabBar() const; bool isQtQuickControlsTabBar() const;
bool isQtQuickControlsTabView() const;
bool isQtQuickExtrasPicture() const; bool isQtQuickExtrasPicture() const;
bool isQtQuickImage() const; bool isQtQuickImage() const;
bool isQtQuickItem() const; bool isQtQuickItem() const;

View File

@@ -2107,16 +2107,6 @@ bool NodeMetaInfo::isListOrGridView() const
} }
} }
bool NodeMetaInfo::isQtQuickControlsTabView() const
{
if constexpr (useProjectStorage()) {
using namespace Storage::Info;
return isBasedOnCommonType<QtQuick_Controls, TabView>(m_projectStorage, m_typeId);
} else {
return isValid() && isSubclassOf("QtQuick.Controls.TabView");
}
}
bool NodeMetaInfo::isQtQuickExtrasPicture() const bool NodeMetaInfo::isQtQuickExtrasPicture() const
{ {
if constexpr (useProjectStorage()) { if constexpr (useProjectStorage()) {
@@ -2195,17 +2185,6 @@ bool NodeMetaInfo::isQtQuickControlsTabBar() const
} }
} }
bool NodeMetaInfo::isQtQuickControlsTab() const
{
if constexpr (useProjectStorage()) {
using namespace Storage::Info;
return isBasedOnCommonType<QtQuick_Controls, Tab>(m_projectStorage, m_typeId);
} else {
return isValid() && isSubclassOf("QtQuick.Controls.Tab");
}
}
bool NodeMetaInfo::isQtQuickControlsSwipeView() const bool NodeMetaInfo::isQtQuickControlsSwipeView() const
{ {
if constexpr (useProjectStorage()) { if constexpr (useProjectStorage()) {

View File

@@ -349,9 +349,6 @@ bool QmlItemNode::instanceHasScaleOrRotationTransform() const
bool itemIsMovable(const ModelNode &modelNode) bool itemIsMovable(const ModelNode &modelNode)
{ {
if (modelNode.metaInfo().isQtQuickControlsTab())
return false;
if (!modelNode.hasParentProperty()) if (!modelNode.hasParentProperty())
return false; return false;
@@ -363,9 +360,6 @@ bool itemIsMovable(const ModelNode &modelNode)
bool itemIsResizable(const ModelNode &modelNode) bool itemIsResizable(const ModelNode &modelNode)
{ {
if (modelNode.metaInfo().isQtQuickControlsTab())
return false;
return NodeHints::fromModelNode(modelNode).isResizable(); return NodeHints::fromModelNode(modelNode).isResizable();
} }

View File

@@ -106,8 +106,6 @@ inline constexpr char StateGroup[] = "StateGroup";
inline constexpr char State[] = "State"; inline constexpr char State[] = "State";
inline constexpr char SwipeView[] = "SwipeView"; inline constexpr char SwipeView[] = "SwipeView";
inline constexpr char TabBar[] = "TabBar"; inline constexpr char TabBar[] = "TabBar";
inline constexpr char TabView[] = "TabView";
inline constexpr char Tab[] = "Tab";
inline constexpr char TextArea[] = "TextArea"; inline constexpr char TextArea[] = "TextArea";
inline constexpr char TextEdit[] = "TextEdit"; inline constexpr char TextEdit[] = "TextEdit";
inline constexpr char Text[] = "Text"; inline constexpr char Text[] = "Text";
@@ -215,9 +213,7 @@ class CommonTypeCache
CacheType<QtQuick_Controls, Popup>, CacheType<QtQuick_Controls, Popup>,
CacheType<QtQuick_Controls, SplitView>, CacheType<QtQuick_Controls, SplitView>,
CacheType<QtQuick_Controls, SwipeView>, CacheType<QtQuick_Controls, SwipeView>,
CacheType<QtQuick_Controls, Tab>,
CacheType<QtQuick_Controls, TabBar>, CacheType<QtQuick_Controls, TabBar>,
CacheType<QtQuick_Controls, TabView>,
CacheType<QtQuick_Controls, TextArea>, CacheType<QtQuick_Controls, TextArea>,
CacheType<QtQuick_Dialogs, Dialog>, CacheType<QtQuick_Dialogs, Dialog>,
CacheType<QtQuick_Extras, Picture>, CacheType<QtQuick_Extras, Picture>,

View File

@@ -514,7 +514,7 @@ void QmlDesignerProjectManager::fileListChanged()
void QmlDesignerProjectManager::activeTargetChanged(ProjectExplorer::Target *target) void QmlDesignerProjectManager::activeTargetChanged(ProjectExplorer::Target *target)
{ {
if (!m_projectData) if (!m_projectData || !m_projectData->projectStorageData)
return; return;
QObject::disconnect(m_projectData->activeTarget, nullptr, nullptr, nullptr); QObject::disconnect(m_projectData->activeTarget, nullptr, nullptr, nullptr);

View File

@@ -217,7 +217,10 @@ FilePath QmlProjectRunConfiguration::qmlRuntimeFilePath() const
// i.e. not necessarily something the device can use, but the // i.e. not necessarily something the device can use, but the
// device had its chance above. // device had its chance above.
if (QtVersion *version = QtKitAspect::qtVersion(kit)) { if (QtVersion *version = QtKitAspect::qtVersion(kit)) {
if (version->qtVersion().majorVersion() > 5) { // look for puppet as qmlruntime only in QtStudio Qt versions
if (version->features().contains("QtStudio") &&
version->qtVersion().majorVersion() > 5) {
auto [workingDirectoryPath, puppetPath] = QmlDesigner::QmlPuppetPaths::qmlPuppetPaths( auto [workingDirectoryPath, puppetPath] = QmlDesigner::QmlPuppetPaths::qmlPuppetPaths(
target(), QmlDesigner::QmlDesignerBasePlugin::settings()); target(), QmlDesigner::QmlDesignerBasePlugin::settings());
if (!puppetPath.isEmpty()) { if (!puppetPath.isEmpty()) {

View File

@@ -1861,9 +1861,23 @@ FilePath QtVersionPrivate::mkspecFromVersionInfo(const QHash<ProKey, ProString>
FilePath QtVersionPrivate::sourcePath(const QHash<ProKey, ProString> &versionInfo) FilePath QtVersionPrivate::sourcePath(const QHash<ProKey, ProString> &versionInfo)
{ {
const QString qt5Source = qmakeProperty(versionInfo, "QT_INSTALL_PREFIX/src"); const QString qt5Source = qmakeProperty(versionInfo, "QT_INSTALL_PREFIX/src");
if (!qt5Source.isEmpty()) if (!qt5Source.isEmpty()) {
return FilePath::fromString(QFileInfo(qt5Source).canonicalFilePath()); // Can be wrong for the Qt installers :/
// Check if we actually find sources, otherwise try what the online installer does.
const auto source = FilePath::fromString(QFileInfo(qt5Source).canonicalFilePath());
static const QString qglobal = "qtbase/src/corelib/global/qglobal.h";
if (!(source / qglobal).exists()) {
const auto install = FilePath::fromString(
qmakeProperty(versionInfo, "QT_INSTALL_PREFIX"))
.canonicalPath();
const FilePath otherSource = install / ".." / "Src";
if ((otherSource / qglobal).exists())
return otherSource.cleanPath();
}
return source;
}
// TODO The .qmake.cache workaround doesn't work anymore since Qt is built with CMake
const QString installData = qmakeProperty(versionInfo, "QT_INSTALL_PREFIX"); const QString installData = qmakeProperty(versionInfo, "QT_INSTALL_PREFIX");
QString sourcePath = installData; QString sourcePath = installData;
QFile qmakeCache(installData + "/.qmake.cache"); QFile qmakeCache(installData + "/.qmake.cache");

View File

@@ -37,7 +37,6 @@ public:
{ {
m_combo = createSubWidget<QComboBox>(); m_combo = createSubWidget<QComboBox>();
m_combo->setSizePolicy(QSizePolicy::Ignored, m_combo->sizePolicy().verticalPolicy()); m_combo->setSizePolicy(QSizePolicy::Ignored, m_combo->sizePolicy().verticalPolicy());
m_combo->addItem(Tr::tr("None"), -1);
m_manageButton = createManageButton(Constants::QTVERSION_SETTINGS_PAGE_ID); m_manageButton = createManageButton(Constants::QTVERSION_SETTINGS_PAGE_ID);
@@ -75,6 +74,7 @@ private:
{ {
const GuardLocker locker(m_ignoreChanges); const GuardLocker locker(m_ignoreChanges);
m_combo->clear(); m_combo->clear();
m_combo->addItem(Tr::tr("None"), -1);
IDeviceConstPtr device = BuildDeviceKitAspect::device(kit()); IDeviceConstPtr device = BuildDeviceKitAspect::device(kit());
const FilePath deviceRoot = device->rootPath(); const FilePath deviceRoot = device->rootPath();

View File

@@ -25,14 +25,17 @@ RefactorOverlay::RefactorOverlay(TextEditor::TextEditorWidget *editor) :
void RefactorOverlay::paint(QPainter *painter, const QRect &clip) void RefactorOverlay::paint(QPainter *painter, const QRect &clip)
{ {
const auto firstBlock = m_editor->blockForVerticalOffset(clip.top()); const auto firstBlock = m_editor->blockForVerticalOffset(clip.top());
const int firstBlockNumber = firstBlock.isValid() ? firstBlock.blockNumber() : 0;
const auto lastBlock = m_editor->blockForVerticalOffset(clip.bottom()); const auto lastBlock = m_editor->blockForVerticalOffset(clip.bottom());
const int lastBlockNumber = lastBlock.isValid() ? lastBlock.blockNumber()
: m_editor->blockCount() - 1;
m_maxWidth = 0; m_maxWidth = 0;
for (const RefactorMarker &marker : std::as_const(m_markers)) { for (const RefactorMarker &marker : std::as_const(m_markers)) {
const int markerBlockNumber = marker.cursor.block().blockNumber(); const int markerBlockNumber = marker.cursor.block().blockNumber();
if (markerBlockNumber < firstBlock.blockNumber()) if (markerBlockNumber < firstBlockNumber)
continue; continue;
if (markerBlockNumber > lastBlock.blockNumber()) if (markerBlockNumber > lastBlockNumber)
continue; continue;
paintMarker(marker, painter, clip); paintMarker(marker, painter, clip);
} }

View File

@@ -10,6 +10,35 @@
using namespace TextEditor; using namespace TextEditor;
using namespace Internal; using namespace Internal;
class SnippetProposalItem : public AssistProposalItemInterface
{
public:
SnippetProposalItem(const Snippet &snippet, const QIcon &icon)
: m_snippet(snippet)
, m_icon(icon)
{}
QString text() const override
{
return m_snippet.trigger() + QLatin1Char(' ') + m_snippet.complement();
}
bool implicitlyApplies() const override { return false; }
bool prematurelyApplies(const QChar &) const override { return false; }
void apply(TextDocumentManipulatorInterface &manipulator, int basePosition) const override
{
manipulator.insertCodeSnippet(basePosition, m_snippet.content(), &Snippet::parse);
}
QIcon icon() const override { return m_icon; }
QString detail() const override { return m_snippet.generateTip(); }
bool isSnippet() const override { return true; }
bool isValid() const override { return true; }
quint64 hash() const override { return 0; }
private:
const Snippet m_snippet;
const QIcon m_icon;
};
static void appendSnippets(QList<AssistProposalItemInterface *> *items, static void appendSnippets(QList<AssistProposalItemInterface *> *items,
const QString &groupId, const QString &groupId,
const QIcon &icon, const QIcon &icon,
@@ -19,11 +48,7 @@ static void appendSnippets(QList<AssistProposalItemInterface *> *items,
const int size = collection->totalActiveSnippets(groupId); const int size = collection->totalActiveSnippets(groupId);
for (int i = 0; i < size; ++i) { for (int i = 0; i < size; ++i) {
const Snippet &snippet = collection->snippet(i, groupId); const Snippet &snippet = collection->snippet(i, groupId);
auto item = new AssistProposalItem; auto item = new SnippetProposalItem(snippet, icon);
item->setText(snippet.trigger() + QLatin1Char(' ') + snippet.complement());
item->setData(snippet.content());
item->setDetail(snippet.generateTip());
item->setIcon(icon);
item->setOrder(order); item->setOrder(order);
items->append(item); items->append(item);
} }

View File

@@ -869,6 +869,13 @@ QTextCharFormat SyntaxHighlighter::whitespacified(const QTextCharFormat &fmt)
return format; return format;
} }
QTextCharFormat SyntaxHighlighter::asSyntaxHighlight(const QTextCharFormat &fmt)
{
QTextCharFormat format = fmt;
format.setProperty(SyntaxHighlight, true);
return format;
}
void SyntaxHighlighter::highlightBlock(const QString &text) void SyntaxHighlighter::highlightBlock(const QString &text)
{ {
formatSpaces(text); formatSpaces(text);

View File

@@ -62,6 +62,7 @@ protected:
void setTextFormatCategories(int count, std::function<TextStyle(int)> formatMapping); void setTextFormatCategories(int count, std::function<TextStyle(int)> formatMapping);
QTextCharFormat formatForCategory(int categoryIndex) const; QTextCharFormat formatForCategory(int categoryIndex) const;
QTextCharFormat whitespacified(const QTextCharFormat &fmt); QTextCharFormat whitespacified(const QTextCharFormat &fmt);
QTextCharFormat asSyntaxHighlight(const QTextCharFormat &fmt);
// implement in subclasses // implement in subclasses
// default implementation highlights whitespace // default implementation highlights whitespace

View File

@@ -334,11 +334,14 @@ void TextEditorOverlay::paint(QPainter *painter, const QRect &clip)
Q_UNUSED(clip) Q_UNUSED(clip)
const auto firstBlock = m_editor->blockForVerticalOffset(clip.top()); const auto firstBlock = m_editor->blockForVerticalOffset(clip.top());
const int firstBlockNumber = firstBlock.isValid() ? firstBlock.blockNumber() : 0;
const auto lastBlock = m_editor->blockForVerticalOffset(clip.bottom()); const auto lastBlock = m_editor->blockForVerticalOffset(clip.bottom());
const int lastBlockNumber = lastBlock.isValid() ? lastBlock.blockNumber()
: m_editor->blockCount() - 1;
auto overlapsClip = [&](const OverlaySelection &selection) { auto overlapsClip = [&](const OverlaySelection &selection) {
return selection.m_cursor_end.blockNumber() >= firstBlock.blockNumber() return selection.m_cursor_end.blockNumber() >= firstBlockNumber
&& selection.m_cursor_begin.blockNumber() <= lastBlock.blockNumber(); && selection.m_cursor_begin.blockNumber() <= lastBlockNumber;
}; };
for (int i = m_selections.size() - 1; i >= 0; --i) { for (int i = m_selections.size() - 1; i >= 0; --i) {

View File

@@ -124,17 +124,6 @@ def waitForCleanShutdown(timeOut=10):
shutdownDone=True shutdownDone=True
if not shutdownDone and datetime.utcnow() > endtime: if not shutdownDone and datetime.utcnow() > endtime:
break break
if platform.system() == 'Linux' and JIRA.isBugStillOpen(15749):
pgrepOutput = getOutputFromCmdline(["pgrep", "-f", "qtcreator_process_stub"],
acceptedError=1)
pids = pgrepOutput.splitlines()
if len(pids):
print("Killing %d qtcreator_process_stub instances" % len(pids))
for pid in pids:
try:
os.kill(__builtin__.int(pid), 9)
except OSError: # we might kill the parent before the current pid
pass
def checkForStillRunningQmlExecutable(possibleNames): def checkForStillRunningQmlExecutable(possibleNames):
for qmlHelper in possibleNames: for qmlHelper in possibleNames:

View File

@@ -53,8 +53,8 @@ def setKeyboardShortcutForAboutQtC():
invokeMenuItem("Edit", "Preferences...") invokeMenuItem("Edit", "Preferences...")
mouseClick(waitForObjectItem(":Options_QListView", "Environment")) mouseClick(waitForObjectItem(":Options_QListView", "Environment"))
clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Keyboard") clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Keyboard")
filter = waitForObject("{container={title='Keyboard Shortcuts' type='QGroupBox' unnamed='1' " filter = waitForObject("{container={name='Command Mappings' type='QGroupBox' visible='1'} "
"visible='1'} type='Utils::FancyLineEdit' unnamed='1' visible='1' " "type='Utils::FancyLineEdit' unnamed='1' visible='1' "
"placeholderText='Filter'}") "placeholderText='Filter'}")
replaceEditorContent(filter, "about") replaceEditorContent(filter, "about")
treewidget = waitForObject("{type='QTreeWidget' unnamed='1' visible='1'}") treewidget = waitForObject("{type='QTreeWidget' unnamed='1' visible='1'}")