Merge remote-tracking branch 'origin/4.10'

Conflicts:
	src/plugins/baremetal/iarewtoolchain.cpp

Change-Id: I483e81d7e920e724fb7cde84a8f6fa9bce4cd518
This commit is contained in:
Eike Ziller
2019-07-25 09:38:09 +02:00
60 changed files with 227 additions and 257 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 260 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 125 KiB

View File

@@ -282,7 +282,14 @@
Note that functions used in the expressions are called each time, even if Note that functions used in the expressions are called each time, even if
they have side-effects. they have side-effects.
All backends support simple C and C++ expressions. Functions can be called The QML debugger can evaluate JavaScript expressions.
//! [debugger-expressions]
//! [debugger-expressions-cpp]
GDB, LLDB and CDB support the evaluation of simple C and C++ expressions.
Functions can be called
only if they are actually compiled into the debugged executable or a library only if they are actually compiled into the debugged executable or a library
used by the executable. Most notably, inlined functions such as most used by the executable. Most notably, inlined functions such as most
\c{operator[]} implementations of standard containers are typically \e{not} \c{operator[]} implementations of standard containers are typically \e{not}
@@ -318,6 +325,14 @@
however, can be recognized as such. however, can be recognized as such.
\endtable \endtable
\note The set of evaluated expressions is saved in your session.
//! [debugger-expressions-cpp]
//! [debugger-qt-basic-objects]
\section1 Inspecting Basic Qt Objects
The \uicontrol {Locals} and \uicontrol {Expressions} views also provide access The \uicontrol {Locals} and \uicontrol {Expressions} views also provide access
to the most powerful feature of the debugger: comprehensive display of data to the most powerful feature of the debugger: comprehensive display of data
belonging to Qt's basic objects. For example, in case of QObject, instead of belonging to Qt's basic objects. For example, in case of QObject, instead of
@@ -327,7 +342,7 @@
Similarly, instead of displaying many pointers and integers, \QC's debugger Similarly, instead of displaying many pointers and integers, \QC's debugger
displays the contents of a QHash or QMap in an orderly manner. Also, the displays the contents of a QHash or QMap in an orderly manner. Also, the
debugger displays access data for QFileInfo and provides access to the debugger displays access data for QFileInfo and provides access to the
"real" contents of QVariant. \e real contents of QVariant.
Right-click in the \uicontrol {Locals} or the \uicontrol {Expressions} view Right-click in the \uicontrol {Locals} or the \uicontrol {Expressions} view
to open a context menu that provides additional options for viewing data. The to open a context menu that provides additional options for viewing data. The
@@ -354,8 +369,5 @@
You can enable tooltips in the main editor displaying this information. You can enable tooltips in the main editor displaying this information.
For more information, see \l{Showing Tooltips in Debug Mode}. For more information, see \l{Showing Tooltips in Debug Mode}.
\note The set of evaluated expressions is saved in your session. //! [debugger-qt-basic-objects]
//! [debugger-expressions]
*/ */

View File

@@ -588,6 +588,8 @@
\include creator-debugger-common.qdocinc debugger-call-stack-trace \include creator-debugger-common.qdocinc debugger-call-stack-trace
\include creator-debugger-common.qdocinc debugger-locals \include creator-debugger-common.qdocinc debugger-locals
\include creator-debugger-common.qdocinc debugger-expressions \include creator-debugger-common.qdocinc debugger-expressions
\include creator-debugger-common.qdocinc debugger-expressions-cpp
\include creator-debugger-common.qdocinc debugger-qt-basic-objects
\section1 Directly Interacting with Native Debuggers \section1 Directly Interacting with Native Debuggers

View File

@@ -87,7 +87,7 @@
\image qtquick-example-stack.png \image qtquick-example-stack.png
\li Examine the local variables in the \uicontrol {Locals and Expressions} \li Examine the local variables in the \uicontrol Locals
view. Step through the code to see how the information changes in view. Step through the code to see how the information changes in
the view. the view.
@@ -105,8 +105,8 @@
\li To remove a breakpoint, right-click it and select \li To remove a breakpoint, right-click it and select
\uicontrol {Delete Breakpoint}. \uicontrol {Delete Breakpoint}.
\li Select the \uicontrol {Locals and Expressions} tab to explore the object \li In the \uicontrol Locals view, explore the object structure at
structure at runtime: runtime.
\image qtquick-example-qml-inspector.png \image qtquick-example-qml-inspector.png
@@ -115,11 +115,11 @@
\li Select \uicontrol Debug > \uicontrol Select to activate selection \li Select \uicontrol Debug > \uicontrol Select to activate selection
mode and then click the \uicontrol Menu button to move into the mode and then click the \uicontrol Menu button to move into the
\uicontrol menuButton component in the \uicontrol menuButton component in the \uicontrol Locals view and
\uicontrol {Locals and Expressions} view and the code editor. the code editor.
\li In the \uicontrol {Locals and Expressions} view, double-click the \li In the \uicontrol Locals view, double-click the value of a property
value of a property to change it. to change it.
\endlist \endlist

View File

@@ -162,7 +162,7 @@
\li \l{Local Variables and Function Parameters} \li \l{Local Variables and Function Parameters}
{Viewing local variables and function parameters} {Viewing local variables and function parameters}
\li \l{Inspecting Items}{Evaluating expressions at runtime} \li \l{Evaluating Expressions}
\endlist \endlist
@@ -170,20 +170,21 @@
\include creator-debugger-common.qdocinc debugger-breakpoints \include creator-debugger-common.qdocinc debugger-breakpoints
\include creator-debugger-common.qdocinc debugger-call-stack-trace \include creator-debugger-common.qdocinc debugger-call-stack-trace
\include creator-debugger-common.qdocinc debugger-locals \include creator-debugger-common.qdocinc debugger-locals
\include creator-debugger-common.qdocinc debugger-expressions
\endif \endif
\section1 Inspecting Items \section1 Inspecting Items
While the application is running, you can use the \uicontrol {Locals} While the application is running, you can use the \uicontrol {Locals}
and \uicontrol{Expressions} views to explore the QML item structure. view to explore the QML item structure.
\image qml-observer-view.png "QML item tree" \image qml-observer-view.png "QML item tree"
To keep the application visible while you interact with the debugger, select To keep the application visible while you interact with the debugger, select
\uicontrol Debug > \uicontrol {Show Application on Top}. \uicontrol Debug > \uicontrol {Show Application on Top}.
You can view a QML item in \uicontrol {Locals} and \uicontrol {Expressions} You can view a QML item in the \uicontrol {Locals} view in the following
in the following ways: ways:
\list \list

View File

@@ -5,6 +5,7 @@ session, too.
With With
python import sys
python sys.path.insert(1, '<path/to/qtcreator>/share/qtcreator/debugger/') python sys.path.insert(1, '<path/to/qtcreator>/share/qtcreator/debugger/')
python from gdbbridge import * python from gdbbridge import *

View File

@@ -191,10 +191,19 @@ def qdump__CPlusPlus__Internal__Value(d, value):
d.putValue(value["l"]) d.putValue(value["l"])
d.putPlainChildren(value) d.putPlainChildren(value)
def qdump__Utils__FileName(d, value): def qdump__Utils__FilePath(d, value):
d.putStringValue(value) try:
if not d.extractPointer(value["m_url"]): # there is no valid URL
d.putStringValue(value["m_data"])
else:
d.putItem(value["m_url"])
except:
d.putStringValue(value) # support FileName before 4.10 as well
d.putPlainChildren(value) d.putPlainChildren(value)
def qdump__Utils__FileName(d, value):
qdump__Utils__FilePath(d, value)
def qdump__Utils__ElfSection(d, value): def qdump__Utils__ElfSection(d, value):
d.putByteArrayValue(value["name"]) d.putByteArrayValue(value["name"])
d.putPlainChildren(value) d.putPlainChildren(value)

View File

@@ -1230,12 +1230,28 @@ class DumperBase:
ns = self.qtNamespace() ns = self.qtNamespace()
if len(ns) > 0 and typeName.startswith(ns): if len(ns) > 0 and typeName.startswith(ns):
typeName = typeName[len(ns):] typeName = typeName[len(ns):]
pos = typeName.find('<') # warn( 'stripping %s' % typeName )
# FIXME: make it recognize foo<A>::bar<B>::iterator? lvl = 0
while pos != -1: pos = None
pos1 = typeName.rfind('>', pos) stripChunks = []
typeName = typeName[0:pos] + typeName[pos1+1:] sz = len(typeName)
pos = typeName.find('<') for index in range(0, sz):
s = typeName[index]
if s == '<':
lvl += 1
if lvl == 1:
pos = index
continue
elif s == '>':
lvl -= 1
if lvl < 0 :
error("Unbalanced '<' in type, @index %d" % index)
if lvl == 0:
stripChunks.append((pos, index+1))
if lvl != 0:
error("unbalanced at end of type name")
for (f, l) in reversed(stripChunks):
typeName = typeName[:f] + typeName[l:]
return typeName return typeName
def tryPutPrettyItem(self, typeName, value): def tryPutPrettyItem(self, typeName, value):

View File

@@ -34,6 +34,7 @@ import string
import inspect import inspect
import traceback import traceback
import fnmatch import fnmatch
import platform
class QuitException(Exception): class QuitException(Exception):
@@ -278,6 +279,8 @@ class QtcInternalDumper:
if not canonic: if not canonic:
canonic = os.path.abspath(filename) canonic = os.path.abspath(filename)
canonic = os.path.normcase(canonic) canonic = os.path.normcase(canonic)
if platform.system() in ('Microsoft', 'Windows'):
canonic = canonic.replace('\\', '/')
self.fncache[filename] = canonic self.fncache[filename] = canonic
return canonic return canonic

View File

@@ -1207,7 +1207,7 @@ def qdump__QObjectPrivate__ConnectionList(d, value):
with Children(d): with Children(d):
first, last = value.split('pp') first, last = value.split('pp')
currentConnection = first currentConnection = first
connectionType = d.createType('QObjectPrivate::Connection') connectionType = d.createType('@QObjectPrivate::Connection')
while currentConnection and currentConnection != last: while currentConnection and currentConnection != last:
sender, receiver, slotObj, nextConnectionList, nextp, prev = \ sender, receiver, slotObj, nextConnectionList, nextp, prev = \
d.split('pppppp', currentConnection) d.split('pppppp', currentConnection)

View File

@@ -0,0 +1,31 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
import QtQuick 2.1
import StudioControls 1.0 as StudioControls
import QtQuick.Controls.Styles 1.1
StudioControls.ActionIndicator {
}

View File

@@ -1,3 +1,4 @@
ActionIndicator 2.0 ActionIndicator.qml
AligmentHorizontalButtons 2.0 AligmentHorizontalButtons.qml AligmentHorizontalButtons 2.0 AligmentHorizontalButtons.qml
AligmentVerticalButtons 2.0 AligmentVerticalButtons.qml AligmentVerticalButtons 2.0 AligmentVerticalButtons.qml
AnchorButtons 2.0 AnchorButtons.qml AnchorButtons 2.0 AnchorButtons.qml

View File

@@ -32,14 +32,14 @@ Rectangle {
property Item myControl property Item myControl
property bool showBackground: true
property alias icon: actionIndicatorIcon property alias icon: actionIndicatorIcon
property bool hover: false property bool hover: false
property bool pressed: false property bool pressed: false
color: StudioTheme.Values.themeControlBackground color: actionIndicator.showBackground ? StudioTheme.Values.themeControlBackground : "transparent"
border.color: StudioTheme.Values.themeControlOutline border.color: actionIndicator.showBackground ? StudioTheme.Values.themeControlOutline : "transparent"
state: "default"
implicitWidth: StudioTheme.Values.height implicitWidth: StudioTheme.Values.height
implicitHeight: StudioTheme.Values.height implicitHeight: StudioTheme.Values.height
@@ -55,6 +55,26 @@ Rectangle {
font.pixelSize: StudioTheme.Values.myIconFontSize font.pixelSize: StudioTheme.Values.myIconFontSize
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
states: [
State {
name: "hovered"
when: actionIndicator.hover && !actionIndicator.pressed
&& !myControl.edit && !myControl.drag && myControl.enabled
PropertyChanges {
target: actionIndicatorIcon
scale: 1.2
}
},
State {
name: "disabled"
when: !myControl.enabled
PropertyChanges {
target: actionIndicatorIcon
color: StudioTheme.Values.themeTextColorDisabled
}
}
]
} }
MouseArea { MouseArea {
@@ -70,27 +90,18 @@ Rectangle {
name: "default" name: "default"
when: myControl.enabled && !actionIndicator.hover when: myControl.enabled && !actionIndicator.hover
&& !actionIndicator.pressed && !myControl.hover && !actionIndicator.pressed && !myControl.hover
&& !myControl.edit && !myControl.drag && !myControl.edit && !myControl.drag && actionIndicator.showBackground
PropertyChanges { PropertyChanges {
target: actionIndicator target: actionIndicator
color: StudioTheme.Values.themeControlBackground color: StudioTheme.Values.themeControlBackground
border.color: StudioTheme.Values.themeControlOutline border.color: StudioTheme.Values.themeControlOutline
} }
}, },
State {
name: "hovered"
when: actionIndicator.hover && !actionIndicator.pressed
&& !myControl.edit && !myControl.drag
PropertyChanges {
target: actionIndicatorIcon
scale: 1.2
}
},
State { State {
name: "globalHover" name: "globalHover"
when: myControl.hover && !actionIndicator.hover when: myControl.hover && !actionIndicator.hover
&& !actionIndicator.pressed && !myControl.edit && !actionIndicator.pressed && !myControl.edit
&& !myControl.drag && !myControl.drag && actionIndicator.showBackground
PropertyChanges { PropertyChanges {
target: actionIndicator target: actionIndicator
color: StudioTheme.Values.themeHoverHighlight color: StudioTheme.Values.themeHoverHighlight
@@ -99,7 +110,7 @@ Rectangle {
}, },
State { State {
name: "edit" name: "edit"
when: myControl.edit when: myControl.edit && actionIndicator.showBackground
PropertyChanges { PropertyChanges {
target: actionIndicator target: actionIndicator
color: StudioTheme.Values.themeFocusEdit color: StudioTheme.Values.themeFocusEdit
@@ -108,7 +119,7 @@ Rectangle {
}, },
State { State {
name: "drag" name: "drag"
when: myControl.drag when: myControl.drag && actionIndicator.showBackground
PropertyChanges { PropertyChanges {
target: actionIndicator target: actionIndicator
color: StudioTheme.Values.themeFocusDrag color: StudioTheme.Values.themeFocusDrag
@@ -117,16 +128,12 @@ Rectangle {
}, },
State { State {
name: "disabled" name: "disabled"
when: !myControl.enabled when: !myControl.enabled && actionIndicator.showBackground
PropertyChanges { PropertyChanges {
target: actionIndicator target: actionIndicator
color: StudioTheme.Values.themeControlBackgroundDisabled color: StudioTheme.Values.themeControlBackgroundDisabled
border.color: StudioTheme.Values.themeControlOutlineDisabled border.color: StudioTheme.Values.themeControlOutlineDisabled
} }
PropertyChanges {
target: actionIndicatorIcon
color: StudioTheme.Values.themeTextColorDisabled
}
} }
] ]
} }

View File

@@ -87,7 +87,8 @@ T.ComboBox {
color: StudioTheme.Values.themeControlOutline color: StudioTheme.Values.themeControlOutline
border.color: StudioTheme.Values.themeControlOutline border.color: StudioTheme.Values.themeControlOutline
border.width: StudioTheme.Values.border border.width: StudioTheme.Values.border
width: myComboBox.width x: actionIndicator.width - (actionIndicatorVisible ? StudioTheme.Values.border : 0)
width: myComboBox.width - actionIndicator.width
height: myComboBox.height height: myComboBox.height
} }

View File

@@ -74,8 +74,8 @@ TextInput {
if (myControl.popup.opened) { if (myControl.popup.opened) {
myControl.popup.close() myControl.popup.close()
} else { } else {
myControl.popup.open()
myControl.forceActiveFocus() myControl.forceActiveFocus()
myControl.popup.open()
} }
} else { } else {
textInput.forceActiveFocus() textInput.forceActiveFocus()
@@ -106,6 +106,10 @@ TextInput {
color: StudioTheme.Values.themeControlBackground color: StudioTheme.Values.themeControlBackground
border.color: StudioTheme.Values.themeControlOutline border.color: StudioTheme.Values.themeControlOutline
} }
PropertyChanges {
target: tapHandler
enabled: true
}
PropertyChanges { PropertyChanges {
target: mouseArea target: mouseArea
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor

View File

@@ -151,7 +151,8 @@ T.SpinBox {
color: StudioTheme.Values.themeControlOutline color: StudioTheme.Values.themeControlOutline
border.color: StudioTheme.Values.themeControlOutline border.color: StudioTheme.Values.themeControlOutline
border.width: StudioTheme.Values.border border.width: StudioTheme.Values.border
width: mySpinBox.width x: actionIndicator.width - (actionIndicatorVisible ? StudioTheme.Values.border : 0)
width: mySpinBox.width - actionIndicator.width
height: mySpinBox.height height: mySpinBox.height
} }

View File

@@ -53,7 +53,7 @@ Rectangle {
pressAndHoldTimer.stop() pressAndHoldTimer.stop()
} }
// This function is meant to synchronize enabled with realEnable to avoid // This function is meant to synchronize enabled with realEnabled to avoid
// the internal logic messing with the actual state. // the internal logic messing with the actual state.
function invalidateEnabled() { function invalidateEnabled() {
spinBoxIndicator.enabled = spinBoxIndicator.realEnabled spinBoxIndicator.enabled = spinBoxIndicator.realEnabled
@@ -191,6 +191,14 @@ Rectangle {
target: spinBoxIndicator target: spinBoxIndicator
color: StudioTheme.Values.themeFocusDrag color: StudioTheme.Values.themeFocusDrag
} }
},
State {
name: "disabled"
when: !myControl.enabled
PropertyChanges {
target: spinBoxIndicator
color: StudioTheme.Values.themeControlBackgroundDisabled
}
} }
] ]
} }

View File

@@ -143,7 +143,8 @@ T.SpinBox {
color: StudioTheme.Values.themeControlOutline color: StudioTheme.Values.themeControlOutline
border.color: StudioTheme.Values.themeControlOutline border.color: StudioTheme.Values.themeControlOutline
border.width: StudioTheme.Values.border border.width: StudioTheme.Values.border
width: mySpinBox.width x: actionIndicator.width - (actionIndicatorVisible ? StudioTheme.Values.border : 0)
width: mySpinBox.width - actionIndicator.width
height: mySpinBox.height height: mySpinBox.height
} }

View File

@@ -58,9 +58,9 @@ T.TextField {
persistentSelection: focus // QTBUG-73807 persistentSelection: focus // QTBUG-73807
clip: true clip: true
width: StudioTheme.Values.height * 5
height: StudioTheme.Values.height height: StudioTheme.Values.height
implicitHeight: StudioTheme.Values.height implicitHeight: StudioTheme.Values.height
width: StudioTheme.Values.height * 5
leftPadding: StudioTheme.Values.inputHorizontalPadding + actionIndicator.width leftPadding: StudioTheme.Values.inputHorizontalPadding + actionIndicator.width
- (actionIndicatorVisible ? StudioTheme.Values.border : 0) - (actionIndicatorVisible ? StudioTheme.Values.border : 0)
@@ -108,7 +108,9 @@ T.TextField {
color: StudioTheme.Values.themeControlBackground color: StudioTheme.Values.themeControlBackground
border.color: StudioTheme.Values.themeControlOutline border.color: StudioTheme.Values.themeControlOutline
border.width: StudioTheme.Values.border border.width: StudioTheme.Values.border
anchors.fill: parent x: actionIndicator.width - (actionIndicatorVisible ? StudioTheme.Values.border : 0)
width: myTextField.width - actionIndicator.width
height: myTextField.height
} }
TranslationIndicator { TranslationIndicator {

View File

@@ -224,7 +224,7 @@ PaletteBrightText=ffff3333
PaletteText=text PaletteText=text
PaletteButtonText=text PaletteButtonText=text
PaletteButtonTextDisabled=textDisabled PaletteButtonTextDisabled=textDisabled
PaletteToolTipBase=darkBackground PaletteToolTipBase=shadowBackground
PaletteHighlight=selectedBackgroundText PaletteHighlight=selectedBackgroundText
PaletteDark=shadowBackground PaletteDark=shadowBackground
PaletteHighlightedText=textHighlighted PaletteHighlightedText=textHighlighted

View File

@@ -31,20 +31,19 @@
#include "iplugin.h" #include "iplugin.h"
#include <QCoreApplication> #include <QCoreApplication>
#include <QEventLoop>
#include <QDateTime> #include <QDateTime>
#include <QDebug>
#include <QDir> #include <QDir>
#include <QEventLoop>
#include <QFile> #include <QFile>
#include <QLibrary> #include <QLibrary>
#include <QLibraryInfo> #include <QLibraryInfo>
#include <QMetaProperty> #include <QMetaProperty>
#include <QSettings> #include <QSettings>
#include <QTextStream>
#include <QTime>
#include <QWriteLocker>
#include <QDebug>
#include <QTimer>
#include <QSysInfo> #include <QSysInfo>
#include <QTextStream>
#include <QTimer>
#include <QWriteLocker>
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/benchmarker.h> #include <utils/benchmarker.h>
@@ -1175,7 +1174,7 @@ void PluginManagerPrivate::addObject(QObject *obj)
if (m_profilingVerbosity && !m_profileTimer.isNull()) { if (m_profilingVerbosity && !m_profileTimer.isNull()) {
// Report a timestamp when adding an object. Useful for profiling // Report a timestamp when adding an object. Useful for profiling
// its initialization time. // its initialization time.
const int absoluteElapsedMS = m_profileTimer->elapsed(); const int absoluteElapsedMS = int(m_profileTimer->elapsed());
qDebug(" %-43s %8dms", obj->metaObject()->className(), absoluteElapsedMS); qDebug(" %-43s %8dms", obj->metaObject()->className(), absoluteElapsedMS);
} }
@@ -1518,7 +1517,7 @@ PluginSpec *PluginManagerPrivate::pluginByName(const QString &name) const
void PluginManagerPrivate::initProfiling() void PluginManagerPrivate::initProfiling()
{ {
if (m_profileTimer.isNull()) { if (m_profileTimer.isNull()) {
m_profileTimer.reset(new QTime); m_profileTimer.reset(new QElapsedTimer);
m_profileTimer->start(); m_profileTimer->start();
m_profileElapsedMS = 0; m_profileElapsedMS = 0;
qDebug("Profiling started"); qDebug("Profiling started");
@@ -1530,7 +1529,7 @@ void PluginManagerPrivate::initProfiling()
void PluginManagerPrivate::profilingReport(const char *what, const PluginSpec *spec /* = 0 */) void PluginManagerPrivate::profilingReport(const char *what, const PluginSpec *spec /* = 0 */)
{ {
if (!m_profileTimer.isNull()) { if (!m_profileTimer.isNull()) {
const int absoluteElapsedMS = m_profileTimer->elapsed(); const int absoluteElapsedMS = int(m_profileTimer->elapsed());
const int elapsedMS = absoluteElapsedMS - m_profileElapsedMS; const int elapsedMS = absoluteElapsedMS - m_profileElapsedMS;
m_profileElapsedMS = absoluteElapsedMS; m_profileElapsedMS = absoluteElapsedMS;
if (spec) if (spec)

View File

@@ -29,11 +29,12 @@
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <QElapsedTimer>
#include <QObject>
#include <QReadWriteLock>
#include <QScopedPointer>
#include <QSet> #include <QSet>
#include <QStringList> #include <QStringList>
#include <QObject>
#include <QScopedPointer>
#include <QReadWriteLock>
#include <queue> #include <queue>
@@ -117,7 +118,7 @@ public:
QEventLoop *shutdownEventLoop = nullptr; // used for async shutdown QEventLoop *shutdownEventLoop = nullptr; // used for async shutdown
QStringList arguments; QStringList arguments;
QScopedPointer<QTime> m_profileTimer; QScopedPointer<QElapsedTimer> m_profileTimer;
QHash<const PluginSpec *, int> m_profileTotal; QHash<const PluginSpec *, int> m_profileTotal;
int m_profileElapsedMS = 0; int m_profileElapsedMS = 0;
unsigned m_profilingVerbosity = 0; unsigned m_profilingVerbosity = 0;

View File

@@ -470,10 +470,10 @@ bool DiagramSceneModel::exportPdf(const QString &fileName, bool selectedElements
QSizeF pageSize = status.m_sceneBoundingRect.size(); QSizeF pageSize = status.m_sceneBoundingRect.size();
pageSize += QSizeF(2.0 * border, 2.0 * border); pageSize += QSizeF(2.0 * border, 2.0 * border);
pageSize *= scaleFactor; pageSize *= scaleFactor;
pageSize *= dotsPerMm;
QPdfWriter pdfWriter(fileName); QPdfWriter pdfWriter(fileName);
pdfWriter.setPageSize(QPdfWriter::Custom); pdfWriter.setPageSize(QPageSize(pageSize, QPageSize::Millimeter));
pdfWriter.setPageSizeMM(pageSize * dotsPerMm);
QPainter pdfPainter; QPainter pdfPainter;
pdfPainter.begin(&pdfWriter); pdfPainter.begin(&pdfWriter);

View File

@@ -66,6 +66,16 @@ static bool compilerExists(const FilePath &compilerPath)
return fi.exists() && fi.isExecutable() && fi.isFile(); return fi.exists() && fi.isExecutable() && fi.isFile();
} }
static QString cppLanguageOption(const FilePath &compiler)
{
const QString baseName = compiler.toFileInfo().baseName();
if (baseName == "iccarm")
return QString("--c++");
if (baseName == "icc8051" || baseName == "iccavr")
return QString("--ec++");
return {};
}
static Macros dumpPredefinedMacros(const FilePath &compiler, const Core::Id languageId, static Macros dumpPredefinedMacros(const FilePath &compiler, const Core::Id languageId,
const QStringList &env) const QStringList &env)
{ {
@@ -87,7 +97,7 @@ static Macros dumpPredefinedMacros(const FilePath &compiler, const Core::Id lang
CommandLine cmd(compiler, {fakeIn.fileName()}); CommandLine cmd(compiler, {fakeIn.fileName()});
if (languageId == ProjectExplorer::Constants::CXX_LANGUAGE_ID) if (languageId == ProjectExplorer::Constants::CXX_LANGUAGE_ID)
cmd.addArg("--c++"); cmd.addArg(cppLanguageOption(compiler));
cmd.addArg("--predef_macros"); cmd.addArg("--predef_macros");
cmd.addArg(outpath); cmd.addArg(outpath);
@@ -132,7 +142,7 @@ static HeaderPaths dumpHeaderPaths(const FilePath &compiler, const Core::Id lang
CommandLine cmd(compiler, {fakeIn.fileName()}); CommandLine cmd(compiler, {fakeIn.fileName()});
if (languageId == ProjectExplorer::Constants::CXX_LANGUAGE_ID) if (languageId == ProjectExplorer::Constants::CXX_LANGUAGE_ID)
cmd.addArg("--c++"); cmd.addArg(cppLanguageOption(compiler));
cmd.addArg("--preinclude"); cmd.addArg("--preinclude");
cmd.addArg("."); cmd.addArg(".");

View File

@@ -84,15 +84,6 @@ bool writeFile(const QString &filePath, const QByteArray &contents)
return true; return true;
} }
void insertTextAtTopOfEditor(TextEditor::BaseTextEditor *editor, const QByteArray &text)
{
QTC_ASSERT(editor, return);
::Utils::ChangeSet cs;
cs.insert(0, QString::fromUtf8(text));
QTextCursor textCursor = editor->textCursor();
cs.apply(&textCursor);
}
class ChangeDocumentReloadSetting class ChangeDocumentReloadSetting
{ {
public: public:
@@ -697,126 +688,6 @@ void ClangCodeCompletionTest::testCompleteProjectDependingCodeInGeneratedUiFile(
QVERIFY(hasItem(proposal, "setupUi")); QVERIFY(hasItem(proposal, "setupUi"));
} }
void ClangCodeCompletionTest::testCompleteAfterModifyingIncludedHeaderInOtherEditor()
{
QSKIP("We don't reparse anymore before a code completion so we get wrong completion results.");
CppTools::Tests::TemporaryDir temporaryDir;
const TestDocument sourceDocument("mysource.cpp", &temporaryDir);
QVERIFY(sourceDocument.isCreatedAndHasValidCursorPosition());
const TestDocument headerDocument("myheader.h", &temporaryDir);
QVERIFY(headerDocument.isCreated());
// Test that declarations from header file are visible in source file
OpenEditorAtCursorPosition openSource(sourceDocument);
QVERIFY(openSource.succeeded());
TextEditor::ProposalModelPtr proposal = completionResults(openSource.editor());
QVERIFY(hasItem(proposal, "globalFromHeader"));
// Open header and insert a new declaration
OpenEditorAtCursorPosition openHeader(headerDocument);
QVERIFY(openHeader.succeeded());
insertTextAtTopOfEditor(openHeader.editor(), "int globalFromHeaderUnsaved;\n");
// Switch back to source file and check if modified header is reflected in completions.
Core::EditorManager::activateEditor(openSource.editor());
QCoreApplication::processEvents(); // connections are queued
proposal = completionResults(openSource.editor());
QVERIFY(hasItem(proposal, "globalFromHeader"));
QVERIFY(hasItem(proposal, "globalFromHeaderUnsaved"));
}
void ClangCodeCompletionTest::testCompleteAfterModifyingIncludedHeaderByRefactoringActions()
{
QSKIP("We don't reparse anymore before a code completion so we get wrong completion results.");
CppTools::Tests::TemporaryDir temporaryDir;
const TestDocument sourceDocument("mysource.cpp", &temporaryDir);
QVERIFY(sourceDocument.isCreatedAndHasValidCursorPosition());
const TestDocument headerDocument("myheader.h", &temporaryDir);
QVERIFY(headerDocument.isCreated());
// Open header
OpenEditorAtCursorPosition openHeader(headerDocument);
QVERIFY(openHeader.succeeded());
// Open source and test that declaration from header file is visible in source file
OpenEditorAtCursorPosition openSource(sourceDocument);
QVERIFY(openSource.succeeded());
TextEditor::ProposalModelPtr proposal = completionResults(openSource.editor());
QVERIFY(hasItem(proposal, "globalFromHeader"));
// Modify header document without switching to its editor.
// This simulates e.g. changes from refactoring actions.
::Utils::ChangeSet cs;
cs.insert(0, QLatin1String("int globalFromHeaderUnsaved;\n"));
QTextCursor textCursor = openHeader.editor()->textCursor();
cs.apply(&textCursor);
// Check whether modified header is reflected in the completions.
proposal = completionResults(openSource.editor());
QVERIFY(hasItem(proposal, "globalFromHeader"));
QVERIFY(hasItem(proposal, "globalFromHeaderUnsaved"));
}
void ClangCodeCompletionTest::testCompleteAfterChangingIncludedAndOpenHeaderExternally()
{
QSKIP("The file system watcher is doing it in backend process but we wait not long enough");
ChangeDocumentReloadSetting reloadSettingsChanger(Core::IDocument::ReloadUnmodified);
CppTools::Tests::TemporaryDir temporaryDir;
const TestDocument sourceDocument("mysource.cpp", &temporaryDir);
QVERIFY(sourceDocument.isCreatedAndHasValidCursorPosition());
const TestDocument headerDocument("myheader.h", &temporaryDir);
QVERIFY(headerDocument.isCreated());
// Open header
OpenEditorAtCursorPosition openHeader(headerDocument);
QVERIFY(openHeader.succeeded());
// Open source and test completions
OpenEditorAtCursorPosition openSource(sourceDocument);
QVERIFY(openSource.succeeded());
TextEditor::ProposalModelPtr proposal = completionResults(openSource.editor());
QVERIFY(hasItem(proposal, "globalFromHeader"));
// Simulate external modification and wait for reload
WriteFileAndWaitForReloadedDocument waitForReloadedDocument(
headerDocument.filePath,
"int globalFromHeaderReloaded;\n",
openHeader.editor()->document());
QVERIFY(waitForReloadedDocument.wait());
// Retrigger completion and check if its updated
proposal = completionResults(openSource.editor());
QVERIFY(hasItem(proposal, "globalFromHeaderReloaded"));
}
void ClangCodeCompletionTest::testCompleteAfterChangingIncludedAndNotOpenHeaderExternally()
{
QSKIP("The file system watcher is doing it in backend process but we wait not long enough");
CppTools::Tests::TemporaryDir temporaryDir;
const TestDocument sourceDocument("mysource.cpp", &temporaryDir);
QVERIFY(sourceDocument.isCreatedAndHasValidCursorPosition());
const TestDocument headerDocument("myheader.h", &temporaryDir);
QVERIFY(headerDocument.isCreated());
// Open source and test completions
OpenEditorAtCursorPosition openSource(sourceDocument);
QVERIFY(openSource.succeeded());
TextEditor::ProposalModelPtr proposal = completionResults(openSource.editor());
QVERIFY(hasItem(proposal, "globalFromHeader"));
// Simulate external modification, e.g version control checkout
QVERIFY(writeFile(headerDocument.filePath, "int globalFromHeaderReloaded;\n"));
// Retrigger completion and check if its updated
proposal = completionResults(openSource.editor());
QVERIFY(hasItem(proposal, "globalFromHeaderReloaded"));
}
} // namespace Tests } // namespace Tests
} // namespace Internal } // namespace Internal
} // namespace ClangCodeModel } // namespace ClangCodeModel

View File

@@ -54,11 +54,6 @@ private slots:
void testCompleteProjectDependingCode(); void testCompleteProjectDependingCode();
void testCompleteProjectDependingCodeAfterChangingProject(); void testCompleteProjectDependingCodeAfterChangingProject();
void testCompleteProjectDependingCodeInGeneratedUiFile(); void testCompleteProjectDependingCodeInGeneratedUiFile();
void testCompleteAfterModifyingIncludedHeaderInOtherEditor();
void testCompleteAfterModifyingIncludedHeaderByRefactoringActions();
void testCompleteAfterChangingIncludedAndOpenHeaderExternally();
void testCompleteAfterChangingIncludedAndNotOpenHeaderExternally();
}; };
} // namespace Tests } // namespace Tests

View File

@@ -101,7 +101,6 @@ UseSelectionsTestCase::UseSelectionsTestCase(TestDocument &testFile,
bool hasTimedOut; bool hasTimedOut;
const SelectionList selections = waitForUseSelections(&hasTimedOut); const SelectionList selections = waitForUseSelections(&hasTimedOut);
QEXPECT_FAIL("non-local use as macro argument - argument expanded 1", "TODO", Abort); QEXPECT_FAIL("non-local use as macro argument - argument expanded 1", "TODO", Abort);
QEXPECT_FAIL("macro use 2", "TODO", Abort);
QVERIFY(!hasTimedOut); QVERIFY(!hasTimedOut);
// foreach (const Selection &selection, selections) // foreach (const Selection &selection, selections)
// qDebug() << QTest::toString(selection); // qDebug() << QTest::toString(selection);

View File

@@ -1430,6 +1430,8 @@ WarningFlags ClangToolChain::warningFlags(const QStringList &cflags) const
QStringList ClangToolChain::suggestedMkspecList() const QStringList ClangToolChain::suggestedMkspecList() const
{ {
if (const ToolChain * const parentTc = ToolChainManager::findToolChain(m_parentToolChainId))
return parentTc->suggestedMkspecList();
const Abi abi = targetAbi(); const Abi abi = targetAbi();
if (abi.os() == Abi::DarwinOS) if (abi.os() == Abi::DarwinOS)
return {"macx-clang", "macx-clang-32", "unsupported/macx-clang", "macx-ios-clang"}; return {"macx-clang", "macx-clang-32", "unsupported/macx-clang", "macx-ios-clang"};
@@ -1664,6 +1666,8 @@ void ClangToolChainConfigWidget::applyImpl()
for (const ToolChain *mingwTC : mingwToolChains()) { for (const ToolChain *mingwTC : mingwToolChains()) {
if (parentId == mingwTC->id()) { if (parentId == mingwTC->id()) {
tc->m_parentToolChainId = mingwTC->id(); tc->m_parentToolChainId = mingwTC->id();
tc->setTargetAbi(mingwTC->targetAbi());
tc->setSupportedAbis(mingwTC->supportedAbis());
break; break;
} }
} }

View File

@@ -399,7 +399,7 @@ public:
if (role == ContextMenuItemAdderRole) { if (role == ContextMenuItemAdderRole) {
auto *menu = data.value<QMenu *>(); auto *menu = data.value<QMenu *>();
addToContextMenu(menu); addToContextMenu(menu, flags(column) & Qt::ItemIsSelectable);
return true; return true;
} }
@@ -440,7 +440,7 @@ public:
return false; return false;
} }
void addToContextMenu(QMenu *menu) void addToContextMenu(QMenu *menu, bool isSelectable)
{ {
Kit *kit = KitManager::kit(m_kitId); Kit *kit = KitManager::kit(m_kitId);
QTC_ASSERT(kit, return); QTC_ASSERT(kit, return);
@@ -448,13 +448,13 @@ public:
const QString projectName = m_project->displayName(); const QString projectName = m_project->displayName();
QAction *enableAction = menu->addAction(tr("Enable Kit \"%1\" for Project \"%2\"").arg(kitName, projectName)); QAction *enableAction = menu->addAction(tr("Enable Kit \"%1\" for Project \"%2\"").arg(kitName, projectName));
enableAction->setEnabled(m_kitId.isValid() && !isEnabled()); enableAction->setEnabled(isSelectable && m_kitId.isValid() && !isEnabled());
QObject::connect(enableAction, &QAction::triggered, [this, kit] { QObject::connect(enableAction, &QAction::triggered, [this, kit] {
m_project->addTarget(m_project->createTarget(kit)); m_project->addTarget(m_project->createTarget(kit));
}); });
QAction *disableAction = menu->addAction(tr("Disable Kit \"%1\" for Project \"%2\"").arg(kitName, projectName)); QAction *disableAction = menu->addAction(tr("Disable Kit \"%1\" for Project \"%2\"").arg(kitName, projectName));
disableAction->setEnabled(m_kitId.isValid() && isEnabled()); disableAction->setEnabled(isSelectable && m_kitId.isValid() && isEnabled());
QObject::connect(disableAction, &QAction::triggered, m_project, [this] { QObject::connect(disableAction, &QAction::triggered, m_project, [this] {
Target *t = target(); Target *t = target();
QTC_ASSERT(t, return); QTC_ASSERT(t, return);

View File

@@ -275,6 +275,8 @@ QVariantMap DefaultPropertyProvider::autoGeneratedProperties(const ProjectExplor
ProjectExplorer::Abi::abiFromTargetTriplet(mainTc->originalTargetTriple()) ProjectExplorer::Abi::abiFromTargetTriplet(mainTc->originalTargetTriple())
|| targetAbi.osFlavor() == ProjectExplorer::Abi::AndroidLinuxFlavor) { || targetAbi.osFlavor() == ProjectExplorer::Abi::AndroidLinuxFlavor) {
data.insert(QLatin1String(QBS_ARCHITECTURE), architecture(mainTc->targetAbi())); data.insert(QLatin1String(QBS_ARCHITECTURE), architecture(mainTc->targetAbi()));
} else if (archs.count() == 1) {
data.insert(QLatin1String(QBS_ARCHITECTURE), archs.first());
} }
data.insert(QLatin1String(QBS_TARGETPLATFORM), targetPlatform(targetAbi, k)); data.insert(QLatin1String(QBS_TARGETPLATFORM), targetPlatform(targetAbi, k));

View File

@@ -234,6 +234,7 @@ ResourceTopLevelNode::ResourceTopLevelNode(const FilePath &filePath,
setPriority(Node::DefaultFilePriority); setPriority(Node::DefaultFilePriority);
setListInProject(true); setListInProject(true);
setAddFileFilter("*.png; *.jpg; *.gif; *.svg; *.ico; *.qml; *.qml.ui"); setAddFileFilter("*.png; *.jpg; *.gif; *.svg; *.ico; *.qml; *.qml.ui");
setShowWhenEmpty(true);
if (!filePath.isEmpty()) { if (!filePath.isEmpty()) {
QFileInfo fi = filePath.toFileInfo(); QFileInfo fi = filePath.toFileInfo();
@@ -470,7 +471,6 @@ ResourceFolderNode::ResourceFolderNode(const QString &prefix, const QString &lan
m_prefix(prefix), m_prefix(prefix),
m_lang(lang) m_lang(lang)
{ {
setShowWhenEmpty(true);
} }
ResourceFolderNode::~ResourceFolderNode() = default; ResourceFolderNode::~ResourceFolderNode() = default;

View File

@@ -75,7 +75,7 @@ void OptionsDialog::addToKeywordsList(const Keyword &keyword)
QListWidgetItem *item = new QListWidgetItem( QListWidgetItem *item = new QListWidgetItem(
icon(keyword.iconType), keyword.name); icon(keyword.iconType), keyword.name);
item->setData(Qt::UserRole, static_cast<int>(keyword.iconType)); item->setData(Qt::UserRole, static_cast<int>(keyword.iconType));
item->setTextColor(keyword.color); item->setForeground(keyword.color);
ui->keywordsList->addItem(item); ui->keywordsList->addItem(item);
} }
@@ -179,7 +179,7 @@ Settings OptionsDialog::settingsFromUi()
Keyword keyword; Keyword keyword;
keyword.name = item->text(); keyword.name = item->text();
keyword.iconType = static_cast<IconType>(item->data(Qt::UserRole).toInt()); keyword.iconType = static_cast<IconType>(item->data(Qt::UserRole).toInt());
keyword.color = item->textColor(); keyword.color = item->foreground().color();
settings.keywords << keyword; settings.keywords << keyword;
} }

View File

@@ -97,7 +97,7 @@ def __createProjectOrFileSelectType__(category, template, fromWelcome = False, i
clickButton(waitForObject("{text='Choose...' type='QPushButton' unnamed='1' visible='1'}")) clickButton(waitForObject("{text='Choose...' type='QPushButton' unnamed='1' visible='1'}"))
return __getSupportedPlatforms__(str(text), template)[0] return __getSupportedPlatforms__(str(text), template)[0]
def __createProjectSetNameAndPath__(path, projectName = None, checks = True, libType = None): def __createProjectSetNameAndPath__(path, projectName = None, checks = True):
directoryEdit = waitForObject("{type='Utils::FancyLineEdit' unnamed='1' visible='1' " directoryEdit = waitForObject("{type='Utils::FancyLineEdit' unnamed='1' visible='1' "
"toolTip?='Full path: *'}") "toolTip?='Full path: *'}")
replaceEditorContent(directoryEdit, path) replaceEditorContent(directoryEdit, path)
@@ -113,10 +113,6 @@ def __createProjectSetNameAndPath__(path, projectName = None, checks = True, lib
test.verify(labelCheck, "Project name and base directory without warning or error") test.verify(labelCheck, "Project name and base directory without warning or error")
# make sure this is not set as default location # make sure this is not set as default location
ensureChecked("{type='QCheckBox' name='projectsDirectoryCheckBox' visible='1'}", False) ensureChecked("{type='QCheckBox' name='projectsDirectoryCheckBox' visible='1'}", False)
if libType != None:
selectFromCombo(waitForObject("{leftWidget={text='Type' type='QLabel' unnamed='1' "
"visible='1'} type='QComboBox' unnamed='1' visible='1'}"),
LibType.getStringForLib(libType))
clickButton(waitForObject(":Next_QPushButton")) clickButton(waitForObject(":Next_QPushButton"))
return str(projectName) return str(projectName)
@@ -365,22 +361,28 @@ def createNewCPPLib(projectDir, projectName, className, target, isStatic):
libType = LibType.SHARED libType = LibType.SHARED
if projectDir == None: if projectDir == None:
projectDir = tempDir() projectDir = tempDir()
projectName = __createProjectSetNameAndPath__(projectDir, projectName, False, libType) projectName = __createProjectSetNameAndPath__(projectDir, projectName, False)
__chooseTargets__(target, available) __handleBuildSystem__(None)
snooze(1) selectFromCombo(waitForObject("{name='Type' type='QComboBox' visible='1' "
clickButton(waitForObject(":Next_QPushButton")) "window=':New_ProjectExplorer::JsonWizard'}"),
__createProjectHandleModuleSelection__(["QtCore"]) LibType.getStringForLib(libType))
__createProjectHandleModuleSelection__("Core")
className = __createProjectHandleClassInformation__(className) className = __createProjectHandleClassInformation__(className)
__chooseTargets__(target, available)
clickButton(waitForObject(":Next_QPushButton"))
__createProjectHandleLastPage__() __createProjectHandleLastPage__()
return projectName, className return projectName, className
def createNewQtPlugin(projectDir, projectName, className, target, baseClass="QGenericPlugin"): def createNewQtPlugin(projectDir, projectName, className, target, baseClass="QGenericPlugin"):
available = __createProjectOrFileSelectType__(" Library", "C++ Library", False, True) available = __createProjectOrFileSelectType__(" Library", "C++ Library", False, True)
projectName = __createProjectSetNameAndPath__(projectDir, projectName, False, LibType.QT_PLUGIN) projectName = __createProjectSetNameAndPath__(projectDir, projectName, False)
__chooseTargets__(target, available) __handleBuildSystem__(None)
snooze(1) selectFromCombo(waitForObject("{name='Type' type='QComboBox' visible='1' "
clickButton(waitForObject(":Next_QPushButton")) "window=':New_ProjectExplorer::JsonWizard'}"),
LibType.getStringForLib(LibType.QT_PLUGIN))
className = __createProjectHandleClassInformation__(className, baseClass) className = __createProjectHandleClassInformation__(className, baseClass)
__chooseTargets__(target, available)
clickButton(waitForObject(":Next_QPushButton"))
__createProjectHandleLastPage__() __createProjectHandleLastPage__()
return projectName, className return projectName, className
@@ -422,36 +424,18 @@ def __chooseTargets__(targets, availableTargets=None, additionalFunc=None):
test.warning("Target '%s' is not set up correctly." % Targets.getStringForTarget(current)) test.warning("Target '%s' is not set up correctly." % Targets.getStringForTarget(current))
return checkedTargets return checkedTargets
def __createProjectHandleModuleSelection__(modules): def __createProjectHandleModuleSelection__(module):
modulesPage = waitForObject("{type='QmakeProjectManager::Internal::ModulesPage' unnamed='1' " selectFromCombo(waitForObject("{name='LibraryQtModule' type='QComboBox' visible='1' "
"visible='1'}") "window=':New_ProjectExplorer::JsonWizard'}"), module)
chckBoxes = filter(lambda x: className(x) == 'QCheckBox', object.children(modulesPage))
chckBoxLabels = set([str(cb.text) for cb in chckBoxes])
if not set(modules).issubset(chckBoxLabels):
test.fatal("You want to check module(s) not available at 'Module Selection' page.",
"Not available: %s" % str(set(modules).difference(chckBoxLabels)))
for checkBox in chckBoxes:
test.log("(Un)Checking module checkbox '%s'" % str(checkBox.text))
ensureChecked(checkBox, str(checkBox.text) in modules, 3000)
clickButton(waitForObject(":Next_QPushButton"))
def __createProjectHandleClassInformation__(className, baseClass=None): def __createProjectHandleClassInformation__(className, baseClass=None):
if baseClass: if baseClass:
selectFromCombo("{name='baseClassComboBox' type='QComboBox' visible='1'}", baseClass) selectFromCombo("{name='BaseClassInfo' type='QComboBox' visible='1' "
classLineEd = waitForObject("{name='classLineEdit' type='Utils::ClassNameValidatingLineEdit' " "window=':New_ProjectExplorer::JsonWizard'}", baseClass)
"visible='1'}") replaceEditorContent(waitForObject("{name='Class' type='Utils::FancyLineEdit' visible='1' "
result = str(classLineEd.text) "window=':New_ProjectExplorer::JsonWizard'}"), className)
if className:
replaceEditorContent(classLineEd, className)
try:
waitForObject("{text='The class name contains invalid characters.' type='QLabel' "
"unnamed='1' visible='1'}", 1000)
test.fatal("Class name contains invalid characters - using default.")
replaceEditorContent(classLineEd, result)
except:
result = className
clickButton(waitForObject(":Next_QPushButton")) clickButton(waitForObject(":Next_QPushButton"))
return result return className
def waitForProcessRunning(running=True): def waitForProcessRunning(running=True):
outputButton = waitForObject(":Qt Creator_AppOutput_Core::Internal::OutputPaneToggleButton") outputButton = waitForObject(":Qt Creator_AppOutput_Core::Internal::OutputPaneToggleButton")

View File

@@ -81,7 +81,12 @@ def main():
# are there more Quick combinations - then recreate this project # are there more Quick combinations - then recreate this project
if counter < len(qtVersionsForQuick) - 1: if counter < len(qtVersionsForQuick) - 1:
displayedPlatforms = __createProject__(category, template) displayedPlatforms = __createProject__(category, template)
continue elif template in ("Qt Widgets Application", "C++ Library"):
def skipDetails(_):
clickButton(waitForObject(":Next_QPushButton"))
handleBuildSystemVerifyKits(category, template, kits,
displayedPlatforms, skipDetails)
else:
handleBuildSystemVerifyKits(category, template, kits, displayedPlatforms) handleBuildSystemVerifyKits(category, template, kits, displayedPlatforms)
invokeMenuItem("File", "Exit") invokeMenuItem("File", "Exit")

View File

@@ -1,5 +1,5 @@
"language" "Exit" "ISO" "language" "Exit" "ISO"
"Czech (CzechRepublic)" "Ukončit" "cs_CZ" "Czech (Czech Republic)" "Ukončit" "cs_CZ"
"Danish (Denmark)" "Afslut" "da_DK" "Danish (Denmark)" "Afslut" "da_DK"
"German (Germany)" "Beenden" "de_DE" "German (Germany)" "Beenden" "de_DE"
"French (France)" "Quitter" "fr_FR" "French (France)" "Quitter" "fr_FR"
1 language Exit ISO
2 Czech (CzechRepublic) Czech (Czech Republic) Ukončit cs_CZ
3 Danish (Denmark) Afslut da_DK
4 German (Germany) Beenden de_DE
5 French (France) Quitter fr_FR