Merge remote-tracking branch 'origin/4.2'

Change-Id: Ia346d86ad5fabe9d91454ea642cbeac5ec862699
This commit is contained in:
Eike Ziller
2016-10-27 12:10:03 +02:00
166 changed files with 1729 additions and 514 deletions

View File

@@ -15,6 +15,7 @@ macOS 10.8 or later
Prerequisites:
* Qt 5.6.0 or later
* Qt WebEngine module for QtWebEngine based help viewer
* On Windows:
* ActiveState Active Perl
* MinGW with g++ 4.8 or Visual Studio 2015 or later

52
dist/changes-4.2.0.md vendored
View File

@@ -65,12 +65,12 @@ C++ Support
* Added preview of images to tool tip on Qt resource URLs
* Added option to skip big files when indexing (QTCREATORBUG-16712)
* Added notification for parsing errors in headers
* Fixed `Move Definition to Class` for functions in template class and
template member functions (QTCREATORBUG-14354)
* Fixed issues with `Add Declaration`, `Add Definition`, and
`Move Definition Outside Class` for template functions
* Clang Code Model
* Added notification for parsing errors in headers
* Improved responsiveness of completion and highlighting
Debugging
@@ -91,7 +91,7 @@ QML Profiler
Qt Quick Designer
* Added completion expression editor
* Added completion to expression editor
* Added menu for editing `when` condition of states
* Added editor for managing C++ backend objects
* Added reformatting of `.ui.qml` files on save
@@ -106,9 +106,11 @@ Qt Quick Designer
Diff Viewer
* Added local diff for modified files in Qt Creator (`Diff` >
`Diff Current File`, `Diff` > `Diff All Modified Files`)
* Added local diff for modified files in Qt Creator (`Tools` > `Diff` >
`Diff Current File`, `Tools` > `Diff` > `Diff Open Files`)
(QTCREATORBUG-9732)
* Added option to diff files when they changed on disk
(QTCREATORBUG-1531)
* Fixed that reload prompt was shown when reverting change
Version Control Systems
@@ -140,3 +142,45 @@ Android
* Fixed handling of minimum required API level (QTCREATORBUG-16740)
Credits for these changes go to:
Aaron Barany
Alessandro Portale
Alexander Drozdov
Andre Hartmann
André Pönitz
Arnold Dumas
Christian Kandeler
Christian Stenger
Daniel Langner
Daniel Trevitz
David Schulz
Eike Ziller
Florian Apolloner
Francois Ferrand
Friedemann Kleint
Giuseppe D'Angelo
Jake Petroules
Jaroslaw Kobus
Jochen Becher
Konstantin Shtepa
Kudryavtsev Alexander
Leena Miettinen
Louai Al-Khanji
Marc Reilly
Marco Benelli
Marco Bubke
Mitch Curtis
Nazar Gerasymchuk
Nikita Baryshnikov
Nikolai Kosjar
Orgad Shaneh
Oswald Buddenhagen
Øystein Walle
Robert Löhning
Serhii Moroz
Takumi ASAKI
Tasuku Suzuki
Thomas Hartmann
Tim Jenssen
Tobias Hunger
Ulf Hermann
Vikas Pachdha

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@@ -417,6 +417,9 @@
\uicontrol Window > \uicontrol Views > \uicontrol {Reset to Default Layout}
to reset the views to their original sizes and positions.
To save space on the screen, select \uicontrol Window > \uicontrol Views >
\uicontrol {Automatically Hide View Titlebars}.
Once the program starts running under the control of the debugger, it
behaves and performs as usual. You can interrupt a running C++ program by
selecting \uicontrol Debug > \uicontrol Interrupt. The program is

View File

@@ -554,6 +554,12 @@
\row
\li M208
\li Error
\li This id might be ambiguous and is not supported in the \QMLD.
\li
\row
\li M209
\li Error
\li This type (type name) is not supported as a root element by \QMLD.
\li

View File

@@ -38,9 +38,13 @@
\title Keyboard Shortcuts
\QC provides various keyboard shortcuts to speed up your development
process.
process. In addition, you can specify your own keyboard shortcuts for some
functions that can be easily performed with a mouse, and therefore do not
appear in menus or have default keyboard shortcuts. For example, selecting
and deleting words or lines in an editor.
To view all keyboard shortcuts defined in \QC, and to change them, select
To view all functions available in \QC and the keyboard shortcuts defined
for them, select
\uicontrol {Tools > Options > Environment > Keyboard}. The shortcuts are listed by
category. To find a keyboard
shortcut in the list, enter a function name or shortcut in the \uicontrol Filter

View File

@@ -80,10 +80,16 @@
\uicontrol {Switch to}.
When you launch \QC, a list of existing sessions is displayed in the
\uicontrol Welcome mode.
\uicontrol Welcome mode. To open a session, select it or press
\key Ctrl+Alt+<number>, where \e <number> is the number of the session to
open (available for the first nine sessions).
\image qtcreator-welcome-session.png
To view more information about a session, select the down arrow icon that
appears when you move the mouse cursor over the session name. Select actions
to clone, rename, and delete sessions.
When you start \QC from the command line, you can give the name of
a session as argument and \QC will start with this session.

View File

@@ -82,8 +82,9 @@
\list 1
\li Select \uicontrol Tools > \uicontrol Options >
\uicontrol {Build & Run} > \uicontrol Compilers > \uicontrol Add
and select a compiler in the list.
\uicontrol {Build & Run} > \uicontrol Compilers > \uicontrol Add,
then select a compiler in the list, and then select \uicontrol C or
\uicontrol C++ to add a C or C++ compiler.
\image qtcreator-toolchains.png
@@ -124,7 +125,8 @@
\list 1
\li Select \uicontrol Tools > \uicontrol Options > \uicontrol {Build & Run} >
\uicontrol Compilers > \uicontrol Add > \uicontrol Custom.
\uicontrol Compilers > \uicontrol Add > \uicontrol Custom >
\uicontrol C or \uicontrol C++.
\li In the \uicontrol Name field, enter a name for the compiler.

View File

@@ -75,14 +75,36 @@
\list 1
\li Select \uicontrol File > \uicontrol{Open File or Project} and select the project
to open.
\li Select \uicontrol File > \uicontrol {Open File or Project}
(\key Ctrl+O or \key Cmd+O on \macos) and select the project to
open.
\li In the \uicontrol {Configure Project} tab, select kits for building and running your
project, and click \uicontrol {Configure Project}.
\endlist
You can use the following keyboard shortcuts to open projects, depending on
the mode you are currently in:
\list
\li In all modes, select \key Ctrl+O (\key Cmd+O on \macos) to open the
\uicontrol {Open File} dialog, where you can select a project file
to open a project.
\li In all modes, except the \uicontrol Help mode, select
\key Ctrl+Shift+O (\key Cmd+Shift+O on \macos) to open the
\uicontrol {Load Project} dialog, where you can select a project
file to open a project.
\li In the \uicontrol Welcome mode, \uicontrol Projects tab, select
\key Ctrl+Shift+number (\key Cmd+Shift+number on \macos), where
the number is the number of a project in the list of recently opened
projects.
\endlist
\QC parses all the source files in the project and performs a semantic
analysis to build up the information that it needs for functions such as
navigation and finding usages. A progress bar is displayed during parsing.

View File

@@ -111,6 +111,33 @@
(\uicontrol {Variables}) button in a field to select from a list of variables that
are available in a particular context.
The following syntax enables you to use environment variables as \QC
variables: %{Env:VARNAME}.
\QC uses pattern substitution when expanding variable names. To replace the
first match of \e pattern within \e variable with \e replacement, use:
\badcode
%{variable/pattern/replacement}
\endcode
To replace all matches of \e pattern within \e variable with \e replacement,
use:
\badcode
%{variable//pattern/replacement}
\endcode
The pattern can be a regular expression and the replacement can contain
backreferences. For example, if \c %{variable} is \c my123var, then
\c %{variable/(..)(\d+)/\2\1} is expanded to \c {123myvar}.
To use the default value if the variable is not set, use:
\badcode
%{variable:-default}
\endcode
\section1 Build Steps
The build system of \QC is built on qmake and make. In \uicontrol{Build Steps} you

View File

@@ -99,6 +99,8 @@
\li \l{Specifying Dependencies}{Dependencies}
\li \l{Parsing C++ Files}{Clang Code Model} (experimental)
\li \l{Using Clang Static Analyzer}{Clang Static Analyzer}
\li \l{To-Do Entries}{To-Do} (experimental)

View File

@@ -91,8 +91,8 @@
image is located. If you are not cross-compiling, leave this field
empty.
\li In the \uicontrol {Compiler} field, select the compiler required
to build the project. You can add compilers to the list
\li In the \uicontrol {Compiler} field, select the C or C++ compiler
used to build the project. You can add compilers to the list
if they are installed on the development PC, but were not detected
automatically. For more information, see \l{Adding Compilers}.

View File

@@ -55,6 +55,11 @@
Classes registered with \c qmlRegisterType() can be used as backend objects
in the \QMLD. For more information, see \l {Adding Connections}.
By default, \QC will look in the QML import path of Qt for QML modules.
If your applications adds additional import paths that \QC should use,
then you can specify those using \c{QML_IMPORT_PATH} in the \c{.pro} file of your
application.
Ideally, QML modules have a \c{plugins.qmltypes} file in the same directory
as the \c qmldir file. The \c qmltypes file contains a description of the
types exported by the module's plugins and is loaded by \QC when the
@@ -117,4 +122,9 @@
environment variable to check whether the plugin is currently being run
by an application or edited in the \uicontrol Design mode.
If you want to use a different module in \QMLD than in your actual
application for example to mockup C++ items, then you can use \c{QML_DESIGNER_IMPORT_PATH}
in the \c{.pro} file.
Modules in the import paths defined in \c{QML_DESIGNER_IMPORT_PATH} will be used only in \QMLD.
*/

View File

@@ -1275,6 +1275,12 @@ def qdump__QStaticStringData(d, value):
d.putValue(d.hexencode(data), 'utf16')
d.putPlainChildren(value)
def qdump__QTypedArrayData(d, value):
if value.type[0].name == 'unsigned short':
qdump__QStringData(d, value)
else:
qdump__QArrayData(d, value)
def qdump__QStringData(d, value):
(ref, size, alloc, pad, offset) = value.split('III@p')
elided, shown = d.computeLimit(size, d.displayStringLimit)

View File

@@ -56,7 +56,7 @@ def qdump__std____1__complex(d, value):
def qdump__std__deque(d, value):
if d.isQnxTarget():
if d.isQnxTarget() or d.isMsvcTarget():
qdump__std__deque__QNX(d, value)
return
@@ -117,15 +117,20 @@ def qdump__std__deque__QNX(d, value):
else:
bufsize = 1
myoff = value['_Myoff']
mysize = value['_Mysize']
mapsize = value['_Mapsize']
try:
val = value['_Mypair']['_Myval2']
except:
val = value
myoff = val['_Myoff'].integer()
mysize = val['_Mysize'].integer()
mapsize = val['_Mapsize'].integer()
d.check(0 <= mapsize and mapsize <= 1000 * 1000 * 1000)
d.putItemCount(mysize)
if d.isExpanded():
with Children(d, mysize, maxNumChild=2000, childType=innerType):
map = value['_Map']
map = val['_Map']
for i in d.childRange():
block = myoff / bufsize
offset = myoff - (block * bufsize)
@@ -139,7 +144,7 @@ def qdump__std____debug__deque(d, value):
def qdump__std__list(d, value):
if d.isQnxTarget():
if d.isQnxTarget() or d.isMsvcTarget():
qdump__std__list__QNX(d, value)
return
@@ -167,7 +172,7 @@ def qdump__std__list(d, value):
def qdump__std__list__QNX(d, value):
node = value["_Myhead"]
size = value["_Mysize"]
size = value["_Mysize"].integer()
d.putItemCount(size, 1000)
@@ -607,13 +612,22 @@ def qdump__std____1__wstring(d, value):
def qdump__std__shared_ptr(d, value):
if d.isMsvcTarget:
i = value["_Ptr"]
else:
i = value["_M_ptr"]
if i.integer() == 0:
d.putValue("(null)")
d.putNumChild(0)
return
with Children(d):
short = d.putSubItem("data", i)
if d.isMsvcTarget:
refcount = value["_Rep"]
d.putIntItem("usecount", refcount["_Uses"])
d.putIntItem("weakcount", refcount["_Weaks"])
else:
refcount = value["_M_refcount"]["_M_pi"]
d.putIntItem("usecount", refcount["_M_use_count"])
d.putIntItem("weakcount", refcount["_M_weak_count"])
@@ -767,6 +781,9 @@ def qform__std__valarray():
return arrayForms()
def qdump__std__valarray(d, value):
if d.isMsvcTarget():
(data, size) = value.split('pp')
else:
(size, data) = value.split('pp')
d.putItemCount(size)
d.putPlotData(data, size, value.type[0])

View File

@@ -685,10 +685,30 @@ void NodeInstanceServer::setupDummysForContext(QQmlContext *context)
}
}
static bool isTypeAvailable(const MockupTypeContainer &mockupType, QQmlEngine *engine)
{
QString qmlSource;
qmlSource.append("import " +
mockupType.importUri()
+ " "
+ QString::number(mockupType.majorVersion())
+ "." + QString::number(mockupType.minorVersion())
+ "\n");
qmlSource.append(QString::fromUtf8(mockupType.typeName()) + "{\n}\n");
QQmlComponent component(engine);
component.setData(qmlSource.toUtf8(), QUrl());
return !component.isError();
}
void NodeInstanceServer::setupMockupTypes(const QVector<MockupTypeContainer> &container)
{
for (const MockupTypeContainer &mockupType : container) {
if (!isTypeAvailable(mockupType, engine()))
#if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0))
QQuickDesignerSupportMetaInfo::registerMockupObject(mockupType.importUri().toUtf8(),
mockupType.majorVersion(),
mockupType.minorVersion(),

View File

@@ -17,7 +17,7 @@
{ "key": "CN", "value": "%{JS: Cpp.className('%{Class}')}" },
{ "key": "Base", "value": "%{JS: ( '%{BaseCB}' === '' ) ? '%{BaseEdit}' : '%{BaseCB}'}" },
{ "key": "isQObject", "value": "%{JS: [ 'QObject', 'QWidget', 'QMainWindow', 'QDeclarativeItem', 'QQuickItem'].indexOf('%{Base}') >= 0 }" },
{ "key": "GUARD", "value": "%{JS: Cpp.classToHeaderGuard('%{Class}', '%{JS: Util.preferredSuffix('text/x-c++hdr')}')}" },
{ "key": "GUARD", "value": "%{JS: Cpp.headerGuard('%{HdrFileName}')}" },
{ "key": "SharedDataInit", "value": "%{JS: ('%{IncludeQSharedData}') ? 'data(new %{CN}Data)' : '' }" }
],

View File

@@ -10,3 +10,14 @@ CONFIG -= app_bundle
TEMPLATE = app
SOURCES += %{MainCppName}
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

View File

@@ -11,6 +11,17 @@ RESOURCES += qml.qrc
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin

View File

@@ -10,6 +10,20 @@ RESOURCES += qml.qrc
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =
# Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH =
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin

View File

@@ -9,6 +9,20 @@ RESOURCES += qml.qrc
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =
# Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH =
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin

View File

@@ -15,6 +15,20 @@ RESOURCES += qml.qrc
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =
# Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH =
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin

View File

@@ -244,7 +244,3 @@ IconOverlayPri=:/qtsupport/images/dark_qt_project.png
IconOverlayPro=:/qtsupport/images/dark_qt_project.png
StandardPixmapFileIcon=:/core/images/dark_fileicon.png
StandardPixmapDirIcon=:/core/images/dark_foldericon.png
BuildStepDisable=:/projectexplorer/images/lightdisabledbuildstep.png
BuildStepRemove=:/core/images/lightclose.png
BuildStepMoveDown=:/core/images/lightarrowdown.png
BuildStepMoveUp=:/core/images/lightarrowup.png

View File

@@ -215,7 +215,7 @@ QIcon Icons::iconForType(IconType type)
}
case NamespaceIconType: {
const static QIcon icon(Icon({
{QLatin1String(":/codemodel/images/namespace.png"), Theme::IconsCodeModelKeywordColor}
{QLatin1String(":/utils/images/namespace.png"), Theme::IconsCodeModelKeywordColor}
}, Icon::Tint).icon());
return icon;
}

View File

@@ -8,8 +8,6 @@
<file>images/keyword@2x.png</file>
<file>images/macro.png</file>
<file>images/macro@2x.png</file>
<file>images/namespace.png</file>
<file>images/namespace@2x.png</file>
<file>images/signal.png</file>
<file>images/signal@2x.png</file>
<file>images/slot.png</file>

View File

@@ -489,6 +489,42 @@ private:
bool _seenNonDeclarationStatement;
};
class IdsThatShouldNotBeUsedInDesigner : public QStringList
{
public:
IdsThatShouldNotBeUsedInDesigner() : QStringList({ "top",
"bottom",
"left",
"right",
"width",
"height",
"x",
"y",
"opacity",
"parent",
"item",
"flow",
"color",
"margin",
"padding",
"border",
"font",
"text",
"source",
"state",
"visible",
"focus",
"data",
"clip",
"layer",
"scale",
"enabled",
"anchors"})
{
}
};
class VisualAspectsPropertyBlackList : public QStringList
{
public:
@@ -563,6 +599,7 @@ public:
} // end of anonymous namespace
Q_GLOBAL_STATIC(IdsThatShouldNotBeUsedInDesigner, idsThatShouldNotBeUsedInDesigner)
Q_GLOBAL_STATIC(VisualAspectsPropertyBlackList, visualAspectsPropertyBlackList)
Q_GLOBAL_STATIC(UnsupportedTypesByVisualDesigner, unsupportedTypesByVisualDesigner)
Q_GLOBAL_STATIC(UnsupportedRootObjectTypesByVisualDesigner, unsupportedRootObjectTypesByVisualDesigner)
@@ -634,6 +671,7 @@ void Check::enableQmlDesignerChecks()
enableMessage(WarnReferenceToParentItemNotSupportedByVisualDesigner);
enableMessage(WarnAboutQtQuick1InsteadQtQuick2);
enableMessage(ErrUnsupportedRootTypeInVisualDesigner);
enableMessage(ErrInvalidIdeInVisualDesigner);
//## triggers too often ## check.enableMessage(StaticAnalysis::WarnUndefinedValueForVisualDesigner);
}
@@ -645,6 +683,7 @@ void Check::disableQmlDesignerChecks()
disableMessage(WarnUndefinedValueForVisualDesigner);
disableMessage(WarnStatesOnlyInRootItemForVisualDesigner);
disableMessage(ErrUnsupportedRootTypeInVisualDesigner);
disableMessage(ErrInvalidIdeInVisualDesigner);
}
void Check::enableQmlDesignerUiFileChecks()
@@ -927,6 +966,10 @@ bool Check::visit(UiScriptBinding *ast)
return false;
}
if (idsThatShouldNotBeUsedInDesigner->contains(id)) {
addMessage(ErrInvalidIdeInVisualDesigner, loc);
}
if (m_idStack.top().contains(id)) {
addMessage(ErrDuplicateId, loc);
return false;

View File

@@ -271,6 +271,7 @@ QrcParserPrivate::QrcParserPrivate(QrcParser *)
bool QrcParserPrivate::parseFile(const QString &path)
{
QDir baseDir(QFileInfo(path).path());
QFile file(path);
if (!file.open(QIODevice::ReadOnly)) {
m_errorMessages.append(file.errorString());
@@ -304,9 +305,8 @@ bool QrcParserPrivate::parseFile(const QString &path)
QDomElement felt = relt.firstChildElement(QLatin1String("file"));
for (; !felt.isNull(); felt = felt.nextSiblingElement(QLatin1String("file"))) {
const QString fileName = felt.text();
QTC_CHECK(!QDir::isAbsolutePath(fileName));
const QString alias = felt.attribute(QLatin1String("alias"));
QString filePath = QFileInfo(path).path() + QLatin1Char('/') + fileName;
QString filePath = baseDir.absoluteFilePath(fileName);
QString accessPath;
if (!alias.isEmpty())
accessPath = language + prefix + alias;

View File

@@ -220,6 +220,8 @@ StaticAnalysisMessages::StaticAnalysisMessages()
"and might not show up in Qt Quick Designer as expected."));
newMsg(WarnStatesOnlyInRootItemForVisualDesigner, Warning,
tr("Qt Quick Designer only supports states in the root item."));
newMsg(ErrInvalidIdeInVisualDesigner, Error,
tr("This id might be ambiguous and is not supported in the Qt Quick Designer."));
newMsg(WarnAboutQtQuick1InsteadQtQuick2, Warning,
tr("Using Qt Quick 1 code model instead of Qt Quick 2."));
newMsg(ErrUnsupportedRootTypeInVisualDesigner, Error,

View File

@@ -97,6 +97,7 @@ enum Type
WarnUndefinedValueForVisualDesigner = 206,
WarnStatesOnlyInRootItemForVisualDesigner = 207,
ErrUnsupportedRootTypeInVisualDesigner = 208,
ErrInvalidIdeInVisualDesigner = 209,
ErrUnsupportedRootTypeInQmlUi = 220,
ErrUnsupportedTypeInQmlUi = 221,
ErrFunctionsNotSupportedInQmlUi = 222,

View File

@@ -202,14 +202,22 @@ static std::string findModule(CIDebugSymbols *syms,
}
// Try to find a JS execution context passed as parameter in a complete stack dump (kp)
static ULONG64 jsExecutionContextFromStackTrace(const std::wstring &stack)
static ULONG64 jsExecutionEngineFromStackTrace(const std::wstring &stack)
{
// Search for "QV4::ExecutionContext * - varying variable names - 0x...[,)]"
const wchar_t needle[] = L"struct QV4::ExecutionContext * "; // .. varying variable names .. 0x...
const std::string::size_type varPos = stack.find(needle);
if (varPos == std::string::npos)
// Search for "QV4::ExecutionEngine * - varying variable names - 0x...[,)]"
const wchar_t needle[] = L"struct QV4::ExecutionEngine * "; // Qt 5.7 onwards
std::string::size_type varEnd = std::string::npos;
std::string::size_type varPos = stack.find(needle);
if (varPos != std::string::npos) {
varEnd = varPos + sizeof(needle) / sizeof(wchar_t) - 1;
} else {
const wchar_t needle56[] = L"struct QV4::ExecutionContext * "; // up to Qt 5.6
varPos = stack.find(needle56);
if (varPos != std::string::npos)
varEnd = varPos + sizeof(needle56) / sizeof(wchar_t) - 1;
}
if (varEnd == std::string::npos)
return 0;
const std::string::size_type varEnd = varPos + sizeof(needle) / sizeof(wchar_t) - 1;
std::string::size_type numPos = stack.find(L"0x", varEnd);
if (numPos == std::string::npos || numPos > (varEnd + 20))
return 0;
@@ -227,9 +235,9 @@ static ULONG64 jsExecutionContextFromStackTrace(const std::wstring &stack)
return str.fail() ? 0 : result;
}
// Try to find address of jsExecutionContext by looking at the
// Try to find address of jsExecutionEngine by looking at the
// stack trace in case QML is loaded.
ULONG64 ExtensionContext::jsExecutionContext(ExtensionCommandContext &exc,
ULONG64 ExtensionContext::jsExecutionEngine(ExtensionCommandContext &exc,
std::string *errorMessage)
{
@@ -241,10 +249,10 @@ ULONG64 ExtensionContext::jsExecutionContext(ExtensionCommandContext &exc,
*errorMessage = "QML not loaded";
return 0;
}
// Retrieve full stack (costly) and try to find a JS execution context passed as parameter
// Retrieve top frames of stack and try to find a JS execution engine passed as parameter
startRecordingOutput();
StateNotificationBlocker blocker(this);
const HRESULT hr = m_control->Execute(DEBUG_OUTCTL_ALL_CLIENTS, "kp", DEBUG_EXECUTE_ECHO);
const HRESULT hr = m_control->Execute(DEBUG_OUTCTL_ALL_CLIENTS, "kp 15", DEBUG_EXECUTE_ECHO);
if (FAILED(hr)) {
stopRecordingOutput();
*errorMessage = msgDebugEngineComFailed("Execute", hr);
@@ -255,9 +263,9 @@ ULONG64 ExtensionContext::jsExecutionContext(ExtensionCommandContext &exc,
*errorMessage = "Unable to obtain stack (output redirection in place?)";
return 0;
}
const ULONG64 result = jsExecutionContextFromStackTrace(fullStackTrace);
const ULONG64 result = jsExecutionEngineFromStackTrace(fullStackTrace);
if (!result)
*errorMessage = "JS ExecutionContext address not found in stack";
*errorMessage = "JS ExecutionEngine address not found in stack";
return result;
}

View File

@@ -115,7 +115,7 @@ public:
const Parameters &parameters() const { return m_parameters; }
Parameters &parameters() { return m_parameters; }
ULONG64 jsExecutionContext(ExtensionCommandContext &exc, std::string *errorMessage);
ULONG64 jsExecutionEngine(ExtensionCommandContext &exc, std::string *errorMessage);
bool stateNotification() const { return m_stateNotification; }
void setStateNotification(bool s) { m_stateNotification = s; }

View File

@@ -1091,7 +1091,7 @@ extern "C" HRESULT CALLBACK qmlstack(CIDebugClient *client, PCSTR argsIn)
int token = 0;
bool humanReadable = false;
ULONG64 jsExecutionContext = 0;
ULONG64 jsExecutionEngine = 0;
std::string stackDump;
do {
@@ -1101,16 +1101,16 @@ extern "C" HRESULT CALLBACK qmlstack(CIDebugClient *client, PCSTR argsIn)
tokens.pop_front();
}
if (!tokens.empty()) {
if (!integerFromString(tokens.front(), &jsExecutionContext)) {
if (!integerFromString(tokens.front(), &jsExecutionEngine)) {
errorMessage = "Invalid address " + tokens.front();
break;
}
tokens.pop_front();
}
ExtensionCommandContext exc(client);
if (!jsExecutionContext) { // Try to find execution context unless it was given.
jsExecutionContext = ExtensionContext::instance().jsExecutionContext(exc, &errorMessage);
if (!jsExecutionContext)
if (!jsExecutionEngine) { // Try to find execution engine unless it was given.
jsExecutionEngine = ExtensionContext::instance().jsExecutionEngine(exc, &errorMessage);
if (!jsExecutionEngine)
break;
}
// call function to get stack trace. Call with exceptions handled right from
@@ -1118,7 +1118,7 @@ extern "C" HRESULT CALLBACK qmlstack(CIDebugClient *client, PCSTR argsIn)
std::ostringstream callStr;
const QtInfo &qtInfo = QtInfo::get(SymbolGroupValueContext(exc.dataSpaces(), exc.symbols()));
callStr << qtInfo.prependQtModule("qt_v4StackTrace(", QtInfo::Qml) << std::showbase << std::hex
<< jsExecutionContext << std::dec << std::noshowbase << ')';
<< jsExecutionEngine << std::dec << std::noshowbase << ')';
std::wstring wOutput;
if (!ExtensionContext::instance().call(callStr.str(), ExtensionContext::CallWithExceptionsHandled, &wOutput, &errorMessage))
break;

View File

@@ -66,7 +66,7 @@
\code
void MyClass::otherObjectUpdated()
{
if (updateGuard.isLocked)
if (updateGuard.isLocked())
return;
// we didn't trigger the update
@@ -75,7 +75,7 @@
}
\endcode
The GuardLock unlocks the Guard in it's destructor.
The GuardLocker unlocks the Guard in its destructor.
The Guard object is recursive, you may declare many GuardLocker
objects for the same Guard instance and the Guard will be locked

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 B

View File

Before

Width:  |  Height:  |  Size: 130 B

After

Width:  |  Height:  |  Size: 130 B

View File

Before

Width:  |  Height:  |  Size: 169 B

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 B

View File

@@ -318,11 +318,7 @@ public:
IconOverlayPrf,
IconOverlayPro,
StandardPixmapFileIcon,
StandardPixmapDirIcon,
BuildStepDisable,
BuildStepRemove,
BuildStepMoveDown,
BuildStepMoveUp
StandardPixmapDirIcon
};
enum Flag {

View File

@@ -31,7 +31,6 @@
<file>images/notloaded@2x.png</file>
<file>images/ok.png</file>
<file>images/ok@2x.png</file>
<file>images/clean_pane_small.png</file>
<file>images/clean_pane_small@2x.png</file>
<file>images/compile_error_taskbar.png</file>
@@ -161,5 +160,13 @@
<file>images/bookmark@2x.png</file>
<file>images/snapshot.png</file>
<file>images/snapshot@2x.png</file>
<file>images/zoomin_overlay.png</file>
<file>images/zoomin_overlay@2x.png</file>
<file>images/zoomout_overlay.png</file>
<file>images/zoomout_overlay@2x.png</file>
<file>images/fittoview.png</file>
<file>images/fittoview@2x.png</file>
<file>images/namespace.png</file>
<file>images/namespace@2x.png</file>
</qresource>
</RCC>

View File

@@ -48,6 +48,14 @@ const Icon ZOOM({
{QLatin1String(":/utils/images/zoom.png"), Theme::PanelTextColorMid}}, Icon::Tint);
const Icon ZOOM_TOOLBAR({
{QLatin1String(":/utils/images/zoom.png"), Theme::IconsBaseColor}});
const Icon ZOOMIN_TOOLBAR({
{QLatin1String(":/utils/images/zoom.png"), Theme::IconsBaseColor},
{QLatin1String(":/utils/images/zoomin_overlay.png"), Theme::IconsBaseColor}});
const Icon ZOOMOUT_TOOLBAR({
{QLatin1String(":/utils/images/zoom.png"), Theme::IconsBaseColor},
{QLatin1String(":/utils/images/zoomout_overlay.png"), Theme::IconsBaseColor}});
const Icon FITTOVIEW_TOOLBAR({
{QLatin1String(":/utils/images/fittoview.png"), Theme::IconsBaseColor}});
const Icon OK({
{QLatin1String(":/utils/images/ok.png"), Theme::IconsRunToolBarColor}}, Icon::Tint);
const Icon NOTLOADED({

View File

@@ -41,6 +41,9 @@ QTCREATOR_UTILS_EXPORT extern const Icon PREV;
QTCREATOR_UTILS_EXPORT extern const Icon PREV_TOOLBAR;
QTCREATOR_UTILS_EXPORT extern const Icon ZOOM;
QTCREATOR_UTILS_EXPORT extern const Icon ZOOM_TOOLBAR;
QTCREATOR_UTILS_EXPORT extern const Icon ZOOMIN_TOOLBAR;
QTCREATOR_UTILS_EXPORT extern const Icon ZOOMOUT_TOOLBAR;
QTCREATOR_UTILS_EXPORT extern const Icon FITTOVIEW_TOOLBAR;
QTCREATOR_UTILS_EXPORT extern const Icon OK;
QTCREATOR_UTILS_EXPORT extern const Icon NOTLOADED;
QTCREATOR_UTILS_EXPORT extern const Icon BROKEN;

View File

@@ -102,7 +102,8 @@ HEADERS += \
quick/quicktestvisitors.h \
quick/quicktestframework.h \
testframeworkmanager.h \
testrunconfiguration.h
testrunconfiguration.h \
itestsettingspage.h
RESOURCES += \
autotest.qrc

View File

@@ -72,6 +72,7 @@ QtcPlugin {
"itestparser.h",
"itestframework.h",
"iframeworksettings.h",
"itestsettingspage.h",
"testframeworkmanager.cpp",
"testframeworkmanager.h",
"testrunconfiguration.h"

View File

@@ -42,7 +42,7 @@ const char AUTOTEST_SETTINGS_CATEGORY[] = "ZY.Tests";
const char AUTOTEST_SETTINGS_TR[] = QT_TRANSLATE_NOOP("AutoTest", "Test Settings");
const char FRAMEWORK_PREFIX[] = "AutoTest.Framework.";
const char SETTINGSPAGE_PREFIX[] = "A.AutoTest.";
const char SETTINGSGROUP[] = "Autotest";
} // namespace Constants
} // namespace Autotest

View File

@@ -95,6 +95,7 @@ void AutotestPlugin::initializeMenuEntries()
{
ActionContainer *menu = ActionManager::createMenu(Constants::MENU_ID);
menu->menu()->setTitle(tr("&Tests"));
menu->setOnAllDisabledBehavior(ActionContainer::Show);
QAction *action = new QAction(tr("Run &All Tests"), this);
Command *command = ActionManager::registerAction(action, Constants::ACTION_RUN_ALL_ID);

View File

@@ -61,9 +61,9 @@ IFrameworkSettings *GTestFramework::createFrameworkSettings() const
return new GTestSettings;
}
Core::IOptionsPage *GTestFramework::createSettingsPage(QSharedPointer<IFrameworkSettings> settings) const
ITestSettingsPage *GTestFramework::createSettingsPage(QSharedPointer<IFrameworkSettings> settings) const
{
return new GTestSettingsPage(settings);
return new GTestSettingsPage(settings, this);
}
bool GTestFramework::hasFrameworkSettings() const

View File

@@ -37,7 +37,7 @@ public:
const char *name() const override;
unsigned priority() const override;
IFrameworkSettings *createFrameworkSettings() const override;
Core::IOptionsPage *createSettingsPage(QSharedPointer<IFrameworkSettings> settings) const override;
ITestSettingsPage *createSettingsPage(QSharedPointer<IFrameworkSettings> settings) const override;
bool hasFrameworkSettings() const override;
protected:
ITestParser *createTestParser() const override;

View File

@@ -65,18 +65,14 @@ GTestSettings GTestSettingsWidget::settings() const
return result;
}
GTestSettingsPage::GTestSettingsPage(QSharedPointer<IFrameworkSettings> settings)
: m_settings(qSharedPointerCast<GTestSettings>(settings)), m_widget(0)
GTestSettingsPage::GTestSettingsPage(QSharedPointer<IFrameworkSettings> settings,
const ITestFramework *framework)
: ITestSettingsPage(framework),
m_settings(qSharedPointerCast<GTestSettings>(settings)),
m_widget(0)
{
setId("A.AutoTest.10.GTest"); // FIXME
setDisplayName(QCoreApplication::translate("GTestFramework",
GTest::Constants::FRAMEWORK_SETTINGS_CATEGORY));
setCategory(Constants::AUTOTEST_SETTINGS_CATEGORY);
setDisplayCategory(QCoreApplication::translate("AutoTest", Constants::AUTOTEST_SETTINGS_TR));
}
GTestSettingsPage::~GTestSettingsPage()
{
}
QWidget *GTestSettingsPage::widget()

View File

@@ -27,7 +27,7 @@
#include "ui_gtestsettingspage.h"
#include <coreplugin/dialogs/ioptionspage.h>
#include "../itestsettingspage.h"
#include <QPointer>
@@ -50,12 +50,11 @@ private:
Ui::GTestSettingsPage m_ui;
};
class GTestSettingsPage : public Core::IOptionsPage
class GTestSettingsPage : public ITestSettingsPage
{
Q_OBJECT
public:
explicit GTestSettingsPage(QSharedPointer<IFrameworkSettings> settings);
~GTestSettingsPage();
GTestSettingsPage(QSharedPointer<IFrameworkSettings> settings, const ITestFramework *framework);
QWidget *widget() override;
void apply() override;

View File

@@ -28,12 +28,11 @@
#include "testtreeitem.h"
#include "itestparser.h"
namespace Core { class IOptionsPage; }
namespace Autotest {
namespace Internal {
class IFrameworkSettings;
class ITestSettingsPage;
class ITestFramework
{
@@ -49,7 +48,7 @@ public:
virtual unsigned priority() const = 0; // should this be modifyable?
virtual bool hasFrameworkSettings() const { return false; }
virtual IFrameworkSettings *createFrameworkSettings() const { return 0; }
virtual Core::IOptionsPage *createSettingsPage(QSharedPointer<IFrameworkSettings> settings) const
virtual ITestSettingsPage *createSettingsPage(QSharedPointer<IFrameworkSettings> settings) const
{
Q_UNUSED(settings);
return 0;

View File

@@ -25,30 +25,46 @@
#pragma once
namespace QbsProjectManager {
namespace Constants {
#include "autotestconstants.h"
#include "itestframework.h"
// Toolchain related settings:
const char QBS_TARGETOS[] = "qbs.targetOS";
const char QBS_SYSROOT[] = "qbs.sysroot";
const char QBS_ARCHITECTURE[] = "qbs.architecture";
const char QBS_TOOLCHAIN[] = "qbs.toolchain";
const char CPP_TOOLCHAINPATH[] = "cpp.toolchainInstallPath";
const char CPP_TOOLCHAINPREFIX[] = "cpp.toolchainPrefix";
const char CPP_COMPILERNAME[] = "cpp.compilerName";
const char CPP_CXXCOMPILERNAME[] = "cpp.cxxCompilerName";
const char CPP_PLATFORMCOMMONCOMPILERFLAGS[] = "cpp.platformCommonCompilerFlags";
const char CPP_PLATFORMLINKERFLAGS[] = "cpp.platformLinkerFlags";
const char CPP_PLATFORMPATH[] = "cpp.platformPath";
const char CPP_XCODESDKNAME[] = "cpp.xcodeSdkName";
const char CPP_XCODESDKVERSION[] = "cpp.xcodeSdkVersion";
#include <coreplugin/dialogs/ioptionspage.h>
// Settings page
const char QBS_SETTINGS_CATEGORY[] = "YM.qbs";
const char QBS_SETTINGS_TR_CATEGORY[] = QT_TRANSLATE_NOOP("QbsProjectManager", "Qbs");
const char QBS_SETTINGS_CATEGORY_ICON[] = ":/projectexplorer/images/build.png";
namespace Autotest {
namespace Internal {
const char QBS_PROPERTIES_KEY_FOR_KITS[] = "QbsProjectManager.qbs-properties";
class IFrameworkSettings;
} // namespace Constants
} // namespace QbsProjectManager
class ITestSettingsPage : public Core::IOptionsPage
{
public:
explicit ITestSettingsPage(const ITestFramework *framework)
{
setId(Core::Id(Constants::SETTINGSPAGE_PREFIX).withSuffix(
QString("%1.%2").arg(framework->priority()).arg(QLatin1String(framework->name()))));
setCategory(Constants::AUTOTEST_SETTINGS_CATEGORY);
setDisplayCategory(QCoreApplication::translate("AutoTest",
Constants::AUTOTEST_SETTINGS_TR));
}
virtual ~ITestSettingsPage() {}
private:
void setId(Core::Id id)
{
Core::IOptionsPage::setId(id);
}
void setCategory(Core::Id category)
{
Core::IOptionsPage::setCategory(category);
}
void setDisplayCategory(const QString &displayCategory)
{
Core::IOptionsPage::setDisplayCategory(displayCategory);
}
};
} // namespace Internal
} // namespace Autotest

View File

@@ -51,9 +51,9 @@ IFrameworkSettings *QtTestFramework::createFrameworkSettings() const
return new QtTestSettings;
}
Core::IOptionsPage *QtTestFramework::createSettingsPage(QSharedPointer<IFrameworkSettings> settings) const
ITestSettingsPage *QtTestFramework::createSettingsPage(QSharedPointer<IFrameworkSettings> settings) const
{
return new QtTestSettingsPage(settings);
return new QtTestSettingsPage(settings, this);
}
bool QtTestFramework::hasFrameworkSettings() const

View File

@@ -37,7 +37,7 @@ public:
const char *name() const override;
unsigned priority() const override;
IFrameworkSettings *createFrameworkSettings() const override;
Core::IOptionsPage *createSettingsPage(QSharedPointer<IFrameworkSettings> settings) const override;
ITestSettingsPage *createSettingsPage(QSharedPointer<IFrameworkSettings> settings) const override;
bool hasFrameworkSettings() const override;
protected:

View File

@@ -86,18 +86,14 @@ QtTestSettings QtTestSettingsWidget::settings() const
return result;
}
QtTestSettingsPage::QtTestSettingsPage(QSharedPointer<IFrameworkSettings> settings)
: m_settings(qSharedPointerCast<QtTestSettings>(settings)), m_widget(0)
QtTestSettingsPage::QtTestSettingsPage(QSharedPointer<IFrameworkSettings> settings,
const ITestFramework *framework)
: ITestSettingsPage(framework),
m_settings(qSharedPointerCast<QtTestSettings>(settings)),
m_widget(0)
{
setId("A.AutoTest.1.QtTest"); // FIXME
setDisplayName(QCoreApplication::translate("QtTestFramework",
QtTest::Constants::FRAMEWORK_SETTINGS_CATEGORY));
setCategory(Constants::AUTOTEST_SETTINGS_CATEGORY);
setDisplayCategory(QCoreApplication::translate("AutoTest", Constants::AUTOTEST_SETTINGS_TR));
}
QtTestSettingsPage::~QtTestSettingsPage()
{
}
QWidget *QtTestSettingsPage::widget()

View File

@@ -27,7 +27,7 @@
#include "ui_qttestsettingspage.h"
#include <coreplugin/dialogs/ioptionspage.h>
#include "../itestsettingspage.h"
#include <QPointer>
@@ -50,12 +50,11 @@ private:
Ui::QtTestSettingsPage m_ui;
};
class QtTestSettingsPage : public Core::IOptionsPage
class QtTestSettingsPage : public ITestSettingsPage
{
Q_OBJECT
public:
explicit QtTestSettingsPage(QSharedPointer<IFrameworkSettings> settings);
~QtTestSettingsPage();
QtTestSettingsPage(QSharedPointer<IFrameworkSettings> settings, const ITestFramework *framework);
QWidget *widget() override;
void apply() override;

View File

@@ -45,7 +45,6 @@
#include <QFuture>
#include <QFutureInterface>
#include <QLoggingCategory>
#include <QTimer>
static Q_LOGGING_CATEGORY(LOG, "qtc.autotest.testcodeparser")
@@ -54,13 +53,7 @@ namespace Internal {
TestCodeParser::TestCodeParser(TestTreeModel *parent)
: QObject(parent),
m_model(parent),
m_codeModelParsing(false),
m_fullUpdatePostponed(false),
m_partialUpdatePostponed(false),
m_dirty(false),
m_singleShotScheduled(false),
m_parserState(Disabled)
m_model(parent)
{
// connect to ProgressManager to postpone test parsing when CppModelManager is parsing
auto progressManager = qobject_cast<Core::ProgressManager *>(Core::ProgressManager::instance());
@@ -77,6 +70,8 @@ TestCodeParser::TestCodeParser(TestTreeModel *parent)
emit testParseResultReady(m_futureWatcher.resultAt(index));
});
connect(this, &TestCodeParser::parsingFinished, this, &TestCodeParser::releaseParserInternals);
m_reparseTimer.setSingleShot(true);
connect(&m_reparseTimer, &QTimer::timeout, this, &TestCodeParser::parsePostponedFiles);
}
TestCodeParser::~TestCodeParser()
@@ -111,6 +106,7 @@ void TestCodeParser::setState(State state)
} else if (m_partialUpdatePostponed) {
m_partialUpdatePostponed = false;
qCDebug(LOG) << "calling scanForTests with postponed files (setState)";
if (!m_reparseTimer.isActive())
scanForTests(m_postponedFiles.toList());
}
}
@@ -267,6 +263,30 @@ bool TestCodeParser::postponed(const QStringList &fileList)
{
switch (m_parserState) {
case Idle:
if (fileList.size() == 1) {
if (m_reparseTimerTimedOut)
return false;
switch (m_postponedFiles.size()) {
case 0:
m_postponedFiles.insert(fileList.first());
m_reparseTimer.setInterval(1000);
m_reparseTimer.start();
return true;
case 1:
if (m_postponedFiles.contains(fileList.first())) {
m_reparseTimer.start();
return true;
}
// intentional fall-through
default:
m_postponedFiles.insert(fileList.first());
m_reparseTimer.stop();
m_reparseTimer.setInterval(0);
m_reparseTimerTimedOut = false;
m_reparseTimer.start();
return true;
}
}
return false;
case PartialParse:
case FullParse:
@@ -313,6 +333,8 @@ void TestCodeParser::scanForTests(const QStringList &fileList)
if (postponed(fileList))
return;
m_reparseTimer.stop();
m_reparseTimerTimedOut = false;
m_postponedFiles.clear();
bool isFullParse = fileList.isEmpty();
QStringList list;
@@ -436,6 +458,7 @@ void TestCodeParser::onPartialParsingFinished()
} else if (m_partialUpdatePostponed) {
m_partialUpdatePostponed = false;
qCDebug(LOG) << "calling scanForTests with postponed files (onPartialParsingFinished)";
if (!m_reparseTimer.isActive())
scanForTests(m_postponedFiles.toList());
} else {
m_dirty |= m_codeModelParsing;
@@ -454,6 +477,12 @@ void TestCodeParser::onPartialParsingFinished()
}
}
void TestCodeParser::parsePostponedFiles()
{
m_reparseTimerTimedOut = true;
scanForTests(m_postponedFiles.toList());
}
void TestCodeParser::releaseParserInternals()
{
for (ITestParser *parser : m_testCodeParsers)

View File

@@ -32,6 +32,7 @@
#include <QObject>
#include <QMap>
#include <QFutureWatcher>
#include <QTimer>
namespace Core {
class Id;
@@ -89,19 +90,22 @@ private:
void onAllTasksFinished(Core::Id type);
void onFinished();
void onPartialParsingFinished();
void parsePostponedFiles();
void releaseParserInternals();
TestTreeModel *m_model;
bool m_codeModelParsing;
bool m_fullUpdatePostponed;
bool m_partialUpdatePostponed;
bool m_dirty;
bool m_singleShotScheduled;
bool m_codeModelParsing = false;
bool m_fullUpdatePostponed = false;
bool m_partialUpdatePostponed = false;
bool m_dirty = false;
bool m_singleShotScheduled = false;
bool m_reparseTimerTimedOut = false;
QSet<QString> m_postponedFiles;
State m_parserState;
State m_parserState = Disabled;
QFutureWatcher<TestParseResultPtr> m_futureWatcher;
QVector<ITestParser *> m_testCodeParsers; // ptrs are still owned by TestFrameworkManager
QTimer m_reparseTimer;
};
} // namespace Internal

View File

@@ -29,12 +29,12 @@
#include "iframeworksettings.h"
#include "itestframework.h"
#include "itestparser.h"
#include "itestsettingspage.h"
#include "testrunner.h"
#include "testsettings.h"
#include "testtreeitem.h"
#include "testtreemodel.h"
#include <coreplugin/dialogs/ioptionspage.h>
#include <utils/algorithm.h>
#include <utils/qtcassert.h>

View File

@@ -130,7 +130,7 @@ void TestResultDelegate::paint(QPainter *painter, const QStyleOptionViewItem &op
}
painter->setClipRect(opt.rect);
painter->setPen(opt.palette.midlight().color());
painter->setPen(opt.palette.mid().color());
painter->drawLine(0, opt.rect.bottom(), opt.rect.right(), opt.rect.bottom());
painter->restore();
}

View File

@@ -208,8 +208,6 @@ void TestResultsPane::addTestResult(const TestResultPtr &result)
m_atEnd = scrollBar ? scrollBar->value() == scrollBar->maximum() : true;
m_model->addTestResult(result, m_expandCollapse->isChecked());
if (!m_treeView->isVisible())
popup(Core::IOutputPane::NoModeSwitch);
setIconBadgeNumber(m_model->resultTypeCount(Result::Fail)
+ m_model->resultTypeCount(Result::UnexpectedPass));
flash();
@@ -498,6 +496,8 @@ void TestResultsPane::onTestRunFinished()
m_model->removeCurrentTestMessage();
disconnect(m_treeView->verticalScrollBar(), &QScrollBar::rangeChanged,
this, &TestResultsPane::onScrollBarRangeChanged);
if (!m_treeView->isVisible())
popup(Core::IOutputPane::NoModeSwitch);
}
void TestResultsPane::onScrollBarRangeChanged(int, int max)

View File

@@ -47,3 +47,6 @@ HEADERS += baremetalplugin.h \
openocdgdbserverprovider.h \
defaultgdbserverprovider.h \
stlinkutilgdbserverprovider.h
RESOURCES += \
baremetal.qrc

View File

@@ -13,6 +13,7 @@ QtcPlugin {
Depends { name: "QtSupport" }
files: [
"baremetal.qrc",
"baremetalconstants.h",
"baremetalcustomrunconfiguration.cpp", "baremetalcustomrunconfiguration.h",
"baremetaldevice.cpp", "baremetaldevice.h",

View File

@@ -0,0 +1,8 @@
<RCC>
<qresource prefix="/baremetal">
<file>images/baremetaldevice.png</file>
<file>images/baremetaldevice@2x.png</file>
<file>images/baremetaldevicesmall.png</file>
<file>images/baremetaldevicesmall@2x.png</file>
</qresource>
</RCC>

View File

@@ -33,6 +33,7 @@
#include <coreplugin/id.h>
#include <ssh/sshconnection.h>
#include <utils/icon.h>
#include <utils/qtcassert.h>
#include <QCoreApplication>
@@ -152,16 +153,28 @@ DeviceProcess *BareMetalDevice::createProcess(QObject *parent) const
return new GdbServerProviderProcess(sharedFromThis(), parent);
}
static const QList<Utils::Icon> &bareMetalDeviceIcon()
{
static const QList<Utils::Icon> icon = {
Utils::Icon({{":/baremetal/images/baremetaldevicesmall.png",
Utils::Theme::PanelTextColorDark}}, Utils::Icon::Tint),
Utils::Icon({{":/baremetal/images/baremetaldevice.png",
Utils::Theme::IconsBaseColor}})};
return icon;
}
BareMetalDevice::BareMetalDevice(const QString &name, Core::Id type, MachineType machineType, Origin origin, Core::Id id)
: IDevice(type, origin, machineType, id)
{
setDisplayName(name);
setDeviceIcon(bareMetalDeviceIcon());
}
BareMetalDevice::BareMetalDevice(const BareMetalDevice &other)
: IDevice(other)
{
setGdbServerProviderId(other.gdbServerProviderId());
setDeviceIcon(bareMetalDeviceIcon());
}
} //namespace Internal

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 B

View File

@@ -190,7 +190,7 @@ private:
const QString text = QString::fromLatin1(
"<table cellspacing='0' cellpadding='0'>"
" <tr>"
" <td>%1: </td>"
" <td>%1:&nbsp;</td>"
" <td width='100%'>%2</td>"
" </tr>"
"</table>")

View File

@@ -42,6 +42,7 @@
#include <QMenu>
#include <QPlainTextEdit>
#include <QPointer>
#include <QSortFilterProxyModel>
#include <QTextEdit>
#include <QTimer>
#include <QTreeView>
@@ -257,7 +258,10 @@ VariableChooserPrivate::VariableChooserPrivate(VariableChooser *parent)
m_variableTree = new VariableTreeView(q, this);
m_variableDescription = new QLabel(q);
m_variableTree->setModel(&m_model);
auto sorter = new QSortFilterProxyModel(this);
sorter->setSourceModel(&m_model);
sorter->sort(0);
m_variableTree->setModel(sorter);
m_variableDescription->setText(m_defaultDescription);
m_variableDescription->setMinimumSize(QSize(0, 60));
m_variableDescription->setAlignment(Qt::AlignLeft|Qt::AlignTop);

View File

@@ -107,9 +107,9 @@ void ImageViewer::ctor()
{QLatin1String(":/utils/images/desktopdevicesmall.png"), Utils::Theme::IconsBaseColor}});
d->ui_toolbar.toolButtonBackground->setIcon(backgroundIcon.icon());
d->ui_toolbar.toolButtonOutline->setIcon(Utils::Icons::BOUNDING_RECT.icon());
d->ui_toolbar.toolButtonZoomIn->setIcon(Utils::Icons::PLUS_TOOLBAR.icon());
d->ui_toolbar.toolButtonZoomOut->setIcon(Utils::Icons::MINUS.icon());
d->ui_toolbar.toolButtonFitToScreen->setIcon(Utils::Icons::ZOOM_TOOLBAR.icon());
d->ui_toolbar.toolButtonZoomIn->setIcon(Utils::Icons::ZOOMIN_TOOLBAR.icon());
d->ui_toolbar.toolButtonZoomOut->setIcon(Utils::Icons::ZOOMOUT_TOOLBAR.icon());
d->ui_toolbar.toolButtonFitToScreen->setIcon(Utils::Icons::FITTOVIEW_TOOLBAR.icon());
d->ui_toolbar.toolButtonOriginalSize->setIcon(Utils::Icons::EYE_OPEN_TOOLBAR.icon());
// icons update - try to use system theme
updateButtonIconByTheme(d->ui_toolbar.toolButtonZoomIn, QLatin1String("zoom-in"));

View File

@@ -280,7 +280,7 @@ class TargetItem : public TypedTreeItem<TreeItem, TargetGroupItem>
Q_DECLARE_TR_FUNCTIONS(TargetSettingsPanelWidget)
public:
enum { DefaultPage = 1 }; // Run page.
enum { DefaultPage = 0 }; // Build page.
TargetItem(Project *project, Id kitId)
: m_project(project), m_kitId(kitId)
@@ -802,7 +802,7 @@ void TargetGroupItemPrivate::handleAddedKit(Kit *kit)
void TargetItem::updateSubItems()
{
if (children().isEmpty() && isEnabled())
m_currentChild = 1; // We will add children below. Use 'Run' item by default.
m_currentChild = DefaultPage; // We will add children below.
removeChildren();
if (isEnabled()) {
appendChild(new BuildOrRunItem(m_project, m_kitId, BuildOrRunItem::BuildPage));

View File

@@ -24,7 +24,7 @@
****************************************************************************/
#include "defaultpropertyprovider.h"
#include "qbsconstants.h"
#include "qbsprojectmanagerconstants.h"
#include <coreplugin/messagemanager.h>
#include <projectexplorer/abi.h>

View File

@@ -62,6 +62,42 @@ static const char QBS_CLEAN_INSTALL_ROOT[] = "Qbs.CleanInstallRoot";
namespace QbsProjectManager {
namespace Internal {
class QbsBuildStepConfigWidget : public ProjectExplorer::BuildStepConfigWidget
{
Q_OBJECT
public:
QbsBuildStepConfigWidget(QbsBuildStep *step);
~QbsBuildStepConfigWidget();
QString summaryText() const;
QString displayName() const;
private:
void updateState();
void updateQmlDebuggingOption();
void updatePropertyEdit(const QVariantMap &data);
void changeBuildVariant(int);
void changeShowCommandLines(bool show);
void changeKeepGoing(bool kg);
void changeJobCount(int count);
void changeInstall(bool install);
void changeCleanInstallRoot(bool clean);
void changeForceProbes(bool forceProbes);
void applyCachedProperties();
// QML debugging:
void linkQmlDebuggingLibraryChecked(bool checked);
bool validateProperties(Utils::FancyLineEdit *edit, QString *errorMessage);
Ui::QbsBuildStepConfigWidget *m_ui;
QList<QPair<QString, QString> > m_propertyCache;
QbsBuildStep *m_step;
QString m_summary;
bool m_ignoreChange;
};
// --------------------------------------------------------------------
// QbsBuildStep:
// --------------------------------------------------------------------
@@ -752,3 +788,5 @@ ProjectExplorer::BuildStep *QbsBuildStepFactory::clone(ProjectExplorer::BuildSte
} // namespace Internal
} // namespace QbsProjectManager
#include "qbsbuildstep.moc"

View File

@@ -125,44 +125,6 @@ private:
friend class QbsBuildStepConfigWidget;
};
namespace Ui { class QbsBuildStepConfigWidget; }
class QbsBuildStepConfigWidget : public ProjectExplorer::BuildStepConfigWidget
{
Q_OBJECT
public:
QbsBuildStepConfigWidget(QbsBuildStep *step);
~QbsBuildStepConfigWidget();
QString summaryText() const;
QString displayName() const;
private:
void updateState();
void updateQmlDebuggingOption();
void updatePropertyEdit(const QVariantMap &data);
void changeBuildVariant(int);
void changeShowCommandLines(bool show);
void changeKeepGoing(bool kg);
void changeJobCount(int count);
void changeInstall(bool install);
void changeCleanInstallRoot(bool clean);
void changeForceProbes(bool forceProbes);
void applyCachedProperties();
// QML debugging:
void linkQmlDebuggingLibraryChecked(bool checked);
bool validateProperties(Utils::FancyLineEdit *edit, QString *errorMessage);
Ui::QbsBuildStepConfigWidget *m_ui;
QList<QPair<QString, QString> > m_propertyCache;
QbsBuildStep *m_step;
QString m_summary;
bool m_ignoreChange;
};
class QbsBuildStepFactory : public ProjectExplorer::IBuildStepFactory
{
Q_OBJECT

View File

@@ -26,7 +26,7 @@
#include "qbsinfopage.h"
#include "ui_qbsinfowidget.h"
#include "qbsconstants.h"
#include "qbsprojectmanagerconstants.h"
#include <qbs.h>

View File

@@ -27,8 +27,8 @@
#include "ui_qbsprofilessettingswidget.h"
#include "customqbspropertiesdialog.h"
#include "qbsconstants.h"
#include "qbsprojectmanager.h"
#include "qbsprojectmanagerconstants.h"
#include "qbsprojectmanagersettings.h"
#include <coreplugin/icore.h>

View File

@@ -41,8 +41,7 @@ HEADERS = \
qbsprojectmanagerplugin.h \
qbsprojectmanagersettings.h \
qbsprojectparser.h \
qbsrunconfiguration.h \
qbsconstants.h
qbsrunconfiguration.h
SOURCES = \
customqbspropertiesdialog.cpp \

View File

@@ -75,7 +75,6 @@ QtcPlugin {
"qbscleanstep.cpp",
"qbscleanstep.h",
"qbscleanstepconfigwidget.ui",
"qbsconstants.h",
"qbsdeployconfigurationfactory.cpp",
"qbsdeployconfigurationfactory.h",
"qbsinfopage.cpp",

View File

@@ -65,6 +65,28 @@ const char QBS_FORCE_PROBES_KEY[] = "qbspm.forceProbes";
static const char QBS_GROUP_ICON[] = ":/qbsprojectmanager/images/groups.png";
static const char QBS_PRODUCT_OVERLAY_ICON[] = ":/qbsprojectmanager/images/productgear.png";
// Toolchain related settings:
const char QBS_TARGETOS[] = "qbs.targetOS";
const char QBS_SYSROOT[] = "qbs.sysroot";
const char QBS_ARCHITECTURE[] = "qbs.architecture";
const char QBS_TOOLCHAIN[] = "qbs.toolchain";
const char CPP_TOOLCHAINPATH[] = "cpp.toolchainInstallPath";
const char CPP_TOOLCHAINPREFIX[] = "cpp.toolchainPrefix";
const char CPP_COMPILERNAME[] = "cpp.compilerName";
const char CPP_CXXCOMPILERNAME[] = "cpp.cxxCompilerName";
const char CPP_PLATFORMCOMMONCOMPILERFLAGS[] = "cpp.platformCommonCompilerFlags";
const char CPP_PLATFORMLINKERFLAGS[] = "cpp.platformLinkerFlags";
const char CPP_PLATFORMPATH[] = "cpp.platformPath";
const char CPP_XCODESDKNAME[] = "cpp.xcodeSdkName";
const char CPP_XCODESDKVERSION[] = "cpp.xcodeSdkVersion";
// Settings page
const char QBS_SETTINGS_CATEGORY[] = "YM.qbs";
const char QBS_SETTINGS_TR_CATEGORY[] = QT_TRANSLATE_NOOP("QbsProjectManager", "Qbs");
const char QBS_SETTINGS_CATEGORY_ICON[] = ":/projectexplorer/images/build.png";
const char QBS_PROPERTIES_KEY_FOR_KITS[] = "QbsProjectManager.qbs-properties";
const char QBS_PROFILING_ENV[] = "QTC_QBS_PROFILING";
} // namespace Constants

View File

@@ -622,20 +622,14 @@ QStringList QmakePriFileNode::fullVPaths(const QStringList &baseVPaths, QtSuppor
QSet<FileName> QmakePriFileNode::recursiveEnumerate(const QString &folder)
{
QSet<FileName> result;
QFileInfo fi(folder);
if (fi.isDir()) {
QDir dir(folder);
dir.setFilter(dir.filter() | QDir::NoDotAndDotDot);
foreach (const QFileInfo &file, dir.entryInfoList()) {
if (file.isDir() && !file.isSymLink())
result += recursiveEnumerate(file.absoluteFilePath());
else if (!Core::EditorManager::isAutoSaveFile(file.fileName()))
result += FileName(file);
}
} else if (fi.exists()) {
result << FileName(fi);
}
return result;
}
@@ -646,17 +640,15 @@ PriFileEvalResult QmakePriFileNode::extractValues(const EvalInput &input,
{
PriFileEvalResult result;
// Figure out DEPLOYMENT and INSTALL folders
QStringList dynamicVariables = dynamicVarNames(input.readerExact, input.readerCumulative, input.isQt5);
// Figure out DEPLOYMENT and INSTALL folders.
// Ignore stuff from cumulative parse, as we are recursively enumerating
// all the files from those folders and add watchers for them. That's too
// dangerous if we get the folders wrong and enumerate the whole project
// tree multiple times.
QStringList dynamicVariables = dynamicVarNames(input.readerExact, input.isQt5);
foreach (ProFile *includeFileExact, includeFilesExact)
foreach (const QString &dynamicVar, dynamicVariables) {
foreach (const QString &dynamicVar, dynamicVariables)
result.folders += input.readerExact->values(dynamicVar, includeFileExact);
// Ignore stuff from cumulative parse
// we are recursively enumerating all the files from those folders
// and add watchers for them, that's too dangerous if we get the folders
// wrong and enumerate the whole project tree multiple times
}
for (int i=0; i < result.folders.size(); ++i) {
const QFileInfo fi(result.folders.at(i));
@@ -1376,10 +1368,11 @@ QStringList QmakePriFileNode::varNames(FileType type, QtSupport::ProFileReader *
foreach (const QString &var, listOfExtraCompilers) {
QStringList inputs = readerExact->values(var + QLatin1String(".input"));
foreach (const QString &input, inputs)
// FORMS, RESOURCES, and STATECHARTS are handled below, HEADERS above
// FORMS, RESOURCES, and STATECHARTS are handled below, HEADERS and SOURCES above
if (input != QLatin1String("FORMS")
&& input != QLatin1String("STATECHARTS")
&& input != QLatin1String("RESOURCES")
&& input != QLatin1String("SOURCES")
&& input != QLatin1String("HEADERS"))
vars << input;
}
@@ -1474,7 +1467,7 @@ QStringList QmakePriFileNode::varNamesForRemoving()
return vars;
}
QStringList QmakePriFileNode::dynamicVarNames(QtSupport::ProFileReader *readerExact, QtSupport::ProFileReader *readerCumulative,
QStringList QmakePriFileNode::dynamicVarNames(QtSupport::ProFileReader *readerExact,
bool isQt5)
{
QStringList result;
@@ -1486,12 +1479,6 @@ QStringList QmakePriFileNode::dynamicVarNames(QtSupport::ProFileReader *readerEx
foreach (const QString &var, listOfVars) {
result << (var + sources);
}
if (readerCumulative) {
QStringList listOfVars = readerCumulative->values(deployment);
foreach (const QString &var, listOfVars) {
result << (var + sources);
}
}
const QString installs = QLatin1String("INSTALLS");
const QString files = QLatin1String(".files");
@@ -1499,12 +1486,6 @@ QStringList QmakePriFileNode::dynamicVarNames(QtSupport::ProFileReader *readerEx
foreach (const QString &var, listOfVars) {
result << (var + files);
}
if (readerCumulative) {
QStringList listOfVars = readerCumulative->values(installs);
foreach (const QString &var, listOfVars) {
result << (var + files);
}
}
result.removeDuplicates();
return result;
}
@@ -1858,8 +1839,8 @@ EvalResult *QmakeProFileNode::evaluate(const EvalInput &input)
if (result->state == EvalResult::EvalOk) {
if (result->projectType == SubDirsTemplate) {
QStringList errors;
result->errors.append(errors);
FileNameList subDirs = subDirsPaths(input.readerExact, input.projectDir, &result->subProjectsNotToDeploy, &errors);
result->errors.append(errors);
foreach (const Utils::FileName &subDirName, subDirs) {
IncludedPriFile *subDir = new IncludedPriFile;

View File

@@ -180,7 +180,7 @@ protected:
static QStringList varNames(ProjectExplorer::FileType type, QtSupport::ProFileReader *readerExact);
static QStringList varNamesForRemoving();
static QString varNameForAdding(const QString &mimeType);
static QStringList dynamicVarNames(QtSupport::ProFileReader *readerExact, QtSupport::ProFileReader *readerCumulative, bool isQt5);
static QStringList dynamicVarNames(QtSupport::ProFileReader *readerExact, bool isQt5);
static QSet<Utils::FileName> filterFilesProVariables(ProjectExplorer::FileType fileType, const QSet<Utils::FileName> &files);
static QSet<Utils::FileName> filterFilesRecursiveEnumerata(ProjectExplorer::FileType fileType, const QSet<Utils::FileName> &files);

View File

@@ -423,7 +423,6 @@ void QmakeProject::updateCppCodeModel()
}
QList<ProjectExplorer::ExtraCompiler *> generators;
QStringList allFiles;
foreach (QmakeProFileNode *pro, proFiles) {
warnOnToolChainMismatch(pro);
@@ -465,11 +464,9 @@ void QmakeProject::updateCppCodeModel()
{ // C++ files:
// part->files
foreach (const QString &file, pro->variableValue(CppSourceVar)) {
allFiles << file;
cppPart->files << ProjectFile(file, ProjectFile::CXXSource);
}
foreach (const QString &file, pro->variableValue(CppHeaderVar)) {
allFiles << file;
cppPart->files << ProjectFile(file, ProjectFile::CXXHeader);
}
}
@@ -477,13 +474,11 @@ void QmakeProject::updateCppCodeModel()
ProjectPart::Ptr objcppPart = templatePart->copy();
{ // ObjC++ files:
foreach (const QString &file, pro->variableValue(ObjCSourceVar)) {
allFiles << file;
// Although the enum constant is called ObjCSourceVar, it actually is ObjC++ source
// code, as qmake does not handle C (and ObjC).
objcppPart->files << ProjectFile(file, ProjectFile::ObjCXXSource);
}
foreach (const QString &file, pro->variableValue(ObjCHeaderVar)) {
allFiles << file;
objcppPart->files << ProjectFile(file, ProjectFile::ObjCXXHeader);
}
@@ -505,7 +500,6 @@ void QmakeProject::updateCppCodeModel()
foreach (ProjectExplorer::ExtraCompiler *ec, proGenerators) {
ec->forEachTarget([&](const Utils::FileName &generatedFile) {
QString name = generatedFile.toString();
allFiles << name;
ProjectFile::Kind kind = ProjectFile::classify(name);
switch (kind) {
case ProjectFile::CHeader:

View File

@@ -31,6 +31,7 @@
#include "ui_qmakeprojectconfigwidget.h"
#include <coreplugin/coreicons.h>
#include <coreplugin/variablechooser.h>
#include <projectexplorer/target.h>
#include <qtsupport/qtkitinformation.h>
@@ -82,6 +83,9 @@ QmakeProjectConfigWidget::QmakeProjectConfigWidget(QmakeBuildConfiguration *bc)
m_ui->inSourceBuildDirEdit->setReadOnly(true);
m_ui->inSourceBuildDirEdit->setEnabled(false);
auto chooser = new Core::VariableChooser(this);
chooser->addSupportedWidget(m_ui->shadowBuildDirEdit->lineEdit());
m_ui->shadowBuildCheckBox->setChecked(isShadowBuild);
connect(m_ui->shadowBuildCheckBox, &QAbstractButton::clicked,

View File

@@ -112,6 +112,19 @@ void QtProjectParameters::writeProFile(QTextStream &str) const
if (!targetDirectory.isEmpty())
str << "\nDESTDIR = " << targetDirectory << '\n';
if (qtVersionSupport != SupportQt4Only) {
str << "\n"
"# The following define makes your compiler emit warnings if you use\n"
"# any feature of Qt which as been marked as deprecated (the exact warnings\n"
"# depend on your compiler). Please consult the documentation of the\n"
"# deprecated API in order to know how to port your code away from it.\n"
"DEFINES += QT_DEPRECATED_WARNINGS\n\n"
"# You can also make your code fail to compile if you use deprecated APIs.\n"
"# In order to do so, uncomment the following line.\n"
"# You can also select to disable deprecated APIs only up to a certain version of Qt.\n"
"#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0\n";
}
}
void QtProjectParameters::writeProFileHeader(QTextStream &str)

View File

@@ -134,7 +134,6 @@ bool AbstractFormEditorTool::topSelectedItemIsMovable(const QList<QGraphicsItem*
}
bool AbstractFormEditorTool::topItemIsResizeHandle(const QList<QGraphicsItem*> &/*itemList*/)
{
return false;
@@ -149,6 +148,7 @@ QGraphicsItem *AbstractFormEditorTool::topMovableGraphicsItem(const QList<QGraph
return 0;
}
FormEditorItem *AbstractFormEditorTool::topMovableFormEditorItem(const QList<QGraphicsItem*> &itemList, bool selectOnlyContentItems)
{
foreach (QGraphicsItem *item, itemList) {

View File

@@ -0,0 +1,33 @@
QWidget#backgroundWidget {
background-color: creatorTheme.QmlDesignerTabDark
}
QTabWidget#centralTabWidget::pane {
border: 0px;
background-color: creatorTheme.QmlDesignerBackgroundColorDarkAlternate;
}
QTabWidget#centralTabWidget::tab-bar { alignment: right; }
QTabBar::tab:selected {
border: none;
background-color: creatorTheme.QmlDesignerTabLight;
color: creatorTheme.QmlDesignerTabDark;
}
QTabBar#centralTabBar::tab {
width: 16px;
height: 80px;
border-image: none;
background-color: creatorTheme.QmlDesignerTabDark;
color: creatorTheme.QmlDesignerTabLight;
margin-top: 0x;
margin-bottom: 0px;
margin-left: 0px;
margin-right: 0px;
font: bold;
font-size: 11px;
}

View File

@@ -4,5 +4,6 @@
<file>stylesheet.css</file>
<file>scrollbar.css</file>
<file>formeditorstylesheet.css</file>
<file>centerwidget.css</file>
</qresource>
</RCC>

View File

@@ -21,22 +21,11 @@ QStackedWidget {
background-color: creatorTheme.QmlDesignerBackgroundColorDarkAlternate;
}
QGraphicsView {
border: 0px;
background-color: creatorTheme.QmlDesignerBackgroundColorDarkAlternate;
}
QTabWidget {
border: 0px;
background-color: creatorTheme.QmlDesignerBackgroundColorDarkAlternate;
}
QTabWidget::pane { /* The tab widget frame */
border: 0px;
background-color: creatorTheme.QmlDesignerBackgroundColorDarkAlternate;
}
QLineEdit#itemLibrarySearchInput
{
color: creatorTheme.PanelTextColorLight;
@@ -70,21 +59,30 @@ QLineEdit#itemLibrarySearchInput
selection-color: #404040;
}
QTabWidget {
border: 0px;
background-color: creatorTheme.QmlDesignerBackgroundColorDarkAlternate;
}
QTabWidget::pane { /* The tab widget frame */
border: 0px;
background-color: creatorTheme.QmlDesignerBackgroundColorDarkAlternate;
}
QTabBar::tab {
border-image: none;
width: 80px;
height: 22px;
border-image: none;
background-color: creatorTheme.QmlDesignerTabDark;
color: creatorTheme.QmlDesignerTabLight;
margin-top: 0x;
margin-bottom: 0px;
margin-left: 0px;
margin-right: 0px;
font: bold;
font-size: 11px;
background-color: creatorTheme.QmlDesignerTabDark;
color: creatorTheme.QmlDesignerTabLight;
}
QTabBar::tab:selected {

View File

@@ -141,16 +141,18 @@ NodeInstanceServerProxy::NodeInstanceServerProxy(NodeInstanceView *nodeInstanceV
SLOT(processFinished(int,QProcess::ExitStatus)));
}
if (m_qmlPuppetEditorProcess->waitForStarted(10000)) {
const int second = 1000;
const int waitConstant = 8 * second;
if (m_qmlPuppetEditorProcess->waitForStarted(waitConstant)) {
connect(m_qmlPuppetEditorProcess.data(), static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
m_qmlPuppetEditorProcess.data(), &QProcess::deleteLater);
if (runModus == NormalModus) {
m_qmlPuppetPreviewProcess->waitForStarted();
m_qmlPuppetPreviewProcess->waitForStarted(waitConstant / 2);
connect(m_qmlPuppetPreviewProcess.data(), static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
m_qmlPuppetPreviewProcess.data(), &QProcess::deleteLater);
m_qmlPuppetRenderProcess->waitForStarted();
m_qmlPuppetRenderProcess->waitForStarted(waitConstant / 2);
connect(m_qmlPuppetRenderProcess.data(), static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
m_qmlPuppetRenderProcess.data(), &QProcess::deleteLater);
}
@@ -158,7 +160,7 @@ NodeInstanceServerProxy::NodeInstanceServerProxy(NodeInstanceView *nodeInstanceV
bool connectedToPuppet = true;
if (!m_localServer->hasPendingConnections())
connectedToPuppet = m_localServer->waitForNewConnection(3000);
connectedToPuppet = m_localServer->waitForNewConnection(waitConstant / 4);
if (connectedToPuppet) {
m_firstSocket = m_localServer->nextPendingConnection();
@@ -166,14 +168,14 @@ NodeInstanceServerProxy::NodeInstanceServerProxy(NodeInstanceView *nodeInstanceV
if (runModus == NormalModus) {
if (!m_localServer->hasPendingConnections())
connectedToPuppet = m_localServer->waitForNewConnection(3000);
connectedToPuppet = m_localServer->waitForNewConnection(waitConstant / 4);
if (connectedToPuppet) {
m_secondSocket = m_localServer->nextPendingConnection();
connect(m_secondSocket.data(), SIGNAL(readyRead()), this, SLOT(readSecondDataStream()));
if (!m_localServer->hasPendingConnections())
connectedToPuppet = m_localServer->waitForNewConnection(3000);
connectedToPuppet = m_localServer->waitForNewConnection(waitConstant / 4);
if (connectedToPuppet) {
m_thirdSocket = m_localServer->nextPendingConnection();

View File

@@ -179,6 +179,42 @@ static bool idIsQmlKeyWord(const QString& id)
return keywords.contains(id);
}
static bool isIdToAvoid(const QString& id)
{
static const QSet<QString> ids = {
"top",
"bottom",
"left",
"right",
"width",
"height",
"x",
"y",
"opacity",
"parent",
"item",
"flow",
"color",
"margin",
"padding",
"border",
"font",
"text",
"source",
"state",
"visible",
"focus",
"data",
"clip",
"layer",
"scale",
"enabled",
"anchors"
};
return ids.contains(id);
}
static bool idContainsWrongLetter(const QString& id)
{
static QRegExp idExpr(QStringLiteral("[a-z_][a-zA-Z0-9_]*"));
@@ -187,7 +223,7 @@ static bool idContainsWrongLetter(const QString& id)
bool ModelNode::isValidId(const QString &id)
{
return id.isEmpty() || (!idContainsWrongLetter(id) && !idIsQmlKeyWord(id));
return id.isEmpty() || (!idContainsWrongLetter(id) && !idIsQmlKeyWord(id)) && !isIdToAvoid(id);
}
bool ModelNode::hasId() const

View File

@@ -85,7 +85,7 @@ void ModelToTextMerger::propertiesChanged(const QList<AbstractProperty>& propert
ModelNode containedModelNode;
const int indentDepth = m_rewriterView->textModifier()->indentDepth();
const QString propertyTextValue = QmlTextGenerator(getPropertyOrder(),
const QString propertyTextValue = QmlTextGenerator(propertyOrder(),
indentDepth)(property);
switch (propertyChange) {
@@ -162,14 +162,14 @@ void ModelToTextMerger::nodeReparented(const ModelNode &node, const NodeAbstract
switch (propertyChange) {
case AbstractView::PropertiesAdded:
schedule(new AddPropertyRewriteAction(newPropertyParent,
QmlTextGenerator(getPropertyOrder())(node),
QmlTextGenerator(propertyOrder())(node),
propertyType(newPropertyParent),
node));
break;
case AbstractView::NoAdditionalChanges:
schedule(new ChangePropertyRewriteAction(newPropertyParent,
QmlTextGenerator(getPropertyOrder())(node),
QmlTextGenerator(propertyOrder())(node),
propertyType(newPropertyParent),
node));
break;
@@ -212,7 +212,7 @@ void ModelToTextMerger::applyChanges()
return;
dumpRewriteActions(QStringLiteral("Before compression"));
RewriteActionCompressor compress(getPropertyOrder());
RewriteActionCompressor compress(propertyOrder());
compress(m_rewriteActions);
dumpRewriteActions(QStringLiteral("After compression"));
@@ -241,7 +241,7 @@ void ModelToTextMerger::applyChanges()
ModelNodePositionRecalculator positionRecalculator(m_rewriterView->positionStorage(), m_rewriterView->positionStorage()->modelNodes());
positionRecalculator.connectTo(textModifier);
QmlRefactoring refactoring(tmpDocument, *textModifier, getPropertyOrder());
QmlRefactoring refactoring(tmpDocument, *textModifier, propertyOrder());
textModifier->deactivateChangeSignals();
textModifier->startGroup();
@@ -348,31 +348,27 @@ QmlRefactoring::PropertyType ModelToTextMerger::propertyType(const AbstractPrope
return (QmlRefactoring::PropertyType) -1;
}
PropertyNameList ModelToTextMerger::m_propertyOrder;
PropertyNameList ModelToTextMerger::getPropertyOrder()
PropertyNameList ModelToTextMerger::propertyOrder()
{
if (m_propertyOrder.isEmpty()) {
m_propertyOrder
<< PropertyName("id")
<< PropertyName("name")
<< PropertyName("target")
<< PropertyName("property")
<< PropertyName("x")
<< PropertyName("y")
<< PropertyName("width")
<< PropertyName("height")
<< PropertyName("position")
<< PropertyName("color")
<< PropertyName("radius")
<< PropertyName("text")
<< PropertyName()
<< PropertyName("states")
<< PropertyName("transitions")
;
}
static const PropertyNameList properties = {
PropertyName("id"),
PropertyName("name"),
PropertyName("target"),
PropertyName("property"),
PropertyName("x"),
PropertyName("y"),
PropertyName("width"),
PropertyName("height"),
PropertyName("position"),
PropertyName("color"),
PropertyName("radius"),
PropertyName("text"),
PropertyName(),
PropertyName("states"),
PropertyName("transitions")
};
return m_propertyOrder;
return properties;
}
bool ModelToTextMerger::isInHierarchy(const AbstractProperty &property) {

View File

@@ -37,7 +37,6 @@ namespace Internal {
class ModelToTextMerger
{
typedef AbstractView::PropertyChangeFlags PropertyChangeFlags;
static PropertyNameList m_propertyOrder;
public:
ModelToTextMerger(RewriterView *reWriterView);
@@ -75,7 +74,7 @@ protected:
{ return m_rewriteActions; }
static QmlDesigner::QmlRefactoring::PropertyType propertyType(const AbstractProperty &property, const QString &textValue = QString());
static PropertyNameList getPropertyOrder();
static PropertyNameList propertyOrder();
static bool isInHierarchy(const AbstractProperty &property);

View File

@@ -369,8 +369,8 @@ void RewriterView::applyChanges()
if (inErrorState()) {
const QString content = textModifierContent();
qDebug() << "RewriterView::applyChanges() got called while in error state. Will do a quick-exit now.";
qDebug() << "Content:" << content;
qDebug().noquote() << "RewriterView::applyChanges() got called while in error state. Will do a quick-exit now.";
qDebug().noquote() << "Content: " << content;
throw RewritingException(__LINE__, __FUNCTION__, __FILE__, "RewriterView::applyChanges() already in error state", content);
}
@@ -382,8 +382,8 @@ void RewriterView::applyChanges()
enterErrorState(errors().first().description());
} catch (const Exception &e) {
const QString content = textModifierContent();
qDebug() << "RewriterException:" << m_rewritingErrorMessage;
qDebug() << "Content:" << content;
qDebug().noquote() << "RewriterException:" << m_rewritingErrorMessage;
qDebug().noquote() << "Content: " << qPrintable(content);
enterErrorState(e.description());
}
@@ -391,10 +391,10 @@ void RewriterView::applyChanges()
if (inErrorState()) {
const QString content = textModifierContent();
qDebug() << "RewriterException:" << m_rewritingErrorMessage;
qDebug() << "Content:" << content;
qDebug().noquote() << "RewriterException: " << m_rewritingErrorMessage;
qDebug().noquote() << "Content: " << content;
if (!errors().isEmpty())
qDebug() << "Error:" << errors().first().description();
qDebug().noquote() << "Error:" << errors().first().description();
throw RewritingException(__LINE__, __FUNCTION__, __FILE__, qPrintable(m_rewritingErrorMessage), content);
}
}

Some files were not shown because too many files have changed in this diff Show More