Merge remote-tracking branch 'origin/2.8'

Conflicts:
	src/plugins/fakevim/fakevimhandler.cpp

Change-Id: I8101f18b87859924644471817d4f1408790d5628
This commit is contained in:
Eike Ziller
2013-06-25 10:14:14 +02:00
376 changed files with 3762 additions and 2070 deletions

View File

@@ -12,12 +12,4 @@
<!-- @homeDir@ and @rootDir@ are some of the supported vars -->
<TargetDir>@homeDir@/qtcreator-{version}</TargetDir>
<AdminTargetDir>/opt/qtcreator-{version}</AdminTargetDir>
<Pages>
<Page name="LicenseAgreementPage">
<AcceptLicenseLabel>I have read and understood the terms contained in the above license agreements.</AcceptLicenseLabel>
<RejectLicenseLabel>I do not accept the terms contained in the above license agreements.</RejectLicenseLabel>
</Page>
</Pages>
</Installer>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0"?>
<Installer>
<Name>Qt Creator</Name>
<Version>{version}</Version>
<Title>Qt Creator {version}</Title>
<Publisher>Qt Project</Publisher>
<ProductUrl>http://qt-project.org</ProductUrl>
<Icon>logo.png</Icon>
<Watermark>watermark.png</Watermark>
<UninstallerName>Uninstall Qt Creator</UninstallerName>
<!-- @homeDir@ and @rootDir@ are some of the supported vars -->
<TargetDir>@homeDir@/Applications/Qt Creator {version}</TargetDir>
<AllowSpaceInPath>true</AllowSpaceInPath>
</Installer>

View File

@@ -11,12 +11,4 @@
<UninstallerName>QtCreatorUninst</UninstallerName>
<!-- @homeDir@ and @rootDir@ are some of the supported vars -->
<TargetDir>@rootDir@/Qt/qtcreator-{version}</TargetDir>
<Pages>
<Page name="LicenseAgreementPage">
<AcceptLicenseLabel>I have read and understood the terms contained in the above license agreements.</AcceptLicenseLabel>
<RejectLicenseLabel>I do not accept the terms contained in the above license agreements.</RejectLicenseLabel>
</Page>
</Pages>
</Installer>

View File

@@ -57,7 +57,7 @@ Component.prototype.beginInstallation = function()
else if (installer.value("os") == "x11")
component.qtCreatorBinaryPath = component.qtCreatorBinaryPath + "/bin/qtcreator";
else if (installer.value("os") == "mac")
component.qtCreatorBinaryPath = "\"" + component.qtCreatorBinaryPath + "/Qt Creator.app/Contents/MacOS/Qt Creator\"";
component.qtCreatorBinaryPath = component.qtCreatorBinaryPath + "/Qt Creator.app/Contents/MacOS/Qt Creator";
if ( installer.value("os") === "win" ) {
component.setStopProcessForUpdateRequest(component.qtCreatorBinaryPath, true);
@@ -202,7 +202,7 @@ Component.prototype.installationFinished = function()
if (component.installed && installer.isInstaller() && installer.status == QInstaller.Success) {
var isLaunchQtCreatorCheckBoxChecked = component.userInterface("LaunchQtCreatorCheckBoxForm").launchQtCreatorCheckBox.checked;
if (isLaunchQtCreatorCheckBoxChecked)
installer.executeDetached(component.qtCreatorBinaryPath);
installer.executeDetached(component.qtCreatorBinaryPath, new Array(), "@homeDir@");
}
} catch(e) {
print(e);

View File

@@ -11,8 +11,7 @@ defines = Q_QDOC \
QT_DEPRECATED \
Q_NO_USING_KEYWORD \
__cplusplus \
qtquick \
qcmanual
$QTC_LICENSE_TYPE
versionsym = QT_VERSION_STR

View File

@@ -11,6 +11,8 @@ greaterThan(QT_MAJOR_VERSION, 4) {
VERSION_TAG = $$replace(QTCREATOR_VERSION, "[-.]", )
isEmpty(LICENSE_TYPE):LICENSE_TYPE=opensource
# unset the installdir for qdoc, so we force generation
# of URLs for the links to the Qt documentation
QMAKE_DOCS_INSTALLDIR =
@@ -21,7 +23,7 @@ defineReplace(cmdEnv) {
}
defineReplace(qdoc) {
return("$$cmdEnv(SRCDIR=$$PWD OUTDIR=$$1 QTC_VERSION=$$QTCREATOR_VERSION QTC_VERSION_TAG=$$VERSION_TAG QT_INSTALL_DOCS=$$[QT_INSTALL_DOCS]) $$QDOC_BIN")
return("$$cmdEnv(SRCDIR=$$PWD OUTDIR=$$1 QTC_VERSION=$$QTCREATOR_VERSION QTC_VERSION_TAG=$$VERSION_TAG QTC_LICENSE_TYPE=$$LICENSE_TYPE QT_INSTALL_DOCS=$$[QT_INSTALL_DOCS]) $$QDOC_BIN")
}
QHP_FILE = $$OUT_PWD/doc/html/qtcreator.qhp

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -38,8 +38,8 @@
for the project. For more information, see
\l{Setting Up QML Debugging}.
\li In the \gui Projects mode, select Qt 4.7.4 in the \gui {Qt version}
field.
\li In the \gui Projects mode, select a \l{glossary-buildandrun-kit}
{kit} with Qt version 4.7.4 or later.
\note To profile applications on devices, you must install Qt 4.7.4
or later libraries on them.
@@ -98,6 +98,11 @@
The \gui Timeline view displays graphical representations of:
\list
\if defined(enterprise)
\li Pixmap loading times and cache sizes
\li Scene graph events
\endif
\li Painting operations
@@ -113,7 +118,14 @@
\endlist
\if defined(enterprise)
Information about the pixmap cache and scene graph events are only available
from Qt 5.1 onwards.
\image qtcreator-qml-performance-monitor-enterprise.png "QML Profiler"
\else
\image qtcreator-qml-performance-monitor.png "QML Profiler"
\endif
Each row in the timeline (6) describes a type of QML events that were
recorded. Move the cursor on an event on a row to see how long it takes and

View File

@@ -95,6 +95,7 @@
as part of the APK, select the \gui {Bundle Qt libraries in APK} option.
This is the default option
when developing with Qt 5.
It is not supported when developing with Qt 4.
\section1 Using Ministro to Install Qt Libraries

View File

@@ -238,11 +238,7 @@
debugging) or runs a separate process (e.g. when using GDB server
on embedded Linux). The host side typically
consists of \QC itself, often with the help of an external process, such as
\if defined(qcmanual)
GDB or CDB.
\else
GDB.
\endif
While this setup might look daunting, it is mostly invisible to
the user of \QC. To start debugging on a remote target with the

View File

@@ -35,7 +35,7 @@
\gui{Text Editor}.
These settings apply to all projects. To specify editor behavior for an
open project, select \gui {Projects > Editor Settings}. For more
open project, select \gui Projects > \gui Editor. For more
information, see \l{Specifying Editor Settings}.
You can also specify indentation settings separately for C++ and QML files

View File

@@ -71,9 +71,8 @@
definition files as the primary location.
When you open a file for editing and the editor cannot find the highlight
definition for it, an alert appears. You can turn off the alerts. You can
also specify patterns for ignoring files. The editor will not alert you if
highlight definitions for the ignored files are not found.
definition for it, an alert appears. To suppress the alerts, you can specify
patterns for ignoring files.
To download highlight definition files:
@@ -103,8 +102,8 @@
definition files on your system, or click \gui Browse to locate
them in the file system yourself.
\li In the \gui {Ignored file patterns} field, specify file patterns.
You will not receive alerts if the highlight definitions for the
\li In the \gui {Ignored file patterns} field, specify file patterns to
suppress alerts if the highlight definitions for the
specified files are not found.
\li Click \gui OK to save your changes.
@@ -890,8 +889,10 @@
\endlist
To configure the server, select \gui{Tools} > \gui{Options} >
\gui{Code Pasting}. In \gui CodePaster, specify the host name of the
CodePaster service. In \gui Fileshare, specify the path to a shared
\gui{Code Pasting} > \gui CodePaster. In the \gui Server field, specify the
host name of the CodePaster service.
Select \gui Fileshare to specify the path to a shared
network drive. The code snippets are copied to the drive as simple files.
You have to delete obsolete files from the drive manually.
@@ -903,6 +904,10 @@
To fetch a snippet of code from the server, select \gui{Tools} >
\gui{Code Pasting} > \gui{Fetch Snippet} or press \key{Alt+C,Alt+F}.
To fetch content from a URL on a CodePaster service, select \gui{Tools} >
\gui{Code Pasting} > \gui{Fetch from URL}. The content is opened in the code
editor.
\note To use \gui{Pastebin.Com}, configure the domain
prefix in \gui{Tools} > \gui{Options} > \gui{Code Pasting} >
\gui{Pastebin.com}.
@@ -931,6 +936,8 @@
or press \key {Alt+(}. To stop recording, select \gui {Tools > Macros >
Stop Recording Macro} or press \key {Alt+)}.
\note The macro recorder does not support code completion.
To play the last macro, select \gui {Tools > Macros > Play Last Macro} or
press \key {Alt+R}.
@@ -1104,8 +1111,8 @@
\image qtcreator-indentation.png "Text Editor Behavior options"
To specify different settings for a particular project, select \gui {Projects >
Editor Settings}.
To specify different settings for a particular project, select \gui Projects
> \gui Editor.
You can specify how to interpret the \key Tab and \key Backspace key
presses and how to align continuation lines.
@@ -1297,8 +1304,7 @@
\section1 Advanced Search
To search through projects, files on a file system or the currently open
file:
To search through projects, files on a file system or currently open files:
\list 1
@@ -1326,6 +1332,8 @@
\li \gui{Current File} searches only the current file.
\li \gui {Open Documents} searches all open files.
\endlist
\li Enter the text you are looking for and click \gui Search.

View File

@@ -64,7 +64,6 @@
\li Subversion
\li \l{http://subversion.apache.org/}
\li Subversion version 1.6.17 and later
\li
\endtable
\section1 Setting Up Version Control Systems
@@ -555,10 +554,10 @@
\image qtcreator-gerrit.png
To view details of the selected change, select \gui Diff.
To view details of the selected change, select \gui Show.
To apply the selected change to the top of your local repository, select
\gui Apply. To remove the change after testing it, select \gui Tools >
To cherry-pick the selected change to the local repository, select
\gui {Cherry Pick}. To remove the change after testing it, select \gui Tools >
\gui Git > \gui {Local Repository} > \gui Reset. In the
\gui {Undo Changes to} dialog, select the
state to reset the working directory to, and then select \gui OK.

View File

@@ -100,9 +100,7 @@
You can look up any issue in the
\l{http://bugreports.qt-project.org/}{Qt bug tracker}.
\if defined(qcmanual)
\include widgets/creator-faq-qtdesigner.qdocinc
\endif
\section1 Help Questions

View File

@@ -19,11 +19,7 @@
/*!
\contentspage index.html
\if defined(qcmanual)
\previouspage creator-developing-generic-linux.html
\else
\previouspage creator-developing-meego.html
\endif
\page creator-developing-maemo.html
\nextpage creator-developing-meego.html
@@ -40,11 +36,9 @@
development is disabled by default. To enable it, select \gui Help >
\gui {About Plugins} > \gui {Device Support} > \gui Madde and restart \QC.
\if defined(qcmanual)
For more
information about the Maemo 5 platform, see
\l{http://maemo.org/intro/platform/}{Software Platform} on the Maemo web site.
\endif
For more information about developing applications for the Maemo 5
platform, select \gui {Help > Index} and look for \gui {Platform Notes},
@@ -58,10 +52,8 @@
\li Maemo 5 device: Nokia N900 with software update release 1.3
(V20.2010.36-2) or later installed.
\if defined(qcmanual)
\li MADDE cross-platform Maemo development
tool (installed as part of the Qt 4 SDK).
\endif
\li Nokia USB drivers.
@@ -234,13 +226,7 @@
testing. If you write applications that use Qt Mobility APIs, you might want
to test them with real user data. To create a connection as a user, specify
the \gui Username and \gui Password in \QC. For more information, see
\if defined(qcmanual)
\l{Testing with User Data on Maemo Devices}.
\else
\l{http://doc.qt.digia.com/qtcreator/creator-developing-maemo.html#testing-with-user-data-on-maemo-devices}
{Testing with User Data on Maemo Devices}.
\endif
You can protect the connections between \QC and
a device by using either a password or an SSH key. If you use a password, you
@@ -250,22 +236,11 @@
If you do not have an SSH key, you can create it in \QC.
Encrypted keys are not supported. For more
information, see
\if defined(qcmanual)
\l{Generating SSH Keys}.
\else
\l{http://doc.qt.digia.com/qtcreator/creator-developing-meego.html#generating-ssh-keys}
{Generating SSH Keys}.
\endif
You can view processes running on devices and kill them. For more
information, see
\if defined(qcmanual)
\l{Managing Device Processes}.
\else
\l{http://doc.qt.digia.com/qtcreator/creator-developing-meego.html#managing-device-processes}
{Managing Device Processes}.
\endif
To configure connections between \QC and a
@@ -309,8 +284,6 @@
\endlist
\if defined(qcmanual)
\li To test applications on the emulator (QEMU) separately, you must
create a connection to it from the development PC. If you installed
Qt 4 SDK, the connection is created automatically and you can omit this
@@ -330,7 +303,6 @@
connection.
\endlist
\endif
\li Select \gui Tools > \gui Options > \gui {Build & Run} >
\gui Kits > \gui Add to add a kit for building for the device:

View File

@@ -21,11 +21,7 @@
\contentspage index.html
\previouspage creator-developing-maemo.html
\page creator-developing-meego.html
\if defined(qcmanual)
\nextpage creator-developing-qnx.html
\else
\nextpage creator-developing-maemo.html
\endif
\title Connecting MeeGo Harmattan Devices
@@ -39,12 +35,9 @@
development is disabled by default. To enable it, select \gui Help >
\gui {About Plugins} > \gui {Device Support} > \gui Madde and restart \QC.
\if defined(qcmanual)
For more information about the Harmattan platform, see
\l{http://library.developer.nokia.com/topic/MeeGo_1.2_Harmattan_API/html/guide/html/Developer_Library_Harmattan_overview_5dcf.html}
{Harmattan Overview} in the MeeGo 1.2 Harmattan Developer Library.
\endif
\note Qt 4 SDK does not contain the tool chains for building applications for
other MeeGo devices than MeeGo Harmattan. You can try to run applications
@@ -247,13 +240,7 @@
If you write applications that use Qt Mobility APIs, you might want to test
them with real user data. To create a connection as a user, specify the
\gui Username and \gui Password in \QC. For more information, see
\if defined(qcmanual)
\l{Testing with User Data on MeeGo Devices}.
\else
\l{http://doc.qt.digia.com/qtcreator/creator-developing-meego.html#testing-with-user-data-on-meego-devices}
{Testing with User Data on MeeGo Devices}.
\endif
You can protect the connections between \QC and a device by using
either a password or an SSH key. If you use a password, you must generate it
@@ -262,23 +249,11 @@
If you do not have an SSH key, you can create it in \QC. Encrypted
keys are not supported. For more information, see
\if defined(qcmanual)
\l{Generating SSH Keys}.
\else
\l{http://doc.qt.digia.com/qtcreator/creator-developing-meego.html#generating-ssh-keys}
{Generating SSH Keys}.
\endif
You can view processes running on devices and kill them. For more
information, see
\if defined(qcmanual)
\l{Managing Device Processes}.
\else
\l{http://doc.qt.digia.com/qtcreator/creator-developing-meego.html#managing-device-processes}
{Managing Device Processes}.
\endif
To configure connections between \QC and a device:
@@ -324,8 +299,6 @@
\endlist
\if defined(qcmanual)
\li To test applications on the emulator (QEMU), you must
create a connection to it from the development PC. If you installed
Qt 4 SDK, the connection is created automatically and you can omit this
@@ -355,8 +328,6 @@
\endlist
\endif
\li Select \gui Tools > \gui Options > \gui {Build & Run} >
\gui Kits > \gui Add to add a kit for building for the device:
@@ -410,8 +381,6 @@
\endlist
\if defined(qcmanual)
\section2 Testing with User Data on MeeGo Devices
To run your application as the default user, you must first assign a
@@ -436,8 +405,6 @@
\include linux-mobile/linuxdev-keys.qdocinc
\include linux-mobile/linuxdev-processes.qdocinc
\endif
\section1 Troubleshooting Harmattan Connections
The addresses used in this example might be reserved by some other

View File

@@ -104,11 +104,9 @@
\li Creating new CMake projects with \QC is not supported.
\if defined(qcmanual)
\li On Windows, you must create projects for Maemo 5 and Harmattan
device types on the same partition where you installed Qt 4 SDK, \QC, and
MADDE.
\endif
\li If error messages displayed in the \gui {Compile Output} pane contain
paths where slashes are missing (for example, C:QtSDK),

View File

@@ -51,11 +51,6 @@
\li Develop Qt applications for desktop and mobile devices
\li \l{http://qt-project.org}{Qt Developer Network}
\row
\li Develop Qt applications for Nokia mobile devices
\li \l{http://www.developer.nokia.com/Develop/Qt/}
{Nokia Developer - Qt}
\row
\li Participate in Qt development
\li \l{http://qt-project.org/contribute}{Contribute to Qt}

View File

@@ -115,8 +115,4 @@
\endlist
For more information about user experience techniques for mobile devices,
see the \l{http://www.developer.nokia.com/Resources/Library/Design_and_UX}
on Nokia Developer.
*/

View File

@@ -98,7 +98,6 @@
\list
\if defined(qcmanual)
\li Qt GUI Application
Use \QD forms to design a Qt widget based user interface for the
@@ -110,7 +109,6 @@
mobile devices and C++ to implement the application logic.
Select this template to develop for devices that support only
Qt 4.6.x
\endif
\li Qt Quick Application (Built-in Types)
@@ -204,6 +202,12 @@
Subprojects that enable you to structure your qmake projects as
a tree hierarchy
\li Code Snippet
Creates a qmake project from a code snippet. When fixing bug
reports that contain a code snippet, you can place the code
snippet into a project to compile and check it.
\endlist
\li Non-Qt Projects
@@ -271,18 +275,14 @@
C++ class, source, or header files that you can use to write the
application logic in both Qt Quick projects and
\if defined(qcmanual)
Qt widget based projects
\endif
\li Qt
\list
\if defined(qcmanual)
\li \QD forms and \QD form classes, which specify parts of user
interfaces in Qt widget based projects
\endif
\li Qt resource files, which allow you to store binary files in the
application executable
@@ -418,8 +418,7 @@
\li \l{Opening Projects}
\li \l{Adding Libraries to Projects}
\li \l{Adding New Custom Wizards}
\li \l{Setting Up a CMake Project}
\li \l{Setting Up a Generic Project}
\li \l{Using Other Build Systems}
\endlist
*/

View File

@@ -45,7 +45,7 @@
\list 1
\li Select \gui File > \gui{New File or Project} > \gui{Other Project}
\li Select \gui File > \gui{New File or Project} > \gui{Import Project}
> \gui{Import Existing Project}.
\li In \gui{Import Existing Project}, enter the project name

View File

@@ -26,8 +26,8 @@
The Qt Build Suite (Qbs) and the Qbs plugin are still experimental, and
therefore, you must first enable the plugin manually. If you build \QC
yourself from our git repository, you also need to fetch the Qbs submodule to
get Qbs support. See \l{Enabling the Qbs Plugin} below.
yourself from our Git repository, you also need to fetch the Qbs submodule
to get Qbs support.
To use Qbs to build a project, you must create a .qbs file for the project.
For more information, see the

View File

@@ -55,14 +55,14 @@
\image qtcreator-qt4-qtversions-add.png
\li In the \gui{Version name} field, edit the name that \QC
suggests for the Qt version.
\li In the \gui{qmake location} field, enter the path to the
directory where the qmake executable is located.
\li Select the directory where the qmake executable is located.
\QC automatically determines the path to the binaries in
the Qt installation and displays it in the dialog.
the Qt installation and displays it in the \gui{qmake location}
field.
\li In the \gui{Version name} field, edit the name that \QC
suggests for the Qt version.
\li In the \gui Helpers section, you can build the debugging
helpers that are available for the Qt version. This is
@@ -72,9 +72,7 @@
\endlist
\if defined(qcmanual)
\include qnx/creator-projects-qt-version-qnx.qdocinc
\endif
*/

View File

@@ -41,16 +41,9 @@
For more information on the options you have, see
\l{Specifying Run Settings}.
\if defined(qcmanual)
\include projects/creator-projects-running-desktop.qdocinc
\endif
\include projects/creator-projects-running-simulator.qdocinc
\if defined(qcmanual)
\include linux-mobile/creator-projects-running-generic-linux.qdocinc
\include linux-mobile/creator-projects-running-madde.qdocinc
\include qnx/creator-projects-running-qnx.qdocinc
\endif
*/

View File

@@ -51,7 +51,7 @@
\list 1
\li Select \gui {Projects > Code Style Settings}.
\li Select \gui Projects > \gui {Code Style}.
\li In the \gui Language field, select \gui C++ or \gui {Qt Quick}.

View File

@@ -43,7 +43,7 @@
\list 1
\li Select \gui {Projects > Editor Settings}.
\li Select \gui Projects > \gui Editor.
\li In the \gui {Editor Settings} field, select \gui {Custom}.
@@ -51,7 +51,7 @@
\endlist
\image qtcreator-editor-settings.png "Editor Settings view"
\image qtcreator-editor-settings.png "Editor view"
Click \gui {Restore Global} to revert to the global settings.

View File

@@ -45,13 +45,11 @@
parsed .pro files. For more information on how the commands are constructed,
see \l{Starting External Processes}.
\if defined(qcmanual)
\include projects/creator-projects-settings-run-desktop.qdocinc
\include projects/creator-projects-settings-run-analyze.qdocinc
\include projects/creator-projects-settings-run-debug.qdocinc
\include linux-mobile/creator-projects-settings-run-linux.qdocinc
\include qnx/creator-projects-settings-run-qnx.qdocinc
\endif
\section1 Selecting the Run Environment

View File

@@ -64,11 +64,9 @@
\section1 Related Topics
\list
\if defined(qcmanual)
\li \l {Using Qt Quick Designer}
\li \l {Creating Buttons}
\li \l {Creating Scalable Buttons and Borders}
\endif
\li \l {Exporting Designs from Graphics Software}
\li \l {Using QML Modules with Plugins}

View File

@@ -109,7 +109,6 @@
\endlist
\if defined(qcmanual)
The following sections contain examples of how to create some common
components:
@@ -130,5 +129,4 @@
top level when you are done editing the component.
\image qmldesigner-breadcrumbs.png "Go into Component command"
\endif
*/

View File

@@ -35,10 +35,8 @@
screens. Typically, the main qml file in a Qt Quick project specifies the
main window of an application.
\if defined(qcmanual)
The QML files in the project folder are displayed in \gui {QML Components}
in the \gui Library pane.
\endif
You can also use ready-made Qt Quick 1 Components (for Qt 4) to create
screens with a native look and feel for a particular target platform.
@@ -47,7 +45,6 @@
can install Qt Quick 1 Components as part of the Qt 4 SDK and the Qt Quick
Controls as part of Qt 5.1, or later.
\if defined(qcmanual)
\section1 Adding Components to Screens
\list 1
@@ -60,7 +57,6 @@
For example, you can anchor components to a position on the screen.
\endlist
\endif
\section1 Using Data Models
@@ -85,9 +81,7 @@
\l{http://qt-project.org/doc/qt-5.0/qtquick/qml-qtquick2-listmodel.html}{ListModel} and the
delegate component that creates an instance for each item in the model are
added automatically. You can edit item properties
\if defined(qcmanual)
in the \gui Properties pane or
\endif
in the code editor. You can also replace the default model and
delegate with other, more complex models and delegates in the code editor.
@@ -112,12 +106,9 @@
\endlist
\if defined(qcmanual)
To lay out several items in a Column, Row, Grid, or Flow, select
the items on the canvas, and then select \gui Layout in the context
menu.
\endif
\section1 Using States
@@ -127,7 +118,6 @@
controls, their properties and behavior and the available actions. For
example, you can use states to create two screens.
\if defined(qcmanual)
To add states, click the empty slot in the \gui States pane. Then modify the
new state in the visual editor.
@@ -136,8 +126,6 @@
The properties that you change in a state are highlighted with blue color.
In the code editor, you can see the changes recorded as changes to the base
state.
\endif
To keep the QML code clean, you should create a base state that contains all
the types you will need in the application. You can then create states,
@@ -160,7 +148,6 @@
\endlist
\if defined(qcmanual)
To create screens for an application by using states:
\list 1
@@ -195,7 +182,6 @@
\endqml
\endlist
\endif
*/

View File

@@ -6,7 +6,7 @@ Product {
Group {
name: "Resources"
qbs.install: true
qbs.installDir: (qbs.targetOS == "windows" ? "lib/qtcreator" : project.ide_library_path)
qbs.installDir: (qbs.targetOS.contains("windows") ? "lib/qtcreator" : project.ide_library_path)
+ "/qtcomponents"
files: [
"*.qml",

View File

@@ -17,8 +17,16 @@ unix:!macx:!isEmpty(copydata):SUBDIRS += bin
OTHER_FILES += dist/copyright_template.txt \
$$files(dist/changes-*) \
qtcreator.qbp \
qbs/pluginspec/pluginspec.qbs
qtcreator.qbs \
qbs/pluginspec/pluginspec.qbs \
$$files(dist/installer/ifw/config/config-*) \
dist/installer/ifw/packages/org.qtproject.qtcreator/meta/package.xml.in \
dist/installer/ifw/packages/org.qtproject.qtcreator.application/meta/installscript.qs \
dist/installer/ifw/packages/org.qtproject.qtcreator.application/meta/package.xml.in \
dist/installer/ifw/packages/org.qtproject.qtcreator.application/meta/license.txt \
$$files(scripts/*.py) \
$$files(scripts/*.sh) \
$$files(scripts/*.pl)
qmake_cache = $$targetPath($$IDE_BUILD_TREE/.qmake.cache)
!equals(QMAKE_HOST.os, Windows) {
@@ -50,6 +58,9 @@ else: PLATFORM = "unknown"
PATTERN = $${PLATFORM}$(INSTALL_EDITION)-$${QTCREATOR_VERSION}$(INSTALL_POSTFIX)
macx:INSTALLER_NAME = "qt-creator-$${QTCREATOR_VERSION}"
else:INSTALLER_NAME = "qt-creator-$${PATTERN}"
macx {
APPBUNDLE = "$$OUT_PWD/bin/Qt Creator.app"
BINDIST_SOURCE = "$$OUT_PWD/bin/Qt Creator.app"
@@ -83,7 +94,18 @@ bindist.commands = 7z a -mx9 $$OUT_PWD/qt-creator-$${PATTERN}.7z \"$$BINDIST_SOU
bindist_installer.depends = deployqt
bindist_installer.commands = 7z a -mx9 $${INSTALLER_ARCHIVE} \"$$BINDIST_INSTALLER_SOURCE\"
installer.depends = bindist_installer
installer.commands = $$PWD/scripts/packageIfw.py -i \"$(IFW_PATH)\" -v $${QTCREATOR_VERSION} -a \"$${INSTALLER_ARCHIVE}\" "qt-creator-$${PATTERN}"
installer.commands = $$PWD/scripts/packageIfw.py -i \"$(IFW_PATH)\" -v $${QTCREATOR_VERSION} -a \"$${INSTALLER_ARCHIVE}\" "$$INSTALLER_NAME"
macx {
# this should be very temporary:
MENU_NIB = $$(MENU_NIB_FILE)
isEmpty(MENU_NIB): MENU_NIB = "FATAT_SET_MENU_NIB_FILE_ENV"
copy_menu_nib_installer.commands = cp -R \"$$MENU_NIB\" \"$${INSTALLER_NAME}.app/Contents/Resources\"
codesign_installer.commands = codesign -s \"$(SIGNING_IDENTITY)\" $(SIGNING_FLAGS) \"$${INSTALLER_NAME}.app\"
dmg_installer.commands = hdiutil create -srcfolder "$${INSTALLER_NAME}.app" -volname \"Qt Creator\" -format UDBZ "qt-creator-$${PATTERN}-installer.dmg" -ov -scrub -stretch 2g
QMAKE_EXTRA_TARGETS += codesign_installer dmg_installer copy_menu_nib_installer
}
win32 {
deployqt.commands ~= s,/,\\\\,g

View File

@@ -8,31 +8,35 @@ Project {
property string ide_version_minor: '8'
property string ide_version_release: '81'
property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.' + ide_version_release
property string ide_app_path: qbs.targetOS == "mac" ? "" : "bin"
property string ide_app_target: qbs.targetOS == "mac" ? "Qt Creator" : "qtcreator"
property string ide_app_path: qbs.targetOS.contains("mac") ? "" : "bin"
property string ide_app_target: qbs.targetOS.contains("mac") ? "Qt Creator" : "qtcreator"
property string ide_library_path: {
if (qbs.targetOS == "mac")
if (qbs.targetOS.contains("mac"))
return ide_app_target + ".app/Contents/PlugIns"
else if (qbs.targetOS == "windows")
else if (qbs.targetOS.contains("windows"))
return ide_app_path
else
return "lib/qtcreator"
}
property string ide_plugin_path: {
if (qbs.targetOS == "mac")
if (qbs.targetOS.contains("mac"))
return ide_library_path
else if (qbs.targetOS == "windows")
else if (qbs.targetOS.contains("windows"))
return "lib/qtcreator/plugins"
else
return ide_library_path + "/plugins"
}
property string ide_data_path: qbs.targetOS == "mac" ? ide_app_target + ".app/Contents/Resources"
property string ide_data_path: qbs.targetOS.contains("mac")
? ide_app_target + ".app/Contents/Resources"
: "share/qtcreator"
property string ide_libexec_path: qbs.targetOS == "mac" ? ide_data_path
property string ide_libexec_path: qbs.targetOS.contains("mac")
? ide_data_path
: ide_app_path
property string ide_doc_path: qbs.targetOS == "mac" ? ide_data_path + "/doc"
property string ide_doc_path: qbs.targetOS.contains("mac")
? ide_data_path + "/doc"
: "share/doc/qtcreator"
property string ide_bin_path: qbs.targetOS == "mac" ? ide_app_target + ".app/Contents/MacOS"
property string ide_bin_path: qbs.targetOS.contains("mac")
? ide_app_target + ".app/Contents/MacOS"
: ide_app_path
moduleSearchPaths: "qbs"
@@ -170,7 +174,7 @@ Project {
name: project.ide_app_target
consoleApplication: qbs.debugInformation
cpp.rpaths: qbs.targetOS == "mac" ? ["@executable_path/.."]
cpp.rpaths: qbs.targetOS.contains("mac") ? ["@executable_path/.."]
: ["$ORIGIN/../lib/qtcreator"]
cpp.defines: Defaults.defines(qbs)
cpp.linkerFlags: {
@@ -205,7 +209,7 @@ Project {
Group {
name: "qtcreator.sh"
condition: qbs.targetPlatform.indexOf("unix") != -1 && qbs.targetOS != "mac"
condition: qbs.targetOS.contains("unix") && !qbs.targetOS.contains("mac")
files: "bin/qtcreator.sh"
qbs.install: true
qbs.installDir: "bin"
@@ -213,7 +217,7 @@ Project {
Group {
name: "QtLockedFile_unix"
condition: qbs.targetPlatform.indexOf("unix") != -1
condition: qbs.targetOS.contains("unix")
files: [
"src/shared/qtlockedfile/qtlockedfile_unix.cpp"
]
@@ -221,7 +225,7 @@ Project {
Group {
name: "QtLockedFile_win"
condition: qbs.targetOS == "windows"
condition: qbs.targetOS.contains("windows")
files: [
"src/shared/qtlockedfile/qtlockedfile_win.cpp"
]

52
scripts/createSourcePackages.sh Executable file
View File

@@ -0,0 +1,52 @@
#!/bin/bash
## Command line parameters
if [[ $# != 1 ]]; then
cat <<USAGE
usage:
$0 <version>
Creates tar and zip source package from HEAD of the main repository and submodules.
Files and directories are named after <version>.
example:
$0 2.2.0-beta
USAGE
exit 1
fi
VERSION=$1
PREFIX=qt-creator-${VERSION}-src
cd `dirname $0`/..
RESULTDIR=`pwd`
TEMPSOURCES=`mktemp -d -t qtcCreatorSourcePackage.XXXXXX`
echo "Temporary directory: ${TEMPSOURCES}"
echo "Creating tar archive..."
echo " Creating tar sources of repositories..."
git archive --format=tar --prefix=${PREFIX}/ HEAD > ${TEMPSOURCES}/__qtcreator_main.tar || exit 1
cd src/shared/qbs || exit 1
git archive --format=tar --prefix=${PREFIX}/src/shared/qbs/ HEAD > ${TEMPSOURCES}/__qtcreator_qbs.tar || exit 1
echo " Combining tar sources..."
cd ${TEMPSOURCES} || exit 1
tar xf __qtcreator_main.tar || exit 1
tar xf __qtcreator_qbs.tar || exit 1
tar czf "${RESULTDIR}/${PREFIX}.tar.gz" ${PREFIX}/ || exit 1
echo "Creating zip archive..."
echo " Filtering binary vs text files..."
# write filter for text files (for use with 'file' command)
echo ".*:.*ASCII
.*:.*directory
.*:.*empty
.*:.*POSIX
.*:.*html
.*:.*text" > __txtpattern || exit 1
# list all files
find ${PREFIX} > __packagedfiles || exit 1
# record file types
file -f __packagedfiles > __filetypes || exit 1
echo " Creating archive..."
# zip text files and binary files separately
cat __filetypes | grep -f __txtpattern -v | cut -d: -f1 | zip -9q "${RESULTDIR}/${PREFIX}.zip" -@ || exit 1
cat __filetypes | grep -f __txtpattern | cut -d: -f1 | zip -l9q "${RESULTDIR}/${PREFIX}.zip" -@ || exit 1

View File

@@ -1,42 +0,0 @@
#!/bin/bash
## Command line parameters
if [[ $# != 2 ]]; then
cat <<USAGE
usage:
$0 <refspec> <version>
Creates tar and zip source package from <refspec>.
Files and directories are named after <version>.
example:
$0 origin/2.2 2.2.0
USAGE
exit 1
fi
BRANCH=$1
VERSION=$2
cd `dirname $0`/..
RESULTDIR=`pwd`
echo "Creating tar archive..."
git archive --format=tar --prefix=qt-creator-${VERSION}-src/ ${BRANCH} | gzip > qt-creator-${VERSION}-src.tar.gz || exit 1
echo "Creating zip archive..."
# untargz the sources for the revision into temporary dir
TEMPSOURCES=`mktemp -d -t qtcCreatorSourcePackage.XXXXXX`
tar xzf qt-creator-${VERSION}-src.tar.gz -C "$TEMPSOURCES" || exit 1
cd $TEMPSOURCES || exit 1
# write filter for text files (for use with 'file' command)
echo ".*:.*ASCII
.*:.*directory
.*:.*empty
.*:.*POSIX
.*:.*html
.*:.*text" > __txtpattern || exit 1
# list all files
find qt-creator-${VERSION}-src > __packagedfiles || exit 1
# record file types
file -f __packagedfiles > __filetypes || exit 1
# zip text files and binary files separately
cat __filetypes | grep -f __txtpattern -v | cut -d: -f1 | zip -9q "$RESULTDIR"/qt-creator-${VERSION}-src.zip -@ || exit 1
cat __filetypes | grep -f __txtpattern | cut -d: -f1 | zip -l9q "$RESULTDIR"/qt-creator-${VERSION}-src.zip -@ || exit 1

View File

@@ -12,7 +12,7 @@ cp -a "${sourceFolder}/" "${intermediateFolder}"
ln -s /Applications "${intermediateFolder}"
cp "$(dirname "${BASH_SOURCE[0]}")/../LICENSE.LGPL" "${intermediateFolder}/LICENSE_LGPL.txt"
echo Creating image...
hdiutil create -srcfolder "${intermediateFolder}" -volname "${title}" -format UDBZ "${finalDMGName}" -ov -scrub -stretch 1g
hdiutil create -srcfolder "${intermediateFolder}" -volname "${title}" -format UDBZ "${finalDMGName}" -ov -scrub -stretch 2g
# clean up
rm -rf "${intermediateFolder}"

View File

@@ -88,7 +88,7 @@ def main():
installer_name = args[0]
config_postfix = ''
if sys.platform == 'darwin':
installer_name = installer_name + '.dmg'
config_postfix = '-mac'
if sys.platform.startswith('win'):
config_postfix = '-windows'
if sys.platform.startswith('linux'):

View File

@@ -32,6 +32,9 @@ def directBaseClass(typeobj, index = 0):
def createPointerValue(context, address, pointeeType):
return gdb.Value(address).cast(pointeeType.pointer())
def createReferenceValue(context, address, referencedType):
return gdb.Value(address).cast(referencedType.pointer()).dereference()
def savePrint(output):
try:
print(output)
@@ -1006,23 +1009,6 @@ def check(exp):
if not exp:
raise RuntimeError("Check failed")
def checkSimpleRef(ref):
count = ref["_q_value"]
check(count > 0)
check(count < 1000000)
def checkRef(ref):
try:
count = ref["atomic"]["_q_value"] # Qt 5.
minimum = -1
except:
count = ref["_q_value"] # Qt 4.
minimum = 0
# Assume there aren't a million references to any object.
check(count >= minimum)
check(count < 1000000)
#def couldBePointer(p, align):
# type = lookupType("unsigned int")
# ptr = gdb.Value(p).cast(type)
@@ -1042,12 +1028,8 @@ def checkPointer(p, align = 1):
if not isNull(p):
p.dereference()
def isAccessible(p):
try:
long(p)
return True
except:
return False
def pointerValue(p):
return long(p)
def isNull(p):
# The following can cause evaluation to abort with "UnicodeEncodeError"
@@ -2153,29 +2135,6 @@ class Dumper:
with Children(self):
self.putFields(value)
def tryPutObjectNameValue(self, value):
try:
# Is this derived from QObject?
dd = value["d_ptr"]["d"]
privateTypeName = self.ns + "QObjectPrivate"
privateType = lookupType(privateTypeName)
staticMetaObject = value["staticMetaObject"]
d_ptr = dd.cast(privateType.pointer()).dereference()
objectName = None
try:
objectName = d_ptr["objectName"]
except: # Qt 5
p = d_ptr["extraData"]
if not isNull(p):
objectName = p.dereference()["objectName"]
if not objectName is None:
data, size, alloc = qStringData(self, objectName)
if size > 0:
str = readRawMemory(data, 2 * size)
self.putValue(str, Hex4EncodedLittleEndian, 1)
except:
pass
def readRawMemory(self, base, size):
return readRawMemory(base, size)

View File

@@ -102,6 +102,7 @@ def call(value, func, *args):
#######################################################################
qqStringCutOff = 10000
qqWatchpointOffset = 10000
# This is a cache mapping from 'type name' to 'display alternatives'.
qqFormats = {}
@@ -220,11 +221,11 @@ BreakpointAtCatch = 5
BreakpointAtMain = 6
BreakpointAtFork = 7
BreakpointAtExec = 8
BreakpointAtSysCall = 10
WatchpointAtAddress = 11
WatchpointAtExpression = 12
BreakpointOnQmlSignalEmit = 13
BreakpointAtJavaScriptThrow = 14
BreakpointAtSysCall = 9
WatchpointAtAddress = 10
WatchpointAtExpression = 11
BreakpointOnQmlSignalEmit = 12
BreakpointAtJavaScriptThrow = 13
# See db.StateType
stateNames = ["invalid", "unloaded", "connected", "attaching", "launching", "stopped",
@@ -248,26 +249,17 @@ def isNull(p):
Value = lldb.SBValue
def checkSimpleRef(ref):
count = int(ref["_q_value"])
check(count > 0)
check(count < 1000000)
def checkRef(ref):
try:
count = int(ref["atomic"]["_q_value"]) # Qt 5.
minimum = -1
except:
count = int(ref["_q_value"]) # Qt 4.
minimum = 0
# Assume there aren't a million references to any object.
check(count >= minimum)
check(count < 1000000)
def pointerValue(value):
return value.GetValueAsUnsigned()
def createPointerValue(context, address, pointeeType):
addr = int(address) & 0xFFFFFFFFFFFFFFFF
return context.CreateValueFromAddress(None, addr, pointeeType).AddressOf()
def createReferenceValue(context, address, referencedType):
addr = int(address) & 0xFFFFFFFFFFFFFFFF
return context.CreateValueFromAddress(None, addr, referencedType)
def impl_SBValue__add__(self, offset):
if self.GetType().IsPointerType():
if isinstance(offset, int) or isinstance(offset, long):
@@ -340,7 +332,10 @@ lldb.SBType.unqualified = lambda self: self.GetUnqualifiedType()
lldb.SBType.pointer = lambda self: self.GetPointerType()
lldb.SBType.code = lambda self: self.GetTypeClass()
lldb.SBType.sizeof = property(lambda self: self.GetByteSize())
lldb.SBType.strip_typedefs = lambda self: self.GetCanonicalType()
lldb.SBType.strip_typedefs = \
lambda self: self.GetCanonicalType() if hasattr(self, 'GetCanonicalType') else self
lldb.SBType.__orig__str__ = lldb.SBType.__str__
lldb.SBType.__str__ = lldb.SBType.GetName
@@ -466,6 +461,9 @@ class SubItem:
value = component
value.SetPreferSyntheticValue(False)
self.name = value.GetName()
if self.name is None:
d.anonNumber += 1
self.name = "#%d" % d.anonNumber
else:
self.name = component
self.iname = "%s.%s" % (d.currentIName, self.name)
@@ -518,6 +516,12 @@ class SubItem:
self.d.currentAddress = self.savedCurrentAddress
return True
class UnnamedSubItem(SubItem):
def __init__(self, d, component):
self.d = d
self.iname = "%s.%s" % (self.d.currentIName, component)
self.name = None
class Dumper:
def __init__(self):
self.debugger = lldb.SBDebugger.Create()
@@ -851,6 +855,16 @@ class Dumper:
result += '],current-thread-id="%s"},' % self.currentThread().id
self.report(result)
def firstUsableFrame(self):
thread = self.currentThread()
for i in xrange(4):
frame = thread.GetFrameAtIndex(i)
lineEntry = frame.GetLineEntry()
line = lineEntry.GetLine()
if line != 0:
return i
return None
def reportStack(self, _ = None):
if self.process is None:
self.report('msg="No process"')
@@ -862,14 +876,11 @@ class Dumper:
n = thread.GetNumFrames()
if n > 4:
n = 4
firstUsable = None
for i in xrange(n):
frame = thread.GetFrameAtIndex(i)
lineEntry = frame.GetLineEntry()
line = lineEntry.GetLine()
usable = line != 0
if usable and not firstUsable:
firstUsable = i
result += '{pc="0x%x"' % frame.GetPC()
result += ',level="%d"' % frame.idx
result += ',addr="0x%x"' % frame.GetPCAddress().GetLoadAddress(self.target)
@@ -878,9 +889,7 @@ class Dumper:
result += ',fullname="%s"' % fileName(lineEntry.file)
result += ',usable="%d"' % usable
result += ',file="%s"},' % fileName(lineEntry.file)
if not firstUsable:
firstUsable = 0
result += '],hasmore="0",first-usable="%s"},' % firstUsable
result += '],hasmore="0"},'
self.report(result)
def putType(self, type, priority = 0):
@@ -915,8 +924,7 @@ class Dumper:
if limit is None:
return size
if limit == 0:
#return min(size, qqStringCutOff)
return min(size, 100)
return min(size, qqStringCutOff)
return min(size, limit)
def putValue(self, value, encoding = None, priority = 0):
@@ -956,6 +964,7 @@ class Dumper:
def putItem(self, value, tryDynamic=True):
#value = value.GetDynamicValue(lldb.eDynamicCanRunTarget)
typeName = value.GetTypeName()
value.SetPreferDynamicValue(tryDynamic)
if tryDynamic:
self.putAddress(value.address)
@@ -995,13 +1004,9 @@ class Dumper:
# References
if value.GetType().IsReferenceType():
type = value.GetType().GetDereferencedType().GetPointerType()
# FIXME: Find something more direct.
origType = value.GetTypeName();
value = value.CreateValueFromAddress(value.GetName(),
value.AddressOf().GetValueAsUnsigned(), type).Dereference()
#value = value.cast(value.dynamic_type)
self.putItem(value)
type = value.GetType().GetDereferencedType()
self.putItem(createReferenceValue(value, value.GetAddress(), type))
self.putBetterType(origType)
return
@@ -1014,12 +1019,13 @@ class Dumper:
self.putNumChild(0)
return
origType = value.GetType()
innerType = value.GetType().GetPointeeType()
self.putType(innerType)
savedCurrentChildType = self.currentChildType
self.currentChildType = str(innerType)
self.putItem(value.dereference())
inner = value.Dereference()
if inner.IsValid():
self.putItem(inner)
self.currentChildType = savedCurrentChildType
self.put('origaddr="%s",' % value.address)
return
@@ -1050,9 +1056,19 @@ class Dumper:
def putFields(self, value):
n = value.GetNumChildren()
m = value.GetType().GetNumberOfDirectBaseClasses()
if n > 10000:
n = 10000
for i in xrange(n):
# seems to happen in the 'inheritance' autotest
if m > n:
m = n
for i in xrange(m):
child = value.GetChildAtIndex(i)
with UnnamedSubItem(self, "@%d" % (i + 1)):
#self.put('iname="%s",' % self.currentIName)
self.put('name="[%s]",' % child.name)
self.putItem(child)
for i in xrange(m, n):
child = value.GetChildAtIndex(i)
with SubItem(self, child):
self.putItem(child)
@@ -1061,6 +1077,7 @@ class Dumper:
frame = self.currentThread().GetSelectedFrame()
self.currentIName = 'local'
self.put('data=[')
self.anonNumber = -1
for value in frame.GetVariables(True, True, False, False):
if self.dummyValue is None:
self.dummyValue = value
@@ -1171,7 +1188,15 @@ class Dumper:
self.report('exited={status="%s",desc="%s"}'
% (self.process.GetExitStatus(), self.process.GetExitDescription()))
if type == lldb.SBProcess.eBroadcastBitStateChanged:
self.reportData()
state = self.process.GetState()
if state == lldb.eStateStopped:
usableFrame = self.firstUsableFrame()
if usableFrame:
self.currentThread().SetSelectedFrame(usableFrame)
self.reportStack()
self.reportThreads()
self.reportLocation()
self.reportVariables()
elif type == lldb.SBProcess.eBroadcastBitInterrupt:
pass
elif type == lldb.SBProcess.eBroadcastBitSTDOUT:
@@ -1193,20 +1218,27 @@ class Dumper:
self.handleEvent(event)
def describeBreakpoint(self, bp, modelId):
cond = bp.GetCondition()
isWatch = isinstance(bp, lldb.SBWatchpoint)
if isWatch:
result = 'lldbid="%s"' % (qqWatchpointOffset + bp.GetID())
else:
result = 'lldbid="%s"' % bp.GetID()
result += ',modelid="%s"' % modelId
if not bp.IsValid():
return
result += ',hitcount="%s"' % bp.GetHitCount()
if hasattr(bp, 'GetThreadID'):
result += ',threadid="%s"' % bp.GetThreadID()
try:
if hasattr(bp, 'IsOneShot'):
result += ',oneshot="%s"' % (1 if bp.IsOneShot() else 0)
except:
pass
if hasattr(bp, 'GetCondition'):
cond = bp.GetCondition()
result += ',condition="%s"' % binascii.hexlify("" if cond is None else cond)
result += ',enabled="%s"' % (1 if bp.IsEnabled() else 0)
result += ',valid="%s"' % (1 if bp.IsValid() else 0)
result += ',condition="%s"' % ("" if cond is None else cond)
result += ',ignorecount="%s"' % bp.GetIgnoreCount()
result += ',locations=['
if hasattr(bp, 'GetNumLocations'):
for i in xrange(bp.GetNumLocations()):
loc = bp.GetLocationAtIndex(i)
addr = loc.GetAddress()
@@ -1227,6 +1259,8 @@ class Dumper:
str(args["file"]), int(args["line"]))
elif bpType == BreakpointByFunction:
bpNew = self.target.BreakpointCreateByName(args["function"])
elif bpType == BreakpointByAddress:
bpNew = self.target.BreakpointCreateByAddress(args["address"])
elif bpType == BreakpointAtMain:
bpNew = self.target.BreakpointCreateByName(
"main", self.target.GetExecutable().GetFilename())
@@ -1236,29 +1270,49 @@ class Dumper:
elif bpType == BreakpointAtCatch:
bpNew = self.target.BreakpointCreateForException(
lldb.eLanguageTypeC_plus_plus, True, False)
else:
warn("UNKNOWN TYPE")
bpNew.SetIgnoreCount(int(args["ignorecount"]))
bpNew.SetCondition(str(args["condition"]))
bpNew.SetEnabled(int(args["enabled"]))
elif bpType == WatchpointAtAddress:
error = lldb.SBError()
bpNew = self.target.WatchAddress(args["address"], 4, False, True, error)
#warn("BPNEW: %s" % bpNew)
self.reportError(error)
elif bpType == WatchpointAtExpression:
# FIXME: Top level-only for now.
try:
bpNew.SetOneShot(int(args["oneshot"]))
frame = self.currentFrame()
value = frame.FindVariable(args["expression"])
error = lldb.SBError()
bpNew = self.target.WatchAddress(value.GetAddress(),
value.GetByteSize(), False, True, error)
except:
pass
return
else:
warn("UNKNOWN BREAKPOINT TYPE: %s" % bpType)
return
bpNew.SetIgnoreCount(int(args["ignorecount"]))
if hasattr(bpNew, 'SetCondition'):
bpNew.SetCondition(binascii.unhexlify(args["condition"]))
bpNew.SetEnabled(int(args["enabled"]))
if hasattr(bpNew, 'SetOneShot'):
bpNew.SetOneShot(int(args["oneshot"]))
return bpNew
def changeBreakpoint(self, args):
bpChange = self.target.FindBreakpointByID(int(args["lldbid"]))
bpChange.SetIgnoreCount(int(args["ignorecount"]))
bpChange.SetCondition(str(args["condition"]))
bpChange.SetEnabled(int(args["enabled"]))
try:
bpChange.SetOneShot(int(args["oneshot"]))
except:
pass
id = int(args["lldbid"])
if id > qqWatchpointOffset:
bp = self.target.FindWatchpointByID(id)
else:
bp = self.target.FindBreakpointByID(id)
bp.SetIgnoreCount(int(args["ignorecount"]))
bp.SetCondition(binascii.unhexlify(args["condition"]))
bp.SetEnabled(int(args["enabled"]))
if hasattr(bp, 'SetOneShot'):
bp.SetOneShot(int(args["oneshot"]))
def removeBreakpoint(self, args):
return self.target.BreakpointDelete(int(args["lldbid"]))
id = int(args['lldbid'])
if id > qqWatchpointOffset:
return self.target.DeleteWatchpoint(id - qqWatchpointOffset)
return self.target.BreakpointDelete(id)
def handleBreakpoints(self, args):
result = 'bkpts=['
@@ -1391,7 +1445,6 @@ class Dumper:
self.reportData()
def updateData(self, args):
warn("UPDATE 1")
if 'expanded' in args:
self.expandedINames = set(args['expanded'].split(','))
if 'autoderef' in args:
@@ -1404,7 +1457,6 @@ class Dumper:
self.passExceptions = int(args['passexceptions'])
self.passExceptions = True # FIXME
self.reportVariables(args)
warn("UPDATE 2")
def disassemble(self, args):
frame = self.currentFrame();

View File

@@ -18,23 +18,40 @@ movableTypes = set([
"QXmlStreamNotationDeclaration", "QXmlStreamEntityDeclaration"
])
def qByteArrayData(d, value):
private = value['d'].dereference()
checkRef(private['ref'])
size = int(private['size'])
alloc = int(private['alloc'])
def checkSimpleRef(ref):
count = int(ref["_q_value"])
check(count > 0)
check(count < 1000000)
def checkRef(ref):
try:
count = int(ref["atomic"]["_q_value"]) # Qt 5.
minimum = -1
except:
count = int(ref["_q_value"]) # Qt 4.
minimum = 0
# Assume there aren't a million references to any object.
check(count >= minimum)
check(count < 1000000)
def qByteArrayDataData(d, value):
checkRef(value['ref'])
size = int(value['size'])
alloc = int(value['alloc'])
try:
# Qt 5. Will fail on Qt 4 due to the missing 'offset' member.
addr = d.addressOf(private) + int(private['offset'])
addr = d.addressOf(value) + int(value['offset'])
except:
# Qt 4:
addr = private['data']
addr = value['data']
return createPointerValue(value, addr, d.charType()), size, alloc
qStringData = qByteArrayData
def qByteArrayData(d, value):
return d.byteArrayDataData(value['d'].dereference())
def qEncodeByteArray(d, value, limit = None):
data, size, alloc = qByteArrayData(d, value)
data, size, alloc = d.byteArrayData(value)
if alloc != 0:
check(0 <= size and size <= alloc and alloc <= 100*1000*1000)
limit = d.computeLimit(size, limit)
@@ -44,7 +61,7 @@ def qEncodeByteArray(d, value, limit = None):
return s
def qEncodeString(d, value, limit = 0):
data, size, alloc = qStringData(d, value)
data, size, alloc = d.stringData(value)
if alloc != 0:
check(0 <= size and size <= alloc and alloc <= 100*1000*1000)
limit = d.computeLimit(size, limit)
@@ -53,12 +70,6 @@ def qEncodeString(d, value, limit = 0):
s += "2e002e002e00"
return s
def qPutByteArrayValue(d, value):
d.putValue(qEncodeByteArray(d, value), Hex2EncodedLatin1)
def qPutStringValue(d, value):
d.putValue(qEncodeString(d, value), Hex4EncodedLittleEndian)
def mapForms():
return "Normal,Compact"
@@ -87,16 +98,21 @@ def qPutMapName(d, value):
Dumper.encodeByteArray = qEncodeByteArray
Dumper.byteArrayData = qByteArrayData
Dumper.putByteArrayValue = qPutByteArrayValue
Dumper.byteArrayDataData = qByteArrayDataData
Dumper.putByteArrayValue = \
lambda d, value: d.putValue(d.encodeByteArray(value), Hex2EncodedLatin1)
Dumper.putStringValue = \
lambda d, value: d.putValue(d.encodeString(value), Hex4EncodedLittleEndian)
Dumper.encodeString = qEncodeString
Dumper.stringData = qStringData
Dumper.putStringValue = qPutStringValue
Dumper.stringData = Dumper.byteArrayData
Dumper.putMapName = qPutMapName
Dumper.isMapCompact = \
lambda d, keyType, valueType: qMapCompact(d.currentItemFormat(), keyType, valueType)
# Returns True when it encounters a QObject or derived class.
def tryPutObjectNameValue(d, value):
try:
# Is this derived from QObject?
@@ -116,8 +132,9 @@ def tryPutObjectNameValue(d, value):
if size > 0:
str = d.readRawMemory(data, 2 * size)
d.putValue(str, Hex4EncodedLittleEndian, 1)
return True
except:
pass
return False
Dumper.tryPutObjectNameValue = tryPutObjectNameValue
@@ -144,22 +161,29 @@ def qdump__QBasicAtomicPointer(d, value):
with Children(d):
d.putItem(value["_q_value"])
def qdump__QByteArrayData(d, value):
data, size, alloc = d.byteArrayDataData(value)
d.putValue(d.readRawMemory(data, size), Hex2EncodedLatin1)
d.putNumChild(size)
if d.isExpanded():
d.putArrayData(d.charType(), data, size)
def qform__QByteArray():
return "Inline,As Latin1 in Separate Window,As UTF-8 in Separate Window"
def qdump__QByteArray(d, value):
d.putByteArrayValue(value)
data, size, alloc = qByteArrayData(d, value)
data, size, alloc = d.byteArrayData(value)
d.putNumChild(size)
format = d.currentItemFormat()
if format == 1:
d.putDisplay(StopDisplay)
elif format == 2:
d.putField("editformat", DisplayLatin1String)
d.putField("editvalue", qEncodeByteArray(d, value, None))
d.putField("editvalue", d.encodeByteArray(value, None))
elif format == 3:
d.putField("editformat", DisplayUtf8String)
d.putField("editvalue", qEncodeByteArray(d, value, None))
d.putField("editvalue", d.encodeByteArray(value, None))
if d.isExpanded():
d.putArrayData(d.charType(), data, size)
@@ -313,47 +337,50 @@ def qdump__QTime(d, value):
d.putValue(value["mds"], MillisecondsSinceMidnight)
d.putNumChild(1)
if d.isExpanded():
qt = d.ns + "Qt::"
qtdate = d.ns + "Qt::"
qttime = d.ns + "Qt::"
if lldbLoaded:
qt += "DateFormat::" # FIXME: Bug?...
qtdate += "DateFormat::" # FIXME: Bug?...
qttime += "TimeSpec::"
# FIXME: This improperly uses complex return values.
with Children(d):
d.putCallItem("toString", value, "toString", qt + "TextDate")
d.putCallItem("(ISO)", value, "toString", qt + "ISODate")
d.putCallItem("toString", value, "toString", qtdate + "TextDate")
d.putCallItem("(ISO)", value, "toString", qtdate + "ISODate")
d.putCallItem("(SystemLocale)", value, "toString",
qt + "SystemLocaleDate")
d.putCallItem("(Locale)", value, "toString", qt + "LocaleDate")
d.putCallItem("toUTC", value, "toTimeSpec", qt + "UTC")
qtdate + "SystemLocaleDate")
d.putCallItem("(Locale)", value, "toString", qtdate + "LocaleDate")
d.putCallItem("toUTC", value, "toTimeSpec", qttime + "UTC")
else:
d.putValue("(invalid)")
d.putNumChild(0)
# This relies on the Qt4/Qt5 internal structure layout:
# {sharedref(4), date(8), time(4+x)}
def qdump__QDateTime(d, value):
try:
# Fails without debug info.
p = value["d"]["d"].dereference()
except:
d.putPlainChildren(value)
return
mds = int(p["time"]["mds"])
intType = d.lookupType("int")
intPtrType = intType.pointer()
base = pointerValue(value.cast(intPtrType))
mds = int(createReferenceValue(value, base + intPtrType.sizeof + 8, intType))
if mds >= 0:
d.putValue("%s/%s" % (int(p["date"]["jd"]), mds),
JulianDateAndMillisecondsSinceMidnight)
jd = int(createReferenceValue(value, base + intPtrType.sizeof, intType))
d.putValue("%s/%s" % (jd, mds), JulianDateAndMillisecondsSinceMidnight)
d.putNumChild(1)
if d.isExpanded():
# FIXME: This improperly uses complex return values.
with Children(d):
qt = d.ns + "Qt::"
qtdate = d.ns + "Qt::"
qttime = d.ns + "Qt::"
if lldbLoaded:
qt += "DateFormat::" # FIXME: Bug?...
qtdate += "DateFormat::" # FIXME: Bug?...
qttime += "TimeSpec::" # FIXME: Bug?...
d.putCallItem("toTime_t", value, "toTime_t")
d.putCallItem("toString", value, "toString", qt + "TextDate")
d.putCallItem("(ISO)", value, "toString", qt + "ISODate")
d.putCallItem("(SystemLocale)", value, "toString", qt + "SystemLocaleDate")
d.putCallItem("(Locale)", value, "toString", qt + "LocaleDate")
d.putCallItem("toUTC", value, "toTimeSpec", qt + "UTC")
d.putCallItem("toLocalTime", value, "toTimeSpec", qt + "LocalTime")
d.putCallItem("toString", value, "toString", qtdate + "TextDate")
d.putCallItem("(ISO)", value, "toString", qtdate + "ISODate")
d.putCallItem("(SystemLocale)", value, "toString", qtdate + "SystemLocaleDate")
d.putCallItem("(Locale)", value, "toString", qtdate + "LocaleDate")
d.putCallItem("toUTC", value, "toTimeSpec", qttime + "UTC")
d.putCallItem("toLocalTime", value, "toTimeSpec", qttime + "LocalTime")
else:
d.putValue("(invalid)")
d.putNumChild(0)
@@ -627,7 +654,7 @@ def qdump__QHostAddress(d, value):
if int(data["ipString"]["d"]["size"]):
d.putStringValue(data["ipString"])
else:
a = long(data["a"])
a = int(data["a"])
a, n4 = divmod(a, 256)
a, n3 = divmod(a, 256)
a, n2 = divmod(a, 256)
@@ -684,20 +711,12 @@ def qform__QImage():
return "Normal,Displayed"
def qdump__QImage(d, value):
try:
painters = int(value["painters"])
except:
d.putPlainChildren(value)
return
check(0 <= painters and painters < 1000)
d_ptr = value["d"]
if isNull(d_ptr):
d.putValue("(null)")
else:
checkSimpleRef(d_ptr["ref"])
d.putValue("(%dx%d)" % (d_ptr["width"], d_ptr["height"]))
bits = d_ptr["data"]
nbytes = d_ptr["nbytes"]
# This relies on current QImage layout
intPtrType = d.lookupType("int").pointer()
base = createReferenceValue(value, d.addressOf(value) + 3 * intPtrType.sizeof, intPtrType)
width = int(base[1])
height = int(base[2])
d.putValue("(%dx%d)" % (width, height))
d.putNumChild(0)
#d.putNumChild(1)
if d.isExpanded():
@@ -710,13 +729,16 @@ def qdump__QImage(d, value):
if format == 1:
d.putDisplay(StopDisplay)
elif format == 2:
d_ptr = value["d"]
bits = d_ptr["data"]
nbytes = d_ptr["nbytes"]
if False:
# Take four bytes at a time, this is critical for performance.
# In fact, even four at a time is too slow beyond 100x100 or so.
d.putField("editformat", DisplayImageData)
d.put('%s="' % name)
d.put("%08x" % int(d_ptr["width"]))
d.put("%08x" % int(d_ptr["height"]))
d.put("%08x" % width)
d.put("%08x" % height)
d.put("%08x" % int(d_ptr["format"]))
p = bits.cast(d.intType().pointer())
for i in xrange(nbytes / 4):
@@ -731,7 +753,7 @@ def qdump__QImage(d, value):
gdb.execute("dump binary memory %s %s %s" %
(filename, cleanAddress(p), cleanAddress(p + nbytes)))
d.putDisplay(DisplayImageFile, " %d %d %d %s"
% (d_ptr["width"], d_ptr["height"], d_ptr["format"], filename))
% (width, height, d_ptr["format"], filename))
def qdump__QLinkedList(d, value):
@@ -970,9 +992,6 @@ def qdump__QObject(d, value):
d_ptr = dd.cast(privateType.pointer()).dereference()
#warn("D_PTR: %s " % d_ptr)
mo = d_ptr["metaObject"]
if not isAccessible(mo):
d.putInaccessible()
return
if isNull(mo):
mo = staticMetaObject
#warn("MO: %s " % mo)
@@ -1067,7 +1086,7 @@ def qdump__QObject(d, value):
for i in xrange(dynamicPropertyCount):
with SubItem(d, i):
pp = p.cast(namesType.pointer()).dereference();
d.putField("key", qEncodeByteArray(d, pp))
d.putField("key", d.encodeByteArray(pp))
d.putField("keyencoded", Hex2EncodedLatin1)
qq = q.cast(valuesType.pointer().pointer())
qq = qq.dereference();
@@ -1599,7 +1618,7 @@ def qedit__QString(expr, value):
cmd = "call (%s).resize(%d)" % (expr, len(value))
gdb.execute(cmd)
d = gdb.parse_and_eval(expr)["d"]["data"]
cmd = "set {short[%d]}%s={" % (len(value), long(d))
cmd = "set {short[%d]}%s={" % (len(value), pointerValue(d))
for i in range(len(value)):
if i != 0:
cmd += ','
@@ -1618,12 +1637,12 @@ def qdump__QString(d, value):
d.putDisplay(StopDisplay)
elif format == 2:
d.putField("editformat", DisplayUtf16String)
d.putField("editvalue", qEncodeString(d, value, None))
d.putField("editvalue", d.encodeString(value, None))
def qdump__QStringRef(d, value):
s = value["m_string"].dereference()
data, size, alloc = qStringData(d, s)
data, size, alloc = d.stringData(s)
data += 2 * int(value["m_position"])
size = value["m_size"]
s = d.readRawMemory(data, 2 * size)
@@ -1695,10 +1714,10 @@ def qdump__QUrl(d, value):
try:
# Qt 5
data = value["d"].dereference()
str = qEncodeString(d, data["scheme"])
str = d.encodeString(data["scheme"])
str += "3a002f002f00"
str += qEncodeString(d, data["host"])
str += qEncodeString(d, data["path"])
str += d.encodeString(data["host"])
str += d.encodeString(data["path"])
d.putValue(str, Hex4EncodedLittleEndian)
except:
d.putPlainChildren(value)
@@ -1907,7 +1926,7 @@ def qedit__QVector(expr, value):
gdb.execute(cmd)
innerType = d.templateArgument(ob.type, 0)
ptr = ob["p"]["array"].cast(d.voidPtrType())
cmd = "set {%s[%d]}%s={%s}" % (innerType, len(values), long(ptr), value)
cmd = "set {%s[%d]}%s={%s}" % (innerType, len(values), pointerValue(ptr), value)
gdb.execute(cmd)
@@ -2003,7 +2022,7 @@ def qdump____c_style_array__(d, value):
# Explicitly requested Local 8-bit formatting.
d.putValue(blob, Hex2EncodedLocal8Bit)
else:
d.putValue("@0x%x" % long(value.cast(targetType.pointer())))
d.putValue("@0x%x" % pointerValue(value.cast(targetType.pointer())))
if d.currentIName in d.expandedINames:
p = value.address
@@ -2295,10 +2314,10 @@ def qdump__std__shared_ptr(d, value):
return
if isSimpleType(d.templateArgument(value.type, 0)):
d.putValue("%s @0x%x" % (i.dereference(), long(i)))
d.putValue("%s @0x%x" % (i.dereference(), pointerValue(i)))
else:
i = expensiveDowncast(i)
d.putValue("@0x%x" % long(i))
d.putValue("@0x%x" % pointerValue(i))
d.putNumChild(3)
with Children(d, 3):
@@ -2316,10 +2335,10 @@ def qdump__std__unique_ptr(d, value):
return
if isSimpleType(d.templateArgument(value.type, 0)):
d.putValue("%s @0x%x" % (i.dereference(), long(i)))
d.putValue("%s @0x%x" % (i.dereference(), pointerValue(i)))
else:
i = expensiveDowncast(i)
d.putValue("@0x%x" % long(i))
d.putValue("@0x%x" % pointerValue(i))
d.putNumChild(1)
with Children(d, 1):
@@ -2440,17 +2459,17 @@ def qdump__boost__bimaps__bimap(d, value):
def qdump__boost__optional(d, value):
if value["m_initialized"] == False:
if int(value["m_initialized"]) == 0:
d.putValue("<uninitialized>")
d.putNumChild(0)
else:
d.putBetterType(value.type)
type = d.templateArgument(value.type, 0)
storage = value["m_storage"]
if type.code == ReferenceCode:
d.putItem(storage.cast(type.target().pointer()).dereference())
else:
d.putItem(storage.cast(type))
d.putBetterType(value.type)
def qdump__boost__shared_ptr(d, value):
@@ -2479,6 +2498,7 @@ def qdump__boost__shared_ptr(d, value):
if isSimpleType(val.type):
d.putNumChild(3)
d.putItem(val)
d.putBetterType(value.type)
else:
d.putEmptyValue()
@@ -2491,18 +2511,18 @@ def qdump__boost__shared_ptr(d, value):
def qdump__boost__gregorian__date(d, value):
d.putValue(value["days_"], JulianDate)
d.putValue(int(value["days_"]), JulianDate)
d.putNumChild(0)
def qdump__boost__posix_time__ptime(d, item):
ms = long(item["time_"]["time_count_"]["value_"]) / 1000
ms = int(item["time_"]["time_count_"]["value_"]) / 1000
d.putValue("%s/%s" % divmod(ms, 86400000), JulianDateAndMillisecondsSinceMidnight)
d.putNumChild(0)
def qdump__boost__posix_time__time_duration(d, item):
d.putValue(long(item["ticks_"]["value_"]) / 1000, MillisecondsSinceMidnight)
d.putValue(int(item["ticks_"]["value_"]) / 1000, MillisecondsSinceMidnight)
d.putNumChild(0)
@@ -2569,11 +2589,11 @@ def qdump__QTJSC__JSValue(d, value):
payload = value["u"]["asBits"]["payload"]
#d.putIntItem("tag", tag)
with SubItem(d, "tag"):
d.putValue(jstagAsString(long(tag)))
d.putValue(jstagAsString(int(tag)))
d.putNoType()
d.putNumChild(0)
d.putIntItem("payload", long(payload))
d.putIntItem("payload", int(payload))
d.putFields(value["u"])
if tag == -2:
@@ -2607,12 +2627,12 @@ def qdump__QScriptValue(d, value):
d.putValue("(invalid)")
d.putNumChild(0)
return
if long(dd["type"]) == 1: # Number
if int(dd["type"]) == 1: # Number
d.putValue(dd["numberValue"])
d.putType("%sQScriptValue (Number)" % d.ns)
d.putNumChild(0)
return
if long(dd["type"]) == 2: # String
if int(dd["type"]) == 2: # String
d.putStringValue(dd["stringValue"])
d.putType("%sQScriptValue (String)" % d.ns)
return
@@ -2621,8 +2641,8 @@ def qdump__QScriptValue(d, value):
x = dd["jscValue"]["u"]
tag = x["asBits"]["tag"]
payload = x["asBits"]["payload"]
#isValid = long(x["asBits"]["tag"]) != -6 # Empty
#isCell = long(x["asBits"]["tag"]) == -2
#isValid = int(x["asBits"]["tag"]) != -6 # Empty
#isCell = int(x["asBits"]["tag"]) == -2
#warn("IS CELL: %s " % isCell)
#isObject = False
#className = "UNKNOWN NAME"
@@ -2639,7 +2659,7 @@ def qdump__QScriptValue(d, value):
# warn("DYNAMIC TYPE: %s" % dtype)
# warn("STATUC %s" % cell.type)
# type = cell["m_structure"]["m_typeInfo"]["m_type"]
# isObject = long(type) == 7 # ObjectType;
# isObject = int(type) == 7 # ObjectType;
# className = "UNKNOWN NAME"
#warn("IS OBJECT: %s " % isObject)
@@ -2753,14 +2773,14 @@ def qdump__Utils__ElfSection(d, value):
d.putPlainChildren(value)
def qdump__CPlusPlus__Token(d, value):
k = value["f"]["kind"];
if long(k) == 6:
k = int(value["f"]["kind"])
if int(k) == 6:
d.putValue("T_IDENTIFIER. offset: %d, len: %d"
% (value["offset"], value["f"]["length"]))
elif long(k) == 7:
elif int(k) == 7:
d.putValue("T_NUMERIC_LITERAL. offset: %d, value: %d"
% (value["offset"], value["f"]["length"]))
elif long(k) == 60:
elif int(k) == 60:
d.putValue("T_RPAREN")
else:
d.putValue("Type: %s" % k)
@@ -2769,8 +2789,8 @@ def qdump__CPlusPlus__Token(d, value):
def qdump__CPlusPlus__Internal__PPToken(d, value):
k = value["f"]["kind"];
data, size, alloc = d.byteArrayData(value["m_src"])
length = long(value["f"]["length"])
offset = long(value["offset"])
length = int(value["f"]["length"])
offset = int(value["offset"])
#warn("size: %s, alloc: %s, offset: %s, length: %s, data: %s"
# % (size, alloc, offset, length, data))
d.putValue(encodeCharArray(data + offset, 100, length),
@@ -2909,9 +2929,9 @@ if False:
def qdump__basic__Function(d, value):
min = value["min"]
max = value["max"]
data, size, alloc = qByteArrayData(d, value["var"])
data, size, alloc = d.byteArrayData(value["var"])
var = extractCString(data, 0)
data, size, alloc = qByteArrayData(d, value["f"])
data, size, alloc = d.byteArrayData(value["f"])
f = extractCString(data, 0)
d.putValue("%s, %s=%f..%f" % (f, var, min, max))
d.putNumChild(0)

View File

@@ -103,12 +103,9 @@ void GraphicalNodeInstance::createEffectItem(bool createEffectItem)
s_createEffectItem = createEffectItem;
}
void GraphicalNodeInstance::updateDirtyNodeRecursive()
void GraphicalNodeInstance::updateAllDirtyNodesRecursive()
{
foreach (QQuickItem *childItem, quickItem()->childItems())
updateDirtyNodeRecursive(childItem);
DesignerSupport::updateDirtyNode(quickItem());
updateAllDirtyNodesRecursive(quickItem());
}
GraphicalNodeInstance::~GraphicalNodeInstance()
@@ -117,27 +114,27 @@ GraphicalNodeInstance::~GraphicalNodeInstance()
designerSupport()->derefFromEffectItem(quickItem());
}
void GraphicalNodeInstance::updateDirtyNodeRecursive(QQuickItem *parentItem) const
void GraphicalNodeInstance::updateDirtyNodesRecursive(QQuickItem *parentItem) const
{
foreach (QQuickItem *childItem, parentItem->childItems()) {
if (!nodeInstanceServer()->hasInstanceForObject(childItem))
updateDirtyNodeRecursive(childItem);
updateDirtyNodesRecursive(childItem);
}
DesignerSupport::updateDirtyNode(parentItem);
}
void GraphicalNodeInstance::updateAllDirtyNodeRecursive(QQuickItem *parentItem) const
void GraphicalNodeInstance::updateAllDirtyNodesRecursive(QQuickItem *parentItem) const
{
foreach (QQuickItem *childItem, parentItem->childItems())
updateDirtyNodeRecursive(childItem);
updateAllDirtyNodesRecursive(childItem);
DesignerSupport::updateDirtyNode(parentItem);
}
QImage GraphicalNodeInstance::renderImage() const
{
updateDirtyNodeRecursive(quickItem());
updateDirtyNodesRecursive(quickItem());
QRectF renderBoundingRect = boundingRect();
@@ -485,20 +482,6 @@ QPair<PropertyName, ServerNodeInstance> GraphicalNodeInstance::anchor(const Prop
}
static void doComponentCompleteRecursive(QQuickItem *item)
{
if (item) {
if (DesignerSupport::isComponentComplete(item))
return;
foreach (QQuickItem *childItem, item->childItems())
doComponentCompleteRecursive(childItem);
static_cast<QQmlParserStatus*>(item)->componentComplete();
}
}
static void disableTextCursor(QQuickItem *item)
{
foreach (QQuickItem *childItem, item->childItems())
@@ -515,7 +498,7 @@ static void disableTextCursor(QQuickItem *item)
void GraphicalNodeInstance::doComponentComplete()
{
doComponentCompleteRecursive(quickItem());
doComponentCompleteRecursive(quickItem(), nodeInstanceServer());
disableTextCursor(quickItem());

View File

@@ -40,7 +40,7 @@ public:
QList<ServerNodeInstance> childItems() const;
void updateDirtyNodeRecursive();
void updateAllDirtyNodesRecursive();
static void createEffectItem(bool createEffectItem);
int penWidth() const;
@@ -64,8 +64,8 @@ protected:
void setHasContent(bool hasContent);
DesignerSupport *designerSupport() const;
Qt5NodeInstanceServer *qt5NodeInstanceServer() const;
void updateDirtyNodeRecursive(QQuickItem *parentItem) const;
void updateAllDirtyNodeRecursive(QQuickItem *parentItem) const;
void updateDirtyNodesRecursive(QQuickItem *parentItem) const;
void updateAllDirtyNodesRecursive(QQuickItem *parentItem) const;
QRectF boundingRectWithStepChilds(QQuickItem *parentItem) const;
void resetHorizontal();
void resetVertical();

View File

@@ -475,8 +475,13 @@ QList<ServerNodeInstance> NodeInstanceServer::setupInstances(const CreateSceneC
setInstanceAuxiliaryData(container);
}
foreach (ServerNodeInstance instance, instanceList)
QListIterator<ServerNodeInstance> instanceListIterator(instanceList);
instanceListIterator.toBack();
while (instanceListIterator.hasPrevious()) {
ServerNodeInstance instance = instanceListIterator.previous();
instance.doComponentComplete();
}
return instanceList;
}

View File

@@ -459,7 +459,7 @@ QVariant ObjectNodeInstance::fixResourcePaths(const QVariant &value)
return value;
}
void ObjectNodeInstance::updateDirtyNodeRecursive()
void ObjectNodeInstance::updateAllDirtyNodesRecursive()
{
}
@@ -1179,6 +1179,38 @@ QObject *ObjectNodeInstance::parentObject(QObject *object)
return object->parent();
}
void ObjectNodeInstance::doComponentCompleteRecursive(QObject *object, NodeInstanceServer *nodeInstanceServer)
{
if (object) {
QQuickItem *item = qobject_cast<QQuickItem*>(object);
if (item && DesignerSupport::isComponentComplete(item))
return;
QList<QObject*> childList = object->children();
if (item) {
foreach (QQuickItem *childItem, item->childItems()) {
if (!childList.contains(childItem))
childList.append(childItem);
}
}
foreach (QObject *child, childList) {
if (!nodeInstanceServer->hasInstanceForObject(child))
doComponentCompleteRecursive(child, nodeInstanceServer);
}
if (item) {
static_cast<QQmlParserStatus*>(item)->componentComplete();
} else {
QQmlParserStatus *qmlParserStatus = dynamic_cast< QQmlParserStatus*>(object);
if (qmlParserStatus)
qmlParserStatus->componentComplete();
}
}
}
ObjectNodeInstance::Pointer ObjectNodeInstance::parentInstance() const
{
QObject *parentHolder = parent();
@@ -1247,9 +1279,7 @@ bool ObjectNodeInstance::resetStateProperty(const ObjectNodeInstance::Pointer &/
void ObjectNodeInstance::doComponentComplete()
{
QQmlParserStatus *qmlParserStatus = dynamic_cast< QQmlParserStatus*>(object());
if (qmlParserStatus)
qmlParserStatus->componentComplete();
doComponentCompleteRecursive(object(), nodeInstanceServer());
}
bool ObjectNodeInstance::isRootNodeInstance() const

View File

@@ -186,7 +186,7 @@ public:
static QVariant fixResourcePaths(const QVariant &value);
virtual void updateDirtyNodeRecursive();
virtual void updateAllDirtyNodesRecursive();
protected:
explicit ObjectNodeInstance(QObject *object);
@@ -196,6 +196,7 @@ protected:
void deleteObjectsInList(const QQmlProperty &metaProperty);
QVariant convertSpecialCharacter(const QVariant& value) const;
static QObject *parentObject(QObject *object);
static void doComponentCompleteRecursive(QObject *object, NodeInstanceServer *nodeInstanceServer);
private:
QHash<PropertyName, QVariant> m_resetValueHash;

View File

@@ -158,7 +158,7 @@ bool ServerNodeInstance::holdsGraphical() const
void ServerNodeInstance::updateDirtyNodeRecursive()
{
m_nodeInstance->updateDirtyNodeRecursive();
m_nodeInstance->updateAllDirtyNodesRecursive();
}
bool ServerNodeInstance::isSubclassOf(const QString &superTypeName) const

View File

@@ -1777,7 +1777,7 @@
<name>Core::ModeManager</name>
<message>
<source>Switch to &lt;b&gt;%1&lt;/b&gt; mode</source>
<translation>Gehe zu Mode &lt;b&gt;&apos;%1&apos;&lt;/b&gt;</translation>
<translation>Gehe zu Modus &lt;b&gt;&apos;%1&apos;&lt;/b&gt;</translation>
</message>
</context>
<context>
@@ -5116,6 +5116,10 @@ Grund: %3</translation>
<extracomment>Look-up of a stash via its descriptive message failed.</extracomment>
<translation>Es konnte kein Stash mit der Beschreibung &quot;%1&quot; im Repository &quot;%2&quot; gefunden werden.</translation>
</message>
<message>
<source>Cannot retrieve submodule status of &quot;%1&quot;: %2</source>
<translation>Der Status des Sub-Modules &quot;%1&quot; konnte nicht bestimmt werden: %2</translation>
</message>
<message>
<source>There were warnings while applying &quot;%1&quot; to &quot;%2&quot;:
%3</source>
@@ -5693,7 +5697,7 @@ Jetzt Commit durchführen?</translation>
</message>
<message>
<source>Actions on Commits...</source>
<translation>Aktionen bei Commits...</translation>
<translation>Aktionen mit Commits...</translation>
</message>
<message>
<source>Commit</source>
@@ -6287,7 +6291,7 @@ Add, modify, and remove document filters, which determine the documentation set
</message>
<message>
<source>Previous Page</source>
<translation>Vorangehender Seite</translation>
<translation>Vorangehende Seite</translation>
</message>
<message>
<source>Next Page</source>
@@ -9370,22 +9374,6 @@ Wählt eine für Desktop-Entwicklung geeignete Qt-Version aus, sofern sie verfü
<source>Configuration unchanged, skipping qmake step.</source>
<translation>Unveränderte Konfiguration, qmake-Schritt wird übersprungen.</translation>
</message>
<message>
<source>No Qt version.</source>
<translation>Keine Qt-Version.</translation>
</message>
<message>
<source>Invalid Qt version.</source>
<translation>Ungültige Qt-Version.</translation>
</message>
<message>
<source>Requires Qt 4.7.1 or newer.</source>
<translation>Erfordert Qt 4.7.1 oder neuer.</translation>
</message>
<message>
<source>Library not available. &lt;a href=&apos;compile&apos;&gt;Compile...&lt;/a&gt;</source>
<translation>Bibliothek nicht verfügbar. &lt;a href=&apos;compile&apos;&gt;Kompilieren...&lt;/a&gt;</translation>
</message>
</context>
<context>
<name>Qt4ProjectManager::QMakeStepConfigWidget</name>
@@ -9397,10 +9385,6 @@ Wählt eine für Desktop-Entwicklung geeignete Qt-Version aus, sofern sie verfü
<source>The option will only take effect if the project is recompiled. Do you want to recompile now?</source>
<translation>Diese Einstellung wird nur nach einer Neuerstellung des Projekts wirksam. Möchten Sie das Projekt neu erstellen?</translation>
</message>
<message>
<source>Building helpers</source>
<translation>Ausgabe-Hilfsbibliothek</translation>
</message>
<message>
<source>&lt;b&gt;qmake:&lt;/b&gt; No Qt version set. Cannot run qmake.</source>
<translation>&lt;b&gt;qmake:&lt;/b&gt; Es ist keine Qt-Version eingestellt. qmake kann nicht ausgeführt werden.</translation>
@@ -20830,7 +20814,7 @@ Gibt an, wie sich die Rücktaste bezüglich Einrückung verhält.
</message>
<message>
<source>Valgrind Suppression Files</source>
<translation>Valgrind-Ausschlußdateien</translation>
<translation>Valgrind-Ausschlussdateien</translation>
</message>
<message>
<source>Valgrind Suppression File (*.supp);;All Files (*)</source>
@@ -22015,6 +21999,26 @@ Bitte verwenden Sie den Stop-Button.</translation>
<source>Version:</source>
<translation>Version:</translation>
</message>
<message>
<source>No Qt version.</source>
<translation>Keine Qt-Version.</translation>
</message>
<message>
<source>Invalid Qt version.</source>
<translation>Ungültige Qt-Version.</translation>
</message>
<message>
<source>Requires Qt 4.7.1 or newer.</source>
<translation>Erfordert Qt 4.7.1 oder neuer.</translation>
</message>
<message>
<source>Library not available. &lt;a href=&apos;compile&apos;&gt;Compile...&lt;/a&gt;</source>
<translation>Bibliothek nicht verfügbar. &lt;a href=&apos;compile&apos;&gt;Kompilieren...&lt;/a&gt;</translation>
</message>
<message>
<source>Building helpers</source>
<translation>Erstelle Hilfsbibliotheken</translation>
</message>
</context>
<context>
<name>QtSupport::Internal::QtOptionsPageWidget</name>
@@ -34147,6 +34151,10 @@ Entfernt: %4</translation>
<source>&lt;b&gt;Qbs:&lt;/b&gt; %1</source>
<translation>&lt;b&gt;Qbs:&lt;/b&gt; %1</translation>
</message>
<message>
<source>Might make your application vulnerable. Only use in a safe environment.</source>
<translation>Potentielle Sicherheitslücke, sollte nur in einer sicheren Umgebung benutzt werden.</translation>
</message>
<message>
<source>Keep going</source>
<translation>Fortsetzen</translation>
@@ -34155,6 +34163,10 @@ Entfernt: %4</translation>
<source>Properties:</source>
<translation>Eigenschaften:</translation>
</message>
<message>
<source>Enable QML debugging:</source>
<translation>QML-Debuggen aktivieren:</translation>
</message>
</context>
<context>
<name>QbsProjectManager::Internal::QbsCleanStepConfigWidget</name>
@@ -34569,13 +34581,6 @@ Entfernt: %4</translation>
<translation>Bestimmt, wie der Text in der Textzeile angezeigt wird.</translation>
</message>
</context>
<context>
<name>QtSupport::Internal::QtVersionsModel</name>
<message>
<source>All Versions</source>
<translation>Alle Versionen</translation>
</message>
</context>
<context>
<name>Android::Internal::AndroidGdbServerKitInformation</name>
<message>
@@ -35720,17 +35725,6 @@ Kurznamen können verwendet werden, sofern sie eindeutig sind.</translation>
<translation>Erstellt ein Qt Quick 2-UI-Projekt mit einer einzigen QML-Datei, die die Hauptansicht enthält und Qt Quick Controls verwendet.&amp;lt;br/&amp;gt;Sie können Qt Quick 2-UI-Projekte mit QML-Scene ohne Erstellung betrachten. Dieses Projekt erfordert, dass die Qt Quick Controls für die Qt-Version installiert sind.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Erfordert &amp;lt;b&amp;gt;Qt 5.1&amp;lt;/b&amp;gt; oder neuer.</translation>
</message>
</context>
<context>
<name>QuickFixFactory</name>
<message>
<source>Create Getter and Setter Member Functions</source>
<translation>Getter- und Setter-Funktionen erstellen</translation>
</message>
<message>
<source>Generate Missing Q_PROPERTY Members...</source>
<translation>Fehlende Q_PROPERTY-Elemente ergänzen...</translation>
</message>
</context>
<context>
<name>CppEditor::QuickFix</name>
<message>
@@ -37034,4 +37028,33 @@ Dieser Wizard führt Sie durch die essentiellen Schritte, die zum Deployment ein
<translation>Erstellt eine C++-/Boost-Datei mit Bindings für Python</translation>
</message>
</context>
<context>
<name>TextEditor::QuickFixFactory</name>
<message>
<source>Create Getter and Setter Member Functions</source>
<translation>Getter- und Setter-Funktionen erstellen</translation>
</message>
<message>
<source>Generate Missing Q_PROPERTY Members...</source>
<translation>Fehlende Q_PROPERTY-Elemente ergänzen...</translation>
</message>
</context>
<context>
<name>ShowEditor</name>
<message>
<source>Show Editor</source>
<translation>Editor anzeigen</translation>
</message>
</context>
<context>
<name>DiffEditor::DiffShowEditor</name>
<message>
<source>Hide Change Description</source>
<translation>Beschreibung der Änderung ausblenden</translation>
</message>
<message>
<source>Show Change Description</source>
<translation>Beschreibung der Änderung einblenden</translation>
</message>
</context>
</TS>

View File

@@ -14,7 +14,8 @@ DynamicLibrary {
return ["-Wl,-s"]
}
cpp.installNamePrefix: "@rpath/PlugIns/"
cpp.rpaths: qbs.targetOS == "mac" ? ["@loader_path/..", "@executable_path/.."]
cpp.rpaths: qbs.targetOS.contains("mac")
? ["@loader_path/..", "@executable_path/.."]
: ["$ORIGIN", "$ORIGIN/.."]
cpp.includePaths: [ ".", ".." ]

View File

@@ -48,7 +48,8 @@
\mainclass
\threadsafe
\brief Defines a collection of related components that can be viewed as a unit.
\brief The Aggregate class defines a collection of related components that
can be viewed as a unit.
An Aggregate is a collection of components that are handled as a unit,
such that each component exposes the properties and behavior of the

View File

@@ -382,13 +382,15 @@ void Document::addUndefinedMacroUse(const QByteArray &name, unsigned offset)
/*!
\class Document::MacroUse
\brief Represents the usage of a macro in a \l {Document}.
\brief The MacroUse class represents the usage of a macro in a
\l {Document}.
\sa Document::UndefinedMacroUse
*/
/*!
\class Document::UndefinedMacroUse
\brief Represents a macro that was looked up, but not found.
\brief The UndefinedMacroUse class represents a macro that was looked for,
but not found.
Holds data about the reference to a macro in an \tt{#ifdef} or \tt{#ifndef}
or argument to the \tt{defined} operator inside an \tt{#if} or \tt{#elif} that does

View File

@@ -33,7 +33,8 @@ using namespace CPlusPlus;
/*!
\class Client
\brief A notification interface for for C++ preprocessor.
\brief The Client class implements a notification interface for the
C++ preprocessor.
*/
/*!

View File

@@ -35,7 +35,7 @@
/*!
\class ExtensionSystem::IPlugin
\mainclass
\brief Base class for all plugins.
\brief The IPlugin class is the base class for all plugins.
The IPlugin class is an abstract class that must be implemented
once for each plugin.

View File

@@ -35,7 +35,8 @@
/*!
\class ExtensionSystem::PluginDetailsView
\brief Widget that displays the contents of a PluginSpec.
\brief The PluginDetailsView class implements a widget that displays the
contents of a PluginSpec.
Can be used for integration in the application that
uses the plugin manager.

View File

@@ -35,7 +35,8 @@
/*!
\class ExtensionSystem::PluginErrorView
\brief Widget that displays the state and error message of a PluginSpec.
\brief The PluginErrorView class implements a widget that displays the
state and error message of a PluginSpec.
Can be used for integration in the application that
uses the plugin manager.

View File

@@ -76,7 +76,8 @@ enum { debugLeaks = 0 };
\class ExtensionSystem::PluginManager
\mainclass
\brief Core plugin system that manages the plugins, their life cycle and their registered objects.
\brief The PluginManager class implements the core plugin system that
manages the plugins, their life cycle, and their registered objects.
The plugin manager is used for the following tasks:
\list

View File

@@ -63,7 +63,8 @@
/*!
\class ExtensionSystem::PluginDependency
\brief Struct that contains the name and required compatible version number of a plugin's dependency.
\brief The PluginDependency class contains the name and required compatible
version number of a plugin's dependency.
This reflects the data of a dependency tag in the plugin's xml description file.
The name and version are used to resolve the dependency, i.e. a plugin with the given name and
@@ -102,7 +103,8 @@
/*!
\class ExtensionSystem::PluginSpec
\brief Contains the information of the plugins xml description file and
\brief The PluginSpec class contains the information of the plugin's XML
description file and
information about the plugin's current state.
The plugin spec is also filled with more information as the plugin

View File

@@ -42,7 +42,8 @@
/*!
\class ExtensionSystem::PluginView
\brief Widget that shows a list of all plugins and their state.
\brief The PluginView class implements a widget that shows a list of all
plugins and their state.
This can be embedded e.g. in a dialog in the application that
uses the plugin manager.

View File

@@ -30,7 +30,8 @@
/*!
\class QmlJS::PersistentTrie::Trie
\brief Implements a trie that is persistent (not on disk but in memory).
\brief The Trie class implements a trie that is
persistent (not on disk but in memory).
This means that several versions can coexist, as adding an element
is non destructive, and as much as possible is shared.

View File

@@ -41,7 +41,7 @@ using namespace QmlJS::AST;
/*!
\class QmlJS::Bind
\brief Collected information about a single Document.
\brief The Bind class collects information about a single Document.
\sa Document Context
Each Document owns an instance of Bind. It provides access to data

View File

@@ -36,7 +36,8 @@ using namespace QmlJS::AST;
/*!
\class QmlJS::Context
\brief Holds information about relationships between documents in a Snapshot.
\brief The Context class holds information about relationships between
documents in a Snapshot.
\sa Document Link Snapshot
Contexts are usually created through Link. Once created, a Context is immutable

View File

@@ -39,7 +39,7 @@ using namespace QmlJS::AST;
/*!
\class QmlJS::Document
\brief A Qml or JavaScript document.
\brief The Document class creates a QML or JavaScript document.
\sa Snapshot
Documents are usually created by the ModelManagerInterface
@@ -57,7 +57,7 @@ using namespace QmlJS::AST;
/*!
\class QmlJS::LibraryInfo
\brief A Qml library.
\brief The LibraryInfo class creates a QML library.
\sa Snapshot
A LibraryInfo is created when the ModelManagerInterface finds
@@ -71,11 +71,10 @@ using namespace QmlJS::AST;
/*!
\class QmlJS::Snapshot
\brief A set of Document::Ptr and LibraryInfo instances.
\brief The Snapshot class holds and offers access to a set of
Document::Ptr and LibraryInfo instances.
\sa Document LibraryInfo
A Snapshot holds and offers access to a set of Document and LibraryInfo instances.
Usually Snapshots are copies of the snapshot maintained and updated by the
ModelManagerInterface that updates its instance as parsing
threads finish and new information becomes available.

View File

@@ -37,7 +37,7 @@ using namespace QmlJS;
/*!
\class QmlJS::Evaluate
\brief Evaluates \l{AST::Node}s to \l{Value}s.
\brief The Evaluate class evaluates \l{AST::Node}s to \l{Value}s.
\sa Value ScopeChain
The Evaluate visitor is constructed with a ScopeChain and accepts JavaScript

View File

@@ -53,7 +53,8 @@ using namespace QmlJS::AST;
/*!
\class QmlJS::Value
\brief Abstract base class for the result of a JS expression.
\brief The Value class is an abstract base class for the result of a
JS expression.
\sa Evaluate ValueOwner ValueVisitor
A Value represents a category of JavaScript values, such as number

View File

@@ -122,7 +122,7 @@ public:
/*!
\class QmlJS::Link
\brief Creates a Context for a Snapshot.
\brief The Link class creates a Context for a Snapshot.
\sa Context Snapshot
Initializes a context by resolving imports. This is an expensive operation.

View File

@@ -33,7 +33,8 @@ using namespace QmlJS;
/*!
\class QmlJS::ModelManagerInterface
\brief Interface to the global state of the QmlJS code model.
\brief The ModelManagerInterface class acts as an interface to the
global state of the QmlJS code model.
\sa QmlJS::Document QmlJS::Snapshot QmlJSTools::Internal::ModelManager
The ModelManagerInterface is an interface for global state and actions in

View File

@@ -36,7 +36,8 @@ using namespace QmlJS;
/*!
\class QmlJS::ScopeChain
\brief Describes the scopes used for global lookup in a specific location.
\brief The ScopeChain class describes the scopes used for global lookup in
a specific location.
\sa Document Context ScopeBuilder
A ScopeChain is used to perform global lookup with the lookup() method and

View File

@@ -35,7 +35,7 @@ using namespace QmlJS;
/*!
\class QmlJS::ValueOwner
\brief Manages the lifetime of \l{QmlJS::Value}s.
\brief The ValueOwner class manages the lifetime of \l{QmlJS::Value}s.
\sa QmlJS::Value
Values are usually created on a ValueOwner. When the ValueOwner is destroyed

View File

@@ -29,8 +29,8 @@
/*!
\class QRangeModel
\brief The QRangeModel class, helps users to build components that depend
on some value and/or position to be in a certain range previously defined
\brief The QRangeModel class helps users to build components that depend
on some value and/or position to be in a certain range previously defined.
With this class, the user sets a value range and a position range, which
represent the valid values/positions the model can assume. It is worth telling

View File

@@ -46,7 +46,9 @@ enum { debug = 0 };
// ------------- SymbolGroup
/*!
\class SymbolGroup A symbol group storing a tree of expanded symbols rooted on a fake "locals" root element.
\class SymbolGroup
\brief The SymbolGroup class creates a symbol group storing a tree of
expanded symbols rooted on a fake "locals" root element.
Provides a find() method based on inames ("locals.this.i1.data") and
dump() methods used for GDBMI-format dumping and debug helpers.
@@ -533,8 +535,10 @@ AbstractSymbolGroupNode *SymbolGroup::find(const std::string &iname) const
/*!
\class LocalsSymbolGroup
\brief The LocalsSymbolGroup class creates a Symbol group representing the
Locals view.
Symbol group representing the Locals view. It is firmly associated
It is firmly associated
with stack frame, function (module) and thread.
\ingroup qtcreatorcdbext
*/
@@ -624,7 +628,9 @@ std::string LocalsSymbolGroup::module() const
/*!
\class WatchesSymbolGroup
Watch symbol group. Contains watches as added by Qt Creator as iname='watch.0',
\brief The WatchesSymbolGroup class creates a watch symbol group.
Contains watches as added by \QC as iname='watch.0',
name='<expression>'. The IDebugSymbolGroup is created without scope.
\ingroup qtcreatorcdbext
*/

View File

@@ -90,7 +90,8 @@ inline std::ostream &operator<<(std::ostream &str, const DebugNodeFlags &f)
/*!
\class AbstractSymbolGroupNode
Abstract base class for a node of SymbolGroup providing the child list interface.
\brief The AbstractSymbolGroupNode class is an abstract base class for a
node of SymbolGroup providing the child list interface.
\ingroup qtcreatorcdbext
*/
AbstractSymbolGroupNode::AbstractSymbolGroupNode(const std::string &name,
@@ -207,7 +208,8 @@ void AbstractSymbolGroupNode::setParent(AbstractSymbolGroupNode *n)
/*! \class BaseSymbolGroupNode
Base class for a node of SymbolGroup with a flat list of children.
\brief The BaseSymbolGroupNode class is the base class for a node of
SymbolGroup with a flat list of children.
\ingroup qtcreatorcdbext
*/
@@ -276,9 +278,11 @@ std::ostream &operator<<(std::ostream &str, const DEBUG_SYMBOL_PARAMETERS &param
return str;
}
/*! \struct DumpParameters
/*!
\class DumpParameters
All parameters for GDBMI dumping of a symbol group in one struct.
\brief The DumpParameters class contains all parameters for GDBMI dumping
of a symbol group in one class.
The debugging engine passes maps of type names/inames to special
integer values indicating hex/dec, etc.
\ingroup qtcreatorcdbext
@@ -580,7 +584,8 @@ void ErrorSymbolGroupNode::debug(std::ostream &os, const std::string &visitingFu
/*! \class SymbolGroupNode
\brief 'Real' node within a symbol group, identified by its index in IDebugSymbolGroup.
\brief The SymbolGroupNode class represents a \e real node within a symbol
group, identified by its index in IDebugSymbolGroup.
Provides accessors for fixed-up symbol group value and a dumping facility
consisting of:
@@ -1472,8 +1477,11 @@ static inline StringStringPair arrayIndexNameIname(int index)
/*! \class ReferenceSymbolGroupNode
Artificial node referencing another (real) SymbolGroupNode (added symbol or
symbol from within an expanded linked list structure). Forwards the
\brief The ReferenceSymbolGroupNode class is an artificial node referencing
another (real) SymbolGroupNode (added symbol or symbol from within an
expanded linked list structure).
Forwards the
dumping to the referenced node using its own name.
\ingroup qtcreatorcdbext */
@@ -1509,7 +1517,8 @@ void ReferenceSymbolGroupNode::debug(std::ostream &str, const std::string &visit
/*! \class MapNodeSymbolGroupNode
\brief A [fake] map node with a fake array index and key/value entries consisting
\brief The MapNodeSymbolGroupNode class is a [fake] map node with a fake
array index and key/value entries consisting
of ReferenceSymbolGroupNode.
\ingroup qtcreatorcdbext
*/
@@ -1559,9 +1568,11 @@ void MapNodeSymbolGroupNode::debug(std::ostream &os, const std::string &visiting
/*! \class SymbolGroupNodeVisitor
Visitor that takes care of iterating over the nodes and
building the full iname path ('local.foo.bar') that is required for
GDBMI dumping. The full name depends on the path on which a node was reached
\brief The SymbolGroupNodeVisitor class is a visitor that iterates over the
nodes and builds the full iname path ('local.foo.bar') that is required for
GDBMI dumping.
The full name depends on the path on which a node was reached
for referenced nodes (a linked list element can be reached via array index
or by expanding the whole structure).
visit() is not called for the (invisible) root node, but starting with the
@@ -1578,7 +1589,7 @@ std::string SymbolGroupNodeVisitor::parentIname(const std::string &iname)
}
/*! \class DebugSymbolGroupNodeVisitor
\brief Debug output visitor.
\brief The DebugSymbolGroupNodeVisitor class is a debug output visitor.
\ingroup qtcreatorcdbext
*/
@@ -1597,7 +1608,8 @@ SymbolGroupNodeVisitor::VisitResult
}
/*! \class DebugFilterSymbolGroupNodeVisitor
\brief Debug filtering output visitor.
\brief The DebugFilterSymbolGroupNodeVisitor class is a debug filtering
output visitor.
\ingroup qtcreatorcdbext
*/
@@ -1620,9 +1632,9 @@ SymbolGroupNodeVisitor::VisitResult
}
/*! \class DumpSymbolGroupNodeVisitor
GDBMI dump output visitor used to report locals values back to the
debugging engine. \ingroup qtcreatorcdbext
\brief The DumpSymbolGroupNodeVisitor class is a GDBMI dump output visitor
used to report locals values back to the debugging engine.
\ingroup qtcreatorcdbext
*/
DumpSymbolGroupNodeVisitor::DumpSymbolGroupNodeVisitor(std::ostream &os,

View File

@@ -47,15 +47,18 @@
typedef std::vector<int>::size_type VectorIndexType;
/*! \struct SymbolGroupValueContext
\brief Structure to pass all IDebug interfaces required for SymbolGroupValue
/*!
\class SymbolGroupValueContext
\brief The SymbolGroupValueContext class passes all IDebug interfaces
required for SymbolGroupValue.
\ingroup qtcreatorcdbext */
/*! \class SymbolGroupValue
Flyweight tied to a SymbolGroupNode
\brief The SymbolGroupValue class is a flyweight tied to a SymbolGroupNode
providing a convenient operator[] (name, index) and value
getters for notation of dumpers.
Inaccessible members return a SymbolGroupValue in state 'invalid'.
Example:
\code
@@ -681,9 +684,12 @@ static inline std::string resolveQtSymbol(const char *symbolC,
return rc;
}
/*! \struct QtInfo
/*!
\class QtInfo
Qt Information determined on demand: Namespace, modules and basic class
\brief The QtInfo class provides Qt information determined on demand.
Namespace, modules, and basic class
names containing the module for fast lookup.
\ingroup qtcreatorcdbext */

View File

@@ -40,7 +40,7 @@
/*!
\class QSsh::SftpChannel
\brief This class provides SFTP operations.
\brief The SftpChannel class provides SFTP operations.
Objects are created via SshConnection::createSftpChannel().
The channel needs to be initialized with

View File

@@ -54,13 +54,13 @@ QtcLibrary {
var result = [];
if (useSystemBotan)
result.push("botan-1.10")
if (qbs.targetOS === "windows")
if (qbs.targetOS.contains("windows"))
result.push("advapi32", "user32")
else if (qbs.targetOS === "linux")
else if (qbs.targetOS.contains("linux"))
result.push("rt", "dl");
else if (qbs.targetOS === "mac")
else if (qbs.targetOS.contains("mac"))
result.push("dl");
else if (qbs.targetPlatform.indexOf("unix") !== -1)
else if (qbs.targetOS.contains("unix"))
result.push("rt");
return result
}
@@ -74,7 +74,7 @@ QtcLibrary {
result.push("BOTAN_BUILD_COMPILER_IS_MSVC", "BOTAN_TARGET_OS_HAS_GMTIME_S")
if (qbs.toolchain === "gcc" || qbs.toolchain === "mingw")
result.push("BOTAN_BUILD_COMPILER_IS_GCC")
if (qbs.targetOS === "linux")
if (qbs.targetOS.contains("linux"))
result.push("BOTAN_TARGET_OS_IS_LINUX", "BOTAN_TARGET_OS_HAS_CLOCK_GETTIME",
"BOTAN_TARGET_OS_HAS_DLOPEN", " BOTAN_TARGET_OS_HAS_GMTIME_R",
"BOTAN_TARGET_OS_HAS_POSIX_MLOCK", "BOTAN_HAS_DYNAMICALLY_LOADED_ENGINE",
@@ -82,12 +82,12 @@ QtcLibrary {
"BOTAN_HAS_ALLOC_MMAP", "BOTAN_HAS_ENTROPY_SRC_DEV_RANDOM",
"BOTAN_HAS_ENTROPY_SRC_EGD", "BOTAN_HAS_ENTROPY_SRC_FTW",
"BOTAN_HAS_ENTROPY_SRC_UNIX", "BOTAN_HAS_MUTEX_PTHREAD", "BOTAN_HAS_PIPE_UNIXFD_IO")
if (qbs.targetOS === "mac")
if (qbs.targetOS.contains("mac"))
result.push("BOTAN_TARGET_OS_IS_DARWIN", "BOTAN_TARGET_OS_HAS_GETTIMEOFDAY",
"BOTAN_HAS_ALLOC_MMAP", "BOTAN_HAS_ENTROPY_SRC_DEV_RANDOM",
"BOTAN_HAS_ENTROPY_SRC_EGD", "BOTAN_HAS_ENTROPY_SRC_FTW",
"BOTAN_HAS_ENTROPY_SRC_UNIX", "BOTAN_HAS_MUTEX_PTHREAD", "BOTAN_HAS_PIPE_UNIXFD_IO")
if (qbs.targetOS === "windows")
if (qbs.targetOS.contains("windows"))
result.push("BOTAN_TARGET_OS_IS_WINDOWS",
"BOTAN_TARGET_OS_HAS_LOADLIBRARY", "BOTAN_TARGET_OS_HAS_WIN32_GET_SYSTEMTIME",
"BOTAN_TARGET_OS_HAS_WIN32_VIRTUAL_LOCK", "BOTAN_HAS_DYNAMICALLY_LOADED_ENGINE",

View File

@@ -51,7 +51,8 @@
/*!
\class QSsh::SshConnection
\brief This class provides an SSH connection, implementing protocol version 2.0
\brief The SshConnection class provides an SSH connection, implementing
protocol version 2.0.
It can spawn channels for remote execution and SFTP operations (version 3).
It operates asynchronously (non-blocking) and is not thread-safe.

View File

@@ -43,7 +43,8 @@
/*!
\class QSsh::SshRemoteProcess
\brief This class implements an SSH channel for running a remote process.
\brief The SshRemoteProcess class implements an SSH channel for running a
remote process.
Objects are created via SshConnection::createRemoteProcess.
The process is started via the start() member function.

View File

@@ -36,7 +36,8 @@
/*!
\class QSsh::SshRemoteProcessRunner
\brief Convenience class for running a remote process over an SSH connection.
\brief The SshRemoteProcessRunner class is a convenience class for
running a remote process over an SSH connection.
*/
namespace QSsh {

View File

@@ -40,7 +40,8 @@ enum { debug = 0 };
/*! \class Utils::BaseValidatingLineEdit
\brief Base class for line edits that perform validation.
\brief The BaseValidatingLineEdit class is the base class for line edits
that perform validation.
Performs validation in a virtual validate() function to be implemented in
derived classes.

View File

@@ -34,7 +34,8 @@
/*!
\class Utils::BraceMatcher
\brief Generic autocompleter of braces and quotes.
\brief The BraceMatcher class implements a generic autocompleter of braces
and quotes.
This is a helper class for autocompleter implementations. To use it,
define "brace", "quote", and "delimiter" characters for given language.

View File

@@ -38,7 +38,8 @@
/*!
\class Utils::CheckableMessageBox
\brief A messagebox suitable for questions with a
\brief The CheckableMessageBox class implements a message box suitable for
questions with a
"Do not ask me again" checkbox.
Emulates the QMessageBox API with

View File

@@ -37,7 +37,8 @@
/*!
\class Utils::ClassNameValidatingLineEdit
\brief A Line edit that validates a C++ class name and emits a signal
\brief The ClassNameValidatingLineEdit class implements a line edit that
validates a C++ class name and emits a signal
to derive suggested file names from it.
*/

View File

@@ -41,7 +41,8 @@ static bool isEndOfWordChar(const QChar &c)
/*! \class Utils::CompletingTextEdit
\brief A QTextEdit with auto-completion support
\brief The CompletingTextEdit class is a QTextEdit with auto-completion
support.
Excerpted from Qt examples/tools/customcompleter
*/

View File

@@ -41,7 +41,8 @@
/*!
\class Utils::DetailsWidget
\brief Widget a button to expand a 'Details' area.
\brief The DetailsWidget class implements a button to expand a \e Details
area.
This widget is using a grid layout and places the items
in the following way:

View File

@@ -35,7 +35,8 @@
/*!
\class Utils::ElidingLabel
\brief A label suitable for displaying elided text.
\brief The ElidingLabel class is a label suitable for displaying elided
text.
*/
namespace Utils {

View File

@@ -35,7 +35,7 @@
/*!
\class Utils::FakeToolTip
\brief A widget that pretends to be a tooltip.
\brief The FakeToolTip class is a widget that pretends to be a tooltip.
By default it has Qt::WA_DeleteOnClose set.
*/

View File

@@ -72,7 +72,8 @@ static void execMenuAtWidget(QMenu *menu, QWidget *widget)
/*!
\class Utils::FancyLineEdit
\brief A line edit with an embedded pixmap on one side that is connected to
\brief The FancyLineEdit class is a line edit with an embedded pixmap on
one side that is connected to
a menu.
Additionally, it can display a grayed hintText (like "Type Here to")

View File

@@ -45,7 +45,8 @@ namespace Utils {
/*! \class Utils::FancyMainWindow
\brief MainWindow with dock widgets and additional "lock" functionality
\brief The FancyMainWindow class is a MainWindow with dock widgets and
additional "lock" functionality
(locking the dock widgets in place) and "reset layout" functionality.
The dock actions and the additional actions should be accessible

View File

@@ -41,7 +41,8 @@ namespace Utils {
/*!
\class Utils::FileInProjectFinder
\brief Helper class to find the 'original' file in the project directory for a given file url.
\brief The FileInProjectFinder class is a helper class to find the \e original
file in the project directory for a given file URL.
Often files are copied in the build + deploy process. findFile() searches for an existing file
in the project directory for a given file path:

View File

@@ -36,7 +36,10 @@
/*!
\class Utils::FileNameValidatingLineEdit
\brief A control that let's the user choose a (base) file name, based on a QLineEdit. Has
\brief The FileNameValidatingLineEdit class is a control that lets the user
choose a (base) file name, based on a QLineEdit.
The class has
some validation logic for embedding into QWizardPage.
*/

View File

@@ -52,7 +52,8 @@ static inline quint64 getFileLimit()
/*!
\class Utils::FileSystemWatcher
\brief File watcher that internally uses a centralized QFileSystemWatcher
\brief The FileSystemWatcher class is a file watcher that internally uses
a centralized QFileSystemWatcher
and enforces limits on Mac OS.
\section1 Design Considerations

View File

@@ -42,9 +42,9 @@ namespace Utils {
/*! \class Utils::FileUtils
\brief File- and directory-related convenience functions.
\brief The FileUtils class contains file and directory related convenience
functions.
File- and directory-related convenience functions.
*/
/*!
@@ -411,7 +411,7 @@ TempFileSaver::~TempFileSaver()
/*! \class Utils::FileName
\brief A light-weight convenience class for filenames
\brief The FileName class is a light-weight convenience class for filenames.
On windows filenames are compared case insensitively.
*/

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