Merge remote-tracking branch 'origin/4.12' into qds-1.50

Change-Id: I9bc1f87c3ab4a5ff0c84efa05d22763b8a1084c3
This commit is contained in:
Tim Jenssen
2020-04-28 11:53:38 +02:00
40 changed files with 353 additions and 167 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}) file(RELATIVE_PATH include_dir_relative_path ${PROJECT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
target_include_directories(${name} target_include_directories(${name}
PRIVATE ${_arg_INCLUDES} PRIVATE
PUBLIC ${_arg_INCLUDES}
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>" "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>" "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>"
"$<INSTALL_INTERFACE:include/${include_dir_relative_path}>"
"$<INSTALL_INTERFACE:include/${include_dir_relative_path}/..>" "$<INSTALL_INTERFACE:include/${include_dir_relative_path}/..>"
) )
set_public_includes(${name} "${_arg_PUBLIC_INCLUDES}") set_public_includes(${name} "${_arg_PUBLIC_INCLUDES}")
@@ -755,10 +755,9 @@ function(add_qtc_plugin target_name)
${_arg_INCLUDES} ${_arg_INCLUDES}
"${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}"
"${CMAKE_BINARY_DIR}/src" "${CMAKE_BINARY_DIR}/src"
PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>" "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>" "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>"
"$<INSTALL_INTERFACE:include/${include_dir_relative_path}>"
"$<INSTALL_INTERFACE:include/${include_dir_relative_path}/..>" "$<INSTALL_INTERFACE:include/${include_dir_relative_path}/..>"
) )
set_public_includes(${target_name} "${_arg_PUBLIC_INCLUDES}") 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}) if (NOT IS_ABSOLUTE ${_arg_SOURCES_PREFIX})
set(_arg_SOURCES_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/${_arg_SOURCES_PREFIX}") set(_arg_SOURCES_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/${_arg_SOURCES_PREFIX}")
endif() 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}) set(_arg_SOURCES ${prefixed_sources})
endif() endif()

View File

@@ -1,9 +1,9 @@
#BINARY_ARTIFACTS_BRANCH = master #BINARY_ARTIFACTS_BRANCH = master
#PROJECT_USER_FILE_EXTENSION = .user #PROJECT_USER_FILE_EXTENSION = .user
set(IDE_VERSION "4.12.0") # The IDE version. set(IDE_VERSION "4.12.1") # The IDE version.
set(IDE_VERSION_COMPAT "4.12.0") # The IDE Compatibility version. set(IDE_VERSION_COMPAT "4.12.0") # The IDE Compatibility version.
set(IDE_VERSION_DISPLAY "4.12.0") # The IDE display version. set(IDE_VERSION_DISPLAY "4.12.1") # The IDE display version.
set(IDE_COPYRIGHT_YEAR "2020") # The IDE current copyright year. set(IDE_COPYRIGHT_YEAR "2020") # The IDE current copyright year.
set(IDE_SETTINGSVARIANT "QtProject") # The IDE settings variation. set(IDE_SETTINGSVARIANT "QtProject") # The IDE settings variation.

View File

@@ -130,8 +130,10 @@
\uicontrol {Default line endings} field. \uicontrol {Default line endings} field.
To set the line endings to use for a project, select \uicontrol Projects > To set the line endings to use for a project, select \uicontrol Projects >
\uicontrol {Project Settings} > \uicontrol Editor. For more information, \uicontrol {Project Settings} > \uicontrol Editor.
see \l {Specifying Editor Settings}. \if defined(qtcreator)
For more information, see \l {Specifying Editor Settings}.
\endif
\section1 Splitting the Editor View \section1 Splitting the Editor View

View File

@@ -53,7 +53,7 @@
To disable library linking for the current project, deselect the To disable library linking for the current project, deselect the
\uicontrol {Add build library search path to PATH} check box. To disable \uicontrol {Add build library search path to PATH} check box. To disable
library linking for all projects, select \uicontrol Tools > 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. \uicontrol {Add linker library search paths to run environment} check box.
The \uicontrol {Use debug version of frameworks (DYLD_IMAGE_SUFFIX=_debug)} option The \uicontrol {Use debug version of frameworks (DYLD_IMAGE_SUFFIX=_debug)} option

View File

@@ -26,7 +26,7 @@
/*! /*!
\contentspage index.html \contentspage index.html
\page qtquick-adding-dynamics.html \page qtquick-adding-dynamics.html
\previouspage qtquick-fonts.html \previouspage creator-quick-ui-forms.html
\nextpage studio-timeline.html \nextpage studio-timeline.html
\title Adding Dynamics \title Adding Dynamics

View File

@@ -33,7 +33,7 @@
\contentspage index.html \contentspage index.html
\page quick-components.html \page quick-components.html
\if defined(qtdesignstudio) \if defined(qtdesignstudio)
\previouspage studio-prototyping.html \previouspage quick-uis.html
\else \else
\previouspage creator-using-qt-quick-designer.html \previouspage creator-using-qt-quick-designer.html
\endif \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/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the Qt Creator documentation. ** This file is part of the Qt Creator documentation.
@@ -34,11 +34,7 @@
\contentspage index.html \contentspage index.html
\page creator-quick-ui-forms.html \page creator-quick-ui-forms.html
\previouspage qtquick-annotations.html \previouspage qtquick-annotations.html
\if defined(qtdesignstudio) \nextpage qtquick-adding-dynamics.html
\nextpage creator-live-preview.html
\else
\nextpage creator-qml-modules-with-plugins.html
\endif
\title Qt Quick UI Forms \title Qt Quick UI Forms

View File

@@ -4,10 +4,10 @@ import qbs.FileInfo
import "qtc.js" as HelperFunctions import "qtc.js" as HelperFunctions
Module { Module {
property string qtcreator_display_version: '4.12.0' property string qtcreator_display_version: '4.12.1'
property string ide_version_major: '4' property string ide_version_major: '4'
property string ide_version_minor: '12' property string ide_version_minor: '12'
property string ide_version_release: '0' property string ide_version_release: '1'
property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.' property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.'
+ ide_version_release + ide_version_release

View File

@@ -1,6 +1,6 @@
QTCREATOR_VERSION = 4.12.0 QTCREATOR_VERSION = 4.12.1
QTCREATOR_COMPAT_VERSION = 4.12.0 QTCREATOR_COMPAT_VERSION = 4.12.0
QTCREATOR_DISPLAY_VERSION = 4.12.0 QTCREATOR_DISPLAY_VERSION = 4.12.1
QTCREATOR_COPYRIGHT_YEAR = 2020 QTCREATOR_COPYRIGHT_YEAR = 2020
BINARY_ARTIFACTS_BRANCH = 4.12 BINARY_ARTIFACTS_BRANCH = 4.12

View File

@@ -1,25 +1,42 @@
set(template_directories android cplusplus debugger glsl modeleditor qml qmldesigner set(resource_directories
qmlicons qml-type-descriptions schemes scripts snippets styles templates themes welcomescreen) 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 add_custom_target(copy_share_to_builddir ALL
COMMENT Copy files into build directory COMMENT Copy files into build directory
VERBATIM 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 add_custom_command(TARGET copy_share_to_builddir POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E copy_directory "${dir}" COMMAND "${CMAKE_COMMAND}" -E copy_directory "${dir}"
"${PROJECT_BINARY_DIR}/${IDE_DATA_PATH}/${dir}" "${PROJECT_BINARY_DIR}/${IDE_DATA_PATH}/${dir}"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
COMMENT Copy files into build directory COMMENT Copy resource directories into build directory
VERBATIM VERBATIM
) )
endforeach() endforeach()
install(DIRECTORY ${template_directories} DESTINATION "${IDE_DATA_PATH}") # create install rule for resource directories
install( install(DIRECTORY ${resource_directories} DESTINATION "${IDE_DATA_PATH}")
FILES indexer_preincludes/qglobal.h indexer_preincludes/windows.h
DESTINATION "${IDE_DATA_PATH}/indexer_preincludes"
)
add_subdirectory(translations) add_subdirectory(translations)

View File

@@ -283,7 +283,8 @@ def qdump__std__map(d, value):
return return
# stuff is actually (color, pad) with 'I@', but we can save cycles/ # 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.check(0 <= size and size <= 100 * 1000 * 1000)
d.putItemCount(size) d.putItemCount(size)

View File

@@ -38,6 +38,10 @@ StudioControls.ComboBox {
enum ValueType { String, Integer, Enum } enum ValueType { String, Integer, Enum }
property int valueType: ComboBox.ValueType.Enum property int valueType: ComboBox.ValueType.Enum
onModelChanged: colorLogic.invalidate()
// This is available in all editors.
onValueTypeChanged: { onValueTypeChanged: {
if (comboBox.valueType === ComboBox.ValueType.Integer) if (comboBox.valueType === ComboBox.ValueType.Integer)
comboBox.useInteger = true comboBox.useInteger = true
@@ -97,28 +101,34 @@ StudioControls.ComboBox {
comboBox.valueFromBackendChanged() comboBox.valueFromBackendChanged()
} else { } else {
switch (comboBox.valueType) { switch (comboBox.valueType) {
case ComboBox.ValueType.String: case ComboBox.ValueType.String:
if (comboBox.currentText !== comboBox.backendValue.value) if (comboBox.currentText !== comboBox.backendValue.value) {
comboBox.currentText = comboBox.backendValue.value var index = comboBox.find(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)
if (index < 0) if (index < 0)
index = 0 index = 0
if (index !== comboBox.currentIndex) if (index !== comboBox.currentIndex)
comboBox.currentIndex = index 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 return
switch (comboBox.valueType) { switch (comboBox.valueType) {
case ComboBox.ValueType.String: case ComboBox.ValueType.String:
comboBox.backendValue.value = comboBox.currentText comboBox.backendValue.value = comboBox.currentText
break break
case ComboBox.ValueType.Integer: case ComboBox.ValueType.Integer:
comboBox.backendValue.value = comboBox.currentIndex comboBox.backendValue.value = comboBox.currentIndex
break break
case ComboBox.ValueType.Enum: case ComboBox.ValueType.Enum:
default: default:
comboBox.backendValue.setEnumeration(comboBox.scope, comboBox.currentText) comboBox.backendValue.setEnumeration(comboBox.scope, comboBox.currentText)
} }
} }

View File

@@ -215,6 +215,7 @@ namespace ADS
DockManager *m_dockManager = nullptr; DockManager *m_dockManager = nullptr;
bool m_updateTitleBarButtons = false; bool m_updateTitleBarButtons = false;
DockWidgetAreas m_allowedAreas = AllDockAreas; DockWidgetAreas m_allowedAreas = AllDockAreas;
QSize m_minSizeHint;
/** /**
* Private data constructor * Private data constructor
@@ -264,6 +265,22 @@ namespace ADS
* Udpates the enable state of the close and detach button * Udpates the enable state of the close and detach button
*/ */
void updateTitleBarButtonStates(); 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 // struct DockAreaWidgetPrivate
@@ -349,6 +366,10 @@ namespace ADS
d->tabBar()->blockSignals(false); d->tabBar()->blockSignals(false);
tabWidget->setVisible(!dockWidget->isClosed()); tabWidget->setVisible(!dockWidget->isClosed());
dockWidget->setProperty(INDEX_PROPERTY, index); 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) { if (activate) {
setCurrentIndex(index); setCurrentIndex(index);
} }
@@ -381,6 +402,7 @@ namespace ADS
d->updateTitleBarButtonStates(); d->updateTitleBarButtonStates();
updateTitleBarVisibility(); updateTitleBarVisibility();
d->updateMinimumSizeHint();
auto topLevelDockWidget = dockContainerWidget->topLevelDockWidget(); auto topLevelDockWidget = dockContainerWidget->topLevelDockWidget();
if (topLevelDockWidget) { if (topLevelDockWidget) {
topLevelDockWidget->emitTopLevelChanged(true); topLevelDockWidget->emitTopLevelChanged(true);
@@ -683,4 +705,9 @@ namespace ADS
DockAreaTitleBar *DockAreaWidget::titleBar() const { return d->m_titleBar; } DockAreaTitleBar *DockAreaWidget::titleBar() const { return d->m_titleBar; }
QSize DockAreaWidget::minimumSizeHint() const
{
return d->m_minSizeHint.isValid() ? d->m_minSizeHint : Super::minimumSizeHint();
}
} // namespace ADS } // namespace ADS

View File

@@ -291,6 +291,13 @@ public:
*/ */
void closeOtherAreas(); 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: signals:
/** /**
* This signal is emitted when user clicks on a tab at an index. * 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); QSize m_toolBarIconSizeFloating = QSize(24, 24);
bool m_isFloatingTopLevel = false; bool m_isFloatingTopLevel = false;
QList<QAction *> m_titleBarActions; QList<QAction *> m_titleBarActions;
DockWidget::eMinimumSizeHintMode m_minimumSizeHintMode = DockWidget::MinimumSizeHintFromDockWidget;
/** /**
* Private data constructor * Private data constructor
@@ -317,6 +318,11 @@ namespace ADS
} }
} }
void DockWidget::setMinimumSizeHintMode(eMinimumSizeHintMode mode)
{
d->m_minimumSizeHintMode = mode;
}
void DockWidget::toggleView(bool open) void DockWidget::toggleView(bool open)
{ {
// If the toggle view action mode is ActionModeShow, then Open is always // 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; } 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() void DockWidget::setFloating()
{ {
@@ -587,6 +599,7 @@ namespace ADS
floatingWidget->hide(); floatingWidget->hide();
} }
deleteDockWidget(); deleteDockWidget();
emit closed();
} else { } else {
toggleView(false); toggleView(false);
} }

View File

@@ -184,6 +184,17 @@ public:
*/ */
enum eInsertMode { AutoScrollArea, ForceScrollArea, ForceNoScrollArea }; 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. * This mode configures the behavior of the toggle view action.
* If the mode if ActionModeToggle, then the toggle view action is * If the mode if ActionModeToggle, then the toggle view action is
@@ -218,7 +229,8 @@ public:
virtual ~DockWidget() override; 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; virtual QSize minimumSizeHint() const override;
@@ -327,6 +339,13 @@ public:
*/ */
void setToggleViewActionMode(eToggleViewActionMode mode); 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 * Sets the dock widget icon that is shown in tabs and in toggle view
* actions * actions
@@ -339,13 +358,10 @@ public:
QIcon icon() const; 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. * This function returns the dock widget top tool bar.
* If no toolbar is assigned, this function returns nullptr. To get a valid * If no toolbar is assigned, this function returns nullptr. To get a valid
* toolbar you either need to create a default empty toolbar via * 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(). * toolbar via setToolBar().
*/ */
QToolBar *toolBar() const; QToolBar *toolBar() const;

View File

@@ -73,6 +73,7 @@ namespace ADS
QPoint m_dragStartMousePosition; QPoint m_dragStartMousePosition;
DockContainerWidget *m_dropContainer = nullptr; DockContainerWidget *m_dropContainer = nullptr;
DockAreaWidget *m_singleDockArea = nullptr; DockAreaWidget *m_singleDockArea = nullptr;
QPoint m_dragStartPos;
QWidget *m_mouseEventHandler = nullptr; QWidget *m_mouseEventHandler = nullptr;
FloatingWidgetTitleBar *m_titleBar = nullptr; FloatingWidgetTitleBar *m_titleBar = nullptr;
@@ -107,25 +108,30 @@ namespace ADS
q->setWindowTitle(text); q->setWindowTitle(text);
} }
/**
* Reflect the current dock widget title in the floating widget windowTitle()
* depending on the DockManager::FloatingContainerHasWidgetTitle flag
*/
void reflectCurrentWidget(DockWidget *currentWidget) void reflectCurrentWidget(DockWidget *currentWidget)
{ {
// reflect CurrentWidget's title if configured to do so, otherwise display application name as window title // 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()); setWindowTitle(currentWidget->windowTitle());
} else { else
setWindowTitle(QApplication::applicationDisplayName()); setWindowTitle(QApplication::applicationDisplayName());
}
// reflect CurrentWidget's icon if configured to do so, otherwise display application icon as window icon // reflect currentWidget's icon if configured to do so, otherwise display application icon as window icon
QIcon CurrentWidgetIcon = currentWidget->icon(); QIcon currentWidgetIcon = currentWidget->icon();
if (testConfigFlag(DockManager::FloatingContainerHasWidgetIcon) if (testConfigFlag(DockManager::FloatingContainerHasWidgetIcon) && !currentWidgetIcon.isNull())
&& !CurrentWidgetIcon.isNull())
{
q->setWindowIcon(currentWidget->icon()); q->setWindowIcon(currentWidget->icon());
} else { else
q->setWindowIcon(QApplication::windowIcon()); q->setWindowIcon(QApplication::windowIcon());
}
} }
/**
* Handles escape key press when dragging around the floating widget
*/
void handleEscapeKey();
}; // class FloatingDockContainerPrivate }; // class FloatingDockContainerPrivate
FloatingDockContainerPrivate::FloatingDockContainerPrivate(FloatingDockContainer *parent) FloatingDockContainerPrivate::FloatingDockContainerPrivate(FloatingDockContainer *parent)
@@ -135,17 +141,15 @@ namespace ADS
void FloatingDockContainerPrivate::titleMouseReleaseEvent() void FloatingDockContainerPrivate::titleMouseReleaseEvent()
{ {
setState(DraggingInactive); setState(DraggingInactive);
if (!m_dropContainer) { if (!m_dropContainer)
return; return;
}
if (m_dockManager->dockAreaOverlay()->dropAreaUnderCursor() != InvalidDockWidgetArea if (m_dockManager->dockAreaOverlay()->dropAreaUnderCursor() != InvalidDockWidgetArea
|| m_dockManager->containerOverlay()->dropAreaUnderCursor() != InvalidDockWidgetArea) { || m_dockManager->containerOverlay()->dropAreaUnderCursor() != InvalidDockWidgetArea) {
// Resize the floating widget to the size of the highlighted drop area rectangle // Resize the floating widget to the size of the highlighted drop area rectangle
DockOverlay *overlay = m_dockManager->containerOverlay(); DockOverlay *overlay = m_dockManager->containerOverlay();
if (!overlay->dropOverlayRect().isValid()) { if (!overlay->dropOverlayRect().isValid())
overlay = m_dockManager->dockAreaOverlay(); overlay = m_dockManager->dockAreaOverlay();
}
QRect rect = overlay->dropOverlayRect(); QRect rect = overlay->dropOverlayRect();
int frameWidth = (q->frameSize().width() - q->rect().width()) / 2; int frameWidth = (q->frameSize().width() - q->rect().width()) / 2;
@@ -165,26 +169,22 @@ namespace ADS
void FloatingDockContainerPrivate::updateDropOverlays(const QPoint &globalPosition) void FloatingDockContainerPrivate::updateDropOverlays(const QPoint &globalPosition)
{ {
if (!q->isVisible() || !m_dockManager) { if (!q->isVisible() || !m_dockManager)
return; return;
}
auto containers = m_dockManager->dockContainers(); auto containers = m_dockManager->dockContainers();
DockContainerWidget *topContainer = nullptr; DockContainerWidget *topContainer = nullptr;
for (auto containerWidget : containers) { for (auto containerWidget : containers) {
if (!containerWidget->isVisible()) { if (!containerWidget->isVisible())
continue; continue;
}
if (m_dockContainer == containerWidget) { if (m_dockContainer == containerWidget)
continue; continue;
}
QPoint mappedPos = containerWidget->mapFromGlobal(globalPosition); QPoint mappedPos = containerWidget->mapFromGlobal(globalPosition);
if (containerWidget->rect().contains(mappedPos)) { if (containerWidget->rect().contains(mappedPos)) {
if (!topContainer || containerWidget->isInFrontOf(topContainer)) { if (!topContainer || containerWidget->isInFrontOf(topContainer))
topContainer = containerWidget; 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) FloatingDockContainer::FloatingDockContainer(DockManager *dockManager)
: FloatingWidgetBaseType(dockManager) : FloatingWidgetBaseType(dockManager)
, d(new FloatingDockContainerPrivate(this)) , d(new FloatingDockContainerPrivate(this))
@@ -268,9 +276,8 @@ namespace ADS
d->m_titleBar->enableCloseButton(isClosable()); d->m_titleBar->enableCloseButton(isClosable());
auto dw = topLevelDockWidget(); auto dw = topLevelDockWidget();
if (dw) { if (dw)
dw->emitTopLevelChanged(true); dw->emitTopLevelChanged(true);
}
} }
FloatingDockContainer::FloatingDockContainer(DockWidget *dockWidget) FloatingDockContainer::FloatingDockContainer(DockWidget *dockWidget)
@@ -281,17 +288,16 @@ namespace ADS
d->m_titleBar->enableCloseButton(isClosable()); d->m_titleBar->enableCloseButton(isClosable());
auto dw = topLevelDockWidget(); auto dw = topLevelDockWidget();
if (dw) { if (dw)
dw->emitTopLevelChanged(true); dw->emitTopLevelChanged(true);
}
} }
FloatingDockContainer::~FloatingDockContainer() FloatingDockContainer::~FloatingDockContainer()
{ {
qCInfo(adsLog) << Q_FUNC_INFO; qCInfo(adsLog) << Q_FUNC_INFO;
if (d->m_dockManager) { if (d->m_dockManager)
d->m_dockManager->removeFloatingWidget(this); d->m_dockManager->removeFloatingWidget(this);
}
delete d; delete d;
} }
@@ -312,6 +318,10 @@ namespace ADS
QWidget::moveEvent(event); QWidget::moveEvent(event);
switch (d->m_draggingState) { switch (d->m_draggingState) {
case DraggingMousePressed: 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->setState(DraggingFloatingWidget);
d->updateDropOverlays(QCursor::pos()); d->updateDropOverlays(QCursor::pos());
break; break;
@@ -340,9 +350,8 @@ namespace ADS
if (isClosable()) { if (isClosable()) {
auto dw = topLevelDockWidget(); auto dw = topLevelDockWidget();
if (dw && dw->features().testFlag(DockWidget::DockWidgetDeleteOnClose)) { if (dw && dw->features().testFlag(DockWidget::DockWidgetDeleteOnClose)) {
if (!dw->closeDockWidgetInternal()) { if (!dw->closeDockWidgetInternal())
return; return;
}
} }
this->hide(); this->hide();
@@ -352,19 +361,16 @@ namespace ADS
void FloatingDockContainer::hideEvent(QHideEvent *event) void FloatingDockContainer::hideEvent(QHideEvent *event)
{ {
Super::hideEvent(event); Super::hideEvent(event);
if (event->spontaneous()) { if (event->spontaneous())
return; return;
}
// Prevent toogleView() events during restore state // Prevent toogleView() events during restore state
if (d->m_dockManager->isRestoringState()) { if (d->m_dockManager->isRestoringState())
return; return;
}
for (auto dockArea : d->m_dockContainer->openedDockAreas()) { for (auto dockArea : d->m_dockContainer->openedDockAreas()) {
for (auto dockWidget : dockArea->openedDockWidgets()) { for (auto dockWidget : dockArea->openedDockWidgets())
dockWidget->toggleView(false); dockWidget->toggleView(false);
}
} }
} }
@@ -379,22 +385,21 @@ namespace ADS
// QEvent::NonClientAreaMouseButtonPress return the wrong mouse button // QEvent::NonClientAreaMouseButtonPress return the wrong mouse button
// The event always returns Qt::RightButton even if the left button is clicked. // The event always returns Qt::RightButton even if the left button is clicked.
// It is really great to work around the whole NonClientMouseArea bugs // It is really great to work around the whole NonClientMouseArea bugs
#if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 2)) #if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 2))
if (event->type() if (event->type() == QEvent::NonClientAreaMouseButtonPress
== QEvent:: /*&& QGuiApplication::mouseButtons().testFlag(Qt::LeftButton)*/)
NonClientAreaMouseButtonPress /*&& QGuiApplication::mouseButtons().testFlag(Qt::LeftButton)*/) {
qCInfo(adsLog) << Q_FUNC_INFO << "QEvent::NonClientAreaMouseButtonPress"
<< event->type();
d->setState(DraggingMousePressed);
}
#else #else
if (event->type() == QEvent::NonClientAreaMouseButtonPress if (event->type() == QEvent::NonClientAreaMouseButtonPress
&& QGuiApplication::mouseButtons().testFlag(Qt::LeftButton)) { && QGuiApplication::mouseButtons().testFlag(Qt::LeftButton))
#endif
{
qCInfo(adsLog) << Q_FUNC_INFO << "QEvent::NonClientAreaMouseButtonPress" qCInfo(adsLog) << Q_FUNC_INFO << "QEvent::NonClientAreaMouseButtonPress"
<< event->type(); << event->type();
d->m_dragStartPos = pos();
d->setState(DraggingMousePressed); d->setState(DraggingMousePressed);
} }
#endif
} break; } break;
case DraggingMousePressed: case DraggingMousePressed:
@@ -440,6 +445,37 @@ namespace ADS
return QWidget::event(event); 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, void FloatingDockContainer::startFloating(const QPoint &dragStartMousePos,
const QSize &size, const QSize &size,
eDragState dragState, eDragState dragState,

View File

@@ -188,6 +188,7 @@ protected: // reimplements QWidget
virtual void closeEvent(QCloseEvent *event) override; virtual void closeEvent(QCloseEvent *event) override;
virtual void hideEvent(QHideEvent *event) override; virtual void hideEvent(QHideEvent *event) override;
virtual void showEvent(QShowEvent *event) override; virtual void showEvent(QShowEvent *event) override;
virtual bool eventFilter(QObject *watched, QEvent *event) override;
public: public:
using Super = QWidget; 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_RESOURCE_DIR="${IDE_LIBEXEC_PATH}/clang/lib/clang/${CLANG_VERSION}/include"
CLANG_BINDIR="${IDE_LIBEXEC_PATH}/clang/bin" CLANG_BINDIR="${IDE_LIBEXEC_PATH}/clang/bin"
DEFINES CLANGSUPPORT_BUILD_LIB DEFINES CLANGSUPPORT_BUILD_LIB
PUBLIC_INCLUDES
"${CMAKE_CURRENT_LIST_DIR}"
SOURCES SOURCES
alivemessage.cpp alivemessage.h alivemessage.cpp alivemessage.h
annotationsmessage.cpp annotationsmessage.h annotationsmessage.cpp annotationsmessage.h

View File

@@ -3,6 +3,8 @@ add_qtc_library(Modeling
DEPENDS Qt5::Widgets Utils DEPENDS Qt5::Widgets Utils
PUBLIC_DEPENDS OptionalSvg PUBLIC_DEPENDS OptionalSvg
INCLUDES qtserialization/inc INCLUDES qtserialization/inc
PUBLIC_INCLUDES
"${CMAKE_CURRENT_LIST_DIR}"
SOURCES SOURCES
qmt/config/configcontroller.cpp qmt/config/configcontroller.h qmt/config/configcontroller.cpp qmt/config/configcontroller.h
qmt/config/sourcepos.cpp qmt/config/sourcepos.h qmt/config/sourcepos.cpp qmt/config/sourcepos.h

View File

@@ -4,7 +4,9 @@ add_qtc_library(Sqlite
SQLITE_ENABLE_UNLOCK_NOTIFY SQLITE_ENABLE_COLUMN_METADATA SQLITE_ENABLE_UNLOCK_NOTIFY SQLITE_ENABLE_COLUMN_METADATA
BUILD_SQLITE_LIBRARY BUILD_SQLITE_LIBRARY
DEPENDS Qt5::Core Threads::Threads ${CMAKE_DL_LIBS} DEPENDS Qt5::Core Threads::Threads ${CMAKE_DL_LIBS}
PUBLIC_INCLUDES ../3rdparty/sqlite PUBLIC_INCLUDES
"${CMAKE_CURRENT_LIST_DIR}"
../3rdparty/sqlite
SOURCES SOURCES
../3rdparty/sqlite/sqlite3.c ../3rdparty/sqlite/sqlite3.c
createtablesqlstatementbuilder.cpp createtablesqlstatementbuilder.h createtablesqlstatementbuilder.cpp createtablesqlstatementbuilder.h

View File

@@ -33,6 +33,7 @@
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <QDebug> #include <QDebug>
#include <QRegularExpression>
#include <QTextBlock> #include <QTextBlock>
#include <QTextCursor> #include <QTextCursor>
#include <QTextDocument> #include <QTextDocument>
@@ -81,7 +82,7 @@ QString DoxygenGenerator::generate(QTextCursor cursor,
const QTextCursor initialCursor = cursor; const QTextCursor initialCursor = cursor;
const QChar &c = cursor.document()->characterAt(cursor.position()); const QChar &c = cursor.document()->characterAt(cursor.position());
if (!c.isLetter() && c != QLatin1Char('_')) if (!c.isLetter() && c != QLatin1Char('_') && c != QLatin1Char('['))
return QString(); return QString();
// Try to find what would be the declaration we are interested in. // 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(); QString declCandidate = cursor.selectedText();
if (declCandidate.startsWith(QLatin1String("Q_INVOKABLE"))) // remove attributes like [[nodiscard]] because
declCandidate = declCandidate.mid(11); // 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')); declCandidate.replace(QChar::ParagraphSeparator, QLatin1Char('\n'));

View File

@@ -118,6 +118,7 @@ QString simplifyType(const QString &typeIn)
type.remove(0, 7); type.remove(0, 7);
type.replace("short int", "short"); type.replace("short int", "short");
type.replace("long long int", "long long");
const bool isLibCpp = type.contains("std::__1"); const bool isLibCpp = type.contains("std::__1");
type.replace("std::__cxx11::", "std::"); 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 DEVICE_ID[] = "McuSupport.Device";
const char RUNCONFIGURATION[] = "McuSupport.RunConfiguration"; const char RUNCONFIGURATION[] = "McuSupport.RunConfiguration";
const char SETTINGS_ID[] = "CC.McuSupport.Configuration"; const char SETTINGS_ID[] = "CC.McuSupport.Configuration";
const char KIT_MCUTARGET_VENDOR_KEY[] = "McuSupport.McuTargetVendor"; const char KIT_MCUTARGET_VENDOR_KEY[] = "McuSupport.McuTargetVendor";
const char KIT_MCUTARGET_MODEL_KEY[] = "McuSupport.McuTargetModel"; const char KIT_MCUTARGET_MODEL_KEY[] = "McuSupport.McuTargetModel";
const char KIT_MCUTARGET_SDKVERSION_KEY[] = "McuSupport.McuTargetSdkVersion"; 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_GROUP[] = "McuSupport";
const char SETTINGS_KEY_PACKAGE_PREFIX[] = "Package_"; const char SETTINGS_KEY_PACKAGE_PREFIX[] = "Package_";

View File

@@ -61,6 +61,8 @@
namespace McuSupport { namespace McuSupport {
namespace Internal { 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 = {}) static QString packagePathFromSettings(const QString &settingsKey, const QString &defaultPath = {})
{ {
QSettings *s = Core::ICore::settings(); QSettings *s = Core::ICore::settings();
@@ -319,13 +321,13 @@ QVariant McuToolChainPackage::debuggerId() const
} }
McuTarget::McuTarget(const QString &vendor, const QString &platform, 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_vendor(vendor)
, m_qulPlatform(platform) , m_qulPlatform(platform)
, m_packages(packages) , m_packages(packages)
, m_toolChainPackage(toolChainPackage) , m_toolChainPackage(toolChainPackage)
{ {
QTC_CHECK(m_toolChainPackage == nullptr || m_packages.contains(m_toolChainPackage));
} }
QString McuTarget::vendor() const QString McuTarget::vendor() const
@@ -338,7 +340,7 @@ QVector<McuPackage *> McuTarget::packages() const
return m_packages; return m_packages;
} }
McuToolChainPackage *McuTarget::toolChainPackage() const const McuToolChainPackage *McuTarget::toolChainPackage() const
{ {
return m_toolChainPackage; return m_toolChainPackage;
} }
@@ -467,16 +469,18 @@ static void setKitProperties(const QString &kitName, ProjectExplorer::Kit *k,
const McuTarget* mcuTarget) const McuTarget* mcuTarget)
{ {
using namespace ProjectExplorer; using namespace ProjectExplorer;
using namespace Constants;
k->setUnexpandedDisplayName(kitName); k->setUnexpandedDisplayName(kitName);
k->setValue(Constants::KIT_MCUTARGET_VENDOR_KEY, mcuTarget->vendor()); k->setValue(KIT_MCUTARGET_VENDOR_KEY, mcuTarget->vendor());
k->setValue(Constants::KIT_MCUTARGET_MODEL_KEY, mcuTarget->qulPlatform()); k->setValue(KIT_MCUTARGET_MODEL_KEY, mcuTarget->qulPlatform());
k->setValue(Constants::KIT_MCUTARGET_SDKVERSION_KEY, k->setValue(KIT_MCUTARGET_COLORDEPTH_KEY, mcuTarget->colorDepth());
McuSupportOptions::supportedQulVersion().toString()); k->setValue(KIT_MCUTARGET_SDKVERSION_KEY, McuSupportOptions::supportedQulVersion().toString());
k->setValue(KIT_MCUTARGET_KITVERSION_KEY, KIT_VERSION);
k->setAutoDetected(true); k->setAutoDetected(true);
k->makeSticky(); k->makeSticky();
if (mcuTarget->toolChainPackage()->type() == McuToolChainPackage::TypeDesktop) if (mcuTarget->toolChainPackage()->type() == McuToolChainPackage::TypeDesktop)
k->setDeviceTypeForIcon(Constants::DEVICE_TYPE); k->setDeviceTypeForIcon(DEVICE_TYPE);
QSet<Core::Id> irrelevant = { QSet<Core::Id> irrelevant = {
SysRootKitAspect::id(), SysRootKitAspect::id(),
QtSupport::QtKitAspect::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, static void setKitEnvironment(ProjectExplorer::Kit *k, const McuTarget* mcuTarget,
McuPackage *qtForMCUsSdkPackage) const McuPackage *qtForMCUsSdkPackage)
{ {
using namespace ProjectExplorer; using namespace ProjectExplorer;
@@ -534,18 +538,17 @@ static void setKitEnvironment(ProjectExplorer::Kit *k, const McuTarget* mcuTarge
&& !CMakeProjectManager::CMakeToolManager::defaultCMakeTool()->hasFileApi()) && !CMakeProjectManager::CMakeToolManager::defaultCMakeTool()->hasFileApi())
pathAdditions.append(QDir::toNativeSeparators(qtForMCUsSdkPackage->path() + "/bin")); pathAdditions.append(QDir::toNativeSeparators(qtForMCUsSdkPackage->path() + "/bin"));
QVector<McuPackage *> packagesIncludingSdk; auto processPackage = [&pathAdditions, &changes](const McuPackage *package) {
packagesIncludingSdk.reserve(mcuTarget->packages().size() + 1);
packagesIncludingSdk.append(mcuTarget->packages());
packagesIncludingSdk.append(qtForMCUsSdkPackage);
for (auto package : packagesIncludingSdk) {
if (package->addToPath()) if (package->addToPath())
pathAdditions.append(QDir::toNativeSeparators(package->path())); pathAdditions.append(QDir::toNativeSeparators(package->path()));
if (!package->environmentVariableName().isEmpty()) if (!package->environmentVariableName().isEmpty())
changes.append({package->environmentVariableName(), changes.append({package->environmentVariableName(),
QDir::toNativeSeparators(package->path())}); QDir::toNativeSeparators(package->path())});
} };
for (auto package : mcuTarget->packages())
processPackage(package);
processPackage(qtForMCUsSdkPackage);
pathAdditions.append("${Path}"); pathAdditions.append("${Path}");
pathAdditions.append(QDir::toNativeSeparators(Core::ICore::libexecPath() + "/clang/bin")); pathAdditions.append(QDir::toNativeSeparators(Core::ICore::libexecPath() + "/clang/bin"));
const QString path = QLatin1String(Utils::HostOsInfo().isWindowsHost() ? "Path" : "PATH"); const QString path = QLatin1String(Utils::HostOsInfo().isWindowsHost() ? "Path" : "PATH");
@@ -589,7 +592,7 @@ static void setKitQtVersionOptions(ProjectExplorer::Kit *k)
QtSupport::QtKitAspect::setQtVersion(k, nullptr); 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 // TODO: get version from qulSdkPackage and insert into name
const QString colorDepth = mcuTarget->colorDepth() > 0 const QString colorDepth = mcuTarget->colorDepth() > 0
@@ -604,28 +607,52 @@ QString McuSupportOptions::kitName(const McuTarget *mcuTarget) const
.arg(supportedQulVersion().toString(), targetName, colorDepth); .arg(supportedQulVersion().toString(), targetName, colorDepth);
} }
QList<ProjectExplorer::Kit *> McuSupportOptions::existingKits(const McuTarget *mcuTargt) QList<ProjectExplorer::Kit *> McuSupportOptions::existingKits(const McuTarget *mcuTarget)
{ {
using namespace ProjectExplorer; using namespace ProjectExplorer;
const QString mcuTargetKitName = kitName(mcuTargt); using namespace Constants;
return Utils::filtered(KitManager::kits(), [&mcuTargetKitName](Kit *kit) { return Utils::filtered(KitManager::kits(), [mcuTarget](Kit *kit) {
return kit->isAutoDetected() && kit->unexpandedDisplayName() == mcuTargetKitName; 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; using namespace ProjectExplorer;
const auto init = [this, mcuTarget](Kit *k) { const auto init = [mcuTarget, qtForMCUsSdk](Kit *k) {
KitGuard kitGuard(k); KitGuard kitGuard(k);
setKitProperties(kitName(mcuTarget), k, mcuTarget); setKitProperties(kitName(mcuTarget), k, mcuTarget);
setKitDevice(k, mcuTarget); setKitDevice(k, mcuTarget);
setKitToolchains(k, mcuTarget->toolChainPackage()); setKitToolchains(k, mcuTarget->toolChainPackage());
setKitDebugger(k, mcuTarget->toolChainPackage()); setKitDebugger(k, mcuTarget->toolChainPackage());
setKitEnvironment(k, mcuTarget, qtForMCUsSdkPackage); setKitEnvironment(k, mcuTarget, qtForMCUsSdk);
setKitCMakeOptions(k, mcuTarget, qtForMCUsSdkPackage->path()); setKitCMakeOptions(k, mcuTarget, qtForMCUsSdk->path());
setKitQtVersionOptions(k); setKitQtVersionOptions(k);
k->setup(); k->setup();

View File

@@ -132,11 +132,11 @@ class McuTarget : public QObject
public: public:
McuTarget(const QString &vendor, const QString &platform, const QVector<McuPackage *> &packages, McuTarget(const QString &vendor, const QString &platform, const QVector<McuPackage *> &packages,
McuToolChainPackage *toolChainPackage); const McuToolChainPackage *toolChainPackage);
QString vendor() const; QString vendor() const;
QVector<McuPackage *> packages() const; QVector<McuPackage *> packages() const;
McuToolChainPackage *toolChainPackage() const; const McuToolChainPackage *toolChainPackage() const;
QString qulPlatform() const; QString qulPlatform() const;
void setColorDepth(int colorDepth); void setColorDepth(int colorDepth);
int colorDepth() const; int colorDepth() const;
@@ -146,7 +146,7 @@ private:
const QString m_vendor; const QString m_vendor;
const QString m_qulPlatform; const QString m_qulPlatform;
const QVector<McuPackage*> m_packages; const QVector<McuPackage*> m_packages;
McuToolChainPackage *m_toolChainPackage; const McuToolChainPackage *m_toolChainPackage;
int m_colorDepth = -1; int m_colorDepth = -1;
}; };
@@ -165,10 +165,12 @@ public:
void setQulDir(const Utils::FilePath &dir); void setQulDir(const Utils::FilePath &dir);
static Utils::FilePath qulDirFromSettings(); static Utils::FilePath qulDirFromSettings();
QString kitName(const McuTarget* mcuTarget) const; static QString kitName(const McuTarget* mcuTarget);
QList<ProjectExplorer::Kit *> existingKits(const McuTarget *mcuTargt); static QList<ProjectExplorer::Kit *> existingKits(const McuTarget *mcuTarget);
ProjectExplorer::Kit *newKit(const McuTarget *mcuTarget); static QList<ProjectExplorer::Kit *> outdatedKits();
static void removeOutdatedKits();
static ProjectExplorer::Kit *newKit(const McuTarget *mcuTarget, const McuPackage *qtForMCUsSdk);
void populatePackagesAndTargets(); void populatePackagesAndTargets();
static void registerQchFiles(); static void registerQchFiles();
static void registerExamples(); static void registerExamples();

View File

@@ -168,7 +168,7 @@ void McuSupportOptionsWidget::updateStatus()
mcuTargetValid ? QString::fromLatin1( mcuTargetValid ? QString::fromLatin1(
"A kit <b>%1</b> for the selected target can be " "A kit <b>%1</b> for the selected target can be "
"generated. Press Apply to generate it.") "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 " : "Provide the package paths in order to create a kit "
"for your target."); "for your target.");
} }
@@ -231,14 +231,15 @@ void McuSupportOptionsWidget::apply()
return; return;
McuSupportOptions::registerQchFiles(); McuSupportOptions::registerQchFiles();
McuSupportOptions::removeOutdatedKits();
const McuTarget *mcuTarget = currentMcuTarget(); const McuTarget *mcuTarget = currentMcuTarget();
if (!mcuTarget) if (!mcuTarget)
return; return;
for (auto existingKit : m_options.existingKits(mcuTarget)) for (auto existingKit : McuSupportOptions::existingKits(mcuTarget))
ProjectExplorer::KitManager::deregisterKit(existingKit); ProjectExplorer::KitManager::deregisterKit(existingKit);
m_options.newKit(mcuTarget); McuSupportOptions::newKit(mcuTarget, m_options.qtForMCUsSdkPackage);
} }
void McuSupportOptionsWidget::populateMcuTargetsComboBox() void McuSupportOptionsWidget::populateMcuTargetsComboBox()
@@ -246,8 +247,8 @@ void McuSupportOptionsWidget::populateMcuTargetsComboBox()
m_options.populatePackagesAndTargets(); m_options.populatePackagesAndTargets();
m_mcuTargetsComboBox->clear(); m_mcuTargetsComboBox->clear();
m_mcuTargetsComboBox->addItems( m_mcuTargetsComboBox->addItems(
Utils::transform<QStringList>(m_options.mcuTargets, [this](McuTarget *t){ Utils::transform<QStringList>(m_options.mcuTargets, [](McuTarget *t) {
return m_options.kitName(t); return McuSupportOptions::kitName(t);
})); }));
updateStatus(); updateStatus();
} }

View File

@@ -178,12 +178,12 @@ void BaseStringAspect::toMap(QVariantMap &map) const
FilePath BaseStringAspect::filePath() const FilePath BaseStringAspect::filePath() const
{ {
return FilePath::fromString(d->m_value); return FilePath::fromUserInput(d->m_value);
} }
void BaseStringAspect::setFilePath(const FilePath &val) void BaseStringAspect::setFilePath(const FilePath &val)
{ {
setValue(val.toString()); setValue(val.toUserOutput());
} }
void BaseStringAspect::setLabelText(const QString &labelText) void BaseStringAspect::setLabelText(const QString &labelText)

View File

@@ -469,7 +469,7 @@ void ExecutableAspect::setPlaceHolderText(const QString &placeHolderText)
void ExecutableAspect::setExecutable(const FilePath &executable) void ExecutableAspect::setExecutable(const FilePath &executable)
{ {
m_executable.setValue(executable.toString()); m_executable.setFilePath(executable);
m_executable.setShowToolTipOnLabel(true); m_executable.setShowToolTipOnLabel(true);
} }

View File

@@ -6,7 +6,8 @@ add_qtc_plugin(QmlDesigner
DESIGNER_CORE_LIBRARY DESIGNER_CORE_LIBRARY
IDE_LIBRARY_BASENAME=\"${IDE_LIBRARY_BASE_PATH}\" IDE_LIBRARY_BASENAME=\"${IDE_LIBRARY_BASE_PATH}\"
PUBLIC_INCLUDES PUBLIC_INCLUDES
${CMAKE_CURRENT_LIST_DIR}/designercore/include "${CMAKE_CURRENT_LIST_DIR}"
"${CMAKE_CURRENT_LIST_DIR}/designercore/include"
PLUGIN_DEPENDS PLUGIN_DEPENDS
Core ProjectExplorer QmlJSEditor QmakeProjectManager QmlProjectManager Core ProjectExplorer QmlJSEditor QmakeProjectManager QmlProjectManager
QtSupport TextEditor QtSupport TextEditor
@@ -155,6 +156,7 @@ extend_qtc_plugin(QmlDesigner
extend_qtc_plugin(QmlDesigner extend_qtc_plugin(QmlDesigner
SOURCES_PREFIX ../../../share/qtcreator/qml/qmlpuppet/types SOURCES_PREFIX ../../../share/qtcreator/qml/qmlpuppet/types
PUBLIC_INCLUDES ../../../share/qtcreator/qml/qmlpuppet/types
SOURCES enumeration.h SOURCES enumeration.h
) )

View File

@@ -78,7 +78,8 @@ QList<ModelNode> SelectionContext::selectedModelNodes() const
bool SelectionContext::hasSingleSelectedModelNode() const bool SelectionContext::hasSingleSelectedModelNode() const
{ {
return view()->hasSelectedModelNodes(); return view()->hasSingleSelectedModelNode()
&& firstSelectedModelNode().isValid();
} }
AbstractView *SelectionContext::view() const AbstractView *SelectionContext::view() const

View File

@@ -103,11 +103,11 @@ ItemLibraryWidget::ItemLibraryWidget(QWidget *parent) :
m_itemViewQuickWidget->rootContext()->setContextProperties( m_itemViewQuickWidget->rootContext()->setContextProperties(
QVector<QQmlContext::PropertyPair>{ QVector<QQmlContext::PropertyPair>{
{"itemLibraryModel", QVariant::fromValue(m_itemLibraryModel.data())}, {{"itemLibraryModel"}, QVariant::fromValue(m_itemLibraryModel.data())},
{"itemLibraryIconWidth", m_itemIconSize.width()}, {{"itemLibraryIconWidth"}, m_itemIconSize.width()},
{"itemLibraryIconHeight", m_itemIconSize.height()}, {{"itemLibraryIconHeight"}, m_itemIconSize.height()},
{"rootView", QVariant::fromValue(this)}, {{"rootView"}, QVariant::fromValue(this)},
{"highlightColor", Utils::StyleHelper::notTooBrightHighlightColor()} {{"highlightColor"}, Utils::StyleHelper::notTooBrightHighlightColor()}
} }
); );

View File

@@ -421,6 +421,9 @@ void NavigatorView::selectedNodesChanged(const QList<ModelNode> &/*selectedNodeL
void NavigatorView::updateItemSelection() void NavigatorView::updateItemSelection()
{ {
if (!isAttached())
return;
QItemSelection itemSelection; QItemSelection itemSelection;
foreach (const ModelNode &node, selectedModelNodes()) { foreach (const ModelNode &node, selectedModelNodes()) {
const QModelIndex index = indexForModelNode(node); const QModelIndex index = indexForModelNode(node);

View File

@@ -29,6 +29,7 @@
#include "propertycontainer.h" #include "propertycontainer.h"
#include <QPointer> #include <QPointer>
#include <QSharedDataPointer>
namespace QmlDesigner { namespace QmlDesigner {
@@ -88,7 +89,7 @@ public:
void addHints(const QHash<QString, QString> &hints); void addHints(const QHash<QString, QString> &hints);
private: private:
QExplicitlySharedDataPointer<Internal::ItemLibraryEntryData> m_data; QSharedDataPointer<Internal::ItemLibraryEntryData> m_data;
}; };
class QMLDESIGNERCORE_EXPORT ItemLibraryInfo : public QObject class QMLDESIGNERCORE_EXPORT ItemLibraryInfo : public QObject

View File

@@ -269,8 +269,11 @@ protected:
} }
} }
if (type != SemanticHighlighter::UnknownType) if (type != SemanticHighlighter::UnknownType) {
addUse(location, type); // 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) void processTypeId(UiQualifiedId *typeId)

View File

@@ -4,9 +4,11 @@ endif()
add_qtc_library(designerintegrationv2 STATIC add_qtc_library(designerintegrationv2 STATIC
DEPENDS Qt5::Designer Qt5::Widgets DEPENDS Qt5::Designer Qt5::Widgets
PUBLIC_INCLUDES
"${CMAKE_CURRENT_LIST_DIR}"
SOURCES SOURCES
formresizer.cpp formresizer.h formresizer.cpp formresizer.h
sizehandlerect.cpp sizehandlerect.h sizehandlerect.cpp sizehandlerect.h
widgethostconstants.h widgethostconstants.h
widgethost.cpp widgethost.h widgethost.cpp widgethost.h
) )

View File

@@ -18,6 +18,7 @@ add_qtc_library(shared_help STATIC
"${PLUGIN_SOURCE_DIR}" "${PLUGIN_SOURCE_DIR}"
"${CMAKE_CURRENT_BINARY_DIR}/shared_help_autogen/include${autogen_suffix}" "${CMAKE_CURRENT_BINARY_DIR}/shared_help_autogen/include${autogen_suffix}"
"${CMAKE_CURRENT_BINARY_DIR}/" "${CMAKE_CURRENT_BINARY_DIR}/"
"${CMAKE_CURRENT_LIST_DIR}"
SOURCES SOURCES
bookmarkdialog.ui bookmarkdialog.ui
bookmarkmanager.cpp bookmarkmanager.h bookmarkmanager.cpp bookmarkmanager.h

View File

@@ -3,6 +3,7 @@ add_qtc_library(clangbackend_lib STATIC
PUBLIC_DEFINES CLANGSUPPORT_BUILD_LIB PUBLIC_DEFINES CLANGSUPPORT_BUILD_LIB
PUBLIC_INCLUDES PUBLIC_INCLUDES
${CLANG_INCLUDE_DIRS} ${CLANG_INCLUDE_DIRS}
"${CMAKE_CURRENT_LIST_DIR}"
SOURCES SOURCES
clangasyncjob.h clangasyncjob.h
clangbackend_global.h clangbackend_global.h

View File

@@ -3,6 +3,7 @@ add_qtc_library(clangpchmanagerbackend_lib STATIC
PUBLIC_DEPENDS libclang PUBLIC_DEPENDS libclang
PUBLIC_DEFINES CLANGSUPPORT_BUILD_LIB PUBLIC_DEFINES CLANGSUPPORT_BUILD_LIB
PUBLIC_INCLUDES PUBLIC_INCLUDES
../../clangrefactoringbackend/source
${CLANG_INCLUDE_DIRS} ${CLANG_INCLUDE_DIRS}
SOURCES SOURCES
builddependenciesprovider.cpp builddependenciesprovider.h builddependenciesprovider.cpp builddependenciesprovider.h

View File

@@ -10,6 +10,7 @@ add_qtc_library(clangrefactoringbackend_lib STATIC
PUBLIC_INCLUDES PUBLIC_INCLUDES
${CLANG_INCLUDE_DIRS} ${CLANG_INCLUDE_DIRS}
"../../clangpchmanagerbackend/source" "../../clangpchmanagerbackend/source"
"${CMAKE_CURRENT_LIST_DIR}"
SOURCES SOURCES
clangquery.cpp clangquery.h clangquery.cpp clangquery.h
clangquerygatherer.cpp clangquerygatherer.h clangquerygatherer.cpp clangquerygatherer.h