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
This commit is contained in:
Eike Ziller
2020-04-28 15:48:36 +02:00
42 changed files with 573 additions and 226 deletions

View File

@@ -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()

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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,7 +128,6 @@ 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']
ide_revision = common.get_commit_SHA(paths.src)
@@ -191,6 +194,7 @@ def deploy_qt(args, paths):
paths.build)
def package_qtcreator(args, paths):
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',
@@ -208,6 +212,7 @@ def package_qtcreator(args, paths):
if common.is_mac_platform():
if args.keychain_unlock_script:
common.check_print_call([args.keychain_unlock_script], paths.install)
if not args.no_dmg:
common.check_print_call(['python', '-u',
os.path.join(paths.src, 'scripts', 'makedmg.py'),
'qt-creator.dmg',

130
scripts/build_plugin.py Executable file
View File

@@ -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()

View File

@@ -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)

View File

@@ -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)

View File

@@ -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
@@ -98,8 +102,14 @@ StudioControls.ComboBox {
} else {
switch (comboBox.valueType) {
case ComboBox.ValueType.String:
if (comboBox.currentText !== comboBox.backendValue.value)
comboBox.currentText = comboBox.backendValue.value
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)
@@ -112,7 +122,7 @@ StudioControls.ComboBox {
if (enumString === "")
enumString = comboBox.backendValue.value
var index = comboBox.find(enumString)
index = comboBox.find(enumString)
if (index < 0)
index = 0

View File

@@ -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

View File

@@ -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.

View File

@@ -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);
}

View File

@@ -184,6 +184,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
@@ -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;
@@ -327,6 +339,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;

View File

@@ -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,28 +169,24 @@ 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;
}
}
}
m_dropContainer = topContainer;
auto containerOverlay = m_dockManager->containerOverlay();
@@ -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,10 +276,9 @@ namespace ADS
d->m_titleBar->enableCloseButton(isClosable());
auto dw = topLevelDockWidget();
if (dw) {
if (dw)
dw->emitTopLevelChanged(true);
}
}
FloatingDockContainer::FloatingDockContainer(DockWidget *dockWidget)
: FloatingDockContainer(dockWidget->dockManager())
@@ -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,10 +350,9 @@ namespace ADS
if (isClosable()) {
auto dw = topLevelDockWidget();
if (dw && dw->features().testFlag(DockWidget::DockWidgetDeleteOnClose)) {
if (!dw->closeDockWidgetInternal()) {
if (!dw->closeDockWidgetInternal())
return;
}
}
this->hide();
}
@@ -352,21 +361,18 @@ 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);
}
}
}
void FloatingDockContainer::showEvent(QShowEvent *event) { Super::showEvent(event); }
@@ -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,

View File

@@ -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;

View File

@@ -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

View File

@@ -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

View File

@@ -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,59 +899,76 @@ 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;
}
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('=');
const std::string::size_type equalsPos = tokens.empty() ? std::string::npos
: tokens.front().find('=');
if (equalsPos == std::string::npos) {
errorMessage = singleLineUsage(commandDescriptions[CmdAssign]);
break;
} 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;
}
const std::string iname = tokens.front().substr(0, equalsPos);
const std::string value = tokens.front().substr(equalsPos + 1, tokens.front().size() - equalsPos - 1);
}
} 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))) {
if (FAILED(control->GetStackTrace(0, 0, 0, &frame, 1, NULL)))
errorMessage = "No current frame.";
break;
}
else
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()),
if (currentFrame >= 0) {
symGroup = ExtensionContext::instance().symbolGroup(exc.symbols(),
exc.threadId(),
currentFrame,
&errorMessage);
} while (false);
if (success)
}
}
if (symGroup
&& symGroup->assign(iname,
encoded ? stringFromHex(value) : value,
SymbolGroupValueContext(exc.dataSpaces(), exc.symbols()),
&errorMessage)) {
ExtensionContext::instance().report('R', token, 0, "assign", "Ok");
else
return S_OK;
}
}
ExtensionContext::instance().report('N', token, 0, "assign", errorMessage.c_str());
return S_OK;
}

View File

@@ -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

View File

@@ -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'));

View File

@@ -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;
}
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();

View File

@@ -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::");

View File

@@ -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_";

View File

@@ -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()
));
});
}
ProjectExplorer::Kit *McuSupportOptions::newKit(const McuTarget *mcuTarget)
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;
});
}
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();

View File

@@ -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();

View File

@@ -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();
}

View File

@@ -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)

View File

@@ -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);
}

View File

@@ -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
)

View File

@@ -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

View File

@@ -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()}
}
);

View File

@@ -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);

View File

@@ -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

View File

@@ -388,6 +388,8 @@ void QmlObjectNode::destroy()
}
removeStateOperationsForChildren(modelNode());
BindingProperty::deleteAllReferencesTo(modelNode());
QmlFlowViewNode root(view()->rootModelNode());
modelNode().destroy();

View File

@@ -269,9 +269,12 @@ protected:
}
}
if (type != SemanticHighlighter::UnknownType)
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)
{

View File

@@ -4,6 +4,8 @@ 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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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