Merge remote-tracking branch 'origin/3.1'

This commit is contained in:
Eike Ziller
2014-04-14 16:53:23 +02:00
92 changed files with 38015 additions and 40668 deletions

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 /^\}/
*/

View File

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

View File

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

View File

@@ -39,6 +39,7 @@ Product {
property string pluginIncludeBase: ".." // #include <plugin/header.h>
cpp.includePaths: [pluginIncludeBase]
cpp.minimumWindowsVersion: "5.1"
Group {
name: "PluginSpec"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -68,14 +68,6 @@ Controls.ComboBox {
}
}
onFocusChanged: {
if (focus) {
transaction.start();
} else {
transaction.end();
}
}
style: CustomComboBoxStyle {
textColor: comboBox.textColor
}

View File

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

View File

@@ -6,4 +6,6 @@ SpinBox {
maximumValue: 9999999
minimumValue: -9999999
backendValue: backendValues.%2
Layout.fillWidth: true
Layout.maximumWidth: 100
}

View File

@@ -3,5 +3,10 @@ Label {
toolTip: "%1"
}
SpinBox {
maximumValue: 9999999
minimumValue: -9999999
decimals: 2
backendValue: backendValues.%2
}
Layout.fillWidth: true
Layout.maximumWidth: 100
}

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
<RCC>
<qresource prefix="/">
<file>qml/main.qml</file>
<file>main.qml</file>
</qresource>
</RCC>

View File

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

View File

@@ -1,5 +1,5 @@
<RCC>
<qresource prefix="/">
<file>qml/main.qml</file>
<file>main.qml</file>
</qresource>
</RCC>

View File

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

View File

@@ -1,5 +1,5 @@
<RCC>
<qresource prefix="/">
<file>qml/main.qml</file>
<file>main.qml</file>
</qresource>
</RCC>

View File

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

View File

@@ -1,5 +1,5 @@
<RCC>
<qresource prefix="/">
<file>qml/main.qml</file>
<file>main.qml</file>
</qresource>
</RCC>

View File

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

View File

@@ -1,5 +1,5 @@
<RCC>
<qresource prefix="/">
<file>qml/main.qml</file>
<file>main.qml</file>
</qresource>
</RCC>

View File

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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -1257,7 +1257,6 @@ void ClassOrNamespace::NestedClassInstantiator::instantiate(ClassOrNamespace *en
}
}
nestedClassOrNamespaceInstantiation->_parent = enclosingTemplateClassInstantiation;
instantiate(nestedClassOrNamespace, nestedClassOrNamespaceInstantiation);
enclosingTemplateClassInstantiation->_classOrNamespaces[nestedName] =

View File

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

View File

@@ -11,7 +11,8 @@ QtcLibrary {
cpp.dynamicLibraries: [
"user32",
"iphlpapi",
"ws2_32"
"ws2_32",
"shell32",
]
}
Properties {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -73,6 +73,7 @@ private slots:
void handleRemoteStderr();
private:
void doReportError(const QString &message);
void setFinished();
class DeviceApplicationRunnerPrivate;

View File

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

View File

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

View File

@@ -179,7 +179,6 @@ private:
QList<Core::Id> m_categoryIds;
mutable QList<int> m_mapping;
mutable bool m_mappingUpToDate;
TaskModel *m_sourceModel;
};

View File

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

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

View File

@@ -33,6 +33,7 @@
namespace QmlDesigner {
namespace Constants {
const char C_BACKSPACE[] = "QmlDesigner.Backspace";
const char C_DELETE[] = "QmlDesigner.Delete";
// Context

View File

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

View File

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

View File

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

View File

@@ -49,6 +49,8 @@ Canvas {
onPaint: {
if (context === null)
return; // canvas isn't ready
context.reset();
drawBackgroundBars( context, region );
var totalTime = endTime - startTime;

View File

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

View File

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

View File

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

View File

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

View File

@@ -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.
*/
/*!

View File

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

View File

@@ -78,6 +78,7 @@ private:
bool m_uninstallAfterStop;
bool m_isWinPhone;
Utils::QtcProcess *m_process;
Utils::Environment m_environment;
};
} // namespace Internal

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 + '"'
])
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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