diff options
author | Eike Ziller <eike.ziller@qt.io> | 2020-04-28 15:48:36 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2020-04-28 15:48:36 +0200 |
commit | e9661e43cbbb934e1aca7941685e2035c7dbde56 (patch) | |
tree | 438839660dff750585b4182bcb3711bf98e2e8a9 | |
parent | 6efed7140b37616b6a6882dd9096d1edafedd089 (diff) | |
parent | 05f746cfd029c0232bb5880c50d0b0d7d17f0cc5 (diff) |
Merge remote-tracking branch 'origin/4.12'
Conflicts:
cmake/QtCreatorIDEBranding.cmake
qbs/modules/qtc/qtc.qbs
qtcreator_ide_branding.pri
src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp
Change-Id: If6963d1ef7b5a1ea6343f68c8e7ce6fb5f482f21
42 files changed, 573 insertions, 226 deletions
diff --git a/cmake/QtCreatorAPI.cmake b/cmake/QtCreatorAPI.cmake index 993102e139a..f6387b7919f 100644 --- a/cmake/QtCreatorAPI.cmake +++ b/cmake/QtCreatorAPI.cmake @@ -496,11 +496,11 @@ function(add_qtc_library name) file(RELATIVE_PATH include_dir_relative_path ${PROJECT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories(${name} - PRIVATE ${_arg_INCLUDES} - PUBLIC + PRIVATE + ${_arg_INCLUDES} "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>" + PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>" - "$<INSTALL_INTERFACE:include/${include_dir_relative_path}>" "$<INSTALL_INTERFACE:include/${include_dir_relative_path}/..>" ) set_public_includes(${name} "${_arg_PUBLIC_INCLUDES}") @@ -755,10 +755,9 @@ function(add_qtc_plugin target_name) ${_arg_INCLUDES} "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_BINARY_DIR}/src" - PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>" + PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>" - "$<INSTALL_INTERFACE:include/${include_dir_relative_path}>" "$<INSTALL_INTERFACE:include/${include_dir_relative_path}/..>" ) set_public_includes(${target_name} "${_arg_PUBLIC_INCLUDES}") @@ -886,7 +885,7 @@ function(extend_qtc_target target_name) if (NOT IS_ABSOLUTE ${_arg_SOURCES_PREFIX}) set(_arg_SOURCES_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/${_arg_SOURCES_PREFIX}") endif() - target_include_directories(${target_name} PUBLIC $<BUILD_INTERFACE:${_arg_SOURCES_PREFIX}>) + target_include_directories(${target_name} PRIVATE $<BUILD_INTERFACE:${_arg_SOURCES_PREFIX}>) set(_arg_SOURCES ${prefixed_sources}) endif() diff --git a/doc/qtcreator/src/editors/creator-coding-edit-mode.qdoc b/doc/qtcreator/src/editors/creator-coding-edit-mode.qdoc index 56be275326d..c470d183be3 100644 --- a/doc/qtcreator/src/editors/creator-coding-edit-mode.qdoc +++ b/doc/qtcreator/src/editors/creator-coding-edit-mode.qdoc @@ -130,8 +130,10 @@ \uicontrol {Default line endings} field. To set the line endings to use for a project, select \uicontrol Projects > - \uicontrol {Project Settings} > \uicontrol Editor. For more information, - see \l {Specifying Editor Settings}. + \uicontrol {Project Settings} > \uicontrol Editor. + \if defined(qtcreator) + For more information, see \l {Specifying Editor Settings}. + \endif \section1 Splitting the Editor View diff --git a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-run-desktop.qdocinc b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-run-desktop.qdocinc index e0b1c7187e4..732090a5238 100644 --- a/doc/qtcreator/src/projects/creator-only/creator-projects-settings-run-desktop.qdocinc +++ b/doc/qtcreator/src/projects/creator-only/creator-projects-settings-run-desktop.qdocinc @@ -53,7 +53,7 @@ To disable library linking for the current project, deselect the \uicontrol {Add build library search path to PATH} check box. To disable library linking for all projects, select \uicontrol Tools > - \uicontrol Options > \uicontrol General, and then deselect the + \uicontrol Options > \uicontrol {Build & Run}, and then deselect the \uicontrol {Add linker library search paths to run environment} check box. The \uicontrol {Use debug version of frameworks (DYLD_IMAGE_SUFFIX=_debug)} option diff --git a/doc/qtcreator/src/qtquick/qtquick-adding-dynamics.qdoc b/doc/qtcreator/src/qtquick/qtquick-adding-dynamics.qdoc index a2e4b5865a6..9370ae848f8 100644 --- a/doc/qtcreator/src/qtquick/qtquick-adding-dynamics.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-adding-dynamics.qdoc @@ -26,7 +26,7 @@ /*! \contentspage index.html \page qtquick-adding-dynamics.html - \previouspage qtquick-fonts.html + \previouspage creator-quick-ui-forms.html \nextpage studio-timeline.html \title Adding Dynamics diff --git a/doc/qtcreator/src/qtquick/qtquick-components.qdoc b/doc/qtcreator/src/qtquick/qtquick-components.qdoc index 4266a4d7d0c..611dd97255e 100644 --- a/doc/qtcreator/src/qtquick/qtquick-components.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-components.qdoc @@ -33,7 +33,7 @@ \contentspage index.html \page quick-components.html \if defined(qtdesignstudio) - \previouspage studio-prototyping.html + \previouspage quick-uis.html \else \previouspage creator-using-qt-quick-designer.html \endif diff --git a/doc/qtcreator/src/qtquick/qtquick-ui-forms.qdoc b/doc/qtcreator/src/qtquick/qtquick-ui-forms.qdoc index 49f682d7ce7..14bb305be16 100644 --- a/doc/qtcreator/src/qtquick/qtquick-ui-forms.qdoc +++ b/doc/qtcreator/src/qtquick/qtquick-ui-forms.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2019 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Creator documentation. @@ -34,11 +34,7 @@ \contentspage index.html \page creator-quick-ui-forms.html \previouspage qtquick-annotations.html - \if defined(qtdesignstudio) - \nextpage creator-live-preview.html - \else - \nextpage creator-qml-modules-with-plugins.html - \endif + \nextpage qtquick-adding-dynamics.html \title Qt Quick UI Forms diff --git a/scripts/build.py b/scripts/build.py index 3c481362395..a58a688dcac 100755 --- a/scripts/build.py +++ b/scripts/build.py @@ -83,6 +83,10 @@ def get_arguments(): action='store_true', default=(not common.is_windows_platform())) parser.add_argument('--no-docs', help='Skip documentation generation', action='store_true', default=False) + parser.add_argument('--no-dmg', help='Skip disk image creation (macOS)', + action='store_true', default=False) + parser.add_argument('--no-zip', help='Skip creation of 7zip files for install and developer package', + action='store_true', default=False) return parser.parse_args() def build_qtcreator(args, paths): @@ -124,8 +128,7 @@ def build_qtcreator(args, paths): '-DPYTHON_INCLUDE_DIR=' + os.path.join(args.python_path, 'include')] # TODO this works around a CMake bug https://gitlab.kitware.com/cmake/cmake/issues/20119 - if common.is_linux_platform(): - cmake_args += ['-DBUILD_WITH_PCH=OFF'] + cmake_args += ['-DBUILD_WITH_PCH=OFF'] ide_revision = common.get_commit_SHA(paths.src) if ide_revision: @@ -191,30 +194,32 @@ def deploy_qt(args, paths): paths.build) def package_qtcreator(args, paths): - common.check_print_call(['7z', 'a', '-mmt2', os.path.join(paths.result, 'qtcreator.7z'), '*'], - paths.install) - common.check_print_call(['7z', 'a', '-mmt2', - os.path.join(paths.result, 'qtcreator_dev.7z'), '*'], - paths.dev_install) - if common.is_windows_platform(): + if not args.no_zip: + common.check_print_call(['7z', 'a', '-mmt2', os.path.join(paths.result, 'qtcreator.7z'), '*'], + paths.install) common.check_print_call(['7z', 'a', '-mmt2', - os.path.join(paths.result, 'wininterrupt.7z'), '*'], - paths.wininterrupt_install) - if not args.no_cdb: + os.path.join(paths.result, 'qtcreator_dev.7z'), '*'], + paths.dev_install) + if common.is_windows_platform(): common.check_print_call(['7z', 'a', '-mmt2', - os.path.join(paths.result, 'qtcreatorcdbext.7z'), '*'], - paths.qtcreatorcdbext_install) + os.path.join(paths.result, 'wininterrupt.7z'), '*'], + paths.wininterrupt_install) + if not args.no_cdb: + common.check_print_call(['7z', 'a', '-mmt2', + os.path.join(paths.result, 'qtcreatorcdbext.7z'), '*'], + paths.qtcreatorcdbext_install) if common.is_mac_platform(): if args.keychain_unlock_script: common.check_print_call([args.keychain_unlock_script], paths.install) - common.check_print_call(['python', '-u', - os.path.join(paths.src, 'scripts', 'makedmg.py'), - 'qt-creator.dmg', - 'Qt Creator', - paths.src, - paths.install], - paths.result) + if not args.no_dmg: + common.check_print_call(['python', '-u', + os.path.join(paths.src, 'scripts', 'makedmg.py'), + 'qt-creator.dmg', + 'Qt Creator', + paths.src, + paths.install], + paths.result) def get_paths(args): Paths = collections.namedtuple('Paths', diff --git a/scripts/build_plugin.py b/scripts/build_plugin.py new file mode 100755 index 00000000000..45c16765d3d --- /dev/null +++ b/scripts/build_plugin.py @@ -0,0 +1,130 @@ +#!/usr/bin/env python +############################################################################# +## +## Copyright (C) 2020 The Qt Company Ltd. +## Contact: https://www.qt.io/licensing/ +## +## This file is part of the release tools of the Qt Toolkit. +## +## $QT_BEGIN_LICENSE:GPL-EXCEPT$ +## 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. +## +## $QT_END_LICENSE$ +## +############################################################################# + +# import the print function which is used in python 3.x +from __future__ import print_function + +import argparse +import collections +import os + +import common + +def get_arguments(): + parser = argparse.ArgumentParser(description='Build Qt Creator for packaging') + parser.add_argument('--name', help='Name to use for build results', required=True) + parser.add_argument('--src', help='Path to sources', required=True) + parser.add_argument('--build', help='Path that should be used for building', required=True) + parser.add_argument('--qt-path', help='Path to Qt', required=True) + parser.add_argument('--qtc-path', + help='Path to Qt Creator installation including development package', + required=True) + parser.add_argument('--output-path', help='Output path for resulting 7zip files') + parser.add_argument('--add-path', help='Adds a CMAKE_PREFIX_PATH to the build', + action='append', dest='prefix_paths', default=[]) + parser.add_argument('--deploy', help='Installs the "Dependencies" component of the plugin.', + action='store_true', default=False) + parser.add_argument('--debug', help='Enable debug builds', action='store_true', default=False) + return parser.parse_args() + +def build(args, paths): + if not os.path.exists(paths.build): + os.makedirs(paths.build) + if not os.path.exists(paths.result): + os.makedirs(paths.result) + prefix_paths = [paths.qt, paths.qt_creator] + [os.path.abspath(fp) for fp in args.prefix_paths] + build_type = 'Debug' if args.debug else 'Release' + cmake_args = ['cmake', + '-DCMAKE_PREFIX_PATH=' + ';'.join(prefix_paths), + '-DCMAKE_BUILD_TYPE=' + build_type, + '-DCMAKE_INSTALL_PREFIX=' + paths.install, + '-G', 'Ninja'] + + # force MSVC on Windows, because it looks for GCC in the PATH first, + # even if MSVC is first mentioned in the PATH... + # TODO would be nicer if we only did this if cl.exe is indeed first in the PATH + if common.is_windows_platform(): + cmake_args += ['-DCMAKE_C_COMPILER=cl', + '-DCMAKE_CXX_COMPILER=cl'] + + # TODO this works around a CMake bug https://gitlab.kitware.com/cmake/cmake/issues/20119 + cmake_args += ['-DBUILD_WITH_PCH=OFF'] + + ide_revision = common.get_commit_SHA(paths.src) + if ide_revision: + cmake_args += ['-DQTC_PLUGIN_REVISION=' + ide_revision] + with open(os.path.join(paths.result, args.name + '.7z.git_sha'), 'w') as f: + f.write(ide_revision) + + common.check_print_call(cmake_args + [paths.src], paths.build) + common.check_print_call(['cmake', '--build', '.'], paths.build) + common.check_print_call(['cmake', '--install', '.', '--prefix', paths.install, '--strip'], + paths.build) + if args.deploy: + common.check_print_call(['cmake', '--install', '.', '--prefix', paths.install, + '--component', 'Dependencies'], + paths.build) + common.check_print_call(['cmake', '--install', '.', '--prefix', paths.dev_install, + '--component', 'Devel'], + paths.build) + +def package(args, paths): + if not os.path.exists(paths.result): + os.makedirs(paths.result) + common.check_print_call(['7z', 'a', '-mmt2', os.path.join(paths.result, args.name + '.7z'), '*'], + paths.install) + if os.path.exists(paths.dev_install): # some plugins might not provide anything in Devel + common.check_print_call(['7z', 'a', '-mmt2', + os.path.join(paths.result, args.name + '_dev.7z'), '*'], + paths.dev_install) + +def get_paths(args): + Paths = collections.namedtuple('Paths', + ['qt', 'src', 'build', 'qt_creator', + 'install', 'dev_install', 'result']) + build_path = os.path.abspath(args.build) + install_path = os.path.join(build_path, 'install') + result_path = os.path.abspath(args.output_path) if args.output_path else build_path + return Paths(qt=os.path.abspath(args.qt_path), + src=os.path.abspath(args.src), + build=os.path.join(build_path, 'build'), + qt_creator=os.path.abspath(args.qtc_path), + install=os.path.join(install_path, args.name), + dev_install=os.path.join(install_path, args.name + '-dev'), + result=result_path) + +def main(): + args = get_arguments() + paths = get_paths(args) + + build(args, paths) + package(args, paths) + +if __name__ == '__main__': + main() diff --git a/share/qtcreator/CMakeLists.txt b/share/qtcreator/CMakeLists.txt index 05f64cc2f15..303fb9c7d0b 100644 --- a/share/qtcreator/CMakeLists.txt +++ b/share/qtcreator/CMakeLists.txt @@ -1,25 +1,42 @@ -set(template_directories android cplusplus debugger glsl modeleditor qml qmldesigner - qmlicons qml-type-descriptions schemes scripts snippets styles templates themes welcomescreen) +set(resource_directories + android + cplusplus + debugger + glsl + indexer_preincludes + modeleditor + qml + qmldesigner + qmlicons + qml-type-descriptions + schemes + snippets + styles + templates + themes +) + +if (APPLE) + set(resource_directories ${resource_directories} scripts) +endif() add_custom_target(copy_share_to_builddir ALL COMMENT Copy files into build directory VERBATIM ) -foreach(dir IN ITEMS ${template_directories}) +# copy resource directories during build +foreach(dir IN ITEMS ${resource_directories}) add_custom_command(TARGET copy_share_to_builddir POST_BUILD COMMAND "${CMAKE_COMMAND}" -E copy_directory "${dir}" "${PROJECT_BINARY_DIR}/${IDE_DATA_PATH}/${dir}" WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - COMMENT Copy files into build directory + COMMENT Copy resource directories into build directory VERBATIM ) endforeach() -install(DIRECTORY ${template_directories} DESTINATION "${IDE_DATA_PATH}") -install( - FILES indexer_preincludes/qglobal.h indexer_preincludes/windows.h - DESTINATION "${IDE_DATA_PATH}/indexer_preincludes" -) +# create install rule for resource directories +install(DIRECTORY ${resource_directories} DESTINATION "${IDE_DATA_PATH}") add_subdirectory(translations) diff --git a/share/qtcreator/debugger/stdtypes.py b/share/qtcreator/debugger/stdtypes.py index b08b9d603de..9d5cd0029ac 100644 --- a/share/qtcreator/debugger/stdtypes.py +++ b/share/qtcreator/debugger/stdtypes.py @@ -283,7 +283,8 @@ def qdump__std__map(d, value): return # stuff is actually (color, pad) with 'I@', but we can save cycles/ - (compare, stuff, parent, left, right, size) = value.split('pppppp') + (compare, stuff, parent, left, right) = value.split('ppppp') + size = value["_M_t"]["_M_impl"]["_M_node_count"].integer() d.check(0 <= size and size <= 100 * 1000 * 1000) d.putItemCount(size) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ComboBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ComboBox.qml index b3e8fda3685..2d70e40b1d5 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ComboBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ComboBox.qml @@ -38,6 +38,10 @@ StudioControls.ComboBox { enum ValueType { String, Integer, Enum } property int valueType: ComboBox.ValueType.Enum + onModelChanged: colorLogic.invalidate() + + // This is available in all editors. + onValueTypeChanged: { if (comboBox.valueType === ComboBox.ValueType.Integer) comboBox.useInteger = true @@ -97,28 +101,34 @@ StudioControls.ComboBox { comboBox.valueFromBackendChanged() } else { switch (comboBox.valueType) { - case ComboBox.ValueType.String: - if (comboBox.currentText !== comboBox.backendValue.value) - comboBox.currentText = comboBox.backendValue.value - break - case ComboBox.ValueType.Integer: - if (comboBox.currentIndex !== comboBox.backendValue.value) - comboBox.currentIndex = comboBox.backendValue.value - break - case ComboBox.ValueType.Enum: - default: - var enumString = comboBox.backendValue.enumeration - - if (enumString === "") - enumString = comboBox.backendValue.value - - var index = comboBox.find(enumString) - + case ComboBox.ValueType.String: + if (comboBox.currentText !== comboBox.backendValue.value) { + var index = comboBox.find(comboBox.backendValue.value) if (index < 0) index = 0 if (index !== comboBox.currentIndex) comboBox.currentIndex = index + } + break + case ComboBox.ValueType.Integer: + if (comboBox.currentIndex !== comboBox.backendValue.value) + comboBox.currentIndex = comboBox.backendValue.value + break + case ComboBox.ValueType.Enum: + default: + var enumString = comboBox.backendValue.enumeration + + if (enumString === "") + enumString = comboBox.backendValue.value + + index = comboBox.find(enumString) + + if (index < 0) + index = 0 + + if (index !== comboBox.currentIndex) + comboBox.currentIndex = index } } @@ -137,15 +147,15 @@ StudioControls.ComboBox { return switch (comboBox.valueType) { - case ComboBox.ValueType.String: - comboBox.backendValue.value = comboBox.currentText - break - case ComboBox.ValueType.Integer: - comboBox.backendValue.value = comboBox.currentIndex - break - case ComboBox.ValueType.Enum: - default: - comboBox.backendValue.setEnumeration(comboBox.scope, comboBox.currentText) + case ComboBox.ValueType.String: + comboBox.backendValue.value = comboBox.currentText + break + case ComboBox.ValueType.Integer: + comboBox.backendValue.value = comboBox.currentIndex + break + case ComboBox.ValueType.Enum: + default: + comboBox.backendValue.setEnumeration(comboBox.scope, comboBox.currentText) } } diff --git a/src/libs/advanceddockingsystem/dockareawidget.cpp b/src/libs/advanceddockingsystem/dockareawidget.cpp index 16bd88f5716..6e7f9d5c993 100644 --- a/src/libs/advanceddockingsystem/dockareawidget.cpp +++ b/src/libs/advanceddockingsystem/dockareawidget.cpp @@ -215,6 +215,7 @@ namespace ADS DockManager *m_dockManager = nullptr; bool m_updateTitleBarButtons = false; DockWidgetAreas m_allowedAreas = AllDockAreas; + QSize m_minSizeHint; /** * Private data constructor @@ -264,6 +265,22 @@ namespace ADS * Udpates the enable state of the close and detach button */ void updateTitleBarButtonStates(); + + /** + * Scans all contained dock widgets for the max. minimum size hint + */ + void updateMinimumSizeHint() + { + m_minSizeHint = QSize(); + for (int i = 0; i < m_contentsLayout->count(); ++i) + { + auto widget = m_contentsLayout->widget(i); + m_minSizeHint.setHeight(qMax(m_minSizeHint.height(), + widget->minimumSizeHint().height())); + m_minSizeHint.setWidth(qMax(m_minSizeHint.width(), + widget->minimumSizeHint().width())); + } + } }; // struct DockAreaWidgetPrivate @@ -349,6 +366,10 @@ namespace ADS d->tabBar()->blockSignals(false); tabWidget->setVisible(!dockWidget->isClosed()); dockWidget->setProperty(INDEX_PROPERTY, index); + d->m_minSizeHint.setHeight(qMax(d->m_minSizeHint.height(), + dockWidget->minimumSizeHint().height())); + d->m_minSizeHint.setWidth(qMax(d->m_minSizeHint.width(), + dockWidget->minimumSizeHint().width())); if (activate) { setCurrentIndex(index); } @@ -381,6 +402,7 @@ namespace ADS d->updateTitleBarButtonStates(); updateTitleBarVisibility(); + d->updateMinimumSizeHint(); auto topLevelDockWidget = dockContainerWidget->topLevelDockWidget(); if (topLevelDockWidget) { topLevelDockWidget->emitTopLevelChanged(true); @@ -683,4 +705,9 @@ namespace ADS DockAreaTitleBar *DockAreaWidget::titleBar() const { return d->m_titleBar; } + QSize DockAreaWidget::minimumSizeHint() const + { + return d->m_minSizeHint.isValid() ? d->m_minSizeHint : Super::minimumSizeHint(); + } + } // namespace ADS diff --git a/src/libs/advanceddockingsystem/dockareawidget.h b/src/libs/advanceddockingsystem/dockareawidget.h index 9c23584ae78..74ab85c69f2 100644 --- a/src/libs/advanceddockingsystem/dockareawidget.h +++ b/src/libs/advanceddockingsystem/dockareawidget.h @@ -291,6 +291,13 @@ public: */ void closeOtherAreas(); + /** + * Returns the largest minimumSizeHint() of the dock widgets in this + * area. + * The minimum size hint is updated if a dock widget is removed or added. + */ + virtual QSize minimumSizeHint() const override; + signals: /** * This signal is emitted when user clicks on a tab at an index. diff --git a/src/libs/advanceddockingsystem/dockwidget.cpp b/src/libs/advanceddockingsystem/dockwidget.cpp index 760f425ae78..c703b0a6650 100644 --- a/src/libs/advanceddockingsystem/dockwidget.cpp +++ b/src/libs/advanceddockingsystem/dockwidget.cpp @@ -83,6 +83,7 @@ namespace ADS QSize m_toolBarIconSizeFloating = QSize(24, 24); bool m_isFloatingTopLevel = false; QList<QAction *> m_titleBarActions; + DockWidget::eMinimumSizeHintMode m_minimumSizeHintMode = DockWidget::MinimumSizeHintFromDockWidget; /** * Private data constructor @@ -317,6 +318,11 @@ namespace ADS } } + void DockWidget::setMinimumSizeHintMode(eMinimumSizeHintMode mode) + { + d->m_minimumSizeHintMode = mode; + } + void DockWidget::toggleView(bool open) { // If the toggle view action mode is ActionModeShow, then Open is always @@ -545,7 +551,13 @@ namespace ADS void DockWidget::setClosedState(bool closed) { d->m_closed = closed; } - QSize DockWidget::minimumSizeHint() const { return QSize(60, 40); } + QSize DockWidget::minimumSizeHint() const + { + if (d->m_minimumSizeHintMode == DockWidget::MinimumSizeHintFromDockWidget || !d->m_widget) + return QSize(60, 40); + else + return d->m_widget->minimumSizeHint(); + } void DockWidget::setFloating() { @@ -587,6 +599,7 @@ namespace ADS floatingWidget->hide(); } deleteDockWidget(); + emit closed(); } else { toggleView(false); } diff --git a/src/libs/advanceddockingsystem/dockwidget.h b/src/libs/advanceddockingsystem/dockwidget.h index 0d6efa28d02..687704e3653 100644 --- a/src/libs/advanceddockingsystem/dockwidget.h +++ b/src/libs/advanceddockingsystem/dockwidget.h @@ -185,6 +185,17 @@ public: enum eInsertMode { AutoScrollArea, ForceScrollArea, ForceNoScrollArea }; /** + * The mode of the minimumSizeHint() that is returned by the DockWidget + * minimumSizeHint() function. + * To ensure, that a dock widget does not block resizing, the dock widget + * reimplements minimumSizeHint() function to return a very small minimum + * size hint. If you would like to adhere the minimumSizeHint() from the + * content widget, the set the minimumSizeHintMode() to + * MinimumSizeHintFromContent. + */ + enum eMinimumSizeHintMode { MinimumSizeHintFromDockWidget, MinimumSizeHintFromContent }; + + /** * This mode configures the behavior of the toggle view action. * If the mode if ActionModeToggle, then the toggle view action is * a checkable action to show / hide the dock widget. If the mode @@ -218,7 +229,8 @@ public: virtual ~DockWidget() override; /** - * We return a fixed minimum size hint for all dock widgets + * We return a fixed minimum size hint or the size hint of the content + * widget if minimum size hint mode is MinimumSizeHintFromContent */ virtual QSize minimumSizeHint() const override; @@ -328,6 +340,13 @@ public: void setToggleViewActionMode(eToggleViewActionMode mode); /** + * Configures the minimum size hint that is returned by the + * minimumSizeHint() function. + * \see eMinimumSizeHintMode for a detailed description + */ + void setMinimumSizeHintMode(eMinimumSizeHintMode mode); + + /** * Sets the dock widget icon that is shown in tabs and in toggle view * actions */ @@ -339,13 +358,10 @@ public: QIcon icon() const; /** - * If the WithToolBar layout flag is enabled, then this function returns - * the dock widget toolbar. If the flag is disabled, the function returns - * a nullptr. * This function returns the dock widget top tool bar. * If no toolbar is assigned, this function returns nullptr. To get a valid * toolbar you either need to create a default empty toolbar via - * createDefaultToolBar() function or you need to assign you custom + * createDefaultToolBar() function or you need to assign your custom * toolbar via setToolBar(). */ QToolBar *toolBar() const; diff --git a/src/libs/advanceddockingsystem/floatingdockcontainer.cpp b/src/libs/advanceddockingsystem/floatingdockcontainer.cpp index c245dcb2066..18c70834dd7 100644 --- a/src/libs/advanceddockingsystem/floatingdockcontainer.cpp +++ b/src/libs/advanceddockingsystem/floatingdockcontainer.cpp @@ -73,6 +73,7 @@ namespace ADS QPoint m_dragStartMousePosition; DockContainerWidget *m_dropContainer = nullptr; DockAreaWidget *m_singleDockArea = nullptr; + QPoint m_dragStartPos; QWidget *m_mouseEventHandler = nullptr; FloatingWidgetTitleBar *m_titleBar = nullptr; @@ -107,25 +108,30 @@ namespace ADS q->setWindowTitle(text); } + /** + * Reflect the current dock widget title in the floating widget windowTitle() + * depending on the DockManager::FloatingContainerHasWidgetTitle flag + */ void reflectCurrentWidget(DockWidget *currentWidget) { // reflect CurrentWidget's title if configured to do so, otherwise display application name as window title - if (testConfigFlag(DockManager::FloatingContainerHasWidgetTitle)) { + if (testConfigFlag(DockManager::FloatingContainerHasWidgetTitle)) setWindowTitle(currentWidget->windowTitle()); - } else { + else setWindowTitle(QApplication::applicationDisplayName()); - } - // reflect CurrentWidget's icon if configured to do so, otherwise display application icon as window icon - QIcon CurrentWidgetIcon = currentWidget->icon(); - if (testConfigFlag(DockManager::FloatingContainerHasWidgetIcon) - && !CurrentWidgetIcon.isNull()) - { + // reflect currentWidget's icon if configured to do so, otherwise display application icon as window icon + QIcon currentWidgetIcon = currentWidget->icon(); + if (testConfigFlag(DockManager::FloatingContainerHasWidgetIcon) && !currentWidgetIcon.isNull()) q->setWindowIcon(currentWidget->icon()); - } else { + else q->setWindowIcon(QApplication::windowIcon()); - } } + + /** + * Handles escape key press when dragging around the floating widget + */ + void handleEscapeKey(); }; // class FloatingDockContainerPrivate FloatingDockContainerPrivate::FloatingDockContainerPrivate(FloatingDockContainer *parent) @@ -135,17 +141,15 @@ namespace ADS void FloatingDockContainerPrivate::titleMouseReleaseEvent() { setState(DraggingInactive); - if (!m_dropContainer) { + if (!m_dropContainer) return; - } if (m_dockManager->dockAreaOverlay()->dropAreaUnderCursor() != InvalidDockWidgetArea || m_dockManager->containerOverlay()->dropAreaUnderCursor() != InvalidDockWidgetArea) { // Resize the floating widget to the size of the highlighted drop area rectangle DockOverlay *overlay = m_dockManager->containerOverlay(); - if (!overlay->dropOverlayRect().isValid()) { + if (!overlay->dropOverlayRect().isValid()) overlay = m_dockManager->dockAreaOverlay(); - } QRect rect = overlay->dropOverlayRect(); int frameWidth = (q->frameSize().width() - q->rect().width()) / 2; @@ -165,26 +169,22 @@ namespace ADS void FloatingDockContainerPrivate::updateDropOverlays(const QPoint &globalPosition) { - if (!q->isVisible() || !m_dockManager) { + if (!q->isVisible() || !m_dockManager) return; - } auto containers = m_dockManager->dockContainers(); DockContainerWidget *topContainer = nullptr; for (auto containerWidget : containers) { - if (!containerWidget->isVisible()) { + if (!containerWidget->isVisible()) continue; - } - if (m_dockContainer == containerWidget) { + if (m_dockContainer == containerWidget) continue; - } QPoint mappedPos = containerWidget->mapFromGlobal(globalPosition); if (containerWidget->rect().contains(mappedPos)) { - if (!topContainer || containerWidget->isInFrontOf(topContainer)) { + if (!topContainer || containerWidget->isInFrontOf(topContainer)) topContainer = containerWidget; - } } } @@ -223,6 +223,14 @@ namespace ADS } } + void FloatingDockContainerPrivate::handleEscapeKey() + { + qCInfo(adsLog) << Q_FUNC_INFO; + setState(DraggingInactive); + m_dockManager->containerOverlay()->hideOverlay(); + m_dockManager->dockAreaOverlay()->hideOverlay(); + } + FloatingDockContainer::FloatingDockContainer(DockManager *dockManager) : FloatingWidgetBaseType(dockManager) , d(new FloatingDockContainerPrivate(this)) @@ -268,9 +276,8 @@ namespace ADS d->m_titleBar->enableCloseButton(isClosable()); auto dw = topLevelDockWidget(); - if (dw) { + if (dw) dw->emitTopLevelChanged(true); - } } FloatingDockContainer::FloatingDockContainer(DockWidget *dockWidget) @@ -281,17 +288,16 @@ namespace ADS d->m_titleBar->enableCloseButton(isClosable()); auto dw = topLevelDockWidget(); - if (dw) { + if (dw) dw->emitTopLevelChanged(true); - } } FloatingDockContainer::~FloatingDockContainer() { qCInfo(adsLog) << Q_FUNC_INFO; - if (d->m_dockManager) { + if (d->m_dockManager) d->m_dockManager->removeFloatingWidget(this); - } + delete d; } @@ -312,6 +318,10 @@ namespace ADS QWidget::moveEvent(event); switch (d->m_draggingState) { case DraggingMousePressed: + // TODO Is checking for windows only sufficient or has macOS also problems? + if (Utils::HostOsInfo::isWindowsHost()) + QApplication::instance()->installEventFilter(this); + d->setState(DraggingFloatingWidget); d->updateDropOverlays(QCursor::pos()); break; @@ -340,9 +350,8 @@ namespace ADS if (isClosable()) { auto dw = topLevelDockWidget(); if (dw && dw->features().testFlag(DockWidget::DockWidgetDeleteOnClose)) { - if (!dw->closeDockWidgetInternal()) { + if (!dw->closeDockWidgetInternal()) return; - } } this->hide(); @@ -352,19 +361,16 @@ namespace ADS void FloatingDockContainer::hideEvent(QHideEvent *event) { Super::hideEvent(event); - if (event->spontaneous()) { + if (event->spontaneous()) return; - } // Prevent toogleView() events during restore state - if (d->m_dockManager->isRestoringState()) { + if (d->m_dockManager->isRestoringState()) return; - } for (auto dockArea : d->m_dockContainer->openedDockAreas()) { - for (auto dockWidget : dockArea->openedDockWidgets()) { + for (auto dockWidget : dockArea->openedDockWidgets()) dockWidget->toggleView(false); - } } } @@ -379,22 +385,21 @@ namespace ADS // QEvent::NonClientAreaMouseButtonPress return the wrong mouse button // The event always returns Qt::RightButton even if the left button is clicked. // It is really great to work around the whole NonClientMouseArea bugs + + #if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 2)) - if (event->type() - == QEvent:: - NonClientAreaMouseButtonPress /*&& QGuiApplication::mouseButtons().testFlag(Qt::LeftButton)*/) { - qCInfo(adsLog) << Q_FUNC_INFO << "QEvent::NonClientAreaMouseButtonPress" - << event->type(); - d->setState(DraggingMousePressed); - } + if (event->type() == QEvent::NonClientAreaMouseButtonPress + /*&& QGuiApplication::mouseButtons().testFlag(Qt::LeftButton)*/) #else if (event->type() == QEvent::NonClientAreaMouseButtonPress - && QGuiApplication::mouseButtons().testFlag(Qt::LeftButton)) { + && QGuiApplication::mouseButtons().testFlag(Qt::LeftButton)) +#endif + { qCInfo(adsLog) << Q_FUNC_INFO << "QEvent::NonClientAreaMouseButtonPress" << event->type(); + d->m_dragStartPos = pos(); d->setState(DraggingMousePressed); } -#endif } break; case DraggingMousePressed: @@ -440,6 +445,37 @@ namespace ADS return QWidget::event(event); } + bool FloatingDockContainer::eventFilter(QObject *watched, QEvent *event) + { + Q_UNUSED(watched); + // I have not found a way to detect non client area key press events to + // handle escape key presses. On Windows, if the escape key is pressed while + // dragging around a widget, the widget position is reset to its start position + // which in turn generates a QEvent::NonClientAreaMouseButtonRelease event + // if the mouse is outside of the widget after the move to its initial position + // or a QEvent::MouseButtonRelease event, if the mouse is inside of the widget + // after the position has been reset. + // So we can install an event filter on the application to get these events + // here to properly cancel dragging and hide the overlays. + // If we are in DraggingFloatingWidget state, it means the widget + // has been dragged already but if the position is the same like + // the start position, then this is an indication that the escape + // key has been pressed. + if (event->type() == QEvent::MouseButtonRelease || event->type() == QEvent::NonClientAreaMouseButtonRelease) + { + qCInfo(adsLog) << Q_FUNC_INFO << "QEvent::MouseButtonRelease or QEvent::NonClientAreaMouseButtonRelease" + << "d->m_draggingState " << d->m_draggingState; + QApplication::instance()->removeEventFilter(this); + if (d->m_dragStartPos == pos()) + { + d->handleEscapeKey(); + return true; + } + return false; + } + return false; + } + void FloatingDockContainer::startFloating(const QPoint &dragStartMousePos, const QSize &size, eDragState dragState, diff --git a/src/libs/advanceddockingsystem/floatingdockcontainer.h b/src/libs/advanceddockingsystem/floatingdockcontainer.h index 83ca1edddeb..1b6a9d5b2f7 100644 --- a/src/libs/advanceddockingsystem/floatingdockcontainer.h +++ b/src/libs/advanceddockingsystem/floatingdockcontainer.h @@ -188,6 +188,7 @@ protected: // reimplements QWidget virtual void closeEvent(QCloseEvent *event) override; virtual void hideEvent(QHideEvent *event) override; virtual void showEvent(QShowEvent *event) override; + virtual bool eventFilter(QObject *watched, QEvent *event) override; public: using Super = QWidget; diff --git a/src/libs/clangsupport/CMakeLists.txt b/src/libs/clangsupport/CMakeLists.txt index b7e02db6457..093213147b2 100644 --- a/src/libs/clangsupport/CMakeLists.txt +++ b/src/libs/clangsupport/CMakeLists.txt @@ -8,6 +8,8 @@ add_qtc_library(ClangSupport CLANG_RESOURCE_DIR="${IDE_LIBEXEC_PATH}/clang/lib/clang/${CLANG_VERSION}/include" CLANG_BINDIR="${IDE_LIBEXEC_PATH}/clang/bin" DEFINES CLANGSUPPORT_BUILD_LIB + PUBLIC_INCLUDES + "${CMAKE_CURRENT_LIST_DIR}" SOURCES alivemessage.cpp alivemessage.h annotationsmessage.cpp annotationsmessage.h diff --git a/src/libs/modelinglib/CMakeLists.txt b/src/libs/modelinglib/CMakeLists.txt index 55c6e3a951d..db79b99ee33 100644 --- a/src/libs/modelinglib/CMakeLists.txt +++ b/src/libs/modelinglib/CMakeLists.txt @@ -3,6 +3,8 @@ add_qtc_library(Modeling DEPENDS Qt5::Widgets Utils PUBLIC_DEPENDS OptionalSvg INCLUDES qtserialization/inc + PUBLIC_INCLUDES + "${CMAKE_CURRENT_LIST_DIR}" SOURCES qmt/config/configcontroller.cpp qmt/config/configcontroller.h qmt/config/sourcepos.cpp qmt/config/sourcepos.h diff --git a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp index bcadbbf2941..f60ad90cc95 100644 --- a/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp +++ b/src/libs/qtcreatorcdbext/qtcreatorcdbextension.cpp @@ -160,7 +160,7 @@ static const CommandDescription commandDescriptions[] = { {"assign","Assigns a value to a variable in current symbol group.", "[-t token] [-h] <iname=value>\n" "-h Data are hex-encoded, binary data\n" - "-u Data are hex-encoded, UTF16 data" + "-e iname is an hex-encoded expression to be evaluated " }, {"threads","Lists threads in GDBMI format.","[-t token]"}, {"registers","Lists registers in GDBMI format","[-t token]"}, @@ -899,60 +899,77 @@ extern "C" HRESULT CALLBACK assign(CIDebugClient *client, PCSTR argsIn) ExtensionCommandContext exc(client); std::string errorMessage; - bool success = false; bool encoded = false; + bool evaluateExpression = false; int token = 0; - do { - StringList tokens = commandTokens<StringList>(argsIn, &token); - if (token == 0) // partial message - return S_OK; - - if (tokens.empty()) { - errorMessage = singleLineUsage(commandDescriptions[CmdAssign]); - break; - } - + StringList tokens = commandTokens<StringList>(argsIn, &token); + while (!tokens.empty()) { if (tokens.front() == "-h") { encoded = true; tokens.pop_front(); + continue; } - if (tokens.empty()) { - errorMessage = singleLineUsage(commandDescriptions[CmdAssign]); - break; + if (tokens.front() == "-e") { + evaluateExpression = true; + tokens.pop_front(); + continue; } + break; + }; - // Parse 'assign locals.x=5' - const std::string::size_type equalsPos = tokens.front().find('='); - if (equalsPos == std::string::npos) { - errorMessage = singleLineUsage(commandDescriptions[CmdAssign]); - break; - } - const std::string iname = tokens.front().substr(0, equalsPos); - const std::string value = tokens.front().substr(equalsPos + 1, tokens.front().size() - equalsPos - 1); - // get the symbolgroup - int currentFrame = ExtensionContext::instance().symbolGroupFrame(); - if (currentFrame < 0) { - CIDebugControl *control = ExtensionCommandContext::instance()->control(); - DEBUG_STACK_FRAME frame; - if (FAILED(control->GetStackTrace(0, 0, 0, &frame, 1, NULL))) { - errorMessage = "No current frame."; - break; + // Parse 'assign locals.x=5' + const std::string::size_type equalsPos = tokens.empty() ? std::string::npos + : tokens.front().find('='); + if (equalsPos == std::string::npos) { + errorMessage = singleLineUsage(commandDescriptions[CmdAssign]); + } else { + std::string iname = tokens.front().substr(0, equalsPos); + const std::string value = tokens.front().substr(equalsPos + 1, + tokens.front().size() - equalsPos - 1); + SymbolGroup *symGroup = nullptr; + if (evaluateExpression) { + WatchesSymbolGroup *watchesSymGroup + = ExtensionContext::instance().watchesSymbolGroup(exc.symbols(), &errorMessage); + std::string tempAssignIname = "watch.tmpassign"; + if (watchesSymGroup) { + if (watchesSymGroup->addWatch(exc.symbols(), + tempAssignIname, + stringFromHex(iname), + &errorMessage)) { + iname = tempAssignIname; + symGroup = watchesSymGroup; + } + } + } else { + // get the symbolgroup + int currentFrame = ExtensionContext::instance().symbolGroupFrame(); + if (currentFrame < 0) { + CIDebugControl *control = ExtensionCommandContext::instance()->control(); + DEBUG_STACK_FRAME frame; + if (FAILED(control->GetStackTrace(0, 0, 0, &frame, 1, NULL))) + errorMessage = "No current frame."; + else + currentFrame = frame.FrameNumber; + } + if (currentFrame >= 0) { + symGroup = ExtensionContext::instance().symbolGroup(exc.symbols(), + exc.threadId(), + currentFrame, + &errorMessage); } - currentFrame = frame.FrameNumber; } - SymbolGroup *symGroup = ExtensionContext::instance().symbolGroup(exc.symbols(), exc.threadId(), currentFrame, &errorMessage); - if (!symGroup) - break; - success = symGroup->assign(iname, encoded ? stringFromHex(value) : value, - SymbolGroupValueContext(exc.dataSpaces(), exc.symbols()), - &errorMessage); - } while (false); + if (symGroup + && symGroup->assign(iname, + encoded ? stringFromHex(value) : value, + SymbolGroupValueContext(exc.dataSpaces(), exc.symbols()), + &errorMessage)) { + ExtensionContext::instance().report('R', token, 0, "assign", "Ok"); + return S_OK; + } + } - if (success) - ExtensionContext::instance().report('R', token, 0, "assign", "Ok"); - else - ExtensionContext::instance().report('N', token, 0, "assign", errorMessage.c_str()); + ExtensionContext::instance().report('N', token, 0, "assign", errorMessage.c_str()); return S_OK; } diff --git a/src/libs/sqlite/CMakeLists.txt b/src/libs/sqlite/CMakeLists.txt index 62c8609a7af..36737ca1a28 100644 --- a/src/libs/sqlite/CMakeLists.txt +++ b/src/libs/sqlite/CMakeLists.txt @@ -4,7 +4,9 @@ add_qtc_library(Sqlite SQLITE_ENABLE_UNLOCK_NOTIFY SQLITE_ENABLE_COLUMN_METADATA BUILD_SQLITE_LIBRARY DEPENDS Qt5::Core Threads::Threads ${CMAKE_DL_LIBS} - PUBLIC_INCLUDES ../3rdparty/sqlite + PUBLIC_INCLUDES + "${CMAKE_CURRENT_LIST_DIR}" + ../3rdparty/sqlite SOURCES ../3rdparty/sqlite/sqlite3.c createtablesqlstatementbuilder.cpp createtablesqlstatementbuilder.h diff --git a/src/plugins/cpptools/doxygengenerator.cpp b/src/plugins/cpptools/doxygengenerator.cpp index 702f92e5247..398a31a8764 100644 --- a/src/plugins/cpptools/doxygengenerator.cpp +++ b/src/plugins/cpptools/doxygengenerator.cpp @@ -33,6 +33,7 @@ #include <utils/qtcassert.h> #include <QDebug> +#include <QRegularExpression> #include <QTextBlock> #include <QTextCursor> #include <QTextDocument> @@ -81,7 +82,7 @@ QString DoxygenGenerator::generate(QTextCursor cursor, const QTextCursor initialCursor = cursor; const QChar &c = cursor.document()->characterAt(cursor.position()); - if (!c.isLetter() && c != QLatin1Char('_')) + if (!c.isLetter() && c != QLatin1Char('_') && c != QLatin1Char('[')) return QString(); // Try to find what would be the declaration we are interested in. @@ -109,8 +110,12 @@ QString DoxygenGenerator::generate(QTextCursor cursor, QString declCandidate = cursor.selectedText(); - if (declCandidate.startsWith(QLatin1String("Q_INVOKABLE"))) - declCandidate = declCandidate.mid(11); + // remove attributes like [[nodiscard]] because + // Document::Ptr::parse(Document::ParseDeclaration) fails on attributes + static QRegularExpression attribute("\\[\\s*\\[.*\\]\\s*\\]"); + declCandidate.replace(attribute, ""); + + declCandidate.replace("Q_INVOKABLE", ""); declCandidate.replace(QChar::ParagraphSeparator, QLatin1Char('\n')); diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index 74115668fbe..0122d43eb3a 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -929,8 +929,15 @@ void CdbEngine::assignValueInDebugger(WatchItem *w, const QString &expr, const Q qWarning("Internal error: assignValueInDebugger: Invalid state or no stack frame."); return; } - runCommand({m_extensionCommandPrefix + "assign -h " + w->iname + '=' + toHex(value.toString()), - NoFlags}); + if (m_pythonVersion > 0x030000 && w->isWatcher()) { + runCommand({m_extensionCommandPrefix + "assign -h -e " + toHex(w->expression()) + '=' + + toHex(value.toString()), + NoFlags}); + } else { + runCommand({m_extensionCommandPrefix + "assign -h " + w->iname + '=' + toHex(value.toString()), + NoFlags}); + } + // Update all locals in case we change a union or something pointed to // that affects other variables, too. updateLocals(); diff --git a/src/plugins/debugger/simplifytype.cpp b/src/plugins/debugger/simplifytype.cpp index f8bea299f61..202756a3edb 100644 --- a/src/plugins/debugger/simplifytype.cpp +++ b/src/plugins/debugger/simplifytype.cpp @@ -118,6 +118,7 @@ QString simplifyType(const QString &typeIn) type.remove(0, 7); type.replace("short int", "short"); + type.replace("long long int", "long long"); const bool isLibCpp = type.contains("std::__1"); type.replace("std::__cxx11::", "std::"); diff --git a/src/plugins/mcusupport/mcusupportconstants.h b/src/plugins/mcusupport/mcusupportconstants.h index 88489b1196c..30d28f44df4 100644 --- a/src/plugins/mcusupport/mcusupportconstants.h +++ b/src/plugins/mcusupport/mcusupportconstants.h @@ -32,9 +32,12 @@ const char DEVICE_TYPE[] = "McuSupport.DeviceType"; const char DEVICE_ID[] = "McuSupport.Device"; const char RUNCONFIGURATION[] = "McuSupport.RunConfiguration"; const char SETTINGS_ID[] = "CC.McuSupport.Configuration"; + const char KIT_MCUTARGET_VENDOR_KEY[] = "McuSupport.McuTargetVendor"; const char KIT_MCUTARGET_MODEL_KEY[] = "McuSupport.McuTargetModel"; const char KIT_MCUTARGET_SDKVERSION_KEY[] = "McuSupport.McuTargetSdkVersion"; +const char KIT_MCUTARGET_KITVERSION_KEY[] = "McuSupport.McuTargetKitVersion"; +const char KIT_MCUTARGET_COLORDEPTH_KEY[] = "McuSupport.McuTargetColorDepth"; const char SETTINGS_GROUP[] = "McuSupport"; const char SETTINGS_KEY_PACKAGE_PREFIX[] = "Package_"; diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index ca55f08ecab..b4651ce4755 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -61,6 +61,8 @@ namespace McuSupport { namespace Internal { +static const int KIT_VERSION = 2; // Bumps up whenever details in Kit creation change + static QString packagePathFromSettings(const QString &settingsKey, const QString &defaultPath = {}) { QSettings *s = Core::ICore::settings(); @@ -319,13 +321,13 @@ QVariant McuToolChainPackage::debuggerId() const } McuTarget::McuTarget(const QString &vendor, const QString &platform, - const QVector<McuPackage *> &packages, McuToolChainPackage *toolChainPackage) + const QVector<McuPackage *> &packages, + const McuToolChainPackage *toolChainPackage) : m_vendor(vendor) , m_qulPlatform(platform) , m_packages(packages) , m_toolChainPackage(toolChainPackage) { - QTC_CHECK(m_toolChainPackage == nullptr || m_packages.contains(m_toolChainPackage)); } QString McuTarget::vendor() const @@ -338,7 +340,7 @@ QVector<McuPackage *> McuTarget::packages() const return m_packages; } -McuToolChainPackage *McuTarget::toolChainPackage() const +const McuToolChainPackage *McuTarget::toolChainPackage() const { return m_toolChainPackage; } @@ -467,16 +469,18 @@ static void setKitProperties(const QString &kitName, ProjectExplorer::Kit *k, const McuTarget* mcuTarget) { using namespace ProjectExplorer; + using namespace Constants; k->setUnexpandedDisplayName(kitName); - k->setValue(Constants::KIT_MCUTARGET_VENDOR_KEY, mcuTarget->vendor()); - k->setValue(Constants::KIT_MCUTARGET_MODEL_KEY, mcuTarget->qulPlatform()); - k->setValue(Constants::KIT_MCUTARGET_SDKVERSION_KEY, - McuSupportOptions::supportedQulVersion().toString()); + k->setValue(KIT_MCUTARGET_VENDOR_KEY, mcuTarget->vendor()); + k->setValue(KIT_MCUTARGET_MODEL_KEY, mcuTarget->qulPlatform()); + k->setValue(KIT_MCUTARGET_COLORDEPTH_KEY, mcuTarget->colorDepth()); + k->setValue(KIT_MCUTARGET_SDKVERSION_KEY, McuSupportOptions::supportedQulVersion().toString()); + k->setValue(KIT_MCUTARGET_KITVERSION_KEY, KIT_VERSION); k->setAutoDetected(true); k->makeSticky(); if (mcuTarget->toolChainPackage()->type() == McuToolChainPackage::TypeDesktop) - k->setDeviceTypeForIcon(Constants::DEVICE_TYPE); + k->setDeviceTypeForIcon(DEVICE_TYPE); QSet<Core::Id> irrelevant = { SysRootKitAspect::id(), QtSupport::QtKitAspect::id() @@ -520,7 +524,7 @@ static void setKitDevice(ProjectExplorer::Kit *k, const McuTarget* mcuTarget) } static void setKitEnvironment(ProjectExplorer::Kit *k, const McuTarget* mcuTarget, - McuPackage *qtForMCUsSdkPackage) + const McuPackage *qtForMCUsSdkPackage) { using namespace ProjectExplorer; @@ -534,18 +538,17 @@ static void setKitEnvironment(ProjectExplorer::Kit *k, const McuTarget* mcuTarge && !CMakeProjectManager::CMakeToolManager::defaultCMakeTool()->hasFileApi()) pathAdditions.append(QDir::toNativeSeparators(qtForMCUsSdkPackage->path() + "/bin")); - QVector<McuPackage *> packagesIncludingSdk; - packagesIncludingSdk.reserve(mcuTarget->packages().size() + 1); - packagesIncludingSdk.append(mcuTarget->packages()); - packagesIncludingSdk.append(qtForMCUsSdkPackage); - - for (auto package : packagesIncludingSdk) { + auto processPackage = [&pathAdditions, &changes](const McuPackage *package) { if (package->addToPath()) pathAdditions.append(QDir::toNativeSeparators(package->path())); if (!package->environmentVariableName().isEmpty()) changes.append({package->environmentVariableName(), QDir::toNativeSeparators(package->path())}); - } + }; + for (auto package : mcuTarget->packages()) + processPackage(package); + processPackage(qtForMCUsSdkPackage); + pathAdditions.append("${Path}"); pathAdditions.append(QDir::toNativeSeparators(Core::ICore::libexecPath() + "/clang/bin")); const QString path = QLatin1String(Utils::HostOsInfo().isWindowsHost() ? "Path" : "PATH"); @@ -589,7 +592,7 @@ static void setKitQtVersionOptions(ProjectExplorer::Kit *k) QtSupport::QtKitAspect::setQtVersion(k, nullptr); } -QString McuSupportOptions::kitName(const McuTarget *mcuTarget) const +QString McuSupportOptions::kitName(const McuTarget *mcuTarget) { // TODO: get version from qulSdkPackage and insert into name const QString colorDepth = mcuTarget->colorDepth() > 0 @@ -604,28 +607,52 @@ QString McuSupportOptions::kitName(const McuTarget *mcuTarget) const .arg(supportedQulVersion().toString(), targetName, colorDepth); } -QList<ProjectExplorer::Kit *> McuSupportOptions::existingKits(const McuTarget *mcuTargt) +QList<ProjectExplorer::Kit *> McuSupportOptions::existingKits(const McuTarget *mcuTarget) { using namespace ProjectExplorer; - const QString mcuTargetKitName = kitName(mcuTargt); - return Utils::filtered(KitManager::kits(), [&mcuTargetKitName](Kit *kit) { - return kit->isAutoDetected() && kit->unexpandedDisplayName() == mcuTargetKitName; + using namespace Constants; + return Utils::filtered(KitManager::kits(), [mcuTarget](Kit *kit) { + return kit->isAutoDetected() + && kit->value(KIT_MCUTARGET_KITVERSION_KEY) == KIT_VERSION + && kit->value(KIT_MCUTARGET_SDKVERSION_KEY) == + McuSupportOptions::supportedQulVersion().toString() + && (!mcuTarget || ( + kit->value(KIT_MCUTARGET_VENDOR_KEY) == mcuTarget->vendor() + && kit->value(KIT_MCUTARGET_MODEL_KEY) == mcuTarget->qulPlatform() + && kit->value(KIT_MCUTARGET_COLORDEPTH_KEY) == mcuTarget->colorDepth() + )); + }); +} + +QList<ProjectExplorer::Kit *> McuSupportOptions::outdatedKits() +{ + return Utils::filtered(ProjectExplorer::KitManager::kits(), [](ProjectExplorer::Kit *kit) { + return kit->isAutoDetected() + && !kit->value(Constants::KIT_MCUTARGET_VENDOR_KEY).isNull() + && kit->value(Constants::KIT_MCUTARGET_KITVERSION_KEY) != KIT_VERSION; }); } -ProjectExplorer::Kit *McuSupportOptions::newKit(const McuTarget *mcuTarget) +void McuSupportOptions::removeOutdatedKits() +{ + for (auto kit : McuSupportOptions::outdatedKits()) + ProjectExplorer::KitManager::deregisterKit(kit); +} + +ProjectExplorer::Kit *McuSupportOptions::newKit(const McuTarget *mcuTarget, + const McuPackage *qtForMCUsSdk) { using namespace ProjectExplorer; - const auto init = [this, mcuTarget](Kit *k) { + const auto init = [mcuTarget, qtForMCUsSdk](Kit *k) { KitGuard kitGuard(k); setKitProperties(kitName(mcuTarget), k, mcuTarget); setKitDevice(k, mcuTarget); setKitToolchains(k, mcuTarget->toolChainPackage()); setKitDebugger(k, mcuTarget->toolChainPackage()); - setKitEnvironment(k, mcuTarget, qtForMCUsSdkPackage); - setKitCMakeOptions(k, mcuTarget, qtForMCUsSdkPackage->path()); + setKitEnvironment(k, mcuTarget, qtForMCUsSdk); + setKitCMakeOptions(k, mcuTarget, qtForMCUsSdk->path()); setKitQtVersionOptions(k); k->setup(); diff --git a/src/plugins/mcusupport/mcusupportoptions.h b/src/plugins/mcusupport/mcusupportoptions.h index b87452cca5c..72d395090f6 100644 --- a/src/plugins/mcusupport/mcusupportoptions.h +++ b/src/plugins/mcusupport/mcusupportoptions.h @@ -132,11 +132,11 @@ class McuTarget : public QObject public: McuTarget(const QString &vendor, const QString &platform, const QVector<McuPackage *> &packages, - McuToolChainPackage *toolChainPackage); + const McuToolChainPackage *toolChainPackage); QString vendor() const; QVector<McuPackage *> packages() const; - McuToolChainPackage *toolChainPackage() const; + const McuToolChainPackage *toolChainPackage() const; QString qulPlatform() const; void setColorDepth(int colorDepth); int colorDepth() const; @@ -146,7 +146,7 @@ private: const QString m_vendor; const QString m_qulPlatform; const QVector<McuPackage*> m_packages; - McuToolChainPackage *m_toolChainPackage; + const McuToolChainPackage *m_toolChainPackage; int m_colorDepth = -1; }; @@ -165,10 +165,12 @@ public: void setQulDir(const Utils::FilePath &dir); static Utils::FilePath qulDirFromSettings(); - QString kitName(const McuTarget* mcuTarget) const; + static QString kitName(const McuTarget* mcuTarget); - QList<ProjectExplorer::Kit *> existingKits(const McuTarget *mcuTargt); - ProjectExplorer::Kit *newKit(const McuTarget *mcuTarget); + static QList<ProjectExplorer::Kit *> existingKits(const McuTarget *mcuTarget); + static QList<ProjectExplorer::Kit *> outdatedKits(); + static void removeOutdatedKits(); + static ProjectExplorer::Kit *newKit(const McuTarget *mcuTarget, const McuPackage *qtForMCUsSdk); void populatePackagesAndTargets(); static void registerQchFiles(); static void registerExamples(); diff --git a/src/plugins/mcusupport/mcusupportoptionspage.cpp b/src/plugins/mcusupport/mcusupportoptionspage.cpp index b7442ff5a25..87652018c6c 100644 --- a/src/plugins/mcusupport/mcusupportoptionspage.cpp +++ b/src/plugins/mcusupport/mcusupportoptionspage.cpp @@ -168,7 +168,7 @@ void McuSupportOptionsWidget::updateStatus() mcuTargetValid ? QString::fromLatin1( "A kit <b>%1</b> for the selected target can be " "generated. Press Apply to generate it.") - .arg(m_options.kitName(mcuTarget)) + .arg(McuSupportOptions::kitName(mcuTarget)) : "Provide the package paths in order to create a kit " "for your target."); } @@ -231,14 +231,15 @@ void McuSupportOptionsWidget::apply() return; McuSupportOptions::registerQchFiles(); + McuSupportOptions::removeOutdatedKits(); const McuTarget *mcuTarget = currentMcuTarget(); if (!mcuTarget) return; - for (auto existingKit : m_options.existingKits(mcuTarget)) + for (auto existingKit : McuSupportOptions::existingKits(mcuTarget)) ProjectExplorer::KitManager::deregisterKit(existingKit); - m_options.newKit(mcuTarget); + McuSupportOptions::newKit(mcuTarget, m_options.qtForMCUsSdkPackage); } void McuSupportOptionsWidget::populateMcuTargetsComboBox() @@ -246,8 +247,8 @@ void McuSupportOptionsWidget::populateMcuTargetsComboBox() m_options.populatePackagesAndTargets(); m_mcuTargetsComboBox->clear(); m_mcuTargetsComboBox->addItems( - Utils::transform<QStringList>(m_options.mcuTargets, [this](McuTarget *t){ - return m_options.kitName(t); + Utils::transform<QStringList>(m_options.mcuTargets, [](McuTarget *t) { + return McuSupportOptions::kitName(t); })); updateStatus(); } diff --git a/src/plugins/projectexplorer/projectconfigurationaspects.cpp b/src/plugins/projectexplorer/projectconfigurationaspects.cpp index ea30393eb62..d12112a9411 100644 --- a/src/plugins/projectexplorer/projectconfigurationaspects.cpp +++ b/src/plugins/projectexplorer/projectconfigurationaspects.cpp @@ -179,12 +179,12 @@ void BaseStringAspect::toMap(QVariantMap &map) const FilePath BaseStringAspect::filePath() const { - return FilePath::fromString(d->m_value); + return FilePath::fromUserInput(d->m_value); } void BaseStringAspect::setFilePath(const FilePath &val) { - setValue(val.toString()); + setValue(val.toUserOutput()); } void BaseStringAspect::setLabelText(const QString &labelText) diff --git a/src/plugins/projectexplorer/runconfigurationaspects.cpp b/src/plugins/projectexplorer/runconfigurationaspects.cpp index 4e0f573b0c7..238cd4a698a 100644 --- a/src/plugins/projectexplorer/runconfigurationaspects.cpp +++ b/src/plugins/projectexplorer/runconfigurationaspects.cpp @@ -469,7 +469,7 @@ void ExecutableAspect::setPlaceHolderText(const QString &placeHolderText) void ExecutableAspect::setExecutable(const FilePath &executable) { - m_executable.setValue(executable.toString()); + m_executable.setFilePath(executable); m_executable.setShowToolTipOnLabel(true); } diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 75a8571b818..9c32da72c41 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -6,7 +6,8 @@ add_qtc_plugin(QmlDesigner DESIGNER_CORE_LIBRARY IDE_LIBRARY_BASENAME=\"${IDE_LIBRARY_BASE_PATH}\" PUBLIC_INCLUDES - ${CMAKE_CURRENT_LIST_DIR}/designercore/include + "${CMAKE_CURRENT_LIST_DIR}" + "${CMAKE_CURRENT_LIST_DIR}/designercore/include" PLUGIN_DEPENDS Core ProjectExplorer QmlJSEditor QmakeProjectManager QmlProjectManager QtSupport TextEditor @@ -155,6 +156,7 @@ extend_qtc_plugin(QmlDesigner extend_qtc_plugin(QmlDesigner SOURCES_PREFIX ../../../share/qtcreator/qml/qmlpuppet/types + PUBLIC_INCLUDES ../../../share/qtcreator/qml/qmlpuppet/types SOURCES enumeration.h ) diff --git a/src/plugins/qmldesigner/components/componentcore/selectioncontext.cpp b/src/plugins/qmldesigner/components/componentcore/selectioncontext.cpp index 7dba86920d6..59a9454b095 100644 --- a/src/plugins/qmldesigner/components/componentcore/selectioncontext.cpp +++ b/src/plugins/qmldesigner/components/componentcore/selectioncontext.cpp @@ -78,7 +78,8 @@ QList<ModelNode> SelectionContext::selectedModelNodes() const bool SelectionContext::hasSingleSelectedModelNode() const { - return view()->hasSelectedModelNodes(); + return view()->hasSingleSelectedModelNode() + && firstSelectedModelNode().isValid(); } AbstractView *SelectionContext::view() const diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index 13230544ae5..caf0663dce7 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -103,11 +103,11 @@ ItemLibraryWidget::ItemLibraryWidget(QWidget *parent) : m_itemViewQuickWidget->rootContext()->setContextProperties( QVector<QQmlContext::PropertyPair>{ - {"itemLibraryModel", QVariant::fromValue(m_itemLibraryModel.data())}, - {"itemLibraryIconWidth", m_itemIconSize.width()}, - {"itemLibraryIconHeight", m_itemIconSize.height()}, - {"rootView", QVariant::fromValue(this)}, - {"highlightColor", Utils::StyleHelper::notTooBrightHighlightColor()} + {{"itemLibraryModel"}, QVariant::fromValue(m_itemLibraryModel.data())}, + {{"itemLibraryIconWidth"}, m_itemIconSize.width()}, + {{"itemLibraryIconHeight"}, m_itemIconSize.height()}, + {{"rootView"}, QVariant::fromValue(this)}, + {{"highlightColor"}, Utils::StyleHelper::notTooBrightHighlightColor()} } ); diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp index 320825c7629..e345052172a 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp @@ -410,6 +410,9 @@ void NavigatorView::selectedNodesChanged(const QList<ModelNode> &/*selectedNodeL void NavigatorView::updateItemSelection() { + if (!isAttached()) + return; + QItemSelection itemSelection; foreach (const ModelNode &node, selectedModelNodes()) { const QModelIndex index = indexForModelNode(node); diff --git a/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h b/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h index 6c91d4917c2..6e70169a6af 100644 --- a/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h +++ b/src/plugins/qmldesigner/designercore/include/itemlibraryinfo.h @@ -29,6 +29,7 @@ #include "propertycontainer.h" #include <QPointer> +#include <QSharedDataPointer> namespace QmlDesigner { @@ -88,7 +89,7 @@ public: void addHints(const QHash<QString, QString> &hints); private: - QExplicitlySharedDataPointer<Internal::ItemLibraryEntryData> m_data; + QSharedDataPointer<Internal::ItemLibraryEntryData> m_data; }; class QMLDESIGNERCORE_EXPORT ItemLibraryInfo : public QObject diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index 2597aacf7b0..234872d661f 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -388,6 +388,8 @@ void QmlObjectNode::destroy() } removeStateOperationsForChildren(modelNode()); + BindingProperty::deleteAllReferencesTo(modelNode()); + QmlFlowViewNode root(view()->rootModelNode()); modelNode().destroy(); diff --git a/src/plugins/qmljseditor/qmljssemantichighlighter.cpp b/src/plugins/qmljseditor/qmljssemantichighlighter.cpp index 65e9b0ca2e5..b9ef9dc7469 100644 --- a/src/plugins/qmljseditor/qmljssemantichighlighter.cpp +++ b/src/plugins/qmljseditor/qmljssemantichighlighter.cpp @@ -269,8 +269,11 @@ protected: } } - if (type != SemanticHighlighter::UnknownType) - addUse(location, type); + if (type != SemanticHighlighter::UnknownType) { + // do not add uses of length 0 - this messes up highlighting (e.g. anon functions) + if (location.length != 0) + addUse(location, type); + } } void processTypeId(UiQualifiedId *typeId) diff --git a/src/shared/designerintegrationv2/CMakeLists.txt b/src/shared/designerintegrationv2/CMakeLists.txt index 8e2520d50e7..b527260fa49 100644 --- a/src/shared/designerintegrationv2/CMakeLists.txt +++ b/src/shared/designerintegrationv2/CMakeLists.txt @@ -4,9 +4,11 @@ endif() add_qtc_library(designerintegrationv2 STATIC DEPENDS Qt5::Designer Qt5::Widgets + PUBLIC_INCLUDES + "${CMAKE_CURRENT_LIST_DIR}" SOURCES - formresizer.cpp formresizer.h - sizehandlerect.cpp sizehandlerect.h - widgethostconstants.h - widgethost.cpp widgethost.h + formresizer.cpp formresizer.h + sizehandlerect.cpp sizehandlerect.h + widgethostconstants.h + widgethost.cpp widgethost.h ) diff --git a/src/shared/help/CMakeLists.txt b/src/shared/help/CMakeLists.txt index 442911b4b88..6aa583b1542 100644 --- a/src/shared/help/CMakeLists.txt +++ b/src/shared/help/CMakeLists.txt @@ -18,6 +18,7 @@ add_qtc_library(shared_help STATIC "${PLUGIN_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/shared_help_autogen/include${autogen_suffix}" "${CMAKE_CURRENT_BINARY_DIR}/" + "${CMAKE_CURRENT_LIST_DIR}" SOURCES bookmarkdialog.ui bookmarkmanager.cpp bookmarkmanager.h diff --git a/src/tools/clangbackend/source/CMakeLists.txt b/src/tools/clangbackend/source/CMakeLists.txt index fe0ab54deb6..b071cb46b72 100644 --- a/src/tools/clangbackend/source/CMakeLists.txt +++ b/src/tools/clangbackend/source/CMakeLists.txt @@ -3,6 +3,7 @@ add_qtc_library(clangbackend_lib STATIC PUBLIC_DEFINES CLANGSUPPORT_BUILD_LIB PUBLIC_INCLUDES ${CLANG_INCLUDE_DIRS} + "${CMAKE_CURRENT_LIST_DIR}" SOURCES clangasyncjob.h clangbackend_global.h diff --git a/src/tools/clangpchmanagerbackend/source/CMakeLists.txt b/src/tools/clangpchmanagerbackend/source/CMakeLists.txt index 76973c6a21d..fd6644da235 100644 --- a/src/tools/clangpchmanagerbackend/source/CMakeLists.txt +++ b/src/tools/clangpchmanagerbackend/source/CMakeLists.txt @@ -3,6 +3,7 @@ add_qtc_library(clangpchmanagerbackend_lib STATIC PUBLIC_DEPENDS libclang PUBLIC_DEFINES CLANGSUPPORT_BUILD_LIB PUBLIC_INCLUDES + ../../clangrefactoringbackend/source ${CLANG_INCLUDE_DIRS} SOURCES builddependenciesprovider.cpp builddependenciesprovider.h diff --git a/src/tools/clangrefactoringbackend/source/CMakeLists.txt b/src/tools/clangrefactoringbackend/source/CMakeLists.txt index 420e630c886..f06ddee1cc6 100644 --- a/src/tools/clangrefactoringbackend/source/CMakeLists.txt +++ b/src/tools/clangrefactoringbackend/source/CMakeLists.txt @@ -10,6 +10,7 @@ add_qtc_library(clangrefactoringbackend_lib STATIC PUBLIC_INCLUDES ${CLANG_INCLUDE_DIRS} "../../clangpchmanagerbackend/source" + "${CMAKE_CURRENT_LIST_DIR}" SOURCES clangquery.cpp clangquery.h clangquerygatherer.cpp clangquerygatherer.h |