Merge remote-tracking branch 'origin/3.1'
@@ -1,13 +1,9 @@
|
||||
//! [2]
|
||||
import QtQuick 2.1
|
||||
import QtQuick.Window 2.1
|
||||
|
||||
//! [1]
|
||||
|
||||
//! [0]
|
||||
|
||||
import QtQuick 2.0
|
||||
|
||||
Rectangle {
|
||||
Window {
|
||||
id: page
|
||||
visible: true
|
||||
width: 360
|
||||
height: 360
|
||||
color: "#343434"
|
||||
@@ -21,11 +17,11 @@ Rectangle {
|
||||
|
||||
Rectangle {
|
||||
id: topLeftRect
|
||||
y: 20
|
||||
width: 64
|
||||
height: 64
|
||||
color: "#00000000"
|
||||
radius: 6
|
||||
opacity: 1
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 10
|
||||
anchors.top: parent.top
|
||||
@@ -33,95 +29,95 @@ Rectangle {
|
||||
border.color: "#808080"
|
||||
|
||||
MouseArea {
|
||||
id: mousearea1
|
||||
id: mouseArea1
|
||||
anchors.fill: parent
|
||||
onClicked: page.state = ' '
|
||||
}
|
||||
onClicked: stateGroup.state = ' '
|
||||
}
|
||||
//! [0]
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: middleRightRect
|
||||
width: 64
|
||||
height: 64
|
||||
color: "#00000000"
|
||||
radius: 6
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 10
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
border.color: "#808080"
|
||||
MouseArea {
|
||||
id: mousearea2
|
||||
anchors.fill: parent
|
||||
onClicked: page.state = 'State1'
|
||||
}
|
||||
Rectangle {
|
||||
id: middleRightRect
|
||||
width: 64
|
||||
height: 64
|
||||
color: "#00000000"
|
||||
radius: 6
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 10
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
border.color: "#808080"
|
||||
|
||||
MouseArea {
|
||||
id: mouseArea2
|
||||
anchors.fill: parent
|
||||
onClicked: stateGroup.state = 'State1'
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: bottomLeftRect
|
||||
width: 64
|
||||
height: 64
|
||||
color: "#00000000"
|
||||
radius: 6
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: 10
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: 20
|
||||
border.color: "#808080"
|
||||
MouseArea {
|
||||
id: mousearea3
|
||||
anchors.fill: parent
|
||||
onClicked: page.state = 'State2'
|
||||
}
|
||||
Rectangle {
|
||||
id: bottomLeftRect
|
||||
width: 64
|
||||
height: 64
|
||||
color: "#00000000"
|
||||
radius: 6
|
||||
border.width: 1
|
||||
anchors.leftMargin: 10
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: 20
|
||||
anchors.left: parent.left
|
||||
border.color: "#808080"
|
||||
|
||||
MouseArea {
|
||||
id: mouseArea3
|
||||
anchors.fill: parent
|
||||
onClicked: stateGroup.state = 'State2'
|
||||
}
|
||||
}
|
||||
|
||||
//! [1]
|
||||
|
||||
StateGroup {
|
||||
id: stateGroup
|
||||
states: [
|
||||
State {
|
||||
name: "State1"
|
||||
State {
|
||||
name: "State1"
|
||||
|
||||
PropertyChanges {
|
||||
target: icon
|
||||
x: middleRightRect.x
|
||||
y: middleRightRect.y
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "State2"
|
||||
|
||||
PropertyChanges {
|
||||
target: icon
|
||||
x: bottomLeftRect.x
|
||||
y: bottomLeftRect.y
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
transitions: [
|
||||
Transition {
|
||||
from: "*"; to: "State1"
|
||||
NumberAnimation {
|
||||
easing.type: Easing.OutBounce
|
||||
properties: "x,y";
|
||||
duration: 1000
|
||||
PropertyChanges {
|
||||
target: icon
|
||||
x: middleRightRect.x
|
||||
y: middleRightRect.y
|
||||
}
|
||||
},
|
||||
Transition {
|
||||
from: "*"; to: "State2"
|
||||
NumberAnimation {
|
||||
properties: "x,y";
|
||||
easing.type: Easing.InOutQuad;
|
||||
duration: 2000
|
||||
State {
|
||||
name: "State2"
|
||||
|
||||
PropertyChanges {
|
||||
target: icon
|
||||
x: bottomLeftRect.x
|
||||
y: bottomLeftRect.y
|
||||
}
|
||||
},
|
||||
Transition {
|
||||
NumberAnimation {
|
||||
properties: "x,y";
|
||||
duration: 200
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
transitions: [
|
||||
Transition {
|
||||
from: "*"; to: "State1"
|
||||
NumberAnimation {
|
||||
easing.type: Easing.OutBounce
|
||||
properties: "x,y";
|
||||
duration: 1000
|
||||
}
|
||||
},
|
||||
Transition {
|
||||
from: "*"; to: "State2"
|
||||
NumberAnimation {
|
||||
properties: "x,y";
|
||||
easing.type: Easing.InOutQuad;
|
||||
duration: 2000
|
||||
}
|
||||
},
|
||||
Transition {
|
||||
NumberAnimation {
|
||||
properties: "x,y";
|
||||
duration: 200
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
//! [2]
|
||||
|
||||
|
Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 104 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 99 KiB |
|
Before Width: | Height: | Size: 9.7 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 26 KiB |
@@ -1,31 +0,0 @@
|
||||
Item {
|
||||
transitions: [
|
||||
//! [first transition]
|
||||
Transition {
|
||||
from: "*"; to: "State1"
|
||||
NumberAnimation {
|
||||
properties: "x,y";
|
||||
duration: 1000
|
||||
}
|
||||
},
|
||||
//! [first transition]
|
||||
//! [second transition]
|
||||
Transition {
|
||||
from: "*"; to: "State2"
|
||||
NumberAnimation {
|
||||
properties: "x,y";
|
||||
easing.type: Easing.InOutQuad;
|
||||
duration: 2000
|
||||
}
|
||||
},
|
||||
//! [second transition]
|
||||
//! [default transition]
|
||||
Transition {
|
||||
NumberAnimation {
|
||||
properties: "x,y";
|
||||
duration: 200
|
||||
}
|
||||
}
|
||||
]
|
||||
//! [default transition]
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
Item {
|
||||
//! [states]
|
||||
states: [
|
||||
State {
|
||||
name: "State1"
|
||||
|
||||
PropertyChanges {
|
||||
target: icon
|
||||
x: middleRightRect.x
|
||||
y: middleRightRect.y
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "State2"
|
||||
|
||||
PropertyChanges {
|
||||
target: icon
|
||||
x: bottomLeftRect.x
|
||||
y: bottomLeftRect.y
|
||||
}
|
||||
}
|
||||
]
|
||||
//! [states]
|
||||
}
|
||||
@@ -111,6 +111,8 @@
|
||||
devices that are suitable for publishing to application stores
|
||||
and other channels. You must make sure that the package contents
|
||||
meet the requirements for publishing on the channel.
|
||||
\endtable
|
||||
|
||||
For more information, see \l{Publishing to Google Play}.
|
||||
\endtable
|
||||
|
||||
*/
|
||||
|
||||
@@ -57,12 +57,16 @@
|
||||
\li Clang is a C, C++, Objective C, and Objective C++ front-end for the
|
||||
LLVM compiler for Windows, Linux, and Mac OS X.
|
||||
|
||||
\li QCC is the interface for compiling C++ applications for QNX.
|
||||
|
||||
\endlist
|
||||
|
||||
To build an application using GCC, MinGW, or Clang, specify the path
|
||||
To build an application using GCC, MinGW, Clang, or QCC, specify the path
|
||||
to the directory where the compiler is located and select
|
||||
the application binary interface (ABI) version from the list of available
|
||||
versions. You can also create a custom ABI definition.
|
||||
For QCC, also specify the path to the BlackBerry NDK or the QNX Software
|
||||
Development Platform (SDP).
|
||||
|
||||
You specify the compiler to use for each kit in \gui Tools >
|
||||
\gui Options > \gui {Build & Run} > \gui Kits.
|
||||
|
||||
@@ -66,11 +66,9 @@
|
||||
\li In the \gui{qmake location} field, you can change the qmake
|
||||
location.
|
||||
|
||||
\li In the \gui Helpers section, select \gui Details to build the debugging
|
||||
helpers that are available for the Qt version. This is
|
||||
necessary, because the internal data structures of Qt can
|
||||
change between versions. For more information, see
|
||||
\l{Using Debugging Helpers}.
|
||||
\li In the \gui Helpers section, select \gui Details to view the
|
||||
QML Dumper that has been built for the Qt version. For more
|
||||
information, see \l{Using Debugging Helpers}.
|
||||
|
||||
\image qt-creator-debugging-helpers.png
|
||||
|
||||
|
||||
@@ -33,8 +33,8 @@
|
||||
This tutorial uses built-in QML types and illustrates basic concepts of
|
||||
\l{Qt Quick}.
|
||||
|
||||
This tutorial describes how to use \QC to implement Qt states and transitions. We use
|
||||
\l{Animation}{Qt example code} to
|
||||
This tutorial describes how to use \QC to implement Qt Quick states and
|
||||
transitions. We
|
||||
create an application that displays a Qt logo that moves between three rectangles on the
|
||||
page when you click them.
|
||||
|
||||
@@ -57,11 +57,7 @@
|
||||
Windows and Linux) or \gui Continue (on Mac OS).
|
||||
|
||||
\li In the \gui {Qt Quick component set} field, select
|
||||
\gui {Qt Quick 2.0}.
|
||||
|
||||
\note The QML types used in this example are also supported in
|
||||
Qt Quick 1.1. To create this example application for platforms that
|
||||
run Qt 4, select \gui {Qt Quick 1.1}.
|
||||
\gui {Qt Quick 2.1}.
|
||||
|
||||
\li Select \l{glossary-buildandrun-kit}{kits} for running and building your project,
|
||||
and then click \gui{Next}.
|
||||
@@ -92,7 +88,8 @@
|
||||
To use the states.png image in your application, you must copy it to the
|
||||
project directory (same subdirectory as the QML file) from the examples
|
||||
directory in the Qt installation directory. For example:
|
||||
\c {C:\Qt\Qt5.0.1\5.0.1\msvc2010\examples\declarative\animation\states}. The image appears
|
||||
\c {C:\Qt\Qt5.3.0\5.3.0\msvc2010\examples\declarative\animation\states}. The
|
||||
image appears
|
||||
in the \gui Resources pane. You can also use any other image or a QML
|
||||
type, instead.
|
||||
|
||||
@@ -108,18 +105,22 @@
|
||||
\li In the \gui Navigator pane, select \gui Text and press \key Delete to
|
||||
delete it.
|
||||
|
||||
\li Select \gui Rectangle to edit its properties.
|
||||
\li Select \gui Window to edit its properties.
|
||||
|
||||
\image qmldesigner-tutorial-page.png "Page properties"
|
||||
|
||||
\list a
|
||||
|
||||
\li In the \gui Id field, enter \e page, to be able to reference the
|
||||
rectangle from other places.
|
||||
window from other places.
|
||||
|
||||
\li In the \gui Color field, set the color to #343434.
|
||||
\li In the code editor, set the window background color to #343434:
|
||||
|
||||
\li In the code editor, delete the \c {Qt.quit();} command.
|
||||
\quotefromfile transitions/main.qml
|
||||
\skipto Window {
|
||||
\printuntil color
|
||||
|
||||
\li Delete the \c {Qt.quit();} command.
|
||||
|
||||
\endlist
|
||||
|
||||
@@ -136,7 +137,13 @@
|
||||
|
||||
\endlist
|
||||
|
||||
\li In the \gui Library view, \gui {QML Types} tab, select \gui Rectangle,
|
||||
\li Double-click the resource file, qml.qrc, in the \gui Projects view
|
||||
to add states.png to the resource file for deployment.
|
||||
|
||||
\li Click \gui Add and select states.png.
|
||||
|
||||
\li In the \gui Design mode, \gui Library view, \gui {QML Types} tab,
|
||||
select \gui Rectangle,
|
||||
drag and drop it to the canvas, and edit its properties.
|
||||
|
||||
\image qmldesigner-tutorial-topleftrect.png "Rectangle properties"
|
||||
@@ -194,21 +201,24 @@
|
||||
in the mouse area, as illustrated by the following code
|
||||
snippet:
|
||||
|
||||
\qml
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: page.state = ''
|
||||
}
|
||||
\endqml
|
||||
\quotefromfile transitions/main.qml
|
||||
\skipto MouseArea
|
||||
\printuntil }
|
||||
|
||||
The expression sets the state to the base state and returns the
|
||||
image to its initial position.
|
||||
You will create stateGroup later.
|
||||
|
||||
\endlist
|
||||
|
||||
The qml.main file should now look as follows:
|
||||
|
||||
\snippet transitions/main.qml 0
|
||||
\quotefromfile transitions/main.qml
|
||||
\skipto Window {
|
||||
\printuntil onClicked
|
||||
\printuntil }
|
||||
\printuntil }
|
||||
\printuntil }
|
||||
|
||||
\li In the \gui Navigator pane, copy topLeftRect (by pressing
|
||||
\key {Ctrl+C}) and paste it to the canvas twice (by pressing
|
||||
@@ -232,7 +242,7 @@
|
||||
mouse area. The following expression sets the state to
|
||||
\e State1:
|
||||
|
||||
\c {onClicked: page.state = 'State1'}
|
||||
\c {onClicked: stateGroup.state = 'State1'}
|
||||
|
||||
You will create State1 later.
|
||||
|
||||
@@ -254,13 +264,18 @@
|
||||
mouse area. The following expression sets the state to
|
||||
\e State2:
|
||||
|
||||
\c {onClicked: page.state = 'State2'}
|
||||
\c {onClicked: stateGroup.state = 'State2'}
|
||||
|
||||
You will create State2 later.
|
||||
|
||||
The qml.main file should now look as follows:
|
||||
|
||||
\snippet transitions/main.qml 1
|
||||
\quotefromfile transitions/main.qml
|
||||
\skipto Window {
|
||||
\printuntil State2
|
||||
\printuntil }
|
||||
\printuntil }
|
||||
\printuntil }
|
||||
|
||||
\endlist
|
||||
|
||||
@@ -280,26 +295,21 @@
|
||||
\section1 Adding Views
|
||||
|
||||
In the .qml file, you already created pointers to two additional states:
|
||||
State1 and State2. To create the states:
|
||||
State1 and State2. You cannot use the \QMLD to add states for a Window QML
|
||||
type. Use the code editor to add the states inside a StateGroup QML type and
|
||||
refer to them by using the id of the state group:
|
||||
|
||||
\list 1
|
||||
|
||||
\li Click the empty slot in the \gui States pane to create State1.
|
||||
|
||||
\li Click the empty slot in the \gui States pane to create State2.
|
||||
|
||||
\li In the code editor, bind the position of the Qt logo to the
|
||||
\li Bind the position of the Qt logo to the
|
||||
rectangle to make sure that the logo is displayed within the
|
||||
rectangle when the view is scaled on different sizes of screens. Set
|
||||
expressions for the x and y properties, as illustrated by the
|
||||
following code snippet:
|
||||
|
||||
\snippet qml/states-properties.qml states
|
||||
|
||||
\image qmldesigner-tutorial-state1.png "States"
|
||||
|
||||
\note When you set the expressions, drag and drop is disabled for
|
||||
the icon in \QMLD.
|
||||
\quotefromfile transitions/main.qml
|
||||
\skipto StateGroup {
|
||||
\printuntil ]
|
||||
|
||||
\li Press \key {Ctrl+R} to run the application.
|
||||
|
||||
@@ -309,7 +319,8 @@
|
||||
|
||||
\section1 Adding Animation to the View
|
||||
|
||||
Add transitions to define how the properties change when the Qt logo moves
|
||||
Add transitions inside the state group to define how the properties change
|
||||
when the Qt logo moves
|
||||
between states. The transitions apply animations to the Qt logo. For example,
|
||||
the Qt logo bounces back when it moves to the middleRightRect and eases into
|
||||
bottomLeftRect. Add the transitions in the code editor.
|
||||
@@ -320,7 +331,9 @@
|
||||
moving to State1, the x and y coordinates of the Qt logo change
|
||||
linearly over a duration of 1 second:
|
||||
|
||||
\snippet qml/list-of-transitions.qml first transition
|
||||
\dots
|
||||
\skipto transitions
|
||||
\printuntil },
|
||||
|
||||
\li You can use the Qt Quick toolbar for animation to change the easing
|
||||
curve type from linear to OutBounce:
|
||||
@@ -343,13 +356,15 @@
|
||||
and y coordinates of the Qt logo change over a duration of 2
|
||||
seconds, and an InOutQuad easing function is used:
|
||||
|
||||
\snippet qml/list-of-transitions.qml second transition
|
||||
\dots
|
||||
\printuntil },
|
||||
|
||||
\li Add the following code to specify that for any other state changes,
|
||||
the x and y coordinates of the Qt logo change linearly over a
|
||||
duration of 200 milliseconds:
|
||||
|
||||
\snippet qml/list-of-transitions.qml default transition
|
||||
\dots
|
||||
\printuntil ]
|
||||
|
||||
\li Press \key {Ctrl+R} to run the application.
|
||||
|
||||
@@ -361,6 +376,8 @@
|
||||
|
||||
When you have completed the steps, the main.qml file should look as follows:
|
||||
|
||||
\snippet transitions/main.qml 2
|
||||
\quotefromfile transitions/main.qml
|
||||
\skipto Window {
|
||||
\printuntil /^\}/
|
||||
|
||||
*/
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
|
||||
\list
|
||||
|
||||
\li Select \gui {Qt Quick Controls 1.0} or \gui {Qt Quick 2.0} to
|
||||
\li Select \gui {Qt Quick Controls 1.1} or \gui {Qt Quick 2.2} to
|
||||
develop for platforms that run Qt 5.
|
||||
|
||||
\li Select \gui {Qt Quick 1.1} to develop for platforms that run
|
||||
|
||||
@@ -27,6 +27,7 @@ DynamicLibrary {
|
||||
: ["$ORIGIN", "$ORIGIN/.."]
|
||||
property string libIncludeBase: ".." // #include <lib/header.h>
|
||||
cpp.includePaths: [libIncludeBase]
|
||||
cpp.minimumWindowsVersion: "5.1"
|
||||
|
||||
Export {
|
||||
Depends { name: "cpp" }
|
||||
|
||||
@@ -39,6 +39,7 @@ Product {
|
||||
|
||||
property string pluginIncludeBase: ".." // #include <plugin/header.h>
|
||||
cpp.includePaths: [pluginIncludeBase]
|
||||
cpp.minimumWindowsVersion: "5.1"
|
||||
|
||||
Group {
|
||||
name: "PluginSpec"
|
||||
|
||||
@@ -18,6 +18,7 @@ Application {
|
||||
cpp.rpaths: qbs.targetOS.contains("osx")
|
||||
? ["@executable_path/../" + project.ide_library_path]
|
||||
: ["$ORIGIN/../" + project.ide_library_path]
|
||||
cpp.minimumWindowsVersion: "5.1"
|
||||
|
||||
Group {
|
||||
fileTagsFilter: product.type
|
||||
|
||||
@@ -74,7 +74,7 @@ def qdump__CPlusPlus__IntegerType(d, value):
|
||||
d.putPlainChildren(value)
|
||||
|
||||
def qdump__CPlusPlus__NamedType(d, value):
|
||||
literal = downcast(value["_name"])
|
||||
literal = d.downcast(value["_name"])
|
||||
d.putValue(d.encodeCharArray(literal["_chars"]), Hex2EncodedLatin1)
|
||||
d.putPlainChildren(value)
|
||||
|
||||
|
||||
@@ -368,6 +368,17 @@ class DumperBase:
|
||||
return min(size, self.stringCutOff)
|
||||
return min(size, limit)
|
||||
|
||||
def vectorDataHelper(self, addr):
|
||||
if self.qtVersion() >= 0x050000:
|
||||
size = self.extractInt(addr + 4)
|
||||
alloc = self.extractInt(addr + 8) & 0x7ffffff
|
||||
data = addr + self.extractPointer(addr + 8 + self.ptrSize())
|
||||
else:
|
||||
alloc = self.extractInt(addr + 4)
|
||||
size = self.extractInt(addr + 8)
|
||||
data = addr + 16
|
||||
return data, size, alloc
|
||||
|
||||
def byteArrayDataHelper(self, addr):
|
||||
if self.qtVersion() >= 0x050000:
|
||||
# QTypedArray:
|
||||
@@ -958,8 +969,7 @@ class DumperBase:
|
||||
if typeName.find('<') >= 0:
|
||||
return 0
|
||||
|
||||
staticMetaObjectName = typeName + "::staticMetaObject"
|
||||
result = self.findSymbol(staticMetaObjectName)
|
||||
result = self.findStaticMetaObject(typeName)
|
||||
|
||||
# We need to distinguish Q_OBJECT from Q_GADGET:
|
||||
# a Q_OBJECT SMO has a non-null superdata (unless it's QObject itself),
|
||||
@@ -1001,31 +1011,49 @@ class DumperBase:
|
||||
self.knownStaticMetaObjects[typeName] = result
|
||||
return result
|
||||
|
||||
def staticQObjectPropertyNames(self, metaobject):
|
||||
properties = []
|
||||
def staticQObjectMetaData(self, metaobject, offset1, offset2, step):
|
||||
items = []
|
||||
dd = metaobject["d"]
|
||||
data = self.extractPointer(dd["data"])
|
||||
sd = self.extractPointer(dd["stringdata"])
|
||||
|
||||
metaObjectVersion = self.extractInt(data)
|
||||
propertyCount = self.extractInt(data + 24)
|
||||
propertyData = self.extractInt(data + 28)
|
||||
itemCount = self.extractInt(data + offset1)
|
||||
itemData = -offset2 if offset2 < 0 else self.extractInt(data + offset2)
|
||||
|
||||
if metaObjectVersion >= 7: # Qt 5.
|
||||
byteArrayDataType = self.lookupType(self.qtNamespace() + "QByteArrayData")
|
||||
byteArrayDataSize = byteArrayDataType.sizeof
|
||||
for i in range(propertyCount):
|
||||
x = data + (propertyData + 3 * i) * 4
|
||||
for i in range(itemCount):
|
||||
x = data + (itemData + step * i) * 4
|
||||
literal = sd + self.extractInt(x) * byteArrayDataSize
|
||||
ldata, lsize, lalloc = self.byteArrayDataHelper(literal)
|
||||
properties.append(self.extractBlob(ldata, lsize).toString())
|
||||
items.append(self.extractBlob(ldata, lsize).toString())
|
||||
else: # Qt 4.
|
||||
for i in range(propertyCount):
|
||||
x = data + (propertyData + 3 * i) * 4
|
||||
for i in range(itemCount):
|
||||
x = data + (itemData + step * i) * 4
|
||||
ldata = sd + self.extractInt(x)
|
||||
properties.append(self.extractCString(ldata).decode("utf8"))
|
||||
items.append(self.extractCString(ldata).decode("utf8"))
|
||||
|
||||
return properties
|
||||
return items
|
||||
|
||||
def staticQObjectPropertyCount(self, metaobject):
|
||||
return self.extractInt(self.extractPointer(metaobject["d"]["data"]) + 24)
|
||||
|
||||
def staticQObjectPropertyNames(self, metaobject):
|
||||
return self.staticQObjectMetaData(metaobject, 24, 28, 3)
|
||||
|
||||
def staticQObjectMethodCount(self, metaobject):
|
||||
return self.extractInt(self.extractPointer(metaobject["d"]["data"]) + 16)
|
||||
|
||||
def staticQObjectMethodNames(self, metaobject):
|
||||
return self.staticQObjectMetaData(metaobject, 16, 20, 5)
|
||||
|
||||
def staticQObjectSignalCount(self, metaobject):
|
||||
return self.extractInt(self.extractPointer(metaobject["d"]["data"]) + 52)
|
||||
|
||||
def staticQObjectSignalNames(self, metaobject):
|
||||
return self.staticQObjectMetaData(metaobject, 52, -14, 5)
|
||||
|
||||
def extractCString(self, addr):
|
||||
result = bytearray()
|
||||
@@ -1071,6 +1099,14 @@ class DumperBase:
|
||||
#with SubItem(self, "[extradata]"):
|
||||
# self.putValue("0x%x" % toInteger(extraData))
|
||||
|
||||
# Parent and children.
|
||||
try:
|
||||
d_ptr = qobject["d_ptr"]["d"]
|
||||
self.putSubItem("[parent]", d_ptr["parent"])
|
||||
self.putSubItem("[children]", d_ptr["children"])
|
||||
except:
|
||||
pass
|
||||
|
||||
with SubItem(self, "[properties]"):
|
||||
propertyCount = 0
|
||||
if self.isExpanded():
|
||||
@@ -1096,6 +1132,68 @@ class DumperBase:
|
||||
self.putValue('<%s items>' % propertyCount if propertyCount else '<>0 items>')
|
||||
self.putNumChild(1)
|
||||
|
||||
with SubItem(self, "[methods]"):
|
||||
methodCount = self.staticQObjectMethodCount(smo)
|
||||
self.putItemCount(methodCount)
|
||||
self.putNumChild(methodCount)
|
||||
if self.isExpanded():
|
||||
methodNames = self.staticQObjectMethodNames(smo)
|
||||
with Children(self):
|
||||
for i in range(methodCount):
|
||||
k = methodNames[i]
|
||||
with SubItem(self, k):
|
||||
self.putEmptyValue()
|
||||
|
||||
with SubItem(self, "[signals]"):
|
||||
signalCount = self.staticQObjectSignalCount(smo)
|
||||
self.putItemCount(signalCount)
|
||||
self.putNumChild(signalCount)
|
||||
if self.isExpanded():
|
||||
signalNames = self.staticQObjectSignalNames(smo)
|
||||
signalCount = len(signalNames)
|
||||
with Children(self):
|
||||
for i in range(signalCount):
|
||||
k = signalNames[i]
|
||||
with SubItem(self, k):
|
||||
self.putEmptyValue()
|
||||
self.putQObjectConnections(qobject)
|
||||
|
||||
def putQObjectConnections(self, qobject):
|
||||
with SubItem(self, "[connections]"):
|
||||
ptrSize = self.ptrSize()
|
||||
self.putNoType()
|
||||
ns = self.qtNamespace()
|
||||
privateTypeName = ns + "QObjectPrivate"
|
||||
privateType = self.lookupType(privateTypeName)
|
||||
dd = qobject["d_ptr"]["d"]
|
||||
d_ptr = dd.cast(privateType.pointer()).dereference()
|
||||
connections = d_ptr["connectionLists"]
|
||||
if self.isNull(connections):
|
||||
self.putItemCount(0)
|
||||
self.putNumChild(0)
|
||||
else:
|
||||
connections = connections.dereference()
|
||||
connections = connections.cast(self.directBaseClass(connections.type))
|
||||
self.putValue('<>0 items>')
|
||||
self.putNumChild(1)
|
||||
if self.isExpanded():
|
||||
pp = 0
|
||||
with Children(self):
|
||||
innerType = self.templateArgument(connections.type, 0)
|
||||
# Should check: innerType == ns::QObjectPrivate::ConnectionList
|
||||
base = self.extractPointer(connections)
|
||||
data, size, alloc = self.vectorDataHelper(base)
|
||||
connectionType = self.lookupType(ns + "QObjectPrivate::Connection")
|
||||
for i in xrange(size):
|
||||
first = self.extractPointer(data + i * 2 * ptrSize)
|
||||
while first:
|
||||
self.putSubItem("%s" % pp,
|
||||
self.createPointerValue(first, connectionType))
|
||||
first = self.extractPointer(first + 3 * ptrSize)
|
||||
# We need to enforce some upper limit.
|
||||
pp += 1
|
||||
if pp > 1000:
|
||||
break
|
||||
|
||||
def isKnownMovableType(self, type):
|
||||
if type in (
|
||||
|
||||
@@ -861,6 +861,9 @@ class Dumper(DumperBase):
|
||||
def extractByte(self, addr):
|
||||
return struct.unpack("b", self.readRawMemory(addr, 1))[0]
|
||||
|
||||
def findStaticMetaObject(self, typeName):
|
||||
return self.findSymbol(typeName + "::staticMetaObject")
|
||||
|
||||
def findSymbol(self, symbolName):
|
||||
try:
|
||||
result = gdb.lookup_global_symbol(symbolName)
|
||||
|
||||
@@ -417,8 +417,16 @@ class Dumper(DumperBase):
|
||||
return self.lookupType(inner)
|
||||
|
||||
def numericTemplateArgument(self, typeobj, index):
|
||||
# There seems no API to extract the numeric value.
|
||||
inner = self.extractTemplateArgument(typeobj.GetName(), index)
|
||||
return int(inner)
|
||||
innerType = typeobj.GetTemplateArgumentType(index)
|
||||
basicType = innerType.GetBasicType()
|
||||
value = toInteger(inner)
|
||||
# Clang writes 'int' and '0xfffffff' into the debug info
|
||||
# LLDB manages to read a value of 0xfffffff...
|
||||
if basicType == lldb.eBasicTypeInt and value >= 0x8000000:
|
||||
value -= 0x100000000
|
||||
return value
|
||||
|
||||
def isReferenceType(self, typeobj):
|
||||
return typeobj.IsReferenceType()
|
||||
@@ -883,6 +891,13 @@ class Dumper(DumperBase):
|
||||
buf[i] = data.GetUnsignedInt8(error, i)
|
||||
return Blob(bytes(buf))
|
||||
|
||||
def mangleName(self, typeName):
|
||||
return '_ZN%sE' % ''.join(map(lambda x: "%d%s" % (len(x), x), typeName.split('::')))
|
||||
|
||||
def findStaticMetaObject(self, typeName):
|
||||
symbolName = self.mangleName(typeName + '::staticMetaObject')
|
||||
return self.target.FindFirstGlobalVariable(symbolName)
|
||||
|
||||
def findSymbol(self, symbolName):
|
||||
return self.target.FindFirstGlobalVariable(symbolName)
|
||||
|
||||
@@ -1169,7 +1184,6 @@ class Dumper(DumperBase):
|
||||
else:
|
||||
state = self.process.GetState()
|
||||
if state == lldb.eStateStopped:
|
||||
self.reportStack()
|
||||
self.reportStackPosition()
|
||||
self.reportThreads()
|
||||
self.reportVariables()
|
||||
@@ -1259,7 +1273,6 @@ class Dumper(DumperBase):
|
||||
stoppedThread = self.firstStoppedThread()
|
||||
if stoppedThread:
|
||||
self.process.SetSelectedThread(stoppedThread)
|
||||
self.reportStack({'stacklimit': 20})
|
||||
self.reportStackTop()
|
||||
self.reportThreads()
|
||||
self.reportLocation()
|
||||
|
||||
@@ -148,17 +148,21 @@ def qdump____m512i(d, value):
|
||||
# return "Transposed"
|
||||
|
||||
def qdump__Eigen__Matrix(d, value):
|
||||
innerType = d.templateArgument(value.type, 0)
|
||||
storage = value["m_storage"]
|
||||
options = d.numericTemplateArgument(value.type, 3)
|
||||
listType = d.directBaseClass(value.type)
|
||||
d.putItem(value.cast(listType))
|
||||
d.putBetterType(value.type)
|
||||
|
||||
def qdump__Eigen__PlainObjectBase(d, value):
|
||||
matrixType = d.templateArgument(value.type, 0)
|
||||
innerType = d.templateArgument(matrixType, 0)
|
||||
options = d.numericTemplateArgument(matrixType, 3)
|
||||
rowMajor = (int(options) & 0x1)
|
||||
argRow = d.numericTemplateArgument(value.type, 1)
|
||||
argCol = d.numericTemplateArgument(value.type, 2)
|
||||
nrows = value["m_storage"]["m_rows"] if argRow == -1 else int(argRow)
|
||||
ncols = value["m_storage"]["m_cols"] if argCol == -1 else int(argCol)
|
||||
p = storage["m_data"]
|
||||
if d.isStructType(p.type): # Static
|
||||
p = p["array"].cast(innerType.pointer())
|
||||
argRow = d.numericTemplateArgument(matrixType, 1)
|
||||
argCol = d.numericTemplateArgument(matrixType, 2)
|
||||
storage = value["m_storage"]
|
||||
nrows = toInteger(storage["m_rows"] if argRow == -1 else argRow)
|
||||
ncols = toInteger(storage["m_cols"] if argCol == -1 else argCol)
|
||||
p = d.createPointerValue(d.addressOf(value), innerType)
|
||||
d.putValue("(%s x %s), %s" % (nrows, ncols, ["ColumnMajor", "RowMajor"][rowMajor]))
|
||||
d.putField("keeporder", "1")
|
||||
d.putNumChild(nrows * ncols)
|
||||
|
||||
@@ -44,7 +44,7 @@ def qdump__QBasicAtomicInt(d, value):
|
||||
def qdump__QAtomicPointer(d, value):
|
||||
d.putType(value.type)
|
||||
q = value["_q_value"]
|
||||
p = int(q)
|
||||
p = toInteger(q)
|
||||
d.putValue("@0x%x" % p)
|
||||
d.putNumChild(1 if p else 0)
|
||||
if d.isExpanded():
|
||||
@@ -940,8 +940,9 @@ def qdump__QMapNode(d, value):
|
||||
|
||||
|
||||
def qdumpHelper__Qt4_QMap(d, value):
|
||||
d_ptr = value["d"].dereference()
|
||||
e_ptr = value["e"].dereference()
|
||||
anon = d.childAt(value, 0)
|
||||
d_ptr = anon["d"].dereference()
|
||||
e_ptr = anon["e"].dereference()
|
||||
n = int(d_ptr["size"])
|
||||
d.check(0 <= n and n <= 100*1000*1000)
|
||||
d.checkRef(d_ptr["ref"])
|
||||
@@ -1328,45 +1329,6 @@ def _qdump__QObject(d, value):
|
||||
d.putItemCount(pp)
|
||||
|
||||
|
||||
# Signals.
|
||||
signalCount = int(metaData[13])
|
||||
with SubItem(d, "signals"):
|
||||
d.putItemCount(signalCount)
|
||||
d.putNoType()
|
||||
d.putNumChild(signalCount)
|
||||
if signalCount:
|
||||
# FIXME: empty type does not work for childtype
|
||||
#d.putField("childtype", ".")
|
||||
d.putField("childnumchild", "0")
|
||||
if d.isExpanded():
|
||||
with Children(d):
|
||||
for signal in xrange(signalCount):
|
||||
with SubItem(d, signal):
|
||||
offset = metaData[14 + 5 * signal]
|
||||
d.putName("signal %d" % signal)
|
||||
d.putNoType()
|
||||
d.putValue(extractCString(metaStringData, offset))
|
||||
d.putNumChild(0) # FIXME: List the connections here.
|
||||
|
||||
# Slots.
|
||||
with SubItem(d, "slots"):
|
||||
slotCount = int(metaData[4]) - signalCount
|
||||
d.putItemCount(slotCount)
|
||||
d.putNoType()
|
||||
d.putNumChild(slotCount)
|
||||
if slotCount:
|
||||
#d.putField("childtype", ".")
|
||||
d.putField("childnumchild", "0")
|
||||
if d.isExpanded():
|
||||
with Children(d):
|
||||
for slot in xrange(slotCount):
|
||||
with SubItem(d, slot):
|
||||
offset = metaData[14 + 5 * (signalCount + slot)]
|
||||
d.putName("slot %d" % slot)
|
||||
d.putNoType()
|
||||
d.putValue(extractCString(metaStringData, offset))
|
||||
d.putNumChild(0) # FIXME: List the connections here.
|
||||
|
||||
# Active connection.
|
||||
with SubItem(d, "currentSender"):
|
||||
d.putNoType()
|
||||
@@ -2206,25 +2168,11 @@ def qform__QVector():
|
||||
|
||||
|
||||
def qdump__QVector(d, value):
|
||||
innerType = d.templateArgument(value.type, 0)
|
||||
if d.qtVersion() >= 0x050000:
|
||||
private = value["d"]
|
||||
d.checkRef(private["ref"])
|
||||
alloc = int(private["alloc"])
|
||||
size = int(private["size"])
|
||||
offset = int(private["offset"])
|
||||
data = d.pointerValue(private) + offset
|
||||
else:
|
||||
anon = d.childAt(value, 0)
|
||||
private = anon["d"]
|
||||
d.checkRef(private["ref"])
|
||||
alloc = int(private["alloc"])
|
||||
size = int(private["size"])
|
||||
data = d.addressOf(anon["p"]["array"])
|
||||
|
||||
data, size, alloc = d.vectorDataHelper(d.extractPointer(value))
|
||||
d.check(0 <= size and size <= alloc and alloc <= 1000 * 1000 * 1000)
|
||||
d.putItemCount(size)
|
||||
d.putNumChild(size)
|
||||
innerType = d.templateArgument(value.type, 0)
|
||||
d.putPlotData(innerType, data, size)
|
||||
|
||||
|
||||
|
||||
@@ -68,14 +68,6 @@ Controls.ComboBox {
|
||||
}
|
||||
}
|
||||
|
||||
onFocusChanged: {
|
||||
if (focus) {
|
||||
transaction.start();
|
||||
} else {
|
||||
transaction.end();
|
||||
}
|
||||
}
|
||||
|
||||
style: CustomComboBoxStyle {
|
||||
textColor: comboBox.textColor
|
||||
}
|
||||
|
||||
@@ -47,7 +47,9 @@ Controls.ComboBox {
|
||||
id: comboBox
|
||||
|
||||
property variant backendValue
|
||||
property color textColor: "white"
|
||||
property color textColor: colorLogic.textColor
|
||||
|
||||
onTextColorChanged: setColor()
|
||||
|
||||
editable: true
|
||||
model: ["Arial", "Times New Roman", "Courier", "Verdana", "Tahoma"]
|
||||
@@ -60,9 +62,13 @@ Controls.ComboBox {
|
||||
textColor: comboBox.textColor
|
||||
}
|
||||
|
||||
property string textValue: backendValue.value
|
||||
onTextValueChanged: {
|
||||
comboBox.editText = textValue
|
||||
ColorLogic {
|
||||
id: colorLogic
|
||||
backendValue: comboBox.backendValue
|
||||
property string textValue: backendValue.value
|
||||
onTextValueChanged: {
|
||||
comboBox.editText = textValue
|
||||
}
|
||||
}
|
||||
|
||||
Layout.fillWidth: true
|
||||
@@ -85,7 +91,6 @@ Controls.ComboBox {
|
||||
Component.onCompleted: {
|
||||
//Hack to style the text input
|
||||
for (var i = 0; i < comboBox.children.length; i++) {
|
||||
print(comboBox.children[i])
|
||||
if (comboBox.children[i].text !== undefined) {
|
||||
comboBox.children[i].color = comboBox.textColor
|
||||
comboBox.children[i].anchors.rightMargin = 34
|
||||
@@ -93,5 +98,13 @@ Controls.ComboBox {
|
||||
}
|
||||
}
|
||||
}
|
||||
function setColor() {
|
||||
//Hack to style the text input
|
||||
for (var i = 0; i < comboBox.children.length; i++) {
|
||||
if (comboBox.children[i].text !== undefined) {
|
||||
comboBox.children[i].color = comboBox.textColor
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -6,4 +6,6 @@ SpinBox {
|
||||
maximumValue: 9999999
|
||||
minimumValue: -9999999
|
||||
backendValue: backendValues.%2
|
||||
Layout.fillWidth: true
|
||||
Layout.maximumWidth: 100
|
||||
}
|
||||
|
||||
@@ -3,5 +3,10 @@ Label {
|
||||
toolTip: "%1"
|
||||
}
|
||||
SpinBox {
|
||||
maximumValue: 9999999
|
||||
minimumValue: -9999999
|
||||
decimals: 2
|
||||
backendValue: backendValues.%2
|
||||
}
|
||||
Layout.fillWidth: true
|
||||
Layout.maximumWidth: 100
|
||||
}
|
||||
|
||||
@@ -102,7 +102,7 @@ Section {
|
||||
SpinBox {
|
||||
backendValue: backendValues.width
|
||||
maximumValue: 0xffff
|
||||
minimumValue: -0xffff
|
||||
minimumValue: 0
|
||||
decimals: 0
|
||||
}
|
||||
|
||||
@@ -119,7 +119,7 @@ Section {
|
||||
SpinBox {
|
||||
backendValue: backendValues.height
|
||||
maximumValue: 0xffff
|
||||
minimumValue: -0xffff
|
||||
minimumValue: 0
|
||||
decimals: 0
|
||||
}
|
||||
ExpandingSpacer {
|
||||
|
||||
@@ -8,7 +8,7 @@ int main(int argc, char *argv[])
|
||||
QtQuick1ApplicationViewer viewer;
|
||||
viewer.addImportPath(QLatin1String("modules")); // ADDIMPORTPATH
|
||||
viewer.setOrientation(QtQuick1ApplicationViewer::ScreenOrientationAuto); // ORIENTATION
|
||||
viewer.setMainQmlFile(QLatin1String("qrc:///qml/main.qml")); // MAINQML
|
||||
viewer.setMainQmlFile(QLatin1String("qrc:///main.qml")); // MAINQML
|
||||
viewer.showExpanded();
|
||||
|
||||
return app.exec();
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>qml/main.qml</file>
|
||||
<file>main.qml</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
@@ -6,7 +6,7 @@ int main(int argc, char *argv[])
|
||||
QGuiApplication app(argc, argv);
|
||||
|
||||
QQmlApplicationEngine engine;
|
||||
engine.load(QUrl(QStringLiteral("qrc:///qml/main.qml")));
|
||||
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>qml/main.qml</file>
|
||||
<file>main.qml</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
@@ -6,7 +6,7 @@ int main(int argc, char *argv[])
|
||||
QGuiApplication app(argc, argv);
|
||||
|
||||
QQmlApplicationEngine engine;
|
||||
engine.load(QUrl(QStringLiteral("qrc:///qml/main.qml")));
|
||||
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>qml/main.qml</file>
|
||||
<file>main.qml</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
@@ -6,7 +6,7 @@ int main(int argc, char *argv[])
|
||||
QApplication app(argc, argv);
|
||||
|
||||
QQmlApplicationEngine engine;
|
||||
engine.load(QUrl(QStringLiteral("qrc:///qml/main.qml")));
|
||||
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>qml/main.qml</file>
|
||||
<file>main.qml</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
@@ -6,7 +6,7 @@ int main(int argc, char *argv[])
|
||||
QApplication app(argc, argv);
|
||||
|
||||
QQmlApplicationEngine engine;
|
||||
engine.load(QUrl(QStringLiteral("qrc:///qml/main.qml")));
|
||||
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>qml/main.qml</file>
|
||||
<file>main.qml</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
@@ -14,7 +14,11 @@ android-no-sdk {
|
||||
INSTALLS += target
|
||||
} else:unix {
|
||||
isEmpty(target.path) {
|
||||
target.path = /opt/$${TARGET}/bin
|
||||
qnx {
|
||||
target.path = /tmp/$${TARGET}/bin
|
||||
} else {
|
||||
target.path = /opt/$${TARGET}/bin
|
||||
}
|
||||
export(target.path)
|
||||
}
|
||||
INSTALLS += target
|
||||
|
||||
@@ -56,13 +56,8 @@ Rectangle {
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 18
|
||||
|
||||
text: examplesModel.readSearchStringsFromSettings()
|
||||
|
||||
placeholderText: qsTr("Search in Examples...")
|
||||
onTextChanged: {
|
||||
examplesModel.parseSearchString(text);
|
||||
examplesModel.writeSearchStringToSettings(text);
|
||||
}
|
||||
onTextChanged: examplesModel.parseSearchString(text)
|
||||
}
|
||||
|
||||
ComboBox {
|
||||
|
||||
@@ -1257,7 +1257,6 @@ void ClassOrNamespace::NestedClassInstantiator::instantiate(ClassOrNamespace *en
|
||||
}
|
||||
}
|
||||
|
||||
nestedClassOrNamespaceInstantiation->_parent = enclosingTemplateClassInstantiation;
|
||||
instantiate(nestedClassOrNamespace, nestedClassOrNamespaceInstantiation);
|
||||
|
||||
enclosingTemplateClassInstantiation->_classOrNamespaces[nestedName] =
|
||||
|
||||
@@ -165,6 +165,7 @@ DWORD WINAPI processWatcherThread(LPVOID lpParameter)
|
||||
DWORD dwExitCode;
|
||||
if (!GetExitCodeProcess(hProcess, &dwExitCode))
|
||||
dwExitCode = -1;
|
||||
CloseHandle(hProcess);
|
||||
PostMessage(hwndMain, WM_DESTROY, dwExitCode, 0);
|
||||
return 0;
|
||||
}
|
||||
@@ -185,6 +186,7 @@ bool startProcess(wchar_t *pCommandLine)
|
||||
fwprintf(stderr, L"qtcreator_ctrlc_stub: Command line failed: %s\n", pCommandLine);
|
||||
return false;
|
||||
}
|
||||
CloseHandle(pi.hThread);
|
||||
|
||||
HANDLE hThread = CreateThread(NULL, 0, processWatcherThread, reinterpret_cast<void*>(pi.hProcess), 0, NULL);
|
||||
if (!hThread) {
|
||||
|
||||
@@ -11,7 +11,8 @@ QtcLibrary {
|
||||
cpp.dynamicLibraries: [
|
||||
"user32",
|
||||
"iphlpapi",
|
||||
"ws2_32"
|
||||
"ws2_32",
|
||||
"shell32",
|
||||
]
|
||||
}
|
||||
Properties {
|
||||
|
||||
@@ -12,7 +12,7 @@ defineReplace(findLLVMConfig) {
|
||||
|
||||
# Prefer llvm-config* from LLVM_INSTALL_DIR
|
||||
!isEmpty(LLVM_INSTALL_DIR) {
|
||||
for (variant, LLVM_CONFIG_VARIANTS) {
|
||||
for(variant, LLVM_CONFIG_VARIANTS) {
|
||||
variant=$$LLVM_INSTALL_DIR/bin/$$variant
|
||||
exists($$variant) {
|
||||
return($$variant)
|
||||
@@ -23,12 +23,12 @@ defineReplace(findLLVMConfig) {
|
||||
# Find llvm-config* in PATH
|
||||
ENV_PATH = $$(PATH)
|
||||
win32 {
|
||||
ENV_PATH = $$split($$ENV_PATH, ;)
|
||||
ENV_PATH = $$split(ENV_PATH, ;)
|
||||
} else {
|
||||
ENV_PATH = $$split($$ENV_PATH, :)
|
||||
ENV_PATH = $$split(ENV_PATH, :)
|
||||
}
|
||||
for (variant, LLVM_CONFIG_VARIANTS) {
|
||||
for (path, ENV_PATH) {
|
||||
for(variant, LLVM_CONFIG_VARIANTS) {
|
||||
for(path, ENV_PATH) {
|
||||
subvariant = $$path/$$variant
|
||||
exists($$subvariant) {
|
||||
return($$subvariant)
|
||||
@@ -65,7 +65,7 @@ unix {
|
||||
|
||||
LLVM_VERSION = $$system($$LLVM_CONFIG --version)
|
||||
LLVM_VERSION = $$replace(LLVM_VERSION, ^(\\d+\\.\\d+).*$, \\1)
|
||||
message("... version $$LLVM_VERSION");
|
||||
message("... version $$LLVM_VERSION")
|
||||
|
||||
LLVM_INCLUDEPATH = $$system($$LLVM_CONFIG --includedir)
|
||||
isEmpty(LLVM_INCLUDEPATH):LLVM_INCLUDEPATH=$$LLVM_INSTALL_DIR/include
|
||||
|
||||
@@ -903,6 +903,17 @@ void CppEditorPlugin::test_FollowSymbolUnderCursor_data()
|
||||
" void foo();\n"
|
||||
"};\n"
|
||||
);
|
||||
|
||||
QTest::newRow("infiniteLoopLocalTypedef_QTCREATORBUG-11999") << _(
|
||||
"template<class MyTree>\n"
|
||||
"class TreeConstIterator\n"
|
||||
"{\n"
|
||||
" typedef TreeConstIterator<MyTree> MyIter;\n"
|
||||
" void f() { return this->@$g(); }\n"
|
||||
"};\n"
|
||||
"\n"
|
||||
"void h() { typedef TreeConstIterator<MyBase> const_iterator; }\n"
|
||||
);
|
||||
}
|
||||
|
||||
void CppEditorPlugin::test_FollowSymbolUnderCursor()
|
||||
|
||||
@@ -306,6 +306,8 @@ void CppToolsPlugin::test_completion()
|
||||
expectedCompletions.sort();
|
||||
|
||||
QEXPECT_FAIL("enum_in_function_in_struct_in_function", "doesn't work", Abort);
|
||||
QEXPECT_FAIL("nested_class_in_template_class_QTCREATORBUG-11752",
|
||||
"related to infiniteLoopLocalTypedef_QTCREATORBUG-11999", Abort);
|
||||
QCOMPARE(actualCompletions, expectedCompletions);
|
||||
}
|
||||
|
||||
|
||||
@@ -427,7 +427,10 @@ TextEditor::IAssistInterface *InternalCompletionAssistProvider::createAssistInte
|
||||
Q_UNUSED(project);
|
||||
QTC_ASSERT(editor, return 0);
|
||||
QTC_ASSERT(document, return 0);
|
||||
return new CppTools::Internal::CppCompletionAssistInterface(editor, document, position, reason);
|
||||
|
||||
CppModelManagerInterface *modelManager = CppModelManagerInterface::instance();
|
||||
return new CppTools::Internal::CppCompletionAssistInterface(editor, document, position, reason,
|
||||
modelManager->workingCopy());
|
||||
}
|
||||
|
||||
// -----------------
|
||||
@@ -1954,7 +1957,7 @@ void CppCompletionAssistInterface::getCppSpecifics() const
|
||||
CppModelManagerInterface *modelManager = CppModelManagerInterface::instance();
|
||||
if (CppEditorSupport *supp = modelManager->cppEditorSupport(m_editor)) {
|
||||
if (QSharedPointer<SnapshotUpdater> updater = supp->snapshotUpdater()) {
|
||||
updater->update(modelManager->workingCopy());
|
||||
updater->update(m_workingCopy);
|
||||
m_snapshot = updater->snapshot();
|
||||
m_includePaths = updater->includePaths();
|
||||
m_frameworkPaths = updater->frameworkPaths();
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#define CPPCOMPLETIONASSIST_H
|
||||
|
||||
#include "cppcompletionassistprovider.h"
|
||||
#include "cppmodelmanagerinterface.h"
|
||||
|
||||
#include <cplusplus/Icons.h>
|
||||
#include <cplusplus/TypeOfExpression.h>
|
||||
@@ -175,11 +176,13 @@ public:
|
||||
CppCompletionAssistInterface(TextEditor::BaseTextEditor *editor,
|
||||
QTextDocument *textDocument,
|
||||
int position,
|
||||
TextEditor::AssistReason reason)
|
||||
TextEditor::AssistReason reason,
|
||||
const CppModelManagerInterface::WorkingCopy &workingCopy)
|
||||
: TextEditor::DefaultAssistInterface(textDocument, position, editor->document()->filePath(),
|
||||
reason)
|
||||
, m_editor(editor)
|
||||
, m_gotCppSpecifics(false)
|
||||
, m_workingCopy(workingCopy)
|
||||
{}
|
||||
|
||||
CppCompletionAssistInterface(QTextDocument *textDocument,
|
||||
@@ -206,6 +209,7 @@ private:
|
||||
|
||||
TextEditor::BaseTextEditor *m_editor;
|
||||
mutable bool m_gotCppSpecifics;
|
||||
CppModelManagerInterface::WorkingCopy m_workingCopy;
|
||||
mutable CPlusPlus::Snapshot m_snapshot;
|
||||
mutable QStringList m_includePaths;
|
||||
mutable QStringList m_frameworkPaths;
|
||||
|
||||
@@ -261,10 +261,10 @@ CppCompletionAssistProvider *CppEditorSupport::completionAssistProvider() const
|
||||
|
||||
QSharedPointer<SnapshotUpdater> CppEditorSupport::snapshotUpdater()
|
||||
{
|
||||
QSharedPointer<SnapshotUpdater> updater = m_snapshotUpdater;
|
||||
QSharedPointer<SnapshotUpdater> updater = snapshotUpdater_internal();
|
||||
if (!updater || updater->fileInEditor() != fileName()) {
|
||||
updater = QSharedPointer<SnapshotUpdater>(new SnapshotUpdater(fileName()));
|
||||
m_snapshotUpdater = updater;
|
||||
setSnapshotUpdater_internal(updater);
|
||||
|
||||
QSharedPointer<CppCodeModelSettings> cms = CppToolsPlugin::instance()->codeModelSettings();
|
||||
updater->setUsePrecompiledHeaders(cms->pchUsage() != CppCodeModelSettings::PchUse_None);
|
||||
@@ -282,7 +282,8 @@ void CppEditorSupport::updateDocument()
|
||||
m_updateDocumentTimer->start(m_updateDocumentInterval);
|
||||
}
|
||||
|
||||
static void parse(QFutureInterface<void> &future, QSharedPointer<SnapshotUpdater> updater)
|
||||
static void parse(QFutureInterface<void> &future, QSharedPointer<SnapshotUpdater> updater,
|
||||
CppModelManagerInterface::WorkingCopy workingCopy)
|
||||
{
|
||||
future.setProgressRange(0, 1);
|
||||
if (future.isCanceled()) {
|
||||
@@ -291,7 +292,7 @@ static void parse(QFutureInterface<void> &future, QSharedPointer<SnapshotUpdater
|
||||
}
|
||||
|
||||
CppModelManager *cmm = qobject_cast<CppModelManager *>(CppModelManager::instance());
|
||||
updater->update(cmm->workingCopy());
|
||||
updater->update(workingCopy);
|
||||
cmm->finishedRefreshingSourceFiles(QStringList(updater->fileInEditor()));
|
||||
|
||||
future.setProgressValue(1);
|
||||
@@ -310,7 +311,8 @@ void CppEditorSupport::updateDocumentNow()
|
||||
if (m_highlightingSupport && !m_highlightingSupport->requiresSemanticInfo())
|
||||
startHighlighting();
|
||||
|
||||
m_documentParser = QtConcurrent::run(&parse, snapshotUpdater());
|
||||
m_documentParser = QtConcurrent::run(&parse, snapshotUpdater(),
|
||||
CppModelManager::instance()->workingCopy());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -518,15 +520,8 @@ SemanticInfo::Source CppEditorSupport::currentSource(bool force)
|
||||
int line = 0, column = 0;
|
||||
m_textEditor->convertPosition(m_textEditor->editorWidget()->position(), &line, &column);
|
||||
|
||||
const Snapshot snapshot = snapshotUpdater()->snapshot();
|
||||
|
||||
QByteArray code;
|
||||
if (force || m_lastSemanticInfo.revision != editorRevision())
|
||||
code = contents(); // get the source code only when needed.
|
||||
|
||||
const unsigned revision = editorRevision();
|
||||
SemanticInfo::Source source(snapshot, fileName(), code, line, column, revision, force);
|
||||
return source;
|
||||
return SemanticInfo::Source(Snapshot(), fileName(), contents(), line, column, editorRevision(),
|
||||
force);
|
||||
}
|
||||
|
||||
void CppEditorSupport::recalculateSemanticInfoNow(const SemanticInfo::Source &source,
|
||||
@@ -541,6 +536,7 @@ void CppEditorSupport::recalculateSemanticInfoNow(const SemanticInfo::Source &so
|
||||
semanticInfo.forced = source.force;
|
||||
|
||||
if (!source.force
|
||||
&& m_lastSemanticInfo.complete
|
||||
&& m_lastSemanticInfo.revision == source.revision
|
||||
&& m_lastSemanticInfo.doc
|
||||
&& m_lastSemanticInfo.doc->translationUnit()->ast()
|
||||
@@ -551,9 +547,13 @@ void CppEditorSupport::recalculateSemanticInfoNow(const SemanticInfo::Source &so
|
||||
}
|
||||
|
||||
if (semanticInfo.doc.isNull()) {
|
||||
semanticInfo.snapshot = source.snapshot;
|
||||
if (source.snapshot.contains(source.fileName)) {
|
||||
Document::Ptr doc = source.snapshot.preprocessedDocument(source.code, source.fileName);
|
||||
const QSharedPointer<SnapshotUpdater> snapshotUpdater = snapshotUpdater_internal();
|
||||
QTC_ASSERT(snapshotUpdater, return);
|
||||
semanticInfo.snapshot = snapshotUpdater->snapshot();
|
||||
|
||||
if (semanticInfo.snapshot.contains(source.fileName)) {
|
||||
Document::Ptr doc = semanticInfo.snapshot.preprocessedDocument(source.code,
|
||||
source.fileName);
|
||||
if (processor)
|
||||
doc->control()->setTopLevelDeclarationProcessor(processor);
|
||||
doc->check();
|
||||
@@ -592,6 +592,18 @@ void CppEditorSupport::recalculateSemanticInfoDetached_helper(QFutureInterface<v
|
||||
recalculateSemanticInfoNow(source, true, &processor);
|
||||
}
|
||||
|
||||
QSharedPointer<SnapshotUpdater> CppEditorSupport::snapshotUpdater_internal() const
|
||||
{
|
||||
QMutexLocker locker(&m_snapshotUpdaterLock);
|
||||
return m_snapshotUpdater;
|
||||
}
|
||||
|
||||
void CppEditorSupport::setSnapshotUpdater_internal(const QSharedPointer<SnapshotUpdater> &updater)
|
||||
{
|
||||
QMutexLocker locker(&m_snapshotUpdaterLock);
|
||||
m_snapshotUpdater = updater;
|
||||
}
|
||||
|
||||
void CppEditorSupport::onMimeTypeChanged()
|
||||
{
|
||||
m_highlighter.cancel();
|
||||
|
||||
@@ -197,6 +197,9 @@ private:
|
||||
void recalculateSemanticInfoDetached_helper(QFutureInterface<void> &future,
|
||||
SemanticInfo::Source source);
|
||||
|
||||
QSharedPointer<SnapshotUpdater> snapshotUpdater_internal() const;
|
||||
void setSnapshotUpdater_internal(const QSharedPointer<SnapshotUpdater> &updater);
|
||||
|
||||
private:
|
||||
Internal::CppModelManager *m_modelManager;
|
||||
QPointer<TextEditor::BaseTextEditor> m_textEditor;
|
||||
@@ -225,6 +228,7 @@ private:
|
||||
mutable QMutex m_lastSemanticInfoLock;
|
||||
SemanticInfo m_lastSemanticInfo;
|
||||
QFuture<void> m_futureSemanticInfo;
|
||||
mutable QMutex m_snapshotUpdaterLock;
|
||||
QSharedPointer<SnapshotUpdater> m_snapshotUpdater;
|
||||
|
||||
// Highlighting:
|
||||
|
||||
@@ -2059,13 +2059,15 @@ void DebuggerPluginPrivate::requestMark(ITextEditor *editor,
|
||||
if (kind != ITextEditor::BreakpointRequest)
|
||||
return;
|
||||
|
||||
if (editor->property("DisassemblerView").toBool()) {
|
||||
QString line = editor->textDocument()->plainText()
|
||||
.section(QLatin1Char('\n'), lineNumber - 1, lineNumber - 1);
|
||||
quint64 address = DisassemblerLine::addressFromDisassemblyLine(line);
|
||||
toggleBreakpointByAddress(address);
|
||||
} else if (editor->document()) {
|
||||
toggleBreakpointByFileAndLine(editor->document()->filePath(), lineNumber);
|
||||
if (IDocument *document = editor->document()) {
|
||||
if (document->property(Constants::OPENED_WITH_DISASSEMBLY).toBool()) {
|
||||
QString line = editor->textDocument()->plainText()
|
||||
.section(QLatin1Char('\n'), lineNumber - 1, lineNumber - 1);
|
||||
quint64 address = DisassemblerLine::addressFromDisassemblyLine(line);
|
||||
toggleBreakpointByAddress(address);
|
||||
} else {
|
||||
toggleBreakpointByFileAndLine(document->filePath(), lineNumber);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -491,15 +491,17 @@ void LldbEngine::activateFrame(int frameIndex)
|
||||
if (state() != InferiorStopOk && state() != InferiorUnrunnable)
|
||||
return;
|
||||
|
||||
int limit = debuggerCore()->action(MaximalStackDepth)->value().toInt();
|
||||
int n = stackHandler()->stackSize();
|
||||
if (frameIndex == n)
|
||||
limit = n * 10 + 3;
|
||||
const int n = stackHandler()->stackSize();
|
||||
if (frameIndex == n) {
|
||||
Command cmd("reportStack");
|
||||
cmd.arg("stacklimit", n * 10 + 3);
|
||||
runCommand(cmd);
|
||||
return;
|
||||
}
|
||||
|
||||
Command cmd("activateFrame");
|
||||
cmd.arg("index", frameIndex);
|
||||
cmd.arg("thread", threadsHandler()->currentThread().raw());
|
||||
cmd.arg("stacklimit", limit);
|
||||
runCommand(cmd);
|
||||
|
||||
updateAll();
|
||||
@@ -883,9 +885,24 @@ bool LldbEngine::setToolTipExpression(const QPoint &mousePos,
|
||||
void LldbEngine::updateAll()
|
||||
{
|
||||
reloadRegisters();
|
||||
updateStack();
|
||||
updateLocals();
|
||||
}
|
||||
|
||||
void LldbEngine::reloadFullStack()
|
||||
{
|
||||
Command cmd("reportStack");
|
||||
cmd.arg("stacklimit", -1);
|
||||
runCommand(cmd);
|
||||
}
|
||||
|
||||
void LldbEngine::updateStack()
|
||||
{
|
||||
Command cmd("reportStack");
|
||||
cmd.arg("stacklimit", 20);
|
||||
runCommand(cmd);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Watch specific stuff
|
||||
|
||||
@@ -134,7 +134,7 @@ private:
|
||||
void reloadModules();
|
||||
void reloadRegisters();
|
||||
void reloadSourceFiles() {}
|
||||
void reloadFullStack() {}
|
||||
void reloadFullStack();
|
||||
void fetchDisassembler(Internal::DisassemblerAgent *);
|
||||
void refreshDisassembly(const GdbMi &data);
|
||||
|
||||
@@ -161,6 +161,7 @@ private:
|
||||
Q_SLOT void handleResponse(const QByteArray &data);
|
||||
Q_SLOT void runEngine2();
|
||||
Q_SLOT void updateAll();
|
||||
Q_SLOT void updateStack();
|
||||
Q_SLOT void updateLocals();
|
||||
Q_SLOT void createFullBacktrace();
|
||||
void doUpdateLocals(UpdateParameters params);
|
||||
|
||||
@@ -88,19 +88,19 @@ void DeviceApplicationRunner::start(const IDevice::ConstPtr &device,
|
||||
|
||||
d->state = Run;
|
||||
if (!device) {
|
||||
emit reportError(tr("Cannot run: No device."));
|
||||
doReportError(tr("Cannot run: No device."));
|
||||
setFinished();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!device->canCreateProcess()) {
|
||||
emit reportError(tr("Cannot run: Device is not able to create processes."));
|
||||
doReportError(tr("Cannot run: Device is not able to create processes."));
|
||||
setFinished();
|
||||
return;
|
||||
}
|
||||
|
||||
if (command.isEmpty()) {
|
||||
emit reportError(tr("Cannot run: No command given."));
|
||||
doReportError(tr("Cannot run: No command given."));
|
||||
setFinished();
|
||||
return;
|
||||
}
|
||||
@@ -139,7 +139,7 @@ void DeviceApplicationRunner::stop()
|
||||
void DeviceApplicationRunner::handleApplicationError(QProcess::ProcessError error)
|
||||
{
|
||||
if (error == QProcess::FailedToStart) {
|
||||
emit reportError(tr("Application failed to start: %1")
|
||||
doReportError(tr("Application failed to start: %1")
|
||||
.arg(d->deviceProcess->errorString()));
|
||||
setFinished();
|
||||
}
|
||||
@@ -165,13 +165,11 @@ void DeviceApplicationRunner::handleApplicationFinished()
|
||||
QTC_ASSERT(d->state == Run, return);
|
||||
|
||||
if (d->deviceProcess->exitStatus() == QProcess::CrashExit) {
|
||||
emit reportError(d->deviceProcess->errorString());
|
||||
d->success = false;
|
||||
doReportError(d->deviceProcess->errorString());
|
||||
} else {
|
||||
const int exitCode = d->deviceProcess->exitCode();
|
||||
if (exitCode != 0) {
|
||||
emit reportError(tr("Application finished with exit code %1.").arg(exitCode));
|
||||
d->success = false;
|
||||
doReportError(tr("Application finished with exit code %1.").arg(exitCode));
|
||||
} else {
|
||||
emit reportProgress(tr("Application finished with exit code 0."));
|
||||
}
|
||||
@@ -191,4 +189,10 @@ void DeviceApplicationRunner::handleRemoteStderr()
|
||||
emit remoteStderr(d->deviceProcess->readAllStandardError());
|
||||
}
|
||||
|
||||
void DeviceApplicationRunner::doReportError(const QString &message)
|
||||
{
|
||||
d->success = false;
|
||||
emit reportError(message);
|
||||
}
|
||||
|
||||
} // namespace ProjectExplorer
|
||||
|
||||
@@ -73,6 +73,7 @@ private slots:
|
||||
void handleRemoteStderr();
|
||||
|
||||
private:
|
||||
void doReportError(const QString &message);
|
||||
void setFinished();
|
||||
|
||||
class DeviceApplicationRunnerPrivate;
|
||||
|
||||
@@ -1994,9 +1994,10 @@ bool ProjectExplorerPlugin::saveModifiedFiles()
|
||||
tr("Always save files before build"), &alwaysSave)) {
|
||||
if (cancelled)
|
||||
return false;
|
||||
if (alwaysSave)
|
||||
d->m_projectExplorerSettings.saveBeforeBuild = true;
|
||||
}
|
||||
|
||||
if (alwaysSave)
|
||||
d->m_projectExplorerSettings.saveBeforeBuild = true;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
||||
@@ -327,9 +327,11 @@ void TaskModel::setFileNotFound(const QModelIndex &idx, bool b)
|
||||
/////
|
||||
|
||||
TaskFilterModel::TaskFilterModel(TaskModel *sourceModel, QObject *parent) : QAbstractItemModel(parent),
|
||||
m_mappingUpToDate(false), m_sourceModel(sourceModel)
|
||||
m_sourceModel(sourceModel)
|
||||
{
|
||||
Q_ASSERT(m_sourceModel);
|
||||
updateMapping();
|
||||
|
||||
connect(m_sourceModel, SIGNAL(rowsInserted(QModelIndex,int,int)),
|
||||
this, SLOT(handleNewRows(QModelIndex,int,int)));
|
||||
connect(m_sourceModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
|
||||
@@ -472,15 +474,12 @@ QModelIndex TaskFilterModel::mapToSource(const QModelIndex &index) const
|
||||
void TaskFilterModel::invalidateFilter()
|
||||
{
|
||||
beginResetModel();
|
||||
m_mappingUpToDate = false;
|
||||
updateMapping();
|
||||
endResetModel();
|
||||
}
|
||||
|
||||
void TaskFilterModel::updateMapping() const
|
||||
{
|
||||
if (m_mappingUpToDate)
|
||||
return;
|
||||
|
||||
m_mapping.clear();
|
||||
for (int i = 0; i < m_sourceModel->rowCount(); ++i) {
|
||||
QModelIndex index = m_sourceModel->index(i, 0);
|
||||
@@ -488,8 +487,6 @@ void TaskFilterModel::updateMapping() const
|
||||
if (filterAcceptsTask(task))
|
||||
m_mapping.append(i);
|
||||
}
|
||||
|
||||
m_mappingUpToDate = true;
|
||||
}
|
||||
|
||||
bool TaskFilterModel::filterAcceptsTask(const Task &task) const
|
||||
|
||||
@@ -179,7 +179,6 @@ private:
|
||||
QList<Core::Id> m_categoryIds;
|
||||
|
||||
mutable QList<int> m_mapping;
|
||||
mutable bool m_mappingUpToDate;
|
||||
|
||||
TaskModel *m_sourceModel;
|
||||
};
|
||||
|
||||
@@ -468,6 +468,7 @@ void QbsProjectManagerPlugin::buildFiles(QbsProject *project, const QStringList
|
||||
BuildManager::buildList(bc->stepList(buildStep), name);
|
||||
|
||||
bc->setChangedFiles(QStringList());
|
||||
bc->setActiveFileTags(QStringList());
|
||||
}
|
||||
|
||||
void QbsProjectManagerPlugin::buildSingleFile(QbsProject *project, const QString &file)
|
||||
|
||||
@@ -208,7 +208,6 @@ void QtQuickApp::setTemplateInfo(const TemplateInfo &templateInfo)
|
||||
|
||||
QString QtQuickApp::pathExtended(int fileType) const
|
||||
{
|
||||
const QString qmlSubDir = QLatin1String("qml/");
|
||||
const QString appViewerTargetSubDir = appViewerOriginSubDir();
|
||||
|
||||
const QString mainQmlFile = QLatin1String("main.qml");
|
||||
@@ -219,8 +218,8 @@ QString QtQuickApp::pathExtended(int fileType) const
|
||||
const QString pathBase = outputPathBase();
|
||||
|
||||
switch (fileType) {
|
||||
case MainQml: return pathBase + qmlSubDir + mainQmlFile;
|
||||
case MainQmlOrigin: return originsRoot() + qmlSubDir + mainQmlFile;
|
||||
case MainQml: return pathBase + mainQmlFile;
|
||||
case MainQmlOrigin: return originsRoot() + mainQmlFile;
|
||||
case MainQrc: return pathBase + mainQrcFile;
|
||||
case MainQrcOrigin: return originsRoot() + mainQrcFile;
|
||||
case QrcDeployment: return pathBase + qrcDeploymentFile;
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
namespace QmlDesigner {
|
||||
namespace Constants {
|
||||
|
||||
const char C_BACKSPACE[] = "QmlDesigner.Backspace";
|
||||
const char C_DELETE[] = "QmlDesigner.Delete";
|
||||
|
||||
// Context
|
||||
|
||||
@@ -115,11 +115,19 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex
|
||||
|
||||
//Edit Menu
|
||||
|
||||
command = Core::ActionManager::registerAction(&m_deleteAction, QmlDesigner::Constants::C_BACKSPACE, qmlDesignerFormEditorContext);
|
||||
command = Core::ActionManager::registerAction(&m_deleteAction, QmlDesigner::Constants::C_BACKSPACE, qmlDesignerNavigatorContext);
|
||||
command->setDefaultKeySequence(QKeySequence(Qt::Key_Backspace));
|
||||
command->setAttribute(Core::Command::CA_Hide); // don't show delete in other modes
|
||||
if (Utils::HostOsInfo::isMacHost())
|
||||
editMenu->addAction(command, Core::Constants::G_EDIT_COPYPASTE);
|
||||
|
||||
command = Core::ActionManager::registerAction(&m_deleteAction, QmlDesigner::Constants::C_DELETE, qmlDesignerFormEditorContext);
|
||||
command = Core::ActionManager::registerAction(&m_deleteAction, QmlDesigner::Constants::C_DELETE, qmlDesignerNavigatorContext);
|
||||
command->setDefaultKeySequence(QKeySequence::Delete);
|
||||
command->setAttribute(Core::Command::CA_Hide); // don't show delete in other modes
|
||||
editMenu->addAction(command, Core::Constants::G_EDIT_COPYPASTE);
|
||||
if (!Utils::HostOsInfo::isMacHost())
|
||||
editMenu->addAction(command, Core::Constants::G_EDIT_COPYPASTE);
|
||||
|
||||
command = Core::ActionManager::registerAction(&m_cutAction, Core::Constants::CUT, qmlDesignerFormEditorContext);
|
||||
command = Core::ActionManager::registerAction(&m_cutAction, Core::Constants::CUT, qmlDesignerNavigatorContext);
|
||||
@@ -159,16 +167,6 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex
|
||||
viewsMenu->addAction(command);
|
||||
|
||||
command = Core::ActionManager::registerAction(&m_hideSidebarsAction, Core::Constants::TOGGLE_SIDEBAR, qmlDesignerMainContext);
|
||||
|
||||
if (Utils::HostOsInfo::isMacHost()) {
|
||||
// add second shortcut to trigger delete
|
||||
QAction *deleteAction = new QAction(this);
|
||||
deleteAction->setShortcut(QKeySequence(QLatin1String("Backspace")));
|
||||
connect(deleteAction,
|
||||
SIGNAL(triggered()),
|
||||
&m_deleteAction,
|
||||
SIGNAL(triggered()));
|
||||
}
|
||||
}
|
||||
|
||||
void ShortCutManager::updateActions(Core::IEditor* currentEditor)
|
||||
|
||||
@@ -98,6 +98,8 @@ Canvas {
|
||||
onPaint: {
|
||||
if (context === null)
|
||||
return; // canvas isn't ready
|
||||
|
||||
context.reset();
|
||||
Plotter.qmlProfilerModelProxy = qmlProfilerModelProxy;
|
||||
if (dataReady) {
|
||||
Plotter.plot(canvas, context, region);
|
||||
|
||||
@@ -50,6 +50,8 @@ Canvas {
|
||||
onPaint: {
|
||||
if (context === null)
|
||||
return; // canvas isn't ready
|
||||
|
||||
context.reset();
|
||||
context.fillStyle = "white";
|
||||
context.fillRect(0, 0, width, height);
|
||||
|
||||
|
||||
@@ -49,6 +49,8 @@ Canvas {
|
||||
onPaint: {
|
||||
if (context === null)
|
||||
return; // canvas isn't ready
|
||||
|
||||
context.reset();
|
||||
drawBackgroundBars( context, region );
|
||||
|
||||
var totalTime = endTime - startTime;
|
||||
|
||||
@@ -74,7 +74,7 @@ PaintEventsModelProxy::PaintEventsModelProxy(QObject *parent)
|
||||
void PaintEventsModelProxy::clear()
|
||||
{
|
||||
Q_D(PaintEventsModelProxy);
|
||||
d->SortedTimelineModel::clear();
|
||||
d->clear();
|
||||
d->maxGuiThreadAnimations = d->maxRenderThreadAnimations = 0;
|
||||
d->expanded = false;
|
||||
d->seenForeignPaintEvent = false;
|
||||
|
||||
@@ -80,7 +80,7 @@ BasicTimelineModel::BasicTimelineModel(QObject *parent)
|
||||
void BasicTimelineModel::clear()
|
||||
{
|
||||
Q_D(BasicTimelineModel);
|
||||
d->SortedTimelineModel::clear();
|
||||
d->clear();
|
||||
d->eventDict.clear();
|
||||
d->eventHashes.clear();
|
||||
d->categorySpan.clear();
|
||||
|
||||
@@ -54,7 +54,6 @@ static bool debugExamples()
|
||||
}
|
||||
|
||||
static const char kSelectedExampleSetKey[] = "WelcomePage/SelectedExampleSet";
|
||||
static const char kExamplesSearchStringKey[] = "WelcomePage/ExamplesSearchString";
|
||||
|
||||
void ExampleSetModel::writeCurrentIdToSettings(int currentIndex) const
|
||||
{
|
||||
@@ -842,16 +841,6 @@ void ExamplesListModelFilter::filterForExampleSet(int index)
|
||||
m_sourceModel->selectExampleSet(index);
|
||||
}
|
||||
|
||||
void ExamplesListModelFilter::writeSearchStringToSettings(const QString &string)
|
||||
{
|
||||
Core::ICore::settings()->setValue(QLatin1String(kExamplesSearchStringKey), string);
|
||||
}
|
||||
|
||||
QString ExamplesListModelFilter::readSearchStringsFromSettings()
|
||||
{
|
||||
return Core::ICore::settings()->value(QLatin1String(kExamplesSearchStringKey)).toString();
|
||||
}
|
||||
|
||||
void ExamplesListModelFilter::setShowTutorialsOnly(bool showTutorialsOnly)
|
||||
{
|
||||
m_showTutorialsOnly = showTutorialsOnly;
|
||||
|
||||
@@ -185,8 +185,6 @@ public:
|
||||
QAbstractItemModel* exampleSetModel();
|
||||
|
||||
Q_INVOKABLE void filterForExampleSet(int index);
|
||||
Q_INVOKABLE void writeSearchStringToSettings(const QString &string);
|
||||
Q_INVOKABLE QString readSearchStringsFromSettings();
|
||||
|
||||
public slots:
|
||||
void setFilterTags(const QStringList &arg)
|
||||
|
||||
@@ -232,83 +232,32 @@ void SyntaxHighlighterPrivate::reformatBlock(const QTextBlock &block, int from,
|
||||
|
||||
/*!
|
||||
\class SyntaxHighlighter
|
||||
\reentrant
|
||||
|
||||
\brief The SyntaxHighlighter class allows you to define syntax
|
||||
highlighting rules, and in addition you can use the class to query
|
||||
\brief The SyntaxHighlighter class allows you to define syntax highlighting rules and to query
|
||||
a document's current formatting or user data.
|
||||
|
||||
\since 4.1
|
||||
The SyntaxHighlighter class is a copied and forked version of the QSyntaxHighlighter. There are
|
||||
a couple of binary incompatible changes that prevent doing this directly in Qt.
|
||||
|
||||
\ingroup richtext-processing
|
||||
The main difference from the QSyntaxHighlighter is the addition of setExtraAdditionalFormats.
|
||||
This method prevents redoing syntax highlighting when setting the additionalFormats on the
|
||||
layout and subsequently marking the document contents dirty. It thus prevents the redoing of the
|
||||
semantic highlighting, which sets extra additionalFormats, and so on.
|
||||
|
||||
The SyntaxHighlighter class is a base class for implementing
|
||||
QTextEdit syntax highlighters. A syntax highligher automatically
|
||||
highlights parts of the text in a QTextEdit, or more generally in
|
||||
a QTextDocument. Syntax highlighters are often used when the user
|
||||
is entering text in a specific format (for example source code)
|
||||
and help the user to read the text and identify syntax errors.
|
||||
Another way to implement the semantic highlighting is to use ExtraSelections on
|
||||
Q(Plain)TextEdit. The drawback of QTextEdit::setExtraSelections is that ExtraSelection uses a
|
||||
QTextCursor for positioning. That means that with every document change (that is, every
|
||||
keystroke), a whole bunch of cursors can be re-checked or re-calculated. This is not needed in
|
||||
our situation, because the next thing that will happen is that the highlighting will come up
|
||||
with new ranges, meaning that it destroys the cursors. To make things worse, QTextCursor
|
||||
calculates the pixel position in the line it's in. The calculations are done with
|
||||
QTextLine::cursorTo, which is very expensive and is not optimized for fixed-width fonts. Another
|
||||
reason not to use ExtraSelections is that those selections belong to the editor, not to the
|
||||
document. This means that every editor needs a highlighter, instead of every document. This
|
||||
could become expensive when multiple editors with the same document are opened.
|
||||
|
||||
To provide your own syntax highlighting, you must subclass
|
||||
SyntaxHighlighter and reimplement highlightBlock().
|
||||
|
||||
When you create an instance of your SyntaxHighlighter subclass,
|
||||
pass it the QTextEdit or QTextDocument that you want the syntax
|
||||
highlighting to be applied to. For example:
|
||||
|
||||
\snippet doc/src/snippets/code/src_gui_text_SyntaxHighlighter.cpp 0
|
||||
|
||||
After this your highlightBlock() function will be called
|
||||
automatically whenever necessary. Use your highlightBlock()
|
||||
function to apply formatting (e.g. setting the font and color) to
|
||||
the text that is passed to it. SyntaxHighlighter provides the
|
||||
setFormat() function which applies a given QTextCharFormat on
|
||||
the current text block. For example:
|
||||
|
||||
\snippet doc/src/snippets/code/src_gui_text_SyntaxHighlighter.cpp 1
|
||||
|
||||
Some syntaxes can have constructs that span several text
|
||||
blocks. For example, a C++ syntax highlighter should be able to
|
||||
cope with \c{/}\c{*...*}\c{/} multiline comments. To deal with
|
||||
these cases it is necessary to know the end state of the previous
|
||||
text block (e.g. "in comment").
|
||||
|
||||
Inside your highlightBlock() implementation you can query the end
|
||||
state of the previous text block using the previousBlockState()
|
||||
function. After parsing the block you can save the last state
|
||||
using setCurrentBlockState().
|
||||
|
||||
The currentBlockState() and previousBlockState() functions return
|
||||
an int value. If no state is set, the returned value is -1. You
|
||||
can designate any other value to identify any given state using
|
||||
the setCurrentBlockState() function. Once the state is set the
|
||||
QTextBlock keeps that value until it is set set again or until the
|
||||
corresponding paragraph of text is deleted.
|
||||
|
||||
For example, if you're writing a simple C++ syntax highlighter,
|
||||
you might designate 1 to signify "in comment":
|
||||
|
||||
\snippet doc/src/snippets/code/src_gui_text_SyntaxHighlighter.cpp 2
|
||||
|
||||
In the example above, we first set the current block state to
|
||||
0. Then, if the previous block ended within a comment, we higlight
|
||||
from the beginning of the current block (\c {startIndex =
|
||||
0}). Otherwise, we search for the given start expression. If the
|
||||
specified end expression cannot be found in the text block, we
|
||||
change the current block state by calling setCurrentBlockState(),
|
||||
and make sure that the rest of the block is higlighted.
|
||||
|
||||
In addition you can query the current formatting and user data
|
||||
using the format() and currentBlockUserData() functions
|
||||
respectively. You can also attach user data to the current text
|
||||
block using the setCurrentBlockUserData() function.
|
||||
QTextBlockUserData can be used to store custom settings. In the
|
||||
case of syntax highlighting, it is in particular interesting as
|
||||
cache storage for information that you may figure out while
|
||||
parsing the paragraph's text. For an example, see the
|
||||
setCurrentBlockUserData() documentation.
|
||||
|
||||
\sa QTextEdit, {Syntax Highlighter Example}
|
||||
So, we use AdditionalFormats, because all those highlights should get removed or redone soon
|
||||
after the change happens.
|
||||
*/
|
||||
|
||||
/*!
|
||||
|
||||
@@ -34,12 +34,14 @@
|
||||
|
||||
#include <coreplugin/idocument.h>
|
||||
#include <extensionsystem/pluginmanager.h>
|
||||
#include <projectexplorer/buildconfiguration.h>
|
||||
#include <projectexplorer/buildtargetinfo.h>
|
||||
#include <projectexplorer/target.h>
|
||||
#include <projectexplorer/project.h>
|
||||
#include <projectexplorer/kitinformation.h>
|
||||
#include <qtsupport/qtkitinformation.h>
|
||||
|
||||
using ProjectExplorer::BuildConfiguration;
|
||||
using ProjectExplorer::DeviceKitInformation;
|
||||
using ProjectExplorer::IDevice;
|
||||
using ProjectExplorer::RunControl;
|
||||
@@ -82,6 +84,9 @@ WinRtRunControl::WinRtRunControl(WinRtRunConfiguration *runConfiguration, RunMod
|
||||
|
||||
m_arguments = runConfiguration->arguments();
|
||||
m_uninstallAfterStop = runConfiguration->uninstallAfterStop();
|
||||
|
||||
if (BuildConfiguration *bc = target->activeBuildConfiguration())
|
||||
m_environment = bc->environment();
|
||||
}
|
||||
|
||||
void WinRtRunControl::start()
|
||||
@@ -196,6 +201,7 @@ bool WinRtRunControl::startWinRtRunner()
|
||||
m_state = StartingState;
|
||||
m_process->setUseCtrlCStub(true);
|
||||
m_process->setCommand(m_runnerFilePath, runnerArgs);
|
||||
m_process->setEnvironment(m_environment);
|
||||
m_process->setWorkingDirectory(QFileInfo(m_executableFilePath).absolutePath());
|
||||
m_process->start();
|
||||
return true;
|
||||
|
||||
@@ -78,6 +78,7 @@ private:
|
||||
bool m_uninstallAfterStop;
|
||||
bool m_isWinPhone;
|
||||
Utils::QtcProcess *m_process;
|
||||
Utils::Environment m_environment;
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
|
||||
@@ -23,7 +23,8 @@ equals(QMAKE_HOST.os, Windows) {
|
||||
QMAKE_EXT_OBJ = .obj
|
||||
QMAKE_EXT_RES = .res
|
||||
QMAKE_SH =
|
||||
PATH = $$split($$(PATH), ;)
|
||||
PATH = $$(PATH)
|
||||
PATH = $$split(PATH, ;)
|
||||
for(dir, PATH) {
|
||||
exists($$dir/sh.exe) {
|
||||
QMAKE_SH = $$dir/sh.exe
|
||||
|
||||
@@ -907,7 +907,6 @@ GdbRunner::GdbRunner(IosTool *iosTool, int gdbFd) :
|
||||
|
||||
void GdbRunner::run()
|
||||
{
|
||||
m_iosTool->errorMsg(QString::fromLatin1("GdbRunner in thread %1").arg((quintptr)(void *)QThread::currentThread()));
|
||||
{
|
||||
QMutexLocker l(&m_iosTool->m_xmlMutex);
|
||||
if (!m_iosTool->splitAppOutput) {
|
||||
|
||||
@@ -372,9 +372,19 @@ bool AddKitOperation::test() const
|
||||
return false;
|
||||
|
||||
QVariantMap data = profile0.value(QLatin1String(DATA)).toMap();
|
||||
if (data.count() != 8
|
||||
if (data.count() != 6
|
||||
|| !data.contains(QLatin1String(DEBUGGER))
|
||||
|| data.value(QLatin1String(DEBUGGER)).type()!= QVariant::Map)
|
||||
|| data.value(QLatin1String(DEBUGGER)).type() != QVariant::Map
|
||||
|| !data.contains(QLatin1String(DEVICE_TYPE))
|
||||
|| data.value(QLatin1String(DEVICE_TYPE)).toString() != QLatin1String("Desktop")
|
||||
|| !data.contains(QLatin1String(TOOLCHAIN))
|
||||
|| data.value(QLatin1String(TOOLCHAIN)).toString() != QLatin1String("{tc-id}")
|
||||
|| !data.contains(QLatin1String(QT))
|
||||
|| data.value(QLatin1String(QT)).toString() != QLatin1String("SDK.{qt-id}")
|
||||
|| !data.contains(QLatin1String(MKSPEC))
|
||||
|| data.value(QLatin1String(MKSPEC)).toString() != QLatin1String("unsupported/mkspec")
|
||||
|| !data.contains(QLatin1String("extraData"))
|
||||
|| data.value(QLatin1String("extraData")).toString() != QLatin1String("extraValue"))
|
||||
return false;
|
||||
|
||||
// Ignore existing ids:
|
||||
@@ -391,7 +401,7 @@ bool AddKitOperation::test() const
|
||||
map = addKit(map, tcMap, qtMap, devMap,
|
||||
QLatin1String("testId2"), QLatin1String("Test Kit2"), QLatin1String("/tmp/icon2.png"),
|
||||
QString(), 1, QLatin1String("/usr/bin/gdb-test2"),
|
||||
QByteArray("Desktop"), QLatin1String("{dev-id}"), QString(),
|
||||
QByteArray("Desktop"), QLatin1String("{dev-id}"), QLatin1String("/sys/root\\\\"),
|
||||
QLatin1String("{tc-id}"), QLatin1String("{qt-id}"), QLatin1String("unsupported/mkspec"),
|
||||
KeyValuePairList() << KeyValuePair(QLatin1String("PE.Profile.Data/extraData"), QVariant(QLatin1String("extraValue"))));
|
||||
if (map.count() != 5
|
||||
@@ -425,10 +435,22 @@ bool AddKitOperation::test() const
|
||||
|
||||
data = profile1.value(QLatin1String(DATA)).toMap();
|
||||
if (data.count() != 8
|
||||
|| !data.contains(QLatin1String(DEBUGGER))
|
||||
|| data.value(QLatin1String(DEBUGGER)).type() != QVariant::Map
|
||||
|| !data.contains(QLatin1String(DEVICE_TYPE))
|
||||
|| data.value(QLatin1String(DEVICE_TYPE)).toString() != QLatin1String("Desktop")
|
||||
|| !data.contains(QLatin1String(DEVICE_ID))
|
||||
|| data.value(QLatin1String(DEVICE_ID)).toString() != QLatin1String("{dev-id}")
|
||||
|| !data.contains(QLatin1String(DEBUGGER))
|
||||
|| data.value(QLatin1String(DEBUGGER)).type() != QVariant::Map)
|
||||
|| !data.contains(QLatin1String(SYSROOT))
|
||||
|| data.value(QLatin1String(SYSROOT)).toString() != QLatin1String("/sys/root\\\\")
|
||||
|| !data.contains(QLatin1String(TOOLCHAIN))
|
||||
|| data.value(QLatin1String(TOOLCHAIN)).toString() != QLatin1String("{tc-id}")
|
||||
|| !data.contains(QLatin1String(QT))
|
||||
|| data.value(QLatin1String(QT)).toString() != QLatin1String("SDK.{qt-id}")
|
||||
|| !data.contains(QLatin1String(MKSPEC))
|
||||
|| data.value(QLatin1String(MKSPEC)).toString() != QLatin1String("unsupported/mkspec")
|
||||
|| !data.contains(QLatin1String("extraData"))
|
||||
|| data.value(QLatin1String("extraData")).toString() != QLatin1String("extraValue"))
|
||||
return false;
|
||||
|
||||
// Test debugger id:
|
||||
@@ -471,7 +493,7 @@ bool AddKitOperation::test() const
|
||||
return false;
|
||||
|
||||
data = profile2.value(QLatin1String(DATA)).toMap();
|
||||
if (data.count() != 8
|
||||
if (data.count() != 6
|
||||
|| !data.contains(QLatin1String(DEBUGGER))
|
||||
|| data.value(QLatin1String(DEBUGGER)).toString() != QLatin1String("debugger Id"))
|
||||
return false;
|
||||
@@ -577,27 +599,35 @@ QVariantMap AddKitOperation::addKit(const QVariantMap &map, const QVariantMap &t
|
||||
data << KeyValuePair(QStringList() << kit << QLatin1String(AUTODETECTED), QVariant(true));
|
||||
data << KeyValuePair(QStringList() << kit << QLatin1String(SDK), QVariant(true));
|
||||
|
||||
if (debuggerId.isEmpty()) {
|
||||
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA)
|
||||
<< QLatin1String(DEBUGGER) << QLatin1String(DEBUGGER_ENGINE), QVariant(debuggerType));
|
||||
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA)
|
||||
<< QLatin1String(DEBUGGER) << QLatin1String(DEBUGGER_BINARY), QVariant(debugger));
|
||||
} else {
|
||||
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA) << QLatin1String(DEBUGGER),
|
||||
QVariant(debuggerId));
|
||||
if (!debuggerId.isNull() || !debugger.isNull()) {
|
||||
if (debuggerId.isEmpty()) {
|
||||
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA)
|
||||
<< QLatin1String(DEBUGGER) << QLatin1String(DEBUGGER_ENGINE), QVariant(debuggerType));
|
||||
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA)
|
||||
<< QLatin1String(DEBUGGER) << QLatin1String(DEBUGGER_BINARY), QVariant(debugger));
|
||||
} else {
|
||||
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA) << QLatin1String(DEBUGGER),
|
||||
QVariant(debuggerId));
|
||||
}
|
||||
}
|
||||
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA)
|
||||
<< QLatin1String(DEVICE_TYPE), QVariant(deviceType));
|
||||
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA)
|
||||
<< QLatin1String(DEVICE_ID), QVariant(device));
|
||||
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA)
|
||||
<< QLatin1String(SYSROOT), QVariant(sysRoot));
|
||||
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA)
|
||||
<< QLatin1String(TOOLCHAIN), QVariant(tc));
|
||||
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA)
|
||||
<< QLatin1String(QT), QVariant(qtId));
|
||||
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA)
|
||||
<< QLatin1String(MKSPEC), QVariant(mkspec));
|
||||
if (!deviceType.isNull())
|
||||
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA)
|
||||
<< QLatin1String(DEVICE_TYPE), QVariant(deviceType));
|
||||
if (!device.isNull())
|
||||
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA)
|
||||
<< QLatin1String(DEVICE_ID), QVariant(device));
|
||||
if (!sysRoot.isNull())
|
||||
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA)
|
||||
<< QLatin1String(SYSROOT), QVariant(sysRoot));
|
||||
if (!tc.isNull())
|
||||
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA)
|
||||
<< QLatin1String(TOOLCHAIN), QVariant(tc));
|
||||
if (!qtId.isNull())
|
||||
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA)
|
||||
<< QLatin1String(QT), QVariant(qtId));
|
||||
if (!mkspec.isNull())
|
||||
data << KeyValuePair(QStringList() << kit << QLatin1String(DATA)
|
||||
<< QLatin1String(MKSPEC), QVariant(mkspec));
|
||||
|
||||
data << KeyValuePair(QStringList() << QLatin1String(DEFAULT), QVariant(defaultKit));
|
||||
data << KeyValuePair(QStringList() << QLatin1String(COUNT), QVariant(count + 1));
|
||||
|
||||
@@ -762,8 +762,13 @@ private:
|
||||
void tst_Dumpers::initTestCase()
|
||||
{
|
||||
m_debuggerBinary = qgetenv("QTC_DEBUGGER_PATH_FOR_TEST");
|
||||
if (m_debuggerBinary.isEmpty())
|
||||
if (m_debuggerBinary.isEmpty()) {
|
||||
#ifdef Q_OS_MAC
|
||||
m_debuggerBinary = "/Applications/Xcode.app/Contents/Developer/usr/bin/lldb";
|
||||
#else
|
||||
m_debuggerBinary = "gdb";
|
||||
#endif
|
||||
}
|
||||
qDebug() << "Debugger : " << m_debuggerBinary.constData();
|
||||
|
||||
m_debuggerEngine = GdbEngine;
|
||||
@@ -813,7 +818,7 @@ void tst_Dumpers::initTestCase()
|
||||
m_env = QProcessEnvironment::systemEnvironment();
|
||||
m_makeBinary = QString::fromLocal8Bit(qgetenv("QTC_MAKE_PATH_FOR_TEST"));
|
||||
#ifdef Q_OS_WIN
|
||||
if (m_makeBinary.isEmpty()) {
|
||||
if (m_makeBinary.isEmpty())
|
||||
m_makeBinary = QLatin1String("mingw32-make");
|
||||
// if qmake is not in PATH make sure the correct libs for inferior are prepended to PATH
|
||||
if (m_qmakeBinary != "qmake") {
|
||||
@@ -822,10 +827,9 @@ void tst_Dumpers::initTestCase()
|
||||
m_env = env.toProcessEnvironment();
|
||||
}
|
||||
#else
|
||||
if (m_makeBinary.isEmpty()) {
|
||||
if (m_makeBinary.isEmpty())
|
||||
m_makeBinary = QLatin1String("make");
|
||||
#endif
|
||||
}
|
||||
qDebug() << "Make path : " << m_makeBinary;
|
||||
qDebug() << "Gdb version : " << m_gdbVersion;
|
||||
} else if (m_debuggerEngine == CdbEngine) {
|
||||
|
||||
@@ -3,11 +3,27 @@ import "../../../autotest.qbs" as Autotest
|
||||
|
||||
Autotest {
|
||||
name: "QmlProjectManager file format autotest"
|
||||
Depends { name: "QmlProjectManager" }
|
||||
Depends { name: "QmlJS" }
|
||||
Depends { name: "Utils" }
|
||||
Depends { name: "Qt"; submodules: ["script", "declarative"]; }
|
||||
Depends { name: "Qt.widgets" } // TODO: Remove when qbs bug is fixed
|
||||
property path fileFormatDir: project.ide_source_tree + "/src/plugins/qmlprojectmanager/fileformat"
|
||||
files: "tst_fileformat.cpp"
|
||||
cpp.includePaths: base.concat([project.ide_source_tree + "/src/plugins/qmlprojectmanager/fileformat"])
|
||||
cpp.defines: base.concat(['SRCDIR="' + path + '"'])
|
||||
Group {
|
||||
name: "Files from QmlProjectManager"
|
||||
prefix: product.fileFormatDir + '/'
|
||||
files: [
|
||||
"filefilteritems.cpp",
|
||||
"filefilteritems.h",
|
||||
"qmlprojectfileformat.cpp",
|
||||
"qmlprojectfileformat.h",
|
||||
"qmlprojectitem.cpp",
|
||||
"qmlprojectitem.h",
|
||||
]
|
||||
}
|
||||
cpp.includePaths: base.concat([fileFormatDir])
|
||||
cpp.defines: base.concat([
|
||||
'QT_CREATOR',
|
||||
'SRCDIR="' + path + '"'
|
||||
])
|
||||
}
|
||||
|
||||
@@ -108,7 +108,11 @@
|
||||
#define USE_PRIVATE 1
|
||||
#endif
|
||||
|
||||
#ifdef HAS_EIGEN
|
||||
#ifdef HAS_EIGEN2
|
||||
#define USE_EIGEN 1
|
||||
#endif
|
||||
|
||||
#ifdef HAS_EIGEN3
|
||||
#define USE_EIGEN 1
|
||||
#endif
|
||||
|
||||
@@ -231,7 +235,7 @@ void dummyStatement(...) {}
|
||||
#endif
|
||||
|
||||
#if USE_EIGEN
|
||||
#include <eigen2/Eigen/Core>
|
||||
#include <Eigen/Core>
|
||||
#endif
|
||||
|
||||
#if USE_PRIVATE
|
||||
@@ -1781,7 +1785,9 @@ namespace qobject {
|
||||
QObject child(&parent);
|
||||
child.setObjectName("A Child");
|
||||
QObject::connect(&child, SIGNAL(destroyed()), &parent, SLOT(deleteLater()));
|
||||
QObject::connect(&child, SIGNAL(destroyed()), &child, SLOT(deleteLater()));
|
||||
QObject::disconnect(&child, SIGNAL(destroyed()), &parent, SLOT(deleteLater()));
|
||||
QObject::disconnect(&child, SIGNAL(destroyed()), &child, SLOT(deleteLater()));
|
||||
child.setObjectName("A renamed Child");
|
||||
BREAK_HERE;
|
||||
// Check child "A renamed Child" QObject.
|
||||
@@ -1813,6 +1819,7 @@ namespace qobject {
|
||||
Q_PROPERTY(QString myProp1 READ myProp1 WRITE setMyProp1)
|
||||
QString myProp1() const { return m_myProp1; }
|
||||
Q_SLOT void setMyProp1(const QString&mt) { m_myProp1 = mt; }
|
||||
Q_INVOKABLE void foo() {}
|
||||
|
||||
Q_PROPERTY(QString myProp2 READ myProp2 WRITE setMyProp2)
|
||||
QString myProp2() const { return m_myProp2; }
|
||||
@@ -1824,6 +1831,9 @@ namespace qobject {
|
||||
Q_PROPERTY(long myProp4 READ myProp4)
|
||||
long myProp4() const { return 44; }
|
||||
|
||||
Q_SIGNAL void sigFoo();
|
||||
Q_SIGNAL void sigBar(int);
|
||||
|
||||
public:
|
||||
Ui *m_ui;
|
||||
QString m_myProp1;
|
||||
|
||||
@@ -44,7 +44,23 @@ maemo5 {
|
||||
|
||||
exists($$QMAKE_INCDIR_QT/QtCore/private/qobject_p.h):DEFINES += HAS_PRIVATE
|
||||
exists(/usr/include/boost/optional.hpp): DEFINES += HAS_BOOST
|
||||
exists(/usr/include/eigen2/Eigen/Core): DEFINES += HAS_EIGEN
|
||||
|
||||
exists(/usr/include/eigen2/Eigen/Core) {
|
||||
DEFINES += HAS_EIGEN2
|
||||
INCLUDEPATH += /usr/include/eigen2
|
||||
}
|
||||
exists(/usr/include/eigen3/Eigen/Core) {
|
||||
DEFINES += HAS_EIGEN3
|
||||
INCLUDEPATH += /usr/include/eigen3
|
||||
}
|
||||
exists(/usr/local/include/eigen2/Eigen/Core) {
|
||||
DEFINES += HAS_EIGEN2
|
||||
INCLUDEPATH += /usr/local/include/eigen2
|
||||
}
|
||||
exists(/usr/local/include/eigen3/Eigen/Core) {
|
||||
DEFINES += HAS_EIGEN3
|
||||
INCLUDEPATH += /usr/local/include/eigen3
|
||||
}
|
||||
|
||||
win32-msvc*:DEFINES += _CRT_SECURE_NO_WARNINGS
|
||||
# Use for semi-automated testing
|
||||
|
||||
@@ -37,7 +37,7 @@ def startQtCreatorWithNewAppAtQMLEditor(projectDir, projectName, line = None):
|
||||
# create qt quick application
|
||||
createNewQtQuickApplication(projectDir, projectName)
|
||||
# open qml file
|
||||
qmlFile = projectName + ".Resources.qml\.qrc./.qml/main\\.qml"
|
||||
qmlFile = projectName + ".Resources.qml\.qrc./.main\\.qml"
|
||||
if not openDocument(qmlFile):
|
||||
test.fatal("Could not open %s" % qmlFile)
|
||||
invokeMenuItem("File", "Exit")
|
||||
|
||||
@@ -56,7 +56,7 @@ def main():
|
||||
test.passes("Refactoring was properly applied in source file")
|
||||
else:
|
||||
test.fail("Refactoring of Text to MyComponent failed in source file. Content of editor:\n%s" % codeText)
|
||||
myCompTE = "SampleApp.Resources.qml\\.qrc./.qml/MyComponent\\.qml"
|
||||
myCompTE = "SampleApp.Resources.qml\\.qrc./.MyComponent\\.qml"
|
||||
# there should be new QML file generated with name "MyComponent.qml"
|
||||
try:
|
||||
waitForObjectItem(":Qt Creator_Utils::NavigationTreeView", myCompTE, 3000)
|
||||
@@ -86,6 +86,6 @@ def main():
|
||||
#save and exit
|
||||
invokeMenuItem("File", "Save All")
|
||||
# check if new file was created in file system
|
||||
test.verify(os.path.exists(os.path.join(projectDir, "SampleApp", "qml", "MyComponent.qml")),
|
||||
test.verify(os.path.exists(os.path.join(projectDir, "SampleApp", "MyComponent.qml")),
|
||||
"Verifying if MyComponent.qml exists in file system after save")
|
||||
invokeMenuItem("File", "Exit")
|
||||
|
||||
@@ -38,7 +38,7 @@ def main():
|
||||
# create qt quick application
|
||||
createNewQtQuickApplication(tempDir(), "SampleApp")
|
||||
# create syntax error in qml file
|
||||
openDocument("SampleApp.Resources.qml\.qrc./.qml/main\\.qml")
|
||||
openDocument("SampleApp.Resources.qml\.qrc./.main\\.qml")
|
||||
if not appendToLine(waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget"), "Text {", "SyntaxError"):
|
||||
invokeMenuItem("File", "Exit")
|
||||
return
|
||||
|
||||
@@ -48,14 +48,14 @@ def main():
|
||||
'onTriggered: console.log("Break here")'])
|
||||
invokeMenuItem("File", "Save All")
|
||||
filesAndLines = [
|
||||
{ "%s.Resources.qml\.qrc./.qml/main\\.qml" % projectName : 'onTriggered.*' },
|
||||
{ "%s.Resources.qml\.qrc./.main\\.qml" % projectName : 'onTriggered.*' },
|
||||
{ "%s.Sources.main\\.cpp" % projectName : "viewer.setOrientation\\(.+\\);" }
|
||||
]
|
||||
test.log("Setting breakpoints")
|
||||
result = setBreakpointsForCurrentProject(filesAndLines)
|
||||
if result:
|
||||
expectedBreakpointsOrder = [{os.path.join(workingDir, projectName, "main.cpp"):10},
|
||||
{os.path.join(workingDir, projectName, "qml", "main.qml"):10}]
|
||||
{os.path.join(workingDir, projectName, "main.qml"):10}]
|
||||
# Only use 4.7.4 to work around QTBUG-25187
|
||||
availableConfigs = iterateBuildConfigs(len(checkedTargets), "Debug")
|
||||
progressBarWait()
|
||||
|
||||
@@ -45,7 +45,7 @@ def main():
|
||||
invokeMenuItem("File", "Exit")
|
||||
|
||||
def prepareQmlFile():
|
||||
if not openDocument("untitled.Resources.qml\.qrc./.qml/main\\.qml"):
|
||||
if not openDocument("untitled.Resources.qml\.qrc./.main\\.qml"):
|
||||
test.fatal("Could not open main.qml")
|
||||
return None
|
||||
editor = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget")
|
||||
|
||||
@@ -39,6 +39,9 @@ def verifyCloneLog(targetDir, canceled):
|
||||
summary = "Failed."
|
||||
else:
|
||||
cloneLog = str(waitForObject(":Git Repository Clone.logPlainTextEdit_QPlainTextEdit").plainText)
|
||||
if "fatal: The remote end hung up unexpectedly" in cloneLog:
|
||||
test.warning("Remote end hung up unexpectedly.")
|
||||
return False
|
||||
# test for QTCREATORBUG-10112
|
||||
test.compare(cloneLog.count("remote: Counting objects:"), 1)
|
||||
test.compare(cloneLog.count("remote: Finding sources:"), 1)
|
||||
@@ -52,6 +55,7 @@ def verifyCloneLog(targetDir, canceled):
|
||||
resultLabel = findObject(":Git Repository Clone.Result._QLabel")
|
||||
test.verify(waitFor('str(resultLabel.text) == summary', 3000),
|
||||
"Verifying expected result (%s)" % summary)
|
||||
return True
|
||||
|
||||
def verifyVersionControlView(targetDir, canceled):
|
||||
openVcsLog()
|
||||
@@ -100,7 +104,9 @@ def main():
|
||||
verifyCloneLog(targetDir, True)
|
||||
clickButton(":Git Repository Clone.Cancel_QPushButton")
|
||||
else:
|
||||
verifyCloneLog(targetDir, False)
|
||||
if not verifyCloneLog(targetDir, False):
|
||||
clickButton(":Git Repository Clone.Cancel_QPushButton")
|
||||
continue
|
||||
verifyFiles(targetDir)
|
||||
try:
|
||||
clickButton(waitForObject(button))
|
||||
|
||||