forked from qt-creator/qt-creator
Merge remote-tracking branch 'origin/2.7'
Conflicts: src/plugins/cpptools/cppchecksymbols.h src/plugins/qmldesigner/components/formeditor/resizecontroller.cpp Change-Id: I887ba071fa637ad44e39bcae581738fa078a6612
This commit is contained in:
@@ -268,16 +268,23 @@
|
|||||||
|
|
||||||
\li \c fieldpagetitle specifies the title of the page.
|
\li \c fieldpagetitle specifies the title of the page.
|
||||||
|
|
||||||
\li \c field specifies whether the field is mandatory (\c true or
|
\li \c fields specifies the user interface objects on the page.
|
||||||
\c false). You can use the value of the \c name field as a
|
|
||||||
variable in other files (for example, \c {%MESSAGE%}.
|
|
||||||
|
|
||||||
\li \c fieldcontrol specifies the field. \c class specifies the
|
\li \c field specifies one object. You can use a set of interface objects
|
||||||
field type. You can use interface objects from the QWidget class
|
from QtWidgets classes, derived from QWidget, to create fields. This example
|
||||||
to create fields. This example uses QLineEdit to create an input
|
uses QLineEdit to create an input field. For more information about the objects
|
||||||
field.
|
that you can add, see \l {Supported Widgets}.
|
||||||
|
|
||||||
\li \c validator specifies a regular expression to check the
|
\li \c mandatory specifies whether the field is mandatory (\c true or
|
||||||
|
\c false). For more information, see QWizardPage::registerField().
|
||||||
|
|
||||||
|
\li \c name specifies a name that you can use as a placeholder variable in the
|
||||||
|
template file (for example, \c {%MESSAGE%}).
|
||||||
|
|
||||||
|
\li \c class specifies the type of the \c fieldcontrol. The XML attributes that you
|
||||||
|
can specify for the field depend on the field type.
|
||||||
|
|
||||||
|
\li For a QLineEdit, \c validator specifies a regular expression to check the
|
||||||
characters allowed in the field.
|
characters allowed in the field.
|
||||||
|
|
||||||
\li \c defaulttext specifies text that appears in the field by
|
\li \c defaulttext specifies text that appears in the field by
|
||||||
@@ -292,7 +299,7 @@
|
|||||||
|
|
||||||
\section1 Creating Class Wizards
|
\section1 Creating Class Wizards
|
||||||
|
|
||||||
The widget.xml file for a class wizard is very similar to that for a project
|
The wizard.xml file for a class wizard is very similar to that for a project
|
||||||
wizard. The differences are discussed below.
|
wizard. The differences are discussed below.
|
||||||
|
|
||||||
To create a class wizard:
|
To create a class wizard:
|
||||||
@@ -360,9 +367,18 @@
|
|||||||
<fielddescription xml:lang="de">Klassenname:</fielddescription>
|
<fielddescription xml:lang="de">Klassenname:</fielddescription>
|
||||||
</field>
|
</field>
|
||||||
<field name="Datatype">
|
<field name="Datatype">
|
||||||
|
<fieldcontrol class="QComboBox" defaultindex="0">
|
||||||
<fieldcontrol class="QComboBox" combochoices="QString,int" defaultindex="0" />
|
<comboentries>
|
||||||
|
<comboentry value="QString">
|
||||||
|
<comboentrytext>class QString</comboentrytext>
|
||||||
|
<comboentrytext xml:lang="de">Klasse QString</comboentrytext>
|
||||||
|
</comboentry>
|
||||||
|
<comboentry value="int">
|
||||||
|
<comboentrytext>Integer</comboentrytext>
|
||||||
|
<comboentrytext xml:lang="de">Ganzzahlwert</comboentrytext>
|
||||||
|
</comboentry>
|
||||||
|
</comboentries>
|
||||||
|
</fieldcontrol>
|
||||||
<fielddescription>Data type:</fielddescription>
|
<fielddescription>Data type:</fielddescription>
|
||||||
<fielddescription xml:lang="de">Datentyp:</fielddescription>
|
<fielddescription xml:lang="de">Datentyp:</fielddescription>
|
||||||
</field>
|
</field>
|
||||||
@@ -371,11 +387,85 @@
|
|||||||
\endcode
|
\endcode
|
||||||
|
|
||||||
In addition to QLineEdit, QComboBox is used in the class wizard to
|
In addition to QLineEdit, QComboBox is used in the class wizard to
|
||||||
create a field. \c combochoices specifies the options in the combobox
|
create a field. Specify the following XML attributes:
|
||||||
and \c defaultindex specifies that QString is the default value.
|
|
||||||
|
\list
|
||||||
|
|
||||||
|
\li \c defaultindex specifies which comboentry is displayed by default. In the above
|
||||||
|
example, "0" means that the first comboentry is the default value.
|
||||||
|
|
||||||
|
\li \c comboentries specifies the options in the combobox.
|
||||||
|
|
||||||
|
\li \c value specifies the type of each \c comboentry, QString or integer.
|
||||||
|
|
||||||
|
\li \c comboentrytext specifies the text of the entry.
|
||||||
|
|
||||||
|
\endlist
|
||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
|
\section1 Supported Widgets
|
||||||
|
|
||||||
|
You can use the following interface objects to create fields in the wizards:
|
||||||
|
|
||||||
|
\list
|
||||||
|
|
||||||
|
\li PathChooser utility to set paths
|
||||||
|
|
||||||
|
\li Check boxes with text labels (QCheckBox)
|
||||||
|
|
||||||
|
\li Combined button and popup lists (QComboBox)
|
||||||
|
|
||||||
|
\li One-line text editors (QLineEdit)
|
||||||
|
|
||||||
|
\li Multi-line rich text editors (QTextEdit)
|
||||||
|
|
||||||
|
\endlist
|
||||||
|
|
||||||
|
Using QLineEdit and QComboBox is described in the previous sections.
|
||||||
|
The following sections show examples of using the other classes and describe the XML
|
||||||
|
attributes that you can specify for the \c fieldcontrol element of a field in a particular
|
||||||
|
\c class.
|
||||||
|
|
||||||
|
\section2 Path Choosers
|
||||||
|
|
||||||
|
\code
|
||||||
|
<field mandatory="true" name="QtCreatorSources">
|
||||||
|
<fieldcontrol class="Utils::PathChooser" defaulttext="" />
|
||||||
|
<fielddescription>Qt Creator sources:</fielddescription>
|
||||||
|
</field>
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
The \c defaulttext attribute specifies text that appears in the field by default.
|
||||||
|
|
||||||
|
\section2 Check Boxes
|
||||||
|
|
||||||
|
To make check boxes appear selected by default, set the \c fieldcontrol attribute
|
||||||
|
\c defaultvalue to \c true. Any other value or omitting the attribute makes the check box
|
||||||
|
appear not selected.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
\code
|
||||||
|
<field name="CONSOLE">
|
||||||
|
<fieldcontrol class="QCheckBox" defaultvalue="true"/>
|
||||||
|
<fielddescription>Console application</fielddescription>
|
||||||
|
</field>
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
For more examples about using check boxes, see \l{Processing Template Files}.
|
||||||
|
|
||||||
|
\section2 Text Editors
|
||||||
|
|
||||||
|
\code
|
||||||
|
<field name="License">
|
||||||
|
<fieldcontrol class="QTextEdit" defaulttext="Put your license text here" />
|
||||||
|
<fielddescription>License:</fielddescription>
|
||||||
|
</field>
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
The \c defaulttext attribute specifies text that appears in the field by default.
|
||||||
|
|
||||||
\section1 Processing Template Files
|
\section1 Processing Template Files
|
||||||
|
|
||||||
When processing a template source file, placeholders specifying the field
|
When processing a template source file, placeholders specifying the field
|
||||||
@@ -396,9 +486,29 @@
|
|||||||
|
|
||||||
\endlist
|
\endlist
|
||||||
|
|
||||||
|
In the \c{helloworld} example, the placeholder \c %NETWORK% is used together with the
|
||||||
|
QCheckBox class. The following line is added to the project file:
|
||||||
|
|
||||||
|
\code
|
||||||
|
%NETWORK%QT += network
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
And the following field is specified in the wizard.xml:
|
||||||
|
|
||||||
|
\code
|
||||||
|
<field name="NETWORK">
|
||||||
|
<fieldcontrol class="QCheckBox" truevalue="" falsevalue="# "/>
|
||||||
|
<fielddescription>Include network module</fielddescription>
|
||||||
|
<fielddescription xml:lang="de">Netzwerk-Modul verwenden</fielddescription>
|
||||||
|
</field>
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
If the checkbox is checked, the placeholder is replaced by \c truevalue. If it is not
|
||||||
|
checked, the placeholder is replaced by \c falsevalue.
|
||||||
|
|
||||||
You can use conditions to add sections of the file depending on field
|
You can use conditions to add sections of the file depending on field
|
||||||
values. Use a syntax that is similar to C++ preprocessing, as demonstrated
|
values. Use a syntax that is similar to C++ preprocessing, as demonstrated
|
||||||
in the profile of the \c{helloworld} example:
|
in the project file of the \c{helloworld} example:
|
||||||
|
|
||||||
\code
|
\code
|
||||||
|
|
||||||
@@ -412,6 +522,16 @@
|
|||||||
whether the script module is added. The expressions must expand to valid
|
whether the script module is added. The expressions must expand to valid
|
||||||
Javascript expressions after field replacement.
|
Javascript expressions after field replacement.
|
||||||
|
|
||||||
|
For example, the following field is specified in the wizard.xml:
|
||||||
|
|
||||||
|
\code
|
||||||
|
<field name="SCRIPT">
|
||||||
|
<fieldcontrol class="QCheckBox"/>
|
||||||
|
<fielddescription>Include script module</fielddescription>
|
||||||
|
<fielddescription xml:lang="de">Script-Modul verwenden</fielddescription>
|
||||||
|
</field>
|
||||||
|
\endcode
|
||||||
|
|
||||||
\section1 Pre-defined Standard Variables
|
\section1 Pre-defined Standard Variables
|
||||||
|
|
||||||
In addition to the field values entered by the user, you can use
|
In addition to the field values entered by the user, you can use
|
||||||
|
@@ -54,6 +54,17 @@
|
|||||||
#include <private/qqmltimer_p.h>
|
#include <private/qqmltimer_p.h>
|
||||||
#include <private/qqmlengine_p.h>
|
#include <private/qqmlengine_p.h>
|
||||||
|
|
||||||
|
static bool isPropertyBlackListed(const QmlDesigner::PropertyName &propertyName)
|
||||||
|
{
|
||||||
|
if (propertyName.contains(".") && propertyName.contains("__"))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (propertyName.count(".") > 1)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
namespace QmlDesigner {
|
namespace QmlDesigner {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
@@ -534,6 +545,9 @@ void ObjectNodeInstance::refreshProperty(const PropertyName &name)
|
|||||||
|
|
||||||
bool ObjectNodeInstance::hasBindingForProperty(const PropertyName &name, bool *hasChanged) const
|
bool ObjectNodeInstance::hasBindingForProperty(const PropertyName &name, bool *hasChanged) const
|
||||||
{
|
{
|
||||||
|
if (isPropertyBlackListed(name))
|
||||||
|
return false;
|
||||||
|
|
||||||
QQmlProperty property(object(), name, context());
|
QQmlProperty property(object(), name, context());
|
||||||
|
|
||||||
bool hasBinding = QQmlPropertyPrivate::binding(property);
|
bool hasBinding = QQmlPropertyPrivate::binding(property);
|
||||||
@@ -602,6 +616,9 @@ QVariant ObjectNodeInstance::property(const PropertyName &name) const
|
|||||||
|
|
||||||
// TODO: handle model nodes
|
// TODO: handle model nodes
|
||||||
|
|
||||||
|
if (isPropertyBlackListed(name))
|
||||||
|
return QVariant();
|
||||||
|
|
||||||
QQmlProperty property(object(), name, context());
|
QQmlProperty property(object(), name, context());
|
||||||
if (property.property().isEnumType()) {
|
if (property.property().isEnumType()) {
|
||||||
QVariant value = property.read();
|
QVariant value = property.read();
|
||||||
@@ -664,6 +681,9 @@ PropertyNameList ObjectNodeInstance::propertyNames() const
|
|||||||
|
|
||||||
QString ObjectNodeInstance::instanceType(const PropertyName &name) const
|
QString ObjectNodeInstance::instanceType(const PropertyName &name) const
|
||||||
{
|
{
|
||||||
|
if (isPropertyBlackListed(name))
|
||||||
|
return QLatin1String("undefined");
|
||||||
|
|
||||||
QQmlProperty property(object(), name, context());
|
QQmlProperty property(object(), name, context());
|
||||||
if (!property.isValid())
|
if (!property.isValid())
|
||||||
return QLatin1String("undefined");
|
return QLatin1String("undefined");
|
||||||
@@ -783,7 +803,13 @@ static void disableTiledBackingStore(QObject *object)
|
|||||||
Q_UNUSED(object);
|
Q_UNUSED(object);
|
||||||
}
|
}
|
||||||
|
|
||||||
PropertyNameList propertyNameForWritableProperties(QObject *object, const PropertyName &baseName = PropertyName(), QObjectList *inspectedObjects = new QObjectList())
|
static void addToPropertyNameListIfNotBlackListed(PropertyNameList *propertyNameList, const PropertyName &propertyName)
|
||||||
|
{
|
||||||
|
if (!isPropertyBlackListed(propertyName))
|
||||||
|
propertyNameList->append(propertyName);
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyNameList propertyNameListForWritableProperties(QObject *object, const PropertyName &baseName = PropertyName(), QObjectList *inspectedObjects = new QObjectList())
|
||||||
{
|
{
|
||||||
PropertyNameList propertyNameList;
|
PropertyNameList propertyNameList;
|
||||||
|
|
||||||
@@ -800,16 +826,16 @@ PropertyNameList propertyNameForWritableProperties(QObject *object, const Proper
|
|||||||
if (declarativeProperty.name() != "parent") {
|
if (declarativeProperty.name() != "parent") {
|
||||||
QObject *childObject = QQmlMetaType::toQObject(declarativeProperty.read());
|
QObject *childObject = QQmlMetaType::toQObject(declarativeProperty.read());
|
||||||
if (childObject)
|
if (childObject)
|
||||||
propertyNameList.append(propertyNameForWritableProperties(childObject, baseName + PropertyName(metaProperty.name()) + '.', inspectedObjects));
|
propertyNameList.append(propertyNameListForWritableProperties(childObject, baseName + PropertyName(metaProperty.name()) + '.', inspectedObjects));
|
||||||
}
|
}
|
||||||
} else if (QQmlValueTypeFactory::valueType(metaProperty.userType())) {
|
} else if (QQmlValueTypeFactory::valueType(metaProperty.userType())) {
|
||||||
QQmlValueType *valueType = QQmlValueTypeFactory::valueType(metaProperty.userType());
|
QQmlValueType *valueType = QQmlValueTypeFactory::valueType(metaProperty.userType());
|
||||||
valueType->setValue(metaProperty.read(object));
|
valueType->setValue(metaProperty.read(object));
|
||||||
propertyNameList.append(propertyNameForWritableProperties(valueType, baseName + PropertyName(metaProperty.name()) + '.', inspectedObjects));
|
propertyNameList.append(propertyNameListForWritableProperties(valueType, baseName + PropertyName(metaProperty.name()) + '.', inspectedObjects));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (metaProperty.isReadable() && metaProperty.isWritable()) {
|
if (metaProperty.isReadable() && metaProperty.isWritable()) {
|
||||||
propertyNameList.append(baseName + PropertyName(metaProperty.name()));
|
addToPropertyNameListIfNotBlackListed(&propertyNameList, baseName + PropertyName(metaProperty.name()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -821,7 +847,7 @@ static void fixResourcePathsForObject(QObject *object)
|
|||||||
if (qgetenv("QMLDESIGNER_RC_PATHS").isEmpty())
|
if (qgetenv("QMLDESIGNER_RC_PATHS").isEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
PropertyNameList propertyNameList = propertyNameForWritableProperties(object);
|
PropertyNameList propertyNameList = propertyNameListForWritableProperties(object);
|
||||||
|
|
||||||
foreach (const PropertyName &propertyName, propertyNameList) {
|
foreach (const PropertyName &propertyName, propertyNameList) {
|
||||||
QQmlProperty property(object, propertyName, QQmlEngine::contextForObject(object));
|
QQmlProperty property(object, propertyName, QQmlEngine::contextForObject(object));
|
||||||
@@ -1037,7 +1063,7 @@ void ObjectNodeInstance::deactivateState()
|
|||||||
|
|
||||||
void ObjectNodeInstance::populateResetHashes()
|
void ObjectNodeInstance::populateResetHashes()
|
||||||
{
|
{
|
||||||
PropertyNameList propertyNameList = propertyNameForWritableProperties(object());
|
PropertyNameList propertyNameList = propertyNameListForWritableProperties(object());
|
||||||
|
|
||||||
foreach (const PropertyName &propertyName, propertyNameList) {
|
foreach (const PropertyName &propertyName, propertyNameList) {
|
||||||
QQmlProperty property(object(), propertyName, QQmlEngine::contextForObject(object()));
|
QQmlProperty property(object(), propertyName, QQmlEngine::contextForObject(object()));
|
||||||
|
@@ -278,8 +278,6 @@ static void disableTextCursor(QQuickItem *item)
|
|||||||
|
|
||||||
void QuickItemNodeInstance::initialize(const ObjectNodeInstance::Pointer &objectNodeInstance)
|
void QuickItemNodeInstance::initialize(const ObjectNodeInstance::Pointer &objectNodeInstance)
|
||||||
{
|
{
|
||||||
disableTextCursor(quickItem());
|
|
||||||
|
|
||||||
if (instanceId() == 0) {
|
if (instanceId() == 0) {
|
||||||
DesignerSupport::setRootItem(nodeInstanceServer()->quickView(), quickItem());
|
DesignerSupport::setRootItem(nodeInstanceServer()->quickView(), quickItem());
|
||||||
} else {
|
} else {
|
||||||
@@ -448,7 +446,7 @@ void QuickItemNodeInstance::refresh()
|
|||||||
repositioning(quickItem());
|
repositioning(quickItem());
|
||||||
}
|
}
|
||||||
|
|
||||||
void doComponentCompleteRecursive(QQuickItem *item)
|
static void doComponentCompleteRecursive(QQuickItem *item)
|
||||||
{
|
{
|
||||||
if (item) {
|
if (item) {
|
||||||
if (DesignerSupport::isComponentComplete(item))
|
if (DesignerSupport::isComponentComplete(item))
|
||||||
@@ -465,6 +463,8 @@ void QuickItemNodeInstance::doComponentComplete()
|
|||||||
{
|
{
|
||||||
doComponentCompleteRecursive(quickItem());
|
doComponentCompleteRecursive(quickItem());
|
||||||
|
|
||||||
|
disableTextCursor(quickItem());
|
||||||
|
|
||||||
quickItem()->update();
|
quickItem()->update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -336,8 +336,14 @@ QList<LookupItem> LookupContext::lookup(const Name *name, Scope *scope) const
|
|||||||
if (name->identifier() != 0 && scope->isBlock()) {
|
if (name->identifier() != 0 && scope->isBlock()) {
|
||||||
bindings()->lookupInScope(name, scope, &candidates, /*templateId = */ 0, /*binding=*/ 0);
|
bindings()->lookupInScope(name, scope, &candidates, /*templateId = */ 0, /*binding=*/ 0);
|
||||||
|
|
||||||
if (! candidates.isEmpty())
|
if (! candidates.isEmpty()) {
|
||||||
break; // it's a local.
|
// it's a local.
|
||||||
|
//for qualified it can be outside of the local scope
|
||||||
|
if (name->isQualifiedNameId())
|
||||||
|
continue;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
for (unsigned i = 0; i < scope->memberCount(); ++i) {
|
for (unsigned i = 0; i < scope->memberCount(); ++i) {
|
||||||
if (UsingNamespaceDirective *u = scope->memberAt(i)->asUsingNamespaceDirective()) {
|
if (UsingNamespaceDirective *u = scope->memberAt(i)->asUsingNamespaceDirective()) {
|
||||||
@@ -353,8 +359,14 @@ QList<LookupItem> LookupContext::lookup(const Name *name, Scope *scope) const
|
|||||||
} else if (Function *fun = scope->asFunction()) {
|
} else if (Function *fun = scope->asFunction()) {
|
||||||
bindings()->lookupInScope(name, fun, &candidates, /*templateId = */ 0, /*binding=*/ 0);
|
bindings()->lookupInScope(name, fun, &candidates, /*templateId = */ 0, /*binding=*/ 0);
|
||||||
|
|
||||||
if (! candidates.isEmpty())
|
if (! candidates.isEmpty()) {
|
||||||
break; // it's an argument or a template parameter.
|
// it's an argument or a template parameter.
|
||||||
|
//for qualified it can be outside of the local scope
|
||||||
|
if (name->isQualifiedNameId())
|
||||||
|
continue;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (fun->name() && fun->name()->isQualifiedNameId()) {
|
if (fun->name() && fun->name()->isQualifiedNameId()) {
|
||||||
if (ClassOrNamespace *binding = bindings()->lookupType(fun)) {
|
if (ClassOrNamespace *binding = bindings()->lookupType(fun)) {
|
||||||
@@ -380,8 +392,14 @@ QList<LookupItem> LookupContext::lookup(const Name *name, Scope *scope) const
|
|||||||
} else if (Template *templ = scope->asTemplate()) {
|
} else if (Template *templ = scope->asTemplate()) {
|
||||||
bindings()->lookupInScope(name, templ, &candidates, /*templateId = */ 0, /*binding=*/ 0);
|
bindings()->lookupInScope(name, templ, &candidates, /*templateId = */ 0, /*binding=*/ 0);
|
||||||
|
|
||||||
if (! candidates.isEmpty())
|
if (! candidates.isEmpty()) {
|
||||||
return candidates; // it's a template parameter.
|
// it's a template parameter.
|
||||||
|
//for qualified it can be outside of the local scope
|
||||||
|
if (name->isQualifiedNameId())
|
||||||
|
continue;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
} else if (scope->asNamespace()
|
} else if (scope->asNamespace()
|
||||||
|| scope->asClass()
|
|| scope->asClass()
|
||||||
@@ -624,7 +642,8 @@ void CreateBindings::lookupInScope(const Name *name, Scope *scope,
|
|||||||
|
|
||||||
if (s->asNamespaceAlias() && binding) {
|
if (s->asNamespaceAlias() && binding) {
|
||||||
ClassOrNamespace *targetNamespaceBinding = binding->lookupType(name);
|
ClassOrNamespace *targetNamespaceBinding = binding->lookupType(name);
|
||||||
if (targetNamespaceBinding && targetNamespaceBinding->symbols().size() == 1) {
|
//there can be many namespace definitions
|
||||||
|
if (targetNamespaceBinding && targetNamespaceBinding->symbols().size() > 0) {
|
||||||
Symbol *resolvedSymbol = targetNamespaceBinding->symbols().first();
|
Symbol *resolvedSymbol = targetNamespaceBinding->symbols().first();
|
||||||
item.setType(resolvedSymbol->type()); // override the type
|
item.setType(resolvedSymbol->type()); // override the type
|
||||||
}
|
}
|
||||||
@@ -1107,29 +1126,26 @@ bool ClassOrNamespace::NestedClassInstantiator::isInstantiateNestedClassNeeded(c
|
|||||||
bool ClassOrNamespace::NestedClassInstantiator::containsTemplateType(Declaration *declaration) const
|
bool ClassOrNamespace::NestedClassInstantiator::containsTemplateType(Declaration *declaration) const
|
||||||
{
|
{
|
||||||
Type *memberType = declaration->type().type();
|
Type *memberType = declaration->type().type();
|
||||||
NamedType *memberNamedType = findMemberNamedType(memberType);
|
NamedType *namedType = findNamedType(memberType);
|
||||||
if (memberNamedType) {
|
return namedType && _subst.contains(namedType->name());
|
||||||
const Name *name = memberNamedType->name();
|
|
||||||
if (_subst.contains(name))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ClassOrNamespace::NestedClassInstantiator::containsTemplateType(Function * /*function*/) const
|
bool ClassOrNamespace::NestedClassInstantiator::containsTemplateType(Function *function) const
|
||||||
{
|
{
|
||||||
//TODO: make implementation
|
Type *returnType = function->returnType().type();
|
||||||
return false;
|
NamedType *namedType = findNamedType(returnType);
|
||||||
|
return namedType && _subst.contains(namedType->name());
|
||||||
|
//TODO: in future we will need also check function arguments, for now returned value is enough
|
||||||
}
|
}
|
||||||
|
|
||||||
NamedType *ClassOrNamespace::NestedClassInstantiator::findMemberNamedType(Type *memberType) const
|
NamedType *ClassOrNamespace::NestedClassInstantiator::findNamedType(Type *memberType) const
|
||||||
{
|
{
|
||||||
if (NamedType *namedType = memberType->asNamedType())
|
if (NamedType *namedType = memberType->asNamedType())
|
||||||
return namedType;
|
return namedType;
|
||||||
else if (PointerType *pointerType = memberType->asPointerType())
|
else if (PointerType *pointerType = memberType->asPointerType())
|
||||||
return findMemberNamedType(pointerType->elementType().type());
|
return findNamedType(pointerType->elementType().type());
|
||||||
else if (ReferenceType *referenceType = memberType->asReferenceType())
|
else if (ReferenceType *referenceType = memberType->asReferenceType())
|
||||||
return findMemberNamedType(referenceType->elementType().type());
|
return findNamedType(referenceType->elementType().type());
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@@ -155,7 +155,7 @@ private:
|
|||||||
bool isInstantiateNestedClassNeeded(const QList<Symbol *> &symbols) const;
|
bool isInstantiateNestedClassNeeded(const QList<Symbol *> &symbols) const;
|
||||||
bool containsTemplateType(Declaration *declaration) const;
|
bool containsTemplateType(Declaration *declaration) const;
|
||||||
bool containsTemplateType(Function *function) const;
|
bool containsTemplateType(Function *function) const;
|
||||||
NamedType *findMemberNamedType(Type *memberType) const;
|
NamedType *findNamedType(Type *memberType) const;
|
||||||
|
|
||||||
QSet<ClassOrNamespace *> _alreadyConsideredNestedClassInstantiations;
|
QSet<ClassOrNamespace *> _alreadyConsideredNestedClassInstantiations;
|
||||||
CreateBindings *_factory;
|
CreateBindings *_factory;
|
||||||
|
@@ -125,7 +125,11 @@ public:
|
|||||||
QByteArray preprocessedExpression(const QByteArray &utf8code) const;
|
QByteArray preprocessedExpression(const QByteArray &utf8code) const;
|
||||||
|
|
||||||
void setExpandTemplates(bool expandTemplates)
|
void setExpandTemplates(bool expandTemplates)
|
||||||
{ m_expandTemplates = expandTemplates; }
|
{
|
||||||
|
if (m_bindings)
|
||||||
|
m_bindings->setExpandTemplates(expandTemplates);
|
||||||
|
m_expandTemplates = expandTemplates;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
DEFINES += NDEBUG
|
DEFINES += NDEBUG
|
||||||
#DEFINES += DEBUG_LOOKUP
|
#DEFINES += DEBUG_LOOKUP
|
||||||
unix:QMAKE_CXXFLAGS_DEBUG += -O2
|
unix:QMAKE_CXXFLAGS_DEBUG += -O2
|
||||||
|
win32:QMAKE_CXXFLAGS_DEBUG += -O2
|
||||||
|
|
||||||
include(../../qtcreatorlibrary.pri)
|
include(../../qtcreatorlibrary.pri)
|
||||||
include(cplusplus-lib.pri)
|
include(cplusplus-lib.pri)
|
||||||
|
@@ -43,14 +43,6 @@ class StaticAnalysisMessages
|
|||||||
Q_DECLARE_TR_FUNCTIONS(QmlJS::StaticAnalysisMessages)
|
Q_DECLARE_TR_FUNCTIONS(QmlJS::StaticAnalysisMessages)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
class PrototypeMessageData {
|
|
||||||
public:
|
|
||||||
Type type;
|
|
||||||
Severity severity;
|
|
||||||
QString message;
|
|
||||||
int placeholders;
|
|
||||||
};
|
|
||||||
|
|
||||||
void newMsg(Type type, Severity severity, const QString &message, int placeholders = 0)
|
void newMsg(Type type, Severity severity, const QString &message, int placeholders = 0)
|
||||||
{
|
{
|
||||||
PrototypeMessageData prototype;
|
PrototypeMessageData prototype;
|
||||||
@@ -248,7 +240,7 @@ Message::Message(Type type,
|
|||||||
: location(location), type(type)
|
: location(location), type(type)
|
||||||
{
|
{
|
||||||
QTC_ASSERT(messages()->messages.contains(type), return);
|
QTC_ASSERT(messages()->messages.contains(type), return);
|
||||||
const StaticAnalysisMessages::PrototypeMessageData &prototype = messages()->messages.value(type);
|
const PrototypeMessageData &prototype = prototypeForMessageType(type);
|
||||||
severity = prototype.severity;
|
severity = prototype.severity;
|
||||||
message = prototype.message;
|
message = prototype.message;
|
||||||
if (prototype.placeholders == 0) {
|
if (prototype.placeholders == 0) {
|
||||||
@@ -299,3 +291,11 @@ QRegExp Message::suppressionPattern()
|
|||||||
{
|
{
|
||||||
return QRegExp(QLatin1String("@disable-check M(\\d+)"));
|
return QRegExp(QLatin1String("@disable-check M(\\d+)"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const PrototypeMessageData Message::prototypeForMessageType(Type type)
|
||||||
|
{
|
||||||
|
QTC_CHECK(messages()->messages.contains(type));
|
||||||
|
const PrototypeMessageData &prototype = messages()->messages.value(type);
|
||||||
|
|
||||||
|
return prototype;
|
||||||
|
}
|
||||||
|
@@ -131,6 +131,14 @@ enum Type
|
|||||||
ErrInvalidArrayValueLength = 323
|
ErrInvalidArrayValueLength = 323
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class QMLJS_EXPORT PrototypeMessageData {
|
||||||
|
public:
|
||||||
|
Type type;
|
||||||
|
Severity severity;
|
||||||
|
QString message;
|
||||||
|
int placeholders;
|
||||||
|
};
|
||||||
|
|
||||||
class QMLJS_EXPORT Message
|
class QMLJS_EXPORT Message
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -152,6 +160,8 @@ public:
|
|||||||
QString message;
|
QString message;
|
||||||
Type type;
|
Type type;
|
||||||
Severity severity;
|
Severity severity;
|
||||||
|
|
||||||
|
static const PrototypeMessageData prototypeForMessageType(Type type);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace StaticAnalysis
|
} // namespace StaticAnalysis
|
||||||
|
@@ -58,7 +58,7 @@ public:
|
|||||||
static bool isMacHost() { return hostOs() == HostOsMac; }
|
static bool isMacHost() { return hostOs() == HostOsMac; }
|
||||||
static inline bool isAnyUnixHost();
|
static inline bool isAnyUnixHost();
|
||||||
|
|
||||||
static QString appendExecutableSuffix(const QString &executable)
|
static QString withExecutableSuffix(const QString &executable)
|
||||||
{
|
{
|
||||||
QString finalName = executable;
|
QString finalName = executable;
|
||||||
if (isWindowsHost())
|
if (isWindowsHost())
|
||||||
|
@@ -226,6 +226,7 @@ QString PathChooserPrivate::expandedPath(const QString &input) const
|
|||||||
case PathChooser::Directory:
|
case PathChooser::Directory:
|
||||||
case PathChooser::ExistingDirectory:
|
case PathChooser::ExistingDirectory:
|
||||||
case PathChooser::File:
|
case PathChooser::File:
|
||||||
|
case PathChooser::SaveFile:
|
||||||
if (!m_baseDirectory.isEmpty() && QFileInfo(path).isRelative())
|
if (!m_baseDirectory.isEmpty() && QFileInfo(path).isRelative())
|
||||||
return QFileInfo(m_baseDirectory + QLatin1Char('/') + path).absoluteFilePath();
|
return QFileInfo(m_baseDirectory + QLatin1Char('/') + path).absoluteFilePath();
|
||||||
break;
|
break;
|
||||||
@@ -377,6 +378,11 @@ void PathChooser::slotBrowse()
|
|||||||
makeDialogTitle(tr("Choose File")), predefined,
|
makeDialogTitle(tr("Choose File")), predefined,
|
||||||
d->m_dialogFilter);
|
d->m_dialogFilter);
|
||||||
break;
|
break;
|
||||||
|
case PathChooser::SaveFile:
|
||||||
|
newPath = QFileDialog::getSaveFileName(this,
|
||||||
|
makeDialogTitle(tr("Choose File")), predefined,
|
||||||
|
d->m_dialogFilter);
|
||||||
|
break;
|
||||||
case PathChooser::Any: {
|
case PathChooser::Any: {
|
||||||
QFileDialog dialog(this);
|
QFileDialog dialog(this);
|
||||||
dialog.setFileMode(QFileDialog::AnyFile);
|
dialog.setFileMode(QFileDialog::AnyFile);
|
||||||
@@ -464,6 +470,13 @@ bool PathChooser::validatePath(const QString &path, QString *errorMessage)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case PathChooser::SaveFile:
|
||||||
|
if (!fi.absoluteDir().exists()) {
|
||||||
|
if (errorMessage)
|
||||||
|
*errorMessage = tr("The directory '%1' does not exist.").arg(QDir::toNativeSeparators(fi.absolutePath()));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case PathChooser::ExistingCommand:
|
case PathChooser::ExistingCommand:
|
||||||
if (!fi.exists()) {
|
if (!fi.exists()) {
|
||||||
if (errorMessage)
|
if (errorMessage)
|
||||||
@@ -513,6 +526,14 @@ bool PathChooser::validatePath(const QString &path, QString *errorMessage)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PathChooser::SaveFile:
|
||||||
|
if (fi.exists() && fi.isDir()) {
|
||||||
|
if (errorMessage)
|
||||||
|
*errorMessage = tr("The path <b>%1</b> is not a file.").arg(QDir::toNativeSeparators(fi.absolutePath()));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case PathChooser::ExistingCommand:
|
case PathChooser::ExistingCommand:
|
||||||
if (!fi.isFile() || !fi.isExecutable()) {
|
if (!fi.isFile() || !fi.isExecutable()) {
|
||||||
if (errorMessage)
|
if (errorMessage)
|
||||||
|
@@ -70,6 +70,7 @@ public:
|
|||||||
ExistingDirectory,
|
ExistingDirectory,
|
||||||
Directory, // A directory, doesn't need to exist
|
Directory, // A directory, doesn't need to exist
|
||||||
File,
|
File,
|
||||||
|
SaveFile,
|
||||||
ExistingCommand, // A command that must exist at the time of selection
|
ExistingCommand, // A command that must exist at the time of selection
|
||||||
Command, // A command that may or may not exist at the time of selection (e.g. result of a build)
|
Command, // A command that may or may not exist at the time of selection (e.g. result of a build)
|
||||||
Any
|
Any
|
||||||
|
@@ -81,6 +81,7 @@ namespace {
|
|||||||
const QLatin1String KeystoreLocationKey("KeystoreLocation");
|
const QLatin1String KeystoreLocationKey("KeystoreLocation");
|
||||||
const QLatin1String AutomaticKitCreationKey("AutomatiKitCreation");
|
const QLatin1String AutomaticKitCreationKey("AutomatiKitCreation");
|
||||||
const QLatin1String PartitionSizeKey("PartitionSize");
|
const QLatin1String PartitionSizeKey("PartitionSize");
|
||||||
|
const QLatin1String ToolchainHostKey("ToolchainHost");
|
||||||
const QLatin1String ArmToolchainPrefix("arm-linux-androideabi");
|
const QLatin1String ArmToolchainPrefix("arm-linux-androideabi");
|
||||||
const QLatin1String X86ToolchainPrefix("x86");
|
const QLatin1String X86ToolchainPrefix("x86");
|
||||||
const QLatin1String MipsToolchainPrefix("mipsel-linux-android");
|
const QLatin1String MipsToolchainPrefix("mipsel-linux-android");
|
||||||
@@ -152,6 +153,7 @@ AndroidConfig::AndroidConfig(const QSettings &settings)
|
|||||||
antLocation = FileName::fromString(settings.value(AntLocationKey).toString());
|
antLocation = FileName::fromString(settings.value(AntLocationKey).toString());
|
||||||
openJDKLocation = FileName::fromString(settings.value(OpenJDKLocationKey).toString());
|
openJDKLocation = FileName::fromString(settings.value(OpenJDKLocationKey).toString());
|
||||||
keystoreLocation = FileName::fromString(settings.value(KeystoreLocationKey).toString());
|
keystoreLocation = FileName::fromString(settings.value(KeystoreLocationKey).toString());
|
||||||
|
toolchainHost = settings.value(ToolchainHostKey).toString();
|
||||||
automaticKitCreation = settings.value(AutomaticKitCreationKey, true).toBool();
|
automaticKitCreation = settings.value(AutomaticKitCreationKey, true).toBool();
|
||||||
|
|
||||||
PersistentSettingsReader reader;
|
PersistentSettingsReader reader;
|
||||||
@@ -163,6 +165,7 @@ AndroidConfig::AndroidConfig(const QSettings &settings)
|
|||||||
antLocation = FileName::fromString(reader.restoreValue(AntLocationKey).toString());
|
antLocation = FileName::fromString(reader.restoreValue(AntLocationKey).toString());
|
||||||
openJDKLocation = FileName::fromString(reader.restoreValue(OpenJDKLocationKey).toString());
|
openJDKLocation = FileName::fromString(reader.restoreValue(OpenJDKLocationKey).toString());
|
||||||
keystoreLocation = FileName::fromString(reader.restoreValue(KeystoreLocationKey).toString());
|
keystoreLocation = FileName::fromString(reader.restoreValue(KeystoreLocationKey).toString());
|
||||||
|
toolchainHost = reader.restoreValue(ToolchainHostKey).toString();
|
||||||
QVariant v = reader.restoreValue(AutomaticKitCreationKey);
|
QVariant v = reader.restoreValue(AutomaticKitCreationKey);
|
||||||
if (v.isValid())
|
if (v.isValid())
|
||||||
automaticKitCreation = v.toBool();
|
automaticKitCreation = v.toBool();
|
||||||
@@ -190,11 +193,16 @@ void AndroidConfig::save(QSettings &settings) const
|
|||||||
settings.setValue(KeystoreLocationKey, keystoreLocation.toString());
|
settings.setValue(KeystoreLocationKey, keystoreLocation.toString());
|
||||||
settings.setValue(PartitionSizeKey, partitionSize);
|
settings.setValue(PartitionSizeKey, partitionSize);
|
||||||
settings.setValue(AutomaticKitCreationKey, automaticKitCreation);
|
settings.setValue(AutomaticKitCreationKey, automaticKitCreation);
|
||||||
|
settings.setValue(ToolchainHostKey, toolchainHost);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AndroidConfigurations::setConfig(const AndroidConfig &devConfigs)
|
void AndroidConfigurations::setConfig(const AndroidConfig &devConfigs)
|
||||||
{
|
{
|
||||||
m_config = devConfigs;
|
m_config = devConfigs;
|
||||||
|
|
||||||
|
if (m_config.toolchainHost.isEmpty())
|
||||||
|
detectToolchainHost();
|
||||||
|
|
||||||
save();
|
save();
|
||||||
updateAvailablePlatforms();
|
updateAvailablePlatforms();
|
||||||
updateAutomaticKitList();
|
updateAutomaticKitList();
|
||||||
@@ -278,7 +286,7 @@ FileName AndroidConfigurations::toolPath(Abi::Architecture architecture, const Q
|
|||||||
return path.appendPath(QString::fromLatin1("toolchains/%1-%2/prebuilt/%3/bin/%4")
|
return path.appendPath(QString::fromLatin1("toolchains/%1-%2/prebuilt/%3/bin/%4")
|
||||||
.arg(toolchainPrefix(architecture))
|
.arg(toolchainPrefix(architecture))
|
||||||
.arg(ndkToolChainVersion)
|
.arg(ndkToolChainVersion)
|
||||||
.arg(ToolchainHost)
|
.arg(m_config.toolchainHost)
|
||||||
.arg(toolsPrefix(architecture)));
|
.arg(toolsPrefix(architecture)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -292,6 +300,11 @@ FileName AndroidConfigurations::readelfPath(Abi::Architecture architecture, cons
|
|||||||
return toolPath(architecture, ndkToolChainVersion).append(QLatin1String("-readelf" QTC_HOST_EXE_SUFFIX));
|
return toolPath(architecture, ndkToolChainVersion).append(QLatin1String("-readelf" QTC_HOST_EXE_SUFFIX));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FileName AndroidConfigurations::gccPath(Abi::Architecture architecture, const QString &ndkToolChainVersion) const
|
||||||
|
{
|
||||||
|
return toolPath(architecture, ndkToolChainVersion).append(QLatin1String("-gcc" QTC_HOST_EXE_SUFFIX));
|
||||||
|
}
|
||||||
|
|
||||||
FileName AndroidConfigurations::gdbPath(Abi::Architecture architecture, const QString &ndkToolChainVersion) const
|
FileName AndroidConfigurations::gdbPath(Abi::Architecture architecture, const QString &ndkToolChainVersion) const
|
||||||
{
|
{
|
||||||
return toolPath(architecture, ndkToolChainVersion).append(QLatin1String("-gdb" QTC_HOST_EXE_SUFFIX));
|
return toolPath(architecture, ndkToolChainVersion).append(QLatin1String("-gdb" QTC_HOST_EXE_SUFFIX));
|
||||||
@@ -302,6 +315,30 @@ FileName AndroidConfigurations::openJDKPath() const
|
|||||||
return m_config.openJDKLocation;
|
return m_config.openJDKLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AndroidConfigurations::detectToolchainHost()
|
||||||
|
{
|
||||||
|
QStringList hostPatterns;
|
||||||
|
switch (HostOsInfo::hostOs()) {
|
||||||
|
case HostOsInfo::HostOsLinux:
|
||||||
|
hostPatterns << QLatin1String("linux*");
|
||||||
|
break;
|
||||||
|
case HostOsInfo::HostOsWindows:
|
||||||
|
hostPatterns << QLatin1String("windows*");
|
||||||
|
break;
|
||||||
|
case HostOsInfo::HostOsMac:
|
||||||
|
hostPatterns << QLatin1String("darwin*");
|
||||||
|
break;
|
||||||
|
default: /* unknown host */ return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FileName path = m_config.ndkLocation;
|
||||||
|
QDirIterator it(path.appendPath(QLatin1String("prebuilt")).toString(), hostPatterns, QDir::Dirs);
|
||||||
|
if (it.hasNext()) {
|
||||||
|
it.next();
|
||||||
|
m_config.toolchainHost = it.fileName();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
FileName AndroidConfigurations::openJDKBinPath() const
|
FileName AndroidConfigurations::openJDKBinPath() const
|
||||||
{
|
{
|
||||||
FileName path = m_config.openJDKLocation;
|
FileName path = m_config.openJDKLocation;
|
||||||
|
@@ -43,21 +43,6 @@ QT_END_NAMESPACE
|
|||||||
namespace Android {
|
namespace Android {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
#ifdef Q_OS_LINUX
|
|
||||||
const QLatin1String ToolchainHost("linux-x86");
|
|
||||||
#else
|
|
||||||
# ifdef Q_OS_DARWIN
|
|
||||||
const QLatin1String ToolchainHost("darwin-x86");
|
|
||||||
# else
|
|
||||||
# ifdef Q_OS_WIN32
|
|
||||||
const QLatin1String ToolchainHost("windows");
|
|
||||||
# else
|
|
||||||
# warning No Android supported OSs found
|
|
||||||
const QLatin1String ToolchainHost("linux-x86");
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class AndroidConfig
|
class AndroidConfig
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -70,6 +55,7 @@ public:
|
|||||||
Utils::FileName antLocation;
|
Utils::FileName antLocation;
|
||||||
Utils::FileName openJDKLocation;
|
Utils::FileName openJDKLocation;
|
||||||
Utils::FileName keystoreLocation;
|
Utils::FileName keystoreLocation;
|
||||||
|
QString toolchainHost;
|
||||||
unsigned partitionSize;
|
unsigned partitionSize;
|
||||||
bool automaticKitCreation;
|
bool automaticKitCreation;
|
||||||
};
|
};
|
||||||
@@ -96,6 +82,7 @@ public:
|
|||||||
Utils::FileName androidToolPath() const;
|
Utils::FileName androidToolPath() const;
|
||||||
Utils::FileName antToolPath() const;
|
Utils::FileName antToolPath() const;
|
||||||
Utils::FileName emulatorToolPath() const;
|
Utils::FileName emulatorToolPath() const;
|
||||||
|
Utils::FileName gccPath(ProjectExplorer::Abi::Architecture architecture, const QString &ndkToolChainVersion) const;
|
||||||
Utils::FileName gdbPath(ProjectExplorer::Abi::Architecture architecture, const QString &ndkToolChainVersion) const;
|
Utils::FileName gdbPath(ProjectExplorer::Abi::Architecture architecture, const QString &ndkToolChainVersion) const;
|
||||||
Utils::FileName openJDKPath() const;
|
Utils::FileName openJDKPath() const;
|
||||||
Utils::FileName keytoolPath() const;
|
Utils::FileName keytoolPath() const;
|
||||||
@@ -128,6 +115,7 @@ public slots:
|
|||||||
private:
|
private:
|
||||||
Utils::FileName toolPath(ProjectExplorer::Abi::Architecture architecture, const QString &ndkToolChainVersion) const;
|
Utils::FileName toolPath(ProjectExplorer::Abi::Architecture architecture, const QString &ndkToolChainVersion) const;
|
||||||
Utils::FileName openJDKBinPath() const;
|
Utils::FileName openJDKBinPath() const;
|
||||||
|
void detectToolchainHost();
|
||||||
|
|
||||||
AndroidConfigurations(QObject *parent);
|
AndroidConfigurations(QObject *parent);
|
||||||
void load();
|
void load();
|
||||||
|
@@ -103,13 +103,8 @@ QList<ProjectExplorer::Abi> AndroidQtVersion::detectQtAbis() const
|
|||||||
|
|
||||||
void AndroidQtVersion::addToEnvironment(const ProjectExplorer::Kit *k, Utils::Environment &env) const
|
void AndroidQtVersion::addToEnvironment(const ProjectExplorer::Kit *k, Utils::Environment &env) const
|
||||||
{
|
{
|
||||||
QString ndk_host = QLatin1String(
|
|
||||||
Utils::HostOsInfo::isLinuxHost() ? "linux-x86" :
|
|
||||||
Utils::HostOsInfo::isWindowsHost() ? "windows" :
|
|
||||||
Utils::HostOsInfo::isMacHost() ? "darwin-x86" : "");
|
|
||||||
|
|
||||||
// this env vars are used by qmake mkspecs to generate makefiles (check QTDIR/mkspecs/android-g++/qmake.conf for more info)
|
// this env vars are used by qmake mkspecs to generate makefiles (check QTDIR/mkspecs/android-g++/qmake.conf for more info)
|
||||||
env.set(QLatin1String("ANDROID_NDK_HOST"), ndk_host);
|
env.set(QLatin1String("ANDROID_NDK_HOST"), AndroidConfigurations::instance().config().toolchainHost);
|
||||||
env.set(QLatin1String("ANDROID_NDK_ROOT"), AndroidConfigurations::instance().config().ndkLocation.toUserOutput());
|
env.set(QLatin1String("ANDROID_NDK_ROOT"), AndroidConfigurations::instance().config().ndkLocation.toUserOutput());
|
||||||
|
|
||||||
Qt4Project *qt4pro = qobject_cast<Qt4ProjectManager::Qt4Project *>(ProjectExplorerPlugin::instance()->currentProject());
|
Qt4Project *qt4pro = qobject_cast<Qt4ProjectManager::Qt4Project *>(ProjectExplorerPlugin::instance()->currentProject());
|
||||||
|
@@ -286,6 +286,7 @@ void AndroidSettingsWidget::sdkLocationEditingFinished()
|
|||||||
void AndroidSettingsWidget::ndkLocationEditingFinished()
|
void AndroidSettingsWidget::ndkLocationEditingFinished()
|
||||||
{
|
{
|
||||||
Utils::FileName location = Utils::FileName::fromUserInput(m_ui->NDKLocationLineEdit->text());
|
Utils::FileName location = Utils::FileName::fromUserInput(m_ui->NDKLocationLineEdit->text());
|
||||||
|
m_androidConfig.toolchainHost.clear(); // force toolchain host detection
|
||||||
if (!checkNDK(location))
|
if (!checkNDK(location))
|
||||||
return;
|
return;
|
||||||
saveSettings(true);
|
saveSettings(true);
|
||||||
|
@@ -109,21 +109,7 @@ void AndroidToolChain::addToEnvironment(Environment &env) const
|
|||||||
// TODO this vars should be configurable in projects -> build tab
|
// TODO this vars should be configurable in projects -> build tab
|
||||||
// TODO invalidate all .pro files !!!
|
// TODO invalidate all .pro files !!!
|
||||||
|
|
||||||
QString ndkHost;
|
env.set(QLatin1String("ANDROID_NDK_HOST"), AndroidConfigurations::instance().config().toolchainHost);
|
||||||
switch (HostOsInfo::hostOs()) {
|
|
||||||
case HostOsInfo::HostOsLinux:
|
|
||||||
ndkHost = QLatin1String("linux-x86");
|
|
||||||
break;
|
|
||||||
case HostOsInfo::HostOsWindows:
|
|
||||||
ndkHost = QLatin1String("windows");
|
|
||||||
break;
|
|
||||||
case HostOsInfo::HostOsMac:
|
|
||||||
ndkHost = QLatin1String("darwin-x86");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
env.set(QLatin1String("ANDROID_NDK_HOST"), ndkHost);
|
|
||||||
env.set(QLatin1String("ANDROID_NDK_TOOLCHAIN_PREFIX"), AndroidConfigurations::toolchainPrefix(targetAbi().architecture()));
|
env.set(QLatin1String("ANDROID_NDK_TOOLCHAIN_PREFIX"), AndroidConfigurations::toolchainPrefix(targetAbi().architecture()));
|
||||||
env.set(QLatin1String("ANDROID_NDK_TOOLS_PREFIX"), AndroidConfigurations::toolsPrefix(targetAbi().architecture()));
|
env.set(QLatin1String("ANDROID_NDK_TOOLS_PREFIX"), AndroidConfigurations::toolsPrefix(targetAbi().architecture()));
|
||||||
env.set(QLatin1String("ANDROID_NDK_TOOLCHAIN_VERSION"), m_ndkToolChainVersion);
|
env.set(QLatin1String("ANDROID_NDK_TOOLCHAIN_VERSION"), m_ndkToolChainVersion);
|
||||||
@@ -300,12 +286,7 @@ QList<AndroidToolChainFactory::AndroidToolChainInformation> AndroidToolChainFact
|
|||||||
if (ati.architecture == Abi::UnknownArchitecture) // e.g. mipsel which is not yet supported
|
if (ati.architecture == Abi::UnknownArchitecture) // e.g. mipsel which is not yet supported
|
||||||
continue;
|
continue;
|
||||||
// AndroidToolChain *tc = new AndroidToolChain(arch, version, true);
|
// AndroidToolChain *tc = new AndroidToolChain(arch, version, true);
|
||||||
ati.compilerCommand = ndkPath;
|
ati.compilerCommand = AndroidConfigurations::instance().gccPath(ati.architecture, ati.version);
|
||||||
ati.compilerCommand.appendPath(QString::fromLatin1("toolchains/%1/prebuilt/%3/bin/%4")
|
|
||||||
.arg(fileName)
|
|
||||||
.arg(ToolchainHost)
|
|
||||||
.arg(AndroidConfigurations::toolsPrefix(ati.architecture)));
|
|
||||||
ati.compilerCommand.append(QLatin1String("-gcc" QTC_HOST_EXE_SUFFIX));
|
|
||||||
// tc->setCompilerCommand(compilerPath);
|
// tc->setCompilerCommand(compilerPath);
|
||||||
result.append(ati);
|
result.append(ati);
|
||||||
}
|
}
|
||||||
@@ -332,12 +313,7 @@ QList<ToolChain *> AndroidToolChainFactory::createToolChainsForNdk(const Utils::
|
|||||||
if (arch == Abi::UnknownArchitecture) // e.g. mipsel which is not yet supported
|
if (arch == Abi::UnknownArchitecture) // e.g. mipsel which is not yet supported
|
||||||
continue;
|
continue;
|
||||||
AndroidToolChain *tc = new AndroidToolChain(arch, version, true);
|
AndroidToolChain *tc = new AndroidToolChain(arch, version, true);
|
||||||
FileName compilerPath = ndkPath;
|
FileName compilerPath = AndroidConfigurations::instance().gccPath(arch, version);
|
||||||
compilerPath.appendPath(QString::fromLatin1("toolchains/%1/prebuilt/%3/bin/%4")
|
|
||||||
.arg(fileName)
|
|
||||||
.arg(ToolchainHost)
|
|
||||||
.arg(AndroidConfigurations::toolsPrefix(arch)));
|
|
||||||
compilerPath.append(QLatin1String("-gcc" QTC_HOST_EXE_SUFFIX));
|
|
||||||
tc->setCompilerCommand(compilerPath);
|
tc->setCompilerCommand(compilerPath);
|
||||||
result.append(tc);
|
result.append(tc);
|
||||||
}
|
}
|
||||||
|
@@ -555,21 +555,40 @@ QString ClearCasePlugin::ccGetPredecessor(const QString &version) const
|
|||||||
return response.stdOut;
|
return response.stdOut;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! Get a list of paths to active VOBs.
|
||||||
|
//! Paths are relative to topLevel
|
||||||
QStringList ClearCasePlugin::ccGetActiveVobs() const
|
QStringList ClearCasePlugin::ccGetActiveVobs() const
|
||||||
{
|
{
|
||||||
QStringList res;
|
QStringList res;
|
||||||
QStringList args(QLatin1String("lsvob"));
|
QStringList args(QLatin1String("lsvob"));
|
||||||
args << QLatin1String("-short");
|
const QString topLevel = currentState().topLevel();
|
||||||
QString topLevel = currentState().topLevel();
|
|
||||||
const ClearCaseResponse response =
|
const ClearCaseResponse response =
|
||||||
runCleartool(topLevel, args, m_settings.timeOutMS(), SilentRun);
|
runCleartool(topLevel, args, m_settings.timeOutMS(), SilentRun);
|
||||||
if (response.error)
|
if (response.error)
|
||||||
return res;
|
return res;
|
||||||
foreach (QString dir, response.stdOut.split(QLatin1Char('\n'), QString::SkipEmptyParts)) {
|
|
||||||
dir = dir.mid(1); // omit first slash
|
// format of output unix:
|
||||||
QFileInfo fi(topLevel, dir);
|
// * /path/to/vob /path/to/vob/storage.vbs <and some text omitted here>
|
||||||
if (fi.exists())
|
// format of output windows:
|
||||||
res.append(dir);
|
// * \vob \\share\path\to\vob\storage.vbs <and some text omitted here>
|
||||||
|
QString prefix = topLevel;
|
||||||
|
if (!prefix.endsWith(QLatin1Char('/')))
|
||||||
|
prefix += QLatin1Char('/');
|
||||||
|
|
||||||
|
foreach (const QString &line, response.stdOut.split(QLatin1Char('\n'), QString::SkipEmptyParts)) {
|
||||||
|
const bool isActive = line.at(0) == QLatin1Char('*');
|
||||||
|
if (!isActive)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const QString dir =
|
||||||
|
QDir::fromNativeSeparators(line.mid(3, line.indexOf(QLatin1Char(' '), 3) - 3));
|
||||||
|
const QString relativeDir = QDir(topLevel).relativeFilePath(dir);
|
||||||
|
|
||||||
|
// Snapshot views does not necessarily have all active VOBs loaded, so we'll have to
|
||||||
|
// check if the dirs exists as well. Else the command will work, but the output will
|
||||||
|
// complain about the element not being loaded.
|
||||||
|
if (QFile::exists(prefix + relativeDir))
|
||||||
|
res.append(relativeDir);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@@ -283,6 +283,7 @@ struct CanonicalSymbol
|
|||||||
: editor(editor), info(info)
|
: editor(editor), info(info)
|
||||||
{
|
{
|
||||||
typeOfExpression.init(info.doc, info.snapshot);
|
typeOfExpression.init(info.doc, info.snapshot);
|
||||||
|
typeOfExpression.setExpandTemplates(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
const LookupContext &context() const
|
const LookupContext &context() const
|
||||||
|
@@ -1227,6 +1227,7 @@ bool CheckSymbols::maybeAddFunction(const QList<LookupItem> &candidates, NameAST
|
|||||||
{
|
{
|
||||||
unsigned startToken = ast->firstToken();
|
unsigned startToken = ast->firstToken();
|
||||||
bool isDestructor = false;
|
bool isDestructor = false;
|
||||||
|
bool isConstructor = false;
|
||||||
if (DestructorNameAST *dtor = ast->asDestructorName()) {
|
if (DestructorNameAST *dtor = ast->asDestructorName()) {
|
||||||
isDestructor = true;
|
isDestructor = true;
|
||||||
if (dtor->unqualified_name)
|
if (dtor->unqualified_name)
|
||||||
@@ -1251,6 +1252,8 @@ bool CheckSymbols::maybeAddFunction(const QList<LookupItem> &candidates, NameAST
|
|||||||
if (isDestructor != c->name()->isDestructorNameId())
|
if (isDestructor != c->name()->isDestructorNameId())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
isConstructor = isConstructorDeclaration(c);
|
||||||
|
|
||||||
Function *funTy = c->type()->asFunctionType();
|
Function *funTy = c->type()->asFunctionType();
|
||||||
if (! funTy) {
|
if (! funTy) {
|
||||||
//Try to find a template function
|
//Try to find a template function
|
||||||
@@ -1283,7 +1286,9 @@ bool CheckSymbols::maybeAddFunction(const QList<LookupItem> &candidates, NameAST
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (matchType != Match_None) {
|
if (matchType != Match_None) {
|
||||||
|
// decide how constructor and destructor should be highlighted
|
||||||
if (highlightCtorDtorAsType
|
if (highlightCtorDtorAsType
|
||||||
|
&& (isConstructor || isDestructor)
|
||||||
&& maybeType(ast->name)
|
&& maybeType(ast->name)
|
||||||
&& kind == SemanticInfo::FunctionUse) {
|
&& kind == SemanticInfo::FunctionUse) {
|
||||||
return false;
|
return false;
|
||||||
@@ -1386,3 +1391,12 @@ void CheckSymbols::flush()
|
|||||||
_usages.clear();
|
_usages.clear();
|
||||||
_usages.reserve(cap);
|
_usages.reserve(cap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CheckSymbols::isConstructorDeclaration(Symbol *declaration)
|
||||||
|
{
|
||||||
|
Class *clazz = declaration->enclosingClass();
|
||||||
|
if (clazz && clazz->name())
|
||||||
|
return declaration->name()->isEqualTo(clazz->name());
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -166,6 +166,8 @@ protected:
|
|||||||
void flush();
|
void flush();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
bool isConstructorDeclaration(CPlusPlus::Symbol *declaration);
|
||||||
|
|
||||||
CPlusPlus::Document::Ptr _doc;
|
CPlusPlus::Document::Ptr _doc;
|
||||||
CPlusPlus::LookupContext _context;
|
CPlusPlus::LookupContext _context;
|
||||||
CPlusPlus::TypeOfExpression typeOfExpression;
|
CPlusPlus::TypeOfExpression typeOfExpression;
|
||||||
|
@@ -1796,3 +1796,50 @@ void CppToolsPlugin::test_completion_typedef_using_templates2()
|
|||||||
QVERIFY(completions.contains(QLatin1String("Foo")));
|
QVERIFY(completions.contains(QLatin1String("Foo")));
|
||||||
QVERIFY(completions.contains(QLatin1String("bar")));
|
QVERIFY(completions.contains(QLatin1String("bar")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CppToolsPlugin::test_completion_namespace_alias_with_many_namespace_declarations()
|
||||||
|
{
|
||||||
|
TestData data;
|
||||||
|
data.srcText =
|
||||||
|
"namespace NS1\n"
|
||||||
|
"{\n"
|
||||||
|
"namespace NS2\n"
|
||||||
|
"{\n"
|
||||||
|
"struct Foo1\n"
|
||||||
|
"{\n"
|
||||||
|
" int bar1;\n"
|
||||||
|
"};\n"
|
||||||
|
"}\n"
|
||||||
|
"}\n"
|
||||||
|
"namespace NS1\n"
|
||||||
|
"{\n"
|
||||||
|
"namespace NS2\n"
|
||||||
|
"{\n"
|
||||||
|
"struct Foo2\n"
|
||||||
|
"{\n"
|
||||||
|
" int bar2;\n"
|
||||||
|
"};\n"
|
||||||
|
"}\n"
|
||||||
|
"}\n"
|
||||||
|
"namespace NS = NS1::NS2;\n"
|
||||||
|
"int main()\n"
|
||||||
|
"{\n"
|
||||||
|
" @\n"
|
||||||
|
" // padding so we get the scope right\n"
|
||||||
|
"}\n"
|
||||||
|
;
|
||||||
|
setup(&data);
|
||||||
|
|
||||||
|
Utils::ChangeSet change;
|
||||||
|
QString txt = QLatin1String("NS::");
|
||||||
|
change.insert(data.pos, txt);
|
||||||
|
QTextCursor cursor(data.doc);
|
||||||
|
change.apply(&cursor);
|
||||||
|
data.pos += txt.length();
|
||||||
|
|
||||||
|
QStringList completions = getCompletions(data);
|
||||||
|
|
||||||
|
QCOMPARE(completions.size(), 2);
|
||||||
|
QVERIFY(completions.contains(QLatin1String("Foo1")));
|
||||||
|
QVERIFY(completions.contains(QLatin1String("Foo2")));
|
||||||
|
}
|
||||||
|
@@ -502,7 +502,9 @@ public:
|
|||||||
|
|
||||||
BasicProposalItem *operator()(Symbol *symbol)
|
BasicProposalItem *operator()(Symbol *symbol)
|
||||||
{
|
{
|
||||||
if (! symbol || ! symbol->name() || symbol->name()->isQualifiedNameId())
|
//using declaration can be qualified
|
||||||
|
if (! symbol || ! symbol->name() || (symbol->name()->isQualifiedNameId()
|
||||||
|
&& ! symbol->asUsingDeclaration()))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
BasicProposalItem *previousItem = switchCompletionItem(0);
|
BasicProposalItem *previousItem = switchCompletionItem(0);
|
||||||
|
@@ -122,6 +122,7 @@ private slots:
|
|||||||
void test_completion_template_specialization_with_pointer();
|
void test_completion_template_specialization_with_pointer();
|
||||||
void test_completion_typedef_using_templates1();
|
void test_completion_typedef_using_templates1();
|
||||||
void test_completion_typedef_using_templates2();
|
void test_completion_typedef_using_templates2();
|
||||||
|
void test_completion_namespace_alias_with_many_namespace_declarations();
|
||||||
|
|
||||||
void test_format_pointerdeclaration_in_simpledeclarations();
|
void test_format_pointerdeclaration_in_simpledeclarations();
|
||||||
void test_format_pointerdeclaration_in_simpledeclarations_data();
|
void test_format_pointerdeclaration_in_simpledeclarations_data();
|
||||||
|
@@ -381,8 +381,10 @@ void QmlEngine::tryToConnect(quint16 port)
|
|||||||
if (state() == EngineRunRequested) {
|
if (state() == EngineRunRequested) {
|
||||||
if (isSlaveEngine()) {
|
if (isSlaveEngine()) {
|
||||||
// Probably cpp is being debugged and hence we did not get the output yet.
|
// Probably cpp is being debugged and hence we did not get the output yet.
|
||||||
if (!masterEngine()->isDying())
|
if (!masterEngine()->isDying()) {
|
||||||
|
m_noDebugOutputTimer.setInterval(4000);
|
||||||
m_noDebugOutputTimer.start();
|
m_noDebugOutputTimer.start();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
appStartupFailed(tr("No application output received in time"));
|
appStartupFailed(tr("No application output received in time"));
|
||||||
} else {
|
} else {
|
||||||
|
@@ -158,6 +158,11 @@ ResizeController::ResizeController(const ResizeController &other)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ResizeController::ResizeController(const WeakResizeController &resizeController)
|
||||||
|
: m_data(resizeController.m_data.toStrongRef())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
ResizeController::~ResizeController()
|
ResizeController::~ResizeController()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -263,11 +268,6 @@ FormEditorItem* ResizeController::formEditorItem() const
|
|||||||
return m_data->formEditorItem.data();
|
return m_data->formEditorItem.data();
|
||||||
}
|
}
|
||||||
|
|
||||||
QWeakPointer<ResizeControllerData> ResizeController::weakPointer() const
|
|
||||||
{
|
|
||||||
return m_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ResizeController::isTopLeftHandle(const ResizeHandleItem *handle) const
|
bool ResizeController::isTopLeftHandle(const ResizeHandleItem *handle) const
|
||||||
{
|
{
|
||||||
return handle == m_data->topLeftItem;
|
return handle == m_data->topLeftItem;
|
||||||
@@ -308,4 +308,41 @@ bool ResizeController::isBottomHandle(const ResizeHandleItem *handle) const
|
|||||||
return handle == m_data->bottomItem;
|
return handle == m_data->bottomItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WeakResizeController ResizeController::toWeakResizeController() const
|
||||||
|
{
|
||||||
|
return WeakResizeController(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
WeakResizeController::WeakResizeController()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
WeakResizeController::WeakResizeController(const WeakResizeController &resizeController)
|
||||||
|
: m_data(resizeController.m_data)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
WeakResizeController::WeakResizeController(const ResizeController &resizeController)
|
||||||
|
: m_data(resizeController.m_data.toWeakRef())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
WeakResizeController::~WeakResizeController()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
WeakResizeController &WeakResizeController::operator =(const WeakResizeController &other)
|
||||||
|
{
|
||||||
|
if (m_data != other.m_data)
|
||||||
|
m_data = other.m_data;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
ResizeController WeakResizeController::toResizeController() const
|
||||||
|
{
|
||||||
|
return ResizeController(*this);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -41,15 +41,17 @@ class LayerItem;
|
|||||||
class ResizeHandleItem;
|
class ResizeHandleItem;
|
||||||
|
|
||||||
class ResizeControllerData;
|
class ResizeControllerData;
|
||||||
|
class WeakResizeController;
|
||||||
|
|
||||||
|
|
||||||
class ResizeController
|
class ResizeController
|
||||||
{
|
{
|
||||||
|
friend class WeakResizeController;
|
||||||
public:
|
public:
|
||||||
friend class ResizeHandleItem;
|
|
||||||
|
|
||||||
ResizeController();
|
ResizeController();
|
||||||
ResizeController(LayerItem *layerItem, FormEditorItem *formEditorItem);
|
ResizeController(LayerItem *layerItem, FormEditorItem *formEditorItem);
|
||||||
ResizeController(const ResizeController &resizeController);
|
ResizeController(const ResizeController &resizeController);
|
||||||
|
ResizeController(const WeakResizeController &resizeController);
|
||||||
~ResizeController();
|
~ResizeController();
|
||||||
|
|
||||||
ResizeController& operator=(const ResizeController &other);
|
ResizeController& operator=(const ResizeController &other);
|
||||||
@@ -73,13 +75,32 @@ public:
|
|||||||
bool isRightHandle(const ResizeHandleItem *handle) const;
|
bool isRightHandle(const ResizeHandleItem *handle) const;
|
||||||
bool isBottomHandle(const ResizeHandleItem *handle) const;
|
bool isBottomHandle(const ResizeHandleItem *handle) const;
|
||||||
|
|
||||||
|
WeakResizeController toWeakResizeController() const;
|
||||||
|
|
||||||
|
|
||||||
private: // functions
|
private: // functions
|
||||||
ResizeController(const QSharedPointer<ResizeControllerData> &data);
|
ResizeController(const QSharedPointer<ResizeControllerData> &data);
|
||||||
QWeakPointer<ResizeControllerData> weakPointer() const;
|
|
||||||
private: // variables
|
private: // variables
|
||||||
QSharedPointer<ResizeControllerData> m_data;
|
QSharedPointer<ResizeControllerData> m_data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class WeakResizeController
|
||||||
|
{
|
||||||
|
friend class ResizeController;
|
||||||
|
public:
|
||||||
|
WeakResizeController();
|
||||||
|
WeakResizeController(const WeakResizeController &resizeController);
|
||||||
|
WeakResizeController(const ResizeController &resizeController);
|
||||||
|
~WeakResizeController();
|
||||||
|
|
||||||
|
WeakResizeController& operator=(const WeakResizeController &other);
|
||||||
|
|
||||||
|
ResizeController toResizeController() const;
|
||||||
|
|
||||||
|
private: // variables
|
||||||
|
QWeakPointer<ResizeControllerData> m_data;
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // RESIZECONTROLLER_H
|
#endif // RESIZECONTROLLER_H
|
||||||
|
@@ -36,7 +36,7 @@ namespace QmlDesigner {
|
|||||||
|
|
||||||
ResizeHandleItem::ResizeHandleItem(QGraphicsItem *parent, const ResizeController &resizeController)
|
ResizeHandleItem::ResizeHandleItem(QGraphicsItem *parent, const ResizeController &resizeController)
|
||||||
: QGraphicsPixmapItem(QPixmap(":/icon/handle/resize_handle.png"), parent),
|
: QGraphicsPixmapItem(QPixmap(":/icon/handle/resize_handle.png"), parent),
|
||||||
m_resizeControllerData(resizeController.weakPointer())
|
m_weakResizeController(resizeController.toWeakResizeController())
|
||||||
{
|
{
|
||||||
setShapeMode(QGraphicsPixmapItem::BoundingRectShape);
|
setShapeMode(QGraphicsPixmapItem::BoundingRectShape);
|
||||||
setOffset(-pixmap().rect().center());
|
setOffset(-pixmap().rect().center());
|
||||||
@@ -44,6 +44,10 @@ ResizeHandleItem::ResizeHandleItem(QGraphicsItem *parent, const ResizeController
|
|||||||
setFlag(QGraphicsItem::ItemIgnoresTransformations, true);
|
setFlag(QGraphicsItem::ItemIgnoresTransformations, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ResizeHandleItem::~ResizeHandleItem()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void ResizeHandleItem::setHandlePosition(const QPointF & globalPosition, const QPointF & itemSpacePosition)
|
void ResizeHandleItem::setHandlePosition(const QPointF & globalPosition, const QPointF & itemSpacePosition)
|
||||||
{
|
{
|
||||||
m_itemSpacePosition = itemSpacePosition;
|
m_itemSpacePosition = itemSpacePosition;
|
||||||
@@ -62,8 +66,7 @@ QPainterPath ResizeHandleItem::shape() const
|
|||||||
|
|
||||||
ResizeController ResizeHandleItem::resizeController() const
|
ResizeController ResizeHandleItem::resizeController() const
|
||||||
{
|
{
|
||||||
Q_ASSERT(!m_resizeControllerData.isNull());
|
return ResizeController(m_weakResizeController.toResizeController());
|
||||||
return ResizeController(m_resizeControllerData.toStrongRef());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ResizeHandleItem* ResizeHandleItem::fromGraphicsItem(QGraphicsItem *item)
|
ResizeHandleItem* ResizeHandleItem::fromGraphicsItem(QGraphicsItem *item)
|
||||||
|
@@ -48,7 +48,7 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
ResizeHandleItem(QGraphicsItem *parent, const ResizeController &resizeController);
|
ResizeHandleItem(QGraphicsItem *parent, const ResizeController &resizeController);
|
||||||
|
~ResizeHandleItem();
|
||||||
void setHandlePosition(const QPointF & globalPosition, const QPointF & itemSpacePosition);
|
void setHandlePosition(const QPointF & globalPosition, const QPointF & itemSpacePosition);
|
||||||
|
|
||||||
int type() const;
|
int type() const;
|
||||||
@@ -72,7 +72,7 @@ public:
|
|||||||
QPointF itemSpacePosition() const;
|
QPointF itemSpacePosition() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QWeakPointer<ResizeControllerData> m_resizeControllerData;
|
WeakResizeController m_weakResizeController;
|
||||||
QPointF m_itemSpacePosition;
|
QPointF m_itemSpacePosition;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -618,6 +618,7 @@ PropertyNameList NavigatorTreeModel::visibleProperties(const ModelNode &node) co
|
|||||||
if (!propertyName.contains('.') && //do not show any dot properties, since they are tricky and unlikely to make sense
|
if (!propertyName.contains('.') && //do not show any dot properties, since they are tricky and unlikely to make sense
|
||||||
node.metaInfo().propertyIsWritable(propertyName) && !m_hiddenProperties.contains(propertyName) &&
|
node.metaInfo().propertyIsWritable(propertyName) && !m_hiddenProperties.contains(propertyName) &&
|
||||||
!node.metaInfo().propertyIsEnumType(propertyName) && //Some enums have the same name as Qml types (e. g. Flow)
|
!node.metaInfo().propertyIsEnumType(propertyName) && //Some enums have the same name as Qml types (e. g. Flow)
|
||||||
|
!node.metaInfo().propertyIsPrivate(propertyName) && //Do not show private properties
|
||||||
propertyName != node.metaInfo().defaultPropertyName()) { // TODO: ask the node instances
|
propertyName != node.metaInfo().defaultPropertyName()) { // TODO: ask the node instances
|
||||||
|
|
||||||
TypeName qmlType = qmlTypeInQtContainer(node.metaInfo().propertyTypeName(propertyName));
|
TypeName qmlType = qmlTypeInQtContainer(node.metaInfo().propertyTypeName(propertyName));
|
||||||
|
@@ -35,13 +35,6 @@ GroupBox {
|
|||||||
caption: "Combo Box"
|
caption: "Combo Box"
|
||||||
layout: VerticalLayout {
|
layout: VerticalLayout {
|
||||||
|
|
||||||
ColorGroupBox {
|
|
||||||
text: qsTr("Text")
|
|
||||||
toolTip: qsTr("The text shown on the combobox")
|
|
||||||
finished: finishedNotify
|
|
||||||
backendColor: backendValues.textColor
|
|
||||||
}
|
|
||||||
|
|
||||||
QWidget {
|
QWidget {
|
||||||
layout: HorizontalLayout {
|
layout: HorizontalLayout {
|
||||||
Label {
|
Label {
|
@@ -1,94 +1,107 @@
|
|||||||
MetaInfo {
|
MetaInfo {
|
||||||
|
|
||||||
Type {
|
Type {
|
||||||
name: "QtDesktop.Button"
|
name: "QtQuick.Controls.Button"
|
||||||
icon: ":/componentsplugin/images/button16.png"
|
icon: ":/componentsplugin/images/button16.png"
|
||||||
|
|
||||||
ItemLibraryEntry {
|
ItemLibraryEntry {
|
||||||
name: "Button"
|
name: "Button"
|
||||||
category: "Qt Quick - Components"
|
category: "Qt Quick - Controls"
|
||||||
libraryIcon: ":/componentsplugin/images/button.png"
|
libraryIcon: ":/componentsplugin/images/button.png"
|
||||||
version: "1.0"
|
version: "1.0"
|
||||||
requiredImport: "QtDesktop"
|
requiredImport: "QtQuick.Controls"
|
||||||
|
|
||||||
Property { name: "text"; type: "QString"; value: "Button"; }
|
Property { name: "text"; type: "QString"; value: "Button"; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Type {
|
Type {
|
||||||
name: "QtDesktop.CheckBox"
|
name: "QtQuick.Controls.SpinBox"
|
||||||
|
icon: ":/componentsplugin/images/window16.png"
|
||||||
|
|
||||||
|
ItemLibraryEntry {
|
||||||
|
name: "SpinBox"
|
||||||
|
category: "Qt Quick - Controls"
|
||||||
|
libraryIcon: ":/componentsplugin/images/window.png"
|
||||||
|
version: "1.0"
|
||||||
|
requiredImport: "QtQuick.Controls"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Type {
|
||||||
|
name: "QtQuick.Controls.CheckBox"
|
||||||
icon: ":/componentsplugin/images/checkbox16.png"
|
icon: ":/componentsplugin/images/checkbox16.png"
|
||||||
|
|
||||||
ItemLibraryEntry {
|
ItemLibraryEntry {
|
||||||
name: "Check Box"
|
name: "Check Box"
|
||||||
category: "Qt Quick - Components"
|
category: "Qt Quick - Controls"
|
||||||
libraryIcon: ":/componentsplugin/images/checkbox.png"
|
libraryIcon: ":/componentsplugin/images/checkbox.png"
|
||||||
version: "1.0"
|
version: "1.0"
|
||||||
requiredImport: "QtDesktop"
|
requiredImport: "QtQuick.Controls"
|
||||||
|
|
||||||
Property { name: "text"; type: "QString"; value: "Check Box"; }
|
Property { name: "text"; type: "QString"; value: "Check Box"; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Type {
|
Type {
|
||||||
name: "QtDesktop.RadioButton"
|
name: "QtQuick.Controls.RadioButton"
|
||||||
icon: ":/componentsplugin/images/radiobutton16.png"
|
icon: ":/componentsplugin/images/radiobutton16.png"
|
||||||
|
|
||||||
ItemLibraryEntry {
|
ItemLibraryEntry {
|
||||||
name: "Radio Button"
|
name: "Radio Button"
|
||||||
category: "Qt Quick - Components"
|
category: "Qt Quick - Controls"
|
||||||
libraryIcon: ":/componentsplugin/images/radiobutton.png"
|
libraryIcon: ":/componentsplugin/images/radiobutton.png"
|
||||||
version: "1.0"
|
version: "1.0"
|
||||||
requiredImport: "QtDesktop"
|
requiredImport: "QtQuick.Controls"
|
||||||
|
|
||||||
Property { name: "text"; type: "QString"; value: "Radio Button"; }
|
Property { name: "text"; type: "QString"; value: "Radio Button"; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Type {
|
Type {
|
||||||
name: "QtDesktop.ComboBox"
|
name: "QtQuick.Controls.ComboBox"
|
||||||
icon: ":/componentsplugin/images/combobox16.png"
|
icon: ":/componentsplugin/images/combobox16.png"
|
||||||
|
|
||||||
ItemLibraryEntry {
|
ItemLibraryEntry {
|
||||||
name: "Combo Box"
|
name: "Combo Box"
|
||||||
category: "Qt Quick - Components"
|
category: "Qt Quick - Controls"
|
||||||
libraryIcon: ":/componentsplugin/images/combobox.png"
|
libraryIcon: ":/componentsplugin/images/combobox.png"
|
||||||
version: "1.0"
|
version: "1.0"
|
||||||
requiredImport: "QtDesktop"
|
requiredImport: "QtQuick.Controls"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Type {
|
Type {
|
||||||
name: "QtDesktop.ButtonRow"
|
name: "QtQuick.Controls.ButtonRow"
|
||||||
icon: ":/componentsplugin/images/buttonrow16.png"
|
icon: ":/componentsplugin/images/buttonrow16.png"
|
||||||
|
|
||||||
ItemLibraryEntry {
|
ItemLibraryEntry {
|
||||||
name: "Button Row"
|
name: "Button Row"
|
||||||
category: "Qt Quick - Components"
|
category: "Qt Quick - Controls"
|
||||||
libraryIcon: ":/componentsplugin/images/buttonrow.png"
|
libraryIcon: ":/componentsplugin/images/buttonrow.png"
|
||||||
version: "1.0"
|
version: "1.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Type {
|
Type {
|
||||||
name: "QtDesktop.ButtonColumn"
|
name: "QtQuick.Controls.ButtonColumn"
|
||||||
icon: ":/componentsplugin/images/buttoncolumn16.png"
|
icon: ":/componentsplugin/images/buttoncolumn16.png"
|
||||||
|
|
||||||
ItemLibraryEntry {
|
ItemLibraryEntry {
|
||||||
name: "Button Column"
|
name: "Button Column"
|
||||||
category: "Qt Quick - Components"
|
category: "Qt Quick - Controls"
|
||||||
libraryIcon: ":/componentsplugin/images/buttoncolumn.png"
|
libraryIcon: ":/componentsplugin/images/buttoncolumn.png"
|
||||||
version: "1.0"
|
version: "1.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Type {
|
Type {
|
||||||
name: "QtDesktop.Label"
|
name: "QtQuick.Controls.Label"
|
||||||
icon: ":/componentsplugin/images/label16.png"
|
icon: ":/componentsplugin/images/label16.png"
|
||||||
|
|
||||||
ItemLibraryEntry {
|
ItemLibraryEntry {
|
||||||
name: "Label"
|
name: "Label"
|
||||||
category: "Qt Quick - Components"
|
category: "Qt Quick - Controls"
|
||||||
libraryIcon: ":/componentsplugin/images/label.png"
|
libraryIcon: ":/componentsplugin/images/label.png"
|
||||||
version: "1.0"
|
version: "1.0"
|
||||||
|
|
||||||
@@ -97,12 +110,12 @@ MetaInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Type {
|
Type {
|
||||||
name: "QtDesktop.TextField"
|
name: "QtQuick.Controls.TextField"
|
||||||
icon: ":/componentsplugin/images/textfield16.png"
|
icon: ":/componentsplugin/images/textfield16.png"
|
||||||
|
|
||||||
ItemLibraryEntry {
|
ItemLibraryEntry {
|
||||||
name: "Text Field"
|
name: "Text Field"
|
||||||
category: "Qt Quick - Components"
|
category: "Qt Quick - Controls"
|
||||||
libraryIcon: ":/componentsplugin/images/textfield.png"
|
libraryIcon: ":/componentsplugin/images/textfield.png"
|
||||||
version: "1.0"
|
version: "1.0"
|
||||||
|
|
||||||
@@ -111,43 +124,43 @@ MetaInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Type {
|
Type {
|
||||||
name: "QtDesktop.TextArea"
|
name: "QtQuick.Controls.TextArea"
|
||||||
icon: ":/componentsplugin/images/textarea16.png"
|
icon: ":/componentsplugin/images/textarea16.png"
|
||||||
|
|
||||||
ItemLibraryEntry {
|
ItemLibraryEntry {
|
||||||
name: "Text Area"
|
name: "Text Area"
|
||||||
category: "Qt Quick - Components"
|
category: "Qt Quick - Controls"
|
||||||
libraryIcon: ":/componentsplugin/images/textarea.png"
|
libraryIcon: ":/componentsplugin/images/textarea.png"
|
||||||
version: "1.0"
|
version: "1.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Type {
|
Type {
|
||||||
name: "QtDesktop.ProgressBar"
|
name: "QtQuick.Controls.ProgressBar"
|
||||||
icon: ":/componentsplugin/images/progressbar16.png"
|
icon: ":/componentsplugin/images/progressbar16.png"
|
||||||
|
|
||||||
ItemLibraryEntry {
|
ItemLibraryEntry {
|
||||||
name: "Progress Bar"
|
name: "Progress Bar"
|
||||||
category: "Qt Quick - Components"
|
category: "Qt Quick - Controls"
|
||||||
libraryIcon: ":/componentsplugin/images/progressbar.png"
|
libraryIcon: ":/componentsplugin/images/progressbar.png"
|
||||||
version: "1.0"
|
version: "1.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Type {
|
Type {
|
||||||
name: "QtDesktop.Slider"
|
name: "QtQuick.Controls.Slider"
|
||||||
icon: ":/componentsplugin/images/sliderh16.png"
|
icon: ":/componentsplugin/images/sliderh16.png"
|
||||||
|
|
||||||
ItemLibraryEntry {
|
ItemLibraryEntry {
|
||||||
name: "Slider (Horizontal)"
|
name: "Slider (Horizontal)"
|
||||||
category: "Qt Quick - Components"
|
category: "Qt Quick - Controls"
|
||||||
libraryIcon: ":/componentsplugin/images/sliderh.png"
|
libraryIcon: ":/componentsplugin/images/sliderh.png"
|
||||||
version: "1.0"
|
version: "1.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemLibraryEntry {
|
ItemLibraryEntry {
|
||||||
name: "Slider (Vertical)"
|
name: "Slider (Vertical)"
|
||||||
category: "Qt Quick - Components"
|
category: "Qt Quick - Controls"
|
||||||
libraryIcon: ":/componentsplugin/images/sliderh.png"
|
libraryIcon: ":/componentsplugin/images/sliderh.png"
|
||||||
version: "1.0"
|
version: "1.0"
|
||||||
Property { name: "orientation"; type: "int"; value: "0"; }
|
Property { name: "orientation"; type: "int"; value: "0"; }
|
||||||
@@ -155,19 +168,19 @@ MetaInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Type {
|
Type {
|
||||||
name: "QtDesktop.ScrollBar"
|
name: "QtQuick.Controls.ScrollBar"
|
||||||
icon: ":/componentsplugin/images/scrollbar16.png"
|
icon: ":/componentsplugin/images/scrollbar16.png"
|
||||||
|
|
||||||
ItemLibraryEntry {
|
ItemLibraryEntry {
|
||||||
name: "Scroll Bar (Horizontal)"
|
name: "Scroll Bar (Horizontal)"
|
||||||
category: "Qt Quick - Components"
|
category: "Qt Quick - Controls"
|
||||||
libraryIcon: ":/componentsplugin/images/scrollbarh.png"
|
libraryIcon: ":/componentsplugin/images/scrollbarh.png"
|
||||||
version: "1.0"
|
version: "1.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemLibraryEntry {
|
ItemLibraryEntry {
|
||||||
name: "Scroll Bar (Vertical)"
|
name: "Scroll Bar (Vertical)"
|
||||||
category: "Qt Quick - Components"
|
category: "Qt Quick - Controls"
|
||||||
libraryIcon: ":/componentsplugin/images/scrollbarv.png"
|
libraryIcon: ":/componentsplugin/images/scrollbarv.png"
|
||||||
version: "1.0"
|
version: "1.0"
|
||||||
Property { name: "orientation"; type: "int"; value: "0"; }
|
Property { name: "orientation"; type: "int"; value: "0"; }
|
||||||
@@ -175,15 +188,15 @@ MetaInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Type {
|
Type {
|
||||||
name: "QtDesktop.ScrollArea"
|
name: "QtQuick.Controls.ScrollArea"
|
||||||
icon: ":/desktopplugin//images/window16.png"
|
icon: ":/componentsplugin/images/window16.png"
|
||||||
|
|
||||||
ItemLibraryEntry {
|
ItemLibraryEntry {
|
||||||
name: "Scroll Area"
|
name: "Scroll Area"
|
||||||
category: "Qt Quick - Components"
|
category: "Qt Quick - Controls"
|
||||||
libraryIcon: ":/desktopplugin/images/window.png"
|
libraryIcon: ":/componentsplugin/images/window.png"
|
||||||
version: "1.0"
|
version: "1.0"
|
||||||
requiredImport: "QtDesktop"
|
requiredImport: "QtQuick.Controls"
|
||||||
|
|
||||||
Property { name: "width"; type: "int"; value: 360; }
|
Property { name: "width"; type: "int"; value: 360; }
|
||||||
Property { name: "height"; type: "int"; value: 300; }
|
Property { name: "height"; type: "int"; value: 300; }
|
||||||
@@ -191,15 +204,15 @@ MetaInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Type {
|
Type {
|
||||||
name: "QtDesktop.GroupBox"
|
name: "QtQuick.Controls.GroupBox"
|
||||||
icon: ":/desktopplugin//images/window16.png"
|
icon: ":/componentsplugin/images/window16.png"
|
||||||
|
|
||||||
ItemLibraryEntry {
|
ItemLibraryEntry {
|
||||||
name: "Group Box"
|
name: "Group Box"
|
||||||
category: "Qt Quick - Components"
|
category: "Qt Quick - Controls"
|
||||||
libraryIcon: ":/desktopplugin/images/window.png"
|
libraryIcon: ":/componentsplugin/images/window.png"
|
||||||
version: "1.0"
|
version: "1.0"
|
||||||
requiredImport: "QtDesktop"
|
requiredImport: "QtQuick.Controls"
|
||||||
|
|
||||||
Property { name: "width"; type: "int"; value: 360; }
|
Property { name: "width"; type: "int"; value: 360; }
|
||||||
Property { name: "height"; type: "int"; value: 300; }
|
Property { name: "height"; type: "int"; value: 300; }
|
||||||
@@ -207,15 +220,15 @@ MetaInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Type {
|
Type {
|
||||||
name: "QtDesktop.Frame"
|
name: "QtQuick.Controls.Frame"
|
||||||
icon: ":/desktopplugin//images/window16.png"
|
icon: ":/desktopplugin//images/window16.png"
|
||||||
|
|
||||||
ItemLibraryEntry {
|
ItemLibraryEntry {
|
||||||
name: "Frame"
|
name: "Frame"
|
||||||
category: "Qt Quick - Components"
|
category: "Qt Quick - Controls"
|
||||||
libraryIcon: ":/desktopplugin/images/window.png"
|
libraryIcon: ":/desktopplugin/images/window.png"
|
||||||
version: "1.0"
|
version: "1.0"
|
||||||
requiredImport: "QtDesktop"
|
requiredImport: "QtQuick.Controls"
|
||||||
|
|
||||||
Property { name: "width"; type: "int"; value: 360; }
|
Property { name: "width"; type: "int"; value: 360; }
|
||||||
Property { name: "height"; type: "int"; value: 300; }
|
Property { name: "height"; type: "int"; value: 300; }
|
||||||
@@ -223,15 +236,15 @@ MetaInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Type {
|
Type {
|
||||||
name: "QtDesktop.ToolBar"
|
name: "QtQuick.Controls.ToolBar"
|
||||||
icon: ":/desktopplugin/images/toolbar16.png"
|
icon: ":/desktopplugin/images/toolbar16.png"
|
||||||
|
|
||||||
ItemLibraryEntry {
|
ItemLibraryEntry {
|
||||||
name: "Tool Bar"
|
name: "Tool Bar"
|
||||||
category: "Qt Quick - Components"
|
category: "Qt Quick - Controls"
|
||||||
libraryIcon: ":/desktopplugin/images/toolbar.png"
|
libraryIcon: ":/desktopplugin/images/toolbar.png"
|
||||||
version: "1.0"
|
version: "1.0"
|
||||||
requiredImport: "QtDesktop"
|
requiredImport: "QtQuick.Controls"
|
||||||
|
|
||||||
Property { name: "width"; type: "int"; value: 360; }
|
Property { name: "width"; type: "int"; value: 360; }
|
||||||
Property { name: "height"; type: "int"; value: 50; }
|
Property { name: "height"; type: "int"; value: 50; }
|
||||||
@@ -239,15 +252,15 @@ MetaInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Type {
|
Type {
|
||||||
name: "QtDesktop.Dial"
|
name: "QtQuick.Controls.Dial"
|
||||||
//icon: ":/desktopplugin/images/progressbar16.png"
|
//icon: ":/desktopplugin/images/progressbar16.png"
|
||||||
|
|
||||||
ItemLibraryEntry {
|
ItemLibraryEntry {
|
||||||
name: "Dial"
|
name: "Dial"
|
||||||
category: "Qt Quick - Components"
|
category: "Qt Quick - Controls"
|
||||||
//libraryIcon: ":/desktopplugin/images/progressbar.png"
|
//libraryIcon: ":/desktopplugin/images/progressbar.png"
|
||||||
version: "1.0"
|
version: "1.0"
|
||||||
requiredImport: "QtDesktop"
|
requiredImport: "QtQuick.Controls"
|
||||||
|
|
||||||
Property { name: "width"; type: "int"; value: 100; }
|
Property { name: "width"; type: "int"; value: 100; }
|
||||||
Property { name: "height"; type: "int"; value: 100; }
|
Property { name: "height"; type: "int"; value: 100; }
|
||||||
|
@@ -36,12 +36,12 @@
|
|||||||
<file>images/window.png</file>
|
<file>images/window.png</file>
|
||||||
<file>images/window16.png</file>
|
<file>images/window16.png</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
<qresource prefix="/propertyeditor">
|
<qresource prefix="/propertyeditor/QtQuick">
|
||||||
<file>QtDesktop/ButtonSpecifics.qml</file>
|
<file>Controls/ButtonSpecifics.qml</file>
|
||||||
<file>QtDesktop/TextFieldSpecifics.qml</file>
|
<file>Controls/TextFieldSpecifics.qml</file>
|
||||||
<file>QtDesktop/TextAreaSpecifics.qml</file>
|
<file>Controls/TextAreaSpecifics.qml</file>
|
||||||
<file>QtDesktop/ComboBoxSpecifics.qml</file>
|
<file>Controls/ComboBoxSpecifics.qml</file>
|
||||||
<file>QtDesktop/CheckBoxSpecifics.qml</file>
|
<file>Controls/CheckBoxSpecifics.qml</file>
|
||||||
<file>QtDesktop/RadioButtonSpecifics.qml</file>
|
<file>Controls/RadioButtonSpecifics.qml</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
@@ -42,13 +42,15 @@ AddPropertyVisitor::AddPropertyVisitor(QmlDesigner::TextModifier &modifier,
|
|||||||
const QmlDesigner::PropertyName &name,
|
const QmlDesigner::PropertyName &name,
|
||||||
const QString &value,
|
const QString &value,
|
||||||
QmlRefactoring::PropertyType propertyType,
|
QmlRefactoring::PropertyType propertyType,
|
||||||
const PropertyNameList &propertyOrder):
|
const PropertyNameList &propertyOrder,
|
||||||
|
const QmlDesigner::TypeName &dynamicTypeName) :
|
||||||
QMLRewriter(modifier),
|
QMLRewriter(modifier),
|
||||||
m_parentLocation(parentLocation),
|
m_parentLocation(parentLocation),
|
||||||
m_name(name),
|
m_name(name),
|
||||||
m_value(value),
|
m_value(value),
|
||||||
m_propertyType(propertyType),
|
m_propertyType(propertyType),
|
||||||
m_propertyOrder(propertyOrder)
|
m_propertyOrder(propertyOrder),
|
||||||
|
m_dynamicTypeName(dynamicTypeName)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -147,6 +149,9 @@ void AddPropertyVisitor::addInMembers(QmlJS::AST::UiObjectInitializer *initializ
|
|||||||
Q_ASSERT(!"unknown property type");
|
Q_ASSERT(!"unknown property type");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!m_dynamicTypeName.isEmpty())
|
||||||
|
newPropertyTemplate.prepend(QString(QLatin1String("property %1 ")).arg(QString::fromUtf8(m_dynamicTypeName)));
|
||||||
|
|
||||||
if (isOneLiner) {
|
if (isOneLiner) {
|
||||||
if (needsPreceedingSemicolon)
|
if (needsPreceedingSemicolon)
|
||||||
newPropertyTemplate.prepend(QLatin1Char(';'));
|
newPropertyTemplate.prepend(QLatin1Char(';'));
|
||||||
|
@@ -45,7 +45,8 @@ public:
|
|||||||
const QmlDesigner::PropertyName &name,
|
const QmlDesigner::PropertyName &name,
|
||||||
const QString &value,
|
const QString &value,
|
||||||
QmlDesigner::QmlRefactoring::PropertyType propertyType,
|
QmlDesigner::QmlRefactoring::PropertyType propertyType,
|
||||||
const PropertyNameList &propertyOrder);
|
const PropertyNameList &propertyOrder,
|
||||||
|
const QmlDesigner::TypeName &dynamicTypeName);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool visit(QmlJS::AST::UiObjectDefinition *ast);
|
virtual bool visit(QmlJS::AST::UiObjectDefinition *ast);
|
||||||
@@ -60,6 +61,7 @@ private:
|
|||||||
QString m_value;
|
QString m_value;
|
||||||
QmlRefactoring::PropertyType m_propertyType;
|
QmlRefactoring::PropertyType m_propertyType;
|
||||||
PropertyNameList m_propertyOrder;
|
PropertyNameList m_propertyOrder;
|
||||||
|
QmlDesigner::TypeName m_dynamicTypeName;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
@@ -103,12 +103,16 @@ bool QmlRefactoring::addToObjectMemberList(int parentLocation, const QString &co
|
|||||||
return visit(qmlDocument->qmlProgram());
|
return visit(qmlDocument->qmlProgram());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QmlRefactoring::addProperty(int parentLocation, const PropertyName &name, const QString &value, PropertyType propertyType)
|
bool QmlRefactoring::addProperty(int parentLocation,
|
||||||
|
const PropertyName &name,
|
||||||
|
const QString &value,
|
||||||
|
PropertyType propertyType,
|
||||||
|
const TypeName &dynamicTypeName)
|
||||||
{
|
{
|
||||||
if (parentLocation < 0)
|
if (parentLocation < 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
AddPropertyVisitor visit(*textModifier, (quint32) parentLocation, name, value, propertyType, m_propertyOrder);
|
AddPropertyVisitor visit(*textModifier, (quint32) parentLocation, name, value, propertyType, m_propertyOrder, dynamicTypeName);
|
||||||
return visit(qmlDocument->qmlProgram());
|
return visit(qmlDocument->qmlProgram());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -60,7 +60,11 @@ public:
|
|||||||
|
|
||||||
bool addToArrayMemberList(int parentLocation, const PropertyName &propertyName, const QString &content);
|
bool addToArrayMemberList(int parentLocation, const PropertyName &propertyName, const QString &content);
|
||||||
bool addToObjectMemberList(int parentLocation, const QString &content);
|
bool addToObjectMemberList(int parentLocation, const QString &content);
|
||||||
bool addProperty(int parentLocation, const PropertyName &name, const QString &value, PropertyType propertyType);
|
bool addProperty(int parentLocation,
|
||||||
|
const PropertyName &name,
|
||||||
|
const QString &value,
|
||||||
|
PropertyType propertyType,
|
||||||
|
const TypeName &dynamicTypeName = TypeName());
|
||||||
bool changeProperty(int parentLocation, const PropertyName &name, const QString &value, PropertyType propertyType);
|
bool changeProperty(int parentLocation, const PropertyName &name, const QString &value, PropertyType propertyType);
|
||||||
bool changeObjectType(int nodeLocation, const QString &newType);
|
bool changeObjectType(int nodeLocation, const QString &newType);
|
||||||
|
|
||||||
|
@@ -79,6 +79,7 @@ public:
|
|||||||
bool propertyIsWritable(const PropertyName &propertyName) const;
|
bool propertyIsWritable(const PropertyName &propertyName) const;
|
||||||
bool propertyIsListProperty(const PropertyName &propertyName) const;
|
bool propertyIsListProperty(const PropertyName &propertyName) const;
|
||||||
bool propertyIsEnumType(const PropertyName &propertyName) const;
|
bool propertyIsEnumType(const PropertyName &propertyName) const;
|
||||||
|
bool propertyIsPrivate(const PropertyName &propertyName) const;
|
||||||
QString propertyEnumScope(const PropertyName &propertyName) const;
|
QString propertyEnumScope(const PropertyName &propertyName) const;
|
||||||
QStringList propertyKeysForEnum(const PropertyName &propertyName) const;
|
QStringList propertyKeysForEnum(const PropertyName &propertyName) const;
|
||||||
QVariant propertyCastedValue(const PropertyName &propertyName, const QVariant &value) const;
|
QVariant propertyCastedValue(const PropertyName &propertyName, const QVariant &value) const;
|
||||||
|
@@ -593,7 +593,7 @@ const QmlJS::CppComponentValue *NodeMetaInfoPrivate::getCppComponentValue() cons
|
|||||||
return cppValue;
|
return cppValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return value_cast<CppComponentValue>(getObjectValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
const QmlJS::ObjectValue *NodeMetaInfoPrivate::getObjectValue() const
|
const QmlJS::ObjectValue *NodeMetaInfoPrivate::getObjectValue() const
|
||||||
@@ -1129,6 +1129,11 @@ bool NodeMetaInfo::propertyIsEnumType(const PropertyName &propertyName) const
|
|||||||
return m_privateData->isPropertyEnum(propertyName);
|
return m_privateData->isPropertyEnum(propertyName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NodeMetaInfo::propertyIsPrivate(const PropertyName &propertyName) const
|
||||||
|
{
|
||||||
|
return propertyName.startsWith("__");
|
||||||
|
}
|
||||||
|
|
||||||
QString NodeMetaInfo::propertyEnumScope(const PropertyName &propertyName) const
|
QString NodeMetaInfo::propertyEnumScope(const PropertyName &propertyName) const
|
||||||
{
|
{
|
||||||
return m_privateData->propertyEnumScope(propertyName);
|
return m_privateData->propertyEnumScope(propertyName);
|
||||||
|
@@ -62,6 +62,9 @@ void BindingProperty::setExpression(const QString &expression)
|
|||||||
if (!isValid())
|
if (!isValid())
|
||||||
throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
|
throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
|
||||||
|
|
||||||
|
if (isDynamic())
|
||||||
|
qWarning() << "Calling BindingProperty::setExpression on dynamic property.";
|
||||||
|
|
||||||
if (name() == "id") { // the ID for a node is independent of the state, so it has to be set with ModelNode::setId
|
if (name() == "id") { // the ID for a node is independent of the state, so it has to be set with ModelNode::setId
|
||||||
throw InvalidPropertyException(__LINE__, __FUNCTION__, __FILE__, name());
|
throw InvalidPropertyException(__LINE__, __FUNCTION__, __FILE__, name());
|
||||||
}
|
}
|
||||||
|
@@ -124,7 +124,7 @@ QmlItemNode QmlModelView::createQmlItemNodeFromImage(const QString &imageName, c
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!model()->imports().contains(newImport))
|
if (!model()->hasImport(newImport, true, true))
|
||||||
model()->changeImports(QList<Import>() << newImport, QList<Import>());
|
model()->changeImports(QList<Import>() << newImport, QList<Import>());
|
||||||
|
|
||||||
QList<QPair<PropertyName, QVariant> > propertyPairList;
|
QList<QPair<PropertyName, QVariant> > propertyPairList;
|
||||||
@@ -140,8 +140,13 @@ QmlItemNode QmlModelView::createQmlItemNodeFromImage(const QString &imageName, c
|
|||||||
}
|
}
|
||||||
|
|
||||||
propertyPairList.append(qMakePair(PropertyName("source"), QVariant(relativeImageName)));
|
propertyPairList.append(qMakePair(PropertyName("source"), QVariant(relativeImageName)));
|
||||||
newNode = createQmlItemNode("QtQuick.Image", -1, -1, propertyPairList);
|
NodeMetaInfo metaInfo = model()->metaInfo("QtQuick.Image");
|
||||||
parentNode.nodeAbstractProperty("data").reparentHere(newNode);
|
if (metaInfo.isValid()) {
|
||||||
|
int minorVersion = metaInfo.minorVersion();
|
||||||
|
int majorVersion = metaInfo.majorVersion();
|
||||||
|
newNode = createQmlItemNode("QtQuick.Image", majorVersion, minorVersion, propertyPairList);
|
||||||
|
parentNode.nodeAbstractProperty("data").reparentHere(newNode);
|
||||||
|
}
|
||||||
|
|
||||||
Q_ASSERT(newNode.isValid());
|
Q_ASSERT(newNode.isValid());
|
||||||
|
|
||||||
|
@@ -230,10 +230,21 @@ QString QmlTextGenerator::propertyToQml(const AbstractProperty &property, int in
|
|||||||
{
|
{
|
||||||
QString result;
|
QString result;
|
||||||
|
|
||||||
if (property.isDefaultProperty())
|
if (property.isDefaultProperty()) {
|
||||||
result = toQml(property, indentDepth);
|
result = toQml(property, indentDepth);
|
||||||
else
|
} else {
|
||||||
result = QString(indentDepth, QLatin1Char(' ')) + property.name() + QLatin1String(": ") + toQml(property, indentDepth);
|
if (property.isDynamic()) {
|
||||||
|
result = QString(indentDepth, QLatin1Char(' '))
|
||||||
|
+ QLatin1String("property ")
|
||||||
|
+ property.dynamicTypeName()
|
||||||
|
+ QLatin1String(" ")
|
||||||
|
+ property.name()
|
||||||
|
+ QLatin1String(": ")
|
||||||
|
+ toQml(property, indentDepth);
|
||||||
|
} else {
|
||||||
|
result = QString(indentDepth, QLatin1Char(' ')) + property.name() + QLatin1String(": ") + toQml(property, indentDepth);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
result += QLatin1Char('\n');
|
result += QLatin1Char('\n');
|
||||||
|
|
||||||
|
@@ -107,7 +107,7 @@ bool AddPropertyRewriteAction::execute(QmlRefactoring &refactoring, ModelNodePos
|
|||||||
<< info();
|
<< info();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
result = refactoring.addProperty(nodeLocation, m_property.name(), m_valueText, m_propertyType);
|
result = refactoring.addProperty(nodeLocation, m_property.name(), m_valueText, m_propertyType, m_property.dynamicTypeName());
|
||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
qDebug() << "*** AddPropertyRewriteAction::execute failed in addProperty("
|
qDebug() << "*** AddPropertyRewriteAction::execute failed in addProperty("
|
||||||
|
@@ -69,7 +69,7 @@ namespace {
|
|||||||
static inline QStringList supportedVersionsList()
|
static inline QStringList supportedVersionsList()
|
||||||
{
|
{
|
||||||
QStringList list;
|
QStringList list;
|
||||||
list << QLatin1String("1.0") << QLatin1String("1.1") << QLatin1String("2.0");
|
list << QLatin1String("1.0") << QLatin1String("1.1") << QLatin1String("2.0") << QLatin1String("2.1");
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -776,9 +776,9 @@ bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceH
|
|||||||
check.disableMessage(StaticAnalysis::ErrCouldNotResolvePrototypeOf);
|
check.disableMessage(StaticAnalysis::ErrCouldNotResolvePrototypeOf);
|
||||||
|
|
||||||
foreach (StaticAnalysis::Type type, StaticAnalysis::Message::allMessageTypes()) {
|
foreach (StaticAnalysis::Type type, StaticAnalysis::Message::allMessageTypes()) {
|
||||||
StaticAnalysis::Message message(type, AST::SourceLocation());
|
StaticAnalysis::PrototypeMessageData prototypeMessageData = StaticAnalysis::Message::prototypeForMessageType(type);
|
||||||
if (message.severity == StaticAnalysis::MaybeWarning
|
if (prototypeMessageData.severity == StaticAnalysis::MaybeWarning
|
||||||
|| message.severity == StaticAnalysis::Warning) {
|
|| prototypeMessageData.severity == StaticAnalysis::Warning) {
|
||||||
check.disableMessage(type);
|
check.disableMessage(type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1358,10 +1358,9 @@ void ModelValidator::signalHandlerSourceDiffer(SignalHandlerProperty &modelPrope
|
|||||||
Q_ASSERT(0);
|
Q_ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelValidator::shouldBeSignalHandlerProperty(AbstractProperty &modelProperty, const QString &javascript)
|
void ModelValidator::shouldBeSignalHandlerProperty(AbstractProperty &modelProperty, const QString & /*javascript*/)
|
||||||
{
|
{
|
||||||
Q_UNUSED(modelProperty)
|
Q_UNUSED(modelProperty)
|
||||||
Q_UNUSED(javascript)
|
|
||||||
Q_ASSERT(modelProperty.isSignalHandlerProperty());
|
Q_ASSERT(modelProperty.isSignalHandlerProperty());
|
||||||
Q_ASSERT(0);
|
Q_ASSERT(0);
|
||||||
}
|
}
|
||||||
|
@@ -61,6 +61,9 @@ void VariantProperty::setValue(const QVariant &value)
|
|||||||
if (!isValid())
|
if (!isValid())
|
||||||
throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
|
throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__);
|
||||||
|
|
||||||
|
if (isDynamic())
|
||||||
|
qWarning() << "Calling VariantProperty::setValue on dynamic property.";
|
||||||
|
|
||||||
if (value.isNull())
|
if (value.isNull())
|
||||||
throw InvalidArgumentException(__LINE__, __FUNCTION__, __FILE__, name());
|
throw InvalidArgumentException(__LINE__, __FUNCTION__, __FILE__, name());
|
||||||
|
|
||||||
|
@@ -51,7 +51,7 @@ BlackBerryDebugTokenRequestDialog::BlackBerryDebugTokenRequestDialog(
|
|||||||
m_ui->setupUi(this);
|
m_ui->setupUi(this);
|
||||||
m_ui->progressBar->hide();
|
m_ui->progressBar->hide();
|
||||||
m_ui->status->clear();
|
m_ui->status->clear();
|
||||||
m_ui->debugTokenPath->setExpectedKind(Utils::PathChooser::Any);
|
m_ui->debugTokenPath->setExpectedKind(Utils::PathChooser::SaveFile);
|
||||||
m_ui->debugTokenPath->setPromptDialogTitle(tr("Request Debug Token"));
|
m_ui->debugTokenPath->setPromptDialogTitle(tr("Request Debug Token"));
|
||||||
m_ui->debugTokenPath->setPromptDialogFilter(tr("BAR Files (*.bar)"));
|
m_ui->debugTokenPath->setPromptDialogFilter(tr("BAR Files (*.bar)"));
|
||||||
|
|
||||||
@@ -67,8 +67,12 @@ BlackBerryDebugTokenRequestDialog::BlackBerryDebugTokenRequestDialog(
|
|||||||
this, SLOT(requestDebugToken()));
|
this, SLOT(requestDebugToken()));
|
||||||
connect(m_ui->debugTokenPath, SIGNAL(changed(QString)),
|
connect(m_ui->debugTokenPath, SIGNAL(changed(QString)),
|
||||||
this, SLOT(validate()));
|
this, SLOT(validate()));
|
||||||
|
connect(m_ui->debugTokenPath, SIGNAL(beforeBrowsing()),
|
||||||
|
this, SLOT(setDefaultPath()));
|
||||||
connect(m_ui->debugTokenPath, SIGNAL(editingFinished()),
|
connect(m_ui->debugTokenPath, SIGNAL(editingFinished()),
|
||||||
this, SLOT(appendExtension()));
|
this, SLOT(appendExtension()));
|
||||||
|
connect(m_ui->debugTokenPath, SIGNAL(editingFinished()),
|
||||||
|
this, SLOT(expandPath()));
|
||||||
connect(m_ui->keystorePassword, SIGNAL(textChanged(QString)),
|
connect(m_ui->keystorePassword, SIGNAL(textChanged(QString)),
|
||||||
this, SLOT(validate()));
|
this, SLOT(validate()));
|
||||||
connect(m_ui->cskPassword, SIGNAL(textChanged(QString)),
|
connect(m_ui->cskPassword, SIGNAL(textChanged(QString)),
|
||||||
@@ -133,16 +137,47 @@ void BlackBerryDebugTokenRequestDialog::requestDebugToken()
|
|||||||
m_ui->keystorePassword->text(), m_ui->devicePin->text());
|
m_ui->keystorePassword->text(), m_ui->devicePin->text());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BlackBerryDebugTokenRequestDialog::setDefaultPath()
|
||||||
|
{
|
||||||
|
const QString path = m_ui->debugTokenPath->path();
|
||||||
|
const QString defaultFileName = QLatin1String("/debugToken.bar");
|
||||||
|
|
||||||
|
if (path.isEmpty()) {
|
||||||
|
m_ui->debugTokenPath->setPath(QDir::homePath() + defaultFileName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QFileInfo fileInfo(path);
|
||||||
|
|
||||||
|
if (fileInfo.isDir())
|
||||||
|
m_ui->debugTokenPath->setPath(path + defaultFileName);
|
||||||
|
}
|
||||||
|
|
||||||
void BlackBerryDebugTokenRequestDialog::appendExtension()
|
void BlackBerryDebugTokenRequestDialog::appendExtension()
|
||||||
{
|
{
|
||||||
QString path = m_ui->debugTokenPath->path();
|
QString path = m_ui->debugTokenPath->path();
|
||||||
|
|
||||||
|
if (path.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
if (!path.endsWith(QLatin1String(".bar"))) {
|
if (!path.endsWith(QLatin1String(".bar"))) {
|
||||||
path += QLatin1String(".bar");
|
path += QLatin1String(".bar");
|
||||||
m_ui->debugTokenPath->setPath(path);
|
m_ui->debugTokenPath->setPath(path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BlackBerryDebugTokenRequestDialog::expandPath()
|
||||||
|
{
|
||||||
|
const QString path = m_ui->debugTokenPath->path();
|
||||||
|
|
||||||
|
if (path.isEmpty() || path.startsWith(QLatin1String("/")))
|
||||||
|
return;
|
||||||
|
|
||||||
|
const QFileInfo fileInfo(path);
|
||||||
|
|
||||||
|
m_ui->debugTokenPath->setPath(fileInfo.absoluteFilePath());
|
||||||
|
}
|
||||||
|
|
||||||
void BlackBerryDebugTokenRequestDialog::checkBoxChanged(int state)
|
void BlackBerryDebugTokenRequestDialog::checkBoxChanged(int state)
|
||||||
{
|
{
|
||||||
if (state == Qt::Checked) {
|
if (state == Qt::Checked) {
|
||||||
|
@@ -57,7 +57,9 @@ public:
|
|||||||
private slots:
|
private slots:
|
||||||
void validate();
|
void validate();
|
||||||
void requestDebugToken();
|
void requestDebugToken();
|
||||||
|
void setDefaultPath();
|
||||||
void appendExtension();
|
void appendExtension();
|
||||||
|
void expandPath();
|
||||||
void checkBoxChanged(int state);
|
void checkBoxChanged(int state);
|
||||||
void debugTokenArrived(int status);
|
void debugTokenArrived(int status);
|
||||||
|
|
||||||
|
@@ -2154,7 +2154,7 @@ TargetInformation Qt4ProFileNode::targetInformation(QtSupport::ProFileReader *re
|
|||||||
result.executable = QDir::cleanPath(destDir + QLatin1Char('/') + result.target);
|
result.executable = QDir::cleanPath(destDir + QLatin1Char('/') + result.target);
|
||||||
//qDebug() << "##### updateTarget sets:" << result.workingDir << result.executable;
|
//qDebug() << "##### updateTarget sets:" << result.workingDir << result.executable;
|
||||||
|
|
||||||
Utils::HostOsInfo::appendExecutableSuffix(result.executable);
|
result.executable = Utils::HostOsInfo::withExecutableSuffix(result.executable);
|
||||||
result.valid = true;
|
result.valid = true;
|
||||||
|
|
||||||
if (readerBP)
|
if (readerBP)
|
||||||
@@ -2234,7 +2234,7 @@ QString Qt4ProFileNode::buildDir(Qt4BuildConfiguration *bc) const
|
|||||||
bc = static_cast<Qt4BuildConfiguration *>(m_project->activeTarget()->activeBuildConfiguration());
|
bc = static_cast<Qt4BuildConfiguration *>(m_project->activeTarget()->activeBuildConfiguration());
|
||||||
if (!bc)
|
if (!bc)
|
||||||
return QString();
|
return QString();
|
||||||
return QDir(bc->buildDirectory()).absoluteFilePath(relativeDir);
|
return QDir::cleanPath(QDir(bc->buildDirectory()).absoluteFilePath(relativeDir));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Qt4ProFileNode::updateCodeModelSupportFromBuild()
|
void Qt4ProFileNode::updateCodeModelSupportFromBuild()
|
||||||
|
@@ -108,7 +108,7 @@ void TodoItemsProvider::createScanners()
|
|||||||
void TodoItemsProvider::setItemsListWithinStartupProject()
|
void TodoItemsProvider::setItemsListWithinStartupProject()
|
||||||
{
|
{
|
||||||
QHashIterator<QString, QList<TodoItem> > it(m_itemsHash);
|
QHashIterator<QString, QList<TodoItem> > it(m_itemsHash);
|
||||||
QStringList fileNames = m_startupProject->files(ProjectExplorer::Project::ExcludeGeneratedFiles);
|
QSet<QString> fileNames = QSet<QString>::fromList(m_startupProject->files(ProjectExplorer::Project::ExcludeGeneratedFiles));
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
it.next();
|
it.next();
|
||||||
if (fileNames.contains(it.key()))
|
if (fileNames.contains(it.key()))
|
||||||
|
@@ -176,9 +176,14 @@ private slots:
|
|||||||
void test_checksymbols_StaticUse();
|
void test_checksymbols_StaticUse();
|
||||||
void test_checksymbols_VariableHasTheSameNameAsEnumUse();
|
void test_checksymbols_VariableHasTheSameNameAsEnumUse();
|
||||||
void test_checksymbols_NestedClassOfEnclosingTemplateUse();
|
void test_checksymbols_NestedClassOfEnclosingTemplateUse();
|
||||||
|
void test_checksymbols_8902_staticFunctionHighlightingAsMember_localVariable();
|
||||||
|
void test_checksymbols_8902_staticFunctionHighlightingAsMember_functionArgument();
|
||||||
|
void test_checksymbols_8902_staticFunctionHighlightingAsMember_templateParameter();
|
||||||
|
void test_checksymbols_8902_staticFunctionHighlightingAsMember_struct();
|
||||||
|
|
||||||
void test_checksymbols_QTCREATORBUG8890_danglingPointer();
|
void test_checksymbols_QTCREATORBUG8890_danglingPointer();
|
||||||
void test_checksymbols_QTCREATORBUG8974_danglingPointer();
|
void test_checksymbols_QTCREATORBUG8974_danglingPointer();
|
||||||
|
void operatorAsteriskOfNestedClassOfTemplateClass_QTCREATORBUG9006();
|
||||||
};
|
};
|
||||||
|
|
||||||
void tst_CheckSymbols::test_checksymbols_TypeUse()
|
void tst_CheckSymbols::test_checksymbols_TypeUse()
|
||||||
@@ -445,6 +450,112 @@ void tst_CheckSymbols::test_checksymbols_NestedClassOfEnclosingTemplateUse()
|
|||||||
TestData::check(source, expectedUses);
|
TestData::check(source, expectedUses);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_CheckSymbols::test_checksymbols_8902_staticFunctionHighlightingAsMember_localVariable()
|
||||||
|
{
|
||||||
|
const QByteArray source =
|
||||||
|
"struct Foo\n"
|
||||||
|
"{\n"
|
||||||
|
" static int foo();\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"void bar()\n"
|
||||||
|
"{\n"
|
||||||
|
" int foo = Foo::foo();\n"
|
||||||
|
"}\n"
|
||||||
|
;
|
||||||
|
|
||||||
|
const QList<Use> expectedUses = QList<Use>()
|
||||||
|
<< Use(1, 8, 3, SemanticInfo::TypeUse)
|
||||||
|
<< Use(3, 16, 3, SemanticInfo::FunctionUse)
|
||||||
|
<< Use(6, 6, 3, SemanticInfo::FunctionUse)
|
||||||
|
<< Use(8, 9, 3, SemanticInfo::LocalUse)
|
||||||
|
<< Use(8, 15, 3, SemanticInfo::TypeUse)
|
||||||
|
<< Use(8, 20, 3, SemanticInfo::FunctionUse)
|
||||||
|
;
|
||||||
|
|
||||||
|
TestData::check(source, expectedUses);
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_CheckSymbols::test_checksymbols_8902_staticFunctionHighlightingAsMember_functionArgument()
|
||||||
|
{
|
||||||
|
const QByteArray source =
|
||||||
|
"struct Foo\n"
|
||||||
|
"{\n"
|
||||||
|
" static int foo();\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"void bar(int foo)\n"
|
||||||
|
"{\n"
|
||||||
|
" Foo::foo();\n"
|
||||||
|
"}\n"
|
||||||
|
;
|
||||||
|
|
||||||
|
const QList<Use> expectedUses = QList<Use>()
|
||||||
|
<< Use(1, 8, 3, SemanticInfo::TypeUse)
|
||||||
|
<< Use(3, 16, 3, SemanticInfo::FunctionUse)
|
||||||
|
<< Use(6, 6, 3, SemanticInfo::FunctionUse)
|
||||||
|
<< Use(6, 14, 3, SemanticInfo::LocalUse)
|
||||||
|
<< Use(8, 5, 3, SemanticInfo::TypeUse)
|
||||||
|
<< Use(8, 10, 3, SemanticInfo::FunctionUse)
|
||||||
|
;
|
||||||
|
|
||||||
|
TestData::check(source, expectedUses);
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_CheckSymbols::test_checksymbols_8902_staticFunctionHighlightingAsMember_templateParameter()
|
||||||
|
{
|
||||||
|
const QByteArray source =
|
||||||
|
"struct Foo\n"
|
||||||
|
"{\n"
|
||||||
|
" static int foo();\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"template <class foo>\n"
|
||||||
|
"void bar()\n"
|
||||||
|
"{\n"
|
||||||
|
" Foo::foo();\n"
|
||||||
|
"}\n"
|
||||||
|
;
|
||||||
|
|
||||||
|
const QList<Use> expectedUses = QList<Use>()
|
||||||
|
<< Use(1, 8, 3, SemanticInfo::TypeUse)
|
||||||
|
<< Use(3, 16, 3, SemanticInfo::FunctionUse)
|
||||||
|
<< Use(6, 17, 3, SemanticInfo::TypeUse)
|
||||||
|
<< Use(7, 6, 3, SemanticInfo::FunctionUse)
|
||||||
|
<< Use(9, 5, 3, SemanticInfo::TypeUse)
|
||||||
|
<< Use(9, 10, 3, SemanticInfo::FunctionUse)
|
||||||
|
;
|
||||||
|
|
||||||
|
TestData::check(source, expectedUses);
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_CheckSymbols::test_checksymbols_8902_staticFunctionHighlightingAsMember_struct()
|
||||||
|
{
|
||||||
|
const QByteArray source =
|
||||||
|
"struct Foo\n"
|
||||||
|
"{\n"
|
||||||
|
" static int foo();\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"struct foo {};\n"
|
||||||
|
"void bar()\n"
|
||||||
|
"{\n"
|
||||||
|
" Foo::foo();\n"
|
||||||
|
"}\n"
|
||||||
|
;
|
||||||
|
|
||||||
|
const QList<Use> expectedUses = QList<Use>()
|
||||||
|
<< Use(1, 8, 3, SemanticInfo::TypeUse)
|
||||||
|
<< Use(3, 16, 3, SemanticInfo::FunctionUse)
|
||||||
|
<< Use(6, 8, 3, SemanticInfo::TypeUse)
|
||||||
|
<< Use(7, 6, 3, SemanticInfo::FunctionUse)
|
||||||
|
<< Use(9, 5, 3, SemanticInfo::TypeUse)
|
||||||
|
<< Use(9, 10, 3, SemanticInfo::FunctionUse)
|
||||||
|
;
|
||||||
|
|
||||||
|
TestData::check(source, expectedUses);
|
||||||
|
}
|
||||||
|
|
||||||
void tst_CheckSymbols::test_checksymbols_QTCREATORBUG8890_danglingPointer()
|
void tst_CheckSymbols::test_checksymbols_QTCREATORBUG8890_danglingPointer()
|
||||||
{
|
{
|
||||||
const QByteArray source =
|
const QByteArray source =
|
||||||
@@ -1233,5 +1344,51 @@ void tst_CheckSymbols::test_checksymbols_QTCREATORBUG8974_danglingPointer()
|
|||||||
TestData::check(source, expectedUses);
|
TestData::check(source, expectedUses);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_CheckSymbols::operatorAsteriskOfNestedClassOfTemplateClass_QTCREATORBUG9006()
|
||||||
|
{
|
||||||
|
const QByteArray source =
|
||||||
|
"struct Foo { int foo; };\n"
|
||||||
|
"\n"
|
||||||
|
"template<class T>\n"
|
||||||
|
"struct Outer\n"
|
||||||
|
"{\n"
|
||||||
|
" struct Nested\n"
|
||||||
|
" {\n"
|
||||||
|
" const T &operator*() { return t; }\n"
|
||||||
|
" T t;\n"
|
||||||
|
" };\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"void bug()\n"
|
||||||
|
"{\n"
|
||||||
|
" Outer<Foo>::Nested nested;\n"
|
||||||
|
" (*nested).foo;\n"
|
||||||
|
"}\n"
|
||||||
|
;
|
||||||
|
|
||||||
|
const QList<Use> expectedUses = QList<Use>()
|
||||||
|
<< Use(1, 8, 3, SemanticInfo::TypeUse)
|
||||||
|
<< Use(1, 18, 3, SemanticInfo::FieldUse)
|
||||||
|
<< Use(3, 16, 1, SemanticInfo::TypeUse)
|
||||||
|
<< Use(4, 8, 5, SemanticInfo::TypeUse)
|
||||||
|
<< Use(6, 10, 6, SemanticInfo::TypeUse)
|
||||||
|
<< Use(8, 11, 1, SemanticInfo::TypeUse)
|
||||||
|
<< Use(8, 14, 8, SemanticInfo::FunctionUse)
|
||||||
|
<< Use(8, 35, 1, SemanticInfo::FieldUse)
|
||||||
|
<< Use(9, 5, 1, SemanticInfo::TypeUse)
|
||||||
|
<< Use(9, 7, 1, SemanticInfo::FieldUse)
|
||||||
|
<< Use(13, 6, 3, SemanticInfo::FunctionUse)
|
||||||
|
<< Use(15, 3, 5, SemanticInfo::TypeUse)
|
||||||
|
<< Use(15, 9, 3, SemanticInfo::TypeUse)
|
||||||
|
<< Use(15, 15, 6, SemanticInfo::TypeUse)
|
||||||
|
<< Use(15, 22, 6, SemanticInfo::LocalUse)
|
||||||
|
<< Use(16, 5, 6, SemanticInfo::LocalUse)
|
||||||
|
<< Use(16, 13, 3, SemanticInfo::FieldUse)
|
||||||
|
;
|
||||||
|
|
||||||
|
TestData::check(source, expectedUses);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
QTEST_APPLESS_MAIN(tst_CheckSymbols)
|
QTEST_APPLESS_MAIN(tst_CheckSymbols)
|
||||||
#include "tst_checksymbols.moc"
|
#include "tst_checksymbols.moc"
|
||||||
|
@@ -94,6 +94,8 @@ private Q_SLOTS:
|
|||||||
|
|
||||||
// templates
|
// templates
|
||||||
void instantiateTemplateWithNestedClass();
|
void instantiateTemplateWithNestedClass();
|
||||||
|
void operatorAsteriskOfNestedClassOfTemplateClass_QTCREATORBUG9006();
|
||||||
|
void operatorArrowOfNestedClassOfTemplateClass_QTCREATORBUG9005();
|
||||||
};
|
};
|
||||||
|
|
||||||
void tst_FindUsages::inlineMethod()
|
void tst_FindUsages::inlineMethod()
|
||||||
@@ -444,5 +446,94 @@ void tst_FindUsages::instantiateTemplateWithNestedClass()
|
|||||||
QCOMPARE(findUsages.usages().size(), 2);
|
QCOMPARE(findUsages.usages().size(), 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_FindUsages::operatorAsteriskOfNestedClassOfTemplateClass_QTCREATORBUG9006()
|
||||||
|
{
|
||||||
|
const QByteArray src = "\n"
|
||||||
|
"struct Foo { int foo; };\n"
|
||||||
|
"\n"
|
||||||
|
"template<class T>\n"
|
||||||
|
"struct Outer\n"
|
||||||
|
"{\n"
|
||||||
|
" struct Nested\n"
|
||||||
|
" {\n"
|
||||||
|
" const T &operator*() { return t; }\n"
|
||||||
|
" T t;\n"
|
||||||
|
" };\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"void bug()\n"
|
||||||
|
"{\n"
|
||||||
|
" Outer<Foo>::Nested nested;\n"
|
||||||
|
" (*nested).foo;\n"
|
||||||
|
"}\n"
|
||||||
|
;
|
||||||
|
|
||||||
|
Document::Ptr doc = Document::create("operatorAsteriskOfNestedClassOfTemplateClass_QTCREATORBUG9006");
|
||||||
|
doc->setUtf8Source(src);
|
||||||
|
doc->parse();
|
||||||
|
doc->check();
|
||||||
|
|
||||||
|
QVERIFY(doc->diagnosticMessages().isEmpty());
|
||||||
|
QCOMPARE(doc->globalSymbolCount(), 3U);
|
||||||
|
|
||||||
|
Snapshot snapshot;
|
||||||
|
snapshot.insert(doc);
|
||||||
|
|
||||||
|
Class *classFoo = doc->globalSymbolAt(0)->asClass();
|
||||||
|
QVERIFY(classFoo);
|
||||||
|
QCOMPARE(classFoo->memberCount(), 1U);
|
||||||
|
Declaration *fooDeclaration = classFoo->memberAt(0)->asDeclaration();
|
||||||
|
QVERIFY(fooDeclaration);
|
||||||
|
QCOMPARE(fooDeclaration->name()->identifier()->chars(), "foo");
|
||||||
|
|
||||||
|
FindUsages findUsages(src, doc, snapshot);
|
||||||
|
findUsages(fooDeclaration);
|
||||||
|
QCOMPARE(findUsages.usages().size(), 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_FindUsages::operatorArrowOfNestedClassOfTemplateClass_QTCREATORBUG9005()
|
||||||
|
{
|
||||||
|
const QByteArray src = "\n"
|
||||||
|
"struct Foo { int foo; };\n"
|
||||||
|
"\n"
|
||||||
|
"template<class T>\n"
|
||||||
|
"struct Outer\n"
|
||||||
|
"{\n"
|
||||||
|
" struct Nested\n"
|
||||||
|
" {\n"
|
||||||
|
" T *operator->() { return 0; }\n"
|
||||||
|
" };\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"void bug()\n"
|
||||||
|
"{\n"
|
||||||
|
" Outer<Foo>::Nested nested;\n"
|
||||||
|
" nested->foo;\n"
|
||||||
|
"}\n"
|
||||||
|
;
|
||||||
|
|
||||||
|
Document::Ptr doc = Document::create("operatorArrowOfNestedClassOfTemplateClass_QTCREATORBUG9005");
|
||||||
|
doc->setUtf8Source(src);
|
||||||
|
doc->parse();
|
||||||
|
doc->check();
|
||||||
|
|
||||||
|
QVERIFY(doc->diagnosticMessages().isEmpty());
|
||||||
|
QCOMPARE(doc->globalSymbolCount(), 3U);
|
||||||
|
|
||||||
|
Snapshot snapshot;
|
||||||
|
snapshot.insert(doc);
|
||||||
|
|
||||||
|
Class *classFoo = doc->globalSymbolAt(0)->asClass();
|
||||||
|
QVERIFY(classFoo);
|
||||||
|
QCOMPARE(classFoo->memberCount(), 1U);
|
||||||
|
Declaration *fooDeclaration = classFoo->memberAt(0)->asDeclaration();
|
||||||
|
QVERIFY(fooDeclaration);
|
||||||
|
QCOMPARE(fooDeclaration->name()->identifier()->chars(), "foo");
|
||||||
|
|
||||||
|
FindUsages findUsages(src, doc, snapshot);
|
||||||
|
findUsages(fooDeclaration);
|
||||||
|
QCOMPARE(findUsages.usages().size(), 2);
|
||||||
|
}
|
||||||
|
|
||||||
QTEST_APPLESS_MAIN(tst_FindUsages)
|
QTEST_APPLESS_MAIN(tst_FindUsages)
|
||||||
#include "tst_findusages.moc"
|
#include "tst_findusages.moc"
|
||||||
|
@@ -1,53 +1,37 @@
|
|||||||
# for easier re-usage (because Python hasn't an enum type)
|
import operator
|
||||||
class QtQuickConstants:
|
|
||||||
class Components:
|
|
||||||
BUILTIN = 1
|
|
||||||
MEEGO_HARMATTAN = 2
|
|
||||||
EXISTING_QML = 4
|
|
||||||
|
|
||||||
class Targets:
|
# for easier re-usage (because Python hasn't an enum type)
|
||||||
DESKTOP_474_GCC = 1
|
class Targets:
|
||||||
SIMULATOR = 2
|
DESKTOP_474_GCC = 1
|
||||||
MAEMO5 = 4
|
SIMULATOR = 2
|
||||||
HARMATTAN = 8
|
MAEMO5 = 4
|
||||||
EMBEDDED_LINUX = 16
|
HARMATTAN = 8
|
||||||
DESKTOP_474_MSVC2008 = 32
|
EMBEDDED_LINUX = 16
|
||||||
DESKTOP_501_DEFAULT = 64
|
DESKTOP_474_MSVC2008 = 32
|
||||||
|
DESKTOP_501_DEFAULT = 64
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def desktopTargetClasses():
|
def desktopTargetClasses():
|
||||||
desktopTargets = QtQuickConstants.Targets.DESKTOP_474_GCC \
|
desktopTargets = Targets.DESKTOP_474_GCC | Targets.DESKTOP_501_DEFAULT
|
||||||
| QtQuickConstants.Targets.DESKTOP_501_DEFAULT
|
|
||||||
if platform.system() in ('Windows', 'Microsoft'):
|
if platform.system() in ('Windows', 'Microsoft'):
|
||||||
desktopTargets |= QtQuickConstants.Targets.DESKTOP_474_MSVC2008
|
desktopTargets |= Targets.DESKTOP_474_MSVC2008
|
||||||
return desktopTargets
|
return desktopTargets
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def getStringForComponents(components):
|
|
||||||
if components==QtQuickConstants.Components.BUILTIN:
|
|
||||||
return "Built-in elements only (for all platforms)"
|
|
||||||
elif components==QtQuickConstants.Components.MEEGO_HARMATTAN:
|
|
||||||
return "Qt Quick Components for Meego/Harmattan"
|
|
||||||
elif components==QtQuickConstants.Components.EXISTING_QML:
|
|
||||||
return "Use an existing .qml file"
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def getStringForTarget(target):
|
def getStringForTarget(target):
|
||||||
if target==QtQuickConstants.Targets.DESKTOP_474_GCC:
|
if target == Targets.DESKTOP_474_GCC:
|
||||||
return "Desktop 474 GCC"
|
return "Desktop 474 GCC"
|
||||||
elif target==QtQuickConstants.Targets.MAEMO5:
|
elif target == Targets.MAEMO5:
|
||||||
return "Fremantle"
|
return "Fremantle"
|
||||||
elif target==QtQuickConstants.Targets.SIMULATOR:
|
elif target == Targets.SIMULATOR:
|
||||||
return "Qt Simulator"
|
return "Qt Simulator"
|
||||||
elif target==QtQuickConstants.Targets.HARMATTAN:
|
elif target == Targets.HARMATTAN:
|
||||||
return "Harmattan"
|
return "Harmattan"
|
||||||
elif target==QtQuickConstants.Targets.EMBEDDED_LINUX:
|
elif target == Targets.EMBEDDED_LINUX:
|
||||||
return "Embedded Linux"
|
return "Embedded Linux"
|
||||||
elif target==QtQuickConstants.Targets.DESKTOP_474_MSVC2008:
|
elif target == Targets.DESKTOP_474_MSVC2008:
|
||||||
return "Desktop 474 MSVC2008"
|
return "Desktop 474 MSVC2008"
|
||||||
elif target==QtQuickConstants.Targets.DESKTOP_501_DEFAULT:
|
elif target == Targets.DESKTOP_501_DEFAULT:
|
||||||
return "Desktop 501 default"
|
return "Desktop 501 default"
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
@@ -57,11 +41,22 @@ class QtQuickConstants:
|
|||||||
if not isinstance(targets, (tuple,list)):
|
if not isinstance(targets, (tuple,list)):
|
||||||
test.fatal("Wrong usage... This function handles only tuples or lists.")
|
test.fatal("Wrong usage... This function handles only tuples or lists.")
|
||||||
return None
|
return None
|
||||||
result = map(QtQuickConstants.getStringForTarget, targets)
|
result = map(Targets.getStringForTarget, targets)
|
||||||
if None in result:
|
if None in result:
|
||||||
test.fatal("You've passed at least one unknown target!")
|
test.fatal("You've passed at least one unknown target!")
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def intToArray(targets):
|
||||||
|
available = [Targets.DESKTOP_474_GCC, Targets.SIMULATOR, Targets.MAEMO5, Targets.HARMATTAN,
|
||||||
|
Targets.EMBEDDED_LINUX, Targets.DESKTOP_474_MSVC2008,
|
||||||
|
Targets.DESKTOP_501_DEFAULT]
|
||||||
|
return filter(lambda x: x & targets == x, available)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def arrayToInt(targetArr):
|
||||||
|
return reduce(operator.or_, targetArr, 0)
|
||||||
|
|
||||||
# this class holds some constants for easier usage inside the Projects view
|
# this class holds some constants for easier usage inside the Projects view
|
||||||
class ProjectSettings:
|
class ProjectSettings:
|
||||||
BUILD = 1
|
BUILD = 1
|
||||||
|
@@ -12,7 +12,7 @@ def __handleProcessExited__(object, exitCode):
|
|||||||
global processExited
|
global processExited
|
||||||
processExited = True
|
processExited = True
|
||||||
|
|
||||||
def openQmakeProject(projectPath, targets=QtQuickConstants.desktopTargetClasses(), fromWelcome=False):
|
def openQmakeProject(projectPath, targets=Targets.desktopTargetClasses(), fromWelcome=False):
|
||||||
cleanUpUserFiles(projectPath)
|
cleanUpUserFiles(projectPath)
|
||||||
if fromWelcome:
|
if fromWelcome:
|
||||||
mouseClick(waitForObject(":OpenProject_QStyleItem"), 5, 5, 0, Qt.LeftButton)
|
mouseClick(waitForObject(":OpenProject_QStyleItem"), 5, 5, 0, Qt.LeftButton)
|
||||||
@@ -112,7 +112,7 @@ def __createProjectSetNameAndPath__(path, projectName = None, checks = True):
|
|||||||
# param checks turns tests in the function on if set to True
|
# param checks turns tests in the function on if set to True
|
||||||
# param available a list holding the available targets
|
# param available a list holding the available targets
|
||||||
def __selectQtVersionDesktop__(checks, available=None):
|
def __selectQtVersionDesktop__(checks, available=None):
|
||||||
checkedTargets = __chooseTargets__(QtQuickConstants.desktopTargetClasses(), available)
|
checkedTargets = __chooseTargets__(Targets.desktopTargetClasses(), available)
|
||||||
if checks:
|
if checks:
|
||||||
cbObject = ("{type='QCheckBox' text='%s' unnamed='1' visible='1' "
|
cbObject = ("{type='QCheckBox' text='%s' unnamed='1' visible='1' "
|
||||||
"container={type='Utils::DetailsWidget' visible='1' unnamed='1'}}")
|
"container={type='Utils::DetailsWidget' visible='1' unnamed='1'}}")
|
||||||
@@ -204,7 +204,7 @@ def createProject_Qt_Console(path, projectName, checks = True):
|
|||||||
return checkedTargets
|
return checkedTargets
|
||||||
|
|
||||||
def createNewQtQuickApplication(workingDir, projectName = None, templateFile = None,
|
def createNewQtQuickApplication(workingDir, projectName = None, templateFile = None,
|
||||||
targets=QtQuickConstants.desktopTargetClasses(), qtQuickVersion=1,
|
targets=Targets.desktopTargetClasses(), qtQuickVersion=1,
|
||||||
fromWelcome=False):
|
fromWelcome=False):
|
||||||
if templateFile:
|
if templateFile:
|
||||||
available = __createProjectOrFileSelectType__(" Applications", "Qt Quick %d Application (from Existing QML File)"
|
available = __createProjectOrFileSelectType__(" Applications", "Qt Quick %d Application (from Existing QML File)"
|
||||||
@@ -240,7 +240,7 @@ def createNewQmlExtension(workingDir):
|
|||||||
if workingDir == None:
|
if workingDir == None:
|
||||||
workingDir = tempDir()
|
workingDir = tempDir()
|
||||||
__createProjectSetNameAndPath__(workingDir)
|
__createProjectSetNameAndPath__(workingDir)
|
||||||
checkedTargets = __chooseTargets__(QtQuickConstants.Targets.DESKTOP_474_GCC, available)
|
checkedTargets = __chooseTargets__(Targets.DESKTOP_474_GCC, available)
|
||||||
nextButton = waitForObject(":Next_QPushButton")
|
nextButton = waitForObject(":Next_QPushButton")
|
||||||
clickButton(nextButton)
|
clickButton(nextButton)
|
||||||
nameLineEd = waitForObject("{buddy={type='QLabel' text='Object Class-name:' unnamed='1' visible='1'} "
|
nameLineEd = waitForObject("{buddy={type='QLabel' text='Object Class-name:' unnamed='1' visible='1'} "
|
||||||
@@ -253,51 +253,39 @@ def createNewQmlExtension(workingDir):
|
|||||||
__createProjectHandleLastPage__()
|
__createProjectHandleLastPage__()
|
||||||
return checkedTargets
|
return checkedTargets
|
||||||
|
|
||||||
# parameter components can only be one of the Constants defined in QtQuickConstants.Components
|
# parameter target can be an OR'd value of Targets
|
||||||
def __chooseComponents__(components=QtQuickConstants.Components.BUILTIN):
|
|
||||||
rbComponentToChoose = waitForObject("{type='QRadioButton' text='%s' visible='1'}"
|
|
||||||
% QtQuickConstants.getStringForComponents(components))
|
|
||||||
if rbComponentToChoose.checked:
|
|
||||||
test.passes("Selected QRadioButton is '%s'" % QtQuickConstants.getStringForComponents(components))
|
|
||||||
else:
|
|
||||||
clickButton(rbComponentToChoose)
|
|
||||||
test.verify(rbComponentToChoose.checked, "Selected QRadioButton is '%s'"
|
|
||||||
% QtQuickConstants.getStringForComponents(components))
|
|
||||||
|
|
||||||
# parameter target can be an OR'd value of QtQuickConstants.Targets
|
|
||||||
# parameter availableTargets should be the result of __createProjectSelectType__()
|
# parameter availableTargets should be the result of __createProjectSelectType__()
|
||||||
# or use None as a fallback
|
# or use None as a fallback
|
||||||
def __chooseTargets__(targets=QtQuickConstants.Targets.DESKTOP_474_GCC, availableTargets=None,
|
def __chooseTargets__(targets=Targets.DESKTOP_474_GCC, availableTargets=None,
|
||||||
isMaddeDisabled=True):
|
isMaddeDisabled=True):
|
||||||
if availableTargets != None:
|
if availableTargets != None:
|
||||||
available = availableTargets
|
available = availableTargets
|
||||||
else:
|
else:
|
||||||
# following targets depend on the build environment - added for further/later tests
|
# following targets depend on the build environment - added for further/later tests
|
||||||
available = [QtQuickConstants.Targets.DESKTOP_474_GCC, QtQuickConstants.Targets.DESKTOP_501_DEFAULT,
|
available = [Targets.DESKTOP_474_GCC, Targets.DESKTOP_501_DEFAULT, Targets.MAEMO5,
|
||||||
QtQuickConstants.Targets.MAEMO5, QtQuickConstants.Targets.EMBEDDED_LINUX,
|
Targets.EMBEDDED_LINUX, Targets.SIMULATOR, Targets.HARMATTAN]
|
||||||
QtQuickConstants.Targets.SIMULATOR, QtQuickConstants.Targets.HARMATTAN]
|
|
||||||
if platform.system() in ('Windows', 'Microsoft'):
|
if platform.system() in ('Windows', 'Microsoft'):
|
||||||
available.remove(QtQuickConstants.Targets.EMBEDDED_LINUX)
|
available.remove(Targets.EMBEDDED_LINUX)
|
||||||
available.append(QtQuickConstants.Targets.DESKTOP_474_MSVC2008)
|
available.append(Targets.DESKTOP_474_MSVC2008)
|
||||||
if isMaddeDisabled:
|
if isMaddeDisabled:
|
||||||
for target in filter(lambda x: x in available,
|
for target in filter(lambda x: x in available,
|
||||||
(QtQuickConstants.Targets.MAEMO5, QtQuickConstants.Targets.HARMATTAN)):
|
(Targets.MAEMO5, Targets.HARMATTAN)):
|
||||||
available.remove(target)
|
available.remove(target)
|
||||||
checkedTargets = []
|
checkedTargets = []
|
||||||
for current in available:
|
for current in available:
|
||||||
mustCheck = targets & current == current
|
mustCheck = targets & current == current
|
||||||
try:
|
try:
|
||||||
ensureChecked("{type='QCheckBox' text='%s' visible='1'}" % QtQuickConstants.getStringForTarget(current),
|
ensureChecked("{type='QCheckBox' text='%s' visible='1'}" % Targets.getStringForTarget(current),
|
||||||
mustCheck, 3000)
|
mustCheck, 3000)
|
||||||
if (mustCheck):
|
if (mustCheck):
|
||||||
checkedTargets.append(current)
|
checkedTargets.append(current)
|
||||||
except LookupError:
|
except LookupError:
|
||||||
if mustCheck:
|
if mustCheck:
|
||||||
test.fail("Failed to check target '%s'." % QtQuickConstants.getStringForTarget(current))
|
test.fail("Failed to check target '%s'." % Targets.getStringForTarget(current))
|
||||||
else:
|
else:
|
||||||
# Simulator has been added without knowing whether configured or not - so skip warning here?
|
# Simulator has been added without knowing whether configured or not - so skip warning here?
|
||||||
if current != QtQuickConstants.Targets.SIMULATOR:
|
if current != Targets.Targets.SIMULATOR:
|
||||||
test.warning("Target '%s' is not set up correctly." % QtQuickConstants.getStringForTarget(current))
|
test.warning("Target '%s' is not set up correctly." % Targets.getStringForTarget(current))
|
||||||
return checkedTargets
|
return checkedTargets
|
||||||
|
|
||||||
# run and close an application
|
# run and close an application
|
||||||
@@ -453,7 +441,7 @@ def resetApplicationContextToCreator():
|
|||||||
# Simulator must be handled in a special way, because this depends on the
|
# Simulator must be handled in a special way, because this depends on the
|
||||||
# configured Qt versions and Toolchains and cannot be looked up the same way
|
# configured Qt versions and Toolchains and cannot be looked up the same way
|
||||||
# if you set getAsStrings to True this function returns a list of strings instead
|
# if you set getAsStrings to True this function returns a list of strings instead
|
||||||
# of the constants defined in QtQuickConstants.Targets
|
# of the constants defined in Targets
|
||||||
def __getSupportedPlatforms__(text, getAsStrings=False):
|
def __getSupportedPlatforms__(text, getAsStrings=False):
|
||||||
reqPattern = re.compile("requires qt (?P<version>\d+\.\d+(\.\d+)?)", re.IGNORECASE)
|
reqPattern = re.compile("requires qt (?P<version>\d+\.\d+(\.\d+)?)", re.IGNORECASE)
|
||||||
res = reqPattern.search(text)
|
res = reqPattern.search(text)
|
||||||
@@ -465,31 +453,30 @@ def __getSupportedPlatforms__(text, getAsStrings=False):
|
|||||||
supports = text[text.find('Supported Platforms'):].split(":")[1].strip().split(" ")
|
supports = text[text.find('Supported Platforms'):].split(":")[1].strip().split(" ")
|
||||||
result = []
|
result = []
|
||||||
if 'Desktop' in supports:
|
if 'Desktop' in supports:
|
||||||
result.append(QtQuickConstants.Targets.DESKTOP_474_GCC)
|
result.append(Targets.DESKTOP_474_GCC)
|
||||||
result.append(QtQuickConstants.Targets.DESKTOP_501_DEFAULT)
|
result.append(Targets.DESKTOP_501_DEFAULT)
|
||||||
if platform.system() in ("Linux", "Darwin"):
|
if platform.system() in ("Linux", "Darwin"):
|
||||||
result.append(QtQuickConstants.Targets.EMBEDDED_LINUX)
|
result.append(Targets.EMBEDDED_LINUX)
|
||||||
elif platform.system() in ('Windows', 'Microsoft'):
|
elif platform.system() in ('Windows', 'Microsoft'):
|
||||||
result.append(QtQuickConstants.Targets.DESKTOP_474_MSVC2008)
|
result.append(Targets.DESKTOP_474_MSVC2008)
|
||||||
if 'MeeGo/Harmattan' in supports:
|
if 'MeeGo/Harmattan' in supports:
|
||||||
result.append(QtQuickConstants.Targets.HARMATTAN)
|
result.append(Targets.HARMATTAN)
|
||||||
if 'Maemo/Fremantle' in supports:
|
if 'Maemo/Fremantle' in supports:
|
||||||
result.append(QtQuickConstants.Targets.MAEMO5)
|
result.append(Targets.MAEMO5)
|
||||||
if not re.search("custom Qt Creator plugin", text):
|
if not re.search("custom Qt Creator plugin", text):
|
||||||
result.append(QtQuickConstants.Targets.SIMULATOR)
|
result.append(Targets.SIMULATOR)
|
||||||
elif 'Platform independent' in text:
|
elif 'Platform independent' in text:
|
||||||
# MAEMO5 and HARMATTAN could be wrong here - depends on having Madde plugin enabled or not
|
# MAEMO5 and HARMATTAN could be wrong here - depends on having Madde plugin enabled or not
|
||||||
result = [QtQuickConstants.Targets.DESKTOP_474_GCC, QtQuickConstants.Targets.DESKTOP_501_DEFAULT,
|
result = [Targets.DESKTOP_474_GCC, Targets.DESKTOP_501_DEFAULT, Targets.MAEMO5,
|
||||||
QtQuickConstants.Targets.MAEMO5, QtQuickConstants.Targets.SIMULATOR,
|
Targets.SIMULATOR, Targets.HARMATTAN]
|
||||||
QtQuickConstants.Targets.HARMATTAN]
|
|
||||||
if platform.system() in ('Windows', 'Microsoft'):
|
if platform.system() in ('Windows', 'Microsoft'):
|
||||||
result.append(QtQuickConstants.Targets.DESKTOP_474_MSVC2008)
|
result.append(Targets.DESKTOP_474_MSVC2008)
|
||||||
else:
|
else:
|
||||||
test.warning("Returning None (__getSupportedPlatforms__())",
|
test.warning("Returning None (__getSupportedPlatforms__())",
|
||||||
"Parsed text: '%s'" % text)
|
"Parsed text: '%s'" % text)
|
||||||
return None, None
|
return None, None
|
||||||
if getAsStrings:
|
if getAsStrings:
|
||||||
result = QtQuickConstants.getTargetsAsStrings(result)
|
result = Targets.getTargetsAsStrings(result)
|
||||||
return result, version
|
return result, version
|
||||||
|
|
||||||
# copy example project (sourceExample is path to project) to temporary directory inside repository
|
# copy example project (sourceExample is path to project) to temporary directory inside repository
|
||||||
|
@@ -344,8 +344,7 @@ def getConfiguredKits(isMaddeDisabled=True):
|
|||||||
targetInfo = result[targetName]
|
targetInfo = result[targetName]
|
||||||
if targetInfo[0] == "Maemo":
|
if targetInfo[0] == "Maemo":
|
||||||
result.update({targetName:
|
result.update({targetName:
|
||||||
(QtQuickConstants.getStringForTarget(QtQuickConstants.Targets.MAEMO5),
|
(Targets.getStringForTarget(Targets.MAEMO5), targetInfo[1])})
|
||||||
targetInfo[1])})
|
|
||||||
test.log("Configured kits: %s" % str(result))
|
test.log("Configured kits: %s" % str(result))
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@@ -409,7 +408,7 @@ def checkDebuggingLibrary(kitIDs):
|
|||||||
# end of internal function for iterateQtVersions
|
# end of internal function for iterateQtVersions
|
||||||
kits, qtv = iterateKits(True, False, __getQtVersionForKit__)
|
kits, qtv = iterateKits(True, False, __getQtVersionForKit__)
|
||||||
qtVersionsOfKits = zip(kits, qtv)
|
qtVersionsOfKits = zip(kits, qtv)
|
||||||
wantedKits = QtQuickConstants.getTargetsAsStrings(kitIDs)
|
wantedKits = Targets.getTargetsAsStrings(kitIDs)
|
||||||
kitsQtV = dict([i for i in qtVersionsOfKits if i[0] in wantedKits])
|
kitsQtV = dict([i for i in qtVersionsOfKits if i[0] in wantedKits])
|
||||||
tv, builtAndFailedList = iterateQtVersions(False, True, __checkDebugLibsInternalFunc__, kitsQtV)
|
tv, builtAndFailedList = iterateQtVersions(False, True, __checkDebugLibsInternalFunc__, kitsQtV)
|
||||||
built = failed = 0
|
built = failed = 0
|
||||||
|
@@ -7,16 +7,14 @@ def main():
|
|||||||
startApplication("qtcreator" + SettingsPath)
|
startApplication("qtcreator" + SettingsPath)
|
||||||
if not startedWithoutPluginError():
|
if not startedWithoutPluginError():
|
||||||
return
|
return
|
||||||
targets = [QtQuickConstants.Targets.DESKTOP_474_GCC]
|
targets = Targets.desktopTargetClasses()
|
||||||
if platform.system() in ('Windows', 'Microsoft'):
|
if not checkDebuggingLibrary(Targets.intToArray(targets)):
|
||||||
targets.append(QtQuickConstants.Targets.DESKTOP_474_MSVC2008)
|
|
||||||
if not checkDebuggingLibrary(targets):
|
|
||||||
test.fatal("Error while checking debugging libraries - leaving this test.")
|
test.fatal("Error while checking debugging libraries - leaving this test.")
|
||||||
invokeMenuItem("File", "Exit")
|
invokeMenuItem("File", "Exit")
|
||||||
return
|
return
|
||||||
# using a temporary directory won't mess up a potentially existing
|
# using a temporary directory won't mess up a potentially existing
|
||||||
workingDir = tempDir()
|
workingDir = tempDir()
|
||||||
checkedTargets, projectName = createNewQtQuickApplication(workingDir)
|
checkedTargets, projectName = createNewQtQuickApplication(workingDir, targets=targets)
|
||||||
editor = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget")
|
editor = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget")
|
||||||
if placeCursorToLine(editor, "MouseArea.*", True):
|
if placeCursorToLine(editor, "MouseArea.*", True):
|
||||||
type(editor, '<Up>')
|
type(editor, '<Up>')
|
||||||
|
@@ -17,9 +17,9 @@ def main():
|
|||||||
startApplication("qtcreator" + SettingsPath)
|
startApplication("qtcreator" + SettingsPath)
|
||||||
if not startedWithoutPluginError():
|
if not startedWithoutPluginError():
|
||||||
return
|
return
|
||||||
suitableKits = QtQuickConstants.Targets.DESKTOP_474_GCC
|
suitableKits = Targets.DESKTOP_474_GCC
|
||||||
if platform.system() in ('Windows', 'Microsoft'):
|
if platform.system() in ('Windows', 'Microsoft'):
|
||||||
suitableKits |= QtQuickConstants.Targets.DESKTOP_474_MSVC2008
|
suitableKits |= Targets.DESKTOP_474_MSVC2008
|
||||||
checkedTargets = openQmakeProject(SpeedCrunchPath, suitableKits)
|
checkedTargets = openQmakeProject(SpeedCrunchPath, suitableKits)
|
||||||
waitForSignal("{type='CppTools::Internal::CppModelManager' unnamed='1'}", "sourceFilesRefreshed(QStringList)")
|
waitForSignal("{type='CppTools::Internal::CppModelManager' unnamed='1'}", "sourceFilesRefreshed(QStringList)")
|
||||||
|
|
||||||
|
@@ -38,8 +38,7 @@ def performTest(templateDir, qmlFile, isMaddeDisabled):
|
|||||||
comboBox = findObject("{name='comboBox' type='QComboBox' visible='1' "
|
comboBox = findObject("{name='comboBox' type='QComboBox' visible='1' "
|
||||||
"window=':New_Core::Internal::NewDialog'}")
|
"window=':New_Core::Internal::NewDialog'}")
|
||||||
targets = zip(*kits.values())[0]
|
targets = zip(*kits.values())[0]
|
||||||
maddeTargets = QtQuickConstants.getTargetsAsStrings([QtQuickConstants.Targets.MAEMO5,
|
maddeTargets = Targets.getTargetsAsStrings([Targets.MAEMO5, Targets.HARMATTAN])
|
||||||
QtQuickConstants.Targets.HARMATTAN])
|
|
||||||
maddeInTargets = len(set(targets) & set(maddeTargets)) > 0
|
maddeInTargets = len(set(targets) & set(maddeTargets)) > 0
|
||||||
test.compare(comboBox.enabled, maddeInTargets, "Verifying whether combox is enabled.")
|
test.compare(comboBox.enabled, maddeInTargets, "Verifying whether combox is enabled.")
|
||||||
test.compare(maddeInTargets, not isMaddeDisabled, "Verifying if kits are configured.")
|
test.compare(maddeInTargets, not isMaddeDisabled, "Verifying if kits are configured.")
|
||||||
|
@@ -7,7 +7,7 @@ def main():
|
|||||||
# using a temporary directory won't mess up a potentially existing
|
# using a temporary directory won't mess up a potentially existing
|
||||||
workingDir = tempDir()
|
workingDir = tempDir()
|
||||||
checkedTargets, projectName = createNewQtQuickApplication(workingDir,
|
checkedTargets, projectName = createNewQtQuickApplication(workingDir,
|
||||||
targets = QtQuickConstants.Targets.DESKTOP_474_GCC)
|
targets = Targets.DESKTOP_474_GCC)
|
||||||
test.log("Building project")
|
test.log("Building project")
|
||||||
result = modifyRunSettingsForHookInto(projectName, len(checkedTargets), 11223)
|
result = modifyRunSettingsForHookInto(projectName, len(checkedTargets), 11223)
|
||||||
invokeMenuItem("Build", "Build All")
|
invokeMenuItem("Build", "Build All")
|
||||||
|
@@ -12,7 +12,7 @@ def main():
|
|||||||
workingDir = tempDir()
|
workingDir = tempDir()
|
||||||
checkedTargets, projectName = createNewQtQuickApplication(workingDir, None,
|
checkedTargets, projectName = createNewQtQuickApplication(workingDir, None,
|
||||||
os.path.join(prepareTemplate(sourceExample), qmlFile),
|
os.path.join(prepareTemplate(sourceExample), qmlFile),
|
||||||
QtQuickConstants.Targets.DESKTOP_474_GCC)
|
Targets.DESKTOP_474_GCC)
|
||||||
test.log("Building project")
|
test.log("Building project")
|
||||||
result = modifyRunSettingsForHookInto(projectName, len(checkedTargets), 11223)
|
result = modifyRunSettingsForHookInto(projectName, len(checkedTargets), 11223)
|
||||||
invokeMenuItem("Build","Build All")
|
invokeMenuItem("Build","Build All")
|
||||||
|
Reference in New Issue
Block a user