From 65e95c3aba69123bf3286ea0c8ff60da0eece479 Mon Sep 17 00:00:00 2001 From: Tuomas Puranen Date: Wed, 29 Sep 2010 12:16:35 +0200 Subject: [PATCH 001/118] Added few new functions to IVersionControl, VCSManager and GeneratedFile to support the funcationality needed by the trac plugin. All the version control plugins updated to have implementations according to the interface changes. Merge-request: 2178 Reviewed-by: Tobias Hunger Merge-request: 2178 Reviewed-by: Tobias Hunger --- src/plugins/coreplugin/basefilewizard.cpp | 12 +++- src/plugins/coreplugin/basefilewizard.h | 1 + src/plugins/coreplugin/iversioncontrol.h | 14 +++- src/plugins/coreplugin/vcsmanager.cpp | 36 ++++++++++ src/plugins/coreplugin/vcsmanager.h | 5 ++ src/plugins/cvs/cvscontrol.cpp | 12 ++++ src/plugins/cvs/cvscontrol.h | 2 + src/plugins/git/gitclient.cpp | 56 +++++++++++++++ src/plugins/git/gitclient.h | 2 + src/plugins/git/gitversioncontrol.cpp | 15 ++++ src/plugins/git/gitversioncontrol.h | 2 + src/plugins/mercurial/mercurialclient.cpp | 57 +++++++++++++++ src/plugins/mercurial/mercurialclient.h | 2 + src/plugins/mercurial/mercurialcontrol.cpp | 12 ++++ src/plugins/mercurial/mercurialcontrol.h | 2 + .../perforce/perforceversioncontrol.cpp | 12 ++++ src/plugins/perforce/perforceversioncontrol.h | 2 + src/plugins/subversion/subversioncontrol.cpp | 12 ++++ src/plugins/subversion/subversioncontrol.h | 2 + src/plugins/subversion/subversionplugin.cpp | 71 ++++++++++++++++++- src/plugins/subversion/subversionplugin.h | 2 + 21 files changed, 328 insertions(+), 3 deletions(-) diff --git a/src/plugins/coreplugin/basefilewizard.cpp b/src/plugins/coreplugin/basefilewizard.cpp index 054e560bd8a..e30f27168e0 100644 --- a/src/plugins/coreplugin/basefilewizard.cpp +++ b/src/plugins/coreplugin/basefilewizard.cpp @@ -69,12 +69,14 @@ public: QString editorId; bool binary; GeneratedFile::Attributes attributes; + bool writeAccess; }; GeneratedFilePrivate::GeneratedFilePrivate(const QString &p) : path(p), binary(false), - attributes(0) + attributes(0), + writeAccess(true) { } @@ -104,6 +106,11 @@ GeneratedFile::~GeneratedFile() { } +void GeneratedFile::writeAccess(bool access) +{ + m_d->writeAccess = access; +} + QString GeneratedFile::path() const { return m_d->path; @@ -156,6 +163,9 @@ void GeneratedFile::setEditorId(const QString &k) bool GeneratedFile::write(QString *errorMessage) const { + if (!m_d->writeAccess) + return true; + // Ensure the directory const QFileInfo info(m_d->path); const QDir dir = info.absoluteDir(); diff --git a/src/plugins/coreplugin/basefilewizard.h b/src/plugins/coreplugin/basefilewizard.h index 614cabebbd0..2fcab7e6d2b 100644 --- a/src/plugins/coreplugin/basefilewizard.h +++ b/src/plugins/coreplugin/basefilewizard.h @@ -101,6 +101,7 @@ public: void setEditorId(const QString &k); bool write(QString *errorMessage) const; + void writeAccess(bool access = true); Attributes attributes() const; void setAttributes(Attributes a); diff --git a/src/plugins/coreplugin/iversioncontrol.h b/src/plugins/coreplugin/iversioncontrol.h index c402c1fb77c..e00be8f69db 100644 --- a/src/plugins/coreplugin/iversioncontrol.h +++ b/src/plugins/coreplugin/iversioncontrol.h @@ -52,7 +52,9 @@ public: AddOperation, DeleteOperation, OpenOperation, MoveOperation, CreateRepositoryOperation, SnapshotOperations, - AnnotateOperation + AnnotateOperation, + CheckoutOperation, + GetRepositoryRootOperation }; explicit IVersionControl(QObject *parent = 0) : QObject(parent) {} @@ -116,6 +118,16 @@ public: */ virtual bool vcsCreateRepository(const QString &directory) = 0; + /*! + * Called to clone/checkout the version control system in a directory. + */ + virtual bool vcsCheckout(const QString &directory,const QByteArray &url) = 0; + + /*! + * Called to get the version control repository root. + */ + virtual QString vcsGetRepositoryURL(const QString &director) = 0; + /*! * Create a snapshot of the current state and return an identifier or * an empty string in case of failure. diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp index 0221e29c9fa..ac7e18fb3af 100644 --- a/src/plugins/coreplugin/vcsmanager.cpp +++ b/src/plugins/coreplugin/vcsmanager.cpp @@ -167,6 +167,42 @@ bool VCSManager::promptToDelete(const QString &fileName) return true; } +IVersionControl* VCSManager::checkout(const QString &versionControlType, + const QString &directory, + const QByteArray &url) +{ + foreach (IVersionControl * versionControl, allVersionControls()) { + if (versionControl->displayName() == versionControlType && + versionControl->supportsOperation(Core::IVersionControl::CheckoutOperation)) { + if (versionControl->vcsCheckout(directory,url)) { + m_d->m_cachedMatches.insert(directory, versionControl); + return versionControl; + } + return 0; + } + } + return 0; +} + +bool VCSManager::findVersionControl(const QString &versionControlType) +{ + foreach (IVersionControl * versionControl, allVersionControls()) { + if (versionControl->displayName() == versionControlType) { + return true; + } + } + return false; +} + +QString VCSManager::getRepositoryURL(const QString &directory) +{ + IVersionControl *vc = findVersionControlForDirectory(directory); + + if (vc && vc->supportsOperation(Core::IVersionControl::GetRepositoryRootOperation)) + return vc->vcsGetRepositoryURL(directory); + return QString(); +} + bool VCSManager::promptToDelete(IVersionControl *vc, const QString &fileName) { QTC_ASSERT(vc, return true) diff --git a/src/plugins/coreplugin/vcsmanager.h b/src/plugins/coreplugin/vcsmanager.h index 71e9b3e9c34..6b2e374a883 100644 --- a/src/plugins/coreplugin/vcsmanager.h +++ b/src/plugins/coreplugin/vcsmanager.h @@ -68,6 +68,11 @@ public: IVersionControl *findVersionControlForDirectory(const QString &directory, QString *topLevelDirectory = 0); + IVersionControl *checkout(const QString &versionControlType, + const QString &directory, + const QByteArray &url); + bool findVersionControl(const QString &versionControl); + QString getRepositoryURL(const QString &directory); // Shows a confirmation dialog, whether the file should also be deleted // from revision control Calls sccDelete on the file. Returns false diff --git a/src/plugins/cvs/cvscontrol.cpp b/src/plugins/cvs/cvscontrol.cpp index 41268e79f07..7fd757a4f82 100644 --- a/src/plugins/cvs/cvscontrol.cpp +++ b/src/plugins/cvs/cvscontrol.cpp @@ -58,6 +58,8 @@ bool CVSControl::supportsOperation(Operation operation) const case MoveOperation: case CreateRepositoryOperation: case SnapshotOperations: + case CheckoutOperation: + case GetRepositoryRootOperation: rc = false; break; } @@ -94,6 +96,16 @@ bool CVSControl::vcsCreateRepository(const QString &) return false; } +QString CVSControl::vcsGetRepositoryURL(const QString &) +{ + return QString(); +} + +bool CVSControl::vcsCheckout(const QString &/*directory*/, const QByteArray &/*url*/) +{ + return false; +} + QString CVSControl::vcsCreateSnapshot(const QString &) { return QString(); diff --git a/src/plugins/cvs/cvscontrol.h b/src/plugins/cvs/cvscontrol.h index 4fd06c2de72..b5b882d4425 100644 --- a/src/plugins/cvs/cvscontrol.h +++ b/src/plugins/cvs/cvscontrol.h @@ -53,6 +53,8 @@ public: virtual bool vcsDelete(const QString &filename); virtual bool vcsMove(const QString &from, const QString &to); virtual bool vcsCreateRepository(const QString &directory); + virtual bool vcsCheckout(const QString &directory, const QByteArray &url); + virtual QString vcsGetRepositoryURL(const QString &directory); virtual QString vcsCreateSnapshot(const QString &topLevel); virtual QStringList vcsSnapshots(const QString &topLevel); virtual bool vcsRestoreSnapshot(const QString &topLevel, const QString &name); diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 48f5c5a893d..47b74c8e4a3 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -50,6 +50,7 @@ #include #include #include +#include #include #include #include @@ -1922,6 +1923,61 @@ QString GitClient::readConfigValue(const QString &workingDirectory, const QStrin return readConfig(workingDirectory, QStringList(configVar)).remove(QLatin1Char('\n')); } +bool GitClient::cloneRepository(const QString &directory,const QByteArray &url) +{ + QDir workingDirectory(directory); + const unsigned flags = VCSBase::VCSBasePlugin::SshPasswordPrompt + |VCSBase::VCSBasePlugin::ShowStdOutInLogWindow + |VCSBase::VCSBasePlugin::ShowSuccessMessage; + + if (workingDirectory.exists()) { + if (!synchronousInit(workingDirectory.path())) + return false; + + QStringList arguments(QLatin1String("remote")); + arguments << QLatin1String("add") << QLatin1String("origin") << url; + if (!fullySynchronousGit(workingDirectory.path(),arguments,0,0,true)) + return false; + + arguments.clear(); + arguments << QLatin1String("fetch"); + const Utils::SynchronousProcessResponse resp = synchronousGit(workingDirectory.path(),arguments,flags); + if (resp.result != Utils::SynchronousProcessResponse::Finished) + return false; + + arguments.clear(); + arguments << QLatin1String("config") << QLatin1String("branch.master.remote") << QLatin1String("origin"); + if (!fullySynchronousGit(workingDirectory.path(),arguments,0,0,true)) + return false; + + arguments.clear(); + arguments << QLatin1String("config") << QLatin1String("branch.master.merge") << QLatin1String("refs/heads/master"); + if (!fullySynchronousGit(workingDirectory.path(),arguments,0,0,true)) + return false; + + return true; + } else { + QStringList arguments(QLatin1String("clone")); + arguments << url << workingDirectory.dirName(); + workingDirectory.cdUp(); + const Utils::SynchronousProcessResponse resp = synchronousGit(workingDirectory.path(),arguments,flags); + return resp.result == Utils::SynchronousProcessResponse::Finished; + } +} + +QString GitClient::vcsGetRepositoryURL(const QString &directory) +{ + QStringList arguments(QLatin1String("config")); + QByteArray outputText; + + arguments << QLatin1String("remote.origin.url"); + + if (fullySynchronousGit(directory,arguments,&outputText,0,false)) { + return commandOutputFromLocal8Bit(outputText); + } + return QString(); +} + GitSettings GitClient::settings() const { return m_settings; diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index 9de98447889..5ece27c9394 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -158,6 +158,8 @@ public: unsigned gitVersion(bool silent, QString *errorMessage = 0); QString gitVersionString(bool silent, QString *errorMessage = 0); + bool cloneRepository(const QString &directory,const QByteArray &url); + QString vcsGetRepositoryURL(const QString &directory); bool synchronousFetch(const QString &workingDirectory); bool synchronousPull(const QString &workingDirectory); bool synchronousPush(const QString &workingDirectory); diff --git a/src/plugins/git/gitversioncontrol.cpp b/src/plugins/git/gitversioncontrol.cpp index 370e20bb270..862bd04dd01 100644 --- a/src/plugins/git/gitversioncontrol.cpp +++ b/src/plugins/git/gitversioncontrol.cpp @@ -87,6 +87,10 @@ bool GitVersionControl::supportsOperation(Operation operation) const case AnnotateOperation: rc = true; break; + case CheckoutOperation: + case GetRepositoryRootOperation: + rc = true; + break; } return rc; } @@ -121,6 +125,17 @@ bool GitVersionControl::vcsCreateRepository(const QString &directory) { return gitClient()->synchronousInit(directory); } + +bool GitVersionControl::vcsCheckout(const QString &directory,const QByteArray &url) +{ + return gitClient()->cloneRepository(directory,url); +} + +QString GitVersionControl::vcsGetRepositoryURL(const QString &directory) +{ + return gitClient()->vcsGetRepositoryURL(directory); +} + /* Snapshots are implement using stashes, relying on stash messages for * naming as the actual stash names (stash{n}) are rotated as one adds stashes. * Note that the snapshot interface does not care whether we have an unmodified diff --git a/src/plugins/git/gitversioncontrol.h b/src/plugins/git/gitversioncontrol.h index 35504747a7c..0d7276a392d 100644 --- a/src/plugins/git/gitversioncontrol.h +++ b/src/plugins/git/gitversioncontrol.h @@ -54,6 +54,8 @@ public: virtual bool vcsDelete(const QString &filename); virtual bool vcsMove(const QString &from, const QString &to); virtual bool vcsCreateRepository(const QString &directory); + virtual bool vcsCheckout(const QString &directory, const QByteArray &url); + virtual QString vcsGetRepositoryURL(const QString &directory); virtual QString vcsCreateSnapshot(const QString &topLevel); virtual QStringList vcsSnapshots(const QString &topLevel); virtual bool vcsRestoreSnapshot(const QString &topLevel, const QString &name); diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp index 3cc71ca7aa0..8f06d4d5531 100644 --- a/src/plugins/mercurial/mercurialclient.cpp +++ b/src/plugins/mercurial/mercurialclient.cpp @@ -497,6 +497,63 @@ bool MercurialClient::pushSync(const QString &repositoryRoot, const QString &rep return resp.result == Utils::SynchronousProcessResponse::Finished; } +bool MercurialClient::clone(const QString &directory, const QString &url) +{ + QDir workingDirectory(directory); + QByteArray output; + const unsigned flags = VCSBase::VCSBasePlugin::SshPasswordPrompt|VCSBase::VCSBasePlugin::ShowStdOutInLogWindow + |VCSBase::VCSBasePlugin::ShowSuccessMessage; + + if (workingDirectory.exists()) { + // Let's make first init + QStringList arguments(QLatin1String("init")); + if (!executeHgFullySynchronously(workingDirectory.path(), arguments, &output)) { + return false; + } + + // Then pull remote repository + arguments.clear(); + arguments << QLatin1String("pull") << url; + const Utils::SynchronousProcessResponse resp1 = + executeHgSynchronously(workingDirectory.path(), arguments, flags); + if (resp1.result != Utils::SynchronousProcessResponse::Finished) { + return false; + } + + // By now, there is no hgrc file -> create it + QFile hgrc(workingDirectory.path()+"/.hg/hgrc"); + hgrc.open(QIODevice::WriteOnly); + hgrc.write(QString("[paths]\ndefault = %1\n").arg(QString(url)).toUtf8()); + hgrc.close(); + + // And last update repository + arguments.clear(); + arguments << QLatin1String("update"); + const Utils::SynchronousProcessResponse resp2 = + executeHgSynchronously(workingDirectory.path(), arguments, flags); + return resp2.result == Utils::SynchronousProcessResponse::Finished; + } else { + QStringList arguments(QLatin1String("clone")); + arguments << url << workingDirectory.dirName(); + workingDirectory.cdUp(); + const Utils::SynchronousProcessResponse resp = + executeHgSynchronously(workingDirectory.path(), arguments, flags); + return resp.result == Utils::SynchronousProcessResponse::Finished; + } +} + +QString MercurialClient::vcsGetRepositoryURL(const QString &directory) +{ + QByteArray output; + + QStringList arguments(QLatin1String("showconfig")); + arguments << QLatin1String("paths.default"); + + if (executeHgFullySynchronously(directory, arguments, &output)) + return QString::fromLocal8Bit(output);; + return QString(); +} + void MercurialClient::incoming(const QString &repositoryRoot, const QString &repository) { QStringList args; diff --git a/src/plugins/mercurial/mercurialclient.h b/src/plugins/mercurial/mercurialclient.h index f6ea3a3d28b..8750d0fbb23 100644 --- a/src/plugins/mercurial/mercurialclient.h +++ b/src/plugins/mercurial/mercurialclient.h @@ -100,6 +100,8 @@ public: const QString &commiterInfo, const QString &commitMessageFile, bool autoAddRemove = false); + bool clone(const QString &directory, const QString &url); + QString vcsGetRepositoryURL(const QString &directory); static QString findTopLevelForFile(const QFileInfo &file); diff --git a/src/plugins/mercurial/mercurialcontrol.cpp b/src/plugins/mercurial/mercurialcontrol.cpp index 61342dc3507..dc84b9919b4 100644 --- a/src/plugins/mercurial/mercurialcontrol.cpp +++ b/src/plugins/mercurial/mercurialcontrol.cpp @@ -65,6 +65,8 @@ bool MercurialControl::supportsOperation(Operation operation) const case Core::IVersionControl::MoveOperation: case Core::IVersionControl::CreateRepositoryOperation: case Core::IVersionControl::AnnotateOperation: + case Core::IVersionControl::CheckoutOperation: + case Core::IVersionControl::GetRepositoryRootOperation: break; case Core::IVersionControl::OpenOperation: case Core::IVersionControl::SnapshotOperations: @@ -142,6 +144,16 @@ bool MercurialControl::sccManaged(const QString &filename) return mercurialClient->manifestSync(topLevel, topLevelDir.relativeFilePath(filename)); } +bool MercurialControl::vcsCheckout(const QString &directory, const QByteArray &url) +{ + return mercurialClient->clone(directory,url); +} + +QString MercurialControl::vcsGetRepositoryURL(const QString &directory) +{ + return mercurialClient->vcsGetRepositoryURL(directory); +} + void MercurialControl::changed(const QVariant &v) { switch (v.type()) { diff --git a/src/plugins/mercurial/mercurialcontrol.h b/src/plugins/mercurial/mercurialcontrol.h index b74fce99ff8..3f0465d380c 100644 --- a/src/plugins/mercurial/mercurialcontrol.h +++ b/src/plugins/mercurial/mercurialcontrol.h @@ -57,6 +57,8 @@ public: bool vcsDelete(const QString &filename); bool vcsMove(const QString &from, const QString &to); bool vcsCreateRepository(const QString &directory); + bool vcsCheckout(const QString &directory, const QByteArray &url); + QString vcsGetRepositoryURL(const QString &directory); QString vcsCreateSnapshot(const QString &topLevel); QStringList vcsSnapshots(const QString &topLevel); bool vcsRestoreSnapshot(const QString &topLevel, const QString &name); diff --git a/src/plugins/perforce/perforceversioncontrol.cpp b/src/plugins/perforce/perforceversioncontrol.cpp index 0f0a5e81905..6ea6fb63466 100644 --- a/src/plugins/perforce/perforceversioncontrol.cpp +++ b/src/plugins/perforce/perforceversioncontrol.cpp @@ -59,6 +59,8 @@ bool PerforceVersionControl::supportsOperation(Operation operation) const return true; case CreateRepositoryOperation: case SnapshotOperations: + case CheckoutOperation: + case GetRepositoryRootOperation: break; } return false; @@ -128,6 +130,16 @@ bool PerforceVersionControl::vcsAnnotate(const QString &file, int line) return true; } +bool PerforceVersionControl::vcsCheckout(const QString &/*directory*/,const QByteArray&/*url*/) +{ + return false; +} + +QString PerforceVersionControl::vcsGetRepositoryURL(const QString &/*directory*/) +{ + return QString(); +} + bool PerforceVersionControl::managesDirectory(const QString &directory, QString *topLevel) const { const bool rc = m_plugin->managesDirectory(directory, topLevel); diff --git a/src/plugins/perforce/perforceversioncontrol.h b/src/plugins/perforce/perforceversioncontrol.h index b3a01f7a6c0..ed688d68503 100644 --- a/src/plugins/perforce/perforceversioncontrol.h +++ b/src/plugins/perforce/perforceversioncontrol.h @@ -55,6 +55,8 @@ public: virtual bool vcsDelete(const QString &filename); virtual bool vcsMove(const QString &from, const QString &to); virtual bool vcsCreateRepository(const QString &directory); + virtual bool vcsCheckout(const QString &directory, const QByteArray &url); + virtual QString vcsGetRepositoryURL(const QString &directory); virtual QString vcsCreateSnapshot(const QString &topLevel); virtual QStringList vcsSnapshots(const QString &topLevel); virtual bool vcsRestoreSnapshot(const QString &topLevel, const QString &name); diff --git a/src/plugins/subversion/subversioncontrol.cpp b/src/plugins/subversion/subversioncontrol.cpp index f25fc3ab6a2..e4e1256f9eb 100644 --- a/src/plugins/subversion/subversioncontrol.cpp +++ b/src/plugins/subversion/subversioncontrol.cpp @@ -54,6 +54,8 @@ bool SubversionControl::supportsOperation(Operation operation) const case DeleteOperation: case MoveOperation: case AnnotateOperation: + case CheckoutOperation: + case GetRepositoryRootOperation: break; case OpenOperation: case CreateRepositoryOperation: @@ -89,6 +91,16 @@ bool SubversionControl::vcsMove(const QString &from, const QString &to) return m_plugin->vcsMove(fromInfo.absolutePath(), fromInfo.absoluteFilePath(), toInfo.absoluteFilePath()); } +bool SubversionControl::vcsCheckout(const QString &directory,const QByteArray &url) +{ + return m_plugin->vcsCheckout(directory,url); +} + +QString SubversionControl::vcsGetRepositoryURL(const QString &directory) +{ + return m_plugin->vcsGetRepositoryURL(directory); +} + bool SubversionControl::vcsCreateRepository(const QString &) { return false; diff --git a/src/plugins/subversion/subversioncontrol.h b/src/plugins/subversion/subversioncontrol.h index 5610059d661..071773b8600 100644 --- a/src/plugins/subversion/subversioncontrol.h +++ b/src/plugins/subversion/subversioncontrol.h @@ -53,6 +53,8 @@ public: virtual bool vcsDelete(const QString &filename); virtual bool vcsMove(const QString &from, const QString &to); virtual bool vcsCreateRepository(const QString &directory); + virtual bool vcsCheckout(const QString &directory, const QByteArray &url); + virtual QString vcsGetRepositoryURL(const QString &directory); virtual QString vcsCreateSnapshot(const QString &topLevel); virtual QStringList vcsSnapshots(const QString &topLevel); diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index 332ca5f3724..e22933b25eb 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -65,13 +65,14 @@ #include #include #include +#include #include #include #include #include #include #include - +#include #include using namespace Subversion::Internal; @@ -1224,6 +1225,74 @@ bool SubversionPlugin::vcsMove(const QString &workingDir, const QString &from, c return !response.error; } +bool SubversionPlugin::vcsCheckout(const QString &directory, const QByteArray &url) +{ + QUrl tempUrl; + tempUrl.setEncodedUrl(url); + QString username = tempUrl.userName(); + QString password = tempUrl.password(); + QStringList args = QStringList(QLatin1String("checkout")); + args << QLatin1String(nonInteractiveOptionC) ; + + if(!username.isEmpty() && !password.isEmpty()) + { + // If url contains username and password we have to use separate username and password + // arguments instead of passing those in the url. Otherwise the subversion 'non-interactive' + // authentication will always fail (if the username and password data are not stored locally), + // if for example we are logging into a new host for the first time using svn. There seems to + // be a bug in subversion, so this might get fixed in the future. + tempUrl.setUserInfo(""); + args << tempUrl.toEncoded() << directory; + const SubversionResponse response = runSvn(directory, username, password, args, m_settings.longTimeOutMS(), + VCSBase::VCSBasePlugin::SshPasswordPrompt); + return !response.error; + } else { + args << url << directory; + const SubversionResponse response = runSvn(directory, args, m_settings.longTimeOutMS(), + VCSBase::VCSBasePlugin::SshPasswordPrompt); + return !response.error; + } +} + +QString SubversionPlugin::vcsGetRepositoryURL(const QString &directory) +{ + QXmlStreamReader xml; + QStringList args = QStringList(QLatin1String("info")); + args << QLatin1String("--xml"); + + const SubversionResponse response = runSvn(directory, args, m_settings.longTimeOutMS(), SuppressCommandLogging); + xml.addData(response.stdOut); + + bool repo = false; + bool root = false; + + while(!xml.atEnd() && !xml.hasError()) { + switch(xml.readNext()) { + case QXmlStreamReader::StartDocument: + break; + case QXmlStreamReader::StartElement: + if(xml.name() == QLatin1String("repository")) + repo = true; + else if(repo && xml.name() == QLatin1String("root")) + root = true; + break; + case QXmlStreamReader::EndElement: + if(xml.name() == QLatin1String("repository")) + repo = false; + else if(repo && xml.name() == QLatin1String("root")) + root = false; + break; + case QXmlStreamReader::Characters: + if (repo && root) + return xml.text().toString(); + break; + default: + break; + } + } + return QString(); +} + /* Subversion has ".svn" directory in each directory * it manages. The top level is the first directory * under the directory that does not have a ".svn". */ diff --git a/src/plugins/subversion/subversionplugin.h b/src/plugins/subversion/subversionplugin.h index 584a196671c..d79ae144e10 100644 --- a/src/plugins/subversion/subversionplugin.h +++ b/src/plugins/subversion/subversionplugin.h @@ -96,6 +96,8 @@ public: bool vcsDelete(const QString &workingDir, const QString &fileName); bool vcsMove(const QString &workingDir, const QString &from, const QString &to); bool managesDirectory(const QString &directory, QString *topLevel = 0) const; + virtual bool vcsCheckout(const QString &directory, const QByteArray &url); + virtual QString vcsGetRepositoryURL(const QString &directory); static SubversionPlugin *subversionPluginInstance(); From 2cf99100703adebb48837e848c0fa72baecf3e4f Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 29 Sep 2010 12:16:37 +0200 Subject: [PATCH 002/118] Fixup formating of mr2178 Merge-request: 2178 Reviewed-by: Tobias Hunger --- src/plugins/coreplugin/iversioncontrol.h | 2 +- src/plugins/coreplugin/vcsmanager.cpp | 13 ++++---- src/plugins/cvs/cvscontrol.cpp | 2 +- src/plugins/git/gitclient.cpp | 30 +++++++++++-------- src/plugins/git/gitclient.h | 2 +- src/plugins/git/gitversioncontrol.cpp | 6 ++-- src/plugins/mercurial/mercurialclient.cpp | 5 ++-- .../perforce/perforceversioncontrol.cpp | 4 +-- src/plugins/subversion/subversioncontrol.cpp | 4 +-- src/plugins/subversion/subversionplugin.cpp | 7 +++-- 10 files changed, 41 insertions(+), 34 deletions(-) diff --git a/src/plugins/coreplugin/iversioncontrol.h b/src/plugins/coreplugin/iversioncontrol.h index e00be8f69db..d0dd868b1a2 100644 --- a/src/plugins/coreplugin/iversioncontrol.h +++ b/src/plugins/coreplugin/iversioncontrol.h @@ -121,7 +121,7 @@ public: /*! * Called to clone/checkout the version control system in a directory. */ - virtual bool vcsCheckout(const QString &directory,const QByteArray &url) = 0; + virtual bool vcsCheckout(const QString &directory, const QByteArray &url) = 0; /*! * Called to get the version control repository root. diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp index ac7e18fb3af..da42a17bad4 100644 --- a/src/plugins/coreplugin/vcsmanager.cpp +++ b/src/plugins/coreplugin/vcsmanager.cpp @@ -167,14 +167,14 @@ bool VCSManager::promptToDelete(const QString &fileName) return true; } -IVersionControl* VCSManager::checkout(const QString &versionControlType, +IVersionControl *VCSManager::checkout(const QString &versionControlType, const QString &directory, const QByteArray &url) { - foreach (IVersionControl * versionControl, allVersionControls()) { - if (versionControl->displayName() == versionControlType && - versionControl->supportsOperation(Core::IVersionControl::CheckoutOperation)) { - if (versionControl->vcsCheckout(directory,url)) { + foreach (IVersionControl *versionControl, allVersionControls()) { + if (versionControl->displayName() == versionControlType + && versionControl->supportsOperation(Core::IVersionControl::CheckoutOperation)) { + if (versionControl->vcsCheckout(directory, url)) { m_d->m_cachedMatches.insert(directory, versionControl); return versionControl; } @@ -187,9 +187,8 @@ IVersionControl* VCSManager::checkout(const QString &versionControlType, bool VCSManager::findVersionControl(const QString &versionControlType) { foreach (IVersionControl * versionControl, allVersionControls()) { - if (versionControl->displayName() == versionControlType) { + if (versionControl->displayName() == versionControlType) return true; - } } return false; } diff --git a/src/plugins/cvs/cvscontrol.cpp b/src/plugins/cvs/cvscontrol.cpp index 7fd757a4f82..3ba45ffb297 100644 --- a/src/plugins/cvs/cvscontrol.cpp +++ b/src/plugins/cvs/cvscontrol.cpp @@ -101,7 +101,7 @@ QString CVSControl::vcsGetRepositoryURL(const QString &) return QString(); } -bool CVSControl::vcsCheckout(const QString &/*directory*/, const QByteArray &/*url*/) +bool CVSControl::vcsCheckout(const QString &, const QByteArray &) { return false; } diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 47b74c8e4a3..9837b7c35a7 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -1926,9 +1926,9 @@ QString GitClient::readConfigValue(const QString &workingDirectory, const QStrin bool GitClient::cloneRepository(const QString &directory,const QByteArray &url) { QDir workingDirectory(directory); - const unsigned flags = VCSBase::VCSBasePlugin::SshPasswordPrompt - |VCSBase::VCSBasePlugin::ShowStdOutInLogWindow - |VCSBase::VCSBasePlugin::ShowSuccessMessage; + const unsigned flags = VCSBase::VCSBasePlugin::SshPasswordPrompt | + VCSBase::VCSBasePlugin::ShowStdOutInLogWindow| + VCSBase::VCSBasePlugin::ShowSuccessMessage; if (workingDirectory.exists()) { if (!synchronousInit(workingDirectory.path())) @@ -1936,23 +1936,28 @@ bool GitClient::cloneRepository(const QString &directory,const QByteArray &url) QStringList arguments(QLatin1String("remote")); arguments << QLatin1String("add") << QLatin1String("origin") << url; - if (!fullySynchronousGit(workingDirectory.path(),arguments,0,0,true)) - return false; + if (!fullySynchronousGit(workingDirectory.path(), arguments, 0, 0, true)) + return false; arguments.clear(); arguments << QLatin1String("fetch"); - const Utils::SynchronousProcessResponse resp = synchronousGit(workingDirectory.path(),arguments,flags); + const Utils::SynchronousProcessResponse resp = + synchronousGit(workingDirectory.path(), arguments, flags); if (resp.result != Utils::SynchronousProcessResponse::Finished) return false; arguments.clear(); - arguments << QLatin1String("config") << QLatin1String("branch.master.remote") << QLatin1String("origin"); - if (!fullySynchronousGit(workingDirectory.path(),arguments,0,0,true)) + arguments << QLatin1String("config") + << QLatin1String("branch.master.remote") + << QLatin1String("origin"); + if (!fullySynchronousGit(workingDirectory.path(), arguments, 0, 0, true)) return false; arguments.clear(); - arguments << QLatin1String("config") << QLatin1String("branch.master.merge") << QLatin1String("refs/heads/master"); - if (!fullySynchronousGit(workingDirectory.path(),arguments,0,0,true)) + arguments << QLatin1String("config") + << QLatin1String("branch.master.merge") + << QLatin1String("refs/heads/master"); + if (!fullySynchronousGit(workingDirectory.path(), arguments, 0, 0, true)) return false; return true; @@ -1960,7 +1965,8 @@ bool GitClient::cloneRepository(const QString &directory,const QByteArray &url) QStringList arguments(QLatin1String("clone")); arguments << url << workingDirectory.dirName(); workingDirectory.cdUp(); - const Utils::SynchronousProcessResponse resp = synchronousGit(workingDirectory.path(),arguments,flags); + const Utils::SynchronousProcessResponse resp = + synchronousGit(workingDirectory.path(), arguments, flags); return resp.result == Utils::SynchronousProcessResponse::Finished; } } @@ -1972,7 +1978,7 @@ QString GitClient::vcsGetRepositoryURL(const QString &directory) arguments << QLatin1String("remote.origin.url"); - if (fullySynchronousGit(directory,arguments,&outputText,0,false)) { + if (fullySynchronousGit(directory, arguments, &outputText, 0, false)) { return commandOutputFromLocal8Bit(outputText); } return QString(); diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index 5ece27c9394..828a4e09094 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -158,7 +158,7 @@ public: unsigned gitVersion(bool silent, QString *errorMessage = 0); QString gitVersionString(bool silent, QString *errorMessage = 0); - bool cloneRepository(const QString &directory,const QByteArray &url); + bool cloneRepository(const QString &directory, const QByteArray &url); QString vcsGetRepositoryURL(const QString &directory); bool synchronousFetch(const QString &workingDirectory); bool synchronousPull(const QString &workingDirectory); diff --git a/src/plugins/git/gitversioncontrol.cpp b/src/plugins/git/gitversioncontrol.cpp index 862bd04dd01..ad6cc63c2da 100644 --- a/src/plugins/git/gitversioncontrol.cpp +++ b/src/plugins/git/gitversioncontrol.cpp @@ -126,13 +126,13 @@ bool GitVersionControl::vcsCreateRepository(const QString &directory) return gitClient()->synchronousInit(directory); } -bool GitVersionControl::vcsCheckout(const QString &directory,const QByteArray &url) -{ +bool GitVersionControl::vcsCheckout(const QString &directory, const QByteArray &url) +{ return gitClient()->cloneRepository(directory,url); } QString GitVersionControl::vcsGetRepositoryURL(const QString &directory) -{ +{ return gitClient()->vcsGetRepositoryURL(directory); } diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp index 8f06d4d5531..68db76e2901 100644 --- a/src/plugins/mercurial/mercurialclient.cpp +++ b/src/plugins/mercurial/mercurialclient.cpp @@ -501,8 +501,9 @@ bool MercurialClient::clone(const QString &directory, const QString &url) { QDir workingDirectory(directory); QByteArray output; - const unsigned flags = VCSBase::VCSBasePlugin::SshPasswordPrompt|VCSBase::VCSBasePlugin::ShowStdOutInLogWindow - |VCSBase::VCSBasePlugin::ShowSuccessMessage; + const unsigned flags = VCSBase::VCSBasePlugin::SshPasswordPrompt | + VCSBase::VCSBasePlugin::ShowStdOutInLogWindow | + VCSBase::VCSBasePlugin::ShowSuccessMessage; if (workingDirectory.exists()) { // Let's make first init diff --git a/src/plugins/perforce/perforceversioncontrol.cpp b/src/plugins/perforce/perforceversioncontrol.cpp index 6ea6fb63466..8e755a960af 100644 --- a/src/plugins/perforce/perforceversioncontrol.cpp +++ b/src/plugins/perforce/perforceversioncontrol.cpp @@ -130,12 +130,12 @@ bool PerforceVersionControl::vcsAnnotate(const QString &file, int line) return true; } -bool PerforceVersionControl::vcsCheckout(const QString &/*directory*/,const QByteArray&/*url*/) +bool PerforceVersionControl::vcsCheckout(const QString &,const QByteArray &) { return false; } -QString PerforceVersionControl::vcsGetRepositoryURL(const QString &/*directory*/) +QString PerforceVersionControl::vcsGetRepositoryURL(const QString &) { return QString(); } diff --git a/src/plugins/subversion/subversioncontrol.cpp b/src/plugins/subversion/subversioncontrol.cpp index e4e1256f9eb..597546ee251 100644 --- a/src/plugins/subversion/subversioncontrol.cpp +++ b/src/plugins/subversion/subversioncontrol.cpp @@ -91,9 +91,9 @@ bool SubversionControl::vcsMove(const QString &from, const QString &to) return m_plugin->vcsMove(fromInfo.absolutePath(), fromInfo.absoluteFilePath(), toInfo.absoluteFilePath()); } -bool SubversionControl::vcsCheckout(const QString &directory,const QByteArray &url) +bool SubversionControl::vcsCheckout(const QString &directory, const QByteArray &url) { - return m_plugin->vcsCheckout(directory,url); + return m_plugin->vcsCheckout(directory, url); } QString SubversionControl::vcsGetRepositoryURL(const QString &directory) diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index e22933b25eb..5e47b9d07a7 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -1243,13 +1243,14 @@ bool SubversionPlugin::vcsCheckout(const QString &directory, const QByteArray &u // be a bug in subversion, so this might get fixed in the future. tempUrl.setUserInfo(""); args << tempUrl.toEncoded() << directory; - const SubversionResponse response = runSvn(directory, username, password, args, m_settings.longTimeOutMS(), - VCSBase::VCSBasePlugin::SshPasswordPrompt); + const SubversionResponse response = runSvn(directory, username, password, args, + m_settings.longTimeOutMS(), + VCSBase::VCSBasePlugin::SshPasswordPrompt); return !response.error; } else { args << url << directory; const SubversionResponse response = runSvn(directory, args, m_settings.longTimeOutMS(), - VCSBase::VCSBasePlugin::SshPasswordPrompt); + VCSBase::VCSBasePlugin::SshPasswordPrompt); return !response.error; } } From da79614008367eaf9913f216487c495cfbe472ce Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 29 Sep 2010 12:48:00 +0200 Subject: [PATCH 003/118] Translator corrections --- src/libs/utils/synchronousprocess.cpp | 2 +- src/plugins/debugger/cdb/cdbengine.cpp | 2 +- src/plugins/debugger/debuggeractions.cpp | 2 +- src/plugins/debugger/debuggerrunner.cpp | 2 +- src/plugins/help/generalsettingspage.ui | 2 +- .../qt4projectmanager/gettingstartedwelcomepagewidget.ui | 6 +++--- src/plugins/qt4projectmanager/librarydetailswidget.ui | 3 --- .../qt4projectmanager/qt-s60/s60createpackagestep.ui | 2 +- 8 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/libs/utils/synchronousprocess.cpp b/src/libs/utils/synchronousprocess.cpp index 7a8d5a007eb..c35b148d1bd 100644 --- a/src/libs/utils/synchronousprocess.cpp +++ b/src/libs/utils/synchronousprocess.cpp @@ -365,7 +365,7 @@ static inline bool askToKill(const QString &binary = QString()) SynchronousProcess::tr("The process is not responding.") : SynchronousProcess::tr("The process '%1' is not responding.").arg(binary); msg += QLatin1Char(' '); - msg += SynchronousProcess::tr(" Would you like to terminate it?"); + msg += SynchronousProcess::tr("Would you like to terminate it?"); // Restore the cursor that is set to wait while running. const bool hasOverrideCursor = QApplication::overrideCursor() != 0; if (hasOverrideCursor) diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index 363daa66d65..1fc7817e474 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -481,7 +481,7 @@ void CdbEngine::runEngine() } break; case AttachCore: - errorMessage = tr("Attaching to core files is not supported!"); + errorMessage = tr("Attaching to core files is not supported."); break; } if (rc) { diff --git a/src/plugins/debugger/debuggeractions.cpp b/src/plugins/debugger/debuggeractions.cpp index 2c6dfe58b1d..0a5ded2ed5b 100644 --- a/src/plugins/debugger/debuggeractions.cpp +++ b/src/plugins/debugger/debuggeractions.cpp @@ -240,7 +240,7 @@ DebuggerSettings *DebuggerSettings::instance() item->setCheckable(true); item->setDefaultValue(true); item->setSettingsKey(debugModeGroup, QLatin1String("AutoDerefPointers")); - item->setToolTip(tr("This switches the Locals&Watchers view to " + item->setToolTip(tr("This switches the Locals&&Watchers view to " "automatically dereference pointers. This saves a level in the " "tree view, but also loses data for the now-missing intermediate " "level.")); diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp index 7eea602ad8e..8c016620bbc 100644 --- a/src/plugins/debugger/debuggerrunner.cpp +++ b/src/plugins/debugger/debuggerrunner.cpp @@ -613,7 +613,7 @@ bool DebuggerRunControl::aboutToStop() const { QTC_ASSERT(isRunning(), return true;) - const QString question = tr("A debugging session are still in progress. " + const QString question = tr("A debugging session is still in progress. " "Terminating the session in the current" " state can leave the target in an inconsistent state." " Would you still like to terminate it?"); diff --git a/src/plugins/help/generalsettingspage.ui b/src/plugins/help/generalsettingspage.ui index 0bcd55ef5e7..2a49b659828 100644 --- a/src/plugins/help/generalsettingspage.ui +++ b/src/plugins/help/generalsettingspage.ui @@ -368,7 +368,7 @@ Switch to editor context after last help page is closed. - Return to editor on closing the last page + Return to editor on closing the last page diff --git a/src/plugins/qt4projectmanager/gettingstartedwelcomepagewidget.ui b/src/plugins/qt4projectmanager/gettingstartedwelcomepagewidget.ui index 226479a345f..f133869c2f4 100644 --- a/src/plugins/qt4projectmanager/gettingstartedwelcomepagewidget.ui +++ b/src/plugins/qt4projectmanager/gettingstartedwelcomepagewidget.ui @@ -457,14 +457,14 @@ border-bottom: 1px solid "#C9C9C9"; - Image + Image - Text + Text true @@ -489,7 +489,7 @@ border-bottom: 1px solid "#C9C9C9"; - Link + Link diff --git a/src/plugins/qt4projectmanager/librarydetailswidget.ui b/src/plugins/qt4projectmanager/librarydetailswidget.ui index cf8da064a48..af3be9bc3af 100644 --- a/src/plugins/qt4projectmanager/librarydetailswidget.ui +++ b/src/plugins/qt4projectmanager/librarydetailswidget.ui @@ -10,9 +10,6 @@ 306 - - Form - diff --git a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.ui b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.ui index 55aafb1b68e..a0278c33265 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.ui +++ b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.ui @@ -11,7 +11,7 @@ - Form + Form From 67cb7a32741d901e5963b8efdcb19500b53b3b76 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 29 Sep 2010 13:01:07 +0200 Subject: [PATCH 004/118] Update Polish translation --- share/qtcreator/translations/qtcreator_pl.ts | 7141 ++++++++++++++++-- 1 file changed, 6463 insertions(+), 678 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_pl.ts b/share/qtcreator/translations/qtcreator_pl.ts index b14f0ec62b3..c6d6120b74b 100644 --- a/share/qtcreator/translations/qtcreator_pl.ts +++ b/share/qtcreator/translations/qtcreator_pl.ts @@ -36,7 +36,7 @@ Compatibility Version: - Zgodność z wersją: + Zgodność z wersją: Vendor: @@ -44,7 +44,7 @@ Url: - Url: + Url: Location: @@ -70,6 +70,14 @@ Group: Grupa: + + Compatibility version: + + + + URL: + + ExtensionSystem::Internal::PluginErrorView @@ -79,7 +87,11 @@ Error Message: - Komunikat Błędu: + Komunikat Błędu: + + + Error message: + Komunikat błędu: @@ -109,11 +121,11 @@ TextLabel - Etykieta + Etykieta CheckBox - CheckBox + CheckBox @@ -197,12 +209,16 @@ &Path: Ś&cieżka: + + Inherits QDeclarativeItem + Wywiedziony z QDeclarativeItem + Utils::ProjectIntroPage Introduction and project location - Nazwa oraz położenie projektu + Nazwa oraz położenie projektu Name: @@ -228,6 +244,10 @@ Use as default project location Ustaw jako domyślne położenie projektów + + Introduction and Project Location + Nazwa oraz położenie projektu + Utils::SubmitEditorWidget @@ -243,6 +263,28 @@ F&iles Pl&iki + + Commit %1/%n Files + + + + + + + + Commit + Wyślij + + + Check All + Check all for submit + Zaznacz wszystko + + + Uncheck All + Uncheck all for submit + + Core::Internal::NewDialog @@ -516,8 +558,7 @@ p, li { white-space: pre-wrap; } &Case-sensitivity: - Uwzględnianie &wielkości liter: - + Uwzględnianie &wielkości liter: Full @@ -535,6 +576,22 @@ p, li { white-space: pre-wrap; } First Letter Tylko pierwsza litera + + Activate completion: + Uaktywniaj uzupełnianie: + + + Manually + Ręcznie + + + When Triggered + Tylko na żądanie + + + Always + Zawsze + CppFileSettingsPage @@ -575,7 +632,7 @@ p, li { white-space: pre-wrap; } Describe all files matching commit id - Opisz wszystkie pliki pasujące do identyfikatora operacji + Opisz wszystkie pliki zgodne z identyfikatorem operacji Timeout: @@ -614,6 +671,10 @@ p, li { white-space: pre-wrap; } Core File: + Plik zrzutu: + + + Core file: Plik zrzutu: @@ -632,11 +693,11 @@ p, li { white-space: pre-wrap; } BreakByFunctionDialog Set Breakpoint at Function - Ustaw pułapkę w funkcji + Ustaw pułapkę w funkcji Function to break on: - Funkcja w której przerwać: + Funkcja w której przerwać: @@ -649,6 +710,22 @@ p, li { white-space: pre-wrap; } Ignore count: Licznik pominięć: + + File name: + Nazwa pliku: + + + Line number: + Numer linii: + + + Function: + Funkcja: + + + Thread specification: + Specyfikacja wątku: + CdbOptionsPageWidget @@ -702,6 +779,10 @@ p, li { white-space: pre-wrap; } Fast loading of debugging helpers Szybkie ładowanie asystentów debuggera + + Break on exception + + CommonOptionsPage @@ -731,15 +812,15 @@ p, li { white-space: pre-wrap; } Language - Język + Język Changes the debugger language according to the currently opened file. - Zmienia język debuggera odpowiednio do zawartości otwartego pliku. + Zmienia język debuggera odpowiednio do zawartości otwartego pliku. Change debugger language automatically - Automatycznie zmieniaj język debuggera + Automatycznie zmieniaj język debuggera Register Qt Creator for debugging crashed applications. @@ -788,6 +869,16 @@ p, li { white-space: pre-wrap; } Use Debugging Helper Używaj asystenta debuggera + + QML Observer is used to offer additional debugging facilities to QML applications, such as interactive preview of code changes and inspection tools. + +It is not strictly necessary for debugging with Qt Creator. + + + + Use QML Observer + + GdbOptionsPage @@ -881,6 +972,10 @@ dla emisji sygnału wskoczy bezpośrednio do podłączonego slotu. Behavior of Breakpoint Setting in Plugins Ustawianie pułapek we wtyczkach + + Adjust Breakpoint Locations + Poprawiaj położenia pułapek + StartExternalDialog @@ -900,6 +995,10 @@ dla emisji sygnału wskoczy bezpośrednio do podłączonego slotu. Break at 'main': Przerwij w "main": + + Working directory: + Katalog roboczy: + StartRemoteDialog @@ -1002,7 +1101,7 @@ dla emisji sygnału wskoczy bezpośrednio do podłączonego slotu. vim's "tabstop" option - Opcja "tabstop" Vima + Opcja "tabstop" Vima Tabulator size: @@ -1072,6 +1171,18 @@ dla emisji sygnału wskoczy bezpośrednio do podłączonego slotu. Show position of text marks Pokazuj znaczniki + + Checking this box passes key sequences like Ctrl-S to the Creator core instead of interpreting them in FakeVim. This gives easier access to Creator core functionality at the price of losing some features of FakeVim. + + + + Pass control key + + + + Vim tabstop option + + Find::Internal::FindDialog @@ -1107,6 +1218,14 @@ dla emisji sygnału wskoczy bezpośrednio do podłączonego slotu. Search && Replace Wyszukaj i zastąp + + Use regular e&xpressions + Używaj wyrażeń &regularnych + + + Cancel + Anuluj + Find::Internal::FindWidget @@ -1128,7 +1247,23 @@ dla emisji sygnału wskoczy bezpośrednio do podłączonego slotu. All - Wszystko + Wszystko + + + Replace + Zastąp + + + Replace && Find + Zastąp i znajdź + + + Replace All + Zastąp wszystkie + + + Advanced... + Zaawansowane... @@ -1160,6 +1295,10 @@ dla emisji sygnału wskoczy bezpośrednio do podłączonego slotu. Diff Pokaż różnice + + Log + Dziennik + Refresh Odśwież @@ -1422,6 +1561,18 @@ dla emisji sygnału wskoczy bezpośrednio do podłączonego slotu. From System Z systemu + + Set "HOME" environment variable + Ustaw zmienną środowiskową "HOME" + + + Gitk + Gitk + + + Arguments: + Argumenty: + DocSettingsPage @@ -1474,6 +1625,10 @@ Add, modify, and remove document filters, which determine the documentation set Dodaj, zmodyfikuj lub usuń filtry dokumentów, które determinują zestaw dokumentacji wyświetlanej w trybie "Pomocy". Atrybuty są zdefiniowane w dokumentach. Zaznaczenie ich spowoduje wyświetlenie zestawu odpowiedniej dokumentacji. Zwróć uwagę że niektóre atrybuty mogą być zdefiniowane w kilku dokumentach. </p></body></html> + + No user defined filters available or no filter selected. + Brak dostępnych filtrów użytkownika lub żaden filtr nie jest zaznaczony. + GeneralSettingsPage @@ -1561,6 +1716,26 @@ Dodaj, zmodyfikuj lub usuń filtry dokumentów, które determinują zestaw dokum Show My Tabs from Last Session Pokazuj moje karty z ostatniej sesji + + Always Show Help in External Window + Zawsze pokazuj pomoc w zewnętrznym oknie + + + Behaviour + Zachowanie + + + Switch to editor context after last help page is closed. + Przełączaj do trybu edycji po zamknięciu ostatniej strony pomocy. + + + Return to editor on closing the last page + Powracaj do edytora po zamknięciu ostatniej strony + + + Return to editor on closing the last page + + Perforce::Internal::ChangeNumberDialog @@ -1657,6 +1832,10 @@ Dodaj, zmodyfikuj lub usuń filtry dokumentów, które determinują zestaw dokum Environment Variables Zmienne środowiskowe + + Automatically open files when editing + Automatycznie otwieraj pliki jeśli zostały zmodyfikowane + Perforce::Internal::SubmitPanel @@ -1688,7 +1867,7 @@ Dodaj, zmodyfikuj lub usuń filtry dokumentów, które determinują zestaw dokum ProjectExplorer::Internal::ProcessStepWidget Name: - Nazwa: + Nazwa: Command: @@ -1743,7 +1922,7 @@ Dodaj, zmodyfikuj lub usuń filtry dokumentów, które determinują zestaw dokum Always build project before running - Zawsze buduj projekt przed uruchomieniem + Zawsze buduj projekt przed uruchomieniem Show compiler output on building @@ -1757,6 +1936,18 @@ Dodaj, zmodyfikuj lub usuń filtry dokumentów, które determinują zestaw dokum <i>jom</i> is a drop-in replacement for <i>nmake</i> which distributes the compilation process to multiple CPU cores. The latest binary is available at <a href="ftp://ftp.qt.nokia.com/jom/">ftp://ftp.qt.nokia.com/jom/</a>. Disable it if you experience problems with your builds. <i>jom</i> jest zamiennikiem <i>nmake</i> który dystrybuuje proces kompilacji do wielu rdzeni procesora .Najnowsza wersja jest dostępna tu: <a href="ftp://ftp.qt.nokia.com/jom/">ftp://ftp.qt.nokia.com/jom/</a>. Wyłącz tę opcję jeśli doświadczasz problemów podczas budowania. + + Always build project before deploying it + Zawsze buduj projekt przed zainstalowaniem + + + Always deploy project before running it + Zawsze instaluj projekt przed uruchomieniem + + + Word-wrap application output + Zawijaj komunikaty aplikacji + ProjectExplorer::Internal::ProjectWelcomePageWidget @@ -1808,7 +1999,7 @@ Dodaj, zmodyfikuj lub usuń filtry dokumentów, które determinują zestaw dokum ProjectExplorer::Internal::WizardPage Project management - Organizacja projektu + Organizacja projektu The following files will be added: @@ -1830,6 +2021,10 @@ Dodaj, zmodyfikuj lub usuń filtry dokumentów, które determinują zestaw dokum Add to &version control: Dodaj do systemu kontroli &wersji: + + Project Management + Organizacja projektu + ProjectExplorer::Internal::RemoveFileDialog @@ -1854,16 +2049,32 @@ Dodaj, zmodyfikuj lub usuń filtry dokumentów, które determinują zestaw dokum ProjectExplorer::Internal::RunSettingsPropertiesPage + - + + + - - - + - Run configuration: Konfiguracja uruchamiania: + + Deployment: + Instalacja: + + + Add + Dodaj + + + Remove + Usuń + + + Rename + Zmień nazwę + ProjectExplorer::Internal::SessionDialog @@ -1907,6 +2118,14 @@ Dodaj, zmodyfikuj lub usuń filtry dokumentów, które determinują zestaw dokum <a href="qthelp://com.nokia.qtcreator/doc/creator-project-managing-sessions.html">What is a Session?</a> <a href="qthelp://com.nokia.qtcreator/doc/creator-project-managing-sessions.html">Co to jest sesja?</a> + + Automatically restore the last session when Qt Creator is started. + Automatycznie przywracaj ostatnią sesję po uruchomieniu Qt Creatora. + + + Restore last session on startup + Przywracaj ostatnią sesję po uruchomieniu + Qt4ProjectManager::Internal::ClassDefinition @@ -2113,6 +2332,10 @@ Dodaj, zmodyfikuj lub usuń filtry dokumentów, które determinują zestaw dokum Choose an example... + Wybierz przykład... + + + Choose an Example... Wybierz przykład... @@ -2167,6 +2390,10 @@ Dodaj, zmodyfikuj lub usuń filtry dokumentów, które determinują zestaw dokum Po dodaniu do projektu zewnętrznej biblioteki, Qt Creator automatycznie Podświetlanie składni i uzupełnianie kodu zadziała automatycznie również dla zewnętrznych bibliotek dodanych do projektu. + + You can quickly search methods, classes, help and more using the <a href="qthelp://com.nokia.qtcreator/doc/creator-editor-locator.html">Locator bar</a> (<tt>%1+K</tt>). + Używając <a href="qthelp://com.nokia.qtcreator/doc/creator-editor-locator.html">lokalizatora</a> (<tt>%1+K</tt>) możesz szybko znaleźć metody, klasy, itd. lub przeszukać dokumentację. + You can switch between Qt Creator's modes using <tt>Ctrl+number</tt>:<ul><li>1 - Welcome</li><li>2 - Edit</li><li>3 - Debug</li><li>4 - Projects</li><li>5 - Help</li></ul> Możesz przełączać tryby Qt Creator'a używając <tt>Ctrl+liczba</tt>:<ul><li>1 - Powitanie</li><li>2 - Edycja</li><li>3 - Debugowanie</li><li>4 - Projekty</li><li>5 - Pomoc</li></ul> @@ -2213,7 +2440,7 @@ Dodaj, zmodyfikuj lub usuń filtry dokumentów, które determinują zestaw dokum You can quickly search methods, classes, help and more using the <a href="qthelp://com.nokia.qtcreator/doc/creator-navigation.html">Locator bar</a> (<tt>%1+K</tt>). - Używając <a href="qthelp://com.nokia.qtcreator/doc/creator-navigation.html">lokalizatora</a> (<tt>%1+K</tt>) możesz szybko znaleźć metody, klasy, itd. lub przeszukać dokumentację. + Używając <a href="qthelp://com.nokia.qtcreator/doc/creator-navigation.html">lokalizatora</a> (<tt>%1+K</tt>) możesz szybko znaleźć metody, klasy, itd. lub przeszukać dokumentację. You can add custom build steps in the <a href="qthelp://com.nokia.qtcreator/doc/creator-build-settings.html">build settings</a>. @@ -2255,6 +2482,30 @@ Dodaj, zmodyfikuj lub usuń filtry dokumentów, które determinują zestaw dokum Open Project... Otwórz projekt... + + Examples + Przykłady + + + Explore Qt C++ Mobile Examples + Poznaj dogłębnie mobilne przykłady Qt C++ + + + Featured + + + + Image + Obrazek + + + Text + Tekst + + + Link + Odsyłacz + MakeStep @@ -2289,6 +2540,10 @@ Dodaj, zmodyfikuj lub usuń filtry dokumentów, które determinują zestaw dokum Release Release + + Debug and release + Debug i release + Qt4ProjectManager::Internal::S60DevicesPreferencePane @@ -2351,9 +2606,21 @@ Dodaj, zmodyfikuj lub usuń filtry dokumentów, które determinują zestaw dokum General Ogólne + + Invalid Qt version + Niepoprawna wersja Qt + + + Error: + Błąd: + + + Warning: + Ostrzeżenie: + Building in subdirectories of the source directory is not supported by qmake. - Budowanie wewnątrz katalogu ze źródłami nie jest obsługiwane przez qmake. + Budowanie wewnątrz katalogu ze źródłami nie jest obsługiwane przez qmake. An incompatible build exists in %1, which will be overwritten. @@ -2366,7 +2633,7 @@ Dodaj, zmodyfikuj lub usuń filtry dokumentów, które determinują zestaw dokum Configuration name: - Nazwa konfiguracji: + Nazwa konfiguracji: Qt version: @@ -2374,7 +2641,7 @@ Dodaj, zmodyfikuj lub usuń filtry dokumentów, które determinują zestaw dokum This Qt version is invalid. - Ta wersja Qt nie jest poprawna. + Ta wersja Qt nie jest poprawna. Tool chain: @@ -2405,7 +2672,7 @@ Dodaj, zmodyfikuj lub usuń filtry dokumentów, które determinują zestaw dokum p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#ff0000;">Unable to detect MSVC version.</span></p></body></html> - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> @@ -2461,7 +2728,15 @@ p, li { white-space: pre-wrap; } Debugging helper: - Asystent debuggera: + Asystent debuggera: + + + Unable to detect MSVC version. + Nie można określić wersji MSVC. + + + Debugging helpers: + @@ -2636,6 +2911,93 @@ p, li { white-space: pre-wrap; } In Leading White Space Jeśli poprzedzony jest spacją + + <html><head/><body> +Controls the indentation style of curly brace blocks. + +<ul> +<li>Exclude Braces: The braces are not indented. +<pre> +void foo() +{ + if (a) + { + bar(); + } +} +</pre> +</li> + +<li>Include Braces: The braces are indented. The contents of the block are on the same level as the braces. +<pre> +void foo() + { + if (a) + { + bar(); + } + } +</pre> +</li> + +<li>GNU Style: Indent the braces for blocks in statements. The contents are indented twice. +<pre> +void foo() +{ + if (a) + { + bar(); + } +} +</pre> +</li> +</ul></body></html> + + + + Align continuation lines: + + + + <html><head/><body> +Influences the indentation of continuation lines. + +<ul> +<li>Not At All: Do not align at all. Lines will only be indented to the current logical indentation depth. +<pre> +(tab)int i = foo(a, b +(tab)c, d); +</pre> +</li> + +<li>With Spaces: Always use spaces for alignment, regardless of the other indentation settings. +<pre> +(tab)int i = foo(a, b +(tab) c, d); +</pre> +</li> + +<li>With Regular Indent: Use tabs and/or spaces for alignment, as configured above. +<pre> +(tab)int i = foo(a, b +(tab)(tab)(tab) c, d); +</pre> +</li> +</ul></body></html> + + + + Not At All + + + + With Spaces + + + + With Regular Indent + + TextEditor::Internal::ColorSchemeEdit @@ -2657,12 +3019,16 @@ p, li { white-space: pre-wrap; } Erase background - Wyczyść tło + Wyczyść kolor tło x x + + Erase foreground + Wyczyść kolor pierwszoplanowy + TextEditor::DisplaySettingsPage @@ -2776,11 +3142,23 @@ p, li { white-space: pre-wrap; } Path: Ścieżka: + + Branch: + Gałąź: + + + ... + ... + NickNameDialog Nick Names + Przydomki + + + Nicknames Przydomki @@ -2796,7 +3174,7 @@ p, li { white-space: pre-wrap; } <b>Forum Nokia</b><br /><font color='gray'>Mobile Application Support</font> - <b>Forum Nokii</b><br /><font color='gray'>Wsparcie techniczne dla mobilnych aplikacji</font> + <b>Forum Nokii</b><br /><font color='gray'>Wsparcie techniczne dla mobilnych aplikacji</font> <b>Qt LGPL Support</b><br /><font color='gray'>Buy professional Qt support</font> @@ -2808,7 +3186,15 @@ p, li { white-space: pre-wrap; } <b>Qt Centre</b><br /><font color='gray'>Community based Qt support</font> - <b>Qt Centre</b><br /><font color='gray'>Społeczne wsparcie techniczne Qt</font> + <b>Qt Centre</b><br /><font color='gray'>Społeczne wsparcie techniczne Qt</font> + + + <b>Forum Nokia</b><br /><font color='gray'>Mobile application support</font> + <b>Forum Nokii</b><br /><font color='gray'>Wsparcie techniczne dla mobilnych aplikacji</font> + + + <b>Qt DevNet</b><br /><font color='gray'>Qt Developer Resources</font> + <b>Qt DevNet</b><br /><font color='gray'>Zasoby deweloperskie Qt</font> <b>Qt Home</b><br /><font color='gray'>Qt by Nokia on the web</font> @@ -2824,6 +3210,7 @@ p, li { white-space: pre-wrap; } http://labs.trolltech.com/blogs/feed + Add localized feed here only if one exists http://labs.trolltech.com/blogs/feed @@ -2874,7 +3261,7 @@ p, li { white-space: pre-wrap; } Add in Folder: - Dodaj w katalogu: + Dodaj w katalogu: + @@ -2896,6 +3283,10 @@ p, li { white-space: pre-wrap; } Rename Folder Zmień nazwę katalogu + + Add in folder: + Dodaj w katalogu: + FilterNameDialogClass @@ -2926,6 +3317,10 @@ p, li { white-space: pre-wrap; } &Close &Zamknij + + Filter + Filtr + Choose a topic for <b>%1</b>: Wybierz temat dla <b>%1</b>: @@ -3240,9 +3635,13 @@ Przyczyna: %3 Cannot create temporary directory '%1': %2 Nie można utworzyć tymczasowego katalogu "%1": %2 + + Unexpected output from helper program (%1). + Nieoczekiwany komunikat od programu pomocniczego (%1). + Unexpected output from helper program. - Nieoczekiwany komunikat od programu pomocniczego. + Nieoczekiwany komunikat od programu pomocniczego. Cannot change to working directory '%1': %2 @@ -3284,23 +3683,23 @@ Przyczyna: %3 Utils::FileNameValidatingLineEdit Name is empty. - Nazwa jest pusta. + Nazwa jest pusta. Name contains white space. - Nazwa zawiera spacje. + Nazwa zawiera spację. Invalid character '%1'. - Niepoprawny znak: "%1". + Niepoprawny znak: "%1". Invalid characters '%1'. - Niepoprawne znaki: "%1". + Niepoprawne znaki: "%1". Name matches MS Windows device. (%1). - Nazwa pasuje do urządzenia MS Windows. (%1). + Nazwa wskazuje na urządzenie MS Windows. (%1). @@ -3344,10 +3743,23 @@ Przyczyna: %3 Choose Directory Wybierz katalog + + Choose Executable + Wybierz plik wykonywalny + Choose File + + <not valid> + Selected path is not valid: + <niepoprawny> + + + Full path: <b>%1</b> + Pełna ścieżka: <b>%1</b> + The path must not be empty. Ścieżka nie może być pusta. @@ -3356,13 +3768,25 @@ Przyczyna: %3 The path '%1' does not exist. Ścieżka "%1" nie istnieje. + + The path <b>%1</b> is not a directory. + Ścieżka <b>%1</b> nie jest katalogiem. + + + The path <b>%1</b> is not a file. + Ścieżka <b>%1</b> nie jest plikiem. + + + The path <b>%1</b> is not a executable file. + Ścieżka <b>%1</b> nie jest plikiem wykonywalnym. + The path '%1' is not a directory. - "%1" nie jest katalogiem. + "%1" nie jest katalogiem. The path '%1' is not a file. - "%1" nie jest plikiem. + "%1" nie jest plikiem. Path: @@ -3548,11 +3972,11 @@ Przyczyna: %3 CMakeProjectManager::Internal::CMakeRunPage Please specify the path to the cmake executable. No cmake executable was found in the path. - Podaj ścieżkę do programu cmake. Programu cmake nie wykryto w ścieżce. + Podaj ścieżkę do programu cmake. Programu cmake nie wykryto w ścieżce. The cmake executable (%1) does not exist. - Program cmake (%1) nie istnieje. + Program cmake (%1) nie istnieje. The path %1 is not a executable. @@ -3560,7 +3984,7 @@ Przyczyna: %3 The path %1 is not a valid cmake. - Ścieżka %1 nie pokazuje na poprawny program cmake. + Ścieżka %1 nie pokazuje na poprawny program cmake. Run CMake @@ -3572,23 +3996,59 @@ Przyczyna: %3 The directory %1 already contains a cbp file, which is recent enough. You can pass special arguments or change the used toolchain here and rerun cmake. Or simply finish the wizard directly - Katalog %1 zawiera już uaktualniony plik cbp. Możesz przekazać specjalne argumenty lub zmienić istniejący zestaw narzędzi i ponownie uruchomić cmake. Możesz również bezpośrednio zakończyć kreatora. + Katalog %1 zawiera już uaktualniony plik cbp. Możesz przekazać specjalne argumenty lub zmienić istniejący zestaw narzędzi i ponownie uruchomić cmake. Możesz również bezpośrednio zakończyć kreatora. The directory %1 does not contain a cbp file. Qt Creator needs to create this file by running cmake. Some projects require command line arguments to the initial cmake call. - Katalog %1 nie zawiera pliku cbp. Qt Creator wymaga utworzenia go poprzez uruchomienie cmake. Niektóre projekty wymagają dodatkowych argumentów w komendzie cmake. + Katalog %1 nie zawiera pliku cbp. Qt Creator wymaga utworzenia go poprzez uruchomienie cmake. Niektóre projekty wymagają dodatkowych argumentów w komendzie cmake. The directory %1 contains an outdated .cbp file. Qt Creator needs to update this file by running cmake. If you want to add additional command line arguments, add them below. Note that cmake remembers command line arguments from the previous runs. - Katalog %1 zawiera nieaktualny plik cbp. Qt Creator wymaga uaktualnienia go poprzez uruchomienie cmake. Poniżej podaj dodatkowe argumenty dla komendy cmake. Zwróć uwagę że cmake zapamiętuje argumenty komendy z ostatniego uruchomienia. + Katalog %1 zawiera nieaktualny plik cbp. Qt Creator wymaga uaktualnienia go poprzez uruchomienie cmake. Poniżej podaj dodatkowe argumenty dla komendy cmake. Zwróć uwagę że cmake zapamiętuje argumenty komendy z ostatniego uruchomienia. The directory %1 specified in a build-configuration, does not contain a cbp file. Qt Creator needs to recreate this file, by running cmake. Some projects require command line arguments to the initial cmake call. Note that cmake remembers command line arguments from the previous runs. - Katalog %1 podany w konfiguracji budowania nie zawiera pliku cbp. Qt Creator wymaga utworzenia go poprzez uruchomienie cmake. Niektóre projekty wymagają dodatkowych argumentów w komendzie cmake. Zwróć uwagę że cmake zapamiętuje argumenty komendy z ostatniego uruchomienia. + Katalog %1 podany w konfiguracji budowania nie zawiera pliku cbp. Qt Creator wymaga utworzenia go poprzez uruchomienie cmake. Niektóre projekty wymagają dodatkowych argumentów w komendzie cmake. Zwróć uwagę że cmake zapamiętuje argumenty komendy z ostatniego uruchomienia. Qt Creator needs to run cmake in the new build directory. Some projects require command line arguments to the initial cmake call. - Qt Creator wymaga uruchomienia cmake w nowym katalogu budowania. Niektóre projekty wymagają dodatkowych argumentów w komendzie cmake. + Qt Creator wymaga uruchomienia cmake w nowym katalogu budowania. Niektóre projekty wymagają dodatkowych argumentów w komendzie cmake. + + + Please specify the path to the CMake executable. No CMake executable was found in the path. + Podaj ścieżkę do programu CMake. Programu CMake nie wykryto w ścieżce. + + + The CMake executable (%1) does not exist. + Program CMake (%1) nie istnieje. + + + The path %1 is not a valid CMake. + Ścieżka %1 nie pokazuje na poprawny program CMake. + + + The directory %1 already contains a cbp file, which is recent enough. You can pass special arguments or change the used toolchain here and rerun CMake. Or simply finish the wizard directly. + Katalog %1 zawiera już uaktualniony plik cbp. Możesz przekazać specjalne argumenty lub zmienić istniejący zestaw narzędzi i ponownie uruchomić CMake. Możesz również bezpośrednio zakończyć kreatora. + + + The directory %1 does not contain a cbp file. Qt Creator needs to create this file by running CMake. Some projects require command line arguments to the initial CMake call. + Katalog %1 nie zawiera pliku cbp. Qt Creator wymaga utworzenia go poprzez uruchomienie CMake. Niektóre projekty wymagają dodatkowych argumentów w komendzie CMake. + + + The directory %1 contains an outdated .cbp file. Qt Creator needs to update this file by running CMake. If you want to add additional command line arguments, add them below. Note that CMake remembers command line arguments from the previous runs. + Katalog %1 zawiera nieaktualny plik cbp. Qt Creator wymaga uaktualnienia go poprzez uruchomienie CMake. Poniżej podaj dodatkowe argumenty dla komendy CMake. Zwróć uwagę że CMake zapamiętuje argumenty komendy z ostatniego uruchomienia. + + + The directory %1 specified in a build-configuration, does not contain a cbp file. Qt Creator needs to recreate this file, by running CMake. Some projects require command line arguments to the initial CMake call. Note that CMake remembers command line arguments from the previous runs. + Katalog %1 podany w konfiguracji budowania nie zawiera pliku cbp. Qt Creator wymaga utworzenia go poprzez uruchomienie CMake. Niektóre projekty wymagają dodatkowych argumentów w komendzie CMake. Zwróć uwagę że CMake zapamiętuje argumenty komendy z ostatniego uruchomienia. + + + Qt Creator needs to run CMake in the new build directory. Some projects require command line arguments to the initial CMake call. + Qt Creator wymaga uruchomienia CMake w nowym katalogu budowania. Niektóre projekty wymagają dodatkowych argumentów w komendzie CMake. + + + Refreshing cbp file in %1. + Odświeżanie pliku cbp w "%1". NMake Generator @@ -3602,9 +4062,13 @@ Przyczyna: %3 MinGW Generator Generator MinGW + + No valid CMake executable specified. + Brak poprawnego pliku wykonywalnego CMake. + No valid cmake executable specified. - Brak poprawnego pliku wykonywalnego cmake. + Brak poprawnego pliku wykonywalnego cmake. @@ -3614,16 +4078,28 @@ Przyczyna: %3 Budowanie - New configuration + New Configuration Nowa konfiguracja - New Configuration Name: + New configuration name: Nazwa nowej konfiguracji: + + New configuration + Nowa konfiguracja + + + New Configuration Name: + Nazwa nowej konfiguracji: + CMakeProjectManager::Internal::CMakeBuildSettingsWidget + + Reconfigure project: + Przekonfiguruj projekt: + &Change &Zmień @@ -3656,8 +4132,16 @@ Przyczyna: %3 Working Directory: + Katalog roboczy: + + + Working directory: Katalog roboczy: + + Debugger: + Debugger: + Run Environment Środowisko uruchamiania @@ -3805,6 +4289,10 @@ Czy chcesz je nadpisać? Resource Editor Edytor zasobów + + Image Viewer + Przeglądarka plików graficznych + Core::Internal::OpenWithDialog @@ -4011,6 +4499,10 @@ Czy chcesz je nadpisać? Go to Next Split Przejdź do kolejnego podzielonego okna + + The file <i>%1</i> is read only. + Plik <i>%1</i> jest plikiem tylko do odczytu. + Save %1 &As... Zachowaj %1 j&ako... @@ -4029,7 +4521,7 @@ Czy chcesz je nadpisać? All Files (*) - Wszystkie pliki (*) + Wszystkie pliki (*) Opening File @@ -4045,7 +4537,7 @@ Czy chcesz je nadpisać? The file %1 is read only. - Plik %1 jest plikiem tylko do odczytu. + Plik %1 jest plikiem tylko do odczytu. Open with VCS (%1) @@ -4409,15 +4901,15 @@ Czy chcesz je nadpisać? Core::Internal::NavigationWidget Hide Sidebar - Ukrywaj boczny pasek + Ukrywaj boczny pasek Show Sidebar - Pokazuj boczny pasek + Pokazuj boczny pasek Activate %1 Pane - Uaktywnij panel %1 + Uaktywnij panel %1 @@ -4435,7 +4927,7 @@ Czy chcesz je nadpisać? Core::Internal::NavComboBox Activate %1 - Uaktywnij %1 + Uaktywnij %1 @@ -4535,7 +5027,7 @@ Czy chcesz je nadpisać? Core::Internal::ComboBox Activate %1 - Uaktywnij %1 + Uaktywnij %1 @@ -4721,6 +5213,14 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Switch Between Method Declaration/Definition Przełącz między deklaracją a definicją metody + + Open Type Hierarchy + Otwórz hierarchię typów + + + Ctrl+Shift+T + Ctrl+Shift+T + Rename Symbol Under Cursor Zmień nazwę symbolu pod kursorem @@ -4771,6 +5271,10 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. CppTools::Internal::CppCurrentDocumentFilter Methods in current Document + Metody w bieżącym dokumencie + + + Methods in Current Document Metody w bieżącym dokumencie @@ -4986,6 +5490,26 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Revert "%1"... Odwróć zmiany w "%1"... + + Edit + Zmodyfikuj + + + Edit "%1" + Zmodyfikuj "%1" + + + Unedit + Cofnij modyfikacje + + + Unedit "%1" + Cofnij modyfikacje w "%1" + + + Unedit Repository + Cofnij modyfikacje w składnicy + Diff Project "%1" Pokaż różnice w projekcie "%1" @@ -5014,10 +5538,30 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Update Project "%1" Uaktualnij projekt "%1" + + Commit Project + Wyślij projekt + + + Commit Project "%1" + Wyślij projekt "%1" + + + Diff Repository + Pokaż zmiany w składnicy + + + Repository Status + Stan składnicy + Repository Log Dziennik składnicy + + Update Repository + Uaktualnij składnicę + Revert Repository... Odwróć zmiany w składnicy... @@ -5082,10 +5626,22 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Cannot create temporary file: %1 Nie można utworzyć tymczasowego pliku: %1 + + Would you like to discard your changes to the repository '%1'? + + + + Would you like to discard your changes to the file '%1'? + + Project status Stan projektu + + Repository status + + The initial revision %1 cannot be described. Początkowa poprawka %1 nie może być opisana. @@ -5097,13 +5653,13 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Executing: %1 %2 - Wykonywanie: %1 %2 + Wykonywanie: %1 %2 Executing in %1: %2 %3 - Wykonywanie w %1: %2 %3 + Wykonywanie w %1: %2 %3 @@ -5112,19 +5668,19 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. The process terminated with exit code %1. - Proces zakończył się kodem wyjściowym %1. + Proces zakończył się kodem wyjściowym %1. The process terminated abnormally. - Proces niepoprawnie zakończony. + Proces niepoprawnie zakończony. Could not start cvs '%1'. Please check your settings in the preferences. - Nie można uruchomić cvs "%1". Sprawdź stosowne ustawienia. + Nie można uruchomić cvs "%1". Sprawdź stosowne ustawienia. CVS did not respond within timeout limit (%1 ms). - CVS nie odpowiedział w określonym czasie (%1 ms). + CVS nie odpowiedział w określonym czasie (%1 ms). @@ -5171,6 +5727,26 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Property Właściwość + + Breakpoint Type: + Typ pułapki: + + + Breakpoint + Breakpoint + + + Watchpoint + Watchpoint + + + Unknown breakpoint type + Nieznany typ pułapki + + + State: + Stan: + Requested Zażądano @@ -5207,6 +5783,10 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Ignore Count: Licznik pominięć: + + Thread Specification: + Specyfikacja wątku: + Number Numer @@ -5235,6 +5815,10 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Address Adres + + Threads + Wątki + Breakpoint will only be hit if this condition is met. Program przerwie działanie w pułapce tylko gdy ten warunek będzie spełniony. @@ -5243,6 +5827,14 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Breakpoint will only be hit after being ignored so many times. Program przerwie działanie w pułapce po tym jak zostanie ona zignorowana podaną ilość razy. + + (all) + (wszystko) + + + Breakpoint will only be hit in the specified thread(s). + Program przerwie działanie w pułapce tylko w podanych wątkach. + Debugger::Internal::BreakWindow @@ -5274,9 +5866,33 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Always Adjust Column Widths to Contents Zawsze wyrównuj szerokości kolumn do ich zawartości + + Edit Breakpoint... + Zmodyfikuj pułapkę... + + + Associate Breakpoint With All Threads + Skojarz pułapkę ze wszystkimi wątkami + + + Associate Breakpoint With Thread %1 + Skojarz pułapkę z wątkiem %1 + + + Add Breakpoint... + + + + Edit Breakpoint Properties + + + + Set Breakpoint... + Ustaw pułapkę... + Edit Condition... - Zmodyfikuj warunek... + Zmodyfikuj warunek... Synchronize Breakpoints @@ -5308,11 +5924,11 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Set Breakpoint at Function... - Ustaw pułapkę w funkcji... + Ustaw pułapkę w funkcji... Set Breakpoint at Function "main" - Ustaw pułapkę w funkcji "main" + Ustaw pułapkę w funkcji "main" Set Breakpoint at "throw" @@ -5324,7 +5940,7 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Conditions on Breakpoint %1 - Warunki dla pułapki %1 + Warunki dla pułapki %1 @@ -5332,123 +5948,119 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. The function "%1()" failed: %2 Function call failed - Funkcja "%1()" zakończona niepowodzeniem: %2 + Funkcja "%1()" zakończona niepowodzeniem: %2 Version: %1 - Wersja: %1 + Wersja: %1 <html>The installed version of the <i>Debugging Tools for Windows</i> (%1) is rather old. Upgrading to version %2 is recommended for the proper display of Qt's data types.</html> - <html>Zainstalowana wersja <i>narzędzi debugowych dla Windows</i> (%1) jest przestarzała. Zalecane jest uaktualnienie do wersji %2 w celu poprawnego wyświetlania typów danych Qt.</html> + <html>Zainstalowana wersja <i>narzędzi debugowych dla Windows</i> (%1) jest przestarzała. Zalecane jest uaktualnienie do wersji %2 w celu poprawnego wyświetlania typów danych Qt.</html> Debugger - Debugger + Debugger The dumper library was not found at %1. - Biblioteka zrzutów nie została znaleziona w %1. - - - The console stub process was unable to start '%1'. - + Biblioteka zrzutów nie została znaleziona w %1. Attaching to core files is not supported! - Dołączanie się do pliku zrzutu nie jest obsługiwane! + Dołączanie się do pliku zrzutu nie jest obsługiwane! The process exited with exit code %1. - Proces zakończył się kodem wyjściowym %1. + Proces zakończył się kodem wyjściowym %1. Continuing with '%1'... - Kontynuacja z "%1"... + Kontynuacja z "%1"... Unable to continue: %1 - Nie można kontynuować: %1 + Nie można kontynuować: %1 Reverse stepping is not implemented. - Kroczenie wstecz nie jest zaimplementowane. + Kroczenie wstecz nie jest zaimplementowane. Thread %1 cannot be stepped. - Wątek %1 nie może być śledzony krok po kroku. + Wątek %1 nie może być śledzony krok po kroku. Stepping %1 - Kroczenie %1 + Kroczenie %1 Running requested... - Zażądano uruchomienia... + Zażądano uruchomienia... Running up to %1:%2... - Wykonanie do osiągnięcia %1:%2... + Wykonanie do osiągnięcia %1:%2... Running up to function '%1()'... - Wykonanie do osiągnięcia funkcji '%1()'... + Wykonanie do osiągnięcia funkcji '%1()'... Jump to line is not implemented - Skok do linii nie jest obsługiwany + Skok do linii nie jest obsługiwany Unable to assign the value '%1' to '%2': %3 - Nie można podstawić wartości "%1" do "%2": %3 + Nie można podstawić wartości "%1" do "%2": %3 Unable to retrieve %1 bytes of memory at 0x%2: %3 - Nie można odczytać %1 bajtów pamięci spod adresu 0x%2: %3 + Nie można odczytać %1 bajtów pamięci spod adresu 0x%2: %3 Cannot retrieve symbols while the debuggee is running. - Nie można odczytać symboli dopóki debugowany program pracuje. + Nie można odczytać symboli dopóki debugowany program pracuje. Debugger Error - Błąd debuggera + Błąd debuggera Ignoring initial breakpoint... - Zignorowano początkową pułapkę... + Zignorowano początkową pułapkę... Interrupted in thread %1, current thread: %2 - Przerwano w wątku %1, bieżący wątek: %2 + Przerwano w wątku %1, bieżący wątek: %2 Stopped, current thread: %1 - Zatrzymano, bieżący wątek: %1 + Zatrzymano, bieżący wątek: %1 Changing threads: %1 -> %2 - Zmiana wątków: %1 -> %2 + Zmiana wątków: %1 -> %2 Stopped at %1:%2 in thread %3. - Zatrzymano w %1:%2 w wątku %3. + Zatrzymano w %1:%2 w wątku %3. Stopped at %1 in thread %2 (missing debug information). - Zatrzymano w %1 w wątku %2 (brak informacji debugowej). + Zatrzymano w %1 w wątku %2 (brak informacji debugowej). Stopped at %1 (%2) in thread %3 (missing debug information). - Zatrzymano w %1 (%2) w wątku %3 (brak informacji debugowej). + Zatrzymano w %1 (%2) w wątku %3 (brak informacji debugowej). Stopped in thread %1 (missing debug information). - Zatrzymano w wątku %1 (brak informacji debugowej). + Zatrzymano w wątku %1 (brak informacji debugowej). Breakpoint: %1 - Pułapka: %1 + Pułapka: %1 @@ -5566,7 +6178,7 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Pick a local cache directory - Wybierz katalog z lokalnym cache + Wybierz katalog z lokalnym cache @@ -5577,7 +6189,7 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. This switches the Locals&Watchers view to automatically derefence pointers. This saves a level in the tree view, but also loses data for the now-missing intermediate level. - Włącza automatyczne wyłuskiwanie wskaźników w widoku ze zmiennymi lokalnymi i obserwowanymi. Brak jednego poziomu w widoku upraszcza go, ale jednocześnie powoduje utratę danych w brakującym poziomie pośrednim. + Włącza automatyczne wyłuskiwanie wskaźników w widoku ze zmiennymi lokalnymi i obserwowanymi. Brak jednego poziomu w widoku upraszcza go, ale jednocześnie powoduje utratę danych w brakującym poziomie pośrednim. Debugger Properties... @@ -5617,15 +6229,19 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Watch Expression "%1" - Obserwuj wyrażenie "%1" + Obserwuj wyrażenie "%1" Remove Watch Expression "%1" - Usuń obserwowanie wyrażenia "%1" + Usuń obserwowanie wyrażenia "%1" Watch Expression "%1" in Separate Window - Obserwuj wyrażenie "%1" w osobnym oknie + Obserwuj wyrażenie "%1" w osobnym oknie + + + This switches the Locals&Watchers view to automatically dereference pointers. This saves a level in the tree view, but also loses data for the now-missing intermediate level. + Włącza automatyczne wyłuskiwanie wskaźników w widoku ze zmiennymi lokalnymi i obserwowanymi. Brak jednego poziomu w widoku upraszcza go, ale jednocześnie powoduje utratę danych w brakującym poziomie pośrednim. Show "std::" Namespace in Types @@ -5635,6 +6251,10 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Show Qt's Namespace in Types Pokazuj przestrzeń nazw Qt w widoku typów + + Sort Members of Classes and Structs Alphabetically + Sortuj alfabetycznie składniki klas i struktur + Use Debugging Helpers Używaj asystenta debuggera @@ -5653,7 +6273,15 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Recheck Debugging Helper Availability - Sprawdź ponownie dostępność asystenta debuggera + Sprawdź ponownie dostępność asystenta debuggera + + + This switches the Locals&&Watchers view to automatically dereference pointers. This saves a level in the tree view, but also loses data for the now-missing intermediate level. + + + + Use QML Observer + Synchronize Breakpoints @@ -5667,6 +6295,14 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Selecting this causes breakpoint synchronization being done after each step. This results in up-to-date breakpoint information on whether a breakpoint has been resolved after loading shared libraries, but slows down stepping. Wybranie tej opcji spowoduje synchronizację pułapek po każdym kroku. W rezultacie informacja o rozwiązaniu pułapek po załadowaniu dzielonych bibliotek będzie aktualizowana na bieżąco, ale kroki będą wykonywane w dłuższym czasie. + + Adjust Breakpoint Locations + Poprawiaj położenia pułapek + + + Not all source code lines generate executable code. Putting a breakpoint on such a line acts as if the breakpoint was set on the next line that generated code. Selecting 'Adjust Breakpoint Locations' shifts the red breakpoint markers in such cases to the location of the true breakpoint. + + Break on "throw" Przerwij w "throw" @@ -5737,11 +6373,11 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Change debugger language automatically - Automatycznie zmieniaj język debuggera + Automatycznie zmieniaj język debuggera Changes the debugger language according to the currently opened file. - Zmienia język debuggera odpowiednio do zawartości otwartego pliku. + Zmienia język debuggera odpowiednio do zawartości otwartego pliku. Checking this will enable tooltips in the locals view during debugging. @@ -5791,85 +6427,85 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Error Loading Symbols - Błąd w trakcie ładowania symboli + Błąd w trakcie ładowania symboli No executable to load symbols from specified. - Nie podano programu z którego można załadować symbole. + Nie podano programu z którego można załadować symbole. Symbols found. - Symbole odnalezione. + Symbole odnalezione. Loading symbols from "%1" failed: - Nie można załadować symboli z "%1": + Nie można załadować symboli z "%1": Attached to core temporarily. - Tymczasowo dołączono do zrzutu. + Tymczasowo dołączono do zrzutu. Unable to determine executable from core file. - Nie można określić pliku wykonywalnego na podstawie zrzutu pamięci. + Nie można określić pliku wykonywalnego na podstawie zrzutu pamięci. Attached to core. - Dołączono do zrzutu. + Dołączono do zrzutu. Attach to core "%1" failed: - Dołączenie do zrzutu "%1" nie powiodło się: + Dołączenie do zrzutu "%1" nie powiodło się: Cannot set up communication with child process: %1 - Nie można ustanowić komunikacji z podprocesem: %1 + Nie można ustanowić komunikacji z podprocesem: %1 Starting executable failed: - Nie można uruchomić programu: + Nie można uruchomić programu: The upload process failed to start. Shell missing? - Nie można rozpocząć procesu przesyłania. Brak powłoki? + Nie można rozpocząć procesu przesyłania. Brak powłoki? The upload process crashed some time after starting successfully. - Proces przesyłania zakończony błędem po poprawnym uruchomieniu. + Proces przesyłania zakończony błędem po poprawnym uruchomieniu. The last waitFor...() function timed out. The state of QProcess is unchanged, and you can try calling waitFor...() again. - Ostatnie wywołanie funkcji waitFor...() zakończyło się niepowodzeniem po określonym czasie. Stan QProcess się nie zmienił, możesz ponownie spróbować wywołać waitFor...(). + Ostatnie wywołanie funkcji waitFor...() zakończyło się niepowodzeniem po określonym czasie. Stan QProcess się nie zmienił, możesz ponownie spróbować wywołać waitFor...(). An error occurred when attempting to write to the upload process. For example, the process may not be running, or it may have closed its input channel. - Wystąpił błąd podczas próby pisania do procesu przesyłania. Być może proces nie jest uruchomiony lub zamknął on swój kanał wejściowy. + Wystąpił błąd podczas próby pisania do procesu przesyłania. Być może proces nie jest uruchomiony lub zamknął on swój kanał wejściowy. An error occurred when attempting to read from the upload process. For example, the process may not be running. - Wystąpił błąd podczas próby czytania z procesu przesyłania. Być może proces nie jest uruchomiony. + Wystąpił błąd podczas próby czytania z procesu przesyłania. Być może proces nie jest uruchomiony. An unknown error in the upload process occurred. This is the default return value of error(). - Wystąpił nieznany błąd podczas procesu przesyłania. Jest to domyślna wartość zwrócona przez error(). + Wystąpił nieznany błąd podczas procesu przesyłania. Jest to domyślna wartość zwrócona przez error(). Error - Błąd + Błąd Starting remote executable failed: - Uruchamianie zdalnego programu zakończone niepowodzeniem: + Uruchamianie zdalnego programu zakończone niepowodzeniem: Debugger Error - Błąd debuggera + Błąd debuggera @@ -5908,6 +6544,10 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Select Executable Wybierz plik wykonywalny + + Select Working Directory + Wybierz katalog roboczy + Executable: Plik wykonywalny: @@ -5940,6 +6580,10 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Debugger::Internal::AddressDialog Select start address + Wybierz adres startowy + + + Select Start Address Wybierz adres startowy @@ -5951,156 +6595,156 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Debugger::DebuggerManager Continue - Kontynuuj + Kontynuuj Interrupt - Przerwij + Przerwij Step Over - Przeskocz + Przeskocz Step Into - Wskocz do wnętrza + Wskocz do wnętrza Step Out - Wyskocz na zewnątrz + Wyskocz na zewnątrz Run to Line - Uruchom do linii + Uruchom do linii Run to Outermost Function - Uruchom do skrajnej funkcji + Uruchom do skrajnej funkcji Immediately Return From Inner Function - Powróć natychmiast z wewnętrznej funkcji + Powróć natychmiast z wewnętrznej funkcji Jump to Line - Skocz do linii + Skocz do linii Toggle Breakpoint - Przełącz ustawienie pułapki + Przełącz ustawienie pułapki Add to Watch Window - Dodaj do okna obserwowanych + Dodaj do okna obserwowanych Snapshot - Zrzut + Zrzut Reverse Direction - Odwrotny kierunek + Odwrotny kierunek Running... - Uruchamianie... + Uruchamianie... Changing breakpoint state requires either a fully running or fully stopped application. - Zmienianie stanu pułapki wymaga albo w pełni uruchomionej albo w pełni zatrzymanej aplikacji. + Zmienianie stanu pułapki wymaga albo w pełni uruchomionej albo w pełni zatrzymanej aplikacji. The application requires the debugger engine '%1', which is disabled. - Program wymaga silnika debuggera '%1', który jest wyłączony. + Program wymaga silnika debuggera '%1', który jest wyłączony. Starting debugger for tool chain '%1'... - Uruchamianie debuggera dla zestawu narzędzi '%1'... + Uruchamianie debuggera dla zestawu narzędzi '%1'... Cannot debug '%1' (tool chain: '%2'): %3 - Nie można debugować "%1" (zestaw narzędzi: "%2"): %3 + Nie można debugować "%1" (zestaw narzędzi: "%2"): %3 Warning - Ostrzeżenie + Ostrzeżenie Save Debugger Log - Zachowaj dziennik debuggera + Zachowaj dziennik debuggera %1 (explicitly set in the Debugger Options) - %1 (ustawione jawnie w opcjach debuggera) + %1 (ustawione jawnie w opcjach debuggera) Open Qt preferences - Otwórz ustawienia Qt + Otwórz ustawienia Qt Turn off helper usage - Wyłącz asystenta + Wyłącz asystenta The debugger could not load the debugging helper library. - Debugger nie mógł załadować biblioteki asystenta debuggera. + Debugger nie mógł załadować biblioteki asystenta debuggera. The debugging helper is used to nicely format the values of some Qt and Standard Library data types. It must be compiled for each used Qt version separately. This can be done in the Qt preferences page by selecting a Qt installation and clicking on 'Rebuild' in the 'Debugging Helper' row. - Asystent debuggera jest używany do ładnego formatowania niektórych typów Qt i Biblioteki Standardowej. Musi być skompilowany oddzielnie dla każdej używanej wersji Qt. Można to zrobić z poziomu strony ustawień Qt poprzez wybranie instalacji Qt i kliknięcie na "Przebuduj" w linijce "Asystent debuggera". + Asystent debuggera jest używany do ładnego formatowania niektórych typów Qt i Biblioteki Standardowej. Musi być skompilowany oddzielnie dla każdej używanej wersji Qt. Można to zrobić z poziomu strony ustawień Qt poprzez wybranie instalacji Qt i kliknięcie na "Przebuduj" w linijce "Asystent debuggera". Continue anyway - Kontynuuj + Kontynuuj Abort Debugging - Przerwij debugowanie + Przerwij debugowanie Aborts debugging and resets the debugger to the initial state. - Przerywa debugowanie i przywraca debugger do stanu początkowego. + Przerywa debugowanie i przywraca debugger do stanu początkowego. Stopped - Zatrzymano + Zatrzymano Exited - Zakończono + Zakończono Debugging helper missing - Brak asystenta debuggera + Brak asystenta debuggera Stop Debugger - Zatrzymaj debugger + Zatrzymaj debugger DebuggerPane Clear Contents - Wyczyść zawartość + Wyczyść zawartość Save Contents - Zachowaj zawartość + Zachowaj zawartość InputPane Type Ctrl-<Return> to execute a line. - Naciśnij Ctrl-<Return> aby wykonać linię. + Naciśnij Ctrl-<Return> aby wykonać linię. Debugger::Internal::DebuggerOutputWindow Debugger - Debugger + Debugger @@ -6115,16 +6759,16 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. A debugging session is still in progress. Would you like to terminate it? - Trwa sesja debugowa. + Trwa sesja debugowa. Czy chcesz ją zakończyć? Close Debugging Session - Zakończ sesję debugową + Zakończ sesję debugową A debugging session is still in progress. Terminating the session in the current state (%1) can leave the target in an inconsistent state. Would you still like to terminate it? - Trwa sesja debugowa. Zakończenie jej w bieżącym stanie (%1) może spowodować, że program znajdzie się w niespójnym stanie. Czy wciąż chcesz ją zakończyć? + Trwa sesja debugowa. Zakończenie jej w bieżącym stanie (%1) może spowodować, że program znajdzie się w niespójnym stanie. Czy wciąż chcesz ją zakończyć? @@ -6146,97 +6790,90 @@ Czy chcesz ją zakończyć? Debugger::Internal::DebuggerPlugin Option '%1' is missing the parameter. - Brak parametru w opcji "%1". + Brak parametru w opcji "%1". The parameter '%1' of option '%2' is not a number. - Parametr "%1" w opcji "%2" nie jest liczbą. + Parametr "%1" w opcji "%2" nie jest liczbą. Invalid debugger option: %1 - Niepoprawna opcja debuggera: %1 + Niepoprawna opcja debuggera: %1 Error evaluating command line arguments: %1 - Błąd podczas przetwarzania argumentów komendy: %1 + Błąd podczas przetwarzania argumentów komendy: %1 Start and Debug External Application... - Uruchom i zdebuguj zewnętrzną aplikację... + Uruchom i zdebuguj zewnętrzną aplikację... Attach to Running External Application... - Dołącz do uruchomionej zewnętrznej aplikacji... + Dołącz do uruchomionej zewnętrznej aplikacji... Attach to Core... - Dołącz do zrzutu... + Dołącz do zrzutu... Start and Attach to Remote Application... - Uruchom i dołącz do zdalnej aplikacji... + Uruchom i dołącz do zdalnej aplikacji... Detach Debugger - Odłącz debugger + Odłącz debugger Stop Debugger/Interrupt Debugger - Zatrzymaj debugger / przerwij debugger + Zatrzymaj debugger / przerwij debugger Reset Debugger - Wyzeruj debugger + Wyzeruj debugger Threads: - Wątki: + Wątki: Attaching to PID %1. - Dołączanie do PID %1. + Dołączanie do PID %1. Remove Breakpoint - Usuń pułapkę + Usuń pułapkę Disable Breakpoint - Wyłącz pułapkę + Wyłącz pułapkę Enable Breakpoint - Włącz pułapkę + Włącz pułapkę Set Breakpoint - Ustaw pułapkę + Ustaw pułapkę Warning - Ostrzeżenie + Ostrzeżenie Cannot attach to PID 0 - Nie można dołączyć się do PID 0 + Nie można dołączyć się do PID 0 Attaching to core %1. - Dołączanie do zrzutu %1. + Dołączanie do zrzutu %1. Debugger::Internal::DebuggerRunControlFactory Debug - Debug - - - - Debugger::Internal::DebuggerRunControl - - Debugger - + Debug @@ -6276,11 +6913,11 @@ Czy chcesz ją zakończyć? Debugger::Internal::CoreGdbAdapter Error Loading Symbols - Błąd w trakcie ładowania symboli + Błąd w trakcie ładowania symboli No executable to load symbols from specified. - Nie podano programu z którego można załadować symbole. + Nie podano programu z którego można załadować symbole. Loading symbols from "%1" failed: @@ -6290,7 +6927,7 @@ Czy chcesz ją zakończyć? Attached to core temporarily. - Tymczasowo dołączono do zrzutu. + Tymczasowo dołączono do zrzutu. Unable to determine executable from core file. @@ -6299,22 +6936,27 @@ Czy chcesz ją zakończyć? Attach to core "%1" failed: - Dołączenie do zrzutu "%1" nie powiodło się: + Dołączenie do zrzutu "%1" zakończone niepowodzeniem: + Symbols found. - Symbole odnalezione. + Symbole odnalezione. + + + Attach to core failed. + Dołączenie do zrzutu zakończone niepowodzeniem. Attached to core. - Dołączono do zrzutu. + Dołączono do zrzutu. Debugger::Internal::GdbEngine The Gdb process failed to start. Either the invoked program '%1' is missing, or you may have insufficient permissions to invoke the program. - Nie można rozpocząć procesu Gdb. Brak programu "%1" albo brak wymaganych uprawnień aby go uruchomić. + Nie można rozpocząć procesu Gdb. Brak programu "%1" albo brak wymaganych uprawnień aby go uruchomić. The Gdb process crashed some time after starting successfully. @@ -6346,7 +6988,7 @@ Czy chcesz ją zakończyć? Running... - Uruchamianie... + Uruchamianie... Stop requested... @@ -6354,7 +6996,7 @@ Czy chcesz ją zakończyć? Stopping temporarily. - Zatrzymywanie tymczasowe. + Zatrzymywanie tymczasowe. Executable failed @@ -6362,7 +7004,7 @@ Czy chcesz ją zakończyć? Process failed to start. - Nie można uruchomić procesu. + Nie można uruchomić procesu. Executable failed: %1 @@ -6374,7 +7016,7 @@ Czy chcesz ją zakończyć? Processing queued commands. - Przetwarzanie kolejki komend. + Przetwarzanie kolejki komend. Loading %1... @@ -6408,6 +7050,18 @@ Czy chcesz ją zakończyć? Running requested... Zażądano uruchomienia... + + Watchpoint %1 at %2 triggered: + + + + Stopped at breakpoint %1 in thread %2 + Zatrzymano w pułapce %1 w wątku %2. {1 ?} {2?} + + + Raw structure + + Step requested... @@ -6440,6 +7094,10 @@ Czy chcesz ją zakończyć? Unable to run '%1': %2 Nie można uruchomić "%1": %2 + + Retrieving data for stack view thread 0x%1... + + Retrieving data for stack view... Pobieranie danych dla widoku stosu... @@ -6464,6 +7122,15 @@ Czy chcesz ją zakończyć? Debugging helpers not found. Brak asystentów debuggera. + + Debugging helpers: Qt version mismatch + Asystenci debuggera: Niezgodna wersja Qt + + + The Qt version used to build the debugging helpers (%1) does not match the Qt version used to build the debugged application (%2). +This might yield incorrect results. + + Custom dumper setup: %1 @@ -6483,6 +7150,7 @@ Czy chcesz ją zakończyć? <shadowed> + Type of local variable or parameter shadowed by another variable of the same name in a nested block. <przykryto> @@ -6504,7 +7172,7 @@ Czy chcesz ją zakończyć? Unable to start gdb '%1': %2 - Nie można uruchomić gdb "%1": %2 + Nie można uruchomić gdb "%1": %2 Gdb I/O Error @@ -6534,12 +7202,12 @@ Czy chcesz ją zakończyć? Snapshot Reloading - Przeładowywanie zrzutu + Przeładowywanie zrzutu In order to load snapshots the debugged process needs to be stopped. Continuation will not be possible afterwards. Do you want to stop the debugged process and load the selected snapshot? - W celu załadowania zrzutów należy zatrzymać debugowany proces. Kontynuacja debugowania nie będzie wtedy możliwa. + W celu załadowania zrzutów należy zatrzymać debugowany proces. Kontynuacja debugowania nie będzie wtedy możliwa. Czy chcesz zatrzymać debugowany proces i załadować wybrany zrzut? @@ -6562,6 +7230,11 @@ Czy chcesz zatrzymać debugowany proces i załadować wybrany zrzut?Cannot find debugger initialization script Nie można odnaleźć skryptu inicjalizującego dla debuggera + + The Gdb process failed to start. Either the invoked program '%1' is missing, or you may have insufficient permissions to invoke the program. +%2 + + Library %1 loaded Załadowano bibliotekę %1 @@ -6590,6 +7263,14 @@ Czy chcesz zatrzymać debugowany proces i załadować wybrany zrzut?Thread %1 selected Wybrano wątek %1 + + Stopping temporarily + Zatrzymywanie tymczasowe + + + Processing queued commands + Przetwarzanie kolejki komend + The gdb process has not responded to a command within %1 seconds. This could mean it is stuck in an endless loop or taking longer than expected to perform the operation. You can choose between waiting longer or abort debugging. @@ -6608,6 +7289,10 @@ Możesz poczekać dłużej na odpowiedź lub przerwać debugowanie.Stop debugging Zatrzymaj debugowanie + + Process failed to start + Nie można uruchomić procesu + <unknown> <nieznany> @@ -6634,7 +7319,7 @@ Możesz poczekać dłużej na odpowiedź lub przerwać debugowanie. Stopped at breakpoint %1 in thread %2. - Zatrzymano w pułapce %1 w wątku %2. + Zatrzymano w pułapce %1 w wątku %2. <Unknown> @@ -6678,7 +7363,7 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Launching - Uruchamianie + Uruchamianie Immediate return from function requested... @@ -6686,7 +7371,7 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. ATTEMPT BREAKPOINT SYNC - PRÓBA SYNCHRONIZACJI PUŁAPEK + PRÓBA SYNCHRONIZACJI PUŁAPEK <unknown> @@ -6698,6 +7383,10 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Jumping out of bogus frame... Wyskakiwanie z błędnej ramki... + + Setting up inferior... + + Failed to start application: Nie można uruchomić aplikacji: @@ -6720,7 +7409,7 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Starting inferior... - Uruchamianie podprocesu... + Uruchamianie podprocesu... Adapter crashed @@ -6801,6 +7490,10 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Process started, PID: 0x%1, thread id: 0x%2, code segment: 0x%3, data segment: 0x%4. Proces uruchomiony, PID: 0x%1, identyfikator wątku: 0x%2, segment kodu: 0x%3, segment danych: 0x%4. + + The reported code segment address (0x%1) might be invalid. Symbol resolution or setting breakoints may not work. + + Connecting to TRK server adapter failed: @@ -6822,9 +7515,17 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Module name Nazwa modułu + + Module path + Ścieżka do modułu + Symbols read - Przeczytane symbole + Symbole przeczytane + + + Symbols type + Typ symboli Start address @@ -6834,6 +7535,18 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. End address Adres końcowy + + unknown + nieznane + + + plain + zwykłe + + + fast + szybkie + Debugger::Internal::ModulesWindow @@ -6853,6 +7566,10 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Load Symbols for All Modules Załaduj symbole ze wszystkich modułów + + Examine All Modules + Sprawdź wszystkie moduły + Load Symbols for Module Załaduj symbole z modułu @@ -6887,19 +7604,19 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Address - Adres + Adres Code - Kod + Kod Symbol - Symbol + Symbol Symbols in "%1" - Symbole w "%1" + Symbole w "%1" @@ -7104,6 +7821,10 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Debugger::Internal::ScriptEngine + + Error: + Błąd: + Running requested... Zażądano uruchomienia... @@ -7133,11 +7854,11 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Debugger::Internal::SourceFilesModel Internal name - Nazwa wewnętrzna + Nazwa wewnętrzna Full name - Pełna nazwa + Pełna nazwa @@ -7218,15 +7939,39 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Debugger::Internal::ThreadsHandler Thread: %1 - Wątek: %1 + Wątek: %1 Thread: %1 at %2 (0x%3) - Wątek: %1 w %2 (0x%3) + Wątek: %1 w %2 (0x%3) Thread: %1 at %2, %3:%4 (0x%5) - Wątek: %1 w %2, %3:%4 (0x%5) + Wątek: %1 w %2, %3:%4 (0x%5) + + + Thread&nbsp;id: + Identyfikator&nbsp;wątku: + + + Target&nbsp;id: + Identyfikator&nbsp;produktu: + + + Name: + Nazwa: + + + State: + Stan: + + + Core: + Zrzut: + + + Stopped&nbsp;at: + Zatrzymano&nbsp;w: Thread ID @@ -7248,6 +7993,18 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Address Adres + + Core + Zrzut + + + State + Stan + + + Name + Nazwa + Debugger::Internal::StackWindow @@ -7263,9 +8020,17 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Open Memory Editor Otwórz edytor pamięci + + Open Memory Editor at 0x%1 + Otwórz edytor pamięci z adresem 0x%1 + + + Open Disassembler at 0x%1 + Otwórz deasembler w 0x%1 + Open Memory Editor at %1 - Otwórz edytor pamięci z adresem %1 + Otwórz edytor pamięci z adresem %1 Open Disassembler @@ -7273,7 +8038,7 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Open Disassembler at %1 - Otwórz deasembler w %1 + Otwórz deasembler w %1 Adjust Column Widths to Contents @@ -7303,10 +8068,12 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Debugger::Internal::WatchData <not in scope> + Value of variable in Debugger Locals display for variables out of scope (stopped above initialization). <poza zakresem> %1 <shadowed %2> + Display of variables shadowed by variables of the same name in nested scopes: Variable %1 is the variable name, %2 is a simple count. %1 <przykryło %2> @@ -7348,6 +8115,10 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Root Korzeń + + Return Value + Zwrócona wartość + Locals Zmienne lokalne @@ -7360,13 +8131,49 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Tooltip Podpowiedź + + <empty> + <pusty> + + + <uninitialized> + <niezainicjalizowany> + + + <invalid> + <niepoprawny> + + + <not accessible> + <niedostępny> + + + <%n items> + + <%n element> + <%n elementy> + <%n elementów> + + + + %1 Object at %2 + Obiekt %1 pod adresem %2 + + + %1 Object at Unknown Address + Obiekt %1 pod nieznanym adresem + + + Locals & Watchers + Zmienne lokalne i obserwowane + unknown address - nieznany adres + nieznany adres %1 object at %2 - %1 obiekt w %2 + %1 obiekt w %2 <Edit> @@ -7393,7 +8200,15 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Bald pointer - Łysy wskaźnik + Łysy wskaźnik + + + <Edit> + <Zmodyfikuj> + + + Raw pointer + Latin1 string @@ -7453,13 +8268,57 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Change Format for Type "%1" Zmień format typu "%1" + + Automatic + Automatyczny + Change Format for Type Zmień format typu + + Change Format for Object Named "%1" + Zmień format obiektu o nazwie %1 + + + Open Memory Editor at Object's Address (0x%1) + Otwórz edytor pamięci z adresem obiektu (0x%1) + + + Open Memory Editor at Referenced Address (0x%1) + + + + Break on Changes at Object's Address (0x%1) + + + + Break on Changes at Referenced Address (0x%1) + + + + Break on Changing Contents + + + + Watch Expression + Obserwuj wyrażenie + + + Watch Expression "%1" + Obserwuj wyrażenie "%1" + + + Remove Watch Expression + Usuń obserwowanie wyrażenia + + + Remove Watch Expression "%1" + Usuń obserwowanie wyrażenia "%1" + Change Format for Object at %1 - Zmień format obiektu w %1 + Zmień format obiektu w %1 Change Format for Object @@ -7479,12 +8338,16 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Open Memory Editor at %1 - Otwórz edytor pamięci z adresem %1 + Otwórz edytor pamięci z adresem %1 Refresh Code Model Snapshot Odśwież kopię modelu danych + + Show View Contents in Editor + + Adjust Column Widths to Contents Wyrównaj szerokości kolumn do ich zawartości @@ -7495,7 +8358,7 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Clear - Wyczyść + Wyczyść @@ -7517,7 +8380,7 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Designer Xml Editor - Edytor xml + Edytor xml Designer @@ -7633,6 +8496,18 @@ Spróbuj ponownie przebudować projekt. Ctrl+J Ctrl+J + + Alt+Shift+R + Alt+Shift+R + + + Switch Source/Form + Przełącz między źródłem a formularzem + + + Shift+F4 + Shift+F4 + Signals && Slots Editor Edytor sygnałów / slotów @@ -7663,7 +8538,7 @@ Spróbuj ponownie przebudować projekt. Ctrl+Alt+R - Ctrl+Alt+R + Ctrl+Alt+R About Qt Designer plugins.... @@ -7743,7 +8618,7 @@ Spróbuj ponownie przebudować projekt. No documents matching '%1' could be found. Rebuilding the project might help. - Brak dokumentów załączających "%1". + Brak dokumentów dołączających "%1". Przebudowanie projektu może pomóc w ich odnalezieniu. @@ -7884,15 +8759,15 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. FakeVim::Internal::FakeVimPluginPrivate Switch to next file - Przełącz do następnego pliku + Przełącz do następnego pliku Switch to previous file - Przełącz do poprzedniego pliku + Przełącz do poprzedniego pliku Quit FakeVim - Zakończ FakeVim + Zakończ FakeVim File not saved @@ -7943,7 +8818,15 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. Replace && Find Next - Zastąp i znajdź następne + Zastąp i znajdź następne + + + Replace + Zastąp + + + Replace && Find + Zastąp i znajdź Ctrl+= @@ -8020,27 +8903,39 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. Budowanie - New configuration + New Configuration Nowa konfiguracja - New Configuration Name: + New configuration name: Nazwa nowej konfiguracji: + + New configuration + Nowa konfiguracja + + + New Configuration Name: + Nazwa nowej konfiguracji: + GenericProjectManager::Internal::GenericBuildSettingsWidget Configuration Name: - Nazwa konfiguracji: + Nazwa konfiguracji: Build directory: Katalog budowania wersji: + + Tool chain: + Zestaw narzędzi: + Tool Chain: - Łańcuch narzędzi: + Łańcuch narzędzi: Generic Manager @@ -8136,6 +9031,10 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. Clone URL: URL klonu: + + Delete master branch + Usuń gałąź "master" + Git::Internal::GitClient @@ -8155,7 +9054,7 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. Executing: %1 %2 Executing: <executable> <arguments> - Uruchamianie: %1 %2 + Uruchamianie: %1 %2 @@ -8215,6 +9114,10 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. Nie można usunąć %n plików z %1 plików: %2 + + Unable to move from %1 to %2: %3 + + Unable to reset %1: %2 @@ -8283,6 +9186,31 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. Unable apply patch %1 to %2: %3 Nie można zastosować łaty %1 do %2: %3 + + Cannot locate %1. + + + + Unable to launch %1. + + + + Unable to retrieve the last commit data of the repository %1. + + + + Amended %1 (%n file(s)). + + + + + + + + + Amended %1. + + Unable to restore stash %1: %2 @@ -8611,6 +9539,10 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. Clean Repository... Wyczyść składnicę... + + Launch gitk + + Saves the current state of your work and resets the repository. Zachowuje bieżący stan Twojej pracy i przywraca składnicę do stanu sprzed zmian. @@ -8635,6 +9567,10 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. Alt+G,Alt+C Alt+G,Alt+C + + Amend Last Commit... + + Push Popchnij @@ -8653,13 +9589,33 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. Czy chcesz odwrócić wszystkie oczekujące zmiany w składnicy %1? + + Amend %1 + + + + Git Commit + + + + Closing Git Editor + + Unable to retrieve file list Nie można uzyskać listy plików + + Repository Clean + + + + Choose Patch + + Repository clean - Czysta składnica + Czysta składnica The repository is clean. @@ -8671,7 +9627,7 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. Choose patch - Wybierz łatę + Wybierz łatę Patch %1 successfully applied to %2 @@ -8723,7 +9679,7 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. Closing git editor - Zamykanie edytora git + Zamykanie edytora git Do you want to commit the change? @@ -8741,13 +9697,6 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. Nie można odnaleźć pliku binarnego "%1" w ścieżce "%2" - - Git::Internal::GitSubmitEditor - - Git Commit - - - HelloWorld::Internal::HelloWorldPlugin @@ -8814,6 +9763,26 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. Filters Filtry + + Unfiltered + Nieprzefiltrowane + + + No user defined filters available or no filter selected. + Brak dostępnych filtrów użytkownika lub żaden filtr nie jest zaznaczony. + + + The filter "%1" will show every documentation file available, as no attributes are specified. + + + + The filter "%1" will only show documentation files that have the attribute %2 specified. + + + + The filter "%1" will only show documentation files that have the attributes %2 specified. + + Help::Internal::GeneralSettingsPage @@ -8823,7 +9792,11 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. Open Image - Otwórz plik graficzny + Otwórz plik graficzny + + + Import Bookmarks + Zaimportuj zakładki Files (*.xbel) @@ -8842,6 +9815,10 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. Help::Internal::HelpIndexFilter Help index + Indeks pomocy + + + Help Index Indeks pomocy @@ -8963,9 +9940,13 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. Poprzedni - Close current Page + Close current page Zamknij bieżącą stronę + + Close current Page + Zamknij bieżącą stronę + Next Następny @@ -9270,7 +10251,7 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. Executing: %1 - Wykonywanie: %1 + Wykonywanie: %1 @@ -9416,15 +10397,23 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. The process "%1" crashed. Proces "%1" zakończył pracę błędem. + + Could not start process "%1" %2 + Nie można uruchomić procesu "%1" %2 + Could not start process "%1" - Nie można uruchomić procesu "%1" + Nie można uruchomić procesu "%1" ProjectExplorer::Internal::AllProjectsFilter Files in any project + Pliki we wszystkich projektach + + + Files in Any Project Pliki we wszystkich projektach @@ -9492,6 +10481,10 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. Category for build system isses listened under 'Build Issues' System budowania + + Build canceled + Anulowano budowanie + Canceled build. Anulowano budowanie. @@ -9547,60 +10540,89 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. Remove Usuń + + Rename + Zmień nazwę + &Clone Selected S&klonuj wybraną - Build Steps - Kroki procesu budowania + Remove Build Configuration + Usuń konfigurację budowania - Clean Steps - Kroki procesu czyszczenia + Do you really want to delete the build configuration <b>%1</b>? + Czy na pewno usunąć konfigurację budowania <b>%1</b>? - Clone configuration + Rename... + Zmień nazwę... + + + New name for build configuration <b>%1</b>: + Nowa nazwa dla konfiguracji budowania <b>%1</b>: + + + Clone Configuration + Title of a the cloned BuildConfiguration window, text of the window Sklonuj konfigurację - New Configuration Name: + New configuration name: Nazwa nowej konfiguracji: + + Build Steps + Kroki procesu budowania + + + Clean Steps + Kroki procesu czyszczenia + + + Clone configuration + Sklonuj konfigurację + + + New Configuration Name: + Nazwa nowej konfiguracji: + ProjectExplorer::Internal::BuildStepsPage Move Up - Przenieś do góry + Przenieś do góry Move Down - Przenieś na dół + Przenieś na dół Remove Item - Usuń element + Usuń element Removing Step failed - Nie można usunąć kroku + Nie można usunąć kroku Can't remove build step while building - Nie można usunąć kroku podczas budowania + Nie można usunąć kroku podczas budowania No Build Steps - Brak kroków procesu budowania + Brak kroków procesu budowania Add Clean Step - Dodaj krok do procesu czyszczenia + Dodaj krok do procesu czyszczenia Add Build Step - Dodaj krok do procesu budowania + Dodaj krok do procesu budowania Clean Steps @@ -9622,29 +10644,33 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. ProjectExplorer::Internal::CoreListenerCheckingForRunningBuild Cancel Build && Close - Anuluj budowanie i zamknij + Anuluj budowanie i zamknij Do not Close - Nie zamykaj + Nie zamykaj Close Qt Creator? - Czy zamknąć Qt Creator? + Czy zamknąć Qt Creator? A project is currently being built. - Trwa budowanie projektu. + Trwa budowanie projektu. Do you want to cancel the build process and close Qt Creator anyway? - Czy chcesz anulować proces budowania i zamknąć Qt Creator? + Czy chcesz anulować proces budowania i zamknąć Qt Creator? ProjectExplorer::Internal::CurrentProjectFilter Files in current project + Pliki w bieżącym projekcie + + + Files in Current Project Pliki w bieżącym projekcie @@ -9663,7 +10689,7 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. ProjectExplorer::Internal::CustomExecutableConfigurationWidget Name: - Nazwa: + Nazwa: Executable: @@ -9675,12 +10701,20 @@ Przebudowanie projektu może pomóc w ich odnalezieniu. Working Directory: + Katalog roboczy: + + + Working directory: Katalog roboczy: Run in &Terminal Uruchom w &terminalu + + Debugger: + Debugger: + Run Environment Środowisko uruchamiania @@ -9771,13 +10805,13 @@ Powód: %2 Building debugging helper library in %1 - Budowanie biblioteki asystenta debuggera w %1 + Budowanie biblioteki asystenta debuggera w %1 Running %1 %2... - Uruchamianie %1 %2... + Uruchamianie %1 %2... @@ -9789,7 +10823,7 @@ Powód: %2 Running %1 ... - Uruchamianie %1... + Uruchamianie %1... @@ -9797,6 +10831,10 @@ Powód: %2 DependenciesModel Unable to add dependency + Nie można dodać zależności + + + Unable to Add Dependency Nie można dodać zależności @@ -9818,18 +10856,24 @@ Powód: %2 Value Wartość - - <VARIABLE> - Name when inserting a new variable - <ZMIENNA> - <VALUE> - Value when inserting a new variable + Value when inserting a new variable <WARTOŚĆ> <VARIABLE> + Name when inserting a new variable + <ZMIENNA> + + + <VALUE> + Value when inserting a new variable + <WARTOŚĆ> + + + <VARIABLE> + Name when inserting a new variable <ZMIENNA> @@ -9895,15 +10939,15 @@ Powód: %2 The application is still running. - Aplikacja jest wciąż uruchomiona. + Aplikacja jest wciąż uruchomiona. Force it to quit? - Zakończyć ją? + Zakończyć ją? Force Quit - Zakończ + Zakończ Application Output @@ -9911,7 +10955,7 @@ Powód: %2 Unable to close - Nie można zamknąć + Nie można zamknąć @@ -9937,9 +10981,18 @@ Powód: %2 Could not open the following project: '%1' Nie można otworzyć projektu: "%1" + + All Projects + Wszystkie projekty + ProjectExplorer::Internal::ProcessStep + + Custom Process Step + Default ProcessStep display name + Własny krok procesu + Custom Process Step item in combobox @@ -10031,6 +11084,10 @@ Powód: %2 Rebuild All Przebuduj wszystko + + Deploy All + Zainstaluj wszystko + Clean All Wyczyść wszystko @@ -10055,6 +11112,14 @@ Powód: %2 Rebuild Project "%1" Przebuduj projekt "%1" + + Deploy Project + Zainstaluj projekt + + + Deploy Project "%1" + Zainstaluj projekt "%1" + Clean Project Wyczyść projekt @@ -10071,6 +11136,10 @@ Powód: %2 Rebuild Without Dependencies Przebuduj bez zależności + + Deploy Without Dependencies + Zainstaluj bez zależności + Clean Without Dependencies Wyczyść bez zależności @@ -10083,6 +11152,63 @@ Powód: %2 Ctrl+R Ctrl+R + + Remove Project... + Remove project from parent profile (Project explorer view); will not physically delete any files. + Usuń projekt... + + + Delete File... + Usuń plik... + + + Set as Startup Project + Ustaw jako projekt startowy + + + Cancel Build && Close + Anuluj budowanie i zamknij + + + Do Not Close + Nie zamykaj + + + Close Qt Creator? + Czy zamknąć Qt Creatora? + + + A project is currently being built. + Trwa budowanie projektu. + + + Do you want to cancel the build process and close Qt Creator anyway? + Czy chcesz anulować proces budowania i zamknąć Qt Creatora? + + + Adding Files to Project Failed + Nie można dodać plików do projektu + + + Adding to Version Control Failed + Nie można dodać do systemu kontroli wersji + + + Removing File Failed + Nie można usunąć pliku + + + Deleting File Failed + Nie można usunąć pliku + + + Delete File + Usuń plik + + + Delete %1 from file system? + Usunąć %1 z systemu plików? + Projects (%1) Projekty (%1) @@ -10169,7 +11295,7 @@ Powód: %2 Add files to project failed - Nie można dodać plików do projektu + Nie można dodać plików do projektu Add to Version Control @@ -10191,11 +11317,11 @@ do systemu kontroli wersji (%2)? Add files to version control failed - Nie można dodać plików do systemu kontroli wersji + Nie można dodać plików do systemu kontroli wersji Remove file failed - Nie można usunąć pliku + Nie można usunąć pliku Could not remove file %1 from project %2. @@ -10203,7 +11329,7 @@ do systemu kontroli wersji (%2)? Delete file failed - Nie można usunąć pliku + Nie można usunąć pliku Could not delete file %1. @@ -10226,7 +11352,7 @@ do systemu kontroli wersji (%2)? Run configuration does not match build configuration - Konfiguracja uruchamiania nie odpowiada konfiguracji budowania + Konfiguracja uruchamiania nie jest zgodna z konfiguracją budowania This can happen if the active build configuration uses the wrong Qt version and/or tool chain for the active run configuration (for example, running in Symbian emulator requires building with the WINSCW tool chain). @@ -10258,6 +11384,16 @@ do systemu kontroli wersji (%2)? ProjectExplorer::Internal::ProjectFileWizardExtension + + <Implicitly Add> + <Niejawnie dodaj> + + + The files are implicitly added to the projects: + + Pliki zostały niejawnie dodane do projektów: + + <None> No version control system selected @@ -10265,6 +11401,12 @@ do systemu kontroli wersji (%2)? No project selected <Brak> + + Failed to add subproject '%1' +to project '%2'. + Nie można dodac podprojektu "%1" +do projektu "%2". + Failed to add one or more files to project '%1' (%2). @@ -10284,11 +11426,19 @@ No project selected ProjectExplorer::Internal::ProjectTreeWidget Simplify tree - Uprość drzewo + Uprość drzewo Hide generated files - Ukryj wygenerowane pliki + Ukryj wygenerowane pliki + + + Simplify Tree + + + + Hide Generated Files + Synchronize with Editor @@ -10301,9 +11451,13 @@ No project selected Projects Projekty + + Filter Tree + + Filter tree - Przefiltruj drzewo + Przefiltruj drzewo @@ -10332,11 +11486,39 @@ No project selected ProjectExplorer::Internal::RunSettingsWidget Add - Dodaj + Dodaj Remove - Usuń + Usuń + + + Remove Run Configuration? + Usunąć konfigurację uruchamiania? + + + Do you really want to delete the run configuration <b>%1</b>? + Czy na pewno usunąć konfigurację uruchamiania <b>%1</b>? + + + Rename... + Zmień nazwę... + + + New name for run configuration <b>%1</b>: + Nowa nazwa dla konfiguracji uruchamiania <b>%1</b>: + + + Remove Deploy Configuration? + Usunąć konfigurację instalowania? + + + Do you really want to delete deploy configuration <b>%1</b>? + Czy na pewno usunąć konfigurację instalowania <b>%1</b>? + + + New name for deploy configuration <b>%1</b>: + Nowa nazwa dla konfiguracji instalowania <b>%1</b>: @@ -10348,7 +11530,7 @@ No project selected Untitled default file name to display - Nienazwany + Nienazwany @@ -10361,6 +11543,22 @@ No project selected Could not restore session %1 Nie można przywrócić sesji %1 + + Failed to restore project files + Nie można przywrócić plików projektu + + + Could not restore the following project files:<br><b>%1</b> + Nie można przywrócić następujących plików projektu:<br><b>%1</b> + + + Keep projects in Session + Przechowaj projekty w sesji + + + Remove projects from Session + Usuń projekty z sesji + Error while saving session Błąd podczas zachowywania sesji @@ -10379,7 +11577,7 @@ No project selected Session ('%1') - Sesja ("%1") + Sesja ("%1") @@ -10601,7 +11799,12 @@ No project selected qmake QMakeStep display name. - QMake + QMake + + + qmake + QMakeStep default display name + qmake Configuration is faulty, please check the Build Issues view for details. @@ -10624,7 +11827,7 @@ No project selected Qt4ProjectManager::QMakeStepConfigWidget <b>qmake:</b> No Qt version set. Cannot run qmake. - <b>QMake:</b> Brak ustawionej wersji Qt. Nie można uruchomić qmake. + <b>qmake:</b> Brak ustawionej wersji Qt. Nie można uruchomić qmake. <b>qmake:</b> %1 %2 @@ -10642,22 +11845,28 @@ No project selected Qt4ProjectManager::Internal::S60DeviceRunConfiguration %1 on Symbian Device + S60 device runconfiguration default display name, %1 is base pro-File name %1 na urządzeniu Symbian + + Run on Symbian device + S60 device runconfiguration default display name (no profile set) + Uruchom na urządzeniu Symbian + QtS60DeviceRunConfiguration - Konfiguracja uruchamiania urządzenia QtS60 + Konfiguracja uruchamiania urządzenia QtS60 Qt4ProjectManager::Internal::S60DeviceRunConfigurationWidget Device: - Urządzenie: + Urządzenie: Name: - Nazwa: + Nazwa: Arguments: @@ -10665,19 +11874,19 @@ No project selected Installation file: - Plik instalacyjny: + Plik instalacyjny: Device on serial port: - Urządzenie na porcie szeregowym: + Urządzenie na porcie szeregowym: Queries the device for information - Zapytaj urządzenie o informacje + Zapytaj urządzenie o informacje Connecting... - Łączenie... + Łączenie... @@ -10689,6 +11898,109 @@ No project selected Qt4ProjectManager::Internal::S60DeviceRunControlBase + + There is no device plugged in. + Brak podłączonego urządzenia. + + + Executable file: %1 + Plik wykonywalny: %1 + + + Debugger for Symbian Platform + Debugger dla platformy Symbian + + + Package: %1 +Deploying application to '%2'... + Pakiet: %1 +Umieszczanie aplikacji w "%2"... + + + Unable to remove existing file '%1': %2 + Nie można usunąć istniejącego pliku "%1": %2 + + + Unable to rename file '%1' to '%2': %3 + Nie można zmienić nazwy pliku "%1" na "%2": %3 + + + Deploying + Instalowanie + + + Renaming new package '%1' to '%2' + Zmienianie nazwy pakietu "%1" na "%2" + + + Removing old package '%1' + Usuwanie starego pakietu "%1" + + + Package file not found + Plik pakietu nie został odnaleziony + + + Failed to find package '%1': %2 + Nie można odnaleźć pakietu "%1": %2 + + + Could not connect to phone on port '%1': %2 +Check if the phone is connected and App TRK is running. + Nie można nawiązać połączenia z telefonem na porcie "%1": %2 +Sprawdź czy telefon jest podłączony i czy aplikacja TRK jest uruchomiona. + + + Could not create file %1 on device: %2 + Nie można utworzyć pliku %1 na urządzeniu: %2 + + + Could not write to file %1 on device: %2 + Nie można zapisać do pliku %1 na urządzeniu: %2 + + + Could not close file %1 on device: %2. It will be closed when App TRK is closed. + Nie można zamknąć pliku %1 w urządzeniu: %2, będzie on zamknięty gdy aplikacja TRK zostanie zakończona. + + + Could not connect to App TRK on device: %1. Restarting App TRK might help. + Nie można ustanowić połączenia z aplikacją TRK w urządzeniu: %1. Spróbuj ponownie uruchomić aplikację TRK. + + + The device '%1' has been disconnected + Urządzenie "%1" zostało odłączone + + + Installing application... + Instalowanie aplikacji... + + + Copying installation file... + Kopiowanie pliku instalacyjnego... + + + Could not install from package %1 on device: %2 + Nie można zainstalować z pakietu %1 na urządzeniu: %2 + + + Waiting for App TRK + Oczekiwanie na aplikację TRK + + + Please start App TRK on %1. + Proszę uruchomić aplikację TRK na porcie %1. + + + Canceled. + Anulowano. + + + + Qt4ProjectManager::Internal::S60DeviceRunControl + + Launching + Uruchamianie + There is no device plugged in. Brak podłączonego urządzenia. @@ -10701,93 +12013,32 @@ No project selected Debugger for Symbian Platform Debugger dla platformy Symbian - - Package: %1 -Deploying application to '%2'... - Pakiet: %1 -Umieszczanie aplikacji w "%2"... - - - Unable to remove existing file '%1': %2 - Nie można usunąć istniejącego pliku "%1": %2 - - - Unable to rename file '%1' to '%2': %3 - Nie można zmienić nazwy pliku "%1" na "%2": %3 - - - Deploying - Instalowanie - - - Renaming new package '%1' to '%2' - Zmienianie nazwy pakietu "%1" na "%2" - - - Removing old package '%1' - Usuwanie starego pakietu "%1" - - - Package file not found - Plik pakietu nie został odnaleziony - - - Failed to find package '%1': %2 - Nie można odnaleźć pakietu "%1": %2 - Could not connect to phone on port '%1': %2 Check if the phone is connected and App TRK is running. Nie można nawiązać połączenia z telefonem na porcie "%1": %2 Sprawdź czy telefon jest podłączony i czy aplikacja TRK jest uruchomiona. - - Could not create file %1 on device: %2 - Nie można utworzyć pliku %1 na urządzeniu: %2 - - - Could not write to file %1 on device: %2 - Nie można zapisać do pliku %1 na urządzeniu: %2 - - - Could not close file %1 on device: %2. It will be closed when App TRK is closed. - Nie można zamknąć pliku %1 w urządzeniu: %2, będzie on zamknięty gdy aplikacja TRK zostanie zakończona. - Could not connect to App TRK on device: %1. Restarting App TRK might help. Nie można ustanowić połączenia z aplikacją TRK w urządzeniu: %1. Spróbuj ponownie uruchomić aplikację TRK. - - The device '%1' has been disconnected - Urządzenie "%1" zostało odłączone - - - Installing application... - Instalowanie aplikacji... - - - Copying installation file... - Kopiowanie pliku instalacyjnego... - - - Could not install from package %1 on device: %2 - Nie można zainstalować z pakietu %1 na urządzeniu: %2 - Waiting for App TRK Oczekiwanie na aplikację TRK - Please start App TRK on %1. - Proszę uruchomić aplikację TRK na porcie %1. + Qt Creator is waiting for the TRK application to connect.<br>Please make sure the application is running on your mobile phone and the right port is configured in the project settings. + Qt Creator oczekuje na połączenie od aplikacji TRK.<br>Sprawdź czy aplikacja jest uruchomiona na telefonie komórkowym i czy właściwy port jest skonfigurowany w ustawieniach projektu. Canceled. Anulowano. - - - Qt4ProjectManager::Internal::S60DeviceRunControl + + The device '%1' has been disconnected + Urządzenie "%1" zostało odłączone + Finished. Zakończono. @@ -10811,31 +12062,47 @@ Sprawdź czy telefon jest podłączony i czy aplikacja TRK jest uruchomiona.Warning: Cannot locate the symbol file belonging to %1. Ostrzeżenie: nie można odnaleźć pliku z symbolami należącego do %1. + + Debugger for Symbian Platform + Debugger dla platformy Symbian + + + Debugging + Debugowanie + Launching debugger... Uruchamianie debuggera... Debugging finished. - Zakończono debugowanie. + Zakończono debugowanie. Qt4ProjectManager::Internal::S60EmulatorRunConfiguration %1 in Symbian Emulator + S60 emulator run configuration default display name, %1 is base pro-File name +---------- +S60 emulator run configuration default display name, %1 is base pro-File name %1 w emulatorze Symbian + + Run on Symbian Emulator + S60 emulator run configuration default display name (no pro-file name) + Uruchom na emulatorze Symbiana + Qt Symbian Emulator RunConfiguration - Konfiguracja uruchamiania emulatora Qt Symbian + Konfiguracja uruchamiania emulatora Qt Symbian Qt4ProjectManager::Internal::S60EmulatorRunConfigurationWidget Name: - Nazwa: + Nazwa: Executable: @@ -10897,6 +12164,10 @@ Sprawdź czy telefon jest podłączony i czy aplikacja TRK jest uruchomiona.Resources Zasoby + + QML + QML + Other files Inne pliki @@ -10905,9 +12176,17 @@ Sprawdź czy telefon jest podłączony i czy aplikacja TRK jest uruchomiona.Failed! Niepomyślnie zakończone! + + Could not open the file for edit with VCS. + System kontroli wersji nie może otworzyć pliku do edycji. + + + Error while reading .pro file %1: %2 + Błąd podczas czytania pliku pro %1: %2 + Could not open the file for edit with SCC. - Nie udało się otworzyć pliku do edycji przez SCC. + Nie udało się otworzyć pliku do edycji przez SCC. Could not set permissions to writable. @@ -10923,7 +12202,7 @@ Sprawdź czy telefon jest podłączony i czy aplikacja TRK jest uruchomiona. Error while reading PRO file %1: %2 - Błąd podczas czytania pliku PRO %1: %2 + Błąd podczas czytania pliku PRO %1: %2 @@ -10958,13 +12237,25 @@ Sprawdź czy telefon jest podłączony i czy aplikacja TRK jest uruchomiona.Build Budowanie + + Rebuild + Przebuduj + + + Clean + + + + Add Library... + Dodaj bibliotekę... + Run qmake in %1 - Uruchom qmake w %1 + Uruchom qmake w %1 Build in %1 - Zbuduj w %1 + Zbuduj w %1 @@ -10990,7 +12281,7 @@ Sprawdź czy telefon jest podłączony i czy aplikacja TRK jest uruchomiona.Qt4ProjectManager::Internal::Qt4RunConfigurationWidget Name: - Nazwa: + Nazwa: Executable: @@ -11016,6 +12307,10 @@ Sprawdź czy telefon jest podłączony i czy aplikacja TRK jest uruchomiona.Run in terminal Uruchom w terminalu + + Debugger: + Debugger: + Use debug version of frameworks (DYLD_IMAGE_SUFFIX=_debug) Użyj pakietów w wersji do debugowania (DYLD_IMAGE_SUFFIX=_debug) @@ -11150,10 +12445,19 @@ Sprawdź czy telefon jest podłączony i czy aplikacja TRK jest uruchomiona.Building helpers Budowanie asystentów + + Binary not found + + + + <html><body><table><tr><td>File:</td><td><pre>%1</pre></td></tr><tr><td>Last&nbsp;modified:</td><td>%2</td></tr><tr><td>Size:</td><td>%3 Bytes</td></tr><tr><td>File:</td><td><pre>%4</pre></td></tr><tr><td>Last&nbsp;modified:</td><td>%5</td></tr><tr><td>Size:</td><td>%6 Bytes</td></tr><tr><td>File:</td><td><pre>%7</pre></td></tr><tr><td>Last&nbsp;modified:</td><td>%8</td></tr><tr><td>Size:</td><td>%9 Bytes</td></tr></table></body></html> + Tooltip showing the debugging helper library file. + + <html><body><table><tr><td>File:</td><td><pre>%1</pre></td></tr><tr><td>Last&nbsp;modified:</td><td>%2</td></tr><tr><td>Size:</td><td>%3 Bytes</td></tr></table></body></html> Tooltip showing the debugging helper library file. - <html><body><table><tr><td>Plik:</td><td><pre>%1</pre></td></tr><tr><td>Ostatnio&nbsp;zmodyfikowany:</td><td>%2</td></tr><tr><td>Rozmiar:</td><td>%3 Bajtów</td></tr></table></body></html> + <html><body><table><tr><td>Plik:</td><td><pre>%1</pre></td></tr><tr><td>Ostatnio&nbsp;zmodyfikowany:</td><td>%2</td></tr><tr><td>Rozmiar:</td><td>%3 Bajtów</td></tr></table></body></html> This Qt Version has a unknown toolchain. @@ -11233,12 +12537,16 @@ Sprawdź czy telefon jest podłączony i czy aplikacja TRK jest uruchomiona. EditorManager Next Open Document in History - Manager edytorów + Manager edytorów EditorManager Previous Open Document in History - Manager edytorów + Manager edytorów + + + Qt QML Viewer + Przeglądarka Qt QML @@ -11337,14 +12645,26 @@ Wstępnie wybiera wersję desktopową Qt do budowania aplikacji (jeśli jest dos Qt4ProjectManager::Internal::LibraryWizardDialog Shared library - Biblioteka współdzielona + Biblioteka współdzielona Statically linked library - Biblioteka statycznie dowiązana + Biblioteka statycznie dowiązana Qt 4 plugin + Wtyczka Qt 4 + + + Shared Library + Biblioteka współdzielona + + + Statically Linked Library + Biblioteka statycznie dowiązana + + + Qt 4 Plugin Wtyczka Qt 4 @@ -11359,11 +12679,19 @@ Wstępnie wybiera wersję desktopową Qt do budowania aplikacji (jeśli jest dos Details Szczegóły + + Symbian Specific + + Qt4ProjectManager::Internal::ModulesPage Select required modules + Wybierz wymagane moduły + + + Select Required Modules Wybierz wymagane moduły @@ -11463,11 +12791,11 @@ Wstępnie wybiera wersję desktopową Qt do budowania aplikacji (jeśli jest dos &Escaped Pattern: - &Zabezpieczony wzorzec: + &Zabezpieczony wzorzec: &Pattern Syntax: - Składnia &wzorca: + Składnia &wzorca: &Text: @@ -11475,7 +12803,7 @@ Wstępnie wybiera wersję desktopową Qt do budowania aplikacji (jeśli jest dos Case &Sensitive - Uwzględniaj &wielkość liter + Uwzględniaj &wielkość liter &Minimal @@ -11483,19 +12811,19 @@ Wstępnie wybiera wersję desktopową Qt do budowania aplikacji (jeśli jest dos Index of Match: - Indeks dopasowania: + Indeks dopasowania: Matched Length: - Dopasowana długość: + Dopasowana długość: Regular expression v1 - Wyrażenie regularne v1 + Wyrażenie regularne v1 Regular expression v2 - Wyrażenie regularne v2 + Wyrażenie regularne v2 Wildcard @@ -11503,6 +12831,38 @@ Wstępnie wybiera wersję desktopową Qt do budowania aplikacji (jeśli jest dos Fixed string + Stały ciąg + + + &Escaped pattern: + &Zabezpieczony wzorzec: + + + &Pattern syntax: + Składnia &wzorca: + + + Case &sensitive + Uwzględniaj &wielkość liter + + + Index of match: + Indeks dopasowania: + + + Matched length: + Dopasowana długość: + + + Regular Expression v1 + Wyrażenie regularne v1 + + + Regular Expression v2 + Wyrażenie regularne v2 + + + Fixed String Stały ciąg @@ -11518,20 +12878,36 @@ Wstępnie wybiera wersję desktopową Qt do budowania aplikacji (jeśli jest dos Wyrażenie regularne - Enter pattern from code... + Enter Pattern from Code... Wprowadź wzorzec z kodu... - Clear patterns + Clear Patterns Wyczyść wzorce + + Clear Text + Wyczyść tekst + + + Enter Pattern from Code + Wprowadź wzorzec z kodu + + + Enter pattern from code... + Wprowadź wzorzec z kodu... + + + Clear patterns + Wyczyść wzorce + Clear texts - Wyczyść teksty + Wyczyść teksty Enter pattern from code - Wprowadź wzorzec z kodu + Wprowadź wzorzec z kodu Pattern @@ -11820,7 +13196,7 @@ Wstępnie wybiera wersję desktopową Qt do budowania aplikacji (jeśli jest dos Executing in %1: %2 %3 - Wykonywanie w %1: %2 %3 + Wykonywanie w %1: %2 %3 @@ -11830,24 +13206,24 @@ Wstępnie wybiera wersję desktopową Qt do budowania aplikacji (jeśli jest dos Executing: %1 %2 - Wykonywanie: %1 %2 + Wykonywanie: %1 %2 The process terminated with exit code %1. - Proces zakończył się kodem wyjściowym %1. + Proces zakończył się kodem wyjściowym %1. The process terminated abnormally. - Proces niepoprawnie zakończony. + Proces niepoprawnie zakończony. Could not start subversion '%1'. Please check your settings in the preferences. - Nie można uruchomić subversion "%1". Sprawdź stosowne ustawienia. + Nie można uruchomić subversion "%1". Sprawdź stosowne ustawienia. Subversion did not respond within timeout limit (%1 ms). - Subversion nie odpowiedział w określonym czasie (%1 ms). + Subversion nie odpowiedział w określonym czasie (%1 ms). @@ -11869,7 +13245,7 @@ Wstępnie wybiera wersję desktopową Qt do budowania aplikacji (jeśli jest dos Use regular e&xpressions - Używaj wyrażeń &regularnych + Używaj wyrażeń &regularnych @@ -11885,6 +13261,10 @@ Wstępnie wybiera wersję desktopową Qt do budowania aplikacji (jeśli jest dos TextEditor::BaseTextEditor + + CTRL+D + Ctrl+D + Print Document Wydruk dokumentu @@ -11897,6 +13277,10 @@ Wstępnie wybiera wersję desktopową Qt do budowania aplikacji (jeśli jest dos Select Encoding Wybierz kodowanie + + The text is too large to be displayed (%1 MB). + Tekst jest zbyt obszerny aby mógł zostać wyświetlony (%1 MB). + TextEditor::BaseTextEditorEditable @@ -12029,6 +13413,10 @@ Następujące kodowania będą najprawdopodobniej pasowały: Line in current document + Linia w bieżącym dokumencie + + + Line in Current Document Linia w bieżącym dokumencie @@ -12112,7 +13500,7 @@ Następujące kodowania będą najprawdopodobniej pasowały: Collapse - Zwiń + Zwiń Ctrl+< @@ -12120,7 +13508,7 @@ Następujące kodowania będą najprawdopodobniej pasowały: Expand - Rozwiń + Rozwiń Ctrl+> @@ -12128,7 +13516,7 @@ Następujące kodowania będą najprawdopodobniej pasowały: (Un)&Collapse All - &Zwiń / rozwiń wszystko + &Zwiń / rozwiń wszystko Increase Font Size @@ -12174,6 +13562,18 @@ Następujące kodowania będą najprawdopodobniej pasowały: Ctrl+[ Ctrl+[ + + Fold + + + + Unfold + + + + (Un)&Fold All + + Ctrl+] Ctrl+] @@ -12238,6 +13638,22 @@ Następujące kodowania będą najprawdopodobniej pasowały: Ctrl+J Ctrl+J + + Insert Line Above Current Line + Wstaw linię ponad bieżącą linią + + + Ctrl+Shift+Return + Ctrl+Shift+Return + + + Insert Line Below Current Line + Wstaw linię pod bieżącą linią + + + Ctrl+Return + Ctrl+Return + Goto Line Start Przejdź do początku linii @@ -12404,6 +13820,22 @@ Następujące kodowania będą najprawdopodobniej pasowały: Type Typ + + Local + + + + Field + Pole + + + Static + Statyczne + + + Virtual Method + Metoda wirtualna + Keyword Słowo kluczowe @@ -12612,16 +14044,24 @@ Następujące kodowania będą najprawdopodobniej pasowały: Version Control System kontroli wersji + + Executing: %1 %2 + + Wykonywanie: %1 %2 + + + + Executing in %1: %2 %3 + + Wykonywanie w %1: %2 %3 + + VCSBase::VCSBaseSubmitEditor - - Check message - - Insert name... - Wstaw nazwę... + Wstaw nazwę... Prompt to submit @@ -12629,7 +14069,19 @@ Następujące kodowania będą najprawdopodobniej pasowały: Submit Message Check failed - Błąd sprawdzania opisu zmiany + Błąd sprawdzania opisu zmiany + + + Check Message + + + + Insert Name... + + + + Submit Message Check Failed + Executing %1 @@ -12712,9 +14164,13 @@ Następujące kodowania będą najprawdopodobniej pasowały: Remove Usuń + + Deleting a folder also removes its content.<br>Do you want to continue? + Usunięcie katalogu usuwa również jego zawartość.<br>Czy chcesz kontynuować? + You are going to delete a Folder which will also<br>remove its content. Are you sure you would like to continue? - Zamierzasz usunąć katalog a to spowoduje usunięcie<br>jego zawartości. Jesteś pewien że chcesz kontynuować? + Zamierzasz usunąć katalog a to spowoduje usunięcie<br>jego zawartości. Jesteś pewien że chcesz kontynuować? New Folder @@ -12776,6 +14232,18 @@ Następujące kodowania będą najprawdopodobniej pasowały: Skip Pomiń + + Choose Copy Location + Wybierz docelowe położenie kopii + + + Overwriting Failed + Błąd nadpisania + + + Copying Failed + Błąd kopiowania + Abort Przerwij @@ -12790,11 +14258,11 @@ Następujące kodowania będą najprawdopodobniej pasowały: Choose copy location - Wybierz docelowe położenie kopii + Wybierz docelowe położenie kopii Overwrite failed - Nie można nadpisać + Nie można nadpisać Could not overwrite file %1. @@ -12802,7 +14270,7 @@ Następujące kodowania będą najprawdopodobniej pasowały: Copying failed - Błąd kopiowania + Błąd kopiowania Could not copy the file to %1. @@ -12836,9 +14304,17 @@ Następujące kodowania będą najprawdopodobniej pasowały: Usuń element - Open file + Open File Otwórz plik + + Input prefix: + Wprowadź przedrostek: + + + Open file + Otwórz plik + All files (*) Wszystkie pliki (*) @@ -12849,7 +14325,7 @@ Następujące kodowania będą najprawdopodobniej pasowały: Input Prefix: - Wprowadź przedrostek: + Wprowadź przedrostek: Change Language @@ -13162,6 +14638,10 @@ Następujące kodowania będą najprawdopodobniej pasowały: Subversion submit template + + Qt Creator task list file + + Plain text document Dokument tekstowy @@ -13170,6 +14650,14 @@ Następujące kodowania będą najprawdopodobniej pasowały: XML document Dokument XML + + Assembler + Asembler + + + Qt Creator Generic Assembler + + Differences between files Różnice pomiędzy plikami @@ -13283,7 +14771,7 @@ aktywny tylko po wpisaniu przedrostka Debugger::Internal::TermGdbAdapter Debugger Error - Błąd debuggera + Błąd debuggera @@ -13321,6 +14809,10 @@ aktywny tylko po wpisaniu przedrostka Locator::Internal::FileSystemFilter Files in file system + Pliki w systemie plików + + + Files in File System Pliki w systemie plików @@ -13385,6 +14877,10 @@ aktywny tylko po wpisaniu przedrostka Locator::Internal::OpenDocumentsFilter Open documents + Otwarte dokumenty + + + Open Documents Otwarte dokumenty @@ -13640,7 +15136,7 @@ aktywny tylko po wpisaniu przedrostka Delete all... - Usuń wszystkie... + Usuń wszystkie... Delete... @@ -13657,7 +15153,7 @@ aktywny tylko po wpisaniu przedrostka Restore to branch... Restore a git stash to new branch to be created - Przywróć do gałęzi... + Przywróć do gałęzi... Refresh @@ -13673,7 +15169,7 @@ aktywny tylko po wpisaniu przedrostka Delete stashes - Usuń odłożone zmiany + Usuń odłożone zmiany Do you want to delete all stashes? @@ -13689,6 +15185,23 @@ aktywny tylko po wpisaniu przedrostka Repository modified + Składnica zmodyfikowana + + + Delete All... + Usuń wszystkie... + + + Restore to Branch... + Restore a git stash to new branch to be created + Przywróć do gałęzi... + + + Delete Stashes + Usuń odłożone zmiany + + + Repository Modified Składnica zmodyfikowana @@ -13866,11 +15379,11 @@ Możesz odłożyć zmiany lub je porzucić. ProjectExplorer::Internal::AddTargetDialog Add target - Dodaj produkt docelowy + Dodaj produkt docelowy Target: - Produkt docelowy: + Produkt docelowy: @@ -13899,11 +15412,11 @@ Możesz odłożyć zmiany lub je porzucić. Id: - Identyfikator: + Identyfikator: Property Name: - Nazwa właściwości: + Nazwa właściwości: Animation @@ -13945,6 +15458,14 @@ Możesz odłożyć zmiany lub je porzucić. Damping: Tłumienie: + + ID: + Identyfikator: + + + Property name: + Nazwa właściwości: + GradientDialog @@ -14574,15 +16095,15 @@ Możesz odłożyć zmiany lub je porzucić. Ports: - Porty: + Porty: SSH: - SSH: + SSH: Gdb server: - Server Gdb: + Server Gdb: s @@ -14616,12 +16137,32 @@ Możesz odłożyć zmiany lub je porzucić. Username: Nazwa użytkownika: + + SSH port: + Port SSH: + + + Free ports: + Wolne porty: + + + You can enter lists and ranges like this: 1024,1026-1028,1030 + Można wprowadzać listy i zakresy, np.: 1024,1026-1028,1030 + + + TextLabel + Etykieta + + + Show password + Pokaż hasło + Qt4ProjectManager::Internal::S60CreatePackageStepWidget Form - Formularz + Formularz Self-signed certificate @@ -14639,6 +16180,18 @@ Możesz odłożyć zmiany lub je porzucić. Key file: Plik z kluczem: + + Create Smart Installer package + + + + Resets saved passphrases for all used keys + + + + Reset Passphrases + + Qt4ProjectManager::Internal::TestWizardPage @@ -14850,15 +16403,15 @@ Możesz odłożyć zmiany lub je porzucić. QmlJS::Link could not find file or directory - nie można odnaleźć pliku lub katalogu + nie można odnaleźć pliku lub katalogu expected two numbers separated by a dot - oczekiwano dwóch liczb oddzielonych kropką + oczekiwano dwóch liczb oddzielonych kropką package import requires a version number - import pakietu wymaga podania numeru wersji + import pakietu wymaga podania numeru wersji package not found @@ -14969,11 +16522,15 @@ Wartość dziesiętna ze znakiem (big endian): %4 BINEditor::Internal::ImageViewerFactory Image Viewer - Przeglądarka plików graficznych + Przeglądarka plików graficznych CMakeProjectManager::Internal::CMakeRunConfiguration + + Run CMake target + + Clean Environment Czyste środowisko @@ -15004,7 +16561,12 @@ Wartość dziesiętna ze znakiem (big endian): %4 Make CMakeProjectManager::MakeStep display name. - Make + Make + + + Make + Default display name for the cmake make step. + Make @@ -15036,6 +16598,10 @@ Wartość dziesiętna ze znakiem (big endian): %4 Environment Środowisko + + All Files (*) + Wszystkie pliki (*) + Core::DesignMode @@ -15213,7 +16779,11 @@ Wartość dziesiętna ze znakiem (big endian): %4 Debugger::Internal::CdbOptionsPage Cdb - Cdb + Cdb + + + CDB + CDB @@ -15261,50 +16831,66 @@ Wartość dziesiętna ze znakiem (big endian): %4 Debugger::DebuggerUISwitcher &Languages - &Języki + &Języki + + + Memory... + Alt+L - Alt+L + Alt+L + + + Debugger Toolbar + Language - Język + Język Debugger::Internal::SnapshotHandler Function: - Funkcja: + Funkcja: File: - Plik: + Plik: Date: - Data: + Data: ... - ... + ... <More> - <Więcej> + <Więcej> Function - Funkcja + Funkcja Date - Data + Data Location - Położenie + Położenie + + + Name + Nazwa + + + File + Plik @@ -15313,6 +16899,14 @@ Wartość dziesiętna ze znakiem (big endian): %4 Snapshots Zrzuty + + Create Snapshot + Utwórz zrzut + + + Remove Snapshot + Usuń zrzut + Adjust Column Widths to Contents Wyrównaj szerokości kolumn do ich zawartości @@ -15377,6 +16971,10 @@ Wartość dziesiętna ze znakiem (big endian): %4 Open Advanced Find... Otwórz zaawansowane przeszukiwanie... + + Advanced... + Zaawansowane... + Ctrl+Shift+F Ctrl+Shift+F @@ -15393,7 +16991,7 @@ Wartość dziesiętna ze znakiem (big endian): %4 Git::Internal::RemoteBranchModel (no branch) - (brak gałęzi) + (brak gałęzi) @@ -15416,6 +17014,10 @@ Wartość dziesiętna ze znakiem (big endian): %4 Blame %1 + + Blame parent revision %1 + + Help @@ -15553,13 +17155,17 @@ Wartość dziesiętna ze znakiem (big endian): %4 Annotate %1 Dołącz adnotację do %1 + + Annotate parent revision %1 + + Mercurial::Internal::MercurialJobRunner Executing: %1 %2 - Wykonywanie: %1 %2 + Wykonywanie: %1 %2 @@ -15751,12 +17357,16 @@ Wartość dziesiętna ze znakiem (big endian): %4 Close commit editor - Zamknij edytor zmiany + Zamknij edytor zmiany Do you want to commit the changes? + + Close Commit Editor + + Message check failed. Do you want to proceed? @@ -15826,6 +17436,16 @@ Wartość dziesiętna ze znakiem (big endian): %4 ProjectExplorer::BuildConfiguration + + Build + Display name of the build build step list. Used as part of the labels in the project window. + + + + Clean + Display name of the clean build step list. Used as part of the labels in the project window. + + System Environment Środowisko systemowe @@ -15901,7 +17521,63 @@ Wartość dziesiętna ze znakiem (big endian): %4 Example Object Class-name: - Przykładowa nazwa klasy obiektu: + Przykładowa nazwa klasy obiektu: + + + Object Class-name: + + + + The project name and the object class-name cannot be the same. + + + + Creates a custom Qt Creator plugin. + + + + Qt Creator plugin + Wtyczka Qt Creatora + + + Other Project + Inny projekt + + + Plugin Information + Informacje o wtyczce + + + Plugin name: + Nazwa wtyczki: + + + Vendor name: + + + + Copyright: + Prawa autorskie: + + + License: + Licencja: + + + Description: + Opis: + + + Url: + Url: + + + Qt Creator sources: + Źródła Qt Creatora: + + + Qt Creator build: + Wersja Qt Creatora: @@ -15961,7 +17637,7 @@ Wartość dziesiętna ze znakiem (big endian): %4 Open parent folder - Otwórz katalog wyżej + Otwórz katalog wyżej Open "%1" @@ -15973,11 +17649,11 @@ Wartość dziesiętna ze znakiem (big endian): %4 Choose folder... - Wybierz katalog... + Wybierz katalog... Choose folder - Wybierz katalog + Wybierz katalog Show in Explorer... @@ -15989,14 +17665,34 @@ Wartość dziesiętna ze znakiem (big endian): %4 Show containing folder... - Pokaż zawierający katalog... - - - Open Command Prompt here... - + Pokaż zawierający katalog... Open Terminal here... + Otwórz tutaj terminal... + + + Open Parent Folder + Otwórz katalog wyżej + + + Choose Folder... + Wybierz katalog... + + + Choose Folder + Wybierz katalog + + + Show Containing Folder... + Pokaż zawierający katalog... + + + Open Command Prompt Here... + + + + Open Terminal Here... Otwórz tutaj terminal... @@ -16028,9 +17724,13 @@ Wartość dziesiętna ze znakiem (big endian): %4 Ustawienia... - Launching Windows Explorer failed + Launching Windows Explorer Failed Nie można uruchomić "Windows Explorer" + + Launching Windows Explorer failed + Nie można uruchomić "Windows Explorer" + Could not find explorer.exe in path to launch Windows Explorer. Nie można odnaleźć explorer.exe w ścieżce w celu uruchomienia "Windows Explorer". @@ -16150,23 +17850,23 @@ Wartość dziesiętna ze znakiem (big endian): %4 ProjectExplorer::TaskWindow Build Issues - Problemy podczas budowania + Problemy podczas budowania &Copy - S&kopiuj + S&kopiuj &Annotate - Dołącz &adnotację + Dołącz &adnotację Show Warnings - Pokazuj ostrzeżenia + Pokazuj ostrzeżenia Filter by categories - Przefiltruj według kategorii + Przefiltruj według kategorii @@ -16250,10 +17950,18 @@ Wartość dziesiętna ze znakiem (big endian): %4 QmlDesigner::XUIFileDialog Open file - Otwórz plik + Otwórz plik Save file + Zachowaj plik + + + Open File + Otwórz plik + + + Save File Zachowaj plik @@ -16300,6 +18008,10 @@ Wartość dziesiętna ze znakiem (big endian): %4 QmlDesigner::PluginManager About plugins + Informacje o wtyczkach + + + About Plugins Informacje o wtyczkach @@ -16623,66 +18335,52 @@ Wartość dziesiętna ze znakiem (big endian): %4 Qml::Internal::QLineGraph Frame rate - Klatki na sekundę + Klatki na sekundę Qml::Internal::GraphWindow Total time elapsed (ms) - Łączny czas który upłynął + Łączny czas który upłynął Qml::Internal::CanvasFrameRate Resolution: - Rozdzielczość: + Rozdzielczość: Clear - Wyczyść + Wyczyść New Graph - Nowy graf + Nowy graf Enabled - Włączony + Włączony Qml::Internal::ExpressionQueryWidget Write and evaluate QtScript expressions. - Wpisz i wykonaj polecenia QtScript. + Wpisz i wykonaj polecenia QtScript. Clear Output - Wyczyść wyjście + Wyczyść wyjście <Type expression to evaluate> - <Wpisz wyrażenie do wykonania> - - - Script Console - - - - - Expression queries - - - - Expression queries (using context for %1) - Selected object - + <Wpisz wyrażenie do wykonania> <%n items> - + <%n element> <%n elementy> <%n elementów> @@ -16693,35 +18391,31 @@ Wartość dziesiętna ze znakiem (big endian): %4 Qml::Internal::ObjectPropertiesView Name - Nazwa + Nazwa Value - Wartość + Wartość Type - Typ + Typ &Watch expression - &Obserwuj wyrażenie + &Obserwuj wyrażenie &Remove watch - &Usuń obserwowanie wyrażenia - - - Show &unwatchable properties - + &Usuń obserwowanie wyrażenia &Group by item type - &Grupuj według typów elementów + &Grupuj według typów elementów <%n items> - + <%n element> <%n elementy> <%n elementów> @@ -16729,172 +18423,143 @@ Wartość dziesiętna ze znakiem (big endian): %4 Watch expression '%1' - Obserwuj wyrażenie "%1" - - - Hide unwatchable properties - - - - Show unwatchable properties - + Obserwuj wyrażenie "%1" Qml::Internal::ObjectTree Add watch expression... - Dodaj wyrażenie do obserwowania... - - - Show uninspectable items - + Dodaj wyrażenie do obserwowania... Go to file - Przejdź do pliku + Przejdź do pliku Watch expression - Obserwuj wyrażenie + Obserwuj wyrażenie Expression: - Wyrażenie: + Wyrażenie: Qml::Internal::WatchTableModel Name - Nazwa + Nazwa Value - Wartość + Wartość Qml::Internal::WatchTableView Stop watching - Zatrzymaj obserwowanie + Zatrzymaj obserwowanie Qml::InspectorOutputWidget Output - Komunikaty + Komunikaty Clear - Wyczyść + Wyczyść Qml::QmlInspector Failed to connect to debugger - Nie można połączyć się z debuggerem + Nie można połączyć się z debuggerem Could not connect to debugger server. - Nie można połączyć się z serwerem debuggera. + Nie można połączyć się z serwerem debuggera. Invalid project, debugging canceled. - Niepoprawny projekt, anulowano debugowanie. + Niepoprawny projekt, anulowano debugowanie. Cannot find project run configuration, debugging canceled. - Nie można odnaleźć konfiguracji uruchamiania, anulowano debugowanie. + Nie można odnaleźć konfiguracji uruchamiania, anulowano debugowanie. [Inspector] set to connect to debug server %1:%2 - [Inspektor] ustawiono server debugowy %1:%2 + [Inspektor] ustawiono server debugowy %1:%2 [Inspector] disconnected. - [Inspektor] rozłączony. + [Inspektor] rozłączony. - - [Inspector] resolving host... - - [Inspector] connecting to debug server... - [Inspektor] łączenie z serwerem debugowym... + [Inspektor] łączenie z serwerem debugowym... [Inspector] connected. - [Inspektor] podłączony. + [Inspektor] podłączony. [Inspector] closing... - [Inspektor] zamykanie... + [Inspektor] zamykanie... [Inspector] error: (%1) %2 %1=error code, %2=error message - [Inspektor] błąd: (%1) %2 + [Inspektor] błąd: (%1) %2 Start Debugging C++ and QML Simultaneously... - Rozpocznij jednoczesne debugowanie QML i C++... + Rozpocznij jednoczesne debugowanie QML i C++... No project was found. - Nie znaleziono żadnego projektu. + Nie znaleziono żadnego projektu. No run configurations were found for the project '%1'. - Nie znaleziono żadnych konfiguracji uruchamiania dla projektu "%1". - - - No valid run configuration was found for the project %1. Only locally runnable configurations are supported. -Please check your project settings. - - - - A valid run control was not registered in Qt Creator for this project run configuration. - + Nie znaleziono żadnych konfiguracji uruchamiania dla projektu "%1". Debugging failed: could not start C++ debugger. - Błąd debugowania: nie można uruchomić debuggera C++. + Błąd debugowania: nie można uruchomić debuggera C++. QML engine: - Silnik QML: + Silnik QML: Object Tree - Drzewo obiektów + Drzewo obiektów Properties and Watchers - Właściwości i zmienne obserwowane - - - Script Console - - - - Output of the QML inspector, such as information on connecting to the server. - + Właściwości i zmienne obserwowane QmlJSEditor::Internal::QmlJSTextEditor + + Show Qt Quick ToolBar + + Rename... Zmień nazwę... @@ -16907,13 +18572,17 @@ Please check your project settings. Unused variable Nieużywana zmienna + + Refactoring + + Rename id '%1'... Zmień nazwę identyfikatora "%1"... <Select Symbol> - <Wybierz symbol> + <Wybierz symbol> @@ -16965,17 +18634,34 @@ Please check your project settings. Qt QML File Plik Qt QML + + QML + QML sub-menu in the Tools menu + QML + + + Find Usages + Znajdź użycia + + + Ctrl+Shift+U + Ctrl+Shift+U + + + Show Qt Quick Toolbar + + Qt Quick - Qt Quick + Qt Quick &Preview - &Podgląd + &Podgląd Ctrl+Alt+R - Ctrl+Alt+R + Ctrl+Alt+R Follow Symbol Under Cursor @@ -16995,6 +18681,13 @@ Please check your project settings. Indexing Indeksowanie + + Type dump of QML plugin in %0 failed. +Errors: +%1 + + + QmlProjectManager::QmlProject @@ -17007,11 +18700,19 @@ Please check your project settings. QmlProjectManager::Internal::QmlProjectApplicationWizardDialog New QML Project - Nowy projekt QML + Nowy projekt QML This wizard generates a QML application project. - Ten kreator generuje projekt aplikacji QML. + Ten kreator generuje projekt aplikacji QML. + + + New Qt Quick UI Project + + + + This wizard generates a Qt Quick UI project. + @@ -17030,16 +18731,26 @@ Projekty aplikacji QML są uruchamiane ze środowiska QML i nie muszą być budo QML Application - Aplikacja QML + Aplikacja QML Creates a QML application project with a single QML file containing the main view. QML application projects are executed by the Qt QML Viewer and do not need to be built. - Tworzy projekt aplikacji QML z pojedynczym plikiem QML zawierającym główny widok. + Tworzy projekt aplikacji QML z pojedynczym plikiem QML zawierającym główny widok. Projekty aplikacji QML są uruchamiane przez przeglądarkę QML i nie muszą być budowane. + + Qt Quick UI + + + + Creates a Qt Quick UI project with a single QML file that contains the main view. + +You can review Qt Quick UI projects in the QML Viewer and you need not build them. You do not need to have the development environment installed on your computer to create and run this type of projects. + + File generated by QtCreator qmlproject Template @@ -17141,24 +18852,40 @@ Projekty aplikacji QML są uruchamiane przez przeglądarkę QML i nie muszą by Przeglądarka QML - QML Viewer - Przeglądarka QML + Custom QML Viewer: + Własna przeglądarka QML: - QML Viewer arguments: - Argumenty przeglądarki QML: + Arguments: + Argumenty: - Main QML File: + Debugger: + Debugger: + + + Main QML file: Główny plik QML: + + QML Viewer + Przeglądarka QML + + + QML Viewer arguments: + Argumenty przeglądarki QML: + + + Main QML File: + Główny plik QML: + Debugging Address: - Adres debugowania: + Adres debugowania: Debugging Port: - Port debugowania: + Port debugowania: @@ -17206,19 +18933,35 @@ Projekty aplikacji QML są uruchamiane przez przeglądarkę QML i nie muszą by Device configuration test failed: %1 - Test konfiguracji urządzenia zakończony niepowodzeniem: + Test konfiguracji urządzenia zakończony niepowodzeniem: %1 + + Could not connect to host: %1 + Nie można połączyć się z hostem: %1 + Did you start Qemu? Czy uruchomiłeś Qemu? + + Remote process failed: %1 + Zdalny proces zakończony błędem: %1 + Qt version mismatch! Expected Qt on device: 4.6.2 or later. Niezgodność wersji Qt. Oczekiwano wersji 4.6.2 lub późniejszej dla urządzenia. + + Mad Developer is not installed.<br>You will not be able to deploy to this device. + + + + Device configuration okay. + + Close Zamknij @@ -17244,7 +18987,7 @@ Czy uruchomiłeś Qemu? Device configuration successful. - Konfiguracja urządzenia zakończona pomyślnie. + Konfiguracja urządzenia zakończona pomyślnie. @@ -17260,14 +19003,27 @@ Czy uruchomiłeś Qemu? Qt4ProjectManager::Internal::MaemoRunConfiguration New Maemo Run Configuration - Nowa konfiguracja uruchamiania Maemo + Nowa konfiguracja uruchamiania Maemo + + + Run on Maemo device + Maemo run configuration default display name + Uruchom na urządzeniu Maemo + + + Clean Environment + Czyste środowisko + + + System Environment + Środowisko systemowe Qt4ProjectManager::Internal::MaemoRunConfigurationWidget Run configuration name: - Nazwa konfiguracji uruchamiania: + Nazwa konfiguracji uruchamiania: <a href="%1">Manage device configurations</a> @@ -17281,9 +19037,102 @@ Czy uruchomiłeś Qemu? Device configuration: Konfiguracja urządzenia: + + Executable on host: + Plik wykonywalny na hoście: + + + Executable on device: + Plik wykonywalny na urządzeniu: + + + C++ only + Tylko C++ + + + QML only + Tylko QML + + + C++ and QML + C++ i QML + + + Debugging type: + Typ debugowania: + + + Use remote gdb + Użyj zdalnego gdb + + + Use remote gdbserver + Użyj zdalnego gdbserver + + + Base environment for this run configuration: + Podstawowe środowisko dla tej konfiguracji uruchamiania: + + + Clean Environment + Czyste środowisko + + + System Environment + Środowisko systemowe + + + Fetch Device Environment + Pobierz środowisko urządzenia + + + Choose directory to mount + Wybierz katalog do zamontowania + + + <b>Debugging details:</b> Use gdb + <b>Szczegóły debugowania:</b> Użyj gdb + + + <b>Debugging details:</b> Use gdbserver + <b>Szczegóły debugowania:</b> Użyj gdbserver + + + No local directories to be mounted on the device. + Brak lokalnych katalogów do zamontowania na urządzeniu. + + + One local directory to be mounted on the device. + Jeden lokalny katalog do zamontowania na urządzeniu. + + + %n local directories to be mounted on the device. + Note: Only mountCount>1 will occur here as 0, 1 are handled above. + + %n lokalny katalog do zamontowania na urządzeniu. + %n lokalne katalogi do zamontowania na urządzeniu. + %n lokalnych katalogów do zamontowania na urządzeniu. + + + + WARNING: You want to mount %1 directories, but your device has only %n free ports.<br>You will not be able to run this configuration. + + Ostrzeżenie: Nie można zamontować %1 katalogów ponieważ urządzenie posiada tylko %n wolny port.<br>Nie będzie można uruchomić tej configuracji. + Ostrzeżenie: Nie można zamontować %1 katalogów ponieważ urządzenie posiada tylko %n wolne porty.<br>Nie będzie można uruchomić tej configuracji. + Ostrzeżenie: Nie można zamontować %1 katalogów ponieważ urządzenie posiada tylko %n wolnych portów.<br>Nie będzie można uruchomić tej configuracji. + + + + WARNING: You want to mount %1 directories, but only %n ports on the device will be available in debug mode. <br>You will not be able to debug your application with this configuration. + + Ostrzeżenie: Nie można zamontować %1 katalogów ponieważ urządzenie udostępnia tylko %n port do debugowania.<br>Nie będzie można debugować aplikacji przy użyciu tej configuracji. + Ostrzeżenie: Nie można zamontować %1 katalogów ponieważ urządzenie udostępnia tylko %n porty do debugowania.<br>Nie będzie można debugować aplikacji przy użyciu tej configuracji. + Ostrzeżenie: Nie można zamontować %1 katalogów ponieważ urządzenie udostępnia tylko %n portów do debugowania.<br>Nie będzie można debugować aplikacji przy użyciu tej configuracji. + + Executable: - Plik wykonywalny: + Plik wykonywalny: Arguments: @@ -17294,63 +19143,63 @@ Czy uruchomiłeś Qemu? Qt4ProjectManager::Internal::AbstractMaemoRunControl Files to deploy: %1. - Pliki do zainstalowania: %1. + Pliki do zainstalowania: %1. Deploying - Instalowanie + Instalowanie No device configuration set for run configuration. - Brak konfiguracji urządzenia dla konfiguracji uruchamiania. + Brak konfiguracji urządzenia dla konfiguracji uruchamiania. Cleaning up remote leftovers first ... - Porządkowanie zdalnych pozostałości... + Porządkowanie zdalnych pozostałości... Initial cleanup canceled by user. - Wstępne porządkowanie anulowane przez użytkownika. + Wstępne porządkowanie anulowane przez użytkownika. Error running initial cleanup: %1. - Błąd podczas wstępnego porządkowania: %1. + Błąd podczas wstępnego porządkowania: %1. Initial cleanup done. - Zakończono wstępne porządkowanie. + Zakończono wstępne porządkowanie. Starting remote application. - Uruchamianie zdalnej aplikacji. + Uruchamianie zdalnej aplikacji. Deployment canceled by user. - Instalowanie anulowane przez użytkownika. + Instalowanie anulowane przez użytkownika. Deployment finished. - Zakończono instalowanie. + Zakończono instalowanie. Remote execution canceled due to user request. - Zdalne uruchomienie anulowane na żądanie użytkownika. + Zdalne uruchomienie anulowane na żądanie użytkownika. Error running remote process: %1 - Błąd zdalnego procesu: %1 + Błąd zdalnego procesu: %1 Finished running remote process. - Zakończono zdalny proces. + Zakończono zdalny proces. Remote Execution Failure - Błąd zdalnego procesu + Błąd zdalnego procesu Deployment failed: %1 - Błąd instalacji: %1 + Błąd instalacji: %1 @@ -17383,13 +19232,21 @@ Czy uruchomiłeś Qemu? Could not read public key file '%1'. Nie można odczytać pliku z publicznym kluczem "%1". + + Could not connect to host: %1 + Nie można połączyć się z hostem: %1 + + + You will need at least one port. + Wymagany jest przynajmniej jeden port. + Stop Deploying Zatrzymaj instalowanie Key deployment failed: %1 - Błąd instalacji klucza: %1 + Błąd instalacji klucza: %1 Deployment Succeeded @@ -17399,6 +19256,10 @@ Czy uruchomiłeś Qemu? Key was successfully deployed. Klucz został pomyślnie zainstalowany. + + Key deployment failed: %1. + Błąd instalacji klucza: %1. + Deploy Public Key ... Zainstaluj klucz publiczny... @@ -17409,8 +19270,39 @@ Czy uruchomiłeś Qemu? Create SIS Package Create SIS package build step name + Utwórz pakiet SIS + + + Create SIS Package + default create SIS package build step display name Utwórz pakiet SIS + + Could not find make command '%1' in the build environment + Nie można odnaleźć komendy make "%1" w środowisku budowania + + + The process "%1" exited normally. + Proces "%1" zakończył się normalnie. + + + The process "%1" exited with code %2. + Proces "%1" zakończył się kodem wyjściowym %2. + + + The process "%1" crashed. + Proces "%1" zakończył pracę błędem. + + + Could not start process "%1" in %2 + Nie można uruchomić procesu "%1" w %2 + + + Starting: "%1" %2 in %3 + + Uruchamianie "%1" %2 w %3 + + Qt4ProjectManager::Internal::S60CreatePackageStepFactory @@ -17421,6 +19313,14 @@ Czy uruchomiłeś Qemu? Qt4ProjectManager::Internal::S60CreatePackageStepConfigWidget + + Reset Passphrases + + + + Do you want to reset all passphrases saved for keys used? + + self-signed własnoręcznie podpisany @@ -17429,6 +19329,10 @@ Czy uruchomiłeś Qemu? signed with certificate %1 and key file %2 podpisany certyfikatem %1 i kluczem %2 + + <b>Create SIS Package:</b> %1, using Smart Installer + + <b>Create SIS Package:</b> %1 <b>Utwórz pakiet SIS:</b> %1 @@ -17442,10 +19346,18 @@ Czy uruchomiłeś Qemu? New configuration - Nowa konfiguracja + Nowa konfiguracja New Configuration Name: + Nazwa nowej konfiguracji: + + + New Configuration + Nowa konfiguracja + + + New configuration name: Nazwa nowej konfiguracji: @@ -17510,13 +19422,13 @@ Czy uruchomiłeś Qemu? Qt4ProjectManager::Internal::MobileGuiAppWizard Mobile Qt Application - Mobilna aplikacja Qt + Mobilna aplikacja Qt Creates a Qt application optimized for mobile devices with a Qt Designer-based main window. Preselects Qt for Simulator and mobile targets if available - Tworzy aplikację Qt dla urządzeń przenośnych. Zawiera główne okno bazujące na Qt Designerze. + Tworzy aplikację Qt dla urządzeń przenośnych. Zawiera główne okno bazujące na Qt Designerze. Wstępnie wybiera wersję Qt dla Symulatora i aplikacji mobilnych (jeśli jest dostępna). @@ -17549,17 +19461,22 @@ Wstępnie wybiera wersję Qt dla Symulatora i aplikacji mobilnych (jeśli jest d Import Is this an import of an existing build or a new one? - Import + Import New Is this an import of an existing build or a new one? - Nowy + Nowy Qt Creator can set up the following targets for project <b>%1</b>: %1: Project name - Qt Creator może ustawić następujące wersje dla projektu <b>%1</b>: + Qt Creator może ustawić następujące wersje dla projektu <b>%1</b>: + + + Qt Creator can set up the following targets for<br>project <b>%1</b>: + %1: Project name + Qt Creator może ustawić następujące wersje dla<br>projektu <b>%1</b>: Choose a directory to scan for additional shadow builds @@ -17574,6 +19491,26 @@ Wstępnie wybiera wersję Qt dla Symulatora i aplikacji mobilnych (jeśli jest d %1: pro-file, %2: directory that was checked. Brak zbudowanych wersji dla projektu "%1" w katalogu "%2". + + Check All + Zaznacz wszystko + + + Check all Qt versions + Zaznacz wszystkie wersje Qt + + + Check only this version + Zaznacz tylko tą wersję + + + Check all versions + Zaznacz wszystkie wersje + + + Uncheck all versions + Usuń zaznaczenia + <b>Error:</b> Severity is Task::Error @@ -17584,6 +19521,36 @@ Wstępnie wybiera wersję Qt dla Symulatora i aplikacji mobilnych (jeśli jest d Severity is Task::Warning <b>Ostrzeżenie:</b> + + debug and release + We are going to build debug and release + debug i release + + + debug + Debug build + debug + + + release + release build + release + + + <br>using %1 (%2) + %1: qmake used (incl. full path), %2: "debug", "release" or "debug and release" + + + + Import + Is this an import of an existing build or a new one? + Import + + + New + Is this an import of an existing build or a new one? + Nowy + Setup targets for your project Ustaw produkty docelowe dla projektu @@ -17596,6 +19563,14 @@ Wstępnie wybiera wersję Qt dla Symulatora i aplikacji mobilnych (jeśli jest d Import Existing Shadow Build... Zaimportuj wersję zbudowaną w innym miejscu... + + Uncheck all Qt versions + + + + Uncheck All + + Qt4ProjectManager::Internal::TestWizard @@ -17656,16 +19631,24 @@ Wstępnie wybiera wersję Qt dla Symulatora i aplikacji mobilnych (jeśli jest d Składnica znajduje się już w systemie kontroli wersji - Repository created + Repository Created Utworzono składnicę + + Repository Creation Failed + Błąd podczas tworzenia składnicy + + + Repository created + Utworzono składnicę + A version control repository has been created in %1. Składnica systemu kontroli wersji została utworzona w %1. Repository creation failed - Błąd podczas tworzenia składnicy + Błąd podczas tworzenia składnicy A version control repository could not be created in %1. @@ -17722,39 +19705,39 @@ Wstępnie wybiera wersję Qt dla Symulatora i aplikacji mobilnych (jeśli jest d StartExternalQmlDialog Start Simultaneous QML and C++ Debugging - Rozpocznij jednoczesne debugowanie QML i C++ + Rozpocznij jednoczesne debugowanie QML i C++ Debugging address: - Adres debugowania: + Adres debugowania: Debugging port: - Port debugowania: + Port debugowania: 127.0.0.1 - 127.0.0.1 + 127.0.0.1 Project: - Projekt: + Projekt: <No project> - <Brak projektu> + <Brak projektu> Viewer path: - Ścieżka do przeglądarki: + Ścieżka do przeglądarki: Viewer arguments: - Argumenty przeglądarki: + Argumenty przeglądarki: To switch languages while debugging, go to Debug->Language menu. - Aby zmienić język podczas debugowania przejdź do menu: Debugowanie->Język. + Aby zmienić język podczas debugowania przejdź do menu: Debugowanie->Język. @@ -17765,11 +19748,11 @@ Wstępnie wybiera wersję Qt dla Symulatora i aplikacji mobilnych (jeśli jest d Add File to Package - Dodaj plik do pakiety + Dodaj plik do pakiety Remove File from Package - Usuń plik z pakietu + Usuń plik z pakietu Check this if you want the files below to be deployed directly. @@ -17781,7 +19764,7 @@ Wstępnie wybiera wersję Qt dla Symulatora i aplikacji mobilnych (jeśli jest d Version number: - Numer wersji: + Numer wersji: Major: @@ -17797,7 +19780,23 @@ Wstępnie wybiera wersję Qt dla Symulatora i aplikacji mobilnych (jeśli jest d Files to deploy: - Pliki do zainstalowania: + Pliki do zainstalowania: + + + <b>Version number:</b> + <b>Numer wersji:</b> + + + <b>Adapt Debian file:</b> + + + + Edit + Zmodyfikuj + + + <b>Package Manager Icon:</b> + @@ -17882,6 +19881,15 @@ name <email> alias <email> User fields configuration file: + + Specifies a command that is executed to graphically prompt for a password, +should a repository require SSH-authentication (see documentation on SSH and the environment variable SSH_ASKPASS). + + + + SSH prompt command: + + BorderImageSpecifics @@ -18196,7 +20204,7 @@ name <email> alias <email> Pass. Char - Znak mark. + Znak Password Character @@ -18338,72 +20346,72 @@ name <email> alias <email> GenericSshConnection Could not connect to host. - Nie można połączyć się z hostem. - - - Error in cryptography backend: %1 - + Nie można połączyć się z hostem. Core::InteractiveSshConnection Error sending input - Błąd podczas wysyłania wejścia + Błąd podczas wysyłania wejścia Core::SftpConnection Error setting up SFTP subsystem - Błąd podczas ustanawiania podsystemu SFTP + Błąd podczas ustanawiania podsystemu SFTP Could not open file '%1' - Nie można otworzyć pliku "%1" + Nie można otworzyć pliku "%1" Could not uplodad file '%1' - Nie można wysłać pliku "%1" + Nie można wysłać pliku "%1" Could not copy remote file '%1' to local file '%2' - Nie można skopiować pliku zdalnego "%1" do pliku lokalnego "%2" + Nie można skopiować pliku zdalnego "%1" do pliku lokalnego "%2" Could not create remote directory - Nie można utworzyć zdalnego katalogu + Nie można utworzyć zdalnego katalogu Could not remove remote directory - Nie można usunąć zdalnego katalogu + Nie można usunąć zdalnego katalogu Could not get remote directory contents - Nie można otrzymać zawartości zdalnego katalogu + Nie można otrzymać zawartości zdalnego katalogu Could not remove remote file - Nie można usunąć zdalnego pliku + Nie można usunąć zdalnego pliku Could not change remote working directory - Nie można zmienić zdalnego katalogu roboczego + Nie można zmienić zdalnego katalogu roboczego SshKeyGenerator Error creating temporary files. - Błąd podczas tworzenia plików tymczasowych. + Błąd podczas tworzenia plików tymczasowych. Error generating keys: %1 - Błąd podczas generowania kluczy: %1 + Błąd podczas generowania kluczy: %1 Error reading temporary files. - Błąd podczas odczytywania plików tymczasowych. + Błąd podczas odczytywania plików tymczasowych. + + + Error generating key: %1 + Błąd podczas generowania klucz: %1 @@ -18532,6 +20540,10 @@ name <email> alias <email> Adapter start failed Nie można uruchomić adaptera + + Python Error + Błąd Pythona + '%1' contains no identifier "%1" nie zawiera identyfikatora @@ -18624,14 +20636,14 @@ name <email> alias <email> Engine %1 engine number - Silnik %1 + Silnik %1 Qml::Internal::StartExternalQmlDialog <No project> - <Brak projektu> + <Brak projektu> @@ -18651,18 +20663,18 @@ name <email> alias <email> QmlProjectManager::Internal::QmlTaskManager QML - QML + QML Qt4ProjectManager::Internal::MaemoPackageContents Local File Path - Ścieżka do lokalnego pliku + Ścieżka do lokalnego pliku Remote File Path - Ścieżka do zdalnego pliku + Ścieżka do zdalnego pliku @@ -18677,23 +20689,23 @@ name <email> alias <email> Packaging Error: Cannot open file '%1'. - Błąd pakowania: Nie można otworzyć pliku "%1". + Błąd pakowania: Nie można otworzyć pliku "%1". Packaging Error: Cannot write file '%1'. - Błąd pakowania: Nie można zapisać pliku "%1". + Błąd pakowania: Nie można zapisać pliku "%1". Packaging Error: Could not create directory '%1'. - Błąd pakowania: Nie można utworzyć katalogu "%1. + Błąd pakowania: Nie można utworzyć katalogu "%1. Packaging Error: Could not replace file '%1'. - Błąd pakowania: Nie można zastąpić pliku "%1". + Błąd pakowania: Nie można zastąpić pliku "%1". Packaging Error: Could not copy '%1' to '%2'. - Błąd pakowania: Nie można skopiować pliku "%1" do "%2". + Błąd pakowania: Nie można skopiować pliku "%1" do "%2". Package created. @@ -18707,6 +20719,30 @@ name <email> alias <email> Packaging failed. Błąd pakowania. + + Packaging for Maemo + + + + Package up to date. + Pakiet aktualny. + + + Could not move package files from %1 to %2. + Nie można przenieść plików pakietu z %1 do %2. + + + Could not remove directory '%1'. + Nie można usunąć katalogu "%1". + + + Could not create Debian directory '%1'. + Nie można utworzyć katalogu Debian w "%1". + + + Could not copy file '%1' to '%2' + Nie można skopiować pliku "%1" do "%2" + Packaging error: Could not start command '%1'. Reason: %2 Błąd pakowania: Nie można uruchomić komendy "%1". Powód: %2 @@ -18715,6 +20751,12 @@ name <email> alias <email> Exit code: %1 Kod wyjściowy: %1 + + Your project name contains characters not allowed in Debian packages. +They must only use lower-case letters, numbers, '-', '+' and '.'. +We will try to work around that, but you may experience problems. + + Packaging Error: Command '%1' failed. Błąd pakowania: Komenda "%1" zakończona błędem. @@ -18726,28 +20768,56 @@ name <email> alias <email> Qt4ProjectManager::Internal::MaemoPackageCreationWidget + + No Version Available. + Brak dostępnej wersji. + + + Could not read icon + Nie można odczytać ikony + + + Images + Obrazki + + + Choose Image + Wybierz obrazek + + + Could Not Set New Icon + Nie można ustawić nowej ikony + <b>Create Package:</b> <b>Utwórz pakiet:</b> + + (Packaging disabled) + (Pakowanie wyłączone) + + + Could Not Set Version Number + Nie można ustawić numeru wersji + Choose a local file - Wybierz plik lokalny + Wybierz plik lokalny File already in package - Plik jest już obecny w pakiecie + Plik jest już obecny w pakiecie You have already added this file. - Plik został już uprzednio dodany. + Plik został już uprzednio dodany. Qt4ProjectManager::Internal::MaemoRunConfigurationFactory New Maemo Run Configuration - Nowa konfiguracja uruchamiania Maemo + Nowa konfiguracja uruchamiania Maemo @@ -18861,6 +20931,14 @@ name <email> alias <email> %1: Path to qmake executable Komenda qmake "%1" nie została odnaleziona lub nie jest plikiem wykonywanlym. + + Qmake does not support build directories below the source directory. + + + + The build directory needs to be at the same level as the source directory. + + emptyPane @@ -18890,6 +20968,14 @@ name <email> alias <email> Invalid Id Niepoprawny identyfikator + + Warning + Ostrzeżenie + + + Reparenting the component %1 here will cause the component %2 to be deleted. Do you want to proceed? + + QmlDesigner::PropertyEditor @@ -18970,16 +21056,48 @@ Identyfikatory muszą rozpoczynać się małą literą. Split if Statement Rozdziel instrukcję if + + Enclose in QLatin1Char(...) + Umieść w QLatin1Char(...) + Enclose in QLatin1String(...) Umieść w QLatin1String(...) + + Mark as translatable + Zaznacz jako przetłumaczalne + Convert to Objective-C String Literal - Use Fast String Concatenation with % + Convert to Hexadecimal + + + + Convert to Octal + + + + Convert to Decimal + + + + Complete Switch Statement + Dokończ instrukcję "switch" + + + #include header file + + + + Add local declaration + Dodaj lokalnę deklarację + + + Convert to Camel Case ... @@ -19009,31 +21127,19 @@ Identyfikatory muszą rozpoczynać się małą literą. Qt4ProjectManager::Internal::QemuRuntimeManager Start Maemo Emulator - Uruchom emulator Maemo - - - Qemu has been shut down, because you removed the corresponding Qt version. - - - - Qemu finished with error: Exit code was %1. - - - - Qemu failed to start: %1 - + Uruchom emulator Maemo Qemu crashed - Qemu zakończone błędem + Qemu zakończone błędem Qemu error - Błąd Qemu + Błąd Qemu Stop Maemo Emulator - Zatrzymaj emulator Maemo + Zatrzymaj emulator Maemo @@ -19048,19 +21154,19 @@ Identyfikatory muszą rozpoczynać się małą literą. Normal - Normalny + Normalny Outline - Kontur + Kontur Raised - Wypukły + Wypukły Sunken - Wklęsły + Wklęsły ... @@ -19076,6 +21182,10 @@ Identyfikatory muszą rozpoczynać się małą literą. FakeVim::Internal::FakeVimHandler::Private + + [New] + [Nowy] + Not an editor command: %1 %1 nie jest komendą edytora @@ -19085,7 +21195,3682 @@ Identyfikatory muszą rozpoczynać się małą literą. QmlDesigner::ContextPaneWidget Disable permanently - Wyłącz na stałe + Wyłącz na stałe + + + + ContextPaneWidgetBorderImage + + Form + Formularz + + + Stretch vertically. Scales the image to fit to the available area. + + + + Repeat vertically. Tiles the image until there is no more space. May crop the last image. + + + + Round. Like Repeat, but scales the images down to ensure that the last image is not cropped. + + + + Repeat horizontally. Tiles the image until there is no more space. May crop the last image. + + + + Strech horizontally. Scales the image to fit to the available area. + + + + 10 x 10 + 10 x 10 + + + + ContextPaneWidgetImage + + Form + Formularz + + + The image is scaled to fit + + + + The image is stretched horizontally and tiled vertically + + + + The image is stretched vertically and tiled horizontally + + + + The image is duplicated horizontally and vertically + + + + The image is scaled uniformly to fit without cropping + + + + The image is scaled uniformly to fill, cropping if necessary + + + + 10 x 10 + 10 x 10 + + + + ContextPaneWidgetRectangle + + Form + Formularz + + + Gradient + Gradient + + + Color + Kolor + + + ... + ... + + + Border + Brzeg + + + + EasingContextPane + + Dialog + Dialog + + + Play simulation + + + + Easing + + + + Type of easing curve + + + + Subtype + + + + Acceleration or deceleration of easing curve + + + + Duration + + + + Duration of animation + + + + INVALID + + + + ms + + + + Amplitude + + + + Amplitude of elastic and bounce easing curves + + + + Period + + + + Easing period of an elastic curve + + + + Overshoot + + + + Easing overshoot for a back curve + + + + + ClassView::Internal::NavigationWidget + + Form + Formularz + + + Show subprojects + Pokaż podprojekty + + + Show Subprojects + + + + + AttachTcfDialog + + Start Debugger + Uruchom debugger + + + Host and port: + Host i port: + + + Architecture: + Architektura: + + + Use server start script: + Użyj startowego skryptu serwera: + + + Server start script: + Startowy skrypt serwera: + + + + BreakpointDialog + + Dialog + Dialog + + + Breakpoint type: + Typ pułapki: + + + File name: + Nazwa pliku: + + + Line number: + Numer linii: + + + Function: + Funkcja: + + + Condition: + Warunek: + + + Ignore count: + Licznik pominięć: + + + Thread specification: + Specyfikacja wątku: + + + Address: + Adres: + + + Edit Breakpoint Properties + + + + Use full path: + + + + + Help::Internal::RemoteFilterOptions + + Filter configuration + Konfiguracja filtra + + + Prefix: + Przedrostek: + + + Limit to prefix + Ogranicz aktywność filtru: +aktywny tylko po wpisaniu przedrostka + + + + + + + + + - + - + + + Double click to edit item. + Kliknij dwukrotnie aby zmodyfikować element. + + + + ImageViewer::Internal::ImageViewerToolbar + + Show background + Pokaż tło + + + Show outline + + + + Fit image in the screen + Dopasuj obrazek do ekranu + + + Original size + Oryginalny rozmiar + + + Zoom In + Powiększ + + + Zoom Out + Pomniejsz + + + + ComponentNameDialog + + Dialog + Dialog + + + Component name: + Nazwa komponentu: + + + Path: + Ścieżka: + + + Choose... + Wybierz... + + + + QmlJSEditor::Internal::QuickToolBarSettingsPage + + Form + Formularz + + + Qt Quick Toolbars + + + + Always show Qt Quick Toolbar + + + + If enabled, the toolbar will remain pinned to an absolute position. + + + + Pin Qt Quick Toolbar + + + + Qt Quick ToolBar + + + + + Qt4ProjectManager::Internal::LibraryDetailsWidget + + Form + Formularz + + + Library: + Biblioteka: + + + Library file: + Plik z biblioteką: + + + Include path: + Ścieżka do nagłówków: + + + Platform + Platforma + + + Linux + Linux + + + Mac + Mac + + + Windows + Windows + + + Symbian + Symbian + + + Linkage: + Dowiązanie: + + + Dynamic + Dynamiczne + + + Static + Statyczne + + + Mac: + Mac: + + + Library + Biblioteka + + + Framework + Framework + + + Windows: + Windows: + + + Library inside "debug" or "release" subfolder + Biblioteka wewnątrz podkatalogu "debug" lub "release" + + + Add "d" suffix for debug version + Dodaj przyrostek "d" do wersji debugowej + + + Remove "d" suffix for release version + Usuń przyrostek "d" z wersji release'owej + + + + MaemoDeployableListWidget + + Form + Formularz + + + Add File to Package + Dodaj plik do pakietu + + + Remove File from Package + Usuń plik z pakietu + + + + MaemoDeployStepWidget + + Form + Formularz + + + Device configuration: + Konfiguracja urządzenia: + + + Also deploy to sysroot + + + + These show the INSTALLS settings from the project file(s). + + + + <b>Files to install:</b> + <b>Pliki do zainstalowania:</b> + + + + MobileAppWizardOptionPage + + WizardPage + StronaKreatora + + + General + Ogólne + + + Orientation Behavior: + + + + Symbian specific + + + + Application Icon (.svg): + + + + Target UID3: + + + + Enable network access + Włącz dostęp sieciowy + + + Maemo specific + + + + Application Icon (64x64): + + + + + MobileLibraryWizardOptionPage + + WizardPage + StronaKreatora + + + Enable network access + Włącz dostęp sieciowy + + + Target UID3: + + + + + QmlStandaloneAppWizardSourcesPage + + WizardPage + StronaKreatora + + + Main QML file + Główny plik QML + + + QML Modules + Moduły QML + + + + + + + + + - + - + + + URIs (e.g. 'org.mydomain.MyQmlModule') + Lista URI (np. "org.mojadomena.MojModulQml") + + + Import Paths + Zaimportuj ścieżki + + + Error + Błąd + + + + HighlighterSettingsPage + + Form + Formularz + + + <html><head/><body> +<p>Highlight definitions are provided by the <a href="http://kate-editor.org/">Kate Text Editor</a>.</p></body></html> + + + + Syntax Highlight Definition Files + + + + Location: + Położenie: + + + Use fallback location + + + + Behavior + Zachowanie + + + Alert when a highlight definition is not found + + + + Ignored file patterns: + + + + + ManageDefinitionsDialog + + Dialog + Dialog + + + Definitions + Definicje + + + Select All + Zaznacz wszystko + + + Clear Selection + Usuń selekcję + + + Invert Selection + Odwróć selekcję + + + Download Selected Definitions + Pobierz zaznaczone definicje + + + + ProxySettings + + Dialog + Dialog + + + Use http proxy + Użyj pośrednika http + + + Server Address: + Adres serwera: + + + Port: + Port: + + + Username: + Nazwa użytkownika: + + + Password: + Hasło: + + + HTTP Proxy + Pośrednik HTTP + + + Use HTTP Proxy + Użyj pośrednika HTTP + + + Server + Serwer + + + Name or IP + Nazwa lub IP + + + Port + Port + + + 8080 + 8080 + + + Username + Nazwa użytkownika + + + Password + Hasło + + + + RecordingOptions + + Video options + Ustawienia wideo + + + File: + Plik: + + + ... + ... + + + Size + Rozmiar + + + VGA + VGA + + + 720p + 720p + + + QVGA + QVGA + + + Width: + Szerokość: + + + Height: + Wysokość: + + + Rate + Częstotliwość + + + 60Hz + 60Hz + + + 50Hz + 50Hz + + + 25Hz + 25Hz + + + Hz + Hz + + + 24Hz + 24Hz + + + Profile + Profil + + + Help + Pomoc + + + 60 Hz + 60 Hz + + + 50 Hz + 50 Hz + + + 25 Hz + 25 Hz + + + 24 Hz + 24 Hz + + + 20 Hz + 20 Hz + + + 15 Hz + 15 Hz + + + 10 Hz + 10 Hz + + + File + Plik + + + Options + Opcje + + + + QmlEditorWidgets::ContextPaneWidget + + Hides this toolbar. + + + + Pin Toolbar + + + + Show Always + + + + Unpins the toolbar and moves it to the default position. + + + + Hides this toolbar. This toolbar can be permanently disabled in the options page or in the context menu. + + + + + QmlEditorWidgets::ContextPaneWidgetImage + + double click for preview + kliknij dwukrotnie aby wyświetlić podgląd + + + + QmlEditorWidgets::FileWidget + + Open File + Otwórz plik + + + + QmlJS::Bind + + expected two numbers separated by a dot + oczekiwano dwóch liczb oddzielonych kropką + + + package import requires a version number + import pakietu wymaga podania numeru wersji + + + file or directory not found + nie można odnaleźć pliku lub katalogu + + + + Utils::DebuggerLanguageChooser + + C++ + C++ + + + QML + QML + + + Debug port: + Port debugowania: + + + + Utils::SynchronousProcess + + The command '%1' finished successfully. + Komenda "%1" poprawnie zakończona. + + + The command '%1' terminated with exit code %2. + Komenda "%1" zakończona kodem wyjściowym %2. + + + The command '%1' terminated abnormally. + Komenda "%1" niepoprawnie zakończona. + + + The command '%1' could not be started. + Komenda "%1" nie może zostać uruchomiona. + + + The command '%1' did not respond within the timeout limit (%2 ms). + Komenda "%1" nie odpowiedziała w określonym czasie (%2 ms). + + + Process not Responding + Brak odpowiedzi + + + The process is not responding. + Proces nie odpowiada. + + + The process '%1' is not responding. + Proces "%1" nie odpowiada. + + + Would you like to terminate it? + + + + Would you like to terminate it? + Czy chcesz go zakończyć? + + + + ClassView::Internal::NavigationWidgetFactory + + Class View + Widok klas + + + + Core::Internal::CommandComboBox + + Activate %1 + Uaktywnij %1 + + + + Core::NavigationWidget + + Activate %1 Pane + Uaktywnij panel %1 + + + Hide Sidebar + Ukryj boczny pasek + + + Show Sidebar + Pokaż boczny pasek + + + + Core::Internal::SftpChannelPrivate + + Server could not start sftp subsystem. + Serwer nie może uruchomić podsystemu sftp. + + + Unexpected packet of type %1. + Nieoczekiwany pakiet typu %1. + + + Protocol version mismatch: Expected %1, got %2 + Niezgodność wersji protokołu: Oczekiwano %1 zamiast %2 + + + Unknown error. + Nieznany błąd. + + + Created remote directory '%1'. + Utworzono zdalny katalog "%1". + + + Remote directory '%1' already exists. + Zdalny katalog "%1" już istnieje. + + + Error creating directory '%1': %2 + Błąd tworzenia katalogu "%1": %2 + + + Could not open local file '%1': %2 + Nie można otworzyć lokalnego pliku "%1": %2 + + + Remote directory could not be opened for reading. + Nie można otworzyć zdalnego katalogu do odczytu. + + + Failed to list remote directory contents. + Nie można uzyskać zawartości zdalnego katalogu. + + + Failed to close remote directory. + Nie można zamknąć zdalnego katalogu. + + + Failed to open remote file for reading. + Nie można otworzyć zdalnego pliku do odczytu. + + + Failed retrieve information on the remote file ('stat' failed). + Nie można uzyskać informacji o zdalnym pliku ("stat" niepoprawnie zakończony). + + + Failed to read remote file. + Nie można odczytać zdalnego pliku. + + + Failed to close remote file. + Nie można zamknąć zdalnego pliku. + + + Failed to open remote file for writing. + Nie można otworzyć zdalnego pliku do zapisu. + + + Failed to write remote file. + Nie można zapisać zdalnego pliku. + + + Cannot append to remote file: Server does not support the file size attribute. + Nie można dodać zawartości do zdalnego pliku: Serwer nie obsługuje atrybutu "rozmiar pliku". + + + Server could not start session. + Serwer nie może rozpocząć sesji. + + + Error reading local file: %1 + Błąd odczytu lokalnego pliku: %1 + + + + SshConnection + + Server and client capabilities don't match. Client list was: %1. +Server list was %2. + Niezgodność zdolności serwera i klienta. +Lista klienta: %1. +Lista serwera: %2. + + + + Core::Internal::SshChannelManager + + Invalid channel id %1 + Niepoprawny identyfikator kanału %1 + + + + Core::Internal::SshConnectionPrivate + + SSH Protocol error: %1 + Błąd protokołu SSH: %1 + + + Botan library exception: %1 + Wyjątek biblioteki Botan: %1 + + + Invalid protocol version: Expected '2.0', got '%1'. + Niepoprawna wersja protokołu: Oczekiwano "2.0" zamiast "%1". + + + Invalid server id '%1'. + Niepoprawny identyfikator serwera "%1". + + + Unexpected packet of type %1. + Nieoczekiwany pakiet typu %1. + + + Could not read private key file: %1 + Nie można odczytać pliku z publicznym kluczem: %1 + + + Password expired. + Hasło straciło ważność. + + + Server rejected password. + Serwer odrzucił hasło. + + + Server rejected key. + Serwer odrzucił klucz. + + + Server closed connection: %1 + Serwer zamknął połączenie: %1 + + + Connection closed unexpectedly. + Nieoczekiwane zamknięcie połączenia. + + + Timeout waiting for reply from server. + + + + + CodePaster::NetworkProtocol + + Checking connection + + + + Connecting to %1... + Łączenie z %1... + + + + CheckUndefinedSymbols + + Expected a namespace-name + Oczekiwano nazwy przestrzeni nazw + + + + QCoreApplication + + Add %1 declaration + CppEditor::DeclFromDef + Dodaj deklarację %1 + + + GDB helper + + + + qmldump + + + + QMLObserver + + + + Cannot build qmldump; Qt version must be 4.7.1 or higher. + + + + Cannot build QMLObserver; Qt version must be 4.7.1 or higher. + + + + + CppEditor::Internal::CppTypeHierarchyWidget + + No type hierarchy available + Brak dostępnej hierarchii typów + + + + CppEditor::Internal::CppTypeHierarchyFactory + + Type Hierarchy + Hierarchia typów + + + + CppTools::Internal::SymbolsFindFilter + + C++ Symbols + Symbole C++ + + + Searching + Przeszukiwanie + + + + CppTools::Internal::SymbolsFindFilterConfigWidget + + Types: + Typy: + + + Classes + Klasy + + + Methods + Metody + + + Enums + Typy wyliczeniowe + + + Declarations + Deklaracje + + + Projects Only + Tylko projekty + + + Global + Globalne + + + + Debugger::Internal::BreakpointDialog + + File and Line Number + Plik i numer linii + + + Function Name + Nazwa funkcji + + + Function "main()" + Funkcja "main()" + + + Address + Adres + + + + Debugger::Internal::CdbEngine + + The function "%1()" failed: %2 + Function call failed + Funkcja "%1()" zakończona niepowodzeniem: %2 + + + Version: %1 + Wersja: %1 + + + <html>The installed version of the <i>Debugging Tools for Windows</i> (%1) is rather old. Upgrading to version %2 is recommended for the proper display of Qt's data types.</html> + <html>Zainstalowana wersja <i>narzędzi debugowych dla Windows</i> (%1) jest przestarzała. Zalecane jest uaktualnienie do wersji %2 w celu poprawnego wyświetlania typów danych Qt.</html> + + + Debugger + Debugger + + + <html><head/><body><p>The debugger is not configured to use the public <a href="%1">Microsoft Symbol Server</a>. This is recommended for retrieval of the symbols of the operating system libraries.</p><p><i>Note:</i> A fast internet connection is required for this to work smoothly. Also, a delay might occur when connecting for the first time.</p><p>Would you like to set it up?</p></br></body></html> + + + + Symbol Server + Serwer z symbolami + + + Do not ask again + Nie pytaj więcej + + + The dumper library was not found at %1. + Biblioteka zrzutów nie została znaleziona w %1. + + + The console stub process was unable to start '%1'. + + + + Attaching to core files is not supported! + Dołączanie do pliku zrzutu nie jest obsługiwane. + + + Attaching to core files is not supported. + + + + The process exited with exit code %1. + Proces zakończył się kodem wyjściowym %1. + + + Continuing with '%1'... + Kontynuacja z "%1"... + + + Unable to continue: %1 + Nie można kontynuować: %1 + + + Reverse stepping is not implemented. + Kroczenie wstecz nie jest zaimplementowane. + + + Thread %1 cannot be stepped. + Wątek %1 nie może być śledzony krok po kroku. + + + Stepping %1 + Kroczenie %1 + + + Running requested... + Zażądano uruchomienia... + + + Running up to %1:%2... + Uruchomiony do osiągnięcia %1:%2... + + + Running up to function '%1()'... + Uruchomiony do osiągnięcia funkcji '%1()'... + + + Jump to line is not implemented + Skok do linii nie jest obsługiwany + + + Assigning '%1' to '%2' (%3)... + Arguments: New value, name, (type) + Przypisywanie wartości "%1" do zmiennej "%2" typu %3... + + + Can assign only scalar values. + Przypisać można jedynie wartości skalarne. + + + Cannot assign values of type '%1'. Only POD-types can be assigned. + Nie można przypisać wartości typu "%1". Przypisać można jedynie podstawowe typy POD. + + + Unable to assign the value '%1' to '%2' (%3): %4 + Arguments: New value, name, (type): Error + Nie można przypisać wartości "%1" do "%2" typu %3: %4 + + + Unable to retrieve %1 bytes of memory at 0x%2: %3 + Nie można odczytać %1 bajtów pamięci spod adresu 0x%2: %3 + + + Cannot retrieve symbols while the debuggee is running. + Nie można odczytać symboli dopóki pracuje debugowany program. + + + Debugger Error + Błąd debuggera + + + Ignoring initial breakpoint... + Zignorowano początkową pułapkę... + + + <interrupt thread> + <przerwij wątek> + + + Breakpoint + Pułapka + + + Interrupted in thread %1, current thread: %2 + Przerwano w wątku %1, bieżący wątek: %2 + + + Stopped, current thread: %1 + Zatrzymano, bieżący wątek: %1 + + + Changing threads: %1 -> %2 + Zmiana wątków: %1 -> %2 + + + stopped + zatrzymano + + + Stopped at %1:%2 in thread %3. + Zatrzymano w %1:%2 w wątku %3. + + + Stopped at %1 in thread %2 (missing debug information). + Zatrzymano w %1 w wątku %2 (brak informacji debugowej). + + + Stopped at %1 (%2) in thread %3 (missing debug information). + Zatrzymano w %1 (%2) w wątku %3 (brak informacji debugowej). + + + Stopped in thread %1 (missing debug information). + Zatrzymano w wątku %1 (brak informacji debugowej). + + + Breakpoint: %1 + Pułapka: %1 + + + Watchpoint: %1 + + + + The CDB debug engine does not support the '%1 + + + + + Debugger::Internal::CacheDirectoryDialog + + Select Local Cache Folder + Wybierz katalog z lokalnym cache + + + Path: + Ścieżka: + + + Already Exists + Już istnieje + + + A file named '%1' already exists. + Plik o nazwie "%1" już istnieje. + + + Cannot Create + Nie można utworzyć + + + The folder '%1' could not be created. + Nie można utworzyć katalogu "%1". + + + + Debugger::Internal::Console + + Clear Contents + Wyczyść zawartość + + + Save Contents + Zachowaj zawartość + + + Log File + Plik dziennika + + + Write Failure + Błąd zapisu + + + Unable to write log contents to '%1': %2 + Nie można zapisać zawartości dziennika do "%1": %2 + + + + Debugger::Internal::ConsoleWindow + + Console + Konsola + + + + Debugger::Internal::AttachTcfDialog + + Select Executable + Wybierz plik wykonywalny + + + + Debugger::DebuggerEnginePrivate + + Remove Breakpoint %1 + Usuń pułapkę %1 + + + Disable Breakpoint %1 + Wyłącz pułapkę %1 + + + Enable Breakpoint %1 + Włącz pułapkę %1 + + + Set Breakpoint at 0x%1 + Ustaw pułapkę w 0x%1 + + + Set Breakpoint at line %1 + Ustaw pułapkę w linii %1 + + + + Debugger::DebuggerEngine + + Symbol + Symbol + + + Address + Adres + + + Code + Kod + + + Symbols in "%1" + Symbole w "%1" + + + Launching + Uruchamianie + + + %1 (explicitly set in the Debugger Options) + %1 (ustawione jawnie w opcjach debuggera) + + + Open Qt4 Options + Otwórz ustawienia Qt4 + + + Turn off Helper Usage + Wyłącz używanie asystenta + + + Continue Anyway + Kontynuuj + + + Debugging Helper Missing + Brak asystenta debuggera + + + The debugger could not load the debugging helper library. + Debugger nie mógł załadować biblioteki asystenta debuggera. + + + The debugging helper is used to nicely format the values of some Qt and Standard Library data types. It must be compiled for each used Qt version separately. On the Qt4 options page, select a Qt installation and click Rebuild. + Asystent debuggera jest używany do ładnego formatowania niektórych typów Qt i Biblioteki Standardowej. Musi być skompilowany oddzielnie dla każdej używanej wersji Qt. Można to zrobić z poziomu strony ustawień Qt poprzez wybranie instalacji Qt i kliknięcie na "Przebuduj" w linijce "Asystent debuggera". + + + Turn off QML Observer Usage + + + + QML Observer Missing + + + + QML Observer could not be found. + + + + QML Observer is used to offer additional debugging features for QML applications, such as interactive debugging and inspection tools.It must be compiled for each used Qt version separately. On the Qt4 options page, select a Qt installation and click Rebuild. + + + + Taking notice of pid %1 + + + + + Debugger::DebuggerPlugin + + Option '%1' is missing the parameter. + Brak parametru w opcji "%1". + + + The parameter '%1' of option '%2' is not a number. + Parametr "%1" w opcji "%2" nie jest liczbą. + + + Invalid debugger option: %1 + Niepoprawna opcja debuggera: %1 + + + The application requires the debugger engine '%1', which is disabled. + Program wymaga silnika debuggera "%1", który jest wyłączony. + + + + Debugger::DebuggerPluginPrivate + + QML Script Console + + + + Continue + Kontynuuj + + + Stop Debugger + Zatrzymaj debugger + + + Interrupt + Przerwij + + + Abort Debugging + Przerwij debugowanie + + + Aborts debugging and resets the debugger to the initial state. + Przerywa debugowanie i przywraca debugger do stanu początkowego. + + + Step Over + Przeskocz + + + Step Into + Wskocz do wnętrza + + + Step Out + Wyskocz na zewnątrz + + + Run to Line + Uruchom do linii + + + Run to Outermost Function + Uruchom do skrajnej funkcji + + + Immediately Return From Inner Function + Powróć natychmiast z wewnętrznej funkcji + + + Jump to Line + Skocz do linii + + + Toggle Breakpoint + Przełącz ustawienie pułapki + + + Add to Watch Window + Dodaj do okna obserwowanych + + + Create Snapshot + Utwórz zrzut + + + Reverse Direction + Odwrotny kierunek + + + Move to Called Frame + + + + Move to Calling Frame + + + + C++ + C++ + + + QML/JavaScript + QML/JavaScript + + + Error evaluating command line arguments: %1 + Błąd podczas przetwarzania argumentów komendy: %1 + + + Start and Debug External Application... + Uruchom i zdebuguj zewnętrzną aplikację... + + + Attach to Running External Application... + Dołącz do uruchomionej zewnętrznej aplikacji... + + + Attach to Core... + Dołącz do zrzutu... + + + Attach to Running Tcf Agent... + + + + This attaches to a running 'Target Communication Framework' agent. + + + + Start and Attach to Remote Application... + Uruchom i dołącz do zdalnej aplikacji... + + + Detach Debugger + Odłącz debugger + + + Interrupt Debugger + Przerwij debugger + + + Reset Debugger + Wyzeruj debugger + + + Threads: + Wątki: + + + Warning + Ostrzeżenie + + + Cannot attach to PID 0 + Nie można dołączyć do PID 0 + + + Process %1 + Proces %1 + + + Core file "%1" + Plik zrzutu "%1" + + + Remote: "%1" + Zdalny: "%1" + + + Attaching to PID %1. + Dołączanie do PID %1. + + + Attaching to remote server %1. + Dołączanie do zdalnego serwera %1. + + + Attaching to core %1. + Dołączanie do zrzutu %1. + + + Save Debugger Log + Zachowaj dziennik debuggera + + + + Debugger::DebuggerRunControlFactory + + Debug + + + + + Debugger::DebuggerRunControl + + Cannot debug '%1' (tool chain: '%2'): %3 + Nie można debugować "%1" (zestaw narzędzi: "%2"): %3 + + + Warning + Ostrzeżenie + + + Debugger + Debugger + + + Starting debugger '%1' for tool chain '%2'... + Uruchamianie debuggera "%1" dla zestawu narzędzi "%2"... + + + Debugging starts + Rozpoczęto debugowanie + + + Debugging has failed + Błąd debugowania + + + Debugging has finished + Zakończono debugowanie + + + A debugging session is still in progress. Terminating the session in the current state can leave the target in an inconsistent state. Would you still like to terminate it? + + + + A debugging session are still in progress. Terminating the session in the current state can leave the target in an inconsistent state. Would you still like to terminate it? + Trwa sesja debugowa. Zakończenie jej w bieżącym stanie może spowodować, że program znajdzie się w niespójnym stanie. Czy wciąż chcesz ją zakończyć? + + + Close Debugging Session + Zakończ sesję debugową + + + + Debugger::Internal::AbstractPlainGdbAdapter + + Starting executable failed: + + Nie można uruchomić programu: + + + + + Debugger::Internal::AttachGdbAdapter + + Attached to process %1. + Dołączono do procesu %1 + + + + Debugger::Internal::LocalPlainGdbAdapter + + Cannot set up communication with child process: %1 + Nie można ustanowić komunikacji z podprocesem: %1 + + + This does not seem to be a "Debug" build. +Setting breakpoints by file name and line number may fail. + Nie wygląda to na sesję debugową. +Ustawianie pułapek może się nie powieść. + + + + Debugger::Internal::RemoteGdbProcess + + Connection could not be established. + Nie można ustanowić połączenia. + + + Could not create FIFO. + Nie można utworzyć FIFO. + + + Application output reader unexpectedly finished. + + + + Remote gdb failed to start. + Nie można uruchomić zdalnego gdb. + + + Remote gdb crashed. + Zdalny gdb przerwał pracę. + + + + Debugger::Internal::RemoteGdbServerAdapter + + The upload process failed to start. Shell missing? + Nie można rozpocząć procesu przesyłania. Brak powłoki? + + + The upload process crashed some time after starting successfully. + Proces przesyłania przerwany po poprawnym uruchomieniu. + + + The last waitFor...() function timed out. The state of QProcess is unchanged, and you can try calling waitFor...() again. + Ostatnie wywołanie funkcji waitFor...() zakończyło się niepowodzeniem po określonym czasie. Stan QProcess się nie zmienił, możesz ponownie spróbować wywołać waitFor...(). + + + An error occurred when attempting to write to the upload process. For example, the process may not be running, or it may have closed its input channel. + Wystąpił błąd podczas próby pisania do procesu przesyłania. Proces może nie być uruchomiony lub zamknął on swój kanał wejściowy. + + + An error occurred when attempting to read from the upload process. For example, the process may not be running. + Wystąpił błąd podczas próby czytania z procesu przesyłania. Proces może nie być uruchomiony. + + + An unknown error in the upload process occurred. This is the default return value of error(). + Wystąpił nieznany błąd podczas procesu przesyłania. Jest to domyślna wartość zwrócona przez error(). + + + Error + Błąd + + + No symbol file given. + Brak pliku z symbolami. + + + Reading debug information failed: + + Błąd odczytu informacji debugowej: + + + + + Debugger::Internal::TcfTrkGdbAdapter + + Process started, PID: 0x%1, thread id: 0x%2, code segment: 0x%3, data segment: 0x%4. + Proces uruchomiony, PID: 0x%1, identyfikator wątku: 0x%2, segment kodu: 0x%3, segment danych: 0x%4. + + + The reported code segment address (0x%1) might be invalid. Symbol resolution or setting breakoints may not work. + + + + Connecting to TRK server adapter failed: + + Nie można nawiązać połączenia z adapterem serwera TRK: + + + + + Debugger::Internal::DebuggerPane + + Clear Contents + Wyczyść zawartość + + + Save Contents + Zachowaj zawartość + + + Log File + Plik dziennika + + + Write Failure + Błąd zapisu + + + Unable to write log contents to '%1': %2 + Nie można zapisać zawartości dziennika do "%1": %2 + + + + Debugger::Internal::InputPane + + Type Ctrl-<Return> to execute a line. + Naciśnij Ctrl-<Return> aby wykonać linię. + + + + Debugger::Internal::LogWindow + + Log + Dziennik + + + + Debugger::QmlAdapter + + Connect to debug server %1:%2 + Nawiąż połączenie z serwerem debugowym %1.%2 + + + Error: (%1) %2 + %1=error code, %2=error message + Błąd: (%1) %2 + + + disconnected. + + + rozłączony. + + + + resolving host... + + + + connecting to debug server... + łączenie z serwerem debugowym... + + + connected. + + połączony. + + + + closing... + zamykanie... + + + + Debugger::QmlCppEngine + + %1 debugger activated + Uaktywniono debugger %1 + + + + Debugger::QmlEngine + + QML Debugger connected. + + + + Failed to connect to debugger + Nie można nawiązać połączenia z debuggerem + + + Could not connect to QML debugger server at %1:%2. + + + + QML Debugger: Remote host closed connection. + + + + QML Debugger connecting... + + + + Failed to start application + Nie można uruchomić aplikacji + + + Application startup failed: %1 + + + + Trying to stop while process is no longer running. + + + + Stopped. + Zatrzymano. + + + <p>An Uncaught Exception occured in <i>%1</i>:</p><p>%2</p> + + + + Uncaught Exception + Nieobsłużony wyjątek + + + QML Debugger disconnected. + + + + + Debugger::Internal::ScriptConsole + + <Type expression to evaluate> + <Wpisz wyrażenie do wykonania> + + + Write and evaluate QtScript expressions. + Wpisz i wykonaj polecenia QtScript. + + + Script Console + + Konsola skryptowa + + + + + Debugger::Internal::SourceFilesHandler + + Internal name + Wewnętrzna nazwa + + + Full name + Pełna nazwa + + + + Debugger::Internal::TcfEngine + + %1. + %1. + + + Running requested... + Zażądano uruchomienia... + + + Stopped. + Zatrzymano. + + + + Git::Internal::SettingsPageWidget + + Set the environment variable HOME to '%1' +(%2). +This causes msysgit to look for the SSH-keys in that location +instead of its installation directory when run outside git bash. + Ustaw zmienną środowiskową HOME na "%1" +(%2). +Spowoduje to że msysgit uruchomiony na zewnątrz powłoki git +zacznie poszukiwać kluczy SSH w tym położeniu +zamiast w jego katalogu instalacyjnym. + + + not currently set + aktualnie nie ustawiona + + + currently set to '%1' + aktualnie ustawiona na "%1" + + + + Help::Internal::ExternalHelpWindow + + Show Sidebar + Pokazuj boczny pasek + + + Qt Creator Offline Help + Pomoc offline Qt Creatora + + + + EditorManager + + Next Open Document in History + Następny otwarty dokument w historii + + + Previous Open Document in History + Poprzedni otwarty dokument w historii + + + + Help::Internal::OpenPagesManager + + Copy Full Path to Clipboard + Skopiuj pełną ścieżkę do schowka + + + + Help::Internal::RemoteHelpFilter + + Online Documentation + Dokumentacja online + + + + ImageViewer::Internal::ImageViewerActionHandler + + Zoom In + Powiększ + + + Ctrl++ + Ctrl++ + + + Zoom Out + Pomniejsz + + + Ctrl+- + Ctrl+- + + + Original Size + Oryginalny rozmiar + + + Ctrl+0 + Ctrl+0 + + + Fit To Screen + Dopasuj do ekranu + + + Ctrl+= + Ctrl+= + + + Switch background + Przełącz tło + + + Ctrl+[ + Ctrl+[ + + + Switch outline + + + + Ctrl+] + Ctrl+] + + + + ProjectExplorer::Internal::BuildStepListWidget + + %1 Steps + %1 is the name returned by BuildStepList::displayName + Kroki %1 + + + No %1 Steps + Brak kroków %1 + + + Add %1 Step + Dodaj krok %1 + + + Move Up + Przenieś do góry + + + Move Down + Przenieś na dół + + + Remove Item + Usuń element + + + Removing Step failed + Nie można usunąć kroku + + + Cannot remove build step while building + Nie można usunąć kroku podczas budowania + + + No Build Steps + Brak kroków procesu budowania + + + + ProjectExplorer::Internal::CopyTaskHandler + + error: + Task is of type error + błąd: + + + warning: + Task is of type warning + ostrzeżenie: + + + &Copy + Name of the action triggering the copytaskhandler + S&kopiuj + + + Copy task to clipboard + Skopiuj zadanie do schowka + + + + ProjectExplorer::DeployConfiguration + + Deploy + Display name of the deploy build step list. Used as part of the labels in the project window. + Zainstaluj + + + No deployment + Default DeployConfiguration display name + Brak instalacji + + + + ProjectExplorer::DeployConfigurationFactory + + Deploy Configuration + Display name of the default deploy configuration + Konfiguracja instalacji + + + + ProjectExplorer::Internal::EditorSettingsWidget + + Default + Domyślne + + + + ProjectExplorer::RunControl + + Application Still Running + Program wciąż uruchomiony + + + %1 is still running. + %1 jest wciąż uruchomiony. + + + Force it to quit? + Zakończyć go? + + + Force Quit + Wymuś zakończenie + + + Keep Running + Pozostaw uruchomionym + + + + ProjectExplorer::Internal::ShowInEditorTaskHandler + + &Show in editor + &Pokaż w edytorze + + + Show task location in an editor + Pokaż położenie zadania w edytorze + + + + ProjectExplorer::Internal::ShowOutputTaskHandler + + Show &Output + Pokaż &wyjście + + + Show output generating this issue. + + + + + ProjectExplorer::Internal::TaskWindow + + Build Issues + Problemy podczas budowania + + + Show Warnings + Pokazuj ostrzeżenia + + + Filter by categories + Przefiltruj według kategorii + + + + ProjectExplorer::UserFileAccessor + + Project Settings File from a different Environment? + + + + Qt Creator has found a .user settings file which was created for another development setup, maybe originating from another machine. + +The .user settings files contain environment specific settings. They should not be copied to a different environment. + +Do you still want to load the settings file? + + + + + ProjectExplorer::UserFileHandler + + No deployment + Brak instalacji + + + Deploy to Maemo device + Zainstaluj na urządzeniu Maemo + + + Deploy to Symbian device + Zainstaluj na urządzeniu Symbian + + + + ProjectExplorer::Internal::VcsAnnotateTaskHandler + + &Annotate + Dołącz &adnotację + + + + QmlJSEditor::ComponentFromObjectDef + + Move Component into separate file + Przenieś komponent do osobnego pliku + + + Move Component into '%1.qml' + Przenieś komponent do "%1.qml" + + + + QmlJSEditor::Internal::ComponentNameDialog + + Choose a path + Wybierz ścieżkę + + + Invalid component name + Niepoprawna nazwa komponentu + + + Invalid path + Niepoprawna ścieżka + + + + QmlJSEditor::FindReferences + + Searching + Przeszukiwanie + + + + QmlJSEditor::QuickFix + + Split initializer + + + + + QmlJSInspector::Internal::QmlInspectorToolbar + + Apply Changes to Document + + + + Observer Mode + + + + Reload + Przeładuj + + + Play/Pause Animations + + + + Select + Wybierz + + + Zoom + Powiększ + + + Color Picker + + + + Live Preview Changes in QML Viewer + + + + Animation Speed + Prędkość animacji + + + 1x + 1x + + + 0.5x + 0.5x + + + 0.25x + 0.25x + + + 0.125x + 0.125x + + + 0.1x + 0.1x + + + Pause + + + + + QmlJSInspector::Internal::ContextCrumblePath + + [no context] + [brak kontekstu] + + + + QmlJSInspector::Internal::InspectorUi + + Context Path + + + + QML Observer + + + + + QmlJSInspector::Internal::QmlJSLiveTextPreview + + You changed a QML file in Live Preview mode, which modifies the running QML application. In case of unexpected behavior, please reload the QML application. + + + + Disable Live Preview + + + + The %1 attribute at line %2, column %3 cannot be changed without reloading the QML application. + + + + The %1 element at line %2, column %3 cannot be changed without reloading the QML application. + + + + You can continue debugging, but behavior can be unexpected. + + + + Reload + Przeładuj + + + + QmlJSInspector::Internal::QmlJSObjectTree + + Go to file + Przejdź do pliku + + + Url: + Url: + + + + QmlJSInspector::ToolBarColorBox + + Copy Color + Skopiuj kolor + + + + Qt4ProjectManager::Internal::AddLibraryWizard + + Add Library + Dodaj bibliotekę + + + Type + Typ + + + Details + Szczegóły + + + Summary + Podsumowanie + + + + Qt4ProjectManager::Internal::LibraryTypePage + + Library Type + Typ biblioteki + + + Choose the type of the library to link to + Wybierz typ biblioteki która ma zostać dowiązana + + + System library + Biblioteka systemowa + + + Links to a system library. +Neither the path to the library nor the path to its includes is added to the .pro file. + Dowiązuje bibliotekę systemową. +Ścieżki do biblioteki i jej nagłówków nie zostaną dodane do pliku .pro. + + + External library + Zewnętrzna biblioteka + + + Links to a library that is not located in your build tree. +Adds the library and include paths to the .pro file. + Dowiązuje bibliotekę która jest poza drzewem budowy projektu. +Ścieżki do biblioteki i jej nagłówków zostaną dodane do pliku .pro. + + + Internal library + Wewnętrzna biblioteka + + + Links to a library that is located in your build tree. +Adds the library and include paths to the .pro file. + Dowiązuje bibliotekę która jest wewnątrz drzewa budowy projektu. +Ścieżki do biblioteki i jej nagłówków zostaną dodane do pliku .pro. + + + + Qt4ProjectManager::Internal::DetailsPage + + System Library + Biblioteka systemowa + + + Specify the library to link to + Wskaż bibliotekę która ma zostać dowiązana + + + External Library + Zewnętrzna biblioteka + + + Specify the library to link to and the includes path + Wskaż bibliotekę która ma zostać dowiązana i podaj ścieżkę do jej nagłówków + + + Internal Library + Wewnętrzna biblioteka + + + Choose the project file of the library to link to + Wybierz plik projektu biblioteki która ma zostać dowiązana + + + + Qt4ProjectManager::Internal::SummaryPage + + Summary + Podsumowanie + + + The following snippet will be added to the<br><b>%1</b> file: + Do pliku <b>%1</b><br>zostanie dodany następujący fragment: + + + + Qt4ProjectManager::Internal::LibraryDetailsController + + Linkage: + Dowiązanie: + + + %1 Dynamic + %1 Dynamiczne + + + %1 Static + %1 Statyczne + + + Mac: + Mac: + + + %1 Framework + %1 Framework + + + %1 Library + %1 Biblioteka + + + + Qt4ProjectManager::Internal::MaemoDebugSupport + + No device configuration set for run configuration. + Brak konfiguracji urządzenia dla konfiguracji uruchamiania. + + + Preparing remote side ... + + + + Upload failed: Could not open file '%1' + + + + Started uploading debugging helpers ('%1'). + + + + Could not upload debugging helpers: %1. + + + + Finished uploading debugging helpers. + + + + Initial setup failed: %1 + + + + + Qt4ProjectManager::Internal::MaemoDeployableListModel + + File already in list. + Plik już jest na liście. + + + Failed to update .pro file. + Nie można uaktualnić pliku .pro. + + + Could not update .pro file. + Nie można uaktualnić pliku .pro. + + + Local File Path + Ścieżka do lokalnego pliku + + + Remote Directory + Zdalny katalog + + + + Qt4ProjectManager::Internal::MaemoDeployableListWidget + + Choose a local file + Wybierz plik lokalny + + + Error adding file + Błąd w trakcie dodawania pliku + + + Error removing file + Błąd w trakcie usuwania pliku + + + + Qt4ProjectManager::Internal::MaemoDeployStep + + Deploy to Maemo device + MaemoDeployStep default display name + Zainstaluj na urządzeniu Maemo + + + Cannot start deployment, as the clean-up from the last time has not finished yet. + Nie można rozpocząć instalowania ponieważ ostatnie czyszczenie nie zostało jeszcze zakończone. + + + Deployment failed: No valid device set. + Błąd instalowania: Nie ustawiono poprawnego urządzenia. + + + All files up to date, no installation necessary. + Wszystkie pliki są aktualne, instalowanie zbyteczne. + + + Could not connect to host: %1 + Nie można połączyć się z hostem: %1 + + + Upload failed: Could not open file '%1' + + + + Started uploading file '%1'. + + + + Could not set up SFTP connection: %1 + + + + Failed to upload file %1: %2 + + + + Successfully uploaded file '%1'. + + + + Deployment finished. + Zakończono instalowanie. + + + Installing package to sysroot ... + + + + Installation to sysroot failed, continuing anyway. + + + + Copying files to sysroot ... + + + + Sysroot installation failed: Could not copy '%1' to '%2'. Continuing anyway. + + + + Connecting to device... + Nawiązywanie połączenia z urządzeniem... + + + Installing package to device... + + + + Copying file '%1' to path '%2' on the device... + + + + Device has not enough free ports for deployment. + + + + Copying file '%1' failed. + + + + Successfully copied file '%1'. + + + + All files copied. + + + + Installing package failed. + Błąd instalowania pakietu. + + + Package installed. + Zainstalowano pakiet. + + + + Qt4ProjectManager::Internal::MaemoDeployStepFactory + + Deploy to device + + + + + Qt4ProjectManager::Internal::MaemoDeployStepWidget + + <b>Deploy to device</b>: %1 + + + + + MaemoDeviceConfig + + (Invalid device) + + + + + Qt4ProjectManager::Internal::MaemoDeviceEnvReader + + Could not connect to host: %1 + Nie można połączyć się z hostem: %1 + + + Error running remote process: %1 + Błąd zdalnego procesu: %1 + + + + Qt4ProjectManager::Internal::MaemoPackageCreationFactory + + Create Debian Package + + + + + Qt4ProjectManager::Internal::MaemoQemuManager + + Start Maemo Emulator + Uruchom emulator Maemo + + + Qemu has been shut down, because you removed the corresponding Qt version. + + + + Qemu finished with error: Exit code was %1. + + + + Qemu failed to start: %1 + + + + Qemu crashed + Qemu zakończone błędem + + + Qemu error + Błąd Qemu + + + Stop Maemo Emulator + Zatrzymaj emulator Maemo + + + + Qt4ProjectManager::Internal::MaemoRemoteMounter + + Unmounting remote mount points... + + + + Could not execute unmount request. + + + + Failure unmounting: %1 + + + + Finished unmounting. + + + + +stderr was: '%1' + + + + Setting up SFTP connection... + + + + Failed to establish SFTP connection: %1 + + + + Uploading UTFS client... + + + + Could not upload UTFS client (%1). + + + + Could not upload UTFS client: %1 + + + + Starting remote UTFS clients... + + + + Failure running UTFS client: %1 + + + + Starting UTFS servers... + + + + +stderr was: %1 + + + + Error running UTFS server: %1 + + + + Timeout waiting for UTFS servers to connect. + + + + + Qt4ProjectManager::Internal::MaemoRemoteMountsModel + + Local directory + + + + Remote mount point + + + + + Qt4ProjectManager::Internal::MaemoRunControl + + No device configuration set for run configuration. + Brak konfiguracji urządzenia dla konfiguracji uruchamiania. + + + Starting remote process ... + + + + Finished running remote process. Exit code was %1. + + + + Remote Execution Failure + Błąd zdalnego procesu + + + + Qt4ProjectManager::Internal::MaemoSshRunner + + Cannot start deployment, as the clean-up from the last time has not finished yet. + Nie można rozpocząć instalowania ponieważ ostatnie czyszczenie nie zostało jeszcze zakończone. + + + Connecting to device... + Nawiązywanie połączenia z urządzeniem... + + + Could not connect to host: %1 + Nie można połączyć się z hostem: %1 + + + Killing remote process(es)... + + + + Initial cleanup failed: %1 + + + + Error running remote process: %1 + Błąd zdalnego procesu: %1 + + + Cannot run: No remote executable set. + + + + The device does not have enough free ports for this run configuration. + + + + + Qt4ProjectManager::Internal::MaemoTemplatesManager + + Unable to create Debian templates: dh_make failed (%1) + + + + Unable to create debian templates: dh_make failed (%1) + + + + Packaging Error: Cannot open file '%1'. + Błąd pakowania: Nie można otworzyć pliku "%1". + + + Packaging Error: Cannot write file '%1'. + Błąd pakowania: Nie można zapisać pliku "%1". + + + Debian changelog file '%1' has unexpected format. + + + + Error writing Debian changelog file '%1': %2 + + + + Invalid icon data in Debian control file. + + + + Could not read image file '%1'. + + + + Could not export image file '%1'. + + + + Error writing file '%1': %2 + + + + Error creating Maemo templates + + + + File '%1' does not exist + + + + Cannot open file '%1': %2 + + + + + Qt4ProjectManager::PassphraseForKeyDialog + + Passphrase: + + + + Save passphrase + + + + This is an insecure option. The password will be saved as a plain text. + + + + Passphrase for %1 + + + + + Qt4ProjectManager::Internal::S60DeployConfiguration + + Deploy %1 to Symbian device + + + + Deploy to Symbian device + Zainstaluj na urządzeniu Symbian + + + + Qt4ProjectManager::Internal::S60DeployConfigurationFactory + + %1 on Symbian Device + %1 na urządzeniu Symbian + + + + Qt4ProjectManager::Internal::S60DeployConfigurationWidget + + Device: + Urządzenie: + + + Silent installation + + + + Installation file: + Plik instalacyjny: + + + Silent installation is an installation mode that does not require user's intervention. In case it fails the non silent installation is launched. + + + + Installation drive: + + + + Device on serial port: + Urządzenie na porcie szeregowym: + + + Queries the device for information + Zapytaj urządzenie o informacje + + + Connecting... + Łączenie... + + + + Qt4ProjectManager::Internal::S60DeployStep + + Unable to remove existing file '%1': %2 + Nie można usunąć istniejącego pliku "%1": %2 + + + Unable to rename file '%1' to '%2': %3 + Nie można zmienić nazwy pliku "%1" na "%2": %3 + + + Deploy + Qt4 Deploystep display name + Zainstaluj + + + Renaming new package '%1' to '%2' + Zmienianie nazwy pakietu "%1" na "%2" + + + Removing old package '%1' + Usuwanie starego pakietu "%1" + + + '%1': Package file not found + + + + There is no device plugged in. + Brak podłączonego urządzenia. + + + Failed to find package %1 + + + + Deploying application to '%2'... + + + + Could not connect to phone on port '%1': %2 +Check if the phone is connected and App TRK is running. + Nie można nawiązać połączenia z telefonem na porcie "%1": %2 +Sprawdź czy telefon jest podłączony i czy aplikacja TRK jest uruchomiona. + + + Canceled. + Anulowano. + + + Could not create file %1 on device: %2 + Nie można utworzyć pliku %1 na urządzeniu: %2 + + + Could not write to file %1 on device: %2 + Nie można zapisać do pliku %1 na urządzeniu: %2 + + + Could not close file %1 on device: %2. It will be closed when App TRK is closed. + Nie można zamknąć pliku %1 w urządzeniu: %2, będzie on zamknięty gdy aplikacja TRK zostanie zakończona. + + + Could not connect to App TRK on device: %1. Restarting App TRK might help. + Nie można ustanowić połączenia z aplikacją TRK w urządzeniu: %1. Spróbuj ponownie uruchomić aplikację TRK. + + + Copying "%1"... + + + + Installing package "%1" on drive %2:... + + + + Installation has finished + + + + Could not install from package %1 on device: %2 + Nie można zainstalować z pakietu %1 na urządzeniu: %2 + + + The device '%1' has been disconnected + Urządzenie "%1" zostało odłączone + + + + Qt4ProjectManager::Internal::S60DeployStepWidget + + Deploy SIS Package + + + + + Qt4ProjectManager::Internal::S60DeployStepFactory + + Deploy SIS Package + + + + + Qt4ProjectManager::SbsV2Parser + + SBSv2 build log + + + + The file '%1' is not a SBSv2 log file. + + + + Running command: %1 + + + + + Recipe %1 failed with exit code %2. + %1 is the SBSv2 build recipe name, %2 the return code of the failed command + + + + + Qt4ProjectManager::Internal::Qt4DeployConfigurationFactory + + Deploy to Symbian device + Zainstaluj na urządzeniu Symbian + + + Deploy to Maemo device + Zainstaluj na urządzeniu Maemo + + + + Qt4ProjectManager::AbstractMobileApp + + Could not open desktop file template + + + + Could not open main.cpp template '%1'. + + + + Could not open project file template '%1'. + + + + Could not open template file '%1'. + + + + + Qt4ProjectManager::Internal::AbstractMobileAppWizardDialog + + Qt versions + + + + Application options + + + + + MobileAppWizard + + Mobile Qt Application + Mobilna aplikacja Qt + + + Creates a Qt application optimized for mobile devices with a Qt Designer-based main window. + +Preselects Qt for Simulator and mobile targets if available. + + + + + Qt4ProjectManager::Internal::MobileAppWizardOptionsPage + + Auto rotate orientation + + + + Lock to landscape orientation + + + + Lock to portrait orientation + + + + The file is not a valid image. + + + + The icon has an invalid size. + + + + Icon unusable + + + + + Qt4ProjectManager::Internal::QmlStandaloneApp + + The QML import path '%1' cannot be found. + + + + The QML module '%1' cannot be found. + + + + Invalid '%1' entry in '%2' of module '%3'. + + + + No .pro file for plugin '%1' cannot be found. + + + + Could not write file '%1'. + + + + + Qt4ProjectManager::Internal::QmlStandaloneAppWizardDialog + + New QML Project + Nowy projekt QML + + + This wizard generates a QML application project. + Ten kreator generuje projekt aplikacji QML. + + + New Qt Quick Application + + + + Qt Quick Application from Existing QML Directory + + + + This wizard generates a Qt Quick application project. + + + + This wizard imports an existing QML directory and creates a Qt Quick application project from it. + + + + QML Sources + + + + + Qt4ProjectManager::Internal::QmlStandaloneAppWizard + + Qt QML Application + Aplikacja Qt QML + + + Qt Quick Application + + + + Import Existing QML Directory + Import istniejącego katalogu QML + + + Creates a Qt Quick application that you can deploy to mobile devices. + + + + Imports an existing QML directory and converts it into a Qt Quick application project. You can deploy the application to mobile devices. + + + + + Qt4ProjectManager::Internal::QmlStandaloneAppWizardSourcesPage + + Select the main QML file of the application. + + + + Select an import path for QML modules. + + + + + TaskList::Internal::StopMonitoringHandler + + Stop monitoring + + + + Stop monitoring task files. + + + + + TaskList::Internal::TaskFileFactory + + Task file reader + + + + + TaskList::TaskListPlugin + + My Tasks + Category under which tasklist tasks are listed in build issues view + + + + + TextEditor::HighlighterSettingsPage + + Generic Highlighter + + + + Download Definitions + + + + Autodetect + Wykryj automatycznie + + + Autodetect Definitions + + + + No pre-installed definitions could be found. + + + + Error connecting to server. + + + + Not possible to retrieve data. + + + + + TextEditor::Internal::ManageDefinitionsDialog + + Name + + + + Installed + + + + Available + + + + Download Definitions + + + + Download Information + + + + There is already one download in progress. Please wait until it is finished. + + + + + TextEditor::Internal::Manager + + Registering definitions + + + + Downloading definitions + + + + Error downloading selected definition(s). + + + + Error downloading one or more definitions. + + + + +Please check the directory's access rights. + + + + Download Error + + + + + TextEditor::Internal::OutlineWidgetStack + + No outline available + + + + Synchronize with Editor + Synchronizuj z edytorem + + + Filter tree + Przefiltruj drzewo + + + + TextEditor::Internal::OutlineFactory + + Outline + Kontur + + + + TextEditor::Internal::PlainTextEditorFactory + + A highlight definition was not found for this file. Would you like to try to find one? + + + + Show highlighter options + + + + + QDeclarativeViewer + + &Open... + &Otwórz... + + + 1x + 1x + + + 0.5x + 0.5x + + + 0.25x + 0.25x + + + 0.125x + 0.125x + + + 0.1x + 0.1x + + + Show Warnings + Pokazuj ostrzeżenia + + + Full Screen + Pełny ekran + + + &Quit + Za&kończ + + + &File + &Plik + + + Properties + Właściwości + + + &Help + P&omoc + + + Cancel + Anuluj + + + + ProjectExplorer::BuildableHelperLibrary + + Building helper library '%1' in %2 + + + + + Running %1 %2... + + Uruchamianie %1 %2... + + + + Running %1 ... + + Uruchamianie %1... + + + + %1 not found in PATH + + Nie znaleziono %1 w zmiennej PATH + + + + + QmlJSEditor::Internal::QmlJSOutlineWidget + + Show All Bindings + + + + + ProjectExplorer::QmlDumpTool + + qmldump could not be built in any of the directories: +- %1 + +Reason: %2 + + + + + ProjectExplorer::QmlObserverTool + + The target directory %1 could not be created. + Nie można utworzyć docelowego katalogu %1. + + + QMLObserver could not be built in any of the directories: +- %1 + +Reason: %2 + From 68d032b6a9892393bb0f70861b26545c1e1a8835 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 29 Sep 2010 13:09:05 +0200 Subject: [PATCH 005/118] Rename member to match coding style --- src/plugins/coreplugin/basefilewizard.cpp | 2 +- src/plugins/coreplugin/basefilewizard.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/coreplugin/basefilewizard.cpp b/src/plugins/coreplugin/basefilewizard.cpp index e30f27168e0..70975a104b8 100644 --- a/src/plugins/coreplugin/basefilewizard.cpp +++ b/src/plugins/coreplugin/basefilewizard.cpp @@ -106,7 +106,7 @@ GeneratedFile::~GeneratedFile() { } -void GeneratedFile::writeAccess(bool access) +void GeneratedFile::setWriteAccess(bool access) { m_d->writeAccess = access; } diff --git a/src/plugins/coreplugin/basefilewizard.h b/src/plugins/coreplugin/basefilewizard.h index 2fcab7e6d2b..e789a8d0468 100644 --- a/src/plugins/coreplugin/basefilewizard.h +++ b/src/plugins/coreplugin/basefilewizard.h @@ -101,7 +101,7 @@ public: void setEditorId(const QString &k); bool write(QString *errorMessage) const; - void writeAccess(bool access = true); + void setWriteAccess(bool access = true); Attributes attributes() const; void setAttributes(Attributes a); From 8dc0e32f4cd9c6d4cc34e178a10d81c24b1dea59 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 29 Sep 2010 13:04:42 +0200 Subject: [PATCH 006/118] QmlDesigner.statesEditor: fix thumbnail drawing code Before this patch the thumbnail drawing triggered global state changes. Reviewed-by: Marco Bubke --- .../components/stateseditor/stateseditorview.cpp | 5 +++++ .../qmldesigner/designercore/model/qmlmodelview.cpp | 7 +++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp index 2206ba8fa68..d59cdaa3044 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp @@ -78,8 +78,13 @@ void StatesEditorView::setCurrentStateSilent(int index) m_settingSilentState = false; return; } + + nodeInstanceView()->setBlockStatePropertyChanges(true); + QmlModelView::activateState(state); + nodeInstanceView()->setBlockStatePropertyChanges(false); + m_settingSilentState = false; } diff --git a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp index c1d710467e4..9a14dca9e11 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp @@ -385,9 +385,12 @@ void QmlModelView::activateState(const QmlModelState &state) return; if (m_state == state) - return; + return; + + m_state = state; //This is hacky. m_state should be controlled by the instances + //### todo: If the state thumbnail code gets refactored. + // this is not neccessary anymore. - QmlModelState oldState = m_state; NodeInstance newStateInstance = instanceForModelNode(state.modelNode()); From 1473d2050d2d945ea330404005c4d9355e6a53fd Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 29 Sep 2010 13:09:46 +0200 Subject: [PATCH 007/118] QmlDesigner.propertyEditor: fix for general property editing QString is also a possible typename Reviewed-by: Marco Bubke --- .../qmldesigner/components/propertyeditor/propertyeditor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp index 47a2aae2c55..d368c5950c8 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp @@ -576,7 +576,7 @@ QString templateGeneration(NodeMetaInfo type, NodeMetaInfo superType, const QmlO "DoubleSpinBoxAlternate {\ntext: \"%1\"\nbackendValue: backendValues.%2\nbaseStateFlag: isBaseState\n}\n" )).arg(name).arg(properName); } - if (typeName == "string") { + if (typeName == "string" || typeName == "QString") { qmlTemplate += QString(QLatin1String( "QWidget {\nlayout: HorizontalLayout {\nLabel {\ntext: \"%1\"\ntoolTip: \"%1\"\n}\nLineEdit {\nbackendValue: backendValues.%2\nbaseStateFlag: isBaseState\n}\n}\n}\n" )).arg(name).arg(properName); From 303a2106a6dc98b3779ef123357e6494bf6c7516 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 29 Sep 2010 13:20:14 +0200 Subject: [PATCH 008/118] QmlDesigner.rewriter: handle enums as enums instead of pure strings The scopes of enumerators have to be fixed for this. Reviewed-by: Marco Bubke --- .../designercore/metainfo/metainfo.cpp | 14 ++++++- .../designercore/model/qmltextgenerator.cpp | 37 +++++++++++-------- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp index f350af0c6d5..71affb5d712 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp @@ -144,6 +144,14 @@ void MetaInfoPrivate::loadPlugins(QDeclarativeEngine *engine) pluginComponent.setData(componentString.toLatin1(), QUrl()); } +QString static inline stripPrefix(const QString &typeName) +{ + QStringList list = typeName.split('/'); + if (list.count() == 2) + return list.last(); + return typeName; +} + void MetaInfoPrivate::parseProperties(NodeMetaInfo &nodeMetaInfo, const QMetaObject *qMetaObject) const { Q_ASSERT_X(qMetaObject, Q_FUNC_INFO, "invalid QMetaObject"); @@ -181,7 +189,11 @@ void MetaInfoPrivate::parseProperties(NodeMetaInfo &nodeMetaInfo, const QMetaObj enumerator.setValid(qEnumerator.isValid()); enumerator.setIsFlagType(qEnumerator.isFlag()); - enumerator.setScope(qEnumerator.scope()); + QString scope = qEnumerator.scope(); + if (m_QtTypesToQmlTypes.contains(scope)) + scope = stripPrefix(m_QtTypesToQmlTypes.value(scope)); + + enumerator.setScope(scope); enumerator.setName(qEnumerator.name()); for (int i = 0 ;i < qEnumerator.keyCount(); i++) { diff --git a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp index f912214db8f..ffdcd9f2fcf 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp @@ -94,25 +94,30 @@ QString QmlTextGenerator::toQml(const AbstractProperty &property, int indentDept if (property.name() == QLatin1String("id")) return stringValue; - switch (value.type()) { - case QVariant::Bool: - if (value.value()) - return QLatin1String("true"); - else - return QLatin1String("false"); + if (variantProperty.metaInfo().isValid() && variantProperty.metaInfo().isEnumType()) { + return variantProperty.metaInfo().enumerator().scope() + '.' + stringValue; + } else { - case QVariant::Color: - return QString(QLatin1String("\"%1\"")).arg(properColorName(value.value())); + switch (value.type()) { + case QVariant::Bool: + if (value.value()) + return QLatin1String("true"); + else + return QLatin1String("false"); - case QVariant::Double: - case QVariant::Int: - case QVariant::LongLong: - case QVariant::UInt: - case QVariant::ULongLong: - return stringValue; + case QVariant::Color: + return QString(QLatin1String("\"%1\"")).arg(properColorName(value.value())); - default: - return QString(QLatin1String("\"%1\"")).arg(escape(stringValue)); + case QVariant::Double: + case QVariant::Int: + case QVariant::LongLong: + case QVariant::UInt: + case QVariant::ULongLong: + return stringValue; + + default: + return QString(QLatin1String("\"%1\"")).arg(escape(stringValue)); + } } } else { Q_ASSERT("Unknown property type"); From a210978e9b02049beabdfb9da320c0c86faf4de1 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 29 Sep 2010 13:27:51 +0200 Subject: [PATCH 009/118] QmlDesigner.propertyEditor: re design panes This patch makes the important properties more accessible. Reviewed-by: Marco Bubke --- .../propertyeditor/Qt/ExtendedPane.qml | 5 ++--- .../propertyeditor/Qt/ItemPane.qml | 20 +++++++++++++++++-- .../propertyeditor/Qt/LayoutPane.qml | 5 +---- .../propertyeditor/Qt/Switches.qml | 4 ++-- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/ExtendedPane.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/ExtendedPane.qml index 3c0e9efe129..a764d9dcce0 100644 --- a/share/qtcreator/qmldesigner/propertyeditor/Qt/ExtendedPane.qml +++ b/share/qtcreator/qmldesigner/propertyeditor/Qt/ExtendedPane.qml @@ -16,9 +16,8 @@ QScrollArea { leftMargin: 0; rightMargin: 0; spacing: 0; - - Visibility {} - Transformation {} + + Transformation {} QScrollArea { } diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/ItemPane.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/ItemPane.qml index 70896d5284a..b4247773de7 100644 --- a/share/qtcreator/qmldesigner/propertyeditor/Qt/ItemPane.qml +++ b/share/qtcreator/qmldesigner/propertyeditor/Qt/ItemPane.qml @@ -13,10 +13,28 @@ PropertyFrame { leftMargin: 0; rightMargin: 0; spacing: 0; + + Type { + } + + Geometry { + } + + Visibility { + + } + + HorizontalWhiteLine { + maximumHeight: 4; + styleSheet: "QLineEdit {border: 2px solid #707070; min-height: 0px; max-height: 0px;}"; + } + Switches { } + HorizontalWhiteLine { } + ScrollArea { styleSheetFile: ":/qmldesigner/scrollbar.css"; widgetResizable: true; @@ -35,8 +53,6 @@ PropertyFrame { leftMargin: 0; rightMargin: 0; spacing: 0; - Type { - } WidgetLoader { id: specificsOne; diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/LayoutPane.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/LayoutPane.qml index f22c0c75e9c..2e4dd0dfb2a 100644 --- a/share/qtcreator/qmldesigner/propertyeditor/Qt/LayoutPane.qml +++ b/share/qtcreator/qmldesigner/propertyeditor/Qt/LayoutPane.qml @@ -15,10 +15,7 @@ QScrollArea { bottomMargin: 0; leftMargin: 0; rightMargin: 0; - spacing: 0 - - Geometry { - } + spacing: 0; Layout { id: layoutBox; diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/Switches.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/Switches.qml index 3c4b95f95e6..d507c5ada07 100644 --- a/share/qtcreator/qmldesigner/propertyeditor/Qt/Switches.qml +++ b/share/qtcreator/qmldesigner/propertyeditor/Qt/Switches.qml @@ -35,8 +35,8 @@ QFrame { id: layoutMode; checkable: true; checked: false; - toolTip: qsTr("layout and geometry"); - text: qsTr("Geometry"); + toolTip: qsTr("layout"); + text: qsTr("Layout"); onClicked: { extendedMode.checked = false; standardMode.checked = false; From 82865ac7c6cf90edeeceabe50bd508e6b274e982 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 29 Sep 2010 13:30:48 +0200 Subject: [PATCH 010/118] QmlDesigner.model: add sanity check and include fix Only emit if the view is really attached. Reviewed-by: Marco Bubke --- src/plugins/qmldesigner/designercore/model/abstractview.cpp | 2 +- src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp index 9fc221a0df1..99707bb651e 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp @@ -370,7 +370,7 @@ void AbstractView::emitCustomNotification(const QString &identifier, const QList void AbstractView::emitInstancePropertyChange(const QList > &propertyList) { - if (model()) + if (model() && nodeInstanceView() == this) model()->m_d->notifyInstancePropertyChange(propertyList); } diff --git a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp index ffdcd9f2fcf..0ddece841d3 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp @@ -35,6 +35,7 @@ #include "nodelistproperty.h" #include "qmltextgenerator.h" #include "variantproperty.h" +#include #include "model.h" using namespace QmlDesigner; From 48a43475ec8ce4b00e935f88297ca6df03668af4 Mon Sep 17 00:00:00 2001 From: kh1 Date: Wed, 29 Sep 2010 10:06:27 +0200 Subject: [PATCH 011/118] Remove warning. Reviewed-by: ck --- src/plugins/qt4projectmanager/qt-maemo/maemodeployables.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.cpp index b0a199f3d45..9ec88695841 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeployables.cpp @@ -153,7 +153,6 @@ QString MaemoDeployables::remoteExecutableFilePath(const QString &localExecutabl if (model->localExecutableFilePath() == localExecutableFilePath) return model->remoteExecutableFilePath(); } - qWarning("No remote executable specified!"); return QString(); } From 45bdff449dedeea7bce15b7749169d459c6b69fc Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Tue, 28 Sep 2010 14:51:05 +0200 Subject: [PATCH 012/118] QmlDesigner: Items in Positioner cannot manipulated anymore Add a positioner node instance and the concept of resizable and movable items. Item in a positioner will be not selected anymore. Instead their positioner will be selected which is not resizable. --- .../editor/selectionindicator.cpp | 6 +- .../formeditor/abstractformeditortool.cpp | 6 +- .../components/formeditor/formeditorscene.cpp | 4 +- .../components/formeditor/movetool.cpp | 21 +++++- .../components/formeditor/resizeindicator.cpp | 11 ++-- .../rubberbandselectionmanipulator.cpp | 14 ++-- .../formeditor/selectionindicator.cpp | 2 +- .../components/formeditor/selectiontool.cpp | 3 +- .../formeditor/singleselectionmanipulator.cpp | 3 +- .../qmldesigner/designercore/designercore.pri | 6 +- .../designercore/include/nodeinstance.h | 4 ++ .../designercore/include/qmlitemnode.h | 3 + .../instances/graphicsobjectnodeinstance.cpp | 14 +++- .../instances/graphicsobjectnodeinstance.h | 4 ++ .../designercore/instances/nodeinstance.cpp | 23 +++++++ .../instances/objectnodeinstance.cpp | 28 +++++++- .../instances/objectnodeinstance.h | 7 ++ .../instances/positionernodeinstance.cpp | 65 +++++++++++++++++++ .../instances/positionernodeinstance.h | 34 ++++++++++ .../instances/qmlgraphicsitemnodeinstance.cpp | 50 +++++++++++++- .../instances/qmlgraphicsitemnodeinstance.h | 6 ++ .../designercore/model/qmlitemnode.cpp | 15 +++++ 22 files changed, 300 insertions(+), 29 deletions(-) create mode 100644 src/plugins/qmldesigner/designercore/instances/positionernodeinstance.cpp create mode 100644 src/plugins/qmldesigner/designercore/instances/positionernodeinstance.h diff --git a/share/qtcreator/qml/qmljsdebugger/editor/selectionindicator.cpp b/share/qtcreator/qml/qmljsdebugger/editor/selectionindicator.cpp index 5782f2a5ee2..49ed137b57e 100644 --- a/share/qtcreator/qml/qmljsdebugger/editor/selectionindicator.cpp +++ b/share/qtcreator/qml/qmljsdebugger/editor/selectionindicator.cpp @@ -97,11 +97,11 @@ void SelectionIndicator::setItems(const QList > &i // set selections to also all children if they are not editor items - foreach (QWeakPointer obj, itemList) { - if (obj.isNull()) + foreach (QWeakPointer object, itemList) { + if (object.isNull()) continue; - QGraphicsItem *item = obj.data(); + QGraphicsItem *item = object.data(); QGraphicsPolygonItem *newSelectionIndicatorGraphicsItem = new QGraphicsPolygonItem(m_layerItem.data()); if (!m_indicatorShapeHash.contains(item)) { diff --git a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp index efd1eab8a18..917f7ebf5fe 100644 --- a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp @@ -93,7 +93,8 @@ bool AbstractFormEditorTool::topSelectedItemIsMovable(const QListqmlItemNode()) - && !formEditorItem->qmlItemNode().isRootNode() + && formEditorItem->qmlItemNode().instanceIsMovable() + && !formEditorItem->qmlItemNode().instanceIsInPositioner() && (formEditorItem->qmlItemNode().hasShowContent())) return true; } @@ -101,7 +102,8 @@ bool AbstractFormEditorTool::topSelectedItemIsMovable(const QListqmlItemNode().isRootNode() + && formEditorItem->qmlItemNode().instanceIsMovable() + && !formEditorItem->qmlItemNode().instanceIsInPositioner() && selectedNodes.contains(formEditorItem->qmlItemNode())) return true; } diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp index cbe41a4ace5..6e0d7b8b24b 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp @@ -200,8 +200,8 @@ FormEditorItem *FormEditorScene::addFormEditorItem(const QmlItemNode &qmlItemNod QRectF sceneRect(qmlItemNode.instanceBoundingRect()); setSceneRect(sceneRect); - formLayerItem()->update(); - manipulatorLayerItem()->update(); + formLayerItem()->update(); + manipulatorLayerItem()->update(); } diff --git a/src/plugins/qmldesigner/components/formeditor/movetool.cpp b/src/plugins/qmldesigner/components/formeditor/movetool.cpp index ae76d6455f9..38da0a124b0 100644 --- a/src/plugins/qmldesigner/components/formeditor/movetool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/movetool.cpp @@ -322,10 +322,25 @@ FormEditorItem* MoveTool::containerFormEditorItem(const QList &i return 0; } +QList movalbeItems(const QList &itemList) +{ + QList filteredItemList(itemList); + + QMutableListIterator listIterator(filteredItemList); + while (listIterator.hasNext()) { + FormEditorItem *item = listIterator.next(); + if (!item->qmlItemNode().isValid() || !item->qmlItemNode().instanceIsMovable() || item->qmlItemNode().instanceIsInPositioner()) + listIterator.remove(); + } + + return filteredItemList; +} QList MoveTool::movingItems(const QList &selectedItemList) { - FormEditorItem* ancestorItem = ancestorIfOtherItemsAreChild(selectedItemList); + QList filteredItemList = movalbeItems(selectedItemList); + + FormEditorItem* ancestorItem = ancestorIfOtherItemsAreChild(filteredItemList); if (ancestorItem != 0 && ancestorItem->qmlItemNode().isRootNode()) { // view()->changeToSelectionTool(); @@ -339,12 +354,12 @@ QList MoveTool::movingItems(const QList &selec return ancestorItemList; } - if (!haveSameParent(selectedItemList)) { + if (!haveSameParent(filteredItemList)) { // view()->changeToSelectionTool(); return QList(); } - return selectedItemList; + return filteredItemList; } void MoveTool::formEditorItemsChanged(const QList &itemList) diff --git a/src/plugins/qmldesigner/components/formeditor/resizeindicator.cpp b/src/plugins/qmldesigner/components/formeditor/resizeindicator.cpp index a1b5b56fcba..473618a664a 100644 --- a/src/plugins/qmldesigner/components/formeditor/resizeindicator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/resizeindicator.cpp @@ -72,11 +72,12 @@ void ResizeIndicator::setItems(const QList &itemList) foreach (FormEditorItem* item, itemList) { if (item - && item->qmlItemNode().isValid() - && item->qmlItemNode().isRootNode()) - continue; - ResizeController controller(m_layerItem, item); - m_itemControllerHash.insert(item, controller); + && item->qmlItemNode().isValid() + && item->qmlItemNode().instanceIsResizable() + && !item->qmlItemNode().instanceIsInPositioner()) { + ResizeController controller(m_layerItem, item); + m_itemControllerHash.insert(item, controller); + } } } diff --git a/src/plugins/qmldesigner/components/formeditor/rubberbandselectionmanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/rubberbandselectionmanipulator.cpp index 18804d88e44..1872d66fc05 100644 --- a/src/plugins/qmldesigner/components/formeditor/rubberbandselectionmanipulator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/rubberbandselectionmanipulator.cpp @@ -101,18 +101,20 @@ void RubberBandSelectionManipulator::select(SelectionType selectionType) FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item); if (formEditorItem - && formEditorItem->qmlItemNode().isValid() - && m_beginFormEditorItem->childItems().contains(formEditorItem) - && !formEditorItem->qmlItemNode().isRootNode()) + && formEditorItem->qmlItemNode().isValid() + && m_beginFormEditorItem->childItems().contains(formEditorItem) + && formEditorItem->qmlItemNode().instanceIsMovable() + && !formEditorItem->qmlItemNode().instanceIsInPositioner()) { newNodeList.append(formEditorItem->qmlItemNode()); } } if (newNodeList.isEmpty() - && m_beginFormEditorItem->qmlItemNode().isValid() - && !m_beginFormEditorItem->qmlItemNode().isRootNode()) - newNodeList.append(m_beginFormEditorItem->qmlItemNode()); + && m_beginFormEditorItem->qmlItemNode().isValid() + && m_beginFormEditorItem->qmlItemNode().instanceIsMovable() + && !m_beginFormEditorItem->qmlItemNode().instanceIsInPositioner()) + newNodeList.append(m_beginFormEditorItem->qmlItemNode()); QList nodeList; diff --git a/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp b/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp index e5c12648f95..2dcda48f20e 100644 --- a/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp @@ -85,7 +85,7 @@ void SelectionIndicator::setItems(const QList &itemList) clear(); foreach (FormEditorItem *item, itemList) { - if (item->qmlItemNode().isValid()) + if (!item->qmlItemNode().isValid()) continue; QGraphicsPolygonItem *newSelectionIndicatorGraphicsItem = new QGraphicsPolygonItem(m_layerItem.data()); diff --git a/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp b/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp index 787fedef094..5fc65decf03 100644 --- a/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp @@ -145,7 +145,8 @@ void SelectionTool::hoverMoveEvent(const QList &itemList, if (formEditorItem && formEditorItem->qmlItemNode().isValid() - && !formEditorItem->qmlItemNode().isRootNode() + && !formEditorItem->qmlItemNode().instanceIsInPositioner() + && formEditorItem->qmlItemNode().instanceIsMovable() && (formEditorItem->qmlItemNode().hasShowContent() || !m_selectOnlyContentItems)) { topSelectableItem = formEditorItem; diff --git a/src/plugins/qmldesigner/components/formeditor/singleselectionmanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/singleselectionmanipulator.cpp index cc38edb07ea..3fc09240b80 100644 --- a/src/plugins/qmldesigner/components/formeditor/singleselectionmanipulator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/singleselectionmanipulator.cpp @@ -81,7 +81,8 @@ void SingleSelectionManipulator::select(SelectionType selectionType, bool select if (formEditorItem && formEditorItem->qmlItemNode().isValid() - && !formEditorItem->qmlItemNode().isRootNode() + && formEditorItem->qmlItemNode().instanceIsMovable() + && !formEditorItem->qmlItemNode().instanceIsInPositioner() && (formEditorItem->qmlItemNode().hasShowContent() || !selectOnlyContentItems)) { selectedNode = formEditorItem->qmlItemNode(); diff --git a/src/plugins/qmldesigner/designercore/designercore.pri b/src/plugins/qmldesigner/designercore/designercore.pri index 81674e0eb05..885e6cb2ea0 100644 --- a/src/plugins/qmldesigner/designercore/designercore.pri +++ b/src/plugins/qmldesigner/designercore/designercore.pri @@ -94,7 +94,8 @@ SOURCES += $$PWD/model/abstractview.cpp \ $$PWD/exceptions/rewritingexception.cpp \ $$PWD/instances/nodeinstancemetaobject.cpp \ $$PWD/instances/behaviornodeinstance.cpp \ - $$PWD/instances/nodeinstancesignalspy.cpp + $$PWD/instances/nodeinstancesignalspy.cpp \ + $$PWD/instances/positionernodeinstance.cpp HEADERS += $$PWD/include/corelib_global.h \ $$PWD/include/abstractview.h \ @@ -187,7 +188,8 @@ HEADERS += $$PWD/include/corelib_global.h \ $$PWD/include/rewritingexception.h \ $$PWD/instances/nodeinstancemetaobject.h \ $$PWD/instances/behaviornodeinstance.h \ - $$PWD/instances/nodeinstancesignalspy.h + $$PWD/instances/nodeinstancesignalspy.h \ + $$PWD/instances/positionernodeinstance.h contains(CONFIG, plugin) { # If core.pri has been included in the qmldesigner plugin diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstance.h b/src/plugins/qmldesigner/designercore/include/nodeinstance.h index 20c13cab39f..0b5a223d38d 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstance.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstance.h @@ -102,6 +102,7 @@ public: bool isQDeclarativeView() const; bool isGraphicsObject() const; bool isTransition() const; + bool isPositioner() const; bool equalGraphicsItem(QGraphicsItem *item) const; @@ -127,6 +128,9 @@ public: bool isValid() const; void makeInvalid(); bool hasContent() const; + bool isResizable() const; + bool isMovable() const; + bool isInPositioner() const; bool isWrappingThisObject(QObject *object) const; diff --git a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h index e197067c07c..5500f5eeb05 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h @@ -68,6 +68,9 @@ public: bool canReparent() const; bool instanceIsAnchoredBySibling() const; bool instanceIsAnchoredByChildren() const; + bool instanceIsMovable() const; + bool instanceIsResizable() const; + bool instanceIsInPositioner() const; QRectF instanceBoundingRect() const; QTransform instanceTransform() const; diff --git a/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.cpp index f654f198d10..65b15d4d130 100644 --- a/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.cpp @@ -40,7 +40,8 @@ namespace Internal { GraphicsObjectNodeInstance::GraphicsObjectNodeInstance(QGraphicsObject *graphicsObject, bool hasContent) : ObjectNodeInstance(graphicsObject), - m_hasContent(hasContent) + m_hasContent(hasContent), + m_isMovable(true) { } @@ -232,5 +233,16 @@ void GraphicsObjectNodeInstance::paintUpdate() { graphicsObject()->update(); } + +bool GraphicsObjectNodeInstance::isMovable() const +{ + return m_isMovable && graphicsObject() && graphicsObject()->parentItem(); +} + +void GraphicsObjectNodeInstance::setMovable(bool movable) +{ + m_isMovable = movable; +} + } // namespace Internal } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.h b/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.h index ab718a2c455..45200acd273 100644 --- a/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.h +++ b/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.h @@ -74,12 +74,16 @@ public: void paintUpdate(); + bool isMovable() const; + void setMovable(bool movable); + protected: QGraphicsObject *graphicsObject() const; void paintRecursively(QGraphicsItem *graphicsItem, QPainter *painter) const; static QPair createGraphicsObject(const NodeMetaInfo &metaInfo, QDeclarativeContext *context); private: // variables bool m_hasContent; + bool m_isMovable; }; } // namespace Internal diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp index a1c97686fac..39da34d8ae8 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp @@ -42,6 +42,7 @@ #include "componentnodeinstance.h" #include "qmltransitionnodeinstance.h" #include "qmlpropertychangesnodeinstance.h" +#include "positionernodeinstance.h" #include "behaviornodeinstance.h" #include "qmlstatenodeinstance.h" #include "nodeabstractproperty.h" @@ -144,6 +145,8 @@ Internal::ObjectNodeInstance::Pointer NodeInstance::createInstance(const NodeMet instance = Internal::QDeclarativeViewNodeInstance::create(metaInfo, context, objectToBeWrapped); else if (metaInfo.isSubclassOf("Qt/QGraphicsWidget", 4, 7)) instance = Internal::GraphicsWidgetNodeInstance::create(metaInfo, context, objectToBeWrapped); + else if (metaInfo.isSubclassOf("QDeclarativeBasePositioner", 4, 7)) + instance = Internal::PositionerNodeInstance::create(metaInfo, context, objectToBeWrapped); else if (metaInfo.isSubclassOf("Qt/Item", 4, 7)) instance = Internal::QmlGraphicsItemNodeInstance::create(metaInfo, context, objectToBeWrapped); else if (metaInfo.isSubclassOf("Qt/QGraphicsScene", 4, 7)) @@ -341,6 +344,11 @@ bool NodeInstance::isTransition() const return m_nodeInstance->isTransition(); } +bool NodeInstance::isPositioner() const +{ + return m_nodeInstance->isPositioner(); +} + /*! \brief Returns if the NodeInstance is a QGraphicsItem. \returns true if this NodeInstance is a QGraphicsItem @@ -460,6 +468,21 @@ bool NodeInstance::hasContent() const return m_nodeInstance->hasContent(); } +bool NodeInstance::isResizable() const +{ + return m_nodeInstance->isResizable(); +} + +bool NodeInstance::isMovable() const +{ + return m_nodeInstance->isMovable(); +} + +bool NodeInstance::isInPositioner() const +{ + return m_nodeInstance->isInPositioner(); +} + bool NodeInstance::hasAnchor(const QString &name) const { return m_nodeInstance->hasAnchor(name); diff --git a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp index 61701feb4b8..3937759fa25 100644 --- a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp @@ -98,7 +98,8 @@ bool ChildrenChangeEventFilter::eventFilter(QObject * /*object*/, QEvent *event) ObjectNodeInstance::ObjectNodeInstance(QObject *object) : m_deleteHeldInstance(true), m_object(object), - m_metaObject(0) + m_metaObject(0), + m_isInPositioner(false) { } @@ -249,6 +250,11 @@ bool ObjectNodeInstance::isTransition() const return false; } +bool ObjectNodeInstance::isPositioner() const +{ + return false; +} + bool ObjectNodeInstance::equalGraphicsItem(QGraphicsItem * /*item*/) const { return false; @@ -795,6 +801,26 @@ bool ObjectNodeInstance::hasContent() const return false; } +bool ObjectNodeInstance::isResizable() const +{ + return false; +} + +bool ObjectNodeInstance::isMovable() const +{ + return false; +} + +bool ObjectNodeInstance::isInPositioner() const +{ + return m_isInPositioner; +} + +void ObjectNodeInstance::setInPositioner(bool isInPositioner) +{ + m_isInPositioner = isInPositioner; +} + void ObjectNodeInstance::updateAnchors() { } diff --git a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h index 20718b3a9a1..f62963cf449 100644 --- a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h +++ b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.h @@ -117,6 +117,8 @@ public: virtual bool isQDeclarativeView() const; virtual bool isGraphicsObject() const; virtual bool isTransition() const; + virtual bool isPositioner() const; + virtual bool equalGraphicsItem(QGraphicsItem *item) const; @@ -165,6 +167,10 @@ public: QObject *object() const; virtual bool hasContent() const; + virtual bool isResizable() const; + virtual bool isMovable() const; + bool isInPositioner() const; + void setInPositioner(bool isInPositioner); bool hasBindingForProperty(const QString &name) const; @@ -207,6 +213,7 @@ private: QWeakPointer m_object; NodeInstanceMetaObject *m_metaObject; NodeInstanceSignalSpy m_signalSpy; + bool m_isInPositioner; }; diff --git a/src/plugins/qmldesigner/designercore/instances/positionernodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/positionernodeinstance.cpp new file mode 100644 index 00000000000..ecc8ee3e8f4 --- /dev/null +++ b/src/plugins/qmldesigner/designercore/instances/positionernodeinstance.cpp @@ -0,0 +1,65 @@ +#include "positionernodeinstance.h" +#include +#include + +namespace QmlDesigner { +namespace Internal { + +PositionerNodeInstance::PositionerNodeInstance(QDeclarativeBasePositioner *item, bool hasContent) + : QmlGraphicsItemNodeInstance(item, hasContent) +{ +} + +bool PositionerNodeInstance::isPositioner() const +{ + return true; +} + +bool PositionerNodeInstance::isResizable() const +{ + return false; +} + +void PositionerNodeInstance::setPropertyVariant(const QString &name, const QVariant &value) +{ + if (name == "move" || name == "add") + return; + + QmlGraphicsItemNodeInstance::setPropertyVariant(name, value); +} + +void PositionerNodeInstance::setPropertyBinding(const QString &name, const QString &expression) +{ + if (name == "move" || name == "add") + return; + + QmlGraphicsItemNodeInstance::setPropertyBinding(name, expression); +} + +PositionerNodeInstance::Pointer PositionerNodeInstance::create(const NodeMetaInfo &metaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped) +{ + QPair objectPair; + + if (objectToBeWrapped) + objectPair = qMakePair(qobject_cast(objectToBeWrapped), false); + else + objectPair = GraphicsObjectNodeInstance::createGraphicsObject(metaInfo, context); + + QDeclarativeBasePositioner *positioner = dynamic_cast(objectPair.first); + + if (positioner == 0) + throw InvalidNodeInstanceException(__LINE__, __FUNCTION__, __FILE__); + + Pointer instance(new PositionerNodeInstance(positioner, objectPair.second)); + + static_cast(positioner)->classBegin(); + + if (objectToBeWrapped) + instance->setDeleteHeldInstance(false); // the object isn't owned + + instance->populateResetValueHash(); + + return instance; +} +} +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/instances/positionernodeinstance.h b/src/plugins/qmldesigner/designercore/instances/positionernodeinstance.h new file mode 100644 index 00000000000..9369ad6832a --- /dev/null +++ b/src/plugins/qmldesigner/designercore/instances/positionernodeinstance.h @@ -0,0 +1,34 @@ +#ifndef POSITIONERNODEINSTANCE_H +#define POSITIONERNODEINSTANCE_H + +#include "qmlgraphicsitemnodeinstance.h" + +class QDeclarativeBasePositioner; + +namespace QmlDesigner { +namespace Internal { + +class PositionerNodeInstance : public QmlGraphicsItemNodeInstance +{ +public: + typedef QSharedPointer Pointer; + typedef QWeakPointer WeakPointer; + + static Pointer create(const NodeMetaInfo &metaInfo, QDeclarativeContext *context, QObject *objectToBeWrapped); + + void setPropertyVariant(const QString &name, const QVariant &value); + void setPropertyBinding(const QString &name, const QString &expression); + + bool isPositioner() const; + + bool isResizable() const; + + +protected: + PositionerNodeInstance(QDeclarativeBasePositioner *item, bool hasContent); +}; + +} // namespace Internal +} // namespace QmlDesigner + +#endif // POSITIONERNODEINSTANCE_H diff --git a/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.cpp index 671e5b7c949..524da7551a4 100644 --- a/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.cpp @@ -45,6 +45,8 @@ #include #include #include +#include + #include @@ -56,7 +58,8 @@ namespace Internal { QmlGraphicsItemNodeInstance::QmlGraphicsItemNodeInstance(QDeclarativeItem *item, bool hasContent) : GraphicsObjectNodeInstance(item, hasContent), m_hasHeight(false), - m_hasWidth(false) + m_hasWidth(false), + m_isResizable(true) { } @@ -80,6 +83,9 @@ QmlGraphicsItemNodeInstance::Pointer QmlGraphicsItemNodeInstance::create(const N Pointer instance(new QmlGraphicsItemNodeInstance(qmlGraphicsItem, objectPair.second)); + if (qmlGraphicsItem->inherits("QDeclarativeText")) + instance->setResizable(false); + static_cast(qmlGraphicsItem)->classBegin(); if (objectToBeWrapped) @@ -223,6 +229,8 @@ void QmlGraphicsItemNodeInstance::setPropertyVariant(const QString &name, const } GraphicsObjectNodeInstance::setPropertyVariant(name, value); + + refresh(); } void QmlGraphicsItemNodeInstance::setPropertyBinding(const QString &name, const QString &expression) @@ -288,6 +296,24 @@ void QmlGraphicsItemNodeInstance::resetVertical() setPropertyVariant("height", qmlGraphicsItem()->implicitHeight()); } +static void repositioning(QDeclarativeItem *item) +{ + if (!item) + return; + +// QDeclarativeBasePositioner *positioner = qobject_cast(item); +// if (positioner) +// positioner->rePositioning(); + + if (item->parentObject()) + repositioning(qobject_cast(item->parentObject())); +} + +void QmlGraphicsItemNodeInstance::refresh() +{ + repositioning(qmlGraphicsItem()); +} + void QmlGraphicsItemNodeInstance::doComponentComplete() { if (qmlGraphicsItem()) { @@ -297,6 +323,16 @@ void QmlGraphicsItemNodeInstance::doComponentComplete() } } +bool QmlGraphicsItemNodeInstance::isResizable() const +{ + return m_isResizable && qmlGraphicsItem() && qmlGraphicsItem()->parentItem(); +} + +void QmlGraphicsItemNodeInstance::setResizable(bool resizeable) +{ + m_isResizable = resizeable; +} + int QmlGraphicsItemNodeInstance::penWidth() const { QDeclarativeRectangle *rectangle = qobject_cast(object()); @@ -350,7 +386,19 @@ void QmlGraphicsItemNodeInstance::resetProperty(const QString &name) void QmlGraphicsItemNodeInstance::reparent(const NodeInstance &oldParentInstance, const QString &oldParentProperty, const NodeInstance &newParentInstance, const QString &newParentProperty) { + if (oldParentInstance.isValid() && oldParentInstance.isPositioner()) { + setInPositioner(false); + setMovable(true); + } + GraphicsObjectNodeInstance::reparent(oldParentInstance, oldParentProperty, newParentInstance, newParentProperty); + + if (newParentInstance.isValid() && newParentInstance.isPositioner()) { + setInPositioner(true); + setMovable(false); + } + + refresh(); } //void QmlGraphicsItemNodeInstance::updateAnchors() diff --git a/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.h b/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.h index 96db456ab98..9aa68547e99 100644 --- a/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.h +++ b/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.h @@ -70,16 +70,22 @@ public: bool isAnchoredByChildren() const; void doComponentComplete(); + bool isResizable() const; + void setResizable(bool resizeable); + protected: QmlGraphicsItemNodeInstance(QDeclarativeItem *item, bool hasContent); QDeclarativeItem *qmlGraphicsItem() const; QDeclarativeAnchors *anchors() const; void resetHorizontal(); void resetVertical(); + void refresh(); private: //variables bool m_hasHeight; bool m_hasWidth; + bool m_isResizable; + }; } diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp index cafa7754ce6..8a6369475ac 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp @@ -201,6 +201,21 @@ bool QmlItemNode::instanceIsAnchoredByChildren() const return nodeInstance().isAnchoredByChildren(); } +bool QmlItemNode::instanceIsMovable() const +{ + return nodeInstance().isMovable(); +} + +bool QmlItemNode::instanceIsResizable() const +{ + return nodeInstance().isResizable(); +} + +bool QmlItemNode::instanceIsInPositioner() const +{ + return nodeInstance().isInPositioner(); +} + QRectF QmlItemNode::instanceBoundingRect() const { return nodeInstance().boundingRect(); From a4dfc502d41212ca29797f69f7d45fbd55aefb0b Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Tue, 28 Sep 2010 15:45:47 +0200 Subject: [PATCH 013/118] QmlDesigner.FormEditor: Add paintedWidth and paintedHeight to transform properties --- src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp index 9a14dca9e11..191114bf1b7 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp @@ -325,7 +325,9 @@ static bool isTransformProperty(const QString &name) << "z" << "rotation" << "scale" - << "transformOrigin"); + << "transformOrigin" + << "paintedWidth" + << "paintedHeight"); return transformProperties.contains(name); } From 989d609b543eed334843b86926b84cf5cc6db2bd Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Tue, 28 Sep 2010 20:03:37 +0200 Subject: [PATCH 014/118] QmlDesigner.Model: Fixes order problem The order of allModelNode function was not in order. --- .../designercore/instances/nodeinstanceview.cpp | 8 ++++++-- .../qmldesigner/designercore/model/model.cpp | 13 ++++++++++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index ae861675458..30b5d43acd5 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -390,6 +390,7 @@ void NodeInstanceView::instancePropertyChange(const QList &nodeList) { foreach (const ModelNode &node, nodeList) @@ -405,8 +406,11 @@ void NodeInstanceView::loadNodes(const QList &nodeList) instanceForNode(node).setPropertyBinding(property.name(), property.expression()); } - foreach(NodeInstance instance, m_objectInstanceHash.values()) - instance.doComponentComplete(); + QListIterator listIterator(nodeList); + listIterator.toBack(); + + while (listIterator.hasPrevious()) + instanceForNode(listIterator.previous()).doComponentComplete(); } // TODO: Set base state as current model state diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 8f93153cb6f..b6794b3f1f2 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -1218,7 +1218,18 @@ bool ModelPrivate::hasId(const QString &id) const QList ModelPrivate::allNodes() const { - return m_nodeSet.toList(); + // the item must be ordered! + + QList nodeList; + + if (m_rootInternalNode.isNull() || !m_rootInternalNode->isValid()) + return nodeList; + + nodeList.append(m_rootInternalNode); + nodeList.append(m_rootInternalNode->allSubNodes()); + + + return nodeList; } bool ModelPrivate::isWriteLocked() const From acbb8cd54808eaf9ce4e0ebd1baa0f5e9fd78e41 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 29 Sep 2010 13:39:38 +0200 Subject: [PATCH 015/118] QmlDesigner.Model: All nodes includes also non tree nodes --- src/plugins/qmldesigner/designercore/model/model.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index b6794b3f1f2..8a714b1bf99 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -1227,7 +1227,7 @@ QList ModelPrivate::allNodes() const nodeList.append(m_rootInternalNode); nodeList.append(m_rootInternalNode->allSubNodes()); - + nodeList.append((m_nodeSet - nodeList.toSet()).toList()); return nodeList; } From 81d40def56cbeaa8b908c783084f1adc3b8e51ec Mon Sep 17 00:00:00 2001 From: Leandro Melo Date: Wed, 29 Sep 2010 13:52:58 +0200 Subject: [PATCH 016/118] Generic highlighter: Create default dir for definitions on user's area (at runtime). --- share/qtcreator/generic-highlighter/README | 2 -- share/qtcreator/static.pro | 2 +- .../highlightersettings.cpp | 19 +++++++++++++------ .../generichighlighter/highlightersettings.h | 3 ++- 4 files changed, 16 insertions(+), 10 deletions(-) delete mode 100644 share/qtcreator/generic-highlighter/README diff --git a/share/qtcreator/generic-highlighter/README b/share/qtcreator/generic-highlighter/README deleted file mode 100644 index eb1647a377b..00000000000 --- a/share/qtcreator/generic-highlighter/README +++ /dev/null @@ -1,2 +0,0 @@ -This is Creator's default directory for syntax highlight definitions. -You can download them through the Generic Highlighter options dialog. diff --git a/share/qtcreator/static.pro b/share/qtcreator/static.pro index 267dc6c6975..ddc10bab704 100644 --- a/share/qtcreator/static.pro +++ b/share/qtcreator/static.pro @@ -35,7 +35,7 @@ DATA_DIRS = \ qmlicons \ qml \ qml-type-descriptions \ - generic-highlighter + qmljsdebugger !isEmpty(copydata) { diff --git a/src/plugins/texteditor/generichighlighter/highlightersettings.cpp b/src/plugins/texteditor/generichighlighter/highlightersettings.cpp index ec6c59ab566..2298df67aa5 100644 --- a/src/plugins/texteditor/generichighlighter/highlightersettings.cpp +++ b/src/plugins/texteditor/generichighlighter/highlightersettings.cpp @@ -34,9 +34,9 @@ #include #include #include -#include -#ifdef Q_OS_UNIX #include +#include +#ifdef Q_OS_UNIX #include #endif @@ -135,8 +135,7 @@ void HighlighterSettings::fromSettings(const QString &category, QSettings *s) s->beginGroup(group); m_definitionFilesPath = s->value(kDefinitionFilesPath, QString()).toString(); if (!s->contains(kDefinitionFilesPath)) - m_definitionFilesPath = Core::ICore::instance()->resourcePath() + - QLatin1String("/generic-highlighter"); + assignDefaultDefinitionsPath(); else m_definitionFilesPath = s->value(kDefinitionFilesPath).toString(); if (!s->contains(kFallbackDefinitionFilesPath)) { @@ -151,7 +150,7 @@ void HighlighterSettings::fromSettings(const QString &category, QSettings *s) } m_alertWhenNoDefinition = s->value(kAlertWhenDefinitionIsNotFound, true).toBool(); if (!s->contains(kIgnoredFilesPatterns)) - assignInitialIgnoredPatterns(); + assignDefaultIgnoredPatterns(); else setIgnoredFilesPatterns(s->value(kIgnoredFilesPatterns, QString()).toString()); s->endGroup(); @@ -167,7 +166,7 @@ QString HighlighterSettings::ignoredFilesPatterns() const return listFromExpressions().join(QLatin1String(",")); } -void HighlighterSettings::assignInitialIgnoredPatterns() +void HighlighterSettings::assignDefaultIgnoredPatterns() { QStringList patterns; patterns << QLatin1String("*.txt") @@ -180,6 +179,14 @@ void HighlighterSettings::assignInitialIgnoredPatterns() setExpressionsFromList(patterns); } +void HighlighterSettings::assignDefaultDefinitionsPath() +{ + const QString &path = + Core::ICore::instance()->userResourcePath() + QLatin1String("/generic-highlighter"); + if (QFile::exists(path) || QDir().mkpath(path)) + m_definitionFilesPath = path; +} + bool HighlighterSettings::isIgnoredFilePattern(const QString &fileName) const { foreach (const QRegExp ®Exp, m_ignoredFiles) diff --git a/src/plugins/texteditor/generichighlighter/highlightersettings.h b/src/plugins/texteditor/generichighlighter/highlightersettings.h index e3fb4ca75a7..0fbbe7e3eda 100644 --- a/src/plugins/texteditor/generichighlighter/highlightersettings.h +++ b/src/plugins/texteditor/generichighlighter/highlightersettings.h @@ -68,7 +68,8 @@ public: bool equals(const HighlighterSettings &highlighterSettings) const; private: - void assignInitialIgnoredPatterns(); + void assignDefaultIgnoredPatterns(); + void assignDefaultDefinitionsPath(); void setExpressionsFromList(const QStringList &patterns); QStringList listFromExpressions() const; From 2e6217b7564f7900b8d689abbce60f6fa967a9cf Mon Sep 17 00:00:00 2001 From: kh1 Date: Wed, 29 Sep 2010 14:08:57 +0200 Subject: [PATCH 017/118] Prefer never documentation over old ones. Task-number: QTCREATORBUG-2080 Reviewed-by: ck --- src/plugins/help/helpplugin.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/plugins/help/helpplugin.cpp b/src/plugins/help/helpplugin.cpp index 55438fa64c1..2be35d46004 100644 --- a/src/plugins/help/helpplugin.cpp +++ b/src/plugins/help/helpplugin.cpp @@ -73,6 +73,7 @@ #include #include #include +#include #include #include @@ -839,7 +840,21 @@ void HelpPlugin::activateContext() "available.").arg(m_idFromContext)); viewer->setSource(QUrl()); } else { - const QUrl &source = *links.begin(); + int version = 0; + const QRegExp exp("(\\d+)"); + QUrl source = *links.begin(); + foreach (const QUrl &tmp, links) { + const QString &authority = tmp.authority(); + if (authority.startsWith(QLatin1String("com.trolltech.qt"))) { + if (exp.indexIn(authority) >= 0) { + const int tmpVersion = exp.cap(1).toInt(); + if (tmpVersion > version) { + source = tmp; + version = tmpVersion; + } + } + } + } const QUrl &oldSource = viewer->source(); if (source != oldSource) { #if !defined(QT_NO_WEBKIT) From 8c956abedd392f48d8cbeea5fea0fcb3e8ef6e36 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 29 Sep 2010 16:39:46 +0200 Subject: [PATCH 018/118] Debugger[TRK]: Report crashs with signals. Show the message box correctly on signal 11 reported. Reviewed-by: hjk --- src/plugins/debugger/gdb/symbian.cpp | 4 ++-- src/plugins/debugger/gdb/symbian.h | 8 +++++++- src/plugins/debugger/gdb/tcftrkgdbadapter.cpp | 8 ++++++-- src/plugins/debugger/gdb/tcftrkgdbadapter.h | 1 + src/plugins/debugger/gdb/trkgdbadapter.cpp | 9 ++++++--- 5 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/plugins/debugger/gdb/symbian.cpp b/src/plugins/debugger/gdb/symbian.cpp index f7d6b62f282..4cae2ce81bc 100644 --- a/src/plugins/debugger/gdb/symbian.cpp +++ b/src/plugins/debugger/gdb/symbian.cpp @@ -418,9 +418,9 @@ static void gdbAppendRegister(QByteArray *ba, uint regno, uint value) ba->append(';'); } -QByteArray Snapshot::gdbStopMessage(uint threadId, bool reportThreadId) const +QByteArray Snapshot::gdbStopMessage(uint threadId, int signalNumber, bool reportThreadId) const { - QByteArray ba = "T05"; + QByteArray ba = ('T' + trk::hexNumber(signalNumber, 2)); if (reportThreadId) { ba += "thread:"; ba += trk::hexNumber(threadId, 3); diff --git a/src/plugins/debugger/gdb/symbian.h b/src/plugins/debugger/gdb/symbian.h index 30012183c53..ec34462e47a 100644 --- a/src/plugins/debugger/gdb/symbian.h +++ b/src/plugins/debugger/gdb/symbian.h @@ -73,6 +73,12 @@ struct MemoryRange QDebug operator<<(QDebug d, const MemoryRange &range); +// Signals to be passed to gdb server as stop reason (2 digit hex) +enum GdbServerStopReason { + gdbServerSignalTrap = 5, // Trap/Breakpoint, etc. + gdbServerSignalSegfault = 11 // Segfault +}; + namespace Symbian { enum CodeMode @@ -135,7 +141,7 @@ struct Snapshot QByteArray gdbQsThreadInfo() const; QByteArray gdbQThreadExtraInfo(const QByteArray &cmd) const; // Format a gdb T05 stop message with thread and register set - QByteArray gdbStopMessage(uint threadId, bool reportThreadId) const; + QByteArray gdbStopMessage(uint threadId, int signalNumber, bool reportThreadId) const; // Format a log message for memory access with some smartness about registers QByteArray memoryReadLogMessage(uint addr, uint threadId, bool verbose, const QByteArray &ba) const; // Gdb command parse helpers: 'salnext' diff --git a/src/plugins/debugger/gdb/tcftrkgdbadapter.cpp b/src/plugins/debugger/gdb/tcftrkgdbadapter.cpp index cad69ff297e..1169da30f0a 100644 --- a/src/plugins/debugger/gdb/tcftrkgdbadapter.cpp +++ b/src/plugins/debugger/gdb/tcftrkgdbadapter.cpp @@ -113,6 +113,7 @@ static inline QString startMsg(const trk::Session &session) TcfTrkGdbAdapter::TcfTrkGdbAdapter(GdbEngine *engine) : AbstractGdbAdapter(engine), m_running(false), + m_stopReason(0), m_trkDevice(new TcfTrkDevice(this)), m_gdbAckMode(true), m_uid(0), @@ -325,6 +326,9 @@ void TcfTrkGdbAdapter::tcftrkEvent(const TcfTrkEvent &e) m_snapshot.setThreadState(threadId, reason); // Update registers first, then report stopped m_running = false; + m_stopReason = reason.contains(QLatin1String("exception"), Qt::CaseInsensitive) + || reason.contains(QLatin1String("panic"), Qt::CaseInsensitive) ? + gdbServerSignalSegfault : gdbServerSignalTrap; m_trkDevice->sendRegistersGetMRangeCommand( TcfTrkCallback(this, &TcfTrkGdbAdapter::handleAndReportReadRegistersAfterStop), currentThreadContextId(), 0, @@ -688,7 +692,7 @@ void TcfTrkGdbAdapter::handleGdbServerCommand(const QByteArray &cmd) } else { //qDebug() << "Fetching single register"; m_trkDevice->sendRegistersGetMRangeCommand( - TcfTrkCallback(this, &TcfTrkGdbAdapter::handleAndReportReadRegistersAfterStop), + TcfTrkCallback(this, &TcfTrkGdbAdapter::handleAndReportReadRegister), currentThreadContextId(), registerNumber, 1); } } @@ -1304,7 +1308,7 @@ void TcfTrkGdbAdapter::handleAndReportReadRegistersAfterStop(const TcfTrkCommand handleReadRegisters(result); handleReadRegisters(result); const bool reportThread = m_session.tid != m_session.mainTid; - sendGdbServerMessage(m_snapshot.gdbStopMessage(m_session.tid, reportThread), stopMessage()); + sendGdbServerMessage(m_snapshot.gdbStopMessage(m_session.tid, m_stopReason, reportThread), stopMessage()); } void TcfTrkGdbAdapter::handleAndReportSetBreakpoint(const TcfTrkCommandResult &result) diff --git a/src/plugins/debugger/gdb/tcftrkgdbadapter.h b/src/plugins/debugger/gdb/tcftrkgdbadapter.h index ab69c13f256..71becf8e248 100644 --- a/src/plugins/debugger/gdb/tcftrkgdbadapter.h +++ b/src/plugins/debugger/gdb/tcftrkgdbadapter.h @@ -137,6 +137,7 @@ private: QString m_gdbServerName; // 127.0.0.1:(2222+uid) bool m_running; + int m_stopReason; tcftrk::TcfTrkDevice *m_trkDevice; QSharedPointer m_trkIODevice; diff --git a/src/plugins/debugger/gdb/trkgdbadapter.cpp b/src/plugins/debugger/gdb/trkgdbadapter.cpp index 1961ab61cf4..1e32fcb26fd 100644 --- a/src/plugins/debugger/gdb/trkgdbadapter.cpp +++ b/src/plugins/debugger/gdb/trkgdbadapter.cpp @@ -963,10 +963,12 @@ void TrkGdbAdapter::handleTrkResult(const TrkResult &result) # if 1 // We almost always need register values, so get them // now before informing gdb about the stop.s - //qDebug() << "Auto-fetching registers"; + const int signalNumber = reason.contains(QLatin1String("exception"), Qt::CaseInsensitive) + || reason.contains(QLatin1String("panic"), Qt::CaseInsensitive) ? + gdbServerSignalSegfault : gdbServerSignalTrap; sendTrkMessage(0x12, TrkCB(handleAndReportReadRegistersAfterStop), - Launcher::readRegistersMessage(m_session.pid, m_session.tid)); + Launcher::readRegistersMessage(m_session.pid, m_session.tid), signalNumber); # else // As a source-line step typically consists of // several instruction steps, better avoid the multiple @@ -1181,7 +1183,8 @@ void TrkGdbAdapter::handleAndReportReadRegistersAfterStop(const TrkResult &resul { handleReadRegisters(result); const bool reportThread = m_session.tid != m_session.mainTid; - sendGdbServerMessage(m_snapshot.gdbStopMessage(m_session.tid, reportThread), + const int signalNumber = result.cookie.isValid() ? result.cookie.toInt() : int(gdbServerSignalTrap); + sendGdbServerMessage(m_snapshot.gdbStopMessage(m_session.tid, signalNumber, reportThread), "Stopped with registers in thread " + QByteArray::number(m_session.tid, 16)); } From cb48aad9d27d83ab4ea75f4548c1d108205fecf3 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Wed, 29 Sep 2010 13:35:06 +0200 Subject: [PATCH 019/118] QmlDesigner: Improve Qt version check in plugins.pro Reviewed-by: Thomas Hartmann --- qtcreator.pri | 20 ++++++++++++++++++++ src/plugins/plugins.pro | 8 +++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/qtcreator.pri b/qtcreator.pri index 8b2268ca3ff..2994770571f 100644 --- a/qtcreator.pri +++ b/qtcreator.pri @@ -31,6 +31,26 @@ defineReplace(qtLibraryName) { return($$RET) } +defineTest(minQtVersion) { + maj = $$1 + min = $$2 + patch = $$3 + isEqual(QT_MAJOR_VERSION, $$maj) { + isEqual(QT_MINOR_VERSION, $$min) { + isEqual(QT_PATCH_VERSION, $$patch) { + return(true) + } + greaterThan(QT_PATCH_VERSION, $$patch) { + return(true) + } + } + greaterThan(QT_MINOR_VERSION, $$min) { + return(true) + } + } + return(false) +} + # For use in custom compilers which just copy files win32:i_flag = i defineReplace(stripSrcDir) { diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro index 9702fb785d5..570be94d7e0 100644 --- a/src/plugins/plugins.pro +++ b/src/plugins/plugins.pro @@ -38,20 +38,22 @@ SUBDIRS = plugin_coreplugin \ plugin_tasklist \ debugger/dumper.pro -contains(QT_CONFIG, declarative) { +include(../../qtcreator.pri) +contains(QT_CONFIG, declarative) { SUBDIRS += \ plugin_qmlprojectmanager \ plugin_qmljsinspector include(../private_headers.pri) exists($${QT_PRIVATE_HEADERS}/QtDeclarative/private/qdeclarativecontext_p.h) { - isEqual(QT_MINOR_VERSION, 7):greaterThan(QT_PATCH_VERSION, 0) { + + minQtVersion(4, 7, 1) { SUBDIRS += plugin_qmldesigner } else { warning() warning("QmlDesigner plugin has been disabled.") - warning("Qt Version has to be 4.7.x with x > 0") + warning("QmlDesigner requires Qt 4.7.1 or later.") } } else { warning() From f5b4668fa5e990cef310d3b3034f916d57722081 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 29 Sep 2010 16:58:30 +0200 Subject: [PATCH 020/118] QmlJsEditor: combine the Quick ToolBar with the toolTip 1000ms after a tooltip is shown we now also show the quick toolbar Reviewed-by: Erik Verbruggen --- src/plugins/qmljseditor/qmljseditor.cpp | 37 +++++++++++++++++++++++-- src/plugins/qmljseditor/qmljseditor.h | 4 +++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index c983f50ec8d..8c4a1b08968 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -63,6 +63,7 @@ #include #include #include +#include #include #include #include @@ -82,7 +83,8 @@ enum { UPDATE_DOCUMENT_DEFAULT_INTERVAL = 100, UPDATE_USES_DEFAULT_INTERVAL = 150, - UPDATE_OUTLINE_INTERVAL = 500 // msecs after new semantic info has been arrived / cursor has moved + UPDATE_OUTLINE_INTERVAL = 500, // msecs after new semantic info has been arrived / cursor has moved + TOOLTIP_TIMER_INTERVAL = 1000 // delay after we show the Quick ToolBar after a tooltip }; using namespace QmlJS; @@ -678,7 +680,8 @@ QmlJSTextEditor::QmlJSTextEditor(QWidget *parent) : m_modelManager(0), m_contextPane(0), m_updateSelectedElements(false), - m_findReferences(new FindReferences(this)) + m_findReferences(new FindReferences(this)), + m_toolTipPosition(0) { qRegisterMetaType("QmlJSEditor::Internal::SemanticInfo"); @@ -725,6 +728,11 @@ QmlJSTextEditor::QmlJSTextEditor(QWidget *parent) : m_cursorPositionTimer->setSingleShot(true); connect(m_cursorPositionTimer, SIGNAL(timeout()), this, SLOT(updateCursorPositionNow())); + m_ToolTipTimer = new QTimer(this); + m_ToolTipTimer->setInterval(TOOLTIP_TIMER_INTERVAL); + m_ToolTipTimer->setSingleShot(true); + connect(m_ToolTipTimer, SIGNAL(timeout()), this, SLOT(updateToolTipNow())); + baseTextDocument()->setSyntaxHighlighter(new Highlighter(document())); m_modelManager = ExtensionSystem::PluginManager::instance()->getObject(); @@ -750,6 +758,9 @@ QmlJSTextEditor::QmlJSTextEditor(QWidget *parent) : connect(this, SIGNAL(refactorMarkerClicked(TextEditor::Internal::RefactorMarker)), SLOT(onRefactorMarkerClicked(TextEditor::Internal::RefactorMarker))); + connect(editableInterface(), SIGNAL(tooltipRequested(TextEditor::ITextEditor*, QPoint, int)), + SLOT(onTooltipRequested(TextEditor::ITextEditor*, QPoint, int))); + setRequestMarkEnabled(true); } @@ -1458,6 +1469,28 @@ void QmlJSTextEditor::performQuickFix(int index) op->perform(); } +void QmlJSTextEditor::onTooltipRequested(TextEditor::ITextEditor* /* editor */, QPoint /* point */, int position) +{ + m_toolTipPosition = position; + if (m_contextPane) { + m_ToolTipTimer->start(); + } +} + +void QmlJSTextEditor::updateToolTipNow() +{ + if (!TextEditor::ToolTip::instance()->isVisible()) + return; + + if (m_contextPane) { + Node *newNode = m_semanticInfo.declaringMemberNoProperties(m_toolTipPosition); + m_contextPane->apply(editableInterface(), m_semanticInfo.lookupContext(), newNode, false, true); + m_oldCursorPosition = m_toolTipPosition; + QList markers; + setRefactorMarkers(markers); + } +} + void QmlJSTextEditor::contextMenuEvent(QContextMenuEvent *e) { QMenu *menu = new QMenu(); diff --git a/src/plugins/qmljseditor/qmljseditor.h b/src/plugins/qmljseditor/qmljseditor.h index 8071dd03d80..83072329438 100644 --- a/src/plugins/qmljseditor/qmljseditor.h +++ b/src/plugins/qmljseditor/qmljseditor.h @@ -279,6 +279,8 @@ private slots: void onRefactorMarkerClicked(const TextEditor::Internal::RefactorMarker &marker); void performQuickFix(int index); + void onTooltipRequested(TextEditor::ITextEditor* editor, QPoint point, int position); + void updateToolTipNow(); protected: void contextMenuEvent(QContextMenuEvent *e); @@ -317,6 +319,7 @@ private: QTimer *m_updateOutlineTimer; QTimer *m_updateOutlineIndexTimer; QTimer *m_cursorPositionTimer; + QTimer *m_toolTipTimer; QComboBox *m_outlineCombo; QmlOutlineModel *m_outlineModel; QModelIndex m_outlineModelIndex; @@ -333,6 +336,7 @@ private: QmlJS::IContextPane *m_contextPane; int m_oldCursorPosition; bool m_updateSelectedElements; + int m_toolTipPosition; FindReferences *m_findReferences; }; From b87f0bfdcfbf875cd443cdd72899cc649c5a7ff4 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Wed, 29 Sep 2010 17:54:06 +0200 Subject: [PATCH 021/118] QmlJS: Fix qmldump not working for qmlproject projects. Reviewed-by: Erik Verbruggen --- src/plugins/qmlprojectmanager/qmlproject.cpp | 6 ++++ src/plugins/qt4projectmanager/qmldumptool.cpp | 35 +++++++++++++++++++ src/plugins/qt4projectmanager/qmldumptool.h | 2 ++ src/plugins/qt4projectmanager/qt4project.cpp | 28 +-------------- 4 files changed, 44 insertions(+), 27 deletions(-) diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index 9027950cea4..52147a75bca 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -129,6 +130,11 @@ void QmlProject::refresh(RefreshOptions options) QmlJS::ModelManagerInterface::ProjectInfo pinfo(this); pinfo.sourceFiles = files(); pinfo.importPaths = importPaths(); + + if (pinfo.qmlDumpPath.isNull()) { + pinfo.qmlDumpPath = Qt4ProjectManager::QmlDumpTool::qmlDumpPath(); + } + m_modelManager->updateProjectInfo(pinfo); } diff --git a/src/plugins/qt4projectmanager/qmldumptool.cpp b/src/plugins/qt4projectmanager/qmldumptool.cpp index 6b6c52411f1..26d2f08c89f 100644 --- a/src/plugins/qt4projectmanager/qmldumptool.cpp +++ b/src/plugins/qt4projectmanager/qmldumptool.cpp @@ -33,6 +33,7 @@ #include #include +#include #include #include #include @@ -139,4 +140,38 @@ QStringList QmlDumpTool::installDirectories(const QString &qtInstallData) return directories; } +QString QmlDumpTool::qmlDumpPath() +{ + QString path; + + ProjectExplorer::Project *activeProject = ProjectExplorer::ProjectExplorerPlugin::instance()->startupProject(); + path = Qt4ProjectManager::QmlDumpTool::toolForProject(activeProject); + + // ### this is needed for qmlproject and cmake project support, but may not work in all cases. + if (path.isEmpty()) { + // Try to locate default path in Qt Versions + QtVersionManager *qtVersions = QtVersionManager::instance(); + foreach (QtVersion *version, qtVersions->validVersions()) { + if (version->supportsTargetId(Constants::DESKTOP_TARGET_ID)) { + const QString qtInstallData = version->versionInfo().value("QT_INSTALL_DATA"); + path = QmlDumpTool::toolByInstallData(qtInstallData); + + if (!path.isEmpty()) { + break; + } + } + } + } + QFileInfo qmldumpFileInfo(path); + if (!qmldumpFileInfo.exists()) { + qWarning() << "QmlDumpTool::qmlDumpPath: qmldump executable does not exist at" << path; + path.clear(); + } else if (!qmldumpFileInfo.isFile()) { + qWarning() << "QmlDumpTool::qmlDumpPath: " << path << " is not a file"; + path.clear(); + } + + return path; +} + } // namespace diff --git a/src/plugins/qt4projectmanager/qmldumptool.h b/src/plugins/qt4projectmanager/qmldumptool.h index 5ec3355659c..4c54838b6f1 100644 --- a/src/plugins/qt4projectmanager/qmldumptool.h +++ b/src/plugins/qt4projectmanager/qmldumptool.h @@ -59,6 +59,8 @@ public: // Copy the source files to a target location and return the chosen target location. static QString copy(const QString &qtInstallData, QString *errorMessage); + static QString qmlDumpPath(); + private: static QStringList installDirectories(const QString &qtInstallData); diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index 20808d95ab3..a11fc013e2a 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -586,34 +586,8 @@ void Qt4Project::updateQmlJSCodeModel() } projectInfo.importPaths.removeDuplicates(); - if (projectInfo.qmlDumpPath.isNull()) { - ProjectExplorer::Project *activeProject = ProjectExplorer::ProjectExplorerPlugin::instance()->startupProject(); - projectInfo.qmlDumpPath = Qt4ProjectManager::QmlDumpTool::toolForProject(activeProject); - - // ### this is needed for qmlproject and cmake project support, but may not work in all cases. - if (projectInfo.qmlDumpPath.isEmpty()) { - // Try to locate default path in Qt Versions - QtVersionManager *qtVersions = QtVersionManager::instance(); - foreach (QtVersion *version, qtVersions->validVersions()) { - if (version->supportsTargetId(Constants::DESKTOP_TARGET_ID)) { - const QString qtInstallData = version->versionInfo().value("QT_INSTALL_DATA"); - projectInfo.qmlDumpPath = QmlDumpTool::toolByInstallData(qtInstallData); - - if (!projectInfo.qmlDumpPath.isEmpty()) { - break; - } - } - } - } - QFileInfo qmldumpFileInfo(projectInfo.qmlDumpPath); - if (!qmldumpFileInfo.exists()) { - qWarning() << "Qt4Project::loadQmlPluginTypes: qmldump executable does not exist at" << projectInfo.qmlDumpPath; - projectInfo.qmlDumpPath.clear(); - } else if (!qmldumpFileInfo.isFile()) { - qWarning() << "Qt4Project::loadQmlPluginTypes: " << projectInfo.qmlDumpPath << " is not a file"; - projectInfo.qmlDumpPath.clear(); - } + projectInfo.qmlDumpPath = QmlDumpTool::qmlDumpPath(); } modelManager->updateProjectInfo(projectInfo); From 5cf1aaf67d637896a4f1219444377c917154c84b Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Wed, 29 Sep 2010 19:35:25 +0200 Subject: [PATCH 022/118] Fix compilation and initialization compile warnings. Reviewed-by: Alessandro Portale --- src/plugins/qmljseditor/qmljseditor.cpp | 14 +++++++------- src/plugins/qmljseditor/qmljseditor.h | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index 8c4a1b08968..44f79765804 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -680,8 +680,8 @@ QmlJSTextEditor::QmlJSTextEditor(QWidget *parent) : m_modelManager(0), m_contextPane(0), m_updateSelectedElements(false), - m_findReferences(new FindReferences(this)), - m_toolTipPosition(0) + m_toolTipPosition(0), + m_findReferences(new FindReferences(this)) { qRegisterMetaType("QmlJSEditor::Internal::SemanticInfo"); @@ -728,10 +728,10 @@ QmlJSTextEditor::QmlJSTextEditor(QWidget *parent) : m_cursorPositionTimer->setSingleShot(true); connect(m_cursorPositionTimer, SIGNAL(timeout()), this, SLOT(updateCursorPositionNow())); - m_ToolTipTimer = new QTimer(this); - m_ToolTipTimer->setInterval(TOOLTIP_TIMER_INTERVAL); - m_ToolTipTimer->setSingleShot(true); - connect(m_ToolTipTimer, SIGNAL(timeout()), this, SLOT(updateToolTipNow())); + m_toolTipTimer = new QTimer(this); + m_toolTipTimer->setInterval(TOOLTIP_TIMER_INTERVAL); + m_toolTipTimer->setSingleShot(true); + connect(m_toolTipTimer, SIGNAL(timeout()), this, SLOT(updateToolTipNow())); baseTextDocument()->setSyntaxHighlighter(new Highlighter(document())); @@ -1473,7 +1473,7 @@ void QmlJSTextEditor::onTooltipRequested(TextEditor::ITextEditor* /* editor */, { m_toolTipPosition = position; if (m_contextPane) { - m_ToolTipTimer->start(); + m_toolTipTimer->start(); } } diff --git a/src/plugins/qmljseditor/qmljseditor.h b/src/plugins/qmljseditor/qmljseditor.h index 83072329438..d3db0e39dbd 100644 --- a/src/plugins/qmljseditor/qmljseditor.h +++ b/src/plugins/qmljseditor/qmljseditor.h @@ -318,8 +318,8 @@ private: QTimer *m_semanticRehighlightTimer; QTimer *m_updateOutlineTimer; QTimer *m_updateOutlineIndexTimer; - QTimer *m_cursorPositionTimer; QTimer *m_toolTipTimer; + QTimer *m_cursorPositionTimer; QComboBox *m_outlineCombo; QmlOutlineModel *m_outlineModel; QModelIndex m_outlineModelIndex; From 50bae31d984ceb3d28ea4f876928547705f4010f Mon Sep 17 00:00:00 2001 From: Morten Engvoldsen Date: Tue, 28 Sep 2010 10:59:16 +0200 Subject: [PATCH 023/118] Doc: Fixing QTBUG-13595 (cherry picked from commit b4207f31bc8f72c08efc030f7d2a9d7340e103c9) Reviewed-By: Leena Miettinen --- doc/templates/style/style.css | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/doc/templates/style/style.css b/doc/templates/style/style.css index 393d4e5bf8e..997e5f5dc8d 100644 --- a/doc/templates/style/style.css +++ b/doc/templates/style/style.css @@ -837,6 +837,9 @@ padding-left: 25px; padding-top: 10px; } + .wrap .content ul img { + vertical-align:middle; + } a:hover { color: #4c0033; @@ -886,9 +889,9 @@ -webkit-column-gap:41px; -moz-column-gap:41px; - column-rule: 1px solid #ccc; - -webkit-column-rule: 1px solid #ccc; - -moz-column-rule: 1px solid #ccc; + column-rule: 1px dashed #ccc; + -webkit-column-rule: 1px dashed #ccc; + -moz-column-rule: 1px dashed #ccc; } .flowList dl{ @@ -898,6 +901,7 @@ margin-left:10px; min-width:250px; line-height: 1.2; + min-width:100%; } From c9e819b5376feb7616cf12eaf15577ce8f2c4f03 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 30 Sep 2010 08:50:36 +0200 Subject: [PATCH 024/118] qmldesigner compile fix Reviewed-by: Friedemann Kleint --- .../qmldesigner/designercore/instances/positionernodeinstance.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/qmldesigner/designercore/instances/positionernodeinstance.h b/src/plugins/qmldesigner/designercore/instances/positionernodeinstance.h index 9369ad6832a..628b0d16074 100644 --- a/src/plugins/qmldesigner/designercore/instances/positionernodeinstance.h +++ b/src/plugins/qmldesigner/designercore/instances/positionernodeinstance.h @@ -3,7 +3,9 @@ #include "qmlgraphicsitemnodeinstance.h" +QT_BEGIN_NAMESPACE class QDeclarativeBasePositioner; +QT_END_NAMESPACE namespace QmlDesigner { namespace Internal { From 129b53f616e9e4437811c7a12e22c1af80f0baaa Mon Sep 17 00:00:00 2001 From: Leandro Melo Date: Thu, 30 Sep 2010 09:12:59 +0200 Subject: [PATCH 025/118] Profile editor: Add proper format to white spaces. The generic highlighter already provided a method for this. This method was then lifted to the base syntax highlighter and it is now used by the profile highlighter. Reviewed-by: Roberto Raggi Task-number: QTCREATORBUG-2448 --- .../qt4projectmanager/profileeditor.cpp | 3 ++- .../qt4projectmanager/profilehighlighter.cpp | 3 ++- .../qt4projectmanager/profilehighlighter.h | 1 + .../generichighlighter/highlighter.cpp | 18 +----------------- .../generichighlighter/highlighter.h | 1 - src/plugins/texteditor/syntaxhighlighter.cpp | 16 ++++++++++++++++ src/plugins/texteditor/syntaxhighlighter.h | 2 ++ 7 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/plugins/qt4projectmanager/profileeditor.cpp b/src/plugins/qt4projectmanager/profileeditor.cpp index 8b79faf1836..d7cf57278af 100644 --- a/src/plugins/qt4projectmanager/profileeditor.cpp +++ b/src/plugins/qt4projectmanager/profileeditor.cpp @@ -140,7 +140,8 @@ void ProFileEditor::setFontSettings(const TextEditor::FontSettings &fs) if (categories.isEmpty()) { categories << QLatin1String(TextEditor::Constants::C_TYPE) << QLatin1String(TextEditor::Constants::C_KEYWORD) - << QLatin1String(TextEditor::Constants::C_COMMENT); + << QLatin1String(TextEditor::Constants::C_COMMENT) + << QLatin1String(TextEditor::Constants::C_VISUAL_WHITESPACE); } const QVector formats = fs.toTextCharFormats(categories); diff --git a/src/plugins/qt4projectmanager/profilehighlighter.cpp b/src/plugins/qt4projectmanager/profilehighlighter.cpp index cf9e72d2ca0..14daeee9f63 100644 --- a/src/plugins/qt4projectmanager/profilehighlighter.cpp +++ b/src/plugins/qt4projectmanager/profilehighlighter.cpp @@ -201,5 +201,6 @@ void ProFileHighlighter::highlightBlock(const QString &text) if (i >= text.length()) break; } -} + applyFormatToSpaces(text, m_formats[ProfileVisualWhitespaceFormat]); +} diff --git a/src/plugins/qt4projectmanager/profilehighlighter.h b/src/plugins/qt4projectmanager/profilehighlighter.h index 87dadce27e1..78ede9d738c 100644 --- a/src/plugins/qt4projectmanager/profilehighlighter.h +++ b/src/plugins/qt4projectmanager/profilehighlighter.h @@ -46,6 +46,7 @@ public: ProfileVariableFormat, ProfileFunctionFormat, ProfileCommentFormat, + ProfileVisualWhitespaceFormat, NumProfileFormats }; diff --git a/src/plugins/texteditor/generichighlighter/highlighter.cpp b/src/plugins/texteditor/generichighlighter/highlighter.cpp index 98de86d7fa5..3775a63d51f 100644 --- a/src/plugins/texteditor/generichighlighter/highlighter.cpp +++ b/src/plugins/texteditor/generichighlighter/highlighter.cpp @@ -140,7 +140,7 @@ void Highlighter::highlightBlock(const QString &text) } } - applyVisualWhitespaceFormat(text); + applyFormatToSpaces(text, m_creatorFormats.value(VisualWhitespace)); } void Highlighter::setupDataForBlock(const QString &text) @@ -408,22 +408,6 @@ void Highlighter::applyFormat(int offset, } } -void Highlighter::applyVisualWhitespaceFormat(const QString &text) -{ - int offset = 0; - const int length = text.length(); - while (offset < length) { - if (text.at(offset).isSpace()) { - int start = offset++; - while (offset < length && text.at(offset).isSpace()) - ++offset; - setFormat(start, offset - start, m_creatorFormats.value(VisualWhitespace)); - } else { - ++offset; - } - } -} - void Highlighter::createWillContinueBlock() { BlockData *data = blockData(currentBlockUserData()); diff --git a/src/plugins/texteditor/generichighlighter/highlighter.h b/src/plugins/texteditor/generichighlighter/highlighter.h index 43b7b58df3e..07417972595 100644 --- a/src/plugins/texteditor/generichighlighter/highlighter.h +++ b/src/plugins/texteditor/generichighlighter/highlighter.h @@ -123,7 +123,6 @@ private: int count, const QString &itemDataName, const QSharedPointer &definition); - void applyVisualWhitespaceFormat(const QString &text); void applyRegionBasedFolding() const; void applyIndentationBasedFolding(const QString &text) const; diff --git a/src/plugins/texteditor/syntaxhighlighter.cpp b/src/plugins/texteditor/syntaxhighlighter.cpp index b02d6ef9c6c..346c735b26f 100644 --- a/src/plugins/texteditor/syntaxhighlighter.cpp +++ b/src/plugins/texteditor/syntaxhighlighter.cpp @@ -535,6 +535,22 @@ void SyntaxHighlighter::setFormat(int start, int count, const QFont &font) setFormat(start, count, format); } +void SyntaxHighlighter::applyFormatToSpaces(const QString &text, const QTextCharFormat &format) +{ + int offset = 0; + const int length = text.length(); + while (offset < length) { + if (text.at(offset).isSpace()) { + int start = offset++; + while (offset < length && text.at(offset).isSpace()) + ++offset; + setFormat(start, offset - start, format); + } else { + ++offset; + } + } +} + /*! \fn QTextCharFormat SyntaxHighlighter::format(int position) const diff --git a/src/plugins/texteditor/syntaxhighlighter.h b/src/plugins/texteditor/syntaxhighlighter.h index 5b6722b5a34..a010facf640 100644 --- a/src/plugins/texteditor/syntaxhighlighter.h +++ b/src/plugins/texteditor/syntaxhighlighter.h @@ -89,6 +89,8 @@ protected: void setFormat(int start, int count, const QFont &font); QTextCharFormat format(int pos) const; + void applyFormatToSpaces(const QString &text, const QTextCharFormat &format); + int previousBlockState() const; int currentBlockState() const; void setCurrentBlockState(int newState); From 2129b0bcd06aa15c4dba86871fbe8ecb23af2089 Mon Sep 17 00:00:00 2001 From: Lasse Holmstedt Date: Thu, 30 Sep 2010 09:37:28 +0200 Subject: [PATCH 026/118] Fix issues with showing correct status of debug helpers Reviewed-by: Thomas Hartmann --- src/plugins/qt4projectmanager/qtversionmanager.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp index 12aeebb035f..b6edfbfb149 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.cpp +++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp @@ -1794,9 +1794,14 @@ QString QtVersion::buildDebuggingHelperLibrary(QFutureInterface &future) } future.setProgressValue(4); + // invalidate version before updating version info + m_versionInfoUpToDate = false; + updateVersionInfo(); + m_hasDebuggingHelper = !debuggingHelperLibrary().isEmpty(); m_hasQmlDump = !qmlDumpTool().isEmpty(); m_hasQmlObserver = !qmlObserverTool().isEmpty(); + return output; } From 2883af4bb2006d8cfe8f0a7048bf4d4f03c62525 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 30 Sep 2010 09:51:56 +0200 Subject: [PATCH 027/118] debugger: properly initialize m_hasInferiorThreadList Reviewed-by: Friedemann Kleint --- src/plugins/debugger/gdb/gdbengine.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index b00dbc92872..cc1c27f09b3 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -230,6 +230,7 @@ void GdbEngine::initializeVariables() m_isMacGdb = false; m_hasPython = false; m_registerNamesListed = false; + m_hasInferiorThreadList = false; m_fullToShortName.clear(); m_shortToFullName.clear(); From 07ca8e40bc6fad07afcc5415e61e90a46731f1f0 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 30 Sep 2010 10:25:03 +0200 Subject: [PATCH 028/118] CppEditor.mimetypes: increase range in which the magic #ifndef Reviewed-by: Leandro Melo --- src/plugins/cppeditor/CppEditor.mimetypes.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/plugins/cppeditor/CppEditor.mimetypes.xml b/src/plugins/cppeditor/CppEditor.mimetypes.xml index 5dd9f0610ab..3c67b3363a0 100644 --- a/src/plugins/cppeditor/CppEditor.mimetypes.xml +++ b/src/plugins/cppeditor/CppEditor.mimetypes.xml @@ -29,9 +29,10 @@ + example, STL ones like . Those can have a big initial + comment exceeding 1000 chars, though. --> - + From 1c7da3d83c9bb35064ae6b9052cbf1c6bff1395e Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 30 Sep 2010 10:29:28 +0200 Subject: [PATCH 029/118] CppEditor.mimetypes.xml: add #if and #include magic Reviewed-by: Roberto Raggi --- src/plugins/cppeditor/CppEditor.mimetypes.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/cppeditor/CppEditor.mimetypes.xml b/src/plugins/cppeditor/CppEditor.mimetypes.xml index 3c67b3363a0..6305531764a 100644 --- a/src/plugins/cppeditor/CppEditor.mimetypes.xml +++ b/src/plugins/cppeditor/CppEditor.mimetypes.xml @@ -32,7 +32,9 @@ example, STL ones like . Those can have a big initial comment exceeding 1000 chars, though. --> - + + + From 8500d9ced8bef00dd31eae9057cb2e9bf90c83e5 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 30 Sep 2010 11:16:51 +0200 Subject: [PATCH 030/118] QmlProject: Allow files to be deleted / renamed This might lead to files that 'disappear' from the pane, e.g. when the suffix is changed to something unsupported. Reviewed-by: Daniel Teske Task-number: QTCREATORBUG-2436 --- src/plugins/qmlprojectmanager/qmlprojectnodes.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmlprojectmanager/qmlprojectnodes.cpp b/src/plugins/qmlprojectmanager/qmlprojectnodes.cpp index 021c55d0db7..ec16ed0e05d 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectnodes.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectnodes.cpp @@ -177,6 +177,8 @@ QList QmlProjectNode::supportedActi Q_UNUSED(node); QList actions; actions.append(AddNewFile); + actions.append(EraseFile); + actions.append(Rename); return actions; } @@ -213,14 +215,13 @@ bool QmlProjectNode::removeFiles(const ProjectExplorer::FileType /*fileType*/, bool QmlProjectNode::deleteFiles(const ProjectExplorer::FileType /*fileType*/, const QStringList & /*filePaths*/) { - return false; + return true; } - bool QmlProjectNode::renameFile(const ProjectExplorer::FileType /*fileType*/, const QString & /*filePath*/, const QString & /*newFilePath*/) { - return false; + return true; } } // namespace Internal From a9514a388278524e2a261c32f15cad3503e33522 Mon Sep 17 00:00:00 2001 From: Lasse Holmstedt Date: Thu, 30 Sep 2010 11:55:45 +0200 Subject: [PATCH 031/118] Disable warning message for qmldump Discussed-with: fkleint --- src/plugins/qt4projectmanager/qmldumptool.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qt4projectmanager/qmldumptool.cpp b/src/plugins/qt4projectmanager/qmldumptool.cpp index 26d2f08c89f..210c0182fda 100644 --- a/src/plugins/qt4projectmanager/qmldumptool.cpp +++ b/src/plugins/qt4projectmanager/qmldumptool.cpp @@ -164,7 +164,7 @@ QString QmlDumpTool::qmlDumpPath() } QFileInfo qmldumpFileInfo(path); if (!qmldumpFileInfo.exists()) { - qWarning() << "QmlDumpTool::qmlDumpPath: qmldump executable does not exist at" << path; + //qWarning() << "QmlDumpTool::qmlDumpPath: qmldump executable does not exist at" << path; path.clear(); } else if (!qmldumpFileInfo.isFile()) { qWarning() << "QmlDumpTool::qmlDumpPath: " << path << " is not a file"; From 88a36fe34c49ebcaddb701ae890014276ac4bb8f Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Wed, 29 Sep 2010 16:40:13 +0200 Subject: [PATCH 032/118] DebuggingHelpers: Check for Qt version instead checking private files The location private includes might still change with 4.7.1 . Better check the qt version string. Reviewed-by: Lasse Holmstedt --- src/libs/utils/buildablehelperlibrary.cpp | 27 +++++++++++++++++++ src/libs/utils/buildablehelperlibrary.h | 1 + src/plugins/qt4projectmanager/qmldumptool.cpp | 5 ++-- src/plugins/qt4projectmanager/qmldumptool.h | 3 ++- .../qt4projectmanager/qmlobservertool.cpp | 6 ++--- .../qt4projectmanager/qmlobservertool.h | 4 ++- .../qt4projectmanager/qtversionmanager.cpp | 4 +-- 7 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/libs/utils/buildablehelperlibrary.cpp b/src/libs/utils/buildablehelperlibrary.cpp index c23853d2272..e9fcdbce71d 100644 --- a/src/libs/utils/buildablehelperlibrary.cpp +++ b/src/libs/utils/buildablehelperlibrary.cpp @@ -101,6 +101,33 @@ QString BuildableHelperLibrary::qtVersionForQMake(const QString &qmakePath) return QString(); } +bool BuildableHelperLibrary::checkMinimumQtVersion(const QString &qtVersionString, int majorVersion, int minorVersion, int patchVersion) +{ + int major = -1; + int minor = -1; + int patch = -1; + + // check format + QRegExp qtVersionRegex(QLatin1String("^\\d+\\.\\d+\\.\\d+$")); + if (!qtVersionRegex.exactMatch(qtVersionString)) + return false; + + QStringList parts = qtVersionString.split(QLatin1Char('.')); + major = parts.at(0).toInt(); + minor = parts.at(1).toInt(); + patch = parts.at(2).toInt(); + + if (major == majorVersion) { + if (minor == minorVersion) { + if (patch >= patchVersion) + return true; + } else if (minor > minorVersion) + return true; + } + + return false; +} + QStringList BuildableHelperLibrary::possibleQMakeCommands() { // On windows no one has renamed qmake, right? diff --git a/src/libs/utils/buildablehelperlibrary.h b/src/libs/utils/buildablehelperlibrary.h index e4d9eadbc68..fa8a85648c6 100644 --- a/src/libs/utils/buildablehelperlibrary.h +++ b/src/libs/utils/buildablehelperlibrary.h @@ -19,6 +19,7 @@ public: static QString findSystemQt(const Utils::Environment &env); // return true if the qmake at qmakePath is qt4 (used by QtVersion) static QString qtVersionForQMake(const QString &qmakePath); + static bool checkMinimumQtVersion(const QString &qtversionString, int majorVersion, int minorVersion, int patchVersion); // returns something like qmake4, qmake, qmake-qt4 or whatever distributions have chosen (used by QtVersion) static QStringList possibleQMakeCommands(); diff --git a/src/plugins/qt4projectmanager/qmldumptool.cpp b/src/plugins/qt4projectmanager/qmldumptool.cpp index 210c0182fda..5d11f0dec9b 100644 --- a/src/plugins/qt4projectmanager/qmldumptool.cpp +++ b/src/plugins/qt4projectmanager/qmldumptool.cpp @@ -50,10 +50,9 @@ static inline QStringList validBinaryFilenames() << QLatin1String("qmldump.app/Contents/MacOS/qmldump"); } -bool QmlDumpTool::canBuild(const QString &installHeadersDir) +bool QmlDumpTool::canBuild(QtVersion *qtVersion) { - QString qDeclHeader = installHeadersDir + QLatin1String("/QtDeclarative/private/qdeclarativemetatype_p.h"); - return QFile::exists(qDeclHeader); + return checkMinimumQtVersion(qtVersion->qtVersionString(), 4, 7, 0); } QString QmlDumpTool::toolForProject(ProjectExplorer::Project *project) diff --git a/src/plugins/qt4projectmanager/qmldumptool.h b/src/plugins/qt4projectmanager/qmldumptool.h index 4c54838b6f1..dc991478077 100644 --- a/src/plugins/qt4projectmanager/qmldumptool.h +++ b/src/plugins/qt4projectmanager/qmldumptool.h @@ -42,11 +42,12 @@ namespace ProjectExplorer { } namespace Qt4ProjectManager { +class QtVersion; class QT4PROJECTMANAGER_EXPORT QmlDumpTool : public Utils::BuildableHelperLibrary { public: - static bool canBuild(const QString &installHeadersDir); + static bool canBuild(QtVersion *qtVersion); static QString toolForProject(ProjectExplorer::Project *project); static QString toolByInstallData(const QString &qtInstallData); static QStringList locationsByInstallData(const QString &qtInstallData); diff --git a/src/plugins/qt4projectmanager/qmlobservertool.cpp b/src/plugins/qt4projectmanager/qmlobservertool.cpp index 3a64da2ed7a..7b556f2a313 100644 --- a/src/plugins/qt4projectmanager/qmlobservertool.cpp +++ b/src/plugins/qt4projectmanager/qmlobservertool.cpp @@ -32,6 +32,7 @@ #include "qt4project.h" #include "qt4projectmanagerconstants.h" #include +#include #include #include @@ -50,10 +51,9 @@ static inline QStringList validBinaryFilenames() << QLatin1String("QMLObserver.app/Contents/MacOS/QMLObserver"); } -bool QmlObserverTool::canBuild(const QString &installHeadersDir) +bool QmlObserverTool::canBuild(QtVersion *qtVersion) { - QString qDeclHeader = installHeadersDir + QLatin1String("/QtDeclarative/private/qdeclarativemetatype_p.h"); - return QFile::exists(qDeclHeader); + return checkMinimumQtVersion(qtVersion->qtVersionString(), 4, 7, 1); } QString QmlObserverTool::toolForProject(ProjectExplorer::Project *project) diff --git a/src/plugins/qt4projectmanager/qmlobservertool.h b/src/plugins/qt4projectmanager/qmlobservertool.h index 625e625c760..89cbca67460 100644 --- a/src/plugins/qt4projectmanager/qmlobservertool.h +++ b/src/plugins/qt4projectmanager/qmlobservertool.h @@ -43,10 +43,12 @@ namespace ProjectExplorer { namespace Qt4ProjectManager { +class QtVersion; + class QT4PROJECTMANAGER_EXPORT QmlObserverTool : public Utils::BuildableHelperLibrary { public: - static bool canBuild(const QString &installHeadersDir); + static bool canBuild(QtVersion *qtVersion); static QString toolForProject(ProjectExplorer::Project *project); static QString toolByInstallData(const QString &qtInstallData); static QStringList locationsByInstallData(const QString &qtInstallData); diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp index b6edfbfb149..283f52ba44e 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.cpp +++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp @@ -1770,7 +1770,7 @@ QString QtVersion::buildDebuggingHelperLibrary(QFutureInterface &future) } future.setProgressValue(2); - if (QmlDumpTool::canBuild(qtInstallHeaders)) { + if (QmlDumpTool::canBuild(this)) { QString toolDirectory = QmlDumpTool::copy(qtInstallData, &output); if (!toolDirectory.isEmpty()) { output += QmlDumpTool::build(toolDirectory, tc->makeCommand(), @@ -1782,7 +1782,7 @@ QString QtVersion::buildDebuggingHelperLibrary(QFutureInterface &future) } future.setProgressValue(3); - if (QmlObserverTool::canBuild(qtInstallHeaders)) { + if (QmlObserverTool::canBuild(this)) { QString toolDirectory = QmlObserverTool::copy(qtInstallData, &output); if (!toolDirectory.isEmpty()) { output += QmlObserverTool::build(toolDirectory, tc->makeCommand(), From 36709fd20f42dde071456417bc1b9e5138cb72c0 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 30 Sep 2010 12:15:08 +0200 Subject: [PATCH 033/118] Debugger[CDB]: Do not kill debuggee when aborting attach to running. Reviewed-by: hjk --- src/plugins/debugger/cdb/cdbengine.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index 1fc7817e474..8fff78742c6 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -563,6 +563,8 @@ void CdbEngine::processTerminated(unsigned long exitCode) bool CdbEnginePrivate::endInferior(bool detachOnly, QString *errorMessage) { + if (debugCDBExecution) + qDebug("endInferior detach=%d, %s", detachOnly, DebuggerEngine::stateName(m_engine->state())); // Are we running switch (m_engine->state()) { case InferiorRunRequested: @@ -572,6 +574,7 @@ bool CdbEnginePrivate::endInferior(bool detachOnly, QString *errorMessage) case InferiorStopOk: case InferiorStopFailed: case InferiorShutdownRequested: + case EngineShutdownRequested: // Forwarded when choosing 'Abort...' an attached process. break; default: return true; From 44d87bf85d844c626fd84171734f1b109714a8e5 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 30 Sep 2010 12:16:41 +0200 Subject: [PATCH 034/118] Debugger [gdb/win]: Use calloc instead of malloc for QObject-properties Avoid symbol clash with QVector::malloc. Display at least property count. Reviewed-by: hjk --- share/qtcreator/gdbmacros/dumper.py | 3 ++- share/qtcreator/gdbmacros/gdbmacros.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py index 4d7ef4553a8..b60b5df341b 100644 --- a/share/qtcreator/gdbmacros/dumper.py +++ b/share/qtcreator/gdbmacros/dumper.py @@ -693,7 +693,8 @@ def makeValue(type, init): type = stripClassTag(type) if type.find(":") >= 0: type = "'" + type + "'" - gdb.execute("set $d = (%s*)malloc(sizeof(%s))" % (type, type)) + # Avoid malloc symbol clash with QVector + gdb.execute("set $d = (%s*)calloc(sizeof(%s), 1)" % (type, type)) gdb.execute("set *$d = {%s}" % init) value = parseAndEvaluate("$d").dereference() #warn(" TYPE: %s" % value.type) diff --git a/share/qtcreator/gdbmacros/gdbmacros.py b/share/qtcreator/gdbmacros/gdbmacros.py index b3b284e4bdd..e3574f5325a 100644 --- a/share/qtcreator/gdbmacros/gdbmacros.py +++ b/share/qtcreator/gdbmacros/gdbmacros.py @@ -723,7 +723,8 @@ def qdump__QObject(d, item): if d.isExpandedIName(item.iname + ".properties"): # FIXME: Make this global. Don't leak. variant = "'%sQVariant'" % d.ns - gdb.execute("set $d = (%s*)malloc(sizeof(%s))" % (variant, variant)) + # Avoid malloc symbol clash with QVector + gdb.execute("set $d = (%s*)calloc(sizeof(%s), 1)" % (variant, variant)) gdb.execute("set $d.d.is_shared = 0") with Children(d, [propertyCount, 500]): From 3ebc3284989022924c400fdb69213f3d41a1e05d Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Thu, 30 Sep 2010 12:09:38 +0200 Subject: [PATCH 035/118] C++: added quickfix to insert a method definition. Reviewed-by: Christian Kamm --- src/libs/cplusplus/cplusplus-lib.pri | 6 +- src/plugins/cppeditor/cppeditor.pro | 2 - src/plugins/cppeditor/cppinsertdecldef.cpp | 232 ++++++------------ src/plugins/cppeditor/cppinsertdecldef.h | 5 - src/plugins/cppeditor/cppquickfix.cpp | 3 +- src/plugins/cppeditor/cppquickfix.h | 8 +- src/plugins/cppeditor/cppquickfixes.cpp | 1 + .../cpprefactoringchanges.cpp | 2 +- .../cpprefactoringchanges.h | 10 +- src/plugins/cpptools/cpptools.pro | 8 +- .../cpptools/insertionpointlocator.cpp} | 40 ++- .../cpptools/insertionpointlocator.h} | 31 ++- src/plugins/designer/qtcreatorintegration.cpp | 10 +- 13 files changed, 159 insertions(+), 199 deletions(-) rename src/plugins/{cppeditor => cpptools}/cpprefactoringchanges.cpp (99%) rename src/plugins/{cppeditor => cpptools}/cpprefactoringchanges.h (92%) rename src/{libs/cplusplus/InsertionPointLocator.cpp => plugins/cpptools/insertionpointlocator.cpp} (85%) rename src/{libs/cplusplus/InsertionPointLocator.h => plugins/cpptools/insertionpointlocator.h} (75%) diff --git a/src/libs/cplusplus/cplusplus-lib.pri b/src/libs/cplusplus/cplusplus-lib.pri index 5d0266c2af2..2a718d5712b 100644 --- a/src/libs/cplusplus/cplusplus-lib.pri +++ b/src/libs/cplusplus/cplusplus-lib.pri @@ -48,8 +48,7 @@ HEADERS += \ $$PWD/pp-cctype.h \ $$PWD/pp-engine.h \ $$PWD/pp-macro-expander.h \ - $$PWD/pp-scanner.h \ - $$PWD/InsertionPointLocator.h + $$PWD/pp-scanner.h SOURCES += \ $$PWD/SimpleLexer.cpp \ @@ -73,7 +72,6 @@ SOURCES += \ $$PWD/Macro.cpp \ $$PWD/pp-engine.cpp \ $$PWD/pp-macro-expander.cpp \ - $$PWD/pp-scanner.cpp \ - $$PWD/InsertionPointLocator.cpp + $$PWD/pp-scanner.cpp RESOURCES += $$PWD/cplusplus.qrc diff --git a/src/plugins/cppeditor/cppeditor.pro b/src/plugins/cppeditor/cppeditor.pro index 0e86ffeb8e8..57767721ec4 100644 --- a/src/plugins/cppeditor/cppeditor.pro +++ b/src/plugins/cppeditor/cppeditor.pro @@ -15,7 +15,6 @@ HEADERS += cppplugin.h \ cppeditor_global.h \ cppclasswizard.h \ cppquickfix.h \ - cpprefactoringchanges.h \ cppchecksymbols.h \ cppsemanticinfo.h \ cppoutline.h \ @@ -31,7 +30,6 @@ SOURCES += cppplugin.cpp \ cppclasswizard.cpp \ cppquickfix.cpp \ cppquickfixes.cpp \ - cpprefactoringchanges.cpp \ cppchecksymbols.cpp \ cppsemanticinfo.cpp \ cppoutline.cpp \ diff --git a/src/plugins/cppeditor/cppinsertdecldef.cpp b/src/plugins/cppeditor/cppinsertdecldef.cpp index 2d51b5849e5..7cae3a74794 100644 --- a/src/plugins/cppeditor/cppinsertdecldef.cpp +++ b/src/plugins/cppeditor/cppinsertdecldef.cpp @@ -36,9 +36,10 @@ #include #include #include -#include +#include #include #include +#include #include @@ -47,8 +48,6 @@ using namespace CppEditor; using namespace CppEditor::Internal; using namespace CppTools; -using CppEditor::CppRefactoringChanges; - namespace { class InsertDeclOperation: public CppQuickFixOperation @@ -81,9 +80,7 @@ public: void performChanges(CppRefactoringFile *, CppRefactoringChanges *refactoring) { - Snapshot snapshot = state().snapshot(); - snapshot.insert(refactoring->file(m_targetFileName).cppDocument()); - InsertionPointLocator locator(snapshot); + InsertionPointLocator locator(refactoring); const InsertionLocation loc = locator.methodDeclarationInClass( m_targetFileName, m_targetSymbol, m_xsSpec); Q_ASSERT(loc.isValid()); @@ -211,170 +208,97 @@ QString DeclFromDef::generateDeclaration(const CppQuickFixState &, namespace { -static inline bool hasFunctionType(DeclarationAST *decl) +class InsertDefOperation: public CppQuickFixOperation { - if (decl->asFunctionDefinition()) - return true; - - if (SimpleDeclarationAST *ast = decl->asSimpleDeclaration()) - if (ast->symbols && ast->symbols->value && !ast->symbols->next) - if (Declaration *decl = ast->symbols->value->asDeclaration()) - if (FullySpecifiedType ty = decl->type()) - return ty->asFunctionType(); - - return false; -} - -static QPair findSurroundingDeclarations( - DeclarationListAST *members, - DeclarationAST *decl) -{ - bool found = false; - DeclarationAST *last = 0, *next = 0, *prev = 0; - DeclarationListAST *iter = members; - for (; iter; iter = iter->next) { - DeclarationAST *value = iter->value; - if (value == decl) { - prev = last; - found = true; - } else if (hasFunctionType(value)) { - if (found) { - next = value; - break; - } else { - last = value; - } - } +public: + InsertDefOperation(const CppQuickFixState &state, int priority, + Declaration *decl, const InsertionLocation &loc) + : CppQuickFixOperation(state, priority) + , m_decl(decl) + , m_loc(loc) + { + setDescription(QCoreApplication::tr("Add definition in %1", + "CppEditor::DefFromDecl") + .arg(m_loc.fileName())); } - return qMakePair(prev, next); -} + void performChanges(CppRefactoringFile *, + CppRefactoringChanges *refactoring) + { + Q_ASSERT(m_loc.isValid()); + + CppRefactoringFile targetFile = refactoring->file(m_loc.fileName()); + + Overview oo; + oo.setShowFunctionSignatures(true); + oo.setShowReturnTypes(true); + oo.setShowArgumentNames(true); + + //-- + SubstitutionEnvironment env; + env.setContext(state().context()); + env.switchScope(m_decl->enclosingScope()); + UseQualifiedNames q; + env.enter(&q); + + Control *control = state().context().control().data(); + FullySpecifiedType tn = rewriteType(m_decl->type(), &env, control); + QString name = oo(LookupContext::fullyQualifiedName(m_decl)); + //-- + + QString defText = oo.prettyType(tn, name) + "\n{\n}"; + + int targetPos = targetFile.position(m_loc.line(), m_loc.column()); + int targetPos2 = qMax(0, targetFile.position(m_loc.line(), 1) - 1); + + Utils::ChangeSet target; + target.insert(targetPos, m_loc.prefix() + defText + m_loc.suffix()); + targetFile.change(target); + targetFile.indent(Utils::ChangeSet::Range(targetPos2, targetPos)); + + const int prefixLineCount = m_loc.prefix().count(QLatin1Char('\n')); + refactoring->activateEditor(m_loc.fileName(), + m_loc.line() + prefixLineCount, + 0); + } + +private: + Declaration *m_decl; + InsertionLocation m_loc; +}; } // anonymous namespace QList DefFromDecl::match(const CppQuickFixState &state) { -#if 0 - qDebug() << Q_FUNC_INFO; - const QList &path = state.path(); const CppRefactoringFile &file = state.currentFile(); - DeclaratorAST *declAST = 0; - ClassSpecifierAST *classSpec = 0; int idx = path.size() - 1; for (; idx >= 0; --idx) { AST *node = path.at(idx); - if (ClassSpecifierAST *clazz = node->asClassSpecifier()) { - classSpec = clazz; - continue; + if (SimpleDeclarationAST *simpleDecl = node->asSimpleDeclaration()) { + if (simpleDecl->symbols && ! simpleDecl->symbols->next) { + if (Symbol *symbol = simpleDecl->symbols->value) { + if (Declaration *decl = symbol->asDeclaration()) { + if (decl->type()->isFunctionType() && decl->enclosingScope() && decl->enclosingScope()->isClass()) { + DeclaratorAST *declarator = simpleDecl->declarator_list->value; + if (file.isCursorOn(declarator->core_declarator)) { + CppRefactoringChanges refactoring(state.snapshot()); + InsertionPointLocator locator(&refactoring); + QList results; + foreach (const InsertionLocation &loc, locator.methodDefinition(decl)) + results.append(CppQuickFixOperation::Ptr(new InsertDefOperation(state, idx, decl, loc))); + return results; + } + } + } + } + } + + break; } - - if (idx <= 1) continue; - DeclaratorIdAST *declId = node->asDeclaratorId(); - if (!declId) continue; - - if (!file.isCursorOn(declId)) continue; - - DeclaratorAST *candidate = path.at(idx - 1)->asDeclarator(); - if (!candidate) continue; - if (!candidate->postfix_declarator_list) continue; - if (!candidate->postfix_declarator_list->value) continue; - if (candidate->postfix_declarator_list->next) continue; - FunctionDeclaratorAST *funDecl = candidate->postfix_declarator_list->value->asFunctionDeclarator(); - if (!funDecl) continue; - if (funDecl->symbol->asFunctionType()) - declAST = candidate; } - if (!declAST || !classSpec || !classSpec->symbol) - return noResult(); - - if (!declAST->symbols || !declAST->symbols->value || declAST->symbols->next) - return noResult(); - - Declaration *decl = declAST->symbols->value->asDeclaration(); - if (!decl) - return noResult(); - - Function *funTy = decl->type()->asFunctionType(); - if (!funTy) - return noResult(); - - qDebug() << "-> Found funTy."; - - QPair surroundingNodes = - findSurroundingDeclarations(classSpec->member_specifier_list, declAST); - qDebug() << "->("<asSimpleDeclaration()) - qDebug()<<"-->prev@"<symbols->value->line()<symbols->value->column(); - if (surroundingNodes.second) - if (SimpleDeclarationAST *sd=surroundingNodes.second->asSimpleDeclaration()) - qDebug()<<"-->next@"<symbols->value->line()<symbols->value->column(); -#endif -// if (ClassOrNamespace *targetBinding = state.context().lookupParent(method)) { -// foreach (Symbol *s, targetBinding->symbols()) { -// if (Class *clazz = s->asClass()) { -// QList results; -// const QLatin1String fn(clazz->fileName()); -// const QString decl = generateDeclaration(state, -// method, -// targetBinding); -// results.append( -// singleResult( -// new InsertDeclOperation(state, idx, fn, clazz, -// InsertionPointLocator::Public, -// decl))); -// results.append( -// singleResult( -// new InsertDeclOperation(state, idx, fn, clazz, -// InsertionPointLocator::Protected, -// decl))); -// results.append( -// singleResult( -// new InsertDeclOperation(state, idx, fn, clazz, -// InsertionPointLocator::Private, -// decl))); -// results.append( -// singleResult( -// new InsertDeclOperation(state, idx, fn, clazz, -// InsertionPointLocator::PublicSlot, -// decl))); -// results.append( -// singleResult( -// new InsertDeclOperation(state, idx, fn, clazz, -// InsertionPointLocator::ProtectedSlot, -// decl))); -// results.append( -// singleResult( -// new InsertDeclOperation(state, idx, fn, clazz, -// InsertionPointLocator::PrivateSlot, -// decl))); -// return results; -// } //! \todo support insertion into namespaces -// } -// } - - Q_UNUSED(findSurroundingDeclarations) - Q_UNUSED(state) return noResult(); } - -QString DefFromDecl::generateDefinition(const CppQuickFixState &, - Function *method, - ClassOrNamespace *targetBinding) -{ - Q_UNUSED(targetBinding); - - Overview oo; - oo.setShowFunctionSignatures(true); - oo.setShowReturnTypes(true); - oo.setShowArgumentNames(true); - - QString decl; - decl += oo(method->type(), method->unqualifiedName()); - decl += QLatin1String(";\n"); - - return decl; -} diff --git a/src/plugins/cppeditor/cppinsertdecldef.h b/src/plugins/cppeditor/cppinsertdecldef.h index c56c17331cb..0b7f2ff51c5 100644 --- a/src/plugins/cppeditor/cppinsertdecldef.h +++ b/src/plugins/cppeditor/cppinsertdecldef.h @@ -56,11 +56,6 @@ class DefFromDecl: public CppQuickFixFactory { public: virtual QList match(const CppQuickFixState &state); - -protected: - static QString generateDefinition(const CppQuickFixState &state, - CPlusPlus::Function *method, - CPlusPlus::ClassOrNamespace *targetBinding); }; } // namespace Internal diff --git a/src/plugins/cppeditor/cppquickfix.cpp b/src/plugins/cppeditor/cppquickfix.cpp index eb5dce7a114..a0ce66a1ce9 100644 --- a/src/plugins/cppeditor/cppquickfix.cpp +++ b/src/plugins/cppeditor/cppquickfix.cpp @@ -43,7 +43,7 @@ #include #include -#include +#include #include #include #include @@ -52,6 +52,7 @@ using namespace CppEditor; using namespace CppEditor::Internal; +using namespace CppTools; using namespace TextEditor; using namespace CPlusPlus; using namespace Utils; diff --git a/src/plugins/cppeditor/cppquickfix.h b/src/plugins/cppeditor/cppquickfix.h index 45cf0e86ac6..a261297f5be 100644 --- a/src/plugins/cppeditor/cppquickfix.h +++ b/src/plugins/cppeditor/cppquickfix.h @@ -30,11 +30,12 @@ #ifndef CPPQUICKFIX_H #define CPPQUICKFIX_H -#include "cpprefactoringchanges.h" +#include "cppeditor_global.h" #include "cppsemanticinfo.h" #include #include +#include #include #include #include @@ -69,7 +70,7 @@ public: CppEditor::Internal::SemanticInfo semanticInfo() const; const CPlusPlus::LookupContext &context() const; - const CppRefactoringFile currentFile() const; + const CppTools::CppRefactoringFile currentFile() const; bool isCursorOn(unsigned tokenIndex) const { return currentFile().isCursorOn(tokenIndex); } @@ -94,7 +95,8 @@ public: virtual void perform(); protected: - virtual void performChanges(CppRefactoringFile *currentFile, CppRefactoringChanges *refactoring) = 0; + virtual void performChanges(CppTools::CppRefactoringFile *currentFile, + CppTools::CppRefactoringChanges *refactoring) = 0; QString fileName() const; diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp index c2f648a6cec..509fb1caa08 100644 --- a/src/plugins/cppeditor/cppquickfixes.cpp +++ b/src/plugins/cppeditor/cppquickfixes.cpp @@ -58,6 +58,7 @@ using namespace CppEditor; using namespace CppEditor::Internal; +using namespace CppTools; using namespace TextEditor; using namespace CPlusPlus; using namespace Utils; diff --git a/src/plugins/cppeditor/cpprefactoringchanges.cpp b/src/plugins/cpptools/cpprefactoringchanges.cpp similarity index 99% rename from src/plugins/cppeditor/cpprefactoringchanges.cpp rename to src/plugins/cpptools/cpprefactoringchanges.cpp index cac384bf337..b320b578b52 100644 --- a/src/plugins/cppeditor/cpprefactoringchanges.cpp +++ b/src/plugins/cpptools/cpprefactoringchanges.cpp @@ -37,8 +37,8 @@ #include -using namespace CppEditor; using namespace CPlusPlus; +using namespace CppTools; using namespace Utils; CppRefactoringChanges::CppRefactoringChanges(const Snapshot &snapshot) diff --git a/src/plugins/cppeditor/cpprefactoringchanges.h b/src/plugins/cpptools/cpprefactoringchanges.h similarity index 92% rename from src/plugins/cppeditor/cpprefactoringchanges.h rename to src/plugins/cpptools/cpprefactoringchanges.h index cb2f83c7cc5..2a0e20bf787 100644 --- a/src/plugins/cppeditor/cpprefactoringchanges.h +++ b/src/plugins/cpptools/cpprefactoringchanges.h @@ -35,15 +35,15 @@ #include #include -#include +#include #include -namespace CppEditor { +namespace CppTools { class CppRefactoringChanges; -class CPPEDITOR_EXPORT CppRefactoringFile: public TextEditor::RefactoringFile +class CPPTOOLS_EXPORT CppRefactoringFile: public TextEditor::RefactoringFile { public: CppRefactoringFile(); @@ -79,7 +79,7 @@ private: mutable CPlusPlus::Document::Ptr m_cppDocument; }; -class CPPEDITOR_EXPORT CppRefactoringChanges: public TextEditor::RefactoringChanges +class CPPTOOLS_EXPORT CppRefactoringChanges: public TextEditor::RefactoringChanges { public: CppRefactoringChanges(const CPlusPlus::Snapshot &snapshot); @@ -99,6 +99,6 @@ private: CppTools::CppModelManagerInterface::WorkingCopy m_workingCopy; }; -} // namespace CppEditor +} // namespace CppTools #endif // CPPREFACTORINGCHANGES_H diff --git a/src/plugins/cpptools/cpptools.pro b/src/plugins/cpptools/cpptools.pro index 346d10f86c8..8062333db7c 100644 --- a/src/plugins/cpptools/cpptools.pro +++ b/src/plugins/cpptools/cpptools.pro @@ -25,7 +25,9 @@ HEADERS += completionsettingspage.h \ cppfilesettingspage.h \ cppfindreferences.h \ cppcodeformatter.h \ - symbolsfindfilter.h + symbolsfindfilter.h \ + insertionpointlocator.h \ + cpprefactoringchanges.h SOURCES += completionsettingspage.cpp \ cppclassesfilter.cpp \ @@ -42,7 +44,9 @@ SOURCES += completionsettingspage.cpp \ abstracteditorsupport.cpp \ cppfindreferences.cpp \ cppcodeformatter.cpp \ - symbolsfindfilter.cpp + symbolsfindfilter.cpp \ + insertionpointlocator.cpp \ + cpprefactoringchanges.cpp FORMS += completionsettingspage.ui \ cppfilesettingspage.ui diff --git a/src/libs/cplusplus/InsertionPointLocator.cpp b/src/plugins/cpptools/insertionpointlocator.cpp similarity index 85% rename from src/libs/cplusplus/InsertionPointLocator.cpp rename to src/plugins/cpptools/insertionpointlocator.cpp index c031e9322d9..24f66ea66fc 100644 --- a/src/libs/cplusplus/InsertionPointLocator.cpp +++ b/src/plugins/cpptools/insertionpointlocator.cpp @@ -27,6 +27,8 @@ ** **************************************************************************/ +#include "CppToolsPlugin.h" +#include "cpprefactoringchanges.h" #include "InsertionPointLocator.h" #include @@ -34,6 +36,7 @@ #include using namespace CPlusPlus; +using namespace CppTools; namespace { @@ -150,7 +153,8 @@ protected: if (needsSuffix) suffix = QLatin1Char('\n'); - _result = InsertionLocation(prefix, suffix, line, column); + _result = InsertionLocation(_doc->fileName(), prefix, suffix, + line, column); return false; } @@ -264,16 +268,19 @@ InsertionLocation::InsertionLocation() , m_column(0) {} -InsertionLocation::InsertionLocation(const QString &prefix, const QString &suffix, +InsertionLocation::InsertionLocation(const QString &fileName, + const QString &prefix, + const QString &suffix, unsigned line, unsigned column) - : m_prefix(prefix) + : m_fileName(fileName) + , m_prefix(prefix) , m_suffix(suffix) , m_line(line) , m_column(column) {} -InsertionPointLocator::InsertionPointLocator(const Snapshot &snapshot) - : m_snapshot(snapshot) +InsertionPointLocator::InsertionPointLocator(CppRefactoringChanges *refactoringChanges) + : m_refactoringChanges(refactoringChanges) { } @@ -282,7 +289,7 @@ InsertionLocation InsertionPointLocator::methodDeclarationInClass( const Class *clazz, AccessSpec xsSpec) const { - const Document::Ptr doc = m_snapshot.document(fileName); + const Document::Ptr doc = m_refactoringChanges->file(fileName).cppDocument(); if (doc) { FindInClass find(doc, clazz, xsSpec); return find(); @@ -293,11 +300,30 @@ InsertionLocation InsertionPointLocator::methodDeclarationInClass( /// Currently, we return the end of fileName.cpp QList InsertionPointLocator::methodDefinition( - const QString &/*fileName*/) const + Declaration *declaration) const { QList result; + if (!declaration) + return result; + Internal::CppToolsPlugin *cpptools = Internal::CppToolsPlugin::instance(); + const QString declFileName = QLatin1String(declaration->fileName()); + QString target = cpptools->correspondingHeaderOrSource(declFileName); + Document::Ptr doc = m_refactoringChanges->file(target).cppDocument(); + if (doc.isNull()) + return result; + + TranslationUnit *xUnit = doc->translationUnit(); + unsigned tokenCount = xUnit->tokenCount(); + if (tokenCount < 2) // no tokens available + return result; + + unsigned line = 0, column = 0; + xUnit->getTokenEndPosition(xUnit->tokenCount() - 2, &line, &column); + + const QLatin1String prefix("\n\n"); + result.append(InsertionLocation(target, prefix, QString(), line, column)); return result; } diff --git a/src/libs/cplusplus/InsertionPointLocator.h b/src/plugins/cpptools/insertionpointlocator.h similarity index 75% rename from src/libs/cplusplus/InsertionPointLocator.h rename to src/plugins/cpptools/insertionpointlocator.h index 5436d36eb60..3124a528f92 100644 --- a/src/libs/cplusplus/InsertionPointLocator.h +++ b/src/plugins/cpptools/insertionpointlocator.h @@ -30,19 +30,27 @@ #ifndef INSERTIONPOINTLOCATOR_H #define INSERTIONPOINTLOCATOR_H +#include "cpptools_global.h" + #include #include #include -#include "CppDocument.h" +#include -namespace CPlusPlus { +namespace CppTools { -class CPLUSPLUS_EXPORT InsertionLocation +class CppRefactoringChanges; + +class CPPTOOLS_EXPORT InsertionLocation { public: InsertionLocation(); - InsertionLocation(const QString &prefix, const QString &suffix, unsigned line, unsigned column); + InsertionLocation(const QString &fileName, const QString &prefix, + const QString &suffix, unsigned line, unsigned column); + + QString fileName() const + { return m_fileName; } /// \returns The prefix to insert before any other text. QString prefix() const @@ -61,16 +69,17 @@ public: { return m_column; } bool isValid() const - { return m_line > 0 && m_column > 0; } + { return !m_fileName.isEmpty() && m_line > 0 && m_column > 0; } private: + QString m_fileName; QString m_prefix; QString m_suffix; unsigned m_line; unsigned m_column; }; -class CPLUSPLUS_EXPORT InsertionPointLocator +class CPPTOOLS_EXPORT InsertionPointLocator { public: enum AccessSpec { @@ -89,18 +98,18 @@ public: }; public: - InsertionPointLocator(const Snapshot &snapshot); + InsertionPointLocator(CppRefactoringChanges *refactoringChanges); InsertionLocation methodDeclarationInClass(const QString &fileName, - const Class *clazz, + const CPlusPlus::Class *clazz, AccessSpec xsSpec) const; - QList methodDefinition(const QString &fileName) const; + QList methodDefinition(CPlusPlus::Declaration *declaration) const; private: - Snapshot m_snapshot; + CppRefactoringChanges *m_refactoringChanges; }; -} // namespace CPlusPlus +} // namespace CppTools #endif // INSERTIONPOINTLOCATOR_H diff --git a/src/plugins/designer/qtcreatorintegration.cpp b/src/plugins/designer/qtcreatorintegration.cpp index 4b741898ecb..d05f9b12226 100644 --- a/src/plugins/designer/qtcreatorintegration.cpp +++ b/src/plugins/designer/qtcreatorintegration.cpp @@ -37,8 +37,9 @@ #include #include +#include #include -#include +#include #include #include #include @@ -282,9 +283,10 @@ static void addDeclaration(const Snapshot &snapshot, declaration += functionName; declaration += QLatin1String(";\n"); - InsertionPointLocator find(snapshot); - const InsertionLocation loc = find.methodDeclarationInClass( - fileName, cl, InsertionPointLocator::PrivateSlot); + CppTools::CppRefactoringChanges refactoring(snapshot); + CppTools::InsertionPointLocator find(&refactoring); + const CppTools::InsertionLocation loc = find.methodDeclarationInClass( + fileName, cl, CppTools::InsertionPointLocator::PrivateSlot); // //! \todo change this to use the Refactoring changes. From ca74c8183fc633318f29ec490eee2dbf9fe03300 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 30 Sep 2010 12:27:20 +0200 Subject: [PATCH 036/118] rename changes-2.1 -> changes-2.1.0 --- dist/{changes-2.1 => changes-2.1.0} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename dist/{changes-2.1 => changes-2.1.0} (100%) diff --git a/dist/changes-2.1 b/dist/changes-2.1.0 similarity index 100% rename from dist/changes-2.1 rename to dist/changes-2.1.0 From 53f3e4eed5249ef45e8551a8ebfee71239727013 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 29 Sep 2010 17:04:05 +0200 Subject: [PATCH 037/118] UI text - Fix capitalization on Welcome screen Reviewed-by: Daniel Molkentin --- .../gettingstartedwelcomepagewidget.ui | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/plugins/qt4projectmanager/gettingstartedwelcomepagewidget.ui b/src/plugins/qt4projectmanager/gettingstartedwelcomepagewidget.ui index f133869c2f4..bb3ecebd462 100644 --- a/src/plugins/qt4projectmanager/gettingstartedwelcomepagewidget.ui +++ b/src/plugins/qt4projectmanager/gettingstartedwelcomepagewidget.ui @@ -269,7 +269,7 @@ - Explore Qt C++ Examples + Explore Qt C++ examples: @@ -291,14 +291,14 @@ - Examples not installed... + Examples Not Installed... - Explore Qt Quick Examples + Explore Qt Quick examples: @@ -320,14 +320,14 @@ - Examples not installed... + Examples Not Installed... - Explore Qt C++ Mobile Examples + Explore Qt C++ mobile examples: @@ -349,7 +349,7 @@ - Examples not installed... + Examples Not Installed... From be25ddb0bc545cf9fd97f8dc72b38e01834e640e Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 29 Sep 2010 17:37:02 +0200 Subject: [PATCH 038/118] Doc - Update screen shots of the Welcome screen --- doc/images/qtcreator-breakdown.png | Bin 95053 -> 122036 bytes .../qtcreator-gs-build-example-open.png | Bin 63036 -> 86154 bytes doc/images/qtcreator-welcome-session.png | Bin 40197 -> 77918 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/images/qtcreator-breakdown.png b/doc/images/qtcreator-breakdown.png index 3a8bde3ded32e8c82f915df182e4d1658d818de4..d1aed6228d580aa4a09050ee235f56e1dd963602 100644 GIT binary patch literal 122036 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

a-IJ+Z`Q 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 My85}Sb4q9e0ER+G?EnA( literal 95053 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 j#K6EHD|TTS0|NtRfk$L90|Va?5N4dJ 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 literal 40197 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

R_vsbU3 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 AT>t<8 From 4caeb6dbd445093eaec2e4383399f3b1f14d3579 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 30 Sep 2010 11:09:42 +0200 Subject: [PATCH 039/118] Doc - Using namespaces in class names Task-number: QTCREATORBUG-2493 Reviewed-by: Erik Verbruggen --- doc/images/qtcreator-cpp-class-wizard.png | Bin 0 -> 33455 bytes doc/qtcreator.qdoc | 59 ++++++++++++++++------ 2 files changed, 43 insertions(+), 16 deletions(-) create mode 100644 doc/images/qtcreator-cpp-class-wizard.png diff --git a/doc/images/qtcreator-cpp-class-wizard.png b/doc/images/qtcreator-cpp-class-wizard.png new file mode 100644 index 0000000000000000000000000000000000000000..6b3483f0e9e4f8363d59d0cb34c9a4194ac787a9 GIT binary patch literal 33455 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 Date: Thu, 30 Sep 2010 12:40:03 +0200 Subject: [PATCH 040/118] C++: Added release note about semantic highlighting and Qt 4.7.0 --- dist/changes-2.1.0 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dist/changes-2.1.0 b/dist/changes-2.1.0 index b4fd82af8aa..5743bc05ee7 100644 --- a/dist/changes-2.1.0 +++ b/dist/changes-2.1.0 @@ -15,6 +15,8 @@ Editing C++ Support * Add new %FILENAME%, %CLASS% placeholders to license template + * Semantic (type) highlighting is disabled when compiling against Qt 4.7.0 + * for performance reasons. For full highlighting, use 4.7.1 or later. Project Support * Add option for adding subprojects to projects in the New wizard From a51025016f96e42ba453d2cde949699490dd3805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Thu, 30 Sep 2010 13:46:59 +0200 Subject: [PATCH 041/118] Mention the semantic highlighting as an addition --- dist/changes-2.1.0 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dist/changes-2.1.0 b/dist/changes-2.1.0 index 5743bc05ee7..41d204e81d8 100644 --- a/dist/changes-2.1.0 +++ b/dist/changes-2.1.0 @@ -14,15 +14,16 @@ General Editing C++ Support + * Added semantic highlighting of types, virtual methods, locals, statics and + member variables (only enabled when running against Qt 4.7.1 and up, for + performance reasons) * Add new %FILENAME%, %CLASS% placeholders to license template - * Semantic (type) highlighting is disabled when compiling against Qt 4.7.0 - * for performance reasons. For full highlighting, use 4.7.1 or later. Project Support * Add option for adding subprojects to projects in the New wizard * Add context-menu command for removing subprojects in the Edit mode, Projects view - * Add a wizard for adding other than Qt libraries to project files + * Add a wizard for adding other than Qt libraries to project files Debugging * Fix console debugging with MinGW/gdb From 9248e2cf4610af517ff405d53620e5fd3e21467a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Thu, 30 Sep 2010 14:00:43 +0200 Subject: [PATCH 042/118] Fixed compile on case-sensitive file systems --- src/plugins/cppeditor/cppinsertdecldef.cpp | 2 +- src/plugins/cpptools/insertionpointlocator.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/cppeditor/cppinsertdecldef.cpp b/src/plugins/cppeditor/cppinsertdecldef.cpp index 7cae3a74794..66bbdfd6919 100644 --- a/src/plugins/cppeditor/cppinsertdecldef.cpp +++ b/src/plugins/cppeditor/cppinsertdecldef.cpp @@ -39,7 +39,7 @@ #include #include #include -#include +#include #include diff --git a/src/plugins/cpptools/insertionpointlocator.cpp b/src/plugins/cpptools/insertionpointlocator.cpp index 24f66ea66fc..f1594b98604 100644 --- a/src/plugins/cpptools/insertionpointlocator.cpp +++ b/src/plugins/cpptools/insertionpointlocator.cpp @@ -27,9 +27,9 @@ ** **************************************************************************/ -#include "CppToolsPlugin.h" +#include "cpptoolsplugin.h" #include "cpprefactoringchanges.h" -#include "InsertionPointLocator.h" +#include "insertionpointlocator.h" #include #include From cb99adfb0d2b15b5472a01e844b5b4c9019c2d41 Mon Sep 17 00:00:00 2001 From: Leandro Melo Date: Thu, 30 Sep 2010 13:59:11 +0200 Subject: [PATCH 043/118] Help: Fix help ids for qt built with namespaces. This is actually a general improvement that splits the qualified names so more help ids candidates are considered when searching in the docs. Reviewed-by: kh1 --- src/plugins/cppeditor/cppelementevaluator.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/plugins/cppeditor/cppelementevaluator.cpp b/src/plugins/cppeditor/cppelementevaluator.cpp index 4ed8a0b207a..19f768fd290 100644 --- a/src/plugins/cppeditor/cppelementevaluator.cpp +++ b/src/plugins/cppeditor/cppelementevaluator.cpp @@ -314,16 +314,23 @@ CppDeclarableElement::CppDeclarableElement(Symbol *declaration) : CppElement() declaration->enclosingScope()->isNamespace() || declaration->enclosingScope()->isEnum()) { m_qualifiedName = overview.prettyName(LookupContext::fullyQualifiedName(declaration)); + + QStringList helpIds; + helpIds << m_qualifiedName; + int colonColon = 0; + const int size = m_qualifiedName.size(); + while ((colonColon = m_qualifiedName.indexOf(QLatin1String("::"), colonColon)) != -1) { + helpIds << m_qualifiedName.right(size - colonColon - 2); + colonColon += 2; + } + setHelpIdCandidates(helpIds); } else { m_qualifiedName = m_name; + setHelpIdCandidates(QStringList(m_name)); } setTooltip(overview.prettyType(declaration->type(), m_qualifiedName)); setLink(CPPEditor::linkToSymbol(declaration)); - - QStringList helpIds; - helpIds << m_qualifiedName << m_name; - setHelpIdCandidates(helpIds); setHelpMark(m_name); } From 67ff313ceb377686c88a0e31d6703edc04b88fa7 Mon Sep 17 00:00:00 2001 From: Pawel Polanski Date: Thu, 30 Sep 2010 13:43:01 +0200 Subject: [PATCH 044/118] Added support for not signing packages for Symbian OS Reviewed-by: Tobias Hunger --- .../qt-s60/s60createpackagestep.cpp | 62 +++++++++++++++---- .../qt-s60/s60createpackagestep.h | 3 +- .../qt-s60/s60createpackagestep.ui | 28 ++++++++- .../qt-s60/s60deployconfiguration.cpp | 28 ++++++++- .../qt-s60/s60deployconfiguration.h | 2 + 5 files changed, 104 insertions(+), 19 deletions(-) diff --git a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp index bae7dd37229..1c3553c44f4 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp @@ -176,8 +176,14 @@ bool S60CreatePackageStep::init() m_environment = qt4BuildConfiguration()->environment(); m_args.clear(); - if (m_createSmartInstaller) - m_args << QLatin1String("installer_sis"); + if (m_createSmartInstaller) { + if(signingMode() == NotSigned) + m_args << QLatin1String("unsigned_installer_sis"); + else + m_args << QLatin1String("installer_sis"); + + } else if (signingMode() == NotSigned) + m_args << QLatin1String("unsigned_sis"); else m_args << QLatin1String("sis"); if (signingMode() == SignCustom) { @@ -645,6 +651,8 @@ S60CreatePackageStepConfigWidget::S60CreatePackageStepConfigWidget(S60CreatePack this, SLOT(updateFromUi())); connect(m_ui.selfSignedButton, SIGNAL(clicked()), this, SLOT(updateFromUi())); + connect(m_ui.notSignedButton, SIGNAL(clicked()), + this, SLOT(updateFromUi())); connect(m_ui.signaturePath, SIGNAL(changed(QString)), this, SLOT(updateFromUi())); connect(m_ui.keyFilePath, SIGNAL(changed(QString)), @@ -657,11 +665,27 @@ S60CreatePackageStepConfigWidget::S60CreatePackageStepConfigWidget(S60CreatePack void S60CreatePackageStepConfigWidget::updateUi() { - bool selfSigned = m_signStep->signingMode() == S60CreatePackageStep::SignSelf; - m_ui.selfSignedButton->setChecked(selfSigned); - m_ui.customCertificateButton->setChecked(!selfSigned); - m_ui.signaturePath->setEnabled(!selfSigned); - m_ui.keyFilePath->setEnabled(!selfSigned); + + switch(m_signStep->signingMode()) { + case S60CreatePackageStep::SignCustom: + m_ui.selfSignedButton->setChecked(false); + m_ui.customCertificateButton->setChecked(true); + m_ui.notSignedButton->setChecked(false); + break; + case S60CreatePackageStep::NotSigned: + m_ui.selfSignedButton->setChecked(false); + m_ui.customCertificateButton->setChecked(false); + m_ui.notSignedButton->setChecked(true); + break; + default: + m_ui.selfSignedButton->setChecked(true); + m_ui.customCertificateButton->setChecked(false); + m_ui.notSignedButton->setChecked(false); + break; + } + bool customSigned = m_signStep->signingMode() == S60CreatePackageStep::SignCustom; + m_ui.signaturePath->setEnabled(customSigned); + m_ui.keyFilePath->setEnabled(customSigned); m_ui.signaturePath->setPath(m_signStep->customSignaturePath()); m_ui.keyFilePath->setPath(m_signStep->customKeyPath()); m_ui.smartInstaller->setChecked(m_signStep->createsSmartInstaller()); @@ -670,9 +694,15 @@ void S60CreatePackageStepConfigWidget::updateUi() void S60CreatePackageStepConfigWidget::updateFromUi() { - bool selfSigned = m_ui.selfSignedButton->isChecked(); - m_signStep->setSigningMode(selfSigned ? S60CreatePackageStep::SignSelf - : S60CreatePackageStep::SignCustom); + S60CreatePackageStep::SigningMode signingMode(S60CreatePackageStep::SignSelf); + if (m_ui.selfSignedButton->isChecked()) + signingMode = S60CreatePackageStep::SignSelf; + else if (m_ui.customCertificateButton->isChecked()) + signingMode = S60CreatePackageStep::SignCustom; + else if (m_ui.notSignedButton->isChecked()) + signingMode = S60CreatePackageStep::NotSigned; + + m_signStep->setSigningMode(signingMode); m_signStep->setCustomSignaturePath(m_ui.signaturePath->path()); m_signStep->setCustomKeyPath(m_ui.keyFilePath->path()); m_signStep->setCreatesSmartInstaller(m_ui.smartInstaller->isChecked()); @@ -691,11 +721,17 @@ void S60CreatePackageStepConfigWidget::resetPassphrases() QString S60CreatePackageStepConfigWidget::summaryText() const { QString text; - if (m_signStep->signingMode() == S60CreatePackageStep::SignSelf) { - text = tr("self-signed"); - } else { + switch(m_signStep->signingMode()) { + case S60CreatePackageStep::SignCustom: text = tr("signed with certificate %1 and key file %2") .arg(m_signStep->customSignaturePath(), m_signStep->customKeyPath()); + break; + case S60CreatePackageStep::NotSigned: + text = tr("not signed"); + break; + default: + text = tr("self-signed"); + break; } if (m_signStep->createsSmartInstaller()) return tr("Create SIS Package: %1, using Smart Installer").arg(text); diff --git a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.h b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.h index 8cdc5ecb91c..b37e517f17d 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.h @@ -74,7 +74,8 @@ class S60CreatePackageStep : public ProjectExplorer::BuildStep public: enum SigningMode { SignSelf = 0, - SignCustom = 1 + SignCustom = 1, + NotSigned = 2 }; explicit S60CreatePackageStep(ProjectExplorer::BuildStepList *bsl); diff --git a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.ui b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.ui index a0278c33265..b9eccf5ad1a 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.ui +++ b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.ui @@ -7,7 +7,7 @@ 0 0 517 - 108 + 135 @@ -15,7 +15,31 @@ - + + + + + + + + + + + + + 0 + 0 + + + + Not signed + + + + + + + diff --git a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp index f3a4abb28a4..cd4a04a64e0 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp @@ -147,13 +147,20 @@ QStringList S60DeployConfiguration::signedPackages() const continue; TargetInformation ti = node->targetInformation(); if (ti.valid) - result << ti.buildDir + QLatin1Char('/') + ti.target - + (runSmartInstaller() ? QLatin1String("_installer") : QLatin1String("")) - + QLatin1String(".sis"); + result << ti.buildDir + QLatin1Char('/') + createPackageName(ti.target); } return result; } +QString S60DeployConfiguration::createPackageName(const QString &baseName) const +{ + QString name(baseName); + name += isSigned() ? QLatin1String("") : QLatin1String("_unsigned"); + name += runSmartInstaller() ? QLatin1String("_installer") : QLatin1String(""); + name += QLatin1String(".sis"); + return name; +} + QStringList S60DeployConfiguration::packageFileNamesWithTargetInfo() const { QList leafs = qt4Target()->qt4Project()->leafProFiles(); @@ -216,6 +223,21 @@ bool S60DeployConfiguration::runSmartInstaller() const return false; } +bool S60DeployConfiguration::isSigned() const +{ + DeployConfiguration *dc = target()->activeDeployConfiguration(); + QTC_ASSERT(dc, return false); + BuildStepList *bsl = dc->stepList(); + QTC_ASSERT(bsl, return false); + QList steps = bsl->steps(); + foreach (const BuildStep *step, steps) { + if (const S60CreatePackageStep *packageStep = qobject_cast(step)) { + return packageStep->signingMode() != S60CreatePackageStep::NotSigned; + } + } + return false; +} + ProjectExplorer::ToolChain::ToolChainType S60DeployConfiguration::toolChainType() const { if (Qt4BuildConfiguration *bc = qobject_cast(target()->activeBuildConfiguration())) diff --git a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h index 198178dad22..1d299eedd94 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h @@ -93,8 +93,10 @@ protected: private: void ctor(); bool runSmartInstaller() const; + bool isSigned() const; QString symbianPlatform() const; QString symbianTarget() const; + QString createPackageName(const QString &baseName) const; bool isDebug() const; bool isStaticLibrary(const Qt4ProFileNode &projectNode) const; From e0ec2ac82e8b5bfe584aef83ccdec344628ca54b Mon Sep 17 00:00:00 2001 From: Pawel Polanski Date: Thu, 30 Sep 2010 14:15:50 +0200 Subject: [PATCH 045/118] Cleanup for SymbianOS --- src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp index 1c3553c44f4..3b17b607f82 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp @@ -181,11 +181,11 @@ bool S60CreatePackageStep::init() m_args << QLatin1String("unsigned_installer_sis"); else m_args << QLatin1String("installer_sis"); - } else if (signingMode() == NotSigned) m_args << QLatin1String("unsigned_sis"); else m_args << QLatin1String("sis"); + if (signingMode() == SignCustom) { m_args << QLatin1String(MAKE_CERTIFICATE_ARGUMENT) + QDir::toNativeSeparators(customSignaturePath()) << QLatin1String(MAKE_KEY_ARGUMENT) + QDir::toNativeSeparators(customKeyPath()); From ac80d924c77e4811738ce62b0a4a6ad4430ada16 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 30 Sep 2010 14:35:44 +0200 Subject: [PATCH 046/118] Custom Wizards: No files generated. Fix breakage introduced by 65e95c3aba69123bf3286ea0c8ff60da0eece479, introducing a writeAccess attribute not properly initialized in the default CT. The GeneratedFile::CustomGeneratorAttribute exists for that purpose. Reviewed-by: Tobias Hunger Task-number: QTCREATORBUG-2518 --- src/plugins/coreplugin/basefilewizard.cpp | 12 +----------- src/plugins/coreplugin/basefilewizard.h | 1 - 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/src/plugins/coreplugin/basefilewizard.cpp b/src/plugins/coreplugin/basefilewizard.cpp index 70975a104b8..054e560bd8a 100644 --- a/src/plugins/coreplugin/basefilewizard.cpp +++ b/src/plugins/coreplugin/basefilewizard.cpp @@ -69,14 +69,12 @@ public: QString editorId; bool binary; GeneratedFile::Attributes attributes; - bool writeAccess; }; GeneratedFilePrivate::GeneratedFilePrivate(const QString &p) : path(p), binary(false), - attributes(0), - writeAccess(true) + attributes(0) { } @@ -106,11 +104,6 @@ GeneratedFile::~GeneratedFile() { } -void GeneratedFile::setWriteAccess(bool access) -{ - m_d->writeAccess = access; -} - QString GeneratedFile::path() const { return m_d->path; @@ -163,9 +156,6 @@ void GeneratedFile::setEditorId(const QString &k) bool GeneratedFile::write(QString *errorMessage) const { - if (!m_d->writeAccess) - return true; - // Ensure the directory const QFileInfo info(m_d->path); const QDir dir = info.absoluteDir(); diff --git a/src/plugins/coreplugin/basefilewizard.h b/src/plugins/coreplugin/basefilewizard.h index e789a8d0468..614cabebbd0 100644 --- a/src/plugins/coreplugin/basefilewizard.h +++ b/src/plugins/coreplugin/basefilewizard.h @@ -101,7 +101,6 @@ public: void setEditorId(const QString &k); bool write(QString *errorMessage) const; - void setWriteAccess(bool access = true); Attributes attributes() const; void setAttributes(Attributes a); From 997e2e53481de4d4bda9cfa9d01335d1a1201747 Mon Sep 17 00:00:00 2001 From: kh1 Date: Thu, 30 Sep 2010 14:41:47 +0200 Subject: [PATCH 047/118] Some properties are not being highlighted in context sensitive help. This happens because the may have a different name (like it's frament) which we now look for while parsing the html for the function name. Task-number: QTCREATORBUG-2217 Reviewed-by: ck --- src/plugins/help/helpplugin.cpp | 38 ++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/src/plugins/help/helpplugin.cpp b/src/plugins/help/helpplugin.cpp index 2be35d46004..043e3ed2d44 100644 --- a/src/plugins/help/helpplugin.cpp +++ b/src/plugins/help/helpplugin.cpp @@ -843,9 +843,12 @@ void HelpPlugin::activateContext() int version = 0; const QRegExp exp("(\\d+)"); QUrl source = *links.begin(); + const QLatin1String qtRefDoc = QLatin1String("com.trolltech.qt"); + + // workaround to show the latest qt version foreach (const QUrl &tmp, links) { const QString &authority = tmp.authority(); - if (authority.startsWith(QLatin1String("com.trolltech.qt"))) { + if (authority.startsWith(qtRefDoc)) { if (exp.indexIn(authority) >= 0) { const int tmpVersion = exp.cap(1).toInt(); if (tmpVersion > version) { @@ -855,18 +858,31 @@ void HelpPlugin::activateContext() } } } + const QUrl &oldSource = viewer->source(); if (source != oldSource) { #if !defined(QT_NO_WEBKIT) viewer->stop(); #endif - viewer->setSource(source); - connect(viewer, SIGNAL(loadFinished(bool)), this, - SLOT(highlightSearchTerms())); + const QString &fragment = source.fragment(); + const bool isQtRefDoc = source.authority().startsWith(qtRefDoc); + if (isQtRefDoc) { + // workaround for qt properties + m_idFromContext = fragment; - if (source.toString().remove(source.fragment()) - == oldSource.toString().remove(oldSource.fragment())) { + if (!m_idFromContext.isEmpty()) { + connect(viewer, SIGNAL(loadFinished(bool)), this, + SLOT(highlightSearchTerms())); + } + } + + viewer->setSource(source); + + if (isQtRefDoc && !m_idFromContext.isEmpty()) { + if (source.toString().remove(fragment) + == oldSource.toString().remove(oldSource.fragment())) { highlightSearchTerms(); + } } } else { #if !defined(QT_NO_WEBKIT) @@ -1026,11 +1042,6 @@ void HelpPlugin::highlightSearchTerms() SLOT(highlightSearchTerms())); #if !defined(QT_NO_WEBKIT) - const QString &attrValue = m_idFromContext.mid(m_idFromContext - .lastIndexOf(QChar(':')) + 1); - if (attrValue.isEmpty()) - return; - const QWebElement &document = viewer->page()->mainFrame()->documentElement(); const QWebElementCollection &collection = document.findAll(QLatin1String("h3.fn a")); @@ -1046,14 +1057,15 @@ void HelpPlugin::highlightSearchTerms() parent.setStyleProperty(property, m_styleProperty); } - if (attrValue == name || name.startsWith(attrValue + QLatin1Char('-'))) { + if (m_idFromContext == name + || name.startsWith(m_idFromContext + QLatin1Char('-'))) { QWebElement parent = element.parent(); m_styleProperty = parent.styleProperty(property, QWebElement::ComputedStyle); parent.setStyleProperty(property, QLatin1String("yellow")); } } - m_oldAttrValue = attrValue; + m_oldAttrValue = m_idFromContext; #endif } } From beb4af4bce091da04b1f6e6deb307c4e7942d2ee Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 30 Sep 2010 14:41:52 +0200 Subject: [PATCH 048/118] Doc - Using SUBDIRS variable Task-number: QTCREATORBUG-2430 Reviewed-by: hjk Reviewed-by: Jarek Kobus --- doc/qtcreator.qdoc | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/doc/qtcreator.qdoc b/doc/qtcreator.qdoc index 718e3784dd0..a0f6464763e 100644 --- a/doc/qtcreator.qdoc +++ b/doc/qtcreator.qdoc @@ -1927,6 +1927,35 @@ This also makes the files available in the \gui Locator. + \section1 Adding Subprojects to Projects + + When you create a new project, you can add it to another project as a subproject + in the \gui{Project Management} dialog. However, you first have to edit the + .pro file of the parent project to specify that qmake uses the \c subdirs template + to build the project. + + The \c subdirs template creates a Makefile for building subprojects. They can be + located either in subdirectories of the project directory or in any other directory. + The location of the targets is specified using the SUBDIRS variable. If the project file + has the same name as the directory, you can just specify the directory name. If the project + name and directory name are different, you must specify the project file name (.pro). + + For more information on the SUBDIRS variable, see the + \l{http://doc.qt.nokia.com/4.7/qmake-variable-reference.html#subdirs}{qmake Variable Reference}. + + For example, the following code specifies that plugin_coreplugin/plugin_coreplugin.pro + and mylogin.pro belong to the project: + + \code + TEMPLATE = subdirs + + SUBDIRS = plugin_coreplugin \ + ../another/plugin/myplugin.pro + \endcode + + To specify dependencies, use the \gui{Add Library} wizard. For more information, + see \l{Adding Libraries to qmake Projects}. + */ From bb543b32a37f110b040e3a3b68a7eb45a01b8740 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 30 Sep 2010 14:43:59 +0200 Subject: [PATCH 049/118] Doc - update managing sessions section Task-number: QTCREATORBUG-2430 Reviewed-by: hjk --- doc/qtcreator.qdoc | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/doc/qtcreator.qdoc b/doc/qtcreator.qdoc index a0f6464763e..f845ff81d19 100644 --- a/doc/qtcreator.qdoc +++ b/doc/qtcreator.qdoc @@ -4666,17 +4666,21 @@ \title Managing Sessions When you exit Qt Creator, a snapshot of your current workspace is stored - as a session. - A session is a collection of: + as a \e session. A session is an arbitrary collection of: \list - \o Open projects with their dependencies + \o Open projects with their dependencies (including SUBDIRS projects) \o Open editors \o Breakpoints and watches \o Bookmarks \endlist - If you work on a project and need to switch to another project for a + A session is personal, that is, not meant to be shared. It is not + supposed to reflect the project structure. It contains personal data, such as + bookmarks and breakpoints that are usually not of interest to other developers + working on the same projects. + + For example, if you work on a project and need to switch to another project for a while, you can save your workspace as a session. This makes it easier to return to working on the first project later. From 00a8d9c32b7a33e85ade9de8da835bb2b8d0f2ed Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Thu, 30 Sep 2010 14:38:56 +0200 Subject: [PATCH 050/118] QmlJS: Try to build qmldump when opening a Qml project. To make plugin dumping work without having to compile the debugging helpers explicitly. Reviewed-by: Kai Koehne --- src/plugins/qmlprojectmanager/qmlproject.cpp | 2 +- src/plugins/qt4projectmanager/qmldumptool.cpp | 167 ++++++++++++++---- src/plugins/qt4projectmanager/qmldumptool.h | 2 +- src/plugins/qt4projectmanager/qt4project.cpp | 5 +- .../qt4projectmanager/qtversionmanager.cpp | 48 ++--- .../qt4projectmanager/qtversionmanager.h | 2 +- 6 files changed, 170 insertions(+), 56 deletions(-) diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index 52147a75bca..83486bbaf99 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -132,7 +132,7 @@ void QmlProject::refresh(RefreshOptions options) pinfo.importPaths = importPaths(); if (pinfo.qmlDumpPath.isNull()) { - pinfo.qmlDumpPath = Qt4ProjectManager::QmlDumpTool::qmlDumpPath(); + pinfo.qmlDumpPath = Qt4ProjectManager::QmlDumpTool::qmlDumpPath(this); } m_modelManager->updateProjectInfo(pinfo); diff --git a/src/plugins/qt4projectmanager/qmldumptool.cpp b/src/plugins/qt4projectmanager/qmldumptool.cpp index 5d11f0dec9b..02200c33d80 100644 --- a/src/plugins/qt4projectmanager/qmldumptool.cpp +++ b/src/plugins/qt4projectmanager/qmldumptool.cpp @@ -30,14 +30,90 @@ #include "qmldumptool.h" #include "qt4project.h" #include "qt4projectmanagerconstants.h" +#include "qtversionmanager.h" #include +#include #include #include +#include +#include #include #include #include #include +#include + +namespace { +using namespace Qt4ProjectManager; + +class QmlDumpBuildTask; + +typedef QHash QmlDumpByVersion; +Q_GLOBAL_STATIC(QmlDumpByVersion, runningQmlDumpBuilds); + +// A task suitable to be run by QtConcurrent to build qmldump. +class QmlDumpBuildTask : public QObject { + Q_DISABLE_COPY(QmlDumpBuildTask) + Q_OBJECT +public: + explicit QmlDumpBuildTask(QtVersion *version) + : m_version(*version) + { + runningQmlDumpBuilds()->insert(m_version.uniqueId(), this); + } + + void run(QFutureInterface &future) + { + future.setProgressRange(0, 5); + future.setProgressValue(1); + const QString output = m_version.buildDebuggingHelperLibrary(future, true); + + const QString qtInstallData = m_version.versionInfo().value("QT_INSTALL_DATA"); + QString path = QmlDumpTool::toolByInstallData(qtInstallData); + if (path.isEmpty()) { + qWarning() << "Could not build QML plugin dumping helper for " << m_version.displayName() + << "\nOutput:\n" << output; + } + + // proceed in gui thread + metaObject()->invokeMethod(this, "finish", Qt::QueuedConnection, Q_ARG(QString, path)); + } + + void updateProjectWhenDone(ProjectExplorer::Project *project) + { + m_projectsToUpdate.insert(project); + } + +public slots: + void finish(QString qmldumpPath) + { + deleteLater(); + runningQmlDumpBuilds()->remove(m_version.uniqueId()); + + if (qmldumpPath.isEmpty()) + return; + + // update qmldump path for all the project + QmlJS::ModelManagerInterface *modelManager = QmlJS::ModelManagerInterface::instance(); + if (!modelManager) + return; + + foreach (ProjectExplorer::Project *project, m_projectsToUpdate) { + QmlJS::ModelManagerInterface::ProjectInfo projectInfo = modelManager->projectInfo(project); + if (projectInfo.qmlDumpPath.isEmpty()) { + projectInfo.qmlDumpPath = qmldumpPath; + modelManager->updateProjectInfo(projectInfo); + } + } + } + +private: + QSet m_projectsToUpdate; + QtVersion m_version; +}; +} // end of anonymous namespace + namespace Qt4ProjectManager { @@ -55,20 +131,48 @@ bool QmlDumpTool::canBuild(QtVersion *qtVersion) return checkMinimumQtVersion(qtVersion->qtVersionString(), 4, 7, 0); } -QString QmlDumpTool::toolForProject(ProjectExplorer::Project *project) +static QtVersion *qtVersionForProject(ProjectExplorer::Project *project) { if (project && project->id() == Qt4ProjectManager::Constants::QT4PROJECT_ID) { Qt4Project *qt4Project = static_cast(project); if (qt4Project && qt4Project->activeTarget() - && qt4Project->activeTarget()->activeBuildConfiguration()) { + && qt4Project->activeTarget()->activeBuildConfiguration()) { QtVersion *version = qt4Project->activeTarget()->activeBuildConfiguration()->qtVersion(); - if (version->isValid()) { - QString qtInstallData = version->versionInfo().value("QT_INSTALL_DATA"); - QString toolPath = toolByInstallData(qtInstallData); - return toolPath; + if (version->isValid()) + return version; + } + return 0; + } + + // else, find any desktop Qt version that has qmldump, or - if there isn't any - + // one that could build it + QtVersion *desktopQt = 0; + QtVersionManager *qtVersions = QtVersionManager::instance(); + foreach (QtVersion *version, qtVersions->validVersions()) { + if (version->supportsTargetId(Constants::DESKTOP_TARGET_ID)) { + const QString qtInstallData = version->versionInfo().value("QT_INSTALL_DATA"); + const QString path = QmlDumpTool::toolByInstallData(qtInstallData); + if (!path.isEmpty()) + return version; + + if (!desktopQt && QmlDumpTool::canBuild(version)) { + desktopQt = version; } } } + + return desktopQt; +} + +QString QmlDumpTool::toolForProject(ProjectExplorer::Project *project) +{ + QtVersion *version = qtVersionForProject(project); + if (version) { + QString qtInstallData = version->versionInfo().value("QT_INSTALL_DATA"); + QString toolPath = toolByInstallData(qtInstallData); + return toolPath; + } + return QString(); } @@ -139,38 +243,41 @@ QStringList QmlDumpTool::installDirectories(const QString &qtInstallData) return directories; } -QString QmlDumpTool::qmlDumpPath() +QString QmlDumpTool::qmlDumpPath(ProjectExplorer::Project *project) { QString path; - ProjectExplorer::Project *activeProject = ProjectExplorer::ProjectExplorerPlugin::instance()->startupProject(); - path = Qt4ProjectManager::QmlDumpTool::toolForProject(activeProject); + path = Qt4ProjectManager::QmlDumpTool::toolForProject(project); - // ### this is needed for qmlproject and cmake project support, but may not work in all cases. - if (path.isEmpty()) { - // Try to locate default path in Qt Versions - QtVersionManager *qtVersions = QtVersionManager::instance(); - foreach (QtVersion *version, qtVersions->validVersions()) { - if (version->supportsTargetId(Constants::DESKTOP_TARGET_ID)) { - const QString qtInstallData = version->versionInfo().value("QT_INSTALL_DATA"); - path = QmlDumpTool::toolByInstallData(qtInstallData); - - if (!path.isEmpty()) { - break; - } - } + QtVersion *version = qtVersionForProject(project); + if (version && path.isEmpty()) { + if (runningQmlDumpBuilds()->contains(version->uniqueId())) { + runningQmlDumpBuilds()->value(version->uniqueId())->updateProjectWhenDone(project); + } else { + QmlDumpBuildTask *buildTask = new QmlDumpBuildTask(version); + buildTask->updateProjectWhenDone(project); + QFuture task = QtConcurrent::run(&QmlDumpBuildTask::run, buildTask); + const QString taskName = QmlDumpBuildTask::tr("Building helper"); + Core::ICore::instance()->progressManager()->addTask(task, taskName, + QLatin1String("Qt4ProjectManager::BuildHelpers")); } + return path; } - QFileInfo qmldumpFileInfo(path); - if (!qmldumpFileInfo.exists()) { - //qWarning() << "QmlDumpTool::qmlDumpPath: qmldump executable does not exist at" << path; - path.clear(); - } else if (!qmldumpFileInfo.isFile()) { - qWarning() << "QmlDumpTool::qmlDumpPath: " << path << " is not a file"; - path.clear(); + + if (!path.isEmpty()) { + QFileInfo qmldumpFileInfo(path); + if (!qmldumpFileInfo.exists()) { + qWarning() << "QmlDumpTool::qmlDumpPath: qmldump executable does not exist at" << path; + path.clear(); + } else if (!qmldumpFileInfo.isFile()) { + qWarning() << "QmlDumpTool::qmlDumpPath: " << path << " is not a file"; + path.clear(); + } } return path; } -} // namespace +} // namespace Qt4ProjectManager + +#include "qmldumptool.moc" diff --git a/src/plugins/qt4projectmanager/qmldumptool.h b/src/plugins/qt4projectmanager/qmldumptool.h index dc991478077..3201f7ba3e6 100644 --- a/src/plugins/qt4projectmanager/qmldumptool.h +++ b/src/plugins/qt4projectmanager/qmldumptool.h @@ -60,7 +60,7 @@ public: // Copy the source files to a target location and return the chosen target location. static QString copy(const QString &qtInstallData, QString *errorMessage); - static QString qmlDumpPath(); + static QString qmlDumpPath(ProjectExplorer::Project *project); private: static QStringList installDirectories(const QString &qtInstallData); diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index a11fc013e2a..408a259ba86 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -569,6 +569,9 @@ void Qt4Project::updateCppCodeModel() void Qt4Project::updateQmlJSCodeModel() { + if (m_projectFiles->files[QMLType].isEmpty()) + return; + QmlJS::ModelManagerInterface *modelManager = QmlJS::ModelManagerInterface::instance(); if (!modelManager) return; @@ -587,7 +590,7 @@ void Qt4Project::updateQmlJSCodeModel() projectInfo.importPaths.removeDuplicates(); if (projectInfo.qmlDumpPath.isNull()) { - projectInfo.qmlDumpPath = QmlDumpTool::qmlDumpPath(); + projectInfo.qmlDumpPath = QmlDumpTool::qmlDumpPath(this); } modelManager->updateProjectInfo(projectInfo); diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp index 283f52ba44e..2e9fb6ce027 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.cpp +++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp @@ -1746,7 +1746,7 @@ bool QtVersion::isQt64Bit() const #endif } -QString QtVersion::buildDebuggingHelperLibrary(QFutureInterface &future) +QString QtVersion::buildDebuggingHelperLibrary(QFutureInterface &future, bool onlyQmlDump) { QString qtInstallHeaders = versionInfo().value("QT_INSTALL_HEADERS"); QString qtInstallData = versionInfo().value("QT_INSTALL_DATA"); @@ -1762,13 +1762,28 @@ QString QtVersion::buildDebuggingHelperLibrary(QFutureInterface &future) return QCoreApplication::translate("QtVersion", "The Qt Version has no toolchain."); tc->addToEnvironment(env); QString output; - QString gdbHelperDirectory = DebuggingHelperLibrary::copy(qtInstallData, &output); - if (!gdbHelperDirectory.isEmpty()) { - output += DebuggingHelperLibrary::build(gdbHelperDirectory, tc->makeCommand(), - qmakeCommand(), mkspec(), env, - (tc->type() == ToolChain::GCC_MAEMO ? QLatin1String("-unix") : QLatin1String(""))); + + if (!onlyQmlDump) { + QString gdbHelperDirectory = DebuggingHelperLibrary::copy(qtInstallData, &output); + if (!gdbHelperDirectory.isEmpty()) { + output += DebuggingHelperLibrary::build(gdbHelperDirectory, tc->makeCommand(), + qmakeCommand(), mkspec(), env, + (tc->type() == ToolChain::GCC_MAEMO ? QLatin1String("-unix") : QLatin1String(""))); + } + future.setProgressValue(2); + + if (QmlObserverTool::canBuild(this)) { + QString toolDirectory = QmlObserverTool::copy(qtInstallData, &output); + if (!toolDirectory.isEmpty()) { + output += QmlObserverTool::build(toolDirectory, tc->makeCommand(), + qmakeCommand(), mkspec(), env, + (tc->type() == ToolChain::GCC_MAEMO ? QLatin1String("-unix") : QLatin1String(""))); + } + } else { + output += QCoreApplication::tr("Cannot build QMLObserver; Qt version must be 4.7.1 or higher."); + } + future.setProgressValue(3); } - future.setProgressValue(2); if (QmlDumpTool::canBuild(this)) { QString toolDirectory = QmlDumpTool::copy(qtInstallData, &output); @@ -1780,28 +1795,17 @@ QString QtVersion::buildDebuggingHelperLibrary(QFutureInterface &future) } else { output += QCoreApplication::tr("Cannot build qmldump; Qt version must be 4.7.1 or higher."); } - future.setProgressValue(3); - - if (QmlObserverTool::canBuild(this)) { - QString toolDirectory = QmlObserverTool::copy(qtInstallData, &output); - if (!toolDirectory.isEmpty()) { - output += QmlObserverTool::build(toolDirectory, tc->makeCommand(), - qmakeCommand(), mkspec(), env, - (tc->type() == ToolChain::GCC_MAEMO ? QLatin1String("-unix") : QLatin1String(""))); - } - } else { - output += QCoreApplication::tr("Cannot build QMLObserver; Qt version must be 4.7.1 or higher."); - } future.setProgressValue(4); // invalidate version before updating version info m_versionInfoUpToDate = false; updateVersionInfo(); - m_hasDebuggingHelper = !debuggingHelperLibrary().isEmpty(); + if (!onlyQmlDump) { + m_hasDebuggingHelper = !debuggingHelperLibrary().isEmpty(); + m_hasQmlObserver = !qmlObserverTool().isEmpty(); + } m_hasQmlDump = !qmlDumpTool().isEmpty(); - m_hasQmlObserver = !qmlObserverTool().isEmpty(); return output; } - diff --git a/src/plugins/qt4projectmanager/qtversionmanager.h b/src/plugins/qt4projectmanager/qtversionmanager.h index 4e9f0ac1560..1c90205f0e5 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.h +++ b/src/plugins/qt4projectmanager/qtversionmanager.h @@ -122,7 +122,7 @@ public: // Builds a debugging library // returns the output of the commands - QString buildDebuggingHelperLibrary(QFutureInterface &future); + QString buildDebuggingHelperLibrary(QFutureInterface &future, bool onlyQmlDump = false); bool hasExamples() const; QString examplesPath() const; From 2a750aa3980b7d09ad1e3bc90ceea1cc08781f5e Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Thu, 30 Sep 2010 14:47:04 +0200 Subject: [PATCH 051/118] QmlJS: Succeed on the QmlDumpTool::canBuild check if private header found To make it work with 4.7.0 developer builds. Reviewed-by: owolff --- src/plugins/qt4projectmanager/qmldumptool.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/qt4projectmanager/qmldumptool.cpp b/src/plugins/qt4projectmanager/qmldumptool.cpp index 02200c33d80..0fc5411414f 100644 --- a/src/plugins/qt4projectmanager/qmldumptool.cpp +++ b/src/plugins/qt4projectmanager/qmldumptool.cpp @@ -128,7 +128,9 @@ static inline QStringList validBinaryFilenames() bool QmlDumpTool::canBuild(QtVersion *qtVersion) { - return checkMinimumQtVersion(qtVersion->qtVersionString(), 4, 7, 0); + const QString installHeaders = qtVersion->versionInfo().value("QT_INSTALL_HEADERS"); + const QString header = installHeaders + QLatin1String("/QtDeclarative/private/qdeclarativemetatype_p.h"); + return checkMinimumQtVersion(qtVersion->qtVersionString(), 4, 7, 1) || QFile::exists(header); } static QtVersion *qtVersionForProject(ProjectExplorer::Project *project) From a02d60bb1dcd868a7861fc4884adf6ac788b5a55 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 30 Sep 2010 15:17:51 +0200 Subject: [PATCH 052/118] Gui app wizard: Open form source instead of Qt Designer form. Reviewed-by: hjk --- src/plugins/qt4projectmanager/wizards/guiappwizard.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/plugins/qt4projectmanager/wizards/guiappwizard.cpp b/src/plugins/qt4projectmanager/wizards/guiappwizard.cpp index 24e63444983..3c8bd3691a9 100644 --- a/src/plugins/qt4projectmanager/wizards/guiappwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/guiappwizard.cpp @@ -172,13 +172,13 @@ Core::GeneratedFiles GuiAppWizard::generateFiles(const QWizard *w, const QString formHeaderName = buildFileName(projectPath, params.headerFileName, headerSuffix()); Core::GeneratedFile formSource(formSourceFileName); Core::GeneratedFile formHeader(formHeaderName); + formSource.setAttributes(Core::GeneratedFile::OpenEditorAttribute); QSharedPointer form; if (params.designerForm) { // Create files: form const QString formName = buildFileName(projectPath, params.formFileName, formSuffix()); form = QSharedPointer(new Core::GeneratedFile(formName)); - form->setAttributes(Core::GeneratedFile::OpenEditorAttribute); if (!parametrizeTemplate(templatePath, QLatin1String("widget.ui"), params, &contents, errorMessage)) return Core::GeneratedFiles(); form->setContents(contents); @@ -190,7 +190,6 @@ Core::GeneratedFiles GuiAppWizard::generateFiles(const QWizard *w, return Core::GeneratedFiles(); formSource.setContents(CppTools::AbstractEditorSupport::licenseTemplate(formSourceFileName) + contents); - formSource.setAttributes(Core::GeneratedFile::OpenEditorAttribute); // Create files: form header const QString formHeaderTemplate = QLatin1String("mywidget.h"); if (!parametrizeTemplate(templatePath, formHeaderTemplate, params, &contents, errorMessage)) From d5d2d3ea3cc2727fd72a25de56d34c800afec550 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 30 Sep 2010 14:48:27 +0200 Subject: [PATCH 053/118] Maemo: Remove unused function. Reviewed-by: kh1 --- src/plugins/qt4projectmanager/qt-maemo/maemosshrunner.cpp | 5 ----- src/plugins/qt4projectmanager/qt-maemo/maemosshrunner.h | 2 -- 2 files changed, 7 deletions(-) diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemosshrunner.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemosshrunner.cpp index 5ea12bc90e2..b39da25f22d 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemosshrunner.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemosshrunner.cpp @@ -75,11 +75,6 @@ MaemoSshRunner::MaemoSshRunner(QObject *parent, MaemoSshRunner::~MaemoSshRunner() {} -void MaemoSshRunner::setConnection(const QSharedPointer &connection) -{ - m_connection = connection; -} - void MaemoSshRunner::start() { // Should not happen. diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemosshrunner.h b/src/plugins/qt4projectmanager/qt-maemo/maemosshrunner.h index 6d7ea730ec6..96447e0c4ec 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemosshrunner.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemosshrunner.h @@ -60,8 +60,6 @@ public: bool debugging); ~MaemoSshRunner(); - void setConnection(const QSharedPointer &connection); - void start(); void stop(); From dc73e7d1bc4071077cdcec6e2a6f64349747a4d2 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 30 Sep 2010 15:43:59 +0200 Subject: [PATCH 054/118] QML file wizard: Move to new category. Task-number: QTCREATORBUG-2510 Reviewed-by: Kai Koehne --- src/plugins/qmljseditor/qmljseditorconstants.h | 4 ++++ src/plugins/qmljseditor/qmljseditorplugin.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/plugins/qmljseditor/qmljseditorconstants.h b/src/plugins/qmljseditor/qmljseditorconstants.h index 342f6e94acf..753a143bc28 100644 --- a/src/plugins/qmljseditor/qmljseditorconstants.h +++ b/src/plugins/qmljseditor/qmljseditorconstants.h @@ -58,6 +58,10 @@ const char * const JS_MIMETYPE = "application/javascript"; const char *const TASK_CATEGORY_QML = "Task.Category.Qml"; +const char * const WIZARD_CATEGORY_QML = "S.Qml"; +const char * const WIZARD_TR_CATEGORY_QML = QT_TRANSLATE_NOOP("QmlJsEditor", "QML"); + + } // namespace Constants } // namespace QmlJSEditor diff --git a/src/plugins/qmljseditor/qmljseditorplugin.cpp b/src/plugins/qmljseditor/qmljseditorplugin.cpp index e7cbfde8131..7e3e74b3ab7 100644 --- a/src/plugins/qmljseditor/qmljseditorplugin.cpp +++ b/src/plugins/qmljseditor/qmljseditorplugin.cpp @@ -134,10 +134,10 @@ bool QmlJSEditorPlugin::initialize(const QStringList & /*arguments*/, QString *e addObject(m_editor); Core::BaseFileWizardParameters wizardParameters(Core::IWizard::FileWizard); - wizardParameters.setCategory(QLatin1String(Core::Constants::WIZARD_CATEGORY_QT)); - wizardParameters.setDisplayCategory(QCoreApplication::translate("Core", Core::Constants::WIZARD_TR_CATEGORY_QT)); - wizardParameters.setDescription(tr("Creates a Qt QML file.")); - wizardParameters.setDisplayName(tr("Qt QML File")); + wizardParameters.setCategory(QLatin1String(Constants::WIZARD_CATEGORY_QML)); + wizardParameters.setDisplayCategory(QCoreApplication::translate("QmlJsEditor", Constants::WIZARD_TR_CATEGORY_QML)); + wizardParameters.setDescription(tr("Creates a QML file.")); + wizardParameters.setDisplayName(tr("QML File")); wizardParameters.setId(QLatin1String("Q.Qml")); addAutoReleasedObject(new QmlFileWizard(wizardParameters, core)); From 5e59605c1e9503eaac9124d28918b231394e18b8 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Thu, 30 Sep 2010 16:12:24 +0200 Subject: [PATCH 055/118] QMLEditor: changed quickfix to only activate on the type id. --- .../qmljscomponentfromobjectdef.cpp | 8 +++--- src/plugins/qmljseditor/qmljsquickfix.cpp | 11 ++++++++ src/plugins/qmljseditor/qmljsquickfix.h | 3 +++ src/plugins/qmljseditor/qmljsquickfixes.cpp | 7 +++--- .../qmljseditor/qmljsrefactoringchanges.cpp | 25 ++++++++++++++++++- .../qmljseditor/qmljsrefactoringchanges.h | 3 +++ 6 files changed, 48 insertions(+), 9 deletions(-) diff --git a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp index 0d21a6101a5..0fcfd8108ac 100644 --- a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp +++ b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp @@ -149,20 +149,20 @@ public: QList ComponentFromObjectDef::match(const QmlJSQuickFixState &state) { - QList result; const int pos = state.currentFile().cursor().position(); QList path = state.semanticInfo().astPath(pos); for (int i = path.size() - 1; i >= 0; --i) { Node *node = path.at(i); if (UiObjectDefinition *objDef = cast(node)) { + if (!state.currentFile().isCursorOn(objDef->qualifiedTypeNameId)) + return noResult(); // check that the node is not the root node if (i > 0 && !cast(path.at(i - 1))) { - result.append(QmlJSQuickFixOperation::Ptr(new Operation(state, objDef))); - return result; + return singleResult(new Operation(state, objDef)); } } } - return result; + return noResult(); } diff --git a/src/plugins/qmljseditor/qmljsquickfix.cpp b/src/plugins/qmljseditor/qmljsquickfix.cpp index 3b5ce360f98..018442cd8bc 100644 --- a/src/plugins/qmljseditor/qmljsquickfix.cpp +++ b/src/plugins/qmljseditor/qmljsquickfix.cpp @@ -117,6 +117,17 @@ QList QmlJSQuickFixFactory::matchingOperations(QuickFixS return QList(); } +QList QmlJSQuickFixFactory::noResult() +{ + return QList(); +} + +QList QmlJSQuickFixFactory::singleResult(QmlJSQuickFixOperation *operation) +{ + QList result; + result.append(QmlJSQuickFixOperation::Ptr(operation)); + return result; +} QmlJSQuickFixCollector::QmlJSQuickFixCollector() { diff --git a/src/plugins/qmljseditor/qmljsquickfix.h b/src/plugins/qmljseditor/qmljsquickfix.h index 419cc73b902..57e6b2521f6 100644 --- a/src/plugins/qmljseditor/qmljsquickfix.h +++ b/src/plugins/qmljseditor/qmljsquickfix.h @@ -132,6 +132,9 @@ public: QmlJSQuickFixOperation objects. */ virtual QList match(const QmlJSQuickFixState &state) = 0; + + static QList noResult(); + static QList singleResult(QmlJSQuickFixOperation *operation); }; namespace Internal { diff --git a/src/plugins/qmljseditor/qmljsquickfixes.cpp b/src/plugins/qmljseditor/qmljsquickfixes.cpp index 145bcee5227..006ce4b457e 100644 --- a/src/plugins/qmljseditor/qmljsquickfixes.cpp +++ b/src/plugins/qmljseditor/qmljsquickfixes.cpp @@ -52,8 +52,6 @@ class SplitInitializerOp: public QmlJSQuickFixFactory public: virtual QList match(const QmlJSQuickFixState &state) { - QList result; - UiObjectInitializer *objectInitializer = 0; const int pos = state.currentFile().cursor().position(); @@ -70,8 +68,9 @@ public: } if (objectInitializer) - result.append(QSharedPointer(new Operation(state, objectInitializer))); - return result; + return singleResult(new Operation(state, objectInitializer)); + else + return noResult(); } private: diff --git a/src/plugins/qmljseditor/qmljsrefactoringchanges.cpp b/src/plugins/qmljseditor/qmljsrefactoringchanges.cpp index a612b070cdf..bf7ed2018c0 100644 --- a/src/plugins/qmljseditor/qmljsrefactoringchanges.cpp +++ b/src/plugins/qmljseditor/qmljsrefactoringchanges.cpp @@ -30,6 +30,7 @@ #include "qmljsrefactoringchanges.h" #include "qmljseditorcodeformatter.h" +#include #include #include #include @@ -109,11 +110,33 @@ Document::Ptr QmlJSRefactoringFile::qmljsDocument() const return m_qmljsDocument; } -unsigned QmlJSRefactoringFile::startOf(const QmlJS::AST::SourceLocation &loc) const +unsigned QmlJSRefactoringFile::startOf(const AST::SourceLocation &loc) const { return position(loc.startLine, loc.startColumn); } +bool QmlJSRefactoringFile::isCursorOn(AST::UiObjectMember *ast) const +{ + const unsigned pos = cursor().position(); + + return ast->firstSourceLocation().begin() <= pos + && pos <= ast->lastSourceLocation().end(); +} + +bool QmlJSRefactoringFile::isCursorOn(AST::UiQualifiedId *ast) const +{ + const unsigned pos = cursor().position(); + + if (ast->identifierToken.begin() > pos) + return false; + + AST::UiQualifiedId *last = ast; + while (last->next) + last = last->next; + + return pos <= ast->identifierToken.end(); +} + QmlJSRefactoringChanges *QmlJSRefactoringFile::refactoringChanges() const { return static_cast(m_refactoringChanges); diff --git a/src/plugins/qmljseditor/qmljsrefactoringchanges.h b/src/plugins/qmljseditor/qmljsrefactoringchanges.h index 993012e9c8c..b1ba3d4e466 100644 --- a/src/plugins/qmljseditor/qmljsrefactoringchanges.h +++ b/src/plugins/qmljseditor/qmljsrefactoringchanges.h @@ -57,6 +57,9 @@ public: */ unsigned startOf(const QmlJS::AST::SourceLocation &loc) const; + bool isCursorOn(QmlJS::AST::UiObjectMember *ast) const; + bool isCursorOn(QmlJS::AST::UiQualifiedId *ast) const; + private: QmlJSRefactoringChanges *refactoringChanges() const; From 111c18e353fbea1de53a5fba95d5698cf33b315c Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 30 Sep 2010 16:50:59 +0200 Subject: [PATCH 056/118] Fix Wizard page not offering the right project to add to. Symptom of file name slashification breakage. Reviewed-by: dt Task-number: QTCREATORBUG-2535 --- src/plugins/coreplugin/basefilewizard.cpp | 13 +++++++------ src/plugins/debugger/gdb/attachgdbadapter.cpp | 2 +- .../projectexplorer/customwizard/customwizard.cpp | 5 +++-- .../customwizard/customwizardscriptgenerator.cpp | 2 +- .../projectexplorer/projectfilewizardextension.cpp | 12 ++++++------ 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/plugins/coreplugin/basefilewizard.cpp b/src/plugins/coreplugin/basefilewizard.cpp index 054e560bd8a..96dfcba38a0 100644 --- a/src/plugins/coreplugin/basefilewizard.cpp +++ b/src/plugins/coreplugin/basefilewizard.cpp @@ -72,7 +72,7 @@ public: }; GeneratedFilePrivate::GeneratedFilePrivate(const QString &p) : - path(p), + path(QDir::cleanPath(p)), binary(false), attributes(0) { @@ -111,7 +111,7 @@ QString GeneratedFile::path() const void GeneratedFile::setPath(const QString &p) { - m_d->path = p; + m_d->path = QDir::cleanPath(p); } QString GeneratedFile::contents() const @@ -628,7 +628,7 @@ bool BaseFileWizard::postGenerateOpenEditors(const GeneratedFiles &l, QString *e if (file.attributes() & Core::GeneratedFile::OpenEditorAttribute) { if (!em->openEditor(file.path(), file.editorId(), Core::EditorManager::ModeSwitch )) { if (errorMessage) - *errorMessage = tr("Failed to open an editor for '%1'.").arg(file.path()); + *errorMessage = tr("Failed to open an editor for '%1'.").arg(QDir::toNativeSeparators(file.path())); return false; } } @@ -663,7 +663,7 @@ BaseFileWizard::OverwriteResult BaseFileWizard::promptOverwrite(const QStringLis if (fi.exists()) { if (!fileNamesMsgPart.isEmpty()) fileNamesMsgPart += QLatin1String(", "); - fileNamesMsgPart += fileName.mid(commonExistingPath.size() + 1); + fileNamesMsgPart += QDir::toNativeSeparators(fileName.mid(commonExistingPath.size() + 1)); do { if (fi.isDir()) { oddStuffFound = true; @@ -687,13 +687,14 @@ BaseFileWizard::OverwriteResult BaseFileWizard::promptOverwrite(const QStringLis return OverwriteOk; if (oddStuffFound) { - *errorMessage = tr("The project directory %1 contains files which cannot be overwritten:\n%2.").arg(commonExistingPath).arg(fileNamesMsgPart); + *errorMessage = tr("The project directory %1 contains files which cannot be overwritten:\n%2.") + .arg(QDir::toNativeSeparators(commonExistingPath)).arg(fileNamesMsgPart); return OverwriteError; } const QString messageFormat = tr("The following files already exist in the directory %1:\n" "%2.\nWould you like to overwrite them?"); - const QString message = messageFormat.arg(commonExistingPath).arg(fileNamesMsgPart); + const QString message = messageFormat.arg(QDir::toNativeSeparators(commonExistingPath)).arg(fileNamesMsgPart); const bool yes = (QMessageBox::question(Core::ICore::instance()->mainWindow(), tr("Existing files"), message, QMessageBox::Yes | QMessageBox::No, diff --git a/src/plugins/debugger/gdb/attachgdbadapter.cpp b/src/plugins/debugger/gdb/attachgdbadapter.cpp index 1de5c646e66..e65a15a75c1 100644 --- a/src/plugins/debugger/gdb/attachgdbadapter.cpp +++ b/src/plugins/debugger/gdb/attachgdbadapter.cpp @@ -78,7 +78,7 @@ void AttachGdbAdapter::runEngine() { QTC_ASSERT(state() == EngineRunRequested, qDebug() << state()); m_engine->notifyEngineRunAndInferiorStopOk(); - m_engine->continueInferiorInternal(); + //m_engine->continueInferiorInternal(); m_engine->showStatusMessage(tr("Attached to process %1.") .arg(m_engine->inferiorPid())); } diff --git a/src/plugins/projectexplorer/customwizard/customwizard.cpp b/src/plugins/projectexplorer/customwizard/customwizard.cpp index b3feff908bf..dbc6878f520 100644 --- a/src/plugins/projectexplorer/customwizard/customwizard.cpp +++ b/src/plugins/projectexplorer/customwizard/customwizard.cpp @@ -148,7 +148,7 @@ static inline bool createFile(Internal::CustomWizardFile cwFile, const QString sourcePath = sourceDirectory + slash + cwFile.source; // Field replacement on target path Internal::CustomWizardContext::replaceFields(fm, &cwFile.target); - const QString targetPath = QDir::toNativeSeparators(targetDirectory + slash + cwFile.target); + const QString targetPath = targetDirectory + slash + cwFile.target; if (CustomWizardPrivate::verbose) qDebug() << "generating " << targetPath << sourcePath << fm; @@ -533,7 +533,8 @@ bool CustomProjectWizard::postGenerateOpen(const Core::GeneratedFiles &l, QStrin if (file.attributes() & Core::GeneratedFile::OpenProjectAttribute) { if (!ProjectExplorer::ProjectExplorerPlugin::instance()->openProject(file.path())) { if (errorMessage) - *errorMessage = tr("The project %1 could not be opened.").arg(file.path()); + *errorMessage = tr("The project %1 could not be opened."). + arg(QDir::toNativeSeparators(file.path())); return false; } } diff --git a/src/plugins/projectexplorer/customwizard/customwizardscriptgenerator.cpp b/src/plugins/projectexplorer/customwizard/customwizardscriptgenerator.cpp index 72f91696429..f650f832bdc 100644 --- a/src/plugins/projectexplorer/customwizard/customwizardscriptgenerator.cpp +++ b/src/plugins/projectexplorer/customwizard/customwizardscriptgenerator.cpp @@ -184,7 +184,7 @@ Core::GeneratedFiles fileInfo.isAbsolute() ? token : (targetPath + QLatin1Char('/') + token); - file.setPath(QDir::toNativeSeparators(fullPath)); + file.setPath(fullPath); } } file.setAttributes(attributes); diff --git a/src/plugins/projectexplorer/projectfilewizardextension.cpp b/src/plugins/projectexplorer/projectfilewizardextension.cpp index 083e629863f..62339ae0f71 100644 --- a/src/plugins/projectexplorer/projectfilewizardextension.cpp +++ b/src/plugins/projectexplorer/projectfilewizardextension.cpp @@ -101,7 +101,7 @@ struct ProjectEntry { int compare(const ProjectEntry &rhs) const; ProjectNode *node; - QString nativeDirectory; // For matching against wizards' files, which are native. + QString directory; // For matching against wizards' files, which are native. QString fileName; QString baseName; Type type; @@ -116,13 +116,13 @@ ProjectEntry::ProjectEntry(ProjectNode *n) : baseName = fi.baseName(); if (fi.suffix() != QLatin1String("pro")) type = PriFile; - nativeDirectory = QDir::toNativeSeparators(fi.absolutePath()); + directory = fi.absolutePath(); } // Sort helper that sorts by base name and puts '*.pro' before '*.pri' int ProjectEntry::compare(const ProjectEntry &rhs) const { - if (const int drc = nativeDirectory.compare(rhs.nativeDirectory)) + if (const int drc = directory.compare(rhs.directory)) return drc; if (const int brc = baseName.compare(rhs.baseName)) return brc; @@ -140,7 +140,7 @@ inline bool operator<(const ProjectEntry &pe1, const ProjectEntry &pe2) QDebug operator<<(QDebug d, const ProjectEntry &e) { - d.nospace() << e.nativeDirectory << ' ' << e.fileName << ' ' << e.type; + d.nospace() << e.directory << ' ' << e.fileName << ' ' << e.type; return d; } @@ -212,7 +212,7 @@ static int findMatchingProject(const QList &projects, const int count = projects.size(); for (int p = 0; p < count; p++) { // Direct match or better match? (note that the wizards' files are native). - const QString &projectDirectory = projects.at(p).nativeDirectory; + const QString &projectDirectory = projects.at(p).directory; if (projectDirectory == commonPath) return p; if (projectDirectory.size() > bestMatchLength @@ -357,7 +357,7 @@ void ProjectFileWizardExtension::initProjectChoices(const QString &generatedProj for (ProjectEntryMap::const_iterator it = entryMap.constBegin(); it != cend; ++it) { m_context->projects.push_back(it.key()); projectChoices.push_back(it.key().fileName); - projectToolTips.push_back(it.key().nativeDirectory); + projectToolTips.push_back(QDir::toNativeSeparators(it.key().directory)); } m_context->page->setProjects(projectChoices); From ce3ad3bae35c5254a88eadc9d85bf88da090d7c3 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 30 Sep 2010 16:54:21 +0200 Subject: [PATCH 057/118] Revert unintended side effect of 111c18e353fbea1de53a5fba95d5698cf33b315c. --- src/plugins/debugger/gdb/attachgdbadapter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/debugger/gdb/attachgdbadapter.cpp b/src/plugins/debugger/gdb/attachgdbadapter.cpp index e65a15a75c1..1de5c646e66 100644 --- a/src/plugins/debugger/gdb/attachgdbadapter.cpp +++ b/src/plugins/debugger/gdb/attachgdbadapter.cpp @@ -78,7 +78,7 @@ void AttachGdbAdapter::runEngine() { QTC_ASSERT(state() == EngineRunRequested, qDebug() << state()); m_engine->notifyEngineRunAndInferiorStopOk(); - //m_engine->continueInferiorInternal(); + m_engine->continueInferiorInternal(); m_engine->showStatusMessage(tr("Attached to process %1.") .arg(m_engine->inferiorPid())); } From 4428d8c3cbd79cab97fa9bad25dd06d824858b5b Mon Sep 17 00:00:00 2001 From: dt Date: Thu, 30 Sep 2010 17:12:42 +0200 Subject: [PATCH 058/118] Session Manager: Fix crashes after renaming Some of the buttons weren't disabled. Reviewed-By: Leandro Melo --- src/plugins/projectexplorer/sessiondialog.cpp | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/plugins/projectexplorer/sessiondialog.cpp b/src/plugins/projectexplorer/sessiondialog.cpp index fa5405cec19..b0978edb2ef 100644 --- a/src/plugins/projectexplorer/sessiondialog.cpp +++ b/src/plugins/projectexplorer/sessiondialog.cpp @@ -189,16 +189,17 @@ void SessionDialog::markItems() void SessionDialog::updateActions() { - bool isDefault = false; - bool isActive = false; - if (m_ui.sessionList->currentItem()) { - isDefault = (m_ui.sessionList->currentItem()->text() == QLatin1String("default")); - isActive = (m_ui.sessionList->currentItem()->text() == m_sessionManager->activeSession()); + bool isDefault = (m_ui.sessionList->currentItem()->text() == QLatin1String("default")); + bool isActive = (m_ui.sessionList->currentItem()->text() == m_sessionManager->activeSession()); + m_ui.btDelete->setEnabled(!isActive && !isDefault); + m_ui.btRename->setEnabled(!isDefault); + } else { + m_ui.btDelete->setEnabled(false); + m_ui.btRename->setEnabled(false); + m_ui.btClone->setEnabled(false); + m_ui.btSwitch->setEnabled(false); } - - m_ui.btDelete->setDisabled(isActive || isDefault); - m_ui.btRename->setDisabled(isDefault); } void SessionDialog::createNew() @@ -262,11 +263,9 @@ void SessionDialog::rename() void SessionDialog::switchToSession() { - if (m_ui.sessionList->currentItem()) { - QString session = m_ui.sessionList->currentItem()->text(); - m_sessionManager->loadSession(session); - markItems(); - } + QString session = m_ui.sessionList->currentItem()->text(); + m_sessionManager->loadSession(session); + markItems(); updateActions(); } From 2d5049645c502b20c2a8c4c2ce800319d067cbd2 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 30 Sep 2010 13:51:05 +0200 Subject: [PATCH 059/118] QmlDesigner: crashfix see QTCREATORBUG-2507 Task-number: QTCREATORBUG-2507 There might be files without an import for Qt States require "Qt" I also added try {} catch blocks to the state editor, to avoid issues like this. Reviewed-by: Kai Koehne --- .../stateseditor/stateseditorview.cpp | 42 +++++++++++++------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp index d59cdaa3044..acda0ca8c56 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp @@ -30,9 +30,11 @@ #include "stateseditorview.h" #include "stateseditormodel.h" #include +#include #include #include +#include #include #include @@ -114,7 +116,12 @@ void StatesEditorView::createState(const QString &name) if (debug) qDebug() << __FUNCTION__ << name; - stateRootNode().states().addState(name); + try { + model()->addImport(Import::createLibraryImport("Qt", "4.7")); + stateRootNode().states().addState(name); + } catch (RewritingException &e) { + QMessageBox::warning(0, "Error", e.description()); + } } void StatesEditorView::removeState(int index) @@ -128,14 +135,18 @@ void StatesEditorView::removeState(int index) setCurrentState(0); - m_thumbnailsToUpdate.removeAt(index); - m_modelStates.removeAll(state); - state.destroy(); + try { + m_modelStates.removeAll(state); + state.destroy(); + m_thumbnailsToUpdate.removeAt(index); - m_editorModel->removeState(index); + m_editorModel->removeState(index); - int newIndex = (index < m_modelStates.count()) ? index : m_modelStates.count() - 1; - setCurrentState(newIndex); + int newIndex = (index < m_modelStates.count()) ? index : m_modelStates.count() - 1; + setCurrentState(newIndex); + } catch (RewritingException &e) { + QMessageBox::warning(0, "Error", e.description()); + } } void StatesEditorView::renameState(int index, const QString &newName) @@ -146,12 +157,17 @@ void StatesEditorView::renameState(int index, const QString &newName) Q_ASSERT(index > 0 && index < m_modelStates.size()); QmlModelState state = m_modelStates.at(index); Q_ASSERT(state.isValid()); - if (state.name() != newName) { - // Jump to base state for the change - QmlModelState oldState = currentState(); - setCurrentStateSilent(0); - state.setName(newName); - setCurrentState(m_modelStates.indexOf(oldState)); + + try { + if (state.name() != newName) { + // Jump to base state for the change + QmlModelState oldState = currentState(); + setCurrentStateSilent(0); + state.setName(newName); + setCurrentState(m_modelStates.indexOf(oldState)); + } + } catch (RewritingException &e) { + QMessageBox::warning(0, "Error", e.description()); } } From 4c185a9ac4477686f01af42534c7d6f28f8598df Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 30 Sep 2010 14:25:20 +0200 Subject: [PATCH 060/118] QmlDesigner.model: rename id is now a proper refactoring operation I an id is now changed in the navaigator or property editor, we now use the qmljseditor to properly refactor. Also I changed dynamic_cast to qobject_cast Reviewed-by: Erik Verbruggen --- .../navigator/navigatortreemodel.cpp | 10 +++++---- .../propertyeditor/propertyeditor.cpp | 11 +++++----- .../designercore/filemanager/qmlrewriter.h | 2 +- .../designercore/include/abstractview.h | 2 ++ .../include/basetexteditmodifier.h | 2 ++ .../include/componenttextmodifier.h | 2 ++ .../include/plaintexteditmodifier.h | 2 ++ .../designercore/include/rewriterview.h | 2 ++ .../designercore/include/textmodifier.h | 2 ++ .../designercore/model/abstractview.cpp | 9 ++++++++ .../model/basetexteditmodifier.cpp | 15 +++++++++++-- .../designercore/model/rewriterview.cpp | 8 +++++++ src/plugins/qmljseditor/qmljseditor.cpp | 21 ++++++++++++------- src/plugins/qmljseditor/qmljseditor.h | 2 ++ 14 files changed, 70 insertions(+), 20 deletions(-) diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index df08b21bda8..d58e9cbc2cf 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -297,10 +298,11 @@ void NavigatorTreeModel::handleChangedItem(QStandardItem *item) ItemRow itemRow = itemRowForNode(node); if (item == itemRow.idItem) { - try { - node.setId(item->text()); - } catch (InvalidIdException &e) { - QMessageBox::warning(0, tr("Invalid Id"), e.description()); + if (node.isValidId(item->text())) { + if (node.view()->rewriterView()) + node.view()->rewriterView()->renameId(node.id(), item->text()); + } else { + QMessageBox::warning(0, tr("Invalid Id"), item->text() + tr(" is an invalid id")); item->setText(node.id()); } } else if (item == itemRow.visibilityItem) { diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp index d368c5950c8..061a1174c59 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp @@ -43,6 +43,7 @@ #include #include +#include #include "propertyeditorvalue.h" #include "basiclayouts.h" @@ -354,13 +355,13 @@ void PropertyEditor::changeValue(const QString &propertyName) PropertyEditorValue *value = qobject_cast(QDeclarativeMetaType::toQObject(m_currentType->m_backendValuesPropertyMap.value(propertyName))); const QString newId = value->value().toString(); - try { - m_selectedNode.setId(newId); - } catch (InvalidIdException &e) { + if (m_selectedNode.isValidId(newId)) { + if (rewriterView()) + rewriterView()->renameId(m_selectedNode.id(), newId); + } else { value->setValue(m_selectedNode.id()); - QMessageBox::warning(0, tr("Invalid Id"), e.description()); + QMessageBox::warning(0, tr("Invalid Id"), newId + tr(" is an invalid id")); } - return; } diff --git a/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.h b/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.h index 435ad6d7e92..6ff913eb73a 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.h +++ b/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.h @@ -77,7 +77,7 @@ protected: { return m_textModifier; } bool includeSurroundingWhitespace(int &start, int &end) const; - void includeLeadingEmptyLine(int &start) const; + void includeLeadingEmptyLine(int &start) const; static QmlJS::AST::UiObjectMemberList *searchMemberToInsertAfter(QmlJS::AST::UiObjectMemberList *members, const QStringList &propertyOrder); static QmlJS::AST::UiObjectMemberList *searchMemberToInsertAfter(QmlJS::AST::UiObjectMemberList *members, const QString &propertyName, const QStringList &propertyOrder); diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h index 118ae560ac9..09016ea663c 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractview.h +++ b/src/plugins/qmldesigner/designercore/include/abstractview.h @@ -55,6 +55,7 @@ namespace QmlDesigner { class QmlModelView; class NodeInstanceView; +class RewriterView; class CORESHARED_EXPORT AbstractView : public QObject { @@ -141,6 +142,7 @@ public: void changeRootNodeType(const QString &type, int majorVersion, int minorVersion); NodeInstanceView *nodeInstanceView() const; + RewriterView *rewriterView() const; protected: void setModel(Model * model); diff --git a/src/plugins/qmldesigner/designercore/include/basetexteditmodifier.h b/src/plugins/qmldesigner/designercore/include/basetexteditmodifier.h index 7c0f05de4c5..cf2f540581d 100644 --- a/src/plugins/qmldesigner/designercore/include/basetexteditmodifier.h +++ b/src/plugins/qmldesigner/designercore/include/basetexteditmodifier.h @@ -53,6 +53,8 @@ public: virtual int indentDepth() const; + virtual bool renameId(const QString &oldId, const QString &newId); + virtual QmlJS::Snapshot getSnapshot() const; virtual QStringList importPaths() const; }; diff --git a/src/plugins/qmldesigner/designercore/include/componenttextmodifier.h b/src/plugins/qmldesigner/designercore/include/componenttextmodifier.h index 4188007a6d6..f60219acfd1 100644 --- a/src/plugins/qmldesigner/designercore/include/componenttextmodifier.h +++ b/src/plugins/qmldesigner/designercore/include/componenttextmodifier.h @@ -61,6 +61,8 @@ public: virtual QmlJS::Snapshot getSnapshot() const; virtual QStringList importPaths() const; + virtual bool renameId(const QString & /* oldId */, const QString & /* newId */) { return false; } + public slots: void contentsChange(int position, int charsRemoved, int charsAdded); diff --git a/src/plugins/qmldesigner/designercore/include/plaintexteditmodifier.h b/src/plugins/qmldesigner/designercore/include/plaintexteditmodifier.h index 2d64599c151..e2e28c1a971 100644 --- a/src/plugins/qmldesigner/designercore/include/plaintexteditmodifier.h +++ b/src/plugins/qmldesigner/designercore/include/plaintexteditmodifier.h @@ -78,6 +78,8 @@ public: virtual QmlJS::Snapshot getSnapshot() const = 0; virtual QStringList importPaths() const = 0; + virtual bool renameId(const QString & /* oldId */, const QString & /* newId */) { return false; } + protected: QPlainTextEdit *plainTextEdit() const { return m_textEdit; } diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h index 3b40ba0fcb9..c53764c4193 100644 --- a/src/plugins/qmldesigner/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h @@ -159,6 +159,8 @@ public: int firstDefinitionInsideLength(const ModelNode &node) const; bool modificationGroupActive(); + bool renameId(const QString& oldId, const QString& newId); + signals: void errorsChanged(const QList &errors); diff --git a/src/plugins/qmldesigner/designercore/include/textmodifier.h b/src/plugins/qmldesigner/designercore/include/textmodifier.h index affbaa4b298..241f0890c8f 100644 --- a/src/plugins/qmldesigner/designercore/include/textmodifier.h +++ b/src/plugins/qmldesigner/designercore/include/textmodifier.h @@ -87,6 +87,8 @@ public: virtual QmlJS::Snapshot getSnapshot() const = 0; virtual QStringList importPaths() const = 0; + virtual bool renameId(const QString &oldId, const QString &newId) = 0; + signals: void textChanged(); diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp index 99707bb651e..2c8a58bb49d 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp @@ -348,6 +348,15 @@ NodeInstanceView *AbstractView::nodeInstanceView() const } } +RewriterView *AbstractView::rewriterView() const +{ + if (model()) { + return model()->m_d->rewriterView(); + } else { + return 0; + } +} + QList AbstractView::allModelNodes() { return toModelNodeList(model()->m_d->allNodes()); diff --git a/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp b/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp index 3127be6ead8..113ee3b471e 100644 --- a/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp +++ b/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include using namespace QmlDesigner; @@ -46,7 +47,7 @@ void BaseTextEditModifier::indent(int offset, int length) if (length == 0 || offset < 0 || offset + length >= text().length()) return; - if (TextEditor::BaseTextEditor *bte = dynamic_cast(plainTextEdit())) { + if (TextEditor::BaseTextEditor *bte = qobject_cast(plainTextEdit())) { // find the applicable block: QTextDocument *doc = bte->document(); QTextCursor tc(doc); @@ -60,13 +61,23 @@ void BaseTextEditModifier::indent(int offset, int length) int BaseTextEditModifier::indentDepth() const { - if (TextEditor::BaseTextEditor *bte = dynamic_cast(plainTextEdit())) { + if (TextEditor::BaseTextEditor *bte = qobject_cast(plainTextEdit())) { return bte->tabSettings().m_indentSize; } else { return 0; } } +bool BaseTextEditModifier::renameId(const QString &oldId, const QString &newId) +{ + if (QmlJSEditor::Internal::QmlJSTextEditor *qmljse = qobject_cast(plainTextEdit())) { + qmljse->renameId(oldId, newId); + return true; + } else { + return false; + } +} + namespace { static inline QmlJS::ModelManagerInterface *getModelManager() { diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index f610f3f6b30..741e05884c0 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -539,6 +539,14 @@ bool RewriterView::modificationGroupActive() return m_modificationGroupActive; } +bool RewriterView::renameId(const QString& oldId, const QString& newId) +{ + if (textModifier()) + return textModifier()->renameId(oldId, newId); + + return false; +} + void RewriterView::qmlTextChanged() { if (inErrorState()) diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index 44f79765804..651586ee43f 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -1045,6 +1045,18 @@ void QmlJSTextEditor::setUpdateSelectedElements(bool value) m_updateSelectedElements = value; } +void QmlJSTextEditor::renameId(const QString &oldId, const QString &newId) +{ + Utils::ChangeSet changeSet; + + foreach (const AST::SourceLocation &loc, m_semanticInfo.idLocations.value(oldId)) { + changeSet.replace(loc.begin(), loc.end(), newId); + } + + QTextCursor tc = textCursor(); + changeSet.apply(&tc); +} + void QmlJSTextEditor::updateUsesNow() { if (document()->revision() != m_semanticInfo.revision()) { @@ -1242,14 +1254,7 @@ void QmlJSTextEditor::renameIdUnderCursor() QLineEdit::Normal, id, &ok); if (ok) { - Utils::ChangeSet changeSet; - - foreach (const AST::SourceLocation &loc, m_semanticInfo.idLocations.value(id)) { - changeSet.replace(loc.begin(), loc.end(), newId); - } - - QTextCursor tc = textCursor(); - changeSet.apply(&tc); + renameId(id, newId); } } diff --git a/src/plugins/qmljseditor/qmljseditor.h b/src/plugins/qmljseditor/qmljseditor.h index d3db0e39dbd..6f5930d7410 100644 --- a/src/plugins/qmljseditor/qmljseditor.h +++ b/src/plugins/qmljseditor/qmljseditor.h @@ -243,6 +243,8 @@ public: bool updateSelectedElements() const; void setUpdateSelectedElements(bool value); + void renameId(const QString &oldId, const QString &newId); + public slots: void followSymbolUnderCursor(); void findUsages(); From 4537a7eb38bb46ce114620591ee64859568ffaec Mon Sep 17 00:00:00 2001 From: Leandro Melo Date: Thu, 30 Sep 2010 17:43:43 +0200 Subject: [PATCH 061/118] Tooltips: Avoid showing too much content. Reviewed-by: Tobias Hunger --- src/libs/utils/htmldocextractor.cpp | 34 ++++++++++++++++------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/libs/utils/htmldocextractor.cpp b/src/libs/utils/htmldocextractor.cpp index 0877be15474..41fd38c1ee8 100644 --- a/src/libs/utils/htmldocextractor.cpp +++ b/src/libs/utils/htmldocextractor.cpp @@ -180,28 +180,32 @@ void HtmlDocExtractor::processOutput(QString *html) const return; if (m_mode == FirstParagraph) { - int index = html->indexOf(QLatin1String("

")); - if (index > 0) { - if (html->at(index - 1) == QLatin1Char('.')) { - index += 4; - html->truncate(index); - } else { - //

Paragraphs similar to this. Example:

- index = html->lastIndexOf(QLatin1Char('.'), index); - if (index > 0) { - html->truncate(index); - html->append(QLatin1String(".

")); + // Try to get the entire first paragraph, but if one is not found or if its opening + // tag is not in the very beginning (using an empirical value as the limit) the html + // is cleared to avoid too much content. + int index = html->indexOf(QLatin1String("

")); + if (index != -1 && index < 400) { + index = html->indexOf(QLatin1String("

"), index + 2); + if (index != -1) { + if (html->at(index - 1) == QLatin1Char('.')) { + html->truncate(index + 4); + } else { + //

Paragraphs similar to this. Example:

+ index = html->lastIndexOf(QLatin1Char('.'), index); + if (index != -1) { + html->truncate(index); + html->append(QLatin1String(".

")); + } } + } else { + html->clear(); } } else { - // Some enumerations don't have paragraphs and just a table with the items. In such - // cases the the html is cleared to avoid showing more that desired. html->clear(); - return; } } - if (m_formatContents) { + if (!html->isEmpty() && m_formatContents) { stripBold(html); replaceNonStyledHeadingsForBold(html); replaceTablesForSimpleLines(html); From b58ebe7d2998415586052f406b8370fe3f33c853 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Thu, 30 Sep 2010 19:00:31 +0200 Subject: [PATCH 062/118] QmlJS indenter: Fix incorrect indent after break/continue. Make sure to push a transitory state before leave(true) so it only finishes the statement - and not the surrounding statement! Reviewed-by: trustme --- src/libs/qmljs/qmljscodeformatter.cpp | 1 + src/libs/qmljs/qmljscodeformatter.h | 3 ++- .../qmlcodeformatter/tst_qmlcodeformatter.cpp | 13 +++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/libs/qmljs/qmljscodeformatter.cpp b/src/libs/qmljs/qmljscodeformatter.cpp index 3213cf31e2f..7ec947b4525 100644 --- a/src/libs/qmljs/qmljscodeformatter.cpp +++ b/src/libs/qmljs/qmljscodeformatter.cpp @@ -645,6 +645,7 @@ bool CodeFormatter::tryStatement() return true; case Break: case Continue: + enter(breakcontinue_statement); leave(true); return true; case Throw: diff --git a/src/libs/qmljs/qmljscodeformatter.h b/src/libs/qmljs/qmljscodeformatter.h index aad77a5f527..da22601bcfa 100644 --- a/src/libs/qmljs/qmljscodeformatter.h +++ b/src/libs/qmljs/qmljscodeformatter.h @@ -143,7 +143,8 @@ public: // must be public to make Q_GADGET introspection work jsblock_open, - empty_statement, // for a ';', will never linger + empty_statement, // for a ';', will be popped directly + breakcontinue_statement, // for continue/break, will be popped directly if_statement, // After 'if' maybe_else, // after the first substatement in an if diff --git a/tests/auto/qml/qmleditor/qmlcodeformatter/tst_qmlcodeformatter.cpp b/tests/auto/qml/qmleditor/qmlcodeformatter/tst_qmlcodeformatter.cpp index 5e1f4c29e70..9b0d05d12e6 100644 --- a/tests/auto/qml/qmleditor/qmlcodeformatter/tst_qmlcodeformatter.cpp +++ b/tests/auto/qml/qmleditor/qmlcodeformatter/tst_qmlcodeformatter.cpp @@ -31,6 +31,7 @@ private Q_SLOTS: void ifStatementWithoutBraces2(); void ifStatementWithBraces1(); void ifStatementWithBraces2(); + void ifStatementWithBraces3(); void ifStatementMixed(); void ifStatementAndComments(); void ifStatementLongCondition(); @@ -543,6 +544,18 @@ void tst_QMLCodeFormatter::ifStatementWithBraces2() checkIndent(data); } +void tst_QMLCodeFormatter::ifStatementWithBraces3() +{ + QList data; + data << Line("function foo() {") + << Line(" if (a) {") + << Line(" continue") + << Line(" }") + << Line(" var foo") + << Line("}"); + checkIndent(data); +} + void tst_QMLCodeFormatter::ifStatementMixed() { QList data; From 2491038f57afaab284bac17f3560206d218af2c7 Mon Sep 17 00:00:00 2001 From: dt Date: Thu, 30 Sep 2010 19:53:28 +0200 Subject: [PATCH 063/118] Qt4ProjectManager: Fix wrong expannding Reviewed-By: ossi --- src/plugins/qt4projectmanager/qt4runconfiguration.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp index 4fe9b7739bf..433986b59f4 100644 --- a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp @@ -542,13 +542,12 @@ QString Qt4RunConfiguration::baseWorkingDirectory() const return ti.workingDir; } - -QStringList Qt4RunConfiguration::baseCommandLineArguments() const +QStringList Qt4RunConfiguration::commandLineArguments() const { - return environment().expandVariables(commandLineArguments()); + return environment().expandVariables(baseCommandLineArguments()); } -QStringList Qt4RunConfiguration::commandLineArguments() const +QStringList Qt4RunConfiguration::baseCommandLineArguments() const { return m_commandLineArguments; } From 6f1c1af833b9deb3c6e68084c44a7c2bc2cfe7f9 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Thu, 30 Sep 2010 11:21:23 +0200 Subject: [PATCH 064/118] QmlJS: Prepare qmldump for multiply exported C++ objects. In the future, builtin objects are going to be exported in Qt 4.7 and QtQuick 1.0. Reviewed-by: Roberto Raggi --- share/qtcreator/qml/qmldump/main.cpp | 106 +++++++++----- src/libs/qmljs/qmljsinterpreter.cpp | 204 ++++++++++++++++++--------- src/libs/qmljs/qmljsinterpreter.h | 3 +- 3 files changed, 205 insertions(+), 108 deletions(-) diff --git a/share/qtcreator/qml/qmldump/main.cpp b/share/qtcreator/qml/qmldump/main.cpp index 61211ee07d9..93f349c98be 100644 --- a/share/qtcreator/qml/qmldump/main.cpp +++ b/share/qtcreator/qml/qmldump/main.cpp @@ -15,15 +15,15 @@ #include #include -static QHash qmlTypeByCppName; -static QHash cppToQml; +static QHash > qmlTypesByCppName; +static QHash cppToId; -QByteArray convertToQmlType(const QByteArray &cppName) +QByteArray convertToId(const QByteArray &cppName) { - QByteArray qmlName = cppToQml.value(cppName, cppName); - qmlName.replace("::", "."); - qmlName.replace("/", "."); - return qmlName; + QByteArray idName = cppToId.value(cppName, cppName); + idName.replace("::", "."); + idName.replace("/", "."); + return idName; } void erasure(QByteArray *typeName, bool *isList, bool *isPointer) @@ -41,7 +41,7 @@ void erasure(QByteArray *typeName, bool *isList, bool *isPointer) erasure(typeName, isList, isPointer); } - *typeName = convertToQmlType(*typeName); + *typeName = convertToId(*typeName); } void processMetaObject(const QMetaObject *meta, QSet *metas) @@ -132,7 +132,7 @@ void dump(const QMetaMethod &meth, QXmlStreamWriter *xml) attributes.append(QXmlStreamAttribute("name", name)); - const QString typeName = convertToQmlType(meth.typeName()); + const QString typeName = convertToId(meth.typeName()); if (! typeName.isEmpty()) attributes.append(QXmlStreamAttribute("type", typeName)); @@ -187,16 +187,12 @@ public: void dump(const QMetaObject *meta, QXmlStreamWriter *xml) { - QByteArray qmlTypeName = convertToQmlType(meta->className()); + QByteArray id = convertToId(meta->className()); xml->writeStartElement("type"); QXmlStreamAttributes attributes; - attributes.append(QXmlStreamAttribute("name", qmlTypeName)); - - if (const QDeclarativeType *qmlTy = qmlTypeByCppName.value(meta->className())) { - attributes.append(QXmlStreamAttribute("version", QString("%1.%2").arg(qmlTy->majorVersion()).arg(qmlTy->minorVersion()))); - } + attributes.append(QXmlStreamAttribute("name", id)); for (int index = meta->classInfoCount() - 1 ; index >= 0 ; --index) { QMetaClassInfo classInfo = meta->classInfo(index); @@ -206,16 +202,31 @@ void dump(const QMetaObject *meta, QXmlStreamWriter *xml) } } - QString version; - if (meta->superClass()) - attributes.append(QXmlStreamAttribute("extends", convertToQmlType(meta->superClass()->className()))); - - if (! version.isEmpty()) - attributes.append(QXmlStreamAttribute("version", version)); + attributes.append(QXmlStreamAttribute("extends", convertToId(meta->superClass()->className()))); xml->writeAttributes(attributes); + QList qmlTypes = qmlTypesByCppName.value(id); + if (!qmlTypes.isEmpty()) { + xml->writeStartElement("exports"); + foreach (const QDeclarativeType *qmlTy, qmlTypes) { + QXmlStreamAttributes moduleAttributes; + const QString qmlTyName = qmlTy->qmlTypeName(); + int slashIdx = qmlTyName.lastIndexOf(QLatin1Char('/')); + if (slashIdx == -1) + continue; + const QString moduleName = qmlTyName.left(slashIdx); + const QString typeName = qmlTyName.mid(slashIdx + 1); + moduleAttributes.append(QXmlStreamAttribute("module", moduleName)); + moduleAttributes.append(QXmlStreamAttribute("version", QString("%1.%2").arg(qmlTy->majorVersion()).arg(qmlTy->minorVersion()))); + moduleAttributes.append(QXmlStreamAttribute("type", typeName)); + xml->writeEmptyElement("export"); + xml->writeAttributes(moduleAttributes); + } + xml->writeEndElement(); + } + for (int index = meta->enumeratorOffset(); index < meta->enumeratorCount(); ++index) dump(meta->enumerator(index), xml); @@ -234,7 +245,7 @@ void writeEasingCurve(QXmlStreamWriter *xml) { QXmlStreamAttributes attributes; attributes.append(QXmlStreamAttribute("name", "QEasingCurve")); - attributes.append(QXmlStreamAttribute("extends", "Qt.Easing")); + attributes.append(QXmlStreamAttribute("extends", "QDeclarativeEasingValueType")); xml->writeAttributes(attributes); } @@ -262,8 +273,22 @@ int main(int argc, char *argv[]) if (!pluginImportPath.isEmpty()) engine->addImportPath(pluginImportPath); + bool hasQtQuickModule = false; + { + QByteArray code = "import QtQuick 1.0; Item {}"; + QDeclarativeComponent c(engine); + c.setData(code, QUrl("xxx")); + c.create(); + if (c.errors().isEmpty()) { + hasQtQuickModule = true; + } + } + QByteArray importCode; importCode += "import Qt 4.7;\n"; + if (hasQtQuickModule) { + importCode += "import QtQuick 1.0;\n"; + } if (pluginImportName.isEmpty()) { importCode += "import Qt.labs.particles 4.7;\n"; importCode += "import Qt.labs.gestures 4.7;\n"; @@ -284,25 +309,25 @@ int main(int argc, char *argv[]) qDebug() << c.errorString(); } - cppToQml.insert("QString", "string"); - cppToQml.insert("QDeclarativeEasingValueType::Type", "Type"); + cppToId.insert("QString", "string"); + cppToId.insert("QDeclarativeEasingValueType::Type", "Type"); QSet metas; metas.insert(FriendlyQObject::qtMeta()); - QMultiHash extensions; + QHash > extensions; foreach (const QDeclarativeType *ty, QDeclarativeMetaType::qmlTypes()) { - qmlTypeByCppName.insert(ty->metaObject()->className(), ty); + qmlTypesByCppName[ty->metaObject()->className()].append(ty); if (ty->isExtendedType()) { - extensions.insert(ty->typeName(), ty->metaObject()->className()); + extensions[ty->typeName()].insert(ty->metaObject()->className()); } else { - cppToQml.insert(ty->metaObject()->className(), ty->qmlTypeName()); + cppToId.insert(ty->metaObject()->className(), ty->metaObject()->className()); } processDeclarativeType(ty, &metas); } - // Adjust qml names of extended objects. + // Adjust ids of extended objects. // The chain ends up being: // __extended__.originalname - the base object // __extension_0_.originalname - first extension @@ -310,14 +335,19 @@ int main(int argc, char *argv[]) // __extension_n-2_.originalname - second to last extension // originalname - last extension foreach (const QByteArray &extendedCpp, extensions.keys()) { - const QByteArray extendedQml = cppToQml.value(extendedCpp); - cppToQml.insert(extendedCpp, "__extended__." + extendedQml); - QList extensionCppNames = extensions.values(extendedCpp); - for (int i = 0; i < extensionCppNames.size() - 1; ++i) { - QByteArray adjustedName = QString("__extension__%1.%2").arg(QString::number(i), QString(extendedQml)).toAscii(); - cppToQml.insert(extensionCppNames.value(i), adjustedName); + const QByteArray extendedId = cppToId.value(extendedCpp); + cppToId.insert(extendedCpp, "__extended__." + extendedId); + QSet extensionCppNames = extensions.value(extendedCpp); + int c = 0; + foreach (const QByteArray &extensionCppName, extensionCppNames) { + if (c != extensionCppNames.size() - 1) { + QByteArray adjustedName = QString("__extension__%1.%2").arg(QString::number(c), QString(extendedId)).toAscii(); + cppToId.insert(extensionCppName, adjustedName); + } else { + cppToId.insert(extensionCppName, extendedId); + } + ++c; } - cppToQml.insert(extensionCppNames.last(), extendedQml); } foreach (const QDeclarativeType *ty, QDeclarativeMetaType::qmlTypes()) { @@ -350,13 +380,13 @@ int main(int argc, char *argv[]) QMap nameToMeta; foreach (const QMetaObject *meta, metas) { - nameToMeta.insert(convertToQmlType(meta->className()), meta); + nameToMeta.insert(convertToId(meta->className()), meta); } foreach (const QMetaObject *meta, nameToMeta) { dump(meta, &xml); } - // define QEasingCurve as an extension of Qt.Easing + // define QEasingCurve as an extension of QDeclarativeEasingValueType writeEasingCurve(&xml); xml.writeEndElement(); diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index 302a6df599b..b293127c34e 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -199,13 +199,19 @@ public: }; class FakeMetaObject { - FakeMetaObject(FakeMetaObject&); - FakeMetaObject &operator=(const FakeMetaObject&); + Q_DISABLE_COPY(FakeMetaObject) - QString m_name; - QString m_package; - QString m_packageNameVersion; - ComponentVersion m_version; +public: + class Export { + public: + QString package; + QString type; + QmlJS::ComponentVersion version; + QString packageNameVersion; + }; + +private: + QList m_exports; const FakeMetaObject *m_super; QString m_superName; QList m_enums; @@ -216,14 +222,26 @@ class FakeMetaObject { QString m_defaultPropertyName; public: - FakeMetaObject(const QString &name, const QString &package, ComponentVersion version) - : m_name(name), m_package(package), m_version(version), m_super(0) + FakeMetaObject() + : m_super(0) { - m_packageNameVersion = QString::fromLatin1("%1.%2 %3.%4").arg( - package, name, - QString::number(version.majorVersion()), QString::number(version.minorVersion())); } + void addExport(const QString &name, const QString &package, QmlJS::ComponentVersion version) + { + Export exp; + exp.type = name; + exp.package = package; + exp.version = version; + exp.packageNameVersion = QString::fromLatin1("%1.%2 %3.%4").arg( + package, name, + QString::number(version.majorVersion()), + QString::number(version.minorVersion())); + m_exports.append(exp); + } + QList exports() const + { return m_exports; } + void setSuperclassName(const QString &superclass) { m_superName = superclass; } QString superclassName() const @@ -233,12 +251,6 @@ public: { m_super = superClass; } const FakeMetaObject *superClass() const { return m_super; } - QString className() const - { return m_name; } - QString packageName() const - { return m_package; } - QString packageClassVersionString() const - { return m_packageNameVersion; } void addEnum(const FakeMetaEnum &fakeEnum) { m_enumNameToIndex.insert(fakeEnum.name(), m_enums.size()); m_enums.append(fakeEnum); } @@ -271,9 +283,6 @@ public: FakeMetaMethod method(int index) const { return m_methods.at(index); } - ComponentVersion version() const - { return m_version; } - QString defaultPropertyName() const { return m_defaultPropertyName; } @@ -404,38 +413,14 @@ private: QString name, defaultPropertyName; QmlJS::ComponentVersion version; QString extends; + QString id; foreach (const QXmlStreamAttribute &attr, _xml.attributes()) { if (attr.name() == QLatin1String("name")) { - name = attr.value().toString(); - if (name.isEmpty()) { + id = attr.value().toString(); + if (id.isEmpty()) { invalidAttr(name, QLatin1String("name"), tag); return; } - } else if (attr.name() == QLatin1String("version")) { - QString versionStr = attr.value().toString(); - int dotIdx = versionStr.indexOf('.'); - if (dotIdx == -1) { - bool ok = false; - const int major = versionStr.toInt(&ok); - if (!ok) { - invalidAttr(versionStr, QLatin1String("version"), tag); - return; - } - version = QmlJS::ComponentVersion(major, QmlJS::ComponentVersion::NoVersion); - } else { - bool ok = false; - const int major = versionStr.left(dotIdx).toInt(&ok); - if (!ok) { - invalidAttr(versionStr, QLatin1String("version"), tag); - return; - } - const int minor = versionStr.mid(dotIdx + 1).toInt(&ok); - if (!ok) { - invalidAttr(versionStr, QLatin1String("version"), tag); - return; - } - version = QmlJS::ComponentVersion(major, minor); - } } else if (attr.name() == QLatin1String("defaultProperty")) { defaultPropertyName = attr.value().toString(); } else if (attr.name() == QLatin1String("extends")) { @@ -451,9 +436,7 @@ private: } } - QString className, packageName; - split(name, &packageName, &className); - FakeMetaObject *metaObject = new FakeMetaObject(className, packageName, version); + FakeMetaObject *metaObject = new FakeMetaObject; if (! extends.isEmpty()) metaObject->setSuperclassName(extends); if (! defaultPropertyName.isEmpty()) @@ -468,14 +451,21 @@ private: readSignal(metaObject); else if (_xml.name() == QLatin1String("method")) readMethod(metaObject); + else if (_xml.name() == QLatin1String("exports")) + readExports(metaObject); else unexpectedElement(_xml.name(), tag); } - if (doInsert) - _objects->insert(name, metaObject); - else + if (metaObject->exports().isEmpty()) { + metaObject->addExport(id, QString(), QmlJS::ComponentVersion()); + } + + if (doInsert) { + _objects->insert(id, metaObject); + } else { delete metaObject; + } } bool split(const QString &name, QString *packageName, QString *className) { @@ -706,6 +696,60 @@ private: metaObject->addMethod(method); } + void readExports(FakeMetaObject *metaObject) + { + Q_ASSERT(metaObject); + QLatin1String tag("exports"); + QLatin1String childTag("export"); + Q_ASSERT(_xml.isStartElement() && _xml.name() == tag); + + while (_xml.readNextStartElement()) { + if (_xml.name() == childTag) { + QString type; + QString package; + QmlJS::ComponentVersion version; + foreach (const QXmlStreamAttribute &attr, _xml.attributes()) { + if (attr.name() == QLatin1String("module")) { + package = attr.value().toString(); + } else if (attr.name() == QLatin1String("type")) { + type = attr.value().toString(); + } else if (attr.name() == QLatin1String("version")) { + QString versionStr = attr.value().toString(); + int dotIdx = versionStr.indexOf('.'); + if (dotIdx == -1) { + bool ok = false; + const int major = versionStr.toInt(&ok); + if (!ok) { + invalidAttr(versionStr, QLatin1String("version"), childTag); + continue; + } + version = QmlJS::ComponentVersion(major, QmlJS::ComponentVersion::NoVersion); + } else { + bool ok = false; + const int major = versionStr.left(dotIdx).toInt(&ok); + if (!ok) { + invalidAttr(versionStr, QLatin1String("version"), childTag); + continue; + } + const int minor = versionStr.mid(dotIdx + 1).toInt(&ok); + if (!ok) { + invalidAttr(versionStr, QLatin1String("version"), childTag); + continue; + } + version = QmlJS::ComponentVersion(major, minor); + } + } else { + ignoreAttr(attr); + } + } + metaObject->addExport(type, package, version); + } else { + unexpectedElement(_xml.name(), childTag); + } + _xml.skipCurrentElement(); // the tag should be empty anyhow + } + } + private: QXmlStreamReader _xml; QMap *_objects; @@ -713,11 +757,12 @@ private: } // end of anonymous namespace -QmlObjectValue::QmlObjectValue(const FakeMetaObject *metaObject, Engine *engine) +QmlObjectValue::QmlObjectValue(const FakeMetaObject *metaObject, int exportIndex, Engine *engine) : ObjectValue(engine), - _metaObject(metaObject) + _metaObject(metaObject), + _exportIndex(exportIndex) { - setClassName(metaObject->className()); // ### TODO: we probably need to do more than just this... + setClassName(metaObject->exports().at(exportIndex).type); // ### TODO: we probably need to do more than just this... } QmlObjectValue::~QmlObjectValue() @@ -834,10 +879,10 @@ const Value *QmlObjectValue::propertyValue(const FakeMetaProperty &prop) const } QString QmlObjectValue::packageName() const -{ return _metaObject->packageName(); } +{ return _metaObject->exports().at(_exportIndex).package; } QmlJS::ComponentVersion QmlObjectValue::version() const -{ return _metaObject->version(); } +{ return _metaObject->exports().at(_exportIndex).version; } QString QmlObjectValue::defaultPropertyName() const { return _metaObject->defaultPropertyName(); } @@ -890,7 +935,7 @@ bool QmlObjectValue::hasChildInPackage() const while (it.hasNext()) { it.next(); const FakeMetaObject *other = it.value()->_metaObject; - if (other->packageName().isEmpty()) + if (other->exports().isEmpty()) continue; for (const FakeMetaObject *iter = other; iter; iter = iter->superClass()) { if (iter == _metaObject) // this object is a parent of other @@ -1981,21 +2026,42 @@ void CppQmlTypes::load(Engine *engine, const QList &obje { // load foreach (const FakeMetaObject *metaObject, objects) { - // make sure we're not loading duplicate objects - if (_typesByFullyQualifiedName.contains(metaObject->packageClassVersionString())) - continue; + for (int i = 0; i < metaObject->exports().size(); ++i) { + const FakeMetaObject::Export &exp = metaObject->exports().at(i); + // make sure we're not loading duplicate objects + if (_typesByFullyQualifiedName.contains(exp.packageNameVersion)) + continue; - QmlObjectValue *objectValue = new QmlObjectValue(metaObject, engine); - _typesByPackage[metaObject->packageName()].append(objectValue); - _typesByFullyQualifiedName[metaObject->packageClassVersionString()] = objectValue; + QmlObjectValue *objectValue = new QmlObjectValue(metaObject, i, engine); + _typesByPackage[exp.package].append(objectValue); + _typesByFullyQualifiedName[exp.packageNameVersion] = objectValue; + } } // set prototype correctly foreach (const FakeMetaObject *metaObject, objects) { - QmlObjectValue *objectValue = _typesByFullyQualifiedName.value(metaObject->packageClassVersionString()); - if (!objectValue || !metaObject->superClass()) - continue; - objectValue->setPrototype(_typesByFullyQualifiedName.value(metaObject->superClass()->packageClassVersionString())); + foreach (const FakeMetaObject::Export &exp, metaObject->exports()) { + QmlObjectValue *objectValue = _typesByFullyQualifiedName.value(exp.packageNameVersion); + if (!objectValue || !metaObject->superClass()) + continue; + bool found = false; + // try to get a prototype from the library first + foreach (const FakeMetaObject::Export &superExports, metaObject->superClass()->exports()) { + if (superExports.package == exp.package) { + objectValue->setPrototype(_typesByFullyQualifiedName.value(superExports.packageNameVersion)); + found = true; + break; + } + } + if (found) + continue; + // otherwise, just use the first available + if (!metaObject->superClass()->exports().isEmpty()) { + objectValue->setPrototype(_typesByFullyQualifiedName.value(metaObject->superClass()->exports().first().packageNameVersion)); + continue; + } + //qWarning() << "Could not find super class for " << exp.packageNameVersion; + } } } diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h index 96df1ebbc15..74858486b5d 100644 --- a/src/libs/qmljs/qmljsinterpreter.h +++ b/src/libs/qmljs/qmljsinterpreter.h @@ -383,7 +383,7 @@ private: class QMLJS_EXPORT QmlObjectValue: public ObjectValue { public: - QmlObjectValue(const FakeMetaObject *metaObject, Engine *engine); + QmlObjectValue(const FakeMetaObject *metaObject, int exportIndex, Engine *engine); virtual ~QmlObjectValue(); virtual void processMembers(MemberProcessor *processor) const; @@ -404,6 +404,7 @@ protected: private: const FakeMetaObject *_metaObject; + const int _exportIndex; mutable QHash _metaSignature; }; From 4c0814f7def1e04d7b79e8b509d6b58bc68bed5d Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Thu, 30 Sep 2010 11:43:33 +0200 Subject: [PATCH 065/118] QmlJS: Update qml type definitions for qmldump changes and QtQuick module This adds the QtQuick 1.0 module to the code model. Reviewed-by: TrustMe --- .../qml-builtin-types.xml | 4061 +++++++++-------- .../qmlproject-types.xml | 15 + .../qmlruntime-types.xml | 3 + 3 files changed, 2224 insertions(+), 1855 deletions(-) diff --git a/share/qtcreator/qml-type-descriptions/qml-builtin-types.xml b/share/qtcreator/qml-type-descriptions/qml-builtin-types.xml index af4b85b5525..726298b387e 100644 --- a/share/qtcreator/qml-type-descriptions/qml-builtin-types.xml +++ b/share/qtcreator/qml-type-descriptions/qml-builtin-types.xml @@ -1,6 +1,6 @@ - + @@ -86,7 +86,7 @@ - + @@ -134,13 +134,6 @@ - - - - - - - @@ -157,7 +150,63 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -166,7 +215,7 @@ - + @@ -202,31 +251,528 @@ - - + + + + + + + + + + + + + + - + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -243,14 +789,474 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -260,25 +1266,881 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -297,13 +2159,13 @@ - + - + - + @@ -330,7 +2192,169 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -359,8 +2383,56 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -380,7 +2452,91 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -498,44 +2654,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -571,44 +2689,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1353,28 +3433,6 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -1556,1732 +3614,24 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -3300,4 +3650,5 @@ + diff --git a/share/qtcreator/qml-type-descriptions/qmlproject-types.xml b/share/qtcreator/qml-type-descriptions/qmlproject-types.xml index 1b3e35fc9cc..f8ae4aa1bcc 100644 --- a/share/qtcreator/qml-type-descriptions/qmlproject-types.xml +++ b/share/qtcreator/qml-type-descriptions/qmlproject-types.xml @@ -1,6 +1,9 @@ + + + @@ -14,14 +17,26 @@ + + + + + + + + + + + + diff --git a/share/qtcreator/qml-type-descriptions/qmlruntime-types.xml b/share/qtcreator/qml-type-descriptions/qmlruntime-types.xml index b1e851edd37..362968d9e3d 100644 --- a/share/qtcreator/qml-type-descriptions/qmlruntime-types.xml +++ b/share/qtcreator/qml-type-descriptions/qmlruntime-types.xml @@ -1,6 +1,9 @@ + + + From 3e104ce405281fb23ff2ffab24321d07ea7aa0f4 Mon Sep 17 00:00:00 2001 From: Leandro Melo Date: Fri, 1 Oct 2010 11:15:28 +0200 Subject: [PATCH 066/118] Tooltips: Do not show -qtnamespace (if any) in the tips. This is basically for consistency with the docs and with the html extraction mechanism. Reviewed-by: Roberto Raggi --- src/plugins/cppeditor/cppelementevaluator.cpp | 36 +++++++++++-------- src/plugins/cppeditor/cpphoverhandler.cpp | 22 +++++++++--- 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/src/plugins/cppeditor/cppelementevaluator.cpp b/src/plugins/cppeditor/cppelementevaluator.cpp index 19f768fd290..cfb1fd77f50 100644 --- a/src/plugins/cppeditor/cppelementevaluator.cpp +++ b/src/plugins/cppeditor/cppelementevaluator.cpp @@ -66,6 +66,18 @@ namespace { ch = doc->characterAt(tc->position()); } } + + QStringList stripName(const QString &name) { + QStringList all; + all << name; + int colonColon = 0; + const int size = name.size(); + while ((colonColon = name.indexOf(QLatin1String("::"), colonColon)) != -1) { + all << name.right(size - colonColon - 2); + colonColon += 2; + } + return all; + } } CppElementEvaluator::CppElementEvaluator(CPPEditor *editor) : @@ -314,16 +326,7 @@ CppDeclarableElement::CppDeclarableElement(Symbol *declaration) : CppElement() declaration->enclosingScope()->isNamespace() || declaration->enclosingScope()->isEnum()) { m_qualifiedName = overview.prettyName(LookupContext::fullyQualifiedName(declaration)); - - QStringList helpIds; - helpIds << m_qualifiedName; - int colonColon = 0; - const int size = m_qualifiedName.size(); - while ((colonColon = m_qualifiedName.indexOf(QLatin1String("::"), colonColon)) != -1) { - helpIds << m_qualifiedName.right(size - colonColon - 2); - colonColon += 2; - } - setHelpIdCandidates(helpIds); + setHelpIdCandidates(stripName(m_qualifiedName)); } else { m_qualifiedName = m_name; setHelpIdCandidates(QStringList(m_name)); @@ -489,10 +492,15 @@ CppVariable::CppVariable(Symbol *declaration, const LookupContext &context, Scop Symbol *symbol = clazz->symbols().at(0); const QString &name = overview.prettyName(LookupContext::fullyQualifiedName(symbol)); - setTooltip(name); - setHelpCategory(TextEditor::HelpItem::ClassOrNamespace); - setHelpMark(name); - setHelpIdCandidates(QStringList(name)); + if (!name.isEmpty()) { + setTooltip(name); + setHelpCategory(TextEditor::HelpItem::ClassOrNamespace); + const QStringList &allNames = stripName(name); + if (!allNames.isEmpty()) { + setHelpMark(allNames.last()); + setHelpIdCandidates(allNames); + } + } } } } diff --git a/src/plugins/cppeditor/cpphoverhandler.cpp b/src/plugins/cppeditor/cpphoverhandler.cpp index 2168bc9e2d1..c8d1a9ffad1 100644 --- a/src/plugins/cppeditor/cpphoverhandler.cpp +++ b/src/plugins/cppeditor/cpphoverhandler.cpp @@ -114,14 +114,26 @@ void CppHoverHandler::decorateToolTip() const TextEditor::HelpItem &help = lastHelpItemIdentified(); if (help.isValid()) { + // If Qt is built with a namespace, we still show the tip without it, as + // it is in the docs and for consistency with the doc extraction mechanism. + const TextEditor::HelpItem::Category category = help.category(); const QString &contents = help.extractContent(false); if (!contents.isEmpty()) { - if (help.category() == TextEditor::HelpItem::ClassOrNamespace) { - setToolTip(Qt::escape(toolTip())); - appendToolTip(contents); - } else { + if (category == TextEditor::HelpItem::ClassOrNamespace) + setToolTip(help.helpId() + contents); + else setToolTip(contents); - } + } else if (category == TextEditor::HelpItem::Typedef || + category == TextEditor::HelpItem::Enum || + category == TextEditor::HelpItem::ClassOrNamespace) { + // This approach is a bit limited since it cannot be used for functions + // because the help id doesn't really help in that case. + QString prefix; + if (category == TextEditor::HelpItem::Typedef) + prefix = QLatin1String("typedef "); + else if (category == TextEditor::HelpItem::Enum) + prefix = QLatin1String("enum "); + setToolTip(prefix + help.helpId()); } addF1ToToolTip(); } From 922e8e7866624e62f11f0ace2773960377299436 Mon Sep 17 00:00:00 2001 From: Leandro Melo Date: Fri, 1 Oct 2010 11:54:35 +0200 Subject: [PATCH 067/118] Help: All candidates (considering name qualification) are already in the list. The C++ hover handler should just iterate over the list of candidates, since it was created by the element evaluator considering all possible name qualifications and in the right order. Reviewed-by: kh1 --- src/plugins/cppeditor/cpphoverhandler.cpp | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/src/plugins/cppeditor/cpphoverhandler.cpp b/src/plugins/cppeditor/cpphoverhandler.cpp index c8d1a9ffad1..bd448ddafb9 100644 --- a/src/plugins/cppeditor/cpphoverhandler.cpp +++ b/src/plugins/cppeditor/cpphoverhandler.cpp @@ -46,16 +46,6 @@ using namespace CppEditor::Internal; using namespace Core; -namespace { - QString removeClassNameQualification(const QString &name) { - const int index = name.lastIndexOf(QLatin1Char(':')); - if (index == -1) - return name; - else - return name.right(name.length() - index - 1); - } -} - CppHoverHandler::CppHoverHandler(QObject *parent) : BaseHoverHandler(parent) {} @@ -87,16 +77,8 @@ void CppHoverHandler::identifyMatch(TextEditor::ITextEditor *editor, int pos) QSharedPointer cppElement = evaluator.identifyCppElement(); if (!cppElement.isNull()) { setToolTip(cppElement->tooltip()); - foreach (QString helpId, cppElement->helpIdCandidates()) { - bool found = false; + foreach (const QString &helpId, cppElement->helpIdCandidates()) { if (!Core::HelpManager::instance()->linksForIdentifier(helpId).isEmpty()) { - found = true; - } else { - helpId = removeClassNameQualification(helpId); - if (!Core::HelpManager::instance()->linksForIdentifier(helpId).isEmpty()) - found = true; - } - if (found) { setLastHelpItemIdentified(TextEditor::HelpItem(helpId, cppElement->helpMark(), cppElement->helpCategory())); From d856bdf00274207d1ba77cc561195cdd9e471569 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 1 Oct 2010 12:16:39 +0200 Subject: [PATCH 068/118] Update Polish translations --- share/qtcreator/translations/qtcreator_pl.ts | 102 ++++++++++--------- 1 file changed, 52 insertions(+), 50 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_pl.ts b/share/qtcreator/translations/qtcreator_pl.ts index c6d6120b74b..8bbd70645df 100644 --- a/share/qtcreator/translations/qtcreator_pl.ts +++ b/share/qtcreator/translations/qtcreator_pl.ts @@ -76,7 +76,7 @@ URL: - + URL: @@ -278,7 +278,7 @@ Check All Check all for submit - Zaznacz wszystko + Zaznacz wszystko Uncheck All @@ -781,7 +781,7 @@ p, li { white-space: pre-wrap; } Break on exception - + Przerwij w wyjątku @@ -877,7 +877,7 @@ It is not strictly necessary for debugging with Qt Creator. Use QML Observer - + Użyj QML Observera @@ -1734,7 +1734,7 @@ Dodaj, zmodyfikuj lub usuń filtry dokumentów, które determinują zestaw dokum Return to editor on closing the last page - + Powracaj do edytora po zamknięciu ostatniej strony @@ -2736,7 +2736,7 @@ p, li { white-space: pre-wrap; } Debugging helpers: - + Asystenci debuggera: @@ -5640,7 +5640,7 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Repository status - + Stan składnicy The initial revision %1 cannot be described. @@ -5880,11 +5880,11 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Add Breakpoint... - + Dodaj pułapkę... Edit Breakpoint Properties - + Zmodyfikuj właściwości pułapki Set Breakpoint... @@ -6099,11 +6099,11 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. Initializing dumpers... - + Inicjalizacja zrzutów... Disabling dumpers due to debuggee crash... - + Wyłączanie zrzutów z powodu zakończenia pracy debugowanego programu... Querying dumpers for '%1'/'%2' (%3) @@ -6277,11 +6277,11 @@ Zwróć uwagę że spowoduje to usunięcie lokalnego pliku. This switches the Locals&&Watchers view to automatically dereference pointers. This saves a level in the tree view, but also loses data for the now-missing intermediate level. - + Włącza automatyczne wyłuskiwanie wskaźników w widoku ze zmiennymi lokalnymi i obserwowanymi. Brak jednego poziomu w widoku upraszcza go, ale jednocześnie powoduje utratę danych w brakującym poziomie pośrednim. Use QML Observer - + Użyj QML Observera Synchronize Breakpoints @@ -8208,7 +8208,7 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. Raw pointer - + Wskaźnik Latin1 string @@ -8251,10 +8251,10 @@ Zaleca się użycie gdb wersji 7.1 lub późniejszej. %n known types, Qt version: %1, Qt namespace: %2 Dumper version: %3 - - - - + + %n znany typ, wersja Qt: %1, przestrzeń nazw Qt: %2, wersja zrzutu: %3 + %n znane typy, wersja Qt: %1, przestrzeń nazw Qt: %2, wersja zrzutu: %3 + %n znanych typów, wersja Qt: %1, przestrzeń nazw Qt: %2, wersja zrzutu: %3 @@ -11434,11 +11434,11 @@ do projektu "%2". Simplify Tree - + Uprość drzewo Hide Generated Files - + Ukryj wygenerowane pliki Synchronize with Editor @@ -11453,7 +11453,7 @@ do projektu "%2". Filter Tree - + Przefiltruj drzewo Filter tree @@ -12243,7 +12243,7 @@ S60 emulator run configuration default display name, %1 is base pro-File name
Clean - + Wyczyść Add Library... @@ -12447,12 +12447,12 @@ S60 emulator run configuration default display name, %1 is base pro-File name Binary not found - + Nie znaleziono pliku binarnego <html><body><table><tr><td>File:</td><td><pre>%1</pre></td></tr><tr><td>Last&nbsp;modified:</td><td>%2</td></tr><tr><td>Size:</td><td>%3 Bytes</td></tr><tr><td>File:</td><td><pre>%4</pre></td></tr><tr><td>Last&nbsp;modified:</td><td>%5</td></tr><tr><td>Size:</td><td>%6 Bytes</td></tr><tr><td>File:</td><td><pre>%7</pre></td></tr><tr><td>Last&nbsp;modified:</td><td>%8</td></tr><tr><td>Size:</td><td>%9 Bytes</td></tr></table></body></html> Tooltip showing the debugging helper library file. - + <html><body><table><tr><td>Plik:</td><td><pre>%1</pre></td></tr><tr><td>Ostatnio&nbsp;zmodyfikowany:</td><td>%2</td></tr><tr><td>Rozmiar:</td><td>%3 Bajtów</td></tr><tr><td>Plik:</td><td><pre>%4</pre></td></tr><tr><td>Ostatnio&nbsp;zmodyfikowany:</td><td>%5</td></tr><tr><td>Rozmiar:</td><td>%6 Bajtów</td></tr><tr><td>Plik:</td><td><pre>%7</pre></td></tr><tr><td>Ostatnio&nbsp;zmodyfikowany:</td><td>%8</td></tr><tr><td>Rozmiar:</td><td>%9 Bajtów</td></tr></table></body></html> <html><body><table><tr><td>File:</td><td><pre>%1</pre></td></tr><tr><td>Last&nbsp;modified:</td><td>%2</td></tr><tr><td>Size:</td><td>%3 Bytes</td></tr></table></body></html> @@ -13822,7 +13822,7 @@ Następujące kodowania będą najprawdopodobniej pasowały: Local - + Zmienna lokalna Field @@ -13830,7 +13830,7 @@ Następujące kodowania będą najprawdopodobniej pasowały: Static - Statyczne + Statyczna Virtual Method @@ -16835,7 +16835,7 @@ Wartość dziesiętna ze znakiem (big endian): %4 Memory... - + Pamięć... Alt+L @@ -18708,11 +18708,11 @@ Errors: New Qt Quick UI Project - + Nowy Qt Quick UI projekt This wizard generates a Qt Quick UI project. - + Ten kreator generuje Qt Quick UI projekt. @@ -18743,7 +18743,7 @@ Projekty aplikacji QML są uruchamiane przez przeglądarkę QML i nie muszą by Qt Quick UI - + Qt Quick UI Creates a Qt Quick UI project with a single QML file that contains the main view. @@ -18857,7 +18857,7 @@ You can review Qt Quick UI projects in the QML Viewer and you need not build the Arguments: - Argumenty: + Argumenty: Debugger: @@ -20721,7 +20721,7 @@ should a repository require SSH-authentication (see documentation on SSH and the Packaging for Maemo - + Pakowanie dla Maemo Package up to date. @@ -20755,7 +20755,9 @@ should a repository require SSH-authentication (see documentation on SSH and the Your project name contains characters not allowed in Debian packages. They must only use lower-case letters, numbers, '-', '+' and '.'. We will try to work around that, but you may experience problems. - + Nazwa projektu zawiera znaki które są niedozwolone w pakietach Debiana. +Dozwolonymi znakami są tylko małe litery, liczby, '-', '+' oraz '.'. +Przy obecnej nazwie możesz spodziewać się problemów. Packaging Error: Command '%1' failed. @@ -20933,11 +20935,11 @@ We will try to work around that, but you may experience problems. Qmake does not support build directories below the source directory. - + Qmake nie obsługuje budowania w katalogach poniżej katalogu ze źródłami. The build directory needs to be at the same level as the source directory. - + Katalog przeznaczony do budowania musi być na tym samym poziomie co katalog ze źródłami. @@ -21202,7 +21204,7 @@ Identyfikatory muszą rozpoczynać się małą literą. ContextPaneWidgetBorderImage Form - Formularz + Formularz Stretch vertically. Scales the image to fit to the available area. @@ -21233,7 +21235,7 @@ Identyfikatory muszą rozpoczynać się małą literą. ContextPaneWidgetImage Form - Formularz + Formularz The image is scaled to fit @@ -21261,7 +21263,7 @@ Identyfikatory muszą rozpoczynać się małą literą. 10 x 10 - 10 x 10 + 10 x 10 @@ -21295,7 +21297,7 @@ Identyfikatory muszą rozpoczynać się małą literą. Play simulation - + Odtwórz symulację Easing @@ -21307,7 +21309,7 @@ Identyfikatory muszą rozpoczynać się małą literą. Subtype - + Podtyp Acceleration or deceleration of easing curve @@ -21315,23 +21317,23 @@ Identyfikatory muszą rozpoczynać się małą literą. Duration - + Czas trwania Duration of animation - + Czas trwania animacji INVALID - + NIEPOPRAWNA WARTOŚĆ ms - + ms Amplitude - + Amplituda Amplitude of elastic and bounce easing curves @@ -21339,7 +21341,7 @@ Identyfikatory muszą rozpoczynać się małą literą. Period - + Okres Easing period of an elastic curve @@ -21347,7 +21349,7 @@ Identyfikatory muszą rozpoczynać się małą literą. Overshoot - + Przestrzał Easing overshoot for a back curve @@ -21366,7 +21368,7 @@ Identyfikatory muszą rozpoczynać się małą literą. Show Subprojects - + Pokaż podprojekty @@ -21432,11 +21434,11 @@ Identyfikatory muszą rozpoczynać się małą literą. Edit Breakpoint Properties - + Zmodyfikuj właściwości pułapki Use full path: - + Użyj pełnej ścieżki: From b4af592dc03bcde882cb6065555d4c48ae9fc1a3 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 1 Oct 2010 11:49:55 +0200 Subject: [PATCH 069/118] Maemo: Make states of remote mounter explicit. Reviewed-by: kh1 --- .../qt-maemo/maemoremotemounter.cpp | 106 ++++++++++++++---- .../qt-maemo/maemoremotemounter.h | 11 +- 2 files changed, 93 insertions(+), 24 deletions(-) diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.cpp index 734cc0750c6..32403854ae4 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.cpp @@ -35,9 +35,12 @@ #include #include #include +#include #include +#define ASSERT_STATE(state) assertState(state, Q_FUNC_INFO) + using namespace Core; namespace Qt4ProjectManager { @@ -45,7 +48,7 @@ namespace Internal { MaemoRemoteMounter::MaemoRemoteMounter(QObject *parent) : QObject(parent), m_utfsServerTimer(new QTimer(this)), - m_uploadJobId(SftpInvalidJob), m_stop(false) + m_uploadJobId(SftpInvalidJob), m_state(Inactive) { connect(m_utfsServerTimer, SIGNAL(timeout()), this, SLOT(handleUtfsServerTimeout())); @@ -58,12 +61,16 @@ MaemoRemoteMounter::~MaemoRemoteMounter() void MaemoRemoteMounter::setConnection(const Core::SshConnection::Ptr &connection) { + ASSERT_STATE(Inactive); + m_connection = connection; } bool MaemoRemoteMounter::addMountSpecification(const MaemoMountSpecification &mountSpec, bool mountAsRoot) { + ASSERT_STATE(Inactive); + if (mountSpec.isValid()) { if (!m_portList.hasMore()) return false; @@ -75,21 +82,27 @@ bool MaemoRemoteMounter::addMountSpecification(const MaemoMountSpecification &mo void MaemoRemoteMounter::mount() { - m_stop = false; + ASSERT_STATE(Inactive); Q_ASSERT(m_utfsServers.isEmpty()); + Q_ASSERT(m_connection); if (!m_toolChain->allowsRemoteMounts()) m_mountSpecs.clear(); - if (m_mountSpecs.isEmpty()) + if (m_mountSpecs.isEmpty()) { + m_state = Inactive; + emit reportProgress(tr("No directories to mount")); emit mounted(); - else + } else { deployUtfsClient(); + } } void MaemoRemoteMounter::unmount() { - m_stop = false; + ASSERT_STATE(Inactive); + if (m_mountSpecs.isEmpty()) { + emit reportProgress(tr("No directories to unmount")); emit unmounted(); return; } @@ -108,13 +121,17 @@ void MaemoRemoteMounter::unmount() SLOT(handleUnmountProcessFinished(int))); connect(m_unmountProcess.data(), SIGNAL(errorOutputAvailable(QByteArray)), this, SLOT(handleUmountStderr(QByteArray))); + m_state = Unmounting; m_unmountProcess->start(); } void MaemoRemoteMounter::handleUnmountProcessFinished(int exitStatus) { - if (m_stop) + ASSERT_STATE(QList() << Unmounting << Inactive); + + if (m_state == Inactive) return; + m_state = Inactive; QString errorMsg; switch (exitStatus) { @@ -148,7 +165,7 @@ void MaemoRemoteMounter::handleUnmountProcessFinished(int exitStatus) void MaemoRemoteMounter::stop() { - m_stop = true; + m_state = Inactive; if (m_utfsClientUploader) { disconnect(m_utfsClientUploader.data(), 0, this, 0); m_utfsClientUploader->closeChannel(); @@ -172,19 +189,24 @@ void MaemoRemoteMounter::deployUtfsClient() connect(m_utfsClientUploader.data(), SIGNAL(initializationFailed(QString)), this, SLOT(handleUploaderInitializationFailed(QString))); m_utfsClientUploader->initialize(); + + m_state = UploaderInitializing; } void MaemoRemoteMounter::handleUploaderInitializationFailed(const QString &reason) { - if (m_stop) - return; + ASSERT_STATE(QList() << UploaderInitializing << Inactive); - emit error(tr("Failed to establish SFTP connection: %1").arg(reason)); + if (m_state == UploaderInitializing) { + emit error(tr("Failed to establish SFTP connection: %1").arg(reason)); + m_state = Inactive; + } } void MaemoRemoteMounter::handleUploaderInitialized() { - if (m_stop) + ASSERT_STATE(QList() << UploaderInitializing << Inactive); + if (m_state == Inactive) return; emit reportProgress(tr("Uploading UTFS client...")); @@ -195,14 +217,20 @@ void MaemoRemoteMounter::handleUploaderInitialized() = m_toolChain->maddeRoot() + QLatin1String("/madlib/armel/utfs-client"); m_uploadJobId = m_utfsClientUploader->uploadFile(localFile, utfsClientOnDevice(), SftpOverwriteExisting); - if (m_uploadJobId == SftpInvalidJob) + if (m_uploadJobId == SftpInvalidJob) { + m_state = Inactive; emit error(tr("Could not upload UTFS client (%1).").arg(localFile)); + } + + m_state = UploadRunning; } void MaemoRemoteMounter::handleUploadFinished(Core::SftpJobId jobId, const QString &errorMsg) { - if (m_stop) + ASSERT_STATE(QList() << UploadRunning << Inactive); + + if (m_state == Inactive) return; if (jobId != m_uploadJobId) { @@ -213,6 +241,7 @@ void MaemoRemoteMounter::handleUploadFinished(Core::SftpJobId jobId, m_uploadJobId = SftpInvalidJob; if (!errorMsg.isEmpty()) { emit error(tr("Could not upload UTFS client: %1").arg(errorMsg)); + m_state = Inactive; return; } @@ -255,22 +284,32 @@ void MaemoRemoteMounter::startUtfsClients() connect(m_mountProcess.data(), SIGNAL(errorOutputAvailable(QByteArray)), this, SLOT(handleUtfsClientStderr(QByteArray))); m_mountProcess->start(); + + m_state = UtfsClientsStarting; } void MaemoRemoteMounter::handleUtfsClientsStarted() { - if (!m_stop) + ASSERT_STATE(QList() << UtfsClientsStarting << Inactive); + if (m_state == UtfsClientsStarting) { + m_state = UtfsClientsStarted; QTimer::singleShot(250, this, SLOT(startUtfsServers())); + } } void MaemoRemoteMounter::handleUtfsClientsFinished(int exitStatus) { - if (m_stop) + ASSERT_STATE(QList() << UtfsClientsStarting << UtfsClientsStarted + << UtfsServersStarted << Inactive); + + if (m_state == Inactive) return; + m_state = Inactive; if (exitStatus == SshRemoteProcess::ExitedNormally && m_mountProcess->exitCode() == 0) { m_utfsServerTimer->stop(); + emit reportProgress(tr("Mount operation succeeded.")); emit mounted(); } else { QString errMsg = tr("Failure running UTFS client: %1") @@ -284,7 +323,9 @@ void MaemoRemoteMounter::handleUtfsClientsFinished(int exitStatus) void MaemoRemoteMounter::startUtfsServers() { - if (m_stop) + ASSERT_STATE(QList() << UtfsClientsStarted << Inactive); + + if (m_state == Inactive) return; emit reportProgress(tr("Starting UTFS servers...")); @@ -310,11 +351,13 @@ void MaemoRemoteMounter::startUtfsServers() m_utfsServers << utfsServerProc; utfsServerProc->start(utfsServer(), utfsServerArgs); } + + m_state = UtfsServersStarted; } void MaemoRemoteMounter::handleUtfsServerStderr() { - if (!m_stop) { + if (m_state != Inactive) { QProcess * const proc = static_cast(sender()); const QByteArray &output = proc->readAllStandardError(); emit debugOutput(QString::fromLocal8Bit(output)); @@ -323,7 +366,7 @@ void MaemoRemoteMounter::handleUtfsServerStderr() void MaemoRemoteMounter::handleUtfsServerError(QProcess::ProcessError) { - if (m_stop || m_utfsServers.isEmpty()) + if (m_state == Inactive || m_utfsServers.isEmpty()) return; QProcess * const proc = static_cast(sender()); @@ -336,23 +379,27 @@ void MaemoRemoteMounter::handleUtfsServerError(QProcess::ProcessError) killAllUtfsServers(); m_utfsServerTimer->stop(); emit error(tr("Error running UTFS server: %1").arg(errorString)); + + m_state = Inactive; } void MaemoRemoteMounter::handleUtfsServerFinished(int /* exitCode */, QProcess::ExitStatus exitStatus) { - if (!m_stop && exitStatus != QProcess::NormalExit) + if (m_state != Inactive && exitStatus != QProcess::NormalExit) handleUtfsServerError(static_cast(sender())->error()); } void MaemoRemoteMounter::handleUtfsClientStderr(const QByteArray &output) { - m_utfsClientStderr += output; + if (m_state != Inactive) + m_utfsClientStderr += output; } void MaemoRemoteMounter::handleUmountStderr(const QByteArray &output) { - m_umountStderr += output; + if (m_state != Inactive) + m_umountStderr += output; } QString MaemoRemoteMounter::utfsClientOnDevice() const @@ -383,11 +430,26 @@ void MaemoRemoteMounter::killUtfsServer(QProcess *proc) void MaemoRemoteMounter::handleUtfsServerTimeout() { - if (m_stop) + ASSERT_STATE(QList() << UtfsServersStarted << Inactive); + if (m_state == Inactive) return; killAllUtfsServers(); emit error(tr("Timeout waiting for UTFS servers to connect.")); + + m_state = Inactive; +} + +void MaemoRemoteMounter::assertState(State expectedState, const char *func) +{ + assertState(QList() << expectedState, func); +} + +void MaemoRemoteMounter::assertState(const QList &expectedStates, + const char *func) +{ + QTC_ASSERT(expectedStates.contains(m_state), + qDebug("Unexpected state %d at %s.", m_state, func)) } } // namespace Internal diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.h b/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.h index 334426a1373..155bb4a210b 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.h @@ -75,7 +75,7 @@ signals: void mounted(); void unmounted(); void error(const QString &reason); - void reportProgress(const QString &progressOutput); + void reportProgress(const QString &progressOutput); // TODO: No progress output when there's nothingt to mount void debugOutput(const QString &output); private slots: @@ -123,10 +123,17 @@ private: typedef QSharedPointer ProcPtr; QList m_utfsServers; - bool m_stop; QByteArray m_utfsClientStderr; QByteArray m_umountStderr; MaemoPortList m_portList; + + enum State { + Inactive, Unmounting, UploaderInitializing, UploadRunning, + UtfsClientsStarting, UtfsClientsStarted, UtfsServersStarted + }; + void assertState(State expectedState, const char *func); + void assertState(const QList &expectedStates, const char *func); + State m_state; }; } // namespace Internal From 9a49ad003a8d9f5d73646de306ab2b60ace8e0d7 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 1 Oct 2010 13:17:59 +0200 Subject: [PATCH 070/118] QmlDesigner: using QtQuick 1.0 instead of Qt 4.7 huge renaming from Qt to QtQuick propertyeditor qml files moved from Qt to QtQuick auotests fixed files used in tests fixed autotests pass Task-number: QTCREATORBUG-2556 Reviewed-by: Kai Koehne --- .../propertyeditor/Qt/ComboBox.qml | 71 -- .../AlignmentHorizontalButtons.qml | 0 .../AlignmentVerticalButtons.qml | 0 .../{Qt => QtQuick}/AnchorBox.qml | 0 .../{Qt => QtQuick}/AnchorButtons.qml | 0 .../{Qt => QtQuick}/BorderImageSpecifics.qml | 0 .../{Qt => QtQuick}/CheckBox.qml | 0 .../{Qt => QtQuick}/ColorGroupBox.qml | 0 .../{Qt => QtQuick}/ColorLabel.qml | 0 .../{Qt => QtQuick}/ColorScheme.qml | 0 .../{Qt => QtQuick}/ColorTypeButtons.qml | 0 .../{Qt => QtQuick}/ColumnSpecifics.qml | 0 .../{Qt => QtQuick}/DoubleSpinBox.qml | 0 .../DoubleSpinBoxAlternate.qml | 2 + .../{Qt => QtQuick}/ExpressionEditor.qml | 0 .../{Qt => QtQuick}/Extended.qml | 0 .../ExtendedFunctionButton.qml | 0 .../{Qt => QtQuick}/ExtendedPane.qml | 0 .../{Qt => QtQuick}/ExtendedSwitches.qml | 0 .../{Qt => QtQuick}/FlagedButton.qml | 0 .../{Qt => QtQuick}/FlickableSpecifics.qml | 0 .../{Qt => QtQuick}/FlipableSpecifics.qml | 0 .../{Qt => QtQuick}/FontComboBox.qml | 0 .../{Qt => QtQuick}/FontGroupBox.qml | 0 .../{Qt => QtQuick}/FontStyleButtons.qml | 0 .../{Qt => QtQuick}/Geometry.qml | 0 .../{Qt => QtQuick}/GridSpecifics.qml | 0 .../{Qt => QtQuick}/GroupBox.qml | 0 .../{Qt => QtQuick}/GroupBoxOption.qml | 0 .../{Qt => QtQuick}/HorizontalLayout.qml | 0 .../{Qt => QtQuick}/HorizontalWhiteLine.qml | 0 .../{Qt => QtQuick}/ImageSpecifics.qml | 0 .../{Qt => QtQuick}/IntEditor.qml | 4 +- .../{Qt => QtQuick}/ItemPane.qml | 0 .../propertyeditor/{Qt => QtQuick}/Label.qml | 0 .../propertyeditor/{Qt => QtQuick}/Layout.qml | 0 .../{Qt => QtQuick}/LayoutPane.qml | 0 .../{Qt => QtQuick}/LineEdit.qml | 0 .../{Qt => QtQuick}/ListViewSpecifics.qml | 0 .../{Qt => QtQuick}/Modifiers.qml | 0 .../{Qt => QtQuick}/PlaceHolder.qml | 0 .../{Qt => QtQuick}/PropertyFrame.qml | 0 .../RectangleColorGroupBox.qml | 0 .../{Qt => QtQuick}/RectangleSpecifics.qml | 0 .../{Qt => QtQuick}/RowSpecifics.qml | 0 .../{Qt => QtQuick}/ScrollArea.qml | 0 .../{Qt => QtQuick}/SliderWidget.qml | 0 .../{Qt => QtQuick}/SpinBox.qml | 0 .../StandardTextColorGroupBox.qml | 0 .../{Qt => QtQuick}/StandardTextGroupBox.qml | 0 .../{Qt => QtQuick}/Switches.qml | 0 .../{Qt => QtQuick}/TextEditSpecifics.qml | 0 .../{Qt => QtQuick}/TextInputGroupBox.qml | 0 .../{Qt => QtQuick}/TextInputSpecifics.qml | 0 .../{Qt => QtQuick}/TextSpecifics.qml | 0 .../{Qt => QtQuick}/Transformation.qml | 0 .../propertyeditor/{Qt => QtQuick}/Type.qml | 0 .../{Qt => QtQuick}/VerticalLayout.qml | 0 .../{Qt => QtQuick}/Visibility.qml | 0 .../{Qt => QtQuick}/WebViewSpecifics.qml | 0 .../{Qt => QtQuick}/anchorbottom.css | 0 .../{Qt => QtQuick}/anchorbox.css | 0 .../{Qt => QtQuick}/anchorfill.css | 0 .../{Qt => QtQuick}/anchorhorizontal.css | 0 .../{Qt => QtQuick}/anchorleft.css | 0 .../{Qt => QtQuick}/anchorright.css | 0 .../{Qt => QtQuick}/anchorspacer.css | 0 .../{Qt => QtQuick}/anchortop.css | 0 .../{Qt => QtQuick}/anchorvertical.css | 0 .../{Qt => QtQuick}/applybutton.css | 0 .../{Qt => QtQuick}/aspectlock.css | 0 .../{Qt => QtQuick}/cancelbutton.css | 0 .../{Qt => QtQuick}/emptyPane.qml | 0 .../images/alignmentbottom-h-icon.png | Bin .../images/alignmentbottom-icon.png | Bin .../images/alignmentcenterh-h-icon.png | Bin .../images/alignmentcenterh-icon.png | Bin .../images/alignmentleft-h-icon.png | Bin .../images/alignmentleft-icon.png | Bin .../images/alignmentmiddle-h-icon.png | Bin .../images/alignmentmiddle-icon.png | Bin .../images/alignmentright-h-icon.png | Bin .../images/alignmentright-icon.png | Bin .../images/alignmenttop-h-icon.png | Bin .../images/alignmenttop-icon.png | Bin .../{Qt => QtQuick}/images/apply.png | Bin .../{Qt => QtQuick}/images/behaivour.png | Bin .../images/blended-image-icon.png | Bin .../{Qt => QtQuick}/images/bold-h-icon.png | Bin .../{Qt => QtQuick}/images/bold-icon.png | Bin .../{Qt => QtQuick}/images/button.png | Bin .../{Qt => QtQuick}/images/cancel.png | Bin .../{Qt => QtQuick}/images/default-icon.png | Bin .../{Qt => QtQuick}/images/downArrow.png | Bin .../{Qt => QtQuick}/images/expression.png | Bin .../{Qt => QtQuick}/images/extended.png | Bin .../{Qt => QtQuick}/images/grid-icon.png | Bin .../images/icon_color_gradient.png | Bin .../images/icon_color_none.png | Bin .../images/icon_color_solid.png | Bin .../{Qt => QtQuick}/images/image-icon.png | Bin .../{Qt => QtQuick}/images/italic-h-icon.png | Bin .../{Qt => QtQuick}/images/italic-icon.png | Bin .../{Qt => QtQuick}/images/item-icon.png | Bin .../{Qt => QtQuick}/images/layout.png | Bin .../{Qt => QtQuick}/images/leftArrow.png | Bin .../{Qt => QtQuick}/images/list-icon.png | Bin .../images/mouse-area-icon.png | Bin .../{Qt => QtQuick}/images/placeholder.png | Bin .../{Qt => QtQuick}/images/rect-icon.png | Bin .../{Qt => QtQuick}/images/reset-button.png | Bin .../{Qt => QtQuick}/images/rightArrow.png | Bin .../{Qt => QtQuick}/images/standard.png | Bin .../images/strikeout-h-icon.png | Bin .../{Qt => QtQuick}/images/strikeout-icon.png | Bin .../{Qt => QtQuick}/images/submenu.png | Bin .../{Qt => QtQuick}/images/text-edit-icon.png | Bin .../{Qt => QtQuick}/images/text-icon.png | Bin .../images/underline-h-icon.png | Bin .../{Qt => QtQuick}/images/underline-icon.png | Bin .../{Qt => QtQuick}/images/upArrow.png | Bin .../{Qt => QtQuick}/layoutWidget.css | 0 .../{Qt => QtQuick}/propertyEditor.css | 0 .../{Qt => QtQuick}/specialCheckBox.css | 0 .../{Qt => QtQuick}/styledbuttonleft.css | 0 .../{Qt => QtQuick}/styledbuttonmiddle.css | 0 .../{Qt => QtQuick}/styledbuttonright.css | 0 .../propertyeditor/{Qt => QtQuick}/switch.css | 0 .../{Qt => QtQuick}/typeLabel.css | 0 .../components/integration/componentview.cpp | 2 +- .../integration/designdocumentcontroller.cpp | 10 +- .../designdocumentcontrollerview.cpp | 4 +- .../navigator/navigatortreemodel.cpp | 2 +- .../components/propertyeditor/colorwidget.cpp | 4 +- .../propertyeditor/propertyeditor.cpp | 4 +- .../stateseditor/stateseditorview.cpp | 2 +- .../designercore/instances/nodeinstance.cpp | 26 +- .../instances/nodeinstanceview.cpp | 6 +- .../instances/proxywidgetnodeinstance.cpp | 2 +- .../designercore/metainfo/metainfo.cpp | 26 +- .../metainfo/subcomponentmanager.cpp | 23 +- .../qmldesigner/designercore/model/model.cpp | 2 +- .../designercore/model/qmlchangeset.cpp | 4 +- .../designercore/model/qmlitemnode.cpp | 4 +- .../designercore/model/qmlmodelview.cpp | 6 +- .../designercore/model/qmlstate.cpp | 6 +- .../designercore/model/texttomodelmerger.cpp | 14 +- .../qtquickplugin/qtquickplugin.cpp | 4 +- .../qmldesigner/qtquickplugin/quick.metainfo | 28 +- .../qmldesigner/coretests/tst_testcore.cpp | 1060 ++++++++--------- .../qml/qmldesigner/data/fx/attributes.qml | 2 +- tests/auto/qml/qmldesigner/data/fx/empty.qml | 2 +- .../qml/qmldesigner/data/fx/helloworld.qml | 2 +- .../qml/qmldesigner/data/fx/properties.qml | 2 +- tests/auto/qml/qmldesigner/data/fx/states.qml | 2 +- .../auto/qml/qmldesigner/data/fx/topitem.qml | 4 +- 156 files changed, 650 insertions(+), 680 deletions(-) delete mode 100644 share/qtcreator/qmldesigner/propertyeditor/Qt/ComboBox.qml rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/AlignmentHorizontalButtons.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/AlignmentVerticalButtons.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/AnchorBox.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/AnchorButtons.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/BorderImageSpecifics.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/CheckBox.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/ColorGroupBox.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/ColorLabel.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/ColorScheme.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/ColorTypeButtons.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/ColumnSpecifics.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/DoubleSpinBox.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/DoubleSpinBoxAlternate.qml (98%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/ExpressionEditor.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/Extended.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/ExtendedFunctionButton.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/ExtendedPane.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/ExtendedSwitches.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/FlagedButton.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/FlickableSpecifics.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/FlipableSpecifics.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/FontComboBox.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/FontGroupBox.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/FontStyleButtons.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/Geometry.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/GridSpecifics.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/GroupBox.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/GroupBoxOption.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/HorizontalLayout.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/HorizontalWhiteLine.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/ImageSpecifics.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/IntEditor.qml (96%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/ItemPane.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/Label.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/Layout.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/LayoutPane.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/LineEdit.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/ListViewSpecifics.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/Modifiers.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/PlaceHolder.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/PropertyFrame.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/RectangleColorGroupBox.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/RectangleSpecifics.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/RowSpecifics.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/ScrollArea.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/SliderWidget.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/SpinBox.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/StandardTextColorGroupBox.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/StandardTextGroupBox.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/Switches.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/TextEditSpecifics.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/TextInputGroupBox.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/TextInputSpecifics.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/TextSpecifics.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/Transformation.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/Type.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/VerticalLayout.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/Visibility.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/WebViewSpecifics.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/anchorbottom.css (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/anchorbox.css (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/anchorfill.css (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/anchorhorizontal.css (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/anchorleft.css (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/anchorright.css (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/anchorspacer.css (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/anchortop.css (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/anchorvertical.css (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/applybutton.css (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/aspectlock.css (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/cancelbutton.css (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/emptyPane.qml (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/alignmentbottom-h-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/alignmentbottom-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/alignmentcenterh-h-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/alignmentcenterh-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/alignmentleft-h-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/alignmentleft-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/alignmentmiddle-h-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/alignmentmiddle-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/alignmentright-h-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/alignmentright-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/alignmenttop-h-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/alignmenttop-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/apply.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/behaivour.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/blended-image-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/bold-h-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/bold-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/button.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/cancel.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/default-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/downArrow.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/expression.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/extended.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/grid-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/icon_color_gradient.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/icon_color_none.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/icon_color_solid.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/image-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/italic-h-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/italic-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/item-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/layout.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/leftArrow.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/list-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/mouse-area-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/placeholder.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/rect-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/reset-button.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/rightArrow.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/standard.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/strikeout-h-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/strikeout-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/submenu.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/text-edit-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/text-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/underline-h-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/underline-icon.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/images/upArrow.png (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/layoutWidget.css (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/propertyEditor.css (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/specialCheckBox.css (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/styledbuttonleft.css (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/styledbuttonmiddle.css (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/styledbuttonright.css (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/switch.css (100%) rename share/qtcreator/qmldesigner/propertyeditor/{Qt => QtQuick}/typeLabel.css (100%) diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/ComboBox.qml b/share/qtcreator/qmldesigner/propertyeditor/Qt/ComboBox.qml deleted file mode 100644 index c4aa6c7d0bb..00000000000 --- a/share/qtcreator/qmldesigner/propertyeditor/Qt/ComboBox.qml +++ /dev/null @@ -1,71 +0,0 @@ -import Qt 4.7 -import Bauhaus 1.0 - -QWidget { - - id: comboBox - - property variant backendValue; - property variant baseStateFlag; - property alias enabled: box.enabled; - - property alias items: box.items; - property alias currentText: box.currentText; - - - onBaseStateFlagChanged: { - evaluate(); - } - - property variant isEnabled: comboBox.enabled - onIsEnabledChanged: { - evaluate(); - } - - function evaluate() { - if (backendValue === undefined) - return; - if (!enabled) { - box.setStyleSheet("color: "+scheme.disabledColor); - } else { - if (baseStateFlag) { - if (backendValue.isInModel) - box.setStyleSheet("QComboBox,QComboBox:on{color: "+scheme.changedBaseColor+"}QComboBox:off{color:"+scheme.optionsColor+"}"); - else - box.setStyleSheet("QComboBox,QComboBox:on{color: "+scheme.defaultColor+"}QComboBox:off{color:"+scheme.optionsColor+"}"); - } else { - if (backendValue.isInSubState) - box.setStyleSheet("QComboBox,QComboBox:on{color: "+scheme.changedStateColor+"}QComboBox:off{color:"+scheme.optionsColor+"}"); - else - box.setStyleSheet("QComboBox,QComboBox:on{color: "+scheme.defaultColor+"}QComboBox:off{color:"+scheme.optionsColor+"}"); - } - } - } - - ColorScheme { id:scheme; } - - layout: HorizontalLayout { - QComboBox { - id: box - property variant backendValue: comboBox.backendValue - onCurrentTextChanged: { backendValue.value = currentText; evaluate(); } - onItemsChanged: { - if (comboBox.backendValue.value == curentText) - return; - box.setCurrentTextSilent(comboBox.backendValue.value); - } - - property variant backendValueValue: comboBox.backendValue.value - onBackendValueValueChanged: { - if (comboBox.backendValue.value == curentText) - return; - box.setCurrentTextSilent(comboBox.backendValue.value); - } - ExtendedFunctionButton { - backendValue: comboBox.backendValue; - y: 3 - x: 3 - } - } - } -} diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/AlignmentHorizontalButtons.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/AlignmentHorizontalButtons.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/AlignmentHorizontalButtons.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/AlignmentHorizontalButtons.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/AlignmentVerticalButtons.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/AlignmentVerticalButtons.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/AlignmentVerticalButtons.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/AlignmentVerticalButtons.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/AnchorBox.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/AnchorBox.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/AnchorBox.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/AnchorBox.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/AnchorButtons.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/AnchorButtons.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/AnchorButtons.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/AnchorButtons.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/BorderImageSpecifics.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/BorderImageSpecifics.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/BorderImageSpecifics.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/BorderImageSpecifics.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/CheckBox.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/CheckBox.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/CheckBox.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/CheckBox.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/ColorGroupBox.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/ColorGroupBox.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/ColorGroupBox.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/ColorGroupBox.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/ColorLabel.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/ColorLabel.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/ColorLabel.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/ColorLabel.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/ColorScheme.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/ColorScheme.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/ColorScheme.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/ColorScheme.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/ColorTypeButtons.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/ColorTypeButtons.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/ColorTypeButtons.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/ColorTypeButtons.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/ColumnSpecifics.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/ColumnSpecifics.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/ColumnSpecifics.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/ColumnSpecifics.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/DoubleSpinBox.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/DoubleSpinBox.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/DoubleSpinBox.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/DoubleSpinBox.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/DoubleSpinBoxAlternate.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/DoubleSpinBoxAlternate.qml similarity index 98% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/DoubleSpinBoxAlternate.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/DoubleSpinBoxAlternate.qml index ff6eb442c77..2fe97d2ae17 100644 --- a/share/qtcreator/qmldesigner/propertyeditor/Qt/DoubleSpinBoxAlternate.qml +++ b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/DoubleSpinBoxAlternate.qml @@ -80,6 +80,8 @@ QWidget { //This is a special doubleSpinBox that does color coding for states decimals: 1; keyboardTracking: false; enabled: !backendValue.isBound && doubleSpinBox.enabled; + minimum: -1000 + maximum: 1000 property bool readingFromBackend: false; property real valueFromBackend: doubleSpinBox.backendValue.value; diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/ExpressionEditor.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/ExpressionEditor.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/ExpressionEditor.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/ExpressionEditor.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/Extended.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/Extended.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/Extended.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/Extended.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/ExtendedFunctionButton.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/ExtendedFunctionButton.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/ExtendedFunctionButton.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/ExtendedFunctionButton.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/ExtendedPane.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/ExtendedPane.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/ExtendedPane.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/ExtendedPane.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/ExtendedSwitches.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/ExtendedSwitches.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/ExtendedSwitches.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/ExtendedSwitches.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/FlagedButton.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/FlagedButton.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/FlagedButton.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/FlagedButton.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/FlickableSpecifics.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/FlickableSpecifics.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/FlickableSpecifics.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/FlickableSpecifics.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/FlipableSpecifics.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/FlipableSpecifics.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/FlipableSpecifics.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/FlipableSpecifics.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/FontComboBox.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/FontComboBox.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/FontComboBox.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/FontComboBox.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/FontGroupBox.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/FontGroupBox.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/FontGroupBox.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/FontGroupBox.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/FontStyleButtons.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/FontStyleButtons.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/FontStyleButtons.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/FontStyleButtons.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/Geometry.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/Geometry.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/Geometry.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/Geometry.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/GridSpecifics.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/GridSpecifics.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/GridSpecifics.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/GridSpecifics.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/GroupBox.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/GroupBox.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/GroupBox.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/GroupBox.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/GroupBoxOption.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/GroupBoxOption.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/GroupBoxOption.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/GroupBoxOption.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/HorizontalLayout.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/HorizontalLayout.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/HorizontalLayout.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/HorizontalLayout.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/HorizontalWhiteLine.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/HorizontalWhiteLine.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/HorizontalWhiteLine.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/HorizontalWhiteLine.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/ImageSpecifics.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/ImageSpecifics.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/ImageSpecifics.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/ImageSpecifics.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/IntEditor.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/IntEditor.qml similarity index 96% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/IntEditor.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/IntEditor.qml index dd5f7834ff0..bc0b50f400e 100644 --- a/share/qtcreator/qmldesigner/propertyeditor/Qt/IntEditor.qml +++ b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/IntEditor.qml @@ -9,8 +9,8 @@ QWidget { property variant caption; - property variant maximumValue: 99 - property variant minimumValue: 0 + property variant maximumValue: 1000 + property variant minimumValue: -1000 property variant step: 1 property bool slider: true property alias alignment: label.alignment diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/ItemPane.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/ItemPane.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/ItemPane.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/ItemPane.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/Label.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/Label.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/Label.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/Label.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/Layout.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/Layout.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/Layout.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/Layout.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/LayoutPane.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/LayoutPane.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/LayoutPane.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/LayoutPane.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/LineEdit.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/LineEdit.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/LineEdit.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/LineEdit.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/ListViewSpecifics.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/ListViewSpecifics.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/ListViewSpecifics.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/ListViewSpecifics.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/Modifiers.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/Modifiers.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/Modifiers.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/Modifiers.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/PlaceHolder.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/PlaceHolder.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/PlaceHolder.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/PlaceHolder.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/PropertyFrame.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/PropertyFrame.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/PropertyFrame.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/PropertyFrame.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/RectangleColorGroupBox.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/RectangleColorGroupBox.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/RectangleColorGroupBox.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/RectangleColorGroupBox.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/RectangleSpecifics.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/RectangleSpecifics.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/RectangleSpecifics.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/RectangleSpecifics.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/RowSpecifics.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/RowSpecifics.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/RowSpecifics.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/RowSpecifics.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/ScrollArea.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/ScrollArea.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/ScrollArea.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/ScrollArea.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/SliderWidget.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/SliderWidget.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/SliderWidget.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/SliderWidget.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/SpinBox.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/SpinBox.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/SpinBox.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/SpinBox.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/StandardTextColorGroupBox.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/StandardTextColorGroupBox.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/StandardTextColorGroupBox.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/StandardTextColorGroupBox.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/StandardTextGroupBox.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/StandardTextGroupBox.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/StandardTextGroupBox.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/StandardTextGroupBox.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/Switches.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/Switches.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/Switches.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/Switches.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/TextEditSpecifics.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/TextEditSpecifics.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/TextEditSpecifics.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/TextEditSpecifics.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/TextInputGroupBox.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/TextInputGroupBox.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/TextInputGroupBox.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/TextInputGroupBox.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/TextInputSpecifics.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/TextInputSpecifics.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/TextInputSpecifics.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/TextInputSpecifics.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/TextSpecifics.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/TextSpecifics.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/TextSpecifics.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/TextSpecifics.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/Transformation.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/Transformation.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/Transformation.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/Transformation.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/Type.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/Type.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/Type.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/Type.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/VerticalLayout.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/VerticalLayout.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/VerticalLayout.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/VerticalLayout.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/Visibility.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/Visibility.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/Visibility.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/Visibility.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/WebViewSpecifics.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/WebViewSpecifics.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/WebViewSpecifics.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/WebViewSpecifics.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/anchorbottom.css b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/anchorbottom.css similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/anchorbottom.css rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/anchorbottom.css diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/anchorbox.css b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/anchorbox.css similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/anchorbox.css rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/anchorbox.css diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/anchorfill.css b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/anchorfill.css similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/anchorfill.css rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/anchorfill.css diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/anchorhorizontal.css b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/anchorhorizontal.css similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/anchorhorizontal.css rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/anchorhorizontal.css diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/anchorleft.css b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/anchorleft.css similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/anchorleft.css rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/anchorleft.css diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/anchorright.css b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/anchorright.css similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/anchorright.css rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/anchorright.css diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/anchorspacer.css b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/anchorspacer.css similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/anchorspacer.css rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/anchorspacer.css diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/anchortop.css b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/anchortop.css similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/anchortop.css rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/anchortop.css diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/anchorvertical.css b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/anchorvertical.css similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/anchorvertical.css rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/anchorvertical.css diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/applybutton.css b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/applybutton.css similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/applybutton.css rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/applybutton.css diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/aspectlock.css b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/aspectlock.css similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/aspectlock.css rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/aspectlock.css diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/cancelbutton.css b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/cancelbutton.css similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/cancelbutton.css rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/cancelbutton.css diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/emptyPane.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/emptyPane.qml similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/emptyPane.qml rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/emptyPane.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmentbottom-h-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmentbottom-h-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmentbottom-h-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmentbottom-h-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmentbottom-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmentbottom-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmentbottom-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmentbottom-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmentcenterh-h-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmentcenterh-h-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmentcenterh-h-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmentcenterh-h-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmentcenterh-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmentcenterh-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmentcenterh-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmentcenterh-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmentleft-h-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmentleft-h-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmentleft-h-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmentleft-h-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmentleft-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmentleft-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmentleft-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmentleft-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmentmiddle-h-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmentmiddle-h-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmentmiddle-h-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmentmiddle-h-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmentmiddle-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmentmiddle-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmentmiddle-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmentmiddle-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmentright-h-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmentright-h-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmentright-h-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmentright-h-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmentright-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmentright-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmentright-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmentright-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmenttop-h-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmenttop-h-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmenttop-h-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmenttop-h-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmenttop-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmenttop-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/alignmenttop-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/alignmenttop-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/apply.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/apply.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/apply.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/apply.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/behaivour.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/behaivour.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/behaivour.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/behaivour.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/blended-image-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/blended-image-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/blended-image-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/blended-image-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/bold-h-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/bold-h-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/bold-h-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/bold-h-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/bold-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/bold-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/bold-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/bold-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/button.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/button.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/button.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/button.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/cancel.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/cancel.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/cancel.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/cancel.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/default-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/default-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/default-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/default-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/downArrow.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/downArrow.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/downArrow.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/downArrow.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/expression.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/expression.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/expression.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/expression.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/extended.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/extended.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/extended.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/extended.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/grid-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/grid-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/grid-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/grid-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/icon_color_gradient.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/icon_color_gradient.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/icon_color_gradient.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/icon_color_gradient.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/icon_color_none.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/icon_color_none.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/icon_color_none.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/icon_color_none.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/icon_color_solid.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/icon_color_solid.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/icon_color_solid.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/icon_color_solid.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/image-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/image-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/image-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/image-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/italic-h-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/italic-h-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/italic-h-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/italic-h-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/italic-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/italic-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/italic-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/italic-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/item-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/item-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/item-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/item-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/layout.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/layout.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/layout.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/layout.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/leftArrow.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/leftArrow.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/leftArrow.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/leftArrow.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/list-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/list-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/list-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/list-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/mouse-area-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/mouse-area-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/mouse-area-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/mouse-area-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/placeholder.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/placeholder.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/placeholder.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/placeholder.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/rect-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/rect-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/rect-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/rect-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/reset-button.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/reset-button.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/reset-button.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/reset-button.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/rightArrow.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/rightArrow.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/rightArrow.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/rightArrow.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/standard.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/standard.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/standard.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/standard.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/strikeout-h-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/strikeout-h-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/strikeout-h-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/strikeout-h-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/strikeout-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/strikeout-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/strikeout-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/strikeout-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/submenu.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/submenu.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/submenu.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/submenu.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/text-edit-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/text-edit-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/text-edit-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/text-edit-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/text-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/text-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/text-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/text-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/underline-h-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/underline-h-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/underline-h-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/underline-h-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/underline-icon.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/underline-icon.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/underline-icon.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/underline-icon.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/images/upArrow.png b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/upArrow.png similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/images/upArrow.png rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/images/upArrow.png diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/layoutWidget.css b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/layoutWidget.css similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/layoutWidget.css rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/layoutWidget.css diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/propertyEditor.css b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/propertyEditor.css similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/propertyEditor.css rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/propertyEditor.css diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/specialCheckBox.css b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/specialCheckBox.css similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/specialCheckBox.css rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/specialCheckBox.css diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/styledbuttonleft.css b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/styledbuttonleft.css similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/styledbuttonleft.css rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/styledbuttonleft.css diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/styledbuttonmiddle.css b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/styledbuttonmiddle.css similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/styledbuttonmiddle.css rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/styledbuttonmiddle.css diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/styledbuttonright.css b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/styledbuttonright.css similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/styledbuttonright.css rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/styledbuttonright.css diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/switch.css b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/switch.css similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/switch.css rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/switch.css diff --git a/share/qtcreator/qmldesigner/propertyeditor/Qt/typeLabel.css b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/typeLabel.css similarity index 100% rename from share/qtcreator/qmldesigner/propertyeditor/Qt/typeLabel.css rename to share/qtcreator/qmldesigner/propertyeditor/QtQuick/typeLabel.css diff --git a/src/plugins/qmldesigner/components/integration/componentview.cpp b/src/plugins/qmldesigner/components/integration/componentview.cpp index 4967fe8b3d4..f3e99da2da2 100644 --- a/src/plugins/qmldesigner/components/integration/componentview.cpp +++ b/src/plugins/qmldesigner/components/integration/componentview.cpp @@ -109,7 +109,7 @@ void ComponentView::searchForComponentAndAddToList(const ModelNode &node) foreach (const ModelNode &childNode, nodeList) { - if (childNode.type() == "Qt/Component") { + if (childNode.type() == "QtQuick/Component") { if (!childNode.id().isEmpty()) { QStandardItem *item = new QStandardItem(childNode.id()); item->setData(QVariant::fromValue(childNode), ModelNodeRole); diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp index 67daf39827e..facc5814839 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp @@ -269,7 +269,7 @@ QList DesignDocumentController::loadMaster(QPlainTextEdit * //m_d->masterModel = Model::create(m_d->textModifier, m_d->searchPath, errors); - m_d->masterModel = Model::create("Qt/Rectangle", 4, 7); + m_d->masterModel = Model::create("QtQick/Rectangle", 4, 7); #if defined(VIEWLOGGER) m_d->viewLogger = new Internal::ViewLogger(m_d->model.data()); @@ -278,7 +278,7 @@ QList DesignDocumentController::loadMaster(QPlainTextEdit * m_d->masterModel->setFileUrl(m_d->searchPath); - m_d->subComponentModel = Model::create("Qt/Rectangle", 4, 7); + m_d->subComponentModel = Model::create("QtQuick/Rectangle", 4, 7); m_d->subComponentModel->setFileUrl(m_d->searchPath); m_d->subComponentManager = new SubComponentManager(m_d->masterModel->metaInfo(), this); @@ -468,7 +468,7 @@ void DesignDocumentController::deleteSelected() void DesignDocumentController::copySelected() { - QScopedPointer model(Model::create("Qt/Rectangle")); + QScopedPointer model(Model::create("QtQuick/Rectangle")); model->setMetaInfo(m_d->model->metaInfo()); model->setFileUrl(m_d->model->fileUrl()); foreach (const Import &import, m_d->model->imports()) @@ -514,7 +514,7 @@ void DesignDocumentController::copySelected() foreach (ModelNode node, view.rootModelNode().allDirectSubModelNodes()) { node.destroy(); } - view.changeRootNodeType("Qt/Rectangle", 4, 7); + view.changeRootNodeType("QtQuick/Rectangle", 4, 7); view.rootModelNode().setId("designer__Selection"); foreach (const ModelNode &selectedNode, selectedNodes) { @@ -766,7 +766,7 @@ QString DesignDocumentController::contextHelpId() const QString helpId; if (!nodes.isEmpty()) { helpId = nodes.first().type(); - helpId.replace("Qt/", "QML."); + helpId.replace("QtQuick/", "QML."); } return helpId; diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp index 6e63157a2b7..c9d91523169 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp @@ -107,7 +107,7 @@ void DesignDocumentControllerView::fromClipboard() QString DesignDocumentControllerView::toText() const { - QScopedPointer outputModel(Model::create("Qt/Rectangle")); + QScopedPointer outputModel(Model::create("QtQuick/Rectangle")); outputModel->setMetaInfo(model()->metaInfo()); QPlainTextEdit textEdit; textEdit.setPlainText("import Qt 4.7; Item {}"); @@ -129,7 +129,7 @@ QString DesignDocumentControllerView::toText() const void DesignDocumentControllerView::fromText(QString text) { - QScopedPointer inputModel(Model::create("Qt/Rectangle")); + QScopedPointer inputModel(Model::create("QtQuick/Rectangle")); inputModel->setMetaInfo(model()->metaInfo()); inputModel->setFileUrl(model()->fileUrl()); QPlainTextEdit textEdit; diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index d58e9cbc2cf..99a995e3b1d 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -351,7 +351,7 @@ void NavigatorTreeModel::setView(AbstractView *view) m_view = view; m_hiddenProperties.clear(); if (view) { - ModelNode sampleItemNode(m_view->createModelNode("Qt/Item", 4, 7)); + ModelNode sampleItemNode(m_view->createModelNode("QtQuick/Item", 4, 7)); m_hiddenProperties << visibleProperties(sampleItemNode); addSubTree(view->rootModelNode()); } diff --git a/src/plugins/qmldesigner/components/propertyeditor/colorwidget.cpp b/src/plugins/qmldesigner/components/propertyeditor/colorwidget.cpp index 3bd5ca8023c..64e03b0dc2b 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/colorwidget.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/colorwidget.cpp @@ -806,13 +806,13 @@ void GradientLine::updateGradient() modelNode.removeProperty(m_gradientName); } - ModelNode gradientNode = modelNode.view()->createModelNode("Qt/Gradient", 4, 7); + ModelNode gradientNode = modelNode.view()->createModelNode("QtQuick/Gradient", 4, 7); if (!oldId.isNull()) gradientNode.setId(oldId); for (int i = 0;i < m_stops.size(); i++) { - ModelNode gradientStopNode = modelNode.view()->createModelNode("Qt/GradientStop", 4, 7); + ModelNode gradientStopNode = modelNode.view()->createModelNode("QtQuick/GradientStop", 4, 7); gradientStopNode.variantProperty("position") = roundReal(m_stops.at(i)); gradientStopNode.variantProperty("color") = normalizeColor(m_colorList.at(i)); gradientNode.nodeListProperty("stops").reparentHere(gradientStopNode); diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp index 061a1174c59..97273b7863c 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp @@ -310,7 +310,7 @@ PropertyEditor::~PropertyEditor() void PropertyEditor::setupPane(const QString &typeName) { - QUrl qmlFile = fileToUrl(locateQmlFile(QLatin1String("Qt/ItemPane.qml"))); + QUrl qmlFile = fileToUrl(locateQmlFile(QLatin1String("QtQuick/ItemPane.qml"))); QUrl qmlSpecificsFile; qmlSpecificsFile = fileToUrl(locateQmlFile(typeName + "Specifics.qml")); @@ -577,7 +577,7 @@ QString templateGeneration(NodeMetaInfo type, NodeMetaInfo superType, const QmlO "DoubleSpinBoxAlternate {\ntext: \"%1\"\nbackendValue: backendValues.%2\nbaseStateFlag: isBaseState\n}\n" )).arg(name).arg(properName); } - if (typeName == "string" || typeName == "QString") { + if (typeName == "string" || typeName == "QString" || typeName =="url" || typeName =="QUrl") { qmlTemplate += QString(QLatin1String( "QWidget {\nlayout: HorizontalLayout {\nLabel {\ntext: \"%1\"\ntoolTip: \"%1\"\n}\nLineEdit {\nbackendValue: backendValues.%2\nbaseStateFlag: isBaseState\n}\n}\n}\n" )).arg(name).arg(properName); diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp index acda0ca8c56..8c20d615734 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp @@ -117,7 +117,7 @@ void StatesEditorView::createState(const QString &name) qDebug() << __FUNCTION__ << name; try { - model()->addImport(Import::createLibraryImport("Qt", "4.7")); + model()->addImport(Import::createLibraryImport("QtQuick", "1.0")); stateRootNode().states().addState(name); } catch (RewritingException &e) { QMessageBox::warning(0, "Error", e.description()); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp index 39da34d8ae8..2cc7c2fc4d5 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstance.cpp @@ -137,31 +137,31 @@ Internal::ObjectNodeInstance::Pointer NodeInstance::createInstance(const NodeMet instance = Internal::DummyNodeInstance::create(); else if (metaInfo.isSubclassOf("QtWebKit/WebView", 1, 0)) instance = Internal::DummyNodeInstance::create(); - else if (metaInfo.isSubclassOf("Qt/QWidget", 4, 7)) + else if (metaInfo.isSubclassOf("QtQuick/QWidget", 1, 0)) instance = Internal::DummyNodeInstance::create(); - else if (metaInfo.isSubclassOf("Qt/QGraphicsView", 4, 7)) + else if (metaInfo.isSubclassOf("QtQuick/QGraphicsView", 1, 0)) instance = Internal::GraphicsViewNodeInstance::create(metaInfo, context, objectToBeWrapped); - else if (metaInfo.isSubclassOf("Qt/QDeclarativeView", 4, 7)) + else if (metaInfo.isSubclassOf("QtQuick/QDeclarativeView", 1, 0)) instance = Internal::QDeclarativeViewNodeInstance::create(metaInfo, context, objectToBeWrapped); - else if (metaInfo.isSubclassOf("Qt/QGraphicsWidget", 4, 7)) + else if (metaInfo.isSubclassOf("QtQuick/QGraphicsWidget", 1, 0)) instance = Internal::GraphicsWidgetNodeInstance::create(metaInfo, context, objectToBeWrapped); - else if (metaInfo.isSubclassOf("QDeclarativeBasePositioner", 4, 7)) + else if (metaInfo.isSubclassOf("QDeclarativeBasePositioner", 1, 0)) instance = Internal::PositionerNodeInstance::create(metaInfo, context, objectToBeWrapped); - else if (metaInfo.isSubclassOf("Qt/Item", 4, 7)) + else if (metaInfo.isSubclassOf("QtQuick/Item", 1, 0)) instance = Internal::QmlGraphicsItemNodeInstance::create(metaInfo, context, objectToBeWrapped); - else if (metaInfo.isSubclassOf("Qt/QGraphicsScene", 4, 7)) + else if (metaInfo.isSubclassOf("QtQuick/QGraphicsScene", 1, 0)) instance = Internal::GraphicsSceneNodeInstance::create(metaInfo, context, objectToBeWrapped); - else if (metaInfo.isSubclassOf("Qt/Component", 4, 7)) + else if (metaInfo.isSubclassOf("QtQuick/Component", 1, 0)) instance = Internal::ComponentNodeInstance::create(metaInfo, context, objectToBeWrapped); - else if (metaInfo.isSubclassOf("Qt/PropertyChanges", 4, 7)) + else if (metaInfo.isSubclassOf("QtQuick/PropertyChanges", 1, 0)) instance = Internal::QmlPropertyChangesNodeInstance::create(metaInfo, context, objectToBeWrapped); - else if (metaInfo.isSubclassOf("Qt/State", 4, 7)) + else if (metaInfo.isSubclassOf("QtQuick/State", 1, 0)) instance = Internal::QmlStateNodeInstance::create(metaInfo, context, objectToBeWrapped); - else if (metaInfo.isSubclassOf("Qt/Transition", 4, 7)) + else if (metaInfo.isSubclassOf("QtQuick/Transition", 1, 0)) instance = Internal::QmlTransitionNodeInstance::create(metaInfo, context, objectToBeWrapped); - else if (metaInfo.isSubclassOf("Qt/Behavior", 4, 7)) + else if (metaInfo.isSubclassOf("QtQuick/Behavior", 1, 0)) instance = Internal::BehaviorNodeInstance::create(metaInfo, context, objectToBeWrapped); - else if (metaInfo.isSubclassOf("Qt/QtObject", 4, 7)) + else if (metaInfo.isSubclassOf("QtQuick/QtObject", 1, 0)) instance = Internal::ObjectNodeInstance::create(metaInfo, context, objectToBeWrapped); else instance = Internal::DummyNodeInstance::create(); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 30b5d43acd5..6f98f505363 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -189,7 +189,7 @@ void NodeInstanceView::resetInstanceProperty(const AbstractProperty &property) NodeInstance instance = instanceForNode(property.parentModelNode()); Q_ASSERT(instance.isValid()); const QString name = property.name(); - if (activeStateInstance().isValid() && !property.parentModelNode().metaInfo().isSubclassOf("PropertyChange", 4, 7)) { + if (activeStateInstance().isValid() && !property.parentModelNode().metaInfo().isSubclassOf("PropertyChange", 1, 0)) { bool statePropertyWasReseted = activeStateInstance().resetStateProperty(instance, name, instance.resetVariant(name)); if (!statePropertyWasReseted) instance.resetProperty(name); @@ -207,7 +207,7 @@ void NodeInstanceView::setInstancePropertyBinding(const BindingProperty &propert const QString expression = property.expression(); - if (activeStateInstance().isValid() && !property.parentModelNode().metaInfo().isSubclassOf("PropertyChange", 4, 7)) { + if (activeStateInstance().isValid() && !property.parentModelNode().metaInfo().isSubclassOf("PropertyChange", 1, 0)) { bool stateBindingWasUpdated = activeStateInstance().updateStateBinding(instance, name, expression); if (!stateBindingWasUpdated) { if (property.isDynamic()) @@ -243,7 +243,7 @@ void NodeInstanceView::setInstancePropertyVariant(const VariantProperty &propert const QVariant value = property.value(); - if (activeStateInstance().isValid() && !property.parentModelNode().metaInfo().isSubclassOf("PropertyChange", 4, 7)) { + if (activeStateInstance().isValid() && !property.parentModelNode().metaInfo().isSubclassOf("PropertyChange", 1, 0)) { bool stateValueWasUpdated = activeStateInstance().updateStateVariant(instance, name, value); if (!stateValueWasUpdated) { if (property.isDynamic()) diff --git a/src/plugins/qmldesigner/designercore/instances/proxywidgetnodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/proxywidgetnodeinstance.cpp index ecb5ec5ae12..732502e7a99 100644 --- a/src/plugins/qmldesigner/designercore/instances/proxywidgetnodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/proxywidgetnodeinstance.cpp @@ -44,7 +44,7 @@ ProxyWidgetNodeInstance::ProxyWidgetNodeInstance(QGraphicsProxyWidget *widget) ProxyWidgetNodeInstance::Pointer ProxyWidgetNodeInstance::create(const QString &typeName) { - QObject *object = QDeclarativeMetaType::qmlType(typeName.toLatin1(), 4, 7)->create(); + QObject *object = QDeclarativeMetaType::qmlType(typeName.toLatin1(), 1, 0)->create(); Q_ASSERT(object); if (object == 0) return Pointer(); diff --git a/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp index 71affb5d712..61f8bf7b27b 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp @@ -129,7 +129,7 @@ void MetaInfoPrivate::loadPlugins(QDeclarativeEngine *engine) QDeclarativeComponent pluginComponent(engine, 0); QStringList pluginList; - pluginList += "import Qt 4.7"; + pluginList += "import QtQuick 1.0"; pluginList += "import QtWebKit 1.0"; // load maybe useful plugins @@ -276,6 +276,15 @@ QList MetaInfoPrivate::qmlTypes() return list; } + +static inline bool isDepricatedQtType(const QString &typeName) +{ + if (typeName.length() < 3) + return false; + + return (typeName.at(0) == 'Q' && typeName.at(1) == 't' && typeName.at(2) == '/'); +} + void MetaInfoPrivate::typeInfo(const QMetaObject *qMetaObject, QString *typeName, int *majorVersion, int *minorVersion) const { Q_ASSERT(typeName); @@ -293,6 +302,13 @@ void MetaInfoPrivate::typeInfo(const QMetaObject *qMetaObject, QString *typeName majVersion = qmlType->majorVersion(); minVersion = qmlType->minorVersion(); } + if (isDepricatedQtType(qmlType->qmlTypeName())) { //### todo there has to be an alternative + QString properTypeName = qmlType->qmlTypeName(); + properTypeName.replace("Qt/", "QtQuick/"); + *typeName = properTypeName; + majVersion = 1; + minVersion = 0; + } } if (majorVersion) *majorVersion = majVersion; @@ -363,7 +379,9 @@ void MetaInfoPrivate::parseQmlTypes() foreach (QDeclarativeType *qmlType, qmlTypes()) { const QString qtTypeName(qmlType->typeName()); const QString qmlTypeName(qmlType->qmlTypeName()); - m_QtTypesToQmlTypes.insert(qtTypeName, qmlTypeName); + + if (!isDepricatedQtType(qmlType->qmlTypeName())) + m_QtTypesToQmlTypes.insert(qtTypeName, qmlTypeName); } foreach (QDeclarativeType *qmlType, qmlTypes()) { const QMetaObject *qMetaObject = qmlType->metaObject(); @@ -372,6 +390,10 @@ void MetaInfoPrivate::parseQmlTypes() if (m_q->hasNodeMetaInfo(qmlType->qmlTypeName(), qmlType->majorVersion(), qmlType->minorVersion())) continue; + // we ignore the depricated Qt/ namespace + if (isDepricatedQtType(qmlType->qmlTypeName())) + continue; + NodeMetaInfo nodeMetaInfo(*m_q); nodeMetaInfo.setType(qmlType->qmlTypeName(), qmlType->majorVersion(), qmlType->minorVersion()); diff --git a/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp b/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp index f381e77df13..dbd6c973d13 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp @@ -326,6 +326,15 @@ void SubComponentManagerPrivate::unregisterQmlFile(const QFileInfo &fileInfo, co } } +static inline bool isDepricatedQtType(const QString &typeName) +{ + if (typeName.length() < 3) + return false; + + return (typeName.at(0) == 'Q' && typeName.at(1) == 't' && typeName.at(2) == '/'); +} + + void SubComponentManagerPrivate::registerQmlFile(const QFileInfo &fileInfo, const QString &qualifier, const QDeclarativeDomDocument &document, bool addToLibrary) { @@ -351,9 +360,17 @@ void SubComponentManagerPrivate::registerQmlFile(const QFileInfo &fileInfo, cons NodeMetaInfo nodeInfo(m_metaInfo); nodeInfo.setType(componentName, -1, -1); nodeInfo.setQmlFile(fileInfo.filePath()); - nodeInfo.setSuperClass(rootObject.objectType(), - rootObject.objectTypeMajorVersion(), - rootObject.objectTypeMinorVersion()); + if (!isDepricatedQtType(rootObject.objectType())) { + nodeInfo.setSuperClass(rootObject.objectType(), + rootObject.objectTypeMajorVersion(), + rootObject.objectTypeMinorVersion()); + } else { + QString properClassName = rootObject.objectType(); + properClassName.replace("Qt/", "QtQuick/"); + nodeInfo.setSuperClass(properClassName, + 1, + 0); + } if (addToLibrary) { // Add file components to the library diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 8a714b1bf99..56035fb53ff 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -90,7 +90,7 @@ ModelPrivate::ModelPrivate(Model *model) : m_q(model), m_writeLock(false) { - m_rootInternalNode = createNode("Qt/Item", 4, 7, PropertyListType()); + m_rootInternalNode = createNode("QtQuick/Item", 1, 0, PropertyListType()); } ModelPrivate::~ModelPrivate() diff --git a/src/plugins/qmldesigner/designercore/model/qmlchangeset.cpp b/src/plugins/qmldesigner/designercore/model/qmlchangeset.cpp index 111d98091ce..ad5b5ab8294 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlchangeset.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlchangeset.cpp @@ -51,12 +51,12 @@ void QmlModelStateOperation::setTarget(const ModelNode &target) bool QmlPropertyChanges::isValid() const { - return QmlModelNodeFacade::isValid() && modelNode().metaInfo().isSubclassOf("Qt/PropertyChanges", 4, 7); + return QmlModelNodeFacade::isValid() && modelNode().metaInfo().isSubclassOf("QtQuick/PropertyChanges", 1, 0); } bool QmlModelStateOperation::isValid() const { - return QmlModelNodeFacade::isValid() && modelNode().metaInfo().isSubclassOf("QDeclarativeStateOperation", 4, 7); + return QmlModelNodeFacade::isValid() && modelNode().metaInfo().isSubclassOf("QDeclarativeStateOperation", 1, 0); } void QmlPropertyChanges::removeProperty(const QString &name) diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp index 8a6369475ac..dd3426c53a9 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp @@ -46,7 +46,7 @@ namespace QmlDesigner { bool QmlItemNode::isValid() const { - return QmlModelNodeFacade::isValid() && modelNode().metaInfo().isValid() && modelNode().metaInfo().isSubclassOf("Qt/Item", 4, 7); + return QmlModelNodeFacade::isValid() && modelNode().metaInfo().isValid() && modelNode().metaInfo().isSubclassOf("QtQuick/Item", 1, 0); } bool QmlItemNode::isRootNode() const @@ -302,7 +302,7 @@ QmlModelState QmlModelStateGroup::addState(const QString &name) PropertyListType propertyList; propertyList.append(qMakePair(QString("name"), QVariant(name))); - ModelNode newState = modelNode().view()->createModelNode("Qt/State", 4, 7, propertyList); + ModelNode newState = modelNode().view()->createModelNode("QtQuick/State", 1, 0, propertyList); modelNode().nodeListProperty("states").reparentHere(newState); return newState; diff --git a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp index 191114bf1b7..e9dfbad5399 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp @@ -98,8 +98,8 @@ QmlItemNode QmlModelView::createQmlItemNodeFromImage(const QString &imageName, c QmlItemNode newNode; RewriterTransaction transaction = beginRewriterTransaction(); { - const QString newImportUrl = QLatin1String("Qt"); - const QString newImportVersion = QLatin1String("4.7"); + const QString newImportUrl = QLatin1String("QtQuick"); + const QString newImportVersion = QLatin1String("1.0"); Import newImport = Import::createLibraryImport(newImportUrl, newImportVersion); foreach (const Import &import, model()->imports()) { @@ -129,7 +129,7 @@ QmlItemNode QmlModelView::createQmlItemNodeFromImage(const QString &imageName, c } propertyPairList.append(qMakePair(QString("source"), QVariant(relativeImageName))); - newNode = createQmlItemNode("Qt/Image", 4, 7, propertyPairList); + newNode = createQmlItemNode("QtQuick/Image", 1, 0, propertyPairList); parentNode.nodeAbstractProperty("data").reparentHere(newNode); Q_ASSERT(newNode.isValid()); diff --git a/src/plugins/qmldesigner/designercore/model/qmlstate.cpp b/src/plugins/qmldesigner/designercore/model/qmlstate.cpp index bd17f083f17..934f32d528f 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlstate.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlstate.cpp @@ -179,7 +179,7 @@ void QmlModelState::addChangeSetIfNotExists(const ModelNode &node) return; //changeSet already there } - ModelNode newChangeSet = modelNode().view()->createModelNode("Qt/PropertyChanges", 4, 7); + ModelNode newChangeSet = modelNode().view()->createModelNode("QtQuick/PropertyChanges", 1, 0); modelNode().nodeListProperty("changes").reparentHere(newChangeSet); QmlPropertyChanges(newChangeSet).setTarget(node); @@ -246,7 +246,7 @@ bool QmlModelState::isValid() const { return QmlModelNodeFacade::isValid() && modelNode().metaInfo().isValid() && - (modelNode().metaInfo().isSubclassOf("Qt/State", 4, 7) || isBaseState()); + (modelNode().metaInfo().isSubclassOf("QtQuick/State", 1, 0) || isBaseState()); } /** @@ -280,7 +280,7 @@ QmlModelState QmlModelState::duplicate(const QString &name) const // QmlModelState newState(stateGroup().addState(name)); PropertyListType propertyList; propertyList.append(qMakePair(QString("name"), QVariant(name))); - QmlModelState newState ( qmlModelView()->createModelNode("Qt/State", 4, 7, propertyList) ); + QmlModelState newState ( qmlModelView()->createModelNode("QtQuick/State", 1, 0, propertyList) ); foreach (const ModelNode &childNode, modelNode().nodeListProperty("changes").toModelNodeList()) { ModelNode newModelNode(qmlModelView()->createModelNode(childNode.type(), childNode.majorVersion(), childNode.minorVersion())); diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 0627e0e6e88..bd289d0aefc 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -667,7 +667,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, if (UiArrayBinding *array = cast(member)) { const QString astPropertyName = flatten(array->qualifiedId); - if (typeName == QLatin1String("Qt/PropertyChanges") || context->lookupProperty(QString(), array->qualifiedId)) { + if (typeName == QLatin1String("QtQuick/PropertyChanges") || context->lookupProperty(QString(), array->qualifiedId)) { AbstractProperty modelProperty = modelNode.property(astPropertyName); QList arrayMembers; for (UiArrayMemberList *iter = array->members; iter; iter = iter->next) @@ -701,7 +701,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, const Interpreter::Value *propertyType = 0; const Interpreter::ObjectValue *containingObject = 0; QString name; - if (context->lookupProperty(QString(), binding->qualifiedId, &propertyType, &containingObject, &name) || typeName == QLatin1String("Qt/PropertyChanges")) { + if (context->lookupProperty(QString(), binding->qualifiedId, &propertyType, &containingObject, &name) || typeName == QLatin1String("QtQuick/PropertyChanges")) { AbstractProperty modelProperty = modelNode.property(astPropertyName); if (context->isArrayProperty(propertyType, containingObject, name)) { syncArrayProperty(modelProperty, QList() << member, context, differenceHandler); @@ -745,7 +745,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, if (!defaultPropertyItems.isEmpty()) { if (defaultPropertyName.isEmpty()) { - if (modelNode.type() != QLatin1String("Qt/Component")) + if (modelNode.type() != QLatin1String("QtQuick/Component")) qWarning() << "No default property for node type" << modelNode.type() << ", ignoring child items."; } else { AbstractProperty modelProperty = modelNode.property(defaultPropertyName); @@ -805,7 +805,7 @@ QString TextToModelMerger::syncScriptBinding(ModelNode &modelNode, return QString(); if (isLiteralValue(script)) { - if (modelNode.type() == QLatin1String("Qt/PropertyChanges")) { + if (modelNode.type() == QLatin1String("QtQuick/PropertyChanges")) { AbstractProperty modelProperty = modelNode.property(astPropertyName); const QVariant variantValue(deEscape(stripQuotes(astValue))); syncVariantProperty(modelProperty, variantValue, QString(), differenceHandler); @@ -830,7 +830,7 @@ QString TextToModelMerger::syncScriptBinding(ModelNode &modelNode, syncVariantProperty(modelProperty, enumValue, QString(), differenceHandler); return astPropertyName; } else { // Not an enum, so: - if (modelNode.type() == QLatin1String("Qt/PropertyChanges") || context->lookupProperty(prefix, script->qualifiedId)) { + if (modelNode.type() == QLatin1String("QtQuick/PropertyChanges") || context->lookupProperty(prefix, script->qualifiedId)) { AbstractProperty modelProperty = modelNode.property(astPropertyName); syncExpressionProperty(modelProperty, astValue, differenceHandler); return astPropertyName; @@ -959,7 +959,7 @@ void TextToModelMerger::syncNodeListProperty(NodeListProperty &modelListProperty QString name; if (UiObjectDefinition *definition = cast(arrayMember)) name = flatten(definition->qualifiedTypeNameId); - if (name == QLatin1String("Qt/Component")) + if (name == QLatin1String("QtQuick/Component")) setupComponent(newNode); } @@ -1273,7 +1273,7 @@ void ModelAmender::idsDiffer(ModelNode &modelNode, const QString &qmlId) void TextToModelMerger::setupComponent(const ModelNode &node) { - Q_ASSERT(node.type() == QLatin1String("Qt/Component")); + Q_ASSERT(node.type() == QLatin1String("QtQuick/Component")); QString componentText = m_rewriterView->extractText(QList() << node).value(node); diff --git a/src/plugins/qmldesigner/qtquickplugin/qtquickplugin.cpp b/src/plugins/qmldesigner/qtquickplugin/qtquickplugin.cpp index f4e419ad09e..1480471785d 100644 --- a/src/plugins/qmldesigner/qtquickplugin/qtquickplugin.cpp +++ b/src/plugins/qmldesigner/qtquickplugin/qtquickplugin.cpp @@ -38,8 +38,8 @@ namespace QmlDesigner { QtQuickPlugin::QtQuickPlugin() { - qmlRegisterType("Qt", 4, 7, "Pen"); - qmlRegisterType("Qt", 4, 7, "ScaleGrid"); + qmlRegisterType("QtQuick", 1, 0, "Pen"); + qmlRegisterType("QtQuick", 1, 0, "ScaleGrid"); } QString QtQuickPlugin::pluginName() diff --git a/src/plugins/qmldesigner/qtquickplugin/quick.metainfo b/src/plugins/qmldesigner/qtquickplugin/quick.metainfo index 139a82bc056..4c828305a62 100644 --- a/src/plugins/qmldesigner/qtquickplugin/quick.metainfo +++ b/src/plugins/qmldesigner/qtquickplugin/quick.metainfo @@ -1,5 +1,5 @@ - + @@ -7,14 +7,14 @@ - + - + @@ -23,7 +23,7 @@ - + @@ -32,7 +32,7 @@ - + @@ -41,13 +41,13 @@ - + - + @@ -56,7 +56,7 @@ - + @@ -65,7 +65,7 @@ - + @@ -73,7 +73,7 @@ - + @@ -81,28 +81,28 @@ - + - + - + - + diff --git a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp index 21e55610461..cec7f02433b 100644 --- a/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp +++ b/tests/auto/qml/qmldesigner/coretests/tst_testcore.cpp @@ -121,7 +121,7 @@ void tst_TestCore::cleanupTestCase() void tst_TestCore::testModelCreateCoreModel() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer testView(new TestView(model.data())); @@ -140,17 +140,17 @@ void tst_TestCore::loadEmptyCoreModel() textEdit1.setPlainText(file.readAll()); NotIndentingTextEditModifier modifier1(&textEdit1); - QScopedPointer model1(Model::create("Qt/Item")); + QScopedPointer model1(Model::create("QtQuick/Item")); QScopedPointer testRewriterView1(new TestRewriterView()); testRewriterView1->setTextModifier(&modifier1); model1->attachView(testRewriterView1.data()); QPlainTextEdit textEdit2; - textEdit2.setPlainText("import Qt 4.7; Item{}"); + textEdit2.setPlainText("import QtQuick 1.0; Item{}"); NotIndentingTextEditModifier modifier2(&textEdit2); - QScopedPointer model2(Model::create("Qt/item")); + QScopedPointer model2(Model::create("QtQuick/item")); QScopedPointer testRewriterView2(new TestRewriterView()); testRewriterView2->setTextModifier(&modifier2); @@ -163,10 +163,10 @@ void tst_TestCore::testRewriterView() { try { QPlainTextEdit textEdit; - textEdit.setPlainText("import Qt 4.7;\n\nItem {\n}\n"); + textEdit.setPlainText("import QtQuick 1.0;\n\nItem {\n}\n"); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -179,15 +179,15 @@ void tst_TestCore::testRewriterView() testRewriterView->setTextModifier(&textModifier); model->attachView(testRewriterView.data()); - ModelNode childNode(addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data")); + ModelNode childNode(addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data")); QVERIFY(childNode.isValid()); childNode.setId("childNode"); - ModelNode childNode2(addNodeListChild(childNode, "Qt/Rectangle", 4, 7, "data")); + ModelNode childNode2(addNodeListChild(childNode, "QtQuick/Rectangle", 1, 0, "data")); childNode2.setId("childNode2"); - ModelNode childNode3(addNodeListChild(childNode2, "Qt/Rectangle", 4, 7, "data")); + ModelNode childNode3(addNodeListChild(childNode2, "QtQuick/Rectangle", 1, 0, "data")); childNode3.setId("childNode3"); - ModelNode childNode4(addNodeListChild(childNode3, "Qt/Rectangle", 4, 7, "data")); + ModelNode childNode4(addNodeListChild(childNode3, "QtQuick/Rectangle", 1, 0, "data")); childNode4.setId("childNode4"); QVERIFY(childNode.isValid()); @@ -213,7 +213,7 @@ void tst_TestCore::testRewriterView() testRewriterView->modelToTextMerger()->applyChanges(); - childNode = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); + childNode = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); QVERIFY(testRewriterView->modelToTextMerger()->isNodeScheduledForAddition(childNode)); testRewriterView->modelToTextMerger()->applyChanges(); @@ -233,10 +233,10 @@ void tst_TestCore::testRewriterView() void tst_TestCore::testRewriterErrors() { QPlainTextEdit textEdit; - textEdit.setPlainText("import Qt 4.7;\n\nItem {\n}\n"); + textEdit.setPlainText("import QtQuick 1.0;\n\nItem {\n}\n"); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -250,10 +250,10 @@ void tst_TestCore::testRewriterErrors() model->attachView(testRewriterView.data()); QVERIFY(testRewriterView->errors().isEmpty()); - textEdit.setPlainText("import Qt 4.7;\n\nError {\n}\n"); + textEdit.setPlainText("import QtQuick 1.0;\n\nError {\n}\n"); QVERIFY(!testRewriterView->errors().isEmpty()); - textEdit.setPlainText("import Qt 4.7;\n\nItem {\n}\n"); + textEdit.setPlainText("import QtQuick 1.0;\n\nItem {\n}\n"); QVERIFY(testRewriterView->errors().isEmpty()); } @@ -267,7 +267,7 @@ void tst_TestCore::saveEmptyCoreModel() textEdit1.setPlainText(file.readAll()); NotIndentingTextEditModifier modifier1(&textEdit1); - QScopedPointer model1(Model::create("Qt/Item")); + QScopedPointer model1(Model::create("QtQuick/Item")); QScopedPointer testRewriterView1(new TestRewriterView()); testRewriterView1->setTextModifier(&modifier1); @@ -279,10 +279,10 @@ void tst_TestCore::saveEmptyCoreModel() modifier1.save(&buffer); QPlainTextEdit textEdit2; - textEdit2.setPlainText("import Qt 4.7; Item{}"); + textEdit2.setPlainText("import QtQuick 1.0; Item{}"); NotIndentingTextEditModifier modifier2(&textEdit2); - QScopedPointer model2(Model::create("Qt/item")); + QScopedPointer model2(Model::create("QtQuick/item")); QScopedPointer testRewriterView2(new TestRewriterView()); testRewriterView2->setTextModifier(&modifier2); @@ -302,17 +302,17 @@ void tst_TestCore::loadAttributesInCoreModel() textEdit1.setPlainText(file.readAll()); NotIndentingTextEditModifier modifier1(&textEdit1); - QScopedPointer model1(Model::create("Qt/Item")); + QScopedPointer model1(Model::create("QtQuick/Item")); QScopedPointer testRewriterView1(new TestRewriterView()); testRewriterView1->setTextModifier(&modifier1); model1->attachView(testRewriterView1.data()); QPlainTextEdit textEdit2; - textEdit2.setPlainText("import Qt 4.7; Item{}"); + textEdit2.setPlainText("import QtQuick 1.0; Item{}"); NotIndentingTextEditModifier modifier2(&textEdit2); - QScopedPointer model2(Model::create("Qt/item")); + QScopedPointer model2(Model::create("QtQuick/item")); QScopedPointer testRewriterView2(new TestRewriterView()); testRewriterView2->setTextModifier(&modifier2); @@ -337,7 +337,7 @@ void tst_TestCore::saveAttributesInCoreModel() textEdit1.setPlainText(file.readAll()); NotIndentingTextEditModifier modifier1(&textEdit1); - QScopedPointer model1(Model::create("Qt/Item")); + QScopedPointer model1(Model::create("QtQuick/Item")); QScopedPointer testRewriterView1(new TestRewriterView()); testRewriterView1->setTextModifier(&modifier1); @@ -353,7 +353,7 @@ void tst_TestCore::saveAttributesInCoreModel() textEdit2.setPlainText(buffer.data()); NotIndentingTextEditModifier modifier2(&textEdit2); - QScopedPointer model2(Model::create("Qt/Item")); + QScopedPointer model2(Model::create("QtQuick/Item")); QScopedPointer testRewriterView2(new TestRewriterView()); testRewriterView2->setTextModifier(&modifier2); @@ -368,7 +368,7 @@ void tst_TestCore::testModelCreateRect() { try { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -376,7 +376,7 @@ void tst_TestCore::testModelCreateRect() model->attachView(view.data()); QVERIFY(view->rootModelNode().isValid()); - ModelNode childNode = addNodeListChild(view->rootModelNode(), "Qt/Rectangle", 4, 7, "data"); + ModelNode childNode = addNodeListChild(view->rootModelNode(), "QtQuick/Rectangle", 1, 0, "data"); QVERIFY(childNode.isValid()); QVERIFY(view->rootModelNode().allDirectSubModelNodes().contains(childNode)); QVERIFY(childNode.parentProperty().parentModelNode() == view->rootModelNode()); @@ -404,7 +404,7 @@ void tst_TestCore::testModelCreateRect() void tst_TestCore::testRewriterDynamicProperties() { const QLatin1String qmlString("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " property int i\n" @@ -431,7 +431,7 @@ void tst_TestCore::testRewriterDynamicProperties() textEdit1.setPlainText(qmlString); NotIndentingTextEditModifier modifier1(&textEdit1); - QScopedPointer model1(Model::create("Qt/Item")); + QScopedPointer model1(Model::create("QtQuick/Item")); QScopedPointer testRewriterView1(new TestRewriterView()); testRewriterView1->setTextModifier(&modifier1); @@ -521,10 +521,10 @@ void tst_TestCore::testRewriterDynamicProperties() // test model2text // QPlainTextEdit textEdit2; -// textEdit2.setPlainText("import Qt 4.7; Item{}"); +// textEdit2.setPlainText("import QtQuick 1.0; Item{}"); // NotIndentingTextEditModifier modifier2(&textEdit2); // -// QScopedPointer model2(Model::create("Qt/Item")); +// QScopedPointer model2(Model::create("QtQuick/Item")); // // QScopedPointer testRewriterView2(new TestRewriterView()); // testRewriterView2->setTextModifier(&modifier2); @@ -538,7 +538,7 @@ void tst_TestCore::testRewriterDynamicProperties() void tst_TestCore::testRewriterGroupedProperties() { const QLatin1String qmlString("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Text {\n" " font {\n" @@ -551,7 +551,7 @@ void tst_TestCore::testRewriterGroupedProperties() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier modifier1(&textEdit); - QScopedPointer model1(Model::create("Qt/Text")); + QScopedPointer model1(Model::create("QtQuick/Text")); QScopedPointer testRewriterView1(new TestRewriterView()); testRewriterView1->setTextModifier(&modifier1); @@ -575,7 +575,7 @@ void tst_TestCore::testRewriterGroupedProperties() rootModelNode.removeProperty(QLatin1String("font.pointSize")); const QLatin1String expected("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Text {\n" "}\n"); @@ -586,7 +586,7 @@ void tst_TestCore::testRewriterGroupedProperties() void tst_TestCore::testRewriterPreserveOrder() { const QLatin1String qmlString1("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" "width: 640\n" @@ -607,7 +607,7 @@ void tst_TestCore::testRewriterPreserveOrder() "}\n" "}\n"); const QLatin1String qmlString2("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" "width: 640\n" @@ -633,7 +633,7 @@ void tst_TestCore::testRewriterPreserveOrder() textEdit.setPlainText(qmlString2); NotIndentingTextEditModifier modifier(&textEdit); - QScopedPointer model(Model::create("Qt/Text")); + QScopedPointer model(Model::create("QtQuick/Text")); QScopedPointer testRewriterView(new TestRewriterView()); testRewriterView->setTextModifier(&modifier); @@ -646,7 +646,7 @@ void tst_TestCore::testRewriterPreserveOrder() RewriterTransaction transaction = testRewriterView->beginRewriterTransaction(); - ModelNode newModelNode = testRewriterView->createModelNode("Qt/Rectangle", 4, 7); + ModelNode newModelNode = testRewriterView->createModelNode("QtQuick/Rectangle", 1, 0); newModelNode.setParentProperty(rootModelNode.nodeAbstractProperty("data")); @@ -668,7 +668,7 @@ void tst_TestCore::testRewriterPreserveOrder() textEdit.setPlainText(qmlString1); NotIndentingTextEditModifier modifier(&textEdit); - QScopedPointer model(Model::create("Qt/Text")); + QScopedPointer model(Model::create("QtQuick/Text")); QScopedPointer testRewriterView(new TestRewriterView()); testRewriterView->setTextModifier(&modifier); @@ -681,7 +681,7 @@ void tst_TestCore::testRewriterPreserveOrder() RewriterTransaction transaction = testRewriterView->beginRewriterTransaction(); - ModelNode newModelNode = testRewriterView->createModelNode("Qt/Rectangle", 4, 7); + ModelNode newModelNode = testRewriterView->createModelNode("QtQuick/Rectangle", 1, 0); newModelNode.setParentProperty(rootModelNode.nodeAbstractProperty("data")); @@ -702,7 +702,7 @@ void tst_TestCore::testRewriterPreserveOrder() void tst_TestCore::testRewriterActionCompression() { const QLatin1String qmlString("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " id: root\n" @@ -722,7 +722,7 @@ void tst_TestCore::testRewriterActionCompression() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier modifier1(&textEdit); - QScopedPointer model1(Model::create("Qt/Rectangle")); + QScopedPointer model1(Model::create("QtQuick/Rectangle")); QScopedPointer testRewriterView(new TestRewriterView()); testRewriterView->setTextModifier(&modifier1); @@ -748,7 +748,7 @@ void tst_TestCore::testRewriterActionCompression() transaction.commit(); const QLatin1String expected("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " id: root\n" @@ -776,7 +776,7 @@ void tst_TestCore::testRewriterImports() textEdit.setPlainText(file.readAll()); NotIndentingTextEditModifier modifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); model->setFileUrl(QUrl::fromLocalFile(fileName)); QScopedPointer testRewriterView(new TestRewriterView()); @@ -787,7 +787,7 @@ void tst_TestCore::testRewriterImports() QVERIFY(model->imports().size() == 3); - // import Qt 4.7 + // import QtQuick 1.0 Import import = model->imports().at(0); QVERIFY(import.isLibraryImport()); QCOMPARE(import.url(), QString("Qt")); @@ -815,7 +815,7 @@ void tst_TestCore::testRewriterImports() void tst_TestCore::testRewriterChangeImports() { const QLatin1String qmlString("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {}\n"); @@ -823,7 +823,7 @@ void tst_TestCore::testRewriterChangeImports() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier modifier(&textEdit); - QScopedPointer model(Model::create("Qt/Rectangle")); + QScopedPointer model(Model::create("QtQuick/Rectangle")); QScopedPointer testRewriterView(new TestRewriterView(0, RewriterView::Amend)); testRewriterView->setTextModifier(&modifier); @@ -838,7 +838,7 @@ void tst_TestCore::testRewriterChangeImports() model->addImport(webkitImport); const QLatin1String qmlWithImport("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "import QtWebKit 1.0\n" "\n" "Rectangle {}\n"); @@ -847,7 +847,7 @@ void tst_TestCore::testRewriterChangeImports() model->removeImport(webkitImport); QCOMPARE(model->imports().size(), 1); - QCOMPARE(model->imports().first(), Import::createLibraryImport("Qt", "4.7")); + QCOMPARE(model->imports().first(), Import::createLibraryImport("QtQuick", "1.0")); QCOMPARE(textEdit.toPlainText(), qmlString); @@ -859,7 +859,7 @@ void tst_TestCore::testRewriterChangeImports() model->addImport(webkitImport); const QLatin1String qmlWithAliasImport("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "import QtWebKit 1.0 as Web\n" "\n" "Rectangle {}\n"); @@ -868,7 +868,7 @@ void tst_TestCore::testRewriterChangeImports() model->removeImport(webkitImport); QCOMPARE(model->imports().size(), 1); - QCOMPARE(model->imports().first(), Import::createLibraryImport("Qt", "4.7")); + QCOMPARE(model->imports().first(), Import::createLibraryImport("QtQuick", "1.0")); QCOMPARE(textEdit.toPlainText(), qmlString); @@ -878,23 +878,23 @@ void tst_TestCore::testRewriterChangeImports() // textEdit.setPlainText(qmlWithImport); QCOMPARE(model->imports().size(), 2); - QCOMPARE(model->imports().first(), Import::createLibraryImport("Qt", "4.7")); + QCOMPARE(model->imports().first(), Import::createLibraryImport("QtQuick", "1.0")); QCOMPARE(model->imports().last(), Import::createLibraryImport("QtWebKit", "1.0")); textEdit.setPlainText(qmlWithAliasImport); QCOMPARE(model->imports().size(), 2); - QCOMPARE(model->imports().first(), Import::createLibraryImport("Qt", "4.7")); + QCOMPARE(model->imports().first(), Import::createLibraryImport("QtQuick", "1.0")); QCOMPARE(model->imports().last(), Import::createLibraryImport("QtWebKit", "1.0", "Web")); textEdit.setPlainText(qmlString); QCOMPARE(model->imports().size(), 1); - QCOMPARE(model->imports().first(), Import::createLibraryImport("Qt", "4.7")); + QCOMPARE(model->imports().first(), Import::createLibraryImport("QtQuick", "1.0")); } void tst_TestCore::testRewriterForGradientMagic() { const QLatin1String qmlString("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " id: root\n" @@ -932,7 +932,7 @@ void tst_TestCore::testRewriterForGradientMagic() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier modifier(&textEdit); - QScopedPointer model(Model::create("Qt/Text")); + QScopedPointer model(Model::create("QtQuick/Text")); QScopedPointer testRewriterView(new TestRewriterView()); testRewriterView->setTextModifier(&modifier); @@ -948,7 +948,7 @@ void tst_TestCore::testRewriterForGradientMagic() myRect.variantProperty("rotation") = QVariant(45); QVERIFY(myRect.isValid()); - QScopedPointer model1(Model::create("Qt/Item", 4, 7)); + QScopedPointer model1(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model1.data()); QScopedPointer view1(new TestView(model1.data())); @@ -956,7 +956,7 @@ void tst_TestCore::testRewriterForGradientMagic() QScopedPointer testRewriterView1(new TestRewriterView()); QPlainTextEdit textEdit1; - textEdit1.setPlainText("import Qt 4.7; Item {}"); + textEdit1.setPlainText("import QtQuick 1.0; Item {}"); NotIndentingTextEditModifier modifier1(&textEdit1); testRewriterView1->setTextModifier(&modifier1); @@ -982,7 +982,7 @@ void tst_TestCore::loadSubItems() textEdit1.setPlainText(file.readAll()); NotIndentingTextEditModifier modifier1(&textEdit1); - QScopedPointer model1(Model::create("Qt/Item")); + QScopedPointer model1(Model::create("QtQuick/Item")); QScopedPointer testRewriterView1(new TestRewriterView()); testRewriterView1->setTextModifier(&modifier1); @@ -1000,7 +1000,7 @@ void tst_TestCore::createInvalidCoreModel() void tst_TestCore::testModelCreateSubNode() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -1012,7 +1012,7 @@ void tst_TestCore::testModelCreateSubNode() QCOMPARE(view->methodCalls(), expectedCalls); QVERIFY(view->rootModelNode().isValid()); - ModelNode childNode = addNodeListChild(view->rootModelNode(), "Qt/Rectangle", 4, 7, "data"); + ModelNode childNode = addNodeListChild(view->rootModelNode(), "QtQuick/Rectangle", 1, 0, "data"); QVERIFY(childNode.isValid()); QVERIFY(view->rootModelNode().allDirectSubModelNodes().contains(childNode)); QVERIFY(childNode.parentProperty().parentModelNode() == view->rootModelNode()); @@ -1046,7 +1046,7 @@ void tst_TestCore::testModelCreateSubNode() void tst_TestCore::testTypicalRewriterOperations() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -1075,7 +1075,7 @@ void tst_TestCore::testTypicalRewriterOperations() QCOMPARE(rootModelNode.bindingProperty("test").expression(), QString("parent.x")); - ModelNode childNode(addNodeListChild(rootModelNode, "Qt/Rectangle", 4 ,6, "data")); + ModelNode childNode(addNodeListChild(rootModelNode, "QtQuick/Rectangle", 4 ,6, "data")); rootModelNode.nodeListProperty("test").reparentHere(childNode); QCOMPARE(childNode.parentProperty(), rootModelNode.nodeAbstractProperty("test")); QVERIFY(rootModelNode.property("test").isNodeAbstractProperty()); @@ -1095,7 +1095,7 @@ void tst_TestCore::testTypicalRewriterOperations() void tst_TestCore::testBasicStates() { - char qmlString[] = "import Qt 4.7\n" + char qmlString[] = "import QtQuick 1.0\n" "Rectangle {\n" "id: root;\n" "Rectangle {\n" @@ -1134,7 +1134,7 @@ void tst_TestCore::testBasicStates() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -1143,13 +1143,13 @@ void tst_TestCore::testBasicStates() ModelNode rootModelNode(view->rootModelNode()); QVERIFY(rootModelNode.isValid()); - QCOMPARE(rootModelNode.type(), QString("Qt/Item")); + QCOMPARE(rootModelNode.type(), QString("QtQuick/Item")); QScopedPointer testRewriterView(new TestRewriterView()); testRewriterView->setTextModifier(&textModifier); model->attachView(testRewriterView.data()); QVERIFY(rootModelNode.isValid()); - QCOMPARE(rootModelNode.type(), QString("Qt/Rectangle")); + QCOMPARE(rootModelNode.type(), QString("QtQuick/Rectangle")); QVERIFY(rootModelNode.hasProperty("data")); @@ -1246,7 +1246,7 @@ void tst_TestCore::testBasicStates() void tst_TestCore::testModelBasicOperations() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -1267,8 +1267,8 @@ void tst_TestCore::testModelBasicOperations() QVERIFY(!rootModelNode.hasProperty("width")); QVERIFY(!rootModelNode.hasProperty("children")); - ModelNode childNode1(addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "children")); - ModelNode childNode2(addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data")); + ModelNode childNode1(addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "children")); + ModelNode childNode2(addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data")); QVERIFY(childNode1.isValid()); QVERIFY(childNode2.isValid()); @@ -1306,7 +1306,7 @@ void tst_TestCore::testModelBasicOperations() void tst_TestCore::testModelResolveIds() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -1316,9 +1316,9 @@ void tst_TestCore::testModelResolveIds() ModelNode rootNode = view->rootModelNode(); rootNode.setId("rootNode"); - ModelNode childNode1(addNodeListChild(rootNode, "Qt/Rectangle", 4, 7, "children")); + ModelNode childNode1(addNodeListChild(rootNode, "QtQuick/Rectangle", 1, 0, "children")); - ModelNode childNode2(addNodeListChild(childNode1, "Qt/Rectangle", 4, 7, "children")); + ModelNode childNode2(addNodeListChild(childNode1, "QtQuick/Rectangle", 1, 0, "children")); childNode2.setId("childNode2"); childNode2.bindingProperty("test").setExpression("parent.parent"); @@ -1329,7 +1329,7 @@ void tst_TestCore::testModelResolveIds() childNode2.bindingProperty("test").setExpression("rootNode"); QCOMPARE(childNode2.bindingProperty("test").resolveToModelNode(), rootNode); - ModelNode childNode3(addNodeListChild(childNode2, "Qt/Rectangle", 4, 7, "children")); + ModelNode childNode3(addNodeListChild(childNode2, "QtQuick/Rectangle", 1, 0, "children")); childNode3.setId("childNode3"); childNode2.nodeProperty("front").setModelNode(childNode3); childNode2.bindingProperty("test").setExpression("childNode3.parent"); @@ -1364,7 +1364,7 @@ void tst_TestCore::testModelNodeListProperty() // // Test NodeListProperty API // - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -1382,7 +1382,7 @@ void tst_TestCore::testModelNodeListProperty() QVERIFY(!rootChildren.isNodeListProperty()); QVERIFY(rootChildren.isEmpty()); - ModelNode rectNode = view->createModelNode("Qt/Rectangle", 4, 7); + ModelNode rectNode = view->createModelNode("QtQuick/Rectangle", 1, 0); rootChildren.reparentHere(rectNode); // @@ -1393,7 +1393,7 @@ void tst_TestCore::testModelNodeListProperty() QVERIFY(rootChildren.isNodeListProperty()); QVERIFY(!rootChildren.isEmpty()); - ModelNode mouseAreaNode = view->createModelNode("Qt/Item", 4, 7); + ModelNode mouseAreaNode = view->createModelNode("QtQuick/Item", 1, 0); NodeListProperty rectChildren = rectNode.nodeListProperty("children"); rectChildren.reparentHere(mouseAreaNode); @@ -1421,7 +1421,7 @@ void tst_TestCore::testModelNodeListProperty() void tst_TestCore::testBasicOperationsWithView() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -1453,8 +1453,8 @@ void tst_TestCore::testBasicOperationsWithView() QCOMPARE(rootInstance.size().width(), 10.0); QCOMPARE(rootInstance.size().height(), 10.0); - ModelNode childNode(addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data")); - ModelNode childNode2(addNodeListChild(childNode, "Qt/Rectangle", 4, 7, "data")); + ModelNode childNode(addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data")); + ModelNode childNode2(addNodeListChild(childNode, "QtQuick/Rectangle", 1, 0, "data")); QVERIFY(childNode2.parentProperty().parentModelNode() == childNode); QVERIFY(childNode.isValid()); @@ -1489,10 +1489,10 @@ void tst_TestCore::testBasicOperationsWithView() QVERIFY(!childInstance2.isValid()); } - childNode = addNodeListChild(rootModelNode, "Qt/Image", 4, 7, "data"); + childNode = addNodeListChild(rootModelNode, "QtQuick/Image", 1, 0, "data"); QVERIFY(childNode.isValid()); - QCOMPARE(childNode.type(), QString("Qt/Image")); - childNode2 = addNodeListChild(childNode, "Qt/Rectangle", 4, 7, "data"); + QCOMPARE(childNode.type(), QString("QtQuick/Image")); + childNode2 = addNodeListChild(childNode, "QtQuick/Rectangle", 1, 0, "data"); QVERIFY(childNode2.isValid()); childNode2.setParentProperty(rootModelNode, "data"); QVERIFY(childNode2.isValid()); @@ -1531,7 +1531,7 @@ void tst_TestCore::testBasicOperationsWithView() void tst_TestCore::testQmlModelView() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QmlModelView *view = new TestView(model.data()); @@ -1549,7 +1549,7 @@ void tst_TestCore::testQmlModelView() propertyList.append(qMakePair(QString("width"), QVariant(20))); propertyList.append(qMakePair(QString("height"), QVariant(20))); - QmlObjectNode node1 = view->createQmlObjectNode("Qt/Rectangle", 4, 7, propertyList); + QmlObjectNode node1 = view->createQmlObjectNode("QtQuick/Rectangle", 1, 0, propertyList); QVERIFY(node1.isValid()); QVERIFY(!node1.hasNodeParent()); @@ -1565,7 +1565,7 @@ void tst_TestCore::testQmlModelView() QVERIFY(node1.instanceParent() == view->rootQmlObjectNode()); - QmlObjectNode node2 = view->createQmlObjectNode("Qt/Rectangle", 4, 7, propertyList); + QmlObjectNode node2 = view->createQmlObjectNode("QtQuick/Rectangle", 1, 0, propertyList); QVERIFY(node2.isValid()); QVERIFY(!node2.hasNodeParent()); @@ -1593,12 +1593,12 @@ void tst_TestCore::testQmlModelView() QCOMPARE(node1.instanceValue("x").toInt(), 2); - QmlObjectNode node3 = view->createQmlObjectNode("Qt/Rectangle", 4, 7, propertyList); - QmlObjectNode node4 = view->createQmlObjectNode("Qt/Rectangle", 4, 7, propertyList); - QmlObjectNode node5 = view->createQmlObjectNode("Qt/Rectangle", 4, 7, propertyList); - QmlObjectNode node6 = view->createQmlObjectNode("Qt/Rectangle", 4, 7, propertyList); - QmlObjectNode node7 = view->createQmlObjectNode("Qt/Rectangle", 4, 7, propertyList); - QmlObjectNode node8 = view->createQmlObjectNode("Qt/Rectangle", 4, 7, propertyList); + QmlObjectNode node3 = view->createQmlObjectNode("QtQuick/Rectangle", 1, 0, propertyList); + QmlObjectNode node4 = view->createQmlObjectNode("QtQuick/Rectangle", 1, 0, propertyList); + QmlObjectNode node5 = view->createQmlObjectNode("QtQuick/Rectangle", 1, 0, propertyList); + QmlObjectNode node6 = view->createQmlObjectNode("QtQuick/Rectangle", 1, 0, propertyList); + QmlObjectNode node7 = view->createQmlObjectNode("QtQuick/Rectangle", 1, 0, propertyList); + QmlObjectNode node8 = view->createQmlObjectNode("QtQuick/Rectangle", 1, 0, propertyList); node3.setParentProperty(node2.nodeAbstractProperty("children")); node4.setParentProperty(node3.nodeAbstractProperty("children")); @@ -1626,12 +1626,12 @@ void tst_TestCore::testQmlModelView() QCOMPARE(node2.instanceValue("x").toInt(), 10); // is this right? or should it be a invalid qvariant? - node1 = view->createQmlObjectNode("Qt/Rectangle", 4, 7, propertyList); + node1 = view->createQmlObjectNode("QtQuick/Rectangle", 1, 0, propertyList); node1.setId("node1"); QCOMPARE(node2.instanceValue("x").toInt(), 20); - node3 = view->createQmlObjectNode("Qt/Rectangle", 4, 7, propertyList); + node3 = view->createQmlObjectNode("QtQuick/Rectangle", 1, 0, propertyList); node3.setParentProperty(node2.nodeAbstractProperty("children")); QCOMPARE(node3.instanceValue("width").toInt(), 20); node3.setVariantProperty("width", 0); @@ -1653,7 +1653,7 @@ void tst_TestCore::testQmlModelView() void tst_TestCore::testModelRemoveNode() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -1666,7 +1666,7 @@ void tst_TestCore::testModelRemoveNode() QCOMPARE(view->rootModelNode().allDirectSubModelNodes().count(), 0); - ModelNode childNode = addNodeListChild(view->rootModelNode(), "Qt/Rectangle", 4, 7, "data"); + ModelNode childNode = addNodeListChild(view->rootModelNode(), "QtQuick/Rectangle", 1, 0, "data"); QVERIFY(childNode.isValid()); QCOMPARE(view->rootModelNode().allDirectSubModelNodes().count(), 1); QVERIFY(view->rootModelNode().allDirectSubModelNodes().contains(childNode)); @@ -1678,7 +1678,7 @@ void tst_TestCore::testModelRemoveNode() QVERIFY(childInstance.parent() == nodeInstanceView->instanceForNode(view->rootModelNode())); } - ModelNode subChildNode = addNodeListChild(childNode, "Qt/Rectangle", 4, 7, "data"); + ModelNode subChildNode = addNodeListChild(childNode, "QtQuick/Rectangle", 1, 0, "data"); QVERIFY(subChildNode.isValid()); QCOMPARE(childNode.allDirectSubModelNodes().count(), 1); QVERIFY(childNode.allDirectSubModelNodes().contains(subChildNode)); @@ -1709,7 +1709,7 @@ void tst_TestCore::testModelRemoveNode() QVERIFY(view->rootModelNode().isValid()); // delete node not in hierarchy - childNode = view->createModelNode("Qt/Item", 4, 7); + childNode = view->createModelNode("QtQuick/Item", 1, 0); childNode.destroy(); model->detachView(nodeInstanceView); @@ -1717,7 +1717,7 @@ void tst_TestCore::testModelRemoveNode() void tst_TestCore::reparentingNode() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); @@ -1734,7 +1734,7 @@ void tst_TestCore::reparentingNode() NodeInstanceView *nodeInstanceView = new NodeInstanceView(model.data()); model->attachView(nodeInstanceView); - ModelNode childNode = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); + ModelNode childNode = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); QCOMPARE(childNode.parentProperty().parentModelNode(), rootModelNode); QVERIFY(rootModelNode.allDirectSubModelNodes().contains(childNode)); @@ -1744,7 +1744,7 @@ void tst_TestCore::reparentingNode() QVERIFY(childInstance.parent() == nodeInstanceView->instanceForNode(view->rootModelNode())); } - ModelNode childNode2 = addNodeListChild(rootModelNode, "Qt/Item", 4, 7, "data"); + ModelNode childNode2 = addNodeListChild(rootModelNode, "QtQuick/Item", 1, 0, "data"); QCOMPARE(childNode2.parentProperty().parentModelNode(), rootModelNode); QVERIFY(rootModelNode.allDirectSubModelNodes().contains(childNode2)); @@ -1785,10 +1785,10 @@ void tst_TestCore::reparentingNode() void tst_TestCore::reparentingNodeLikeDragAndDrop() { QPlainTextEdit textEdit; - textEdit.setPlainText("import Qt 4.7;\n\nItem {\n}\n"); + textEdit.setPlainText("import QtQuick 1.0;\n\nItem {\n}\n"); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer testRewriterView(new TestRewriterView()); @@ -1804,7 +1804,7 @@ void tst_TestCore::reparentingNodeLikeDragAndDrop() view->rootModelNode().setId("rootModelNode"); QCOMPARE(view->rootModelNode().id(), QString("rootModelNode")); - ModelNode rectNode = addNodeListChild(view->rootModelNode(), "Qt/Rectangle", 4, 7, "data"); + ModelNode rectNode = addNodeListChild(view->rootModelNode(), "QtQuick/Rectangle", 1, 0, "data"); rectNode.setId("rect_1"); rectNode.variantProperty("x").setValue(20); rectNode.variantProperty("y").setValue(30); @@ -1813,7 +1813,7 @@ void tst_TestCore::reparentingNodeLikeDragAndDrop() RewriterTransaction transaction(view->beginRewriterTransaction()); - ModelNode textNode = addNodeListChild(view->rootModelNode(), "Qt/Text", 4, 7, "data"); + ModelNode textNode = addNodeListChild(view->rootModelNode(), "QtQuick/Text", 1, 0, "data"); QCOMPARE(textNode.parentProperty().parentModelNode(), view->rootModelNode()); QVERIFY(view->rootModelNode().allDirectSubModelNodes().contains(textNode)); @@ -1901,7 +1901,7 @@ void tst_TestCore::reparentingNodeLikeDragAndDrop() void tst_TestCore::testModelReorderSiblings() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -1914,11 +1914,11 @@ void tst_TestCore::testModelReorderSiblings() ModelNode rootModelNode = view->rootModelNode(); QVERIFY(rootModelNode.isValid()); - ModelNode a = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); + ModelNode a = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); QVERIFY(a.isValid()); - ModelNode b = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); + ModelNode b = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); QVERIFY(b.isValid()); - ModelNode c = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); + ModelNode c = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); QVERIFY(c.isValid()); { @@ -1952,7 +1952,7 @@ void tst_TestCore::testModelReorderSiblings() void tst_TestCore::testModelRootNode() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -1963,10 +1963,10 @@ void tst_TestCore::testModelRootNode() ModelNode rootModelNode = view->rootModelNode(); QVERIFY(rootModelNode.isValid()); QVERIFY(rootModelNode.isRootNode()); - ModelNode topChildNode = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); + ModelNode topChildNode = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); QVERIFY(topChildNode.isValid()); QVERIFY(rootModelNode.isRootNode()); - ModelNode childNode = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); + ModelNode childNode = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); QVERIFY(childNode.isValid()); QVERIFY(rootModelNode.isValid()); QVERIFY(rootModelNode.isRootNode()); @@ -1983,15 +1983,15 @@ void tst_TestCore::testModelRootNode() void tst_TestCore::reparentingNodeInModificationGroup() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); QVERIFY(view.data()); model->attachView(view.data()); - ModelNode childNode = addNodeListChild(view->rootModelNode(), "Qt/Rectangle", 4, 7, "data"); - ModelNode childNode2 = addNodeListChild(view->rootModelNode(), "Qt/Item", 4, 7, "data"); + ModelNode childNode = addNodeListChild(view->rootModelNode(), "QtQuick/Rectangle", 1, 0, "data"); + ModelNode childNode2 = addNodeListChild(view->rootModelNode(), "QtQuick/Item", 1, 0, "data"); childNode.variantProperty("x").setValue(10); childNode.variantProperty("y").setValue(10); @@ -2033,7 +2033,7 @@ void tst_TestCore::reparentingNodeInModificationGroup() void tst_TestCore::testModelAddAndRemoveProperty() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -2074,7 +2074,7 @@ void tst_TestCore::testModelAddAndRemoveProperty() void tst_TestCore::testModelViewNotification() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view1(new TestView(model.data())); @@ -2096,7 +2096,7 @@ void tst_TestCore::testModelViewNotification() QCOMPARE(view1->methodCalls(), expectedCalls); QCOMPARE(view2->methodCalls(), expectedCalls); - ModelNode childNode = addNodeListChild(view2->rootModelNode(), "Qt/Rectangle", 4, 7, "data"); + ModelNode childNode = addNodeListChild(view2->rootModelNode(), "QtQuick/Rectangle", 1, 0, "data"); expectedCalls << TestView::MethodCall("nodeCreated", QStringList() << ""); expectedCalls << TestView::MethodCall("nodeReparented", QStringList() << "" << "data" << "" << "PropertiesAdded"); QCOMPARE(view1->methodCalls(), expectedCalls); @@ -2146,7 +2146,7 @@ void tst_TestCore::testModelViewNotification() void tst_TestCore::testRewriterTransaction() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -2156,7 +2156,7 @@ void tst_TestCore::testRewriterTransaction() RewriterTransaction transaction = view->beginRewriterTransaction(); QVERIFY(transaction.isValid()); - ModelNode childNode = addNodeListChild(view->rootModelNode(), "Qt/Rectangle", 4, 7, "data"); + ModelNode childNode = addNodeListChild(view->rootModelNode(), "QtQuick/Rectangle", 1, 0, "data"); QVERIFY(childNode.isValid()); childNode.destroy(); @@ -2166,7 +2166,7 @@ void tst_TestCore::testRewriterTransaction() RewriterTransaction transaction2 = view->beginRewriterTransaction(); QVERIFY(transaction2.isValid()); - ModelNode childNode = addNodeListChild(view->rootModelNode(), "Qt/Rectangle", 4, 7, "data"); + ModelNode childNode = addNodeListChild(view->rootModelNode(), "QtQuick/Rectangle", 1, 0, "data"); QVERIFY(childNode.isValid()); childNode.destroy(); @@ -2193,7 +2193,7 @@ void tst_TestCore::testRewriterTransaction() void tst_TestCore::testRewriterId() { - char qmlString[] = "import Qt 4.7\n" + char qmlString[] = "import QtQuick 1.0\n" "Rectangle {\n" "}\n"; @@ -2201,7 +2201,7 @@ void tst_TestCore::testRewriterId() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -2216,16 +2216,16 @@ void tst_TestCore::testRewriterId() model->attachView(testRewriterView.data()); - QCOMPARE(rootModelNode.type(), QString("Qt/Rectangle")); + QCOMPARE(rootModelNode.type(), QString("QtQuick/Rectangle")); QVERIFY(rootModelNode.isValid()); - ModelNode newNode(view->createModelNode("Qt/Rectangle", 4, 7)); + ModelNode newNode(view->createModelNode("QtQuick/Rectangle", 1, 0)); newNode.setId("testId"); rootModelNode.nodeListProperty("data").reparentHere(newNode); - const QLatin1String expected("import Qt 4.7\n" + const QLatin1String expected("import QtQuick 1.0\n" "Rectangle {\n" "Rectangle {\n" " id: testId\n" @@ -2237,7 +2237,7 @@ void tst_TestCore::testRewriterId() void tst_TestCore::testRewriterNodeReparentingTransaction1() { - char qmlString[] = "import Qt 4.7\n" + char qmlString[] = "import QtQuick 1.0\n" "Rectangle {\n" "}\n"; @@ -2245,7 +2245,7 @@ void tst_TestCore::testRewriterNodeReparentingTransaction1() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -2254,7 +2254,7 @@ void tst_TestCore::testRewriterNodeReparentingTransaction1() ModelNode rootModelNode(view->rootModelNode()); QVERIFY(rootModelNode.isValid()); - QCOMPARE(rootModelNode.type(), QString("Qt/Item")); + QCOMPARE(rootModelNode.type(), QString("QtQuick/Item")); QScopedPointer testRewriterView(new TestRewriterView()); testRewriterView->setTextModifier(&textModifier); @@ -2262,12 +2262,12 @@ void tst_TestCore::testRewriterNodeReparentingTransaction1() QVERIFY(rootModelNode.isValid()); - ModelNode childNode1 = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); - ModelNode childNode2 = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); - ModelNode childNode3 = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); - ModelNode childNode4 = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); + ModelNode childNode1 = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); + ModelNode childNode2 = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); + ModelNode childNode3 = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); + ModelNode childNode4 = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); - ModelNode reparentNode = addNodeListChild(childNode1, "Qt/Rectangle", 4, 7, "data"); + ModelNode reparentNode = addNodeListChild(childNode1, "QtQuick/Rectangle", 1, 0, "data"); RewriterTransaction rewriterTransaction = view->beginRewriterTransaction(); @@ -2282,7 +2282,7 @@ void tst_TestCore::testRewriterNodeReparentingTransaction1() void tst_TestCore::testRewriterNodeReparentingTransaction2() { - char qmlString[] = "import Qt 4.7\n" + char qmlString[] = "import QtQuick 1.0\n" "Rectangle {\n" "}\n"; @@ -2290,7 +2290,7 @@ void tst_TestCore::testRewriterNodeReparentingTransaction2() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -2299,7 +2299,7 @@ void tst_TestCore::testRewriterNodeReparentingTransaction2() ModelNode rootModelNode(view->rootModelNode()); QVERIFY(rootModelNode.isValid()); - QCOMPARE(rootModelNode.type(), QString("Qt/Item")); + QCOMPARE(rootModelNode.type(), QString("QtQuick/Item")); QScopedPointer testRewriterView(new TestRewriterView()); testRewriterView->setTextModifier(&textModifier); @@ -2307,8 +2307,8 @@ void tst_TestCore::testRewriterNodeReparentingTransaction2() QVERIFY(rootModelNode.isValid()); - ModelNode childNode1 = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); - ModelNode childNode2 = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); + ModelNode childNode1 = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); + ModelNode childNode2 = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); childNode2.variantProperty("x") = 200; childNode2.variantProperty("y") = 50; @@ -2348,7 +2348,7 @@ void tst_TestCore::testRewriterNodeReparentingTransaction2() void tst_TestCore::testRewriterNodeReparentingTransaction3() { - char qmlString[] = "import Qt 4.7\n" + char qmlString[] = "import QtQuick 1.0\n" "Rectangle {\n" "}\n"; @@ -2356,7 +2356,7 @@ void tst_TestCore::testRewriterNodeReparentingTransaction3() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -2365,7 +2365,7 @@ void tst_TestCore::testRewriterNodeReparentingTransaction3() ModelNode rootModelNode(view->rootModelNode()); QVERIFY(rootModelNode.isValid()); - QCOMPARE(rootModelNode.type(), QString("Qt/Item")); + QCOMPARE(rootModelNode.type(), QString("QtQuick/Item")); QScopedPointer testRewriterView(new TestRewriterView()); testRewriterView->setTextModifier(&textModifier); @@ -2373,10 +2373,10 @@ void tst_TestCore::testRewriterNodeReparentingTransaction3() QVERIFY(rootModelNode.isValid()); - ModelNode childNode1 = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); - ModelNode childNode2 = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); - ModelNode childNode3 = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); - ModelNode childNode4 = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); + ModelNode childNode1 = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); + ModelNode childNode2 = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); + ModelNode childNode3 = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); + ModelNode childNode4 = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); RewriterTransaction rewriterTransaction = view->beginRewriterTransaction(); @@ -2398,7 +2398,7 @@ void tst_TestCore::testRewriterNodeReparentingTransaction3() void tst_TestCore::testRewriterNodeReparentingTransaction4() { - char qmlString[] = "import Qt 4.7\n" + char qmlString[] = "import QtQuick 1.0\n" "Rectangle {\n" "}\n"; @@ -2406,7 +2406,7 @@ void tst_TestCore::testRewriterNodeReparentingTransaction4() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -2415,7 +2415,7 @@ void tst_TestCore::testRewriterNodeReparentingTransaction4() ModelNode rootModelNode(view->rootModelNode()); QVERIFY(rootModelNode.isValid()); - QCOMPARE(rootModelNode.type(), QString("Qt/Item")); + QCOMPARE(rootModelNode.type(), QString("QtQuick/Item")); QScopedPointer testRewriterView(new TestRewriterView()); testRewriterView->setTextModifier(&textModifier); @@ -2423,11 +2423,11 @@ void tst_TestCore::testRewriterNodeReparentingTransaction4() QVERIFY(rootModelNode.isValid()); - ModelNode childNode1 = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); - ModelNode childNode2 = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); - ModelNode childNode3 = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); - ModelNode childNode4 = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); - ModelNode childNode5 = addNodeListChild(childNode2, "Qt/Rectangle", 4, 7, "data"); + ModelNode childNode1 = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); + ModelNode childNode2 = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); + ModelNode childNode3 = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); + ModelNode childNode4 = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); + ModelNode childNode5 = addNodeListChild(childNode2, "QtQuick/Rectangle", 1, 0, "data"); RewriterTransaction rewriterTransaction = view->beginRewriterTransaction(); @@ -2449,7 +2449,7 @@ void tst_TestCore::testRewriterNodeReparentingTransaction4() void tst_TestCore::testRewriterAddNodeTransaction() { - char qmlString[] = "import Qt 4.7\n" + char qmlString[] = "import QtQuick 1.0\n" "Rectangle {\n" "}\n"; @@ -2457,7 +2457,7 @@ void tst_TestCore::testRewriterAddNodeTransaction() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -2466,7 +2466,7 @@ void tst_TestCore::testRewriterAddNodeTransaction() ModelNode rootModelNode(view->rootModelNode()); QVERIFY(rootModelNode.isValid()); - QCOMPARE(rootModelNode.type(), QString("Qt/Item")); + QCOMPARE(rootModelNode.type(), QString("QtQuick/Item")); QScopedPointer testRewriterView(new TestRewriterView()); testRewriterView->setTextModifier(&textModifier); @@ -2475,11 +2475,11 @@ void tst_TestCore::testRewriterAddNodeTransaction() QVERIFY(rootModelNode.isValid()); - ModelNode childNode = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); + ModelNode childNode = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); RewriterTransaction rewriterTransaction = view->beginRewriterTransaction(); - ModelNode newNode = view->createModelNode("Qt/Rectangle", 4, 7); + ModelNode newNode = view->createModelNode("QtQuick/Rectangle", 1, 0); newNode.variantProperty("x") = 100; newNode.variantProperty("y") = 100; @@ -2491,7 +2491,7 @@ void tst_TestCore::testRewriterAddNodeTransaction() void tst_TestCore::testRewriterComponentId() { - char qmlString[] = "import Qt 4.7\n" + char qmlString[] = "import QtQuick 1.0\n" "Rectangle {\n" " Component {\n" " id: testComponent\n" @@ -2504,7 +2504,7 @@ void tst_TestCore::testRewriterComponentId() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -2517,17 +2517,17 @@ void tst_TestCore::testRewriterComponentId() ModelNode rootModelNode(view->rootModelNode()); QVERIFY(rootModelNode.isValid()); - QCOMPARE(rootModelNode.type(), QString("Qt/Rectangle")); + QCOMPARE(rootModelNode.type(), QString("QtQuick/Rectangle")); ModelNode component(rootModelNode.allDirectSubModelNodes().first()); QVERIFY(component.isValid()); - QCOMPARE(component.type(), QString("Qt/Component")); + QCOMPARE(component.type(), QString("QtQuick/Component")); QCOMPARE(component.id(), QString("testComponent")); } void tst_TestCore::testRewriterTransactionRewriter() { - char qmlString[] = "import Qt 4.7\n" + char qmlString[] = "import QtQuick 1.0\n" "Rectangle {\n" "}\n"; @@ -2535,7 +2535,7 @@ void tst_TestCore::testRewriterTransactionRewriter() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -2544,7 +2544,7 @@ void tst_TestCore::testRewriterTransactionRewriter() ModelNode rootModelNode(view->rootModelNode()); QVERIFY(rootModelNode.isValid()); - QCOMPARE(rootModelNode.type(), QString("Qt/Item")); + QCOMPARE(rootModelNode.type(), QString("QtQuick/Item")); QScopedPointer testRewriterView(new TestRewriterView()); testRewriterView->setTextModifier(&textModifier); @@ -2557,7 +2557,7 @@ void tst_TestCore::testRewriterTransactionRewriter() { RewriterTransaction transaction = view->beginRewriterTransaction(); - childNode1 = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); + childNode1 = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); childNode1.variantProperty("x") = 10; childNode1.variantProperty("y") = 10; } @@ -2569,7 +2569,7 @@ void tst_TestCore::testRewriterTransactionRewriter() { RewriterTransaction transaction = view->beginRewriterTransaction(); - childNode2 = addNodeListChild(childNode1, "Qt/Rectangle", 4, 7, "data"); + childNode2 = addNodeListChild(childNode1, "QtQuick/Rectangle", 1, 0, "data"); childNode2.destroy(); } @@ -2594,7 +2594,7 @@ void tst_TestCore::testRewriterPropertyDeclarations() // property variant myArray: [ Rectangle {} ] // property variant someGradient: Gradient {} - char qmlString[] = "import Qt 4.7\n" + char qmlString[] = "import QtQuick 1.0\n" "Item {\n" " property int intProperty\n" " property bool boolProperty: true\n" @@ -2607,7 +2607,7 @@ void tst_TestCore::testRewriterPropertyDeclarations() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -2625,7 +2625,7 @@ void tst_TestCore::testRewriterPropertyDeclarations() // ModelNode rootModelNode(view->rootModelNode()); QVERIFY(rootModelNode.isValid()); - QCOMPARE(rootModelNode.type(), QString("Qt/Item")); + QCOMPARE(rootModelNode.type(), QString("QtQuick/Item")); QCOMPARE(rootModelNode.properties().size(), 4); @@ -2658,7 +2658,7 @@ void tst_TestCore::testRewriterPropertyAliases() // where type is (int | bool | double | real | string | url | color | date | variant) // - char qmlString[] = "import Qt 4.7\n" + char qmlString[] = "import QtQuick 1.0\n" "Item {\n" " property alias theText: t.text\n" " default alias property yPos: t.y\n" @@ -2669,7 +2669,7 @@ void tst_TestCore::testRewriterPropertyAliases() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -2682,7 +2682,7 @@ void tst_TestCore::testRewriterPropertyAliases() ModelNode rootModelNode(view->rootModelNode()); QVERIFY(rootModelNode.isValid()); - QCOMPARE(rootModelNode.type(), QString("Qt/Item")); + QCOMPARE(rootModelNode.type(), QString("QtQuick/Item")); QList properties = rootModelNode.properties(); QCOMPARE(properties.size(), 0); // TODO: How to represent alias properties? As Bindings? @@ -2691,7 +2691,7 @@ void tst_TestCore::testRewriterPropertyAliases() void tst_TestCore::testRewriterPositionAndOffset() { const QLatin1String qmlString("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " id: root\n" @@ -2729,7 +2729,7 @@ void tst_TestCore::testRewriterPositionAndOffset() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -2742,7 +2742,7 @@ void tst_TestCore::testRewriterPositionAndOffset() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QLatin1String("Qt/Rectangle")); + QCOMPARE(rootNode.type(), QLatin1String("QtQuick/Rectangle")); QString string = QString(qmlString).mid(testRewriterView->nodeOffset(rootNode), testRewriterView->nodeLength(rootNode)); const QString qmlExpected0("Rectangle {\n" @@ -2808,7 +2808,7 @@ void tst_TestCore::testRewriterPositionAndOffset() void tst_TestCore::testRewriterComponentTextModifier() { - const QString qmlString("import Qt 4.7\n" + const QString qmlString("import QtQuick 1.0\n" "Rectangle {\n" " id: root\n" " x: 10;\n" @@ -2831,7 +2831,7 @@ void tst_TestCore::testRewriterComponentTextModifier() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -2844,7 +2844,7 @@ void tst_TestCore::testRewriterComponentTextModifier() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QLatin1String("Qt/Rectangle")); + QCOMPARE(rootNode.type(), QLatin1String("QtQuick/Rectangle")); ModelNode componentNode = rootNode.allDirectSubModelNodes().last(); @@ -2855,7 +2855,7 @@ void tst_TestCore::testRewriterComponentTextModifier() ComponentTextModifier componentTextModifier(&textModifier, componentStartOffset, componentEndOffset, rootStartOffset); - const QString qmlExpected("import Qt 4.7\n" + const QString qmlExpected("import QtQuick 1.0\n" " " " " " " @@ -2876,19 +2876,19 @@ void tst_TestCore::testRewriterComponentTextModifier() QCOMPARE(componentTextModifier.text(), qmlExpected); - QScopedPointer componentModel(Model::create("Qt/Item", 4, 7)); + QScopedPointer componentModel(Model::create("QtQuick/Item", 1, 0)); QScopedPointer testRewriterViewComponent(new TestRewriterView()); testRewriterViewComponent->setTextModifier(&componentTextModifier); componentModel->attachView(testRewriterViewComponent.data()); ModelNode componentrootNode = testRewriterViewComponent->rootModelNode(); QVERIFY(componentrootNode.isValid()); - QCOMPARE(componentrootNode.type(), QLatin1String("Qt/Component")); + QCOMPARE(componentrootNode.type(), QLatin1String("QtQuick/Component")); } void tst_TestCore::testRewriterPreserveType() { - const QString qmlString("import Qt 4.7\n" + const QString qmlString("import QtQuick 1.0\n" "Rectangle {\n" " id: root\n" " Text {\n" @@ -2901,7 +2901,7 @@ void tst_TestCore::testRewriterPreserveType() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -2914,7 +2914,7 @@ void tst_TestCore::testRewriterPreserveType() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QLatin1String("Qt/Rectangle")); + QCOMPARE(rootNode.type(), QLatin1String("QtQuick/Rectangle")); ModelNode textNode = rootNode.allDirectSubModelNodes().first(); QCOMPARE(QVariant::Bool, textNode.variantProperty("font.bold").value().type()); @@ -2923,7 +2923,7 @@ void tst_TestCore::testRewriterPreserveType() textNode.variantProperty("font.bold") = QVariant(true); textNode.variantProperty("font.pointSize") = QVariant(13.0); - ModelNode newTextNode = addNodeListChild(rootNode, "Qt/Text", 4, 7, "data"); + ModelNode newTextNode = addNodeListChild(rootNode, "QtQuick/Text", 1, 0, "data"); newTextNode.variantProperty("font.bold") = QVariant(true); newTextNode.variantProperty("font.pointSize") = QVariant(13.0); @@ -2935,7 +2935,7 @@ void tst_TestCore::testRewriterPreserveType() void tst_TestCore::testRewriterForArrayMagic() { try { - const QLatin1String qmlString("import Qt 4.7\n" + const QLatin1String qmlString("import QtQuick 1.0\n" "\n" "Rectangle {\n" " states: State {\n" @@ -2946,7 +2946,7 @@ void tst_TestCore::testRewriterForArrayMagic() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -2959,16 +2959,16 @@ void tst_TestCore::testRewriterForArrayMagic() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QString("Qt/Rectangle")); + QCOMPARE(rootNode.type(), QString("QtQuick/Rectangle")); QVERIFY(rootNode.property(QLatin1String("states")).isNodeListProperty()); QmlItemNode rootItem(rootNode); QVERIFY(rootItem.isValid()); QmlModelState state1(rootItem.states().addState("s2")); - QCOMPARE(state1.modelNode().type(), QString("Qt/State")); + QCOMPARE(state1.modelNode().type(), QString("QtQuick/State")); - const QLatin1String expected("import Qt 4.7\n" + const QLatin1String expected("import QtQuick 1.0\n" "\n" "Rectangle {\n" " states: [\n" @@ -2989,7 +2989,7 @@ void tst_TestCore::testRewriterForArrayMagic() void tst_TestCore::testRewriterWithSignals() { - const QLatin1String qmlString("import Qt 4.7\n" + const QLatin1String qmlString("import QtQuick 1.0\n" "\n" "TextEdit {\n" " onTextChanged: { print(\"foo\"); }\n" @@ -2998,7 +2998,7 @@ void tst_TestCore::testRewriterWithSignals() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -3011,7 +3011,7 @@ void tst_TestCore::testRewriterWithSignals() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QString("Qt/TextEdit")); + QCOMPARE(rootNode.type(), QString("QtQuick/TextEdit")); QmlItemNode rootItem(rootNode); QVERIFY(rootItem.isValid()); @@ -3021,7 +3021,7 @@ void tst_TestCore::testRewriterWithSignals() void tst_TestCore::testRewriterNodeSliding() { - const QLatin1String qmlString("import Qt 4.7\n" + const QLatin1String qmlString("import QtQuick 1.0\n" "Rectangle {\n" " id: root\n" " Rectangle {\n" @@ -3041,7 +3041,7 @@ void tst_TestCore::testRewriterNodeSliding() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -3054,7 +3054,7 @@ void tst_TestCore::testRewriterNodeSliding() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QLatin1String("Qt/Rectangle")); + QCOMPARE(rootNode.type(), QLatin1String("QtQuick/Rectangle")); QCOMPARE(rootNode.id(), QLatin1String("root")); QCOMPARE(rootNode.nodeListProperty(QLatin1String("data")).toModelNodeList().at(0).id(), QLatin1String("rectangle1")); @@ -3073,7 +3073,7 @@ void tst_TestCore::testRewriterNodeSliding() void tst_TestCore::testRewriterExceptionHandling() { - const QLatin1String qmlString("import Qt 4.7\n" + const QLatin1String qmlString("import QtQuick 1.0\n" "Text {\n" "}"); @@ -3081,7 +3081,7 @@ void tst_TestCore::testRewriterExceptionHandling() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Text", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Text", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -3094,7 +3094,7 @@ void tst_TestCore::testRewriterExceptionHandling() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QLatin1String("Qt/Text")); + QCOMPARE(rootNode.type(), QLatin1String("QtQuick/Text")); try { @@ -3105,7 +3105,7 @@ void tst_TestCore::testRewriterExceptionHandling() QFAIL("RewritingException should be thrown"); } catch (RewritingException &e) { QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QLatin1String("Qt/Text")); + QCOMPARE(rootNode.type(), QLatin1String("QtQuick/Text")); QVERIFY(!rootNode.hasProperty("bla")); QVERIFY(!rootNode.hasProperty("text")); } @@ -3113,7 +3113,7 @@ void tst_TestCore::testRewriterExceptionHandling() void tst_TestCore::testRewriterFirstDefinitionInside() { - const QString qmlString("import Qt 4.7\n" + const QString qmlString("import QtQuick 1.0\n" "Rectangle {\n" " id: root\n" " x: 10;\n" @@ -3137,7 +3137,7 @@ void tst_TestCore::testRewriterFirstDefinitionInside() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -3150,7 +3150,7 @@ void tst_TestCore::testRewriterFirstDefinitionInside() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QLatin1String("Qt/Rectangle")); + QCOMPARE(rootNode.type(), QLatin1String("QtQuick/Rectangle")); ModelNode componentNode = rootNode.allDirectSubModelNodes().last(); @@ -3169,7 +3169,7 @@ void tst_TestCore::testRewriterFirstDefinitionInside() void tst_TestCore::testCopyModelRewriter1() { const QLatin1String qmlString("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " id: root\n" @@ -3207,7 +3207,7 @@ void tst_TestCore::testCopyModelRewriter1() textEdit1.setPlainText(qmlString); NotIndentingTextEditModifier textModifier1(&textEdit1); - QScopedPointer model1(Model::create("Qt/Item", 4, 7)); + QScopedPointer model1(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model1.data()); QScopedPointer view1(new TestView(model1.data())); @@ -3220,13 +3220,13 @@ void tst_TestCore::testCopyModelRewriter1() ModelNode rootNode1 = view1->rootModelNode(); QVERIFY(rootNode1.isValid()); - QCOMPARE(rootNode1.type(), QLatin1String("Qt/Rectangle")); + QCOMPARE(rootNode1.type(), QLatin1String("QtQuick/Rectangle")); QPlainTextEdit textEdit2; textEdit2.setPlainText(qmlString); NotIndentingTextEditModifier textModifier2(&textEdit2); - QScopedPointer model2(Model::create("Qt/Item", 4, 7)); + QScopedPointer model2(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model2.data()); QScopedPointer view2(new TestView(model2.data())); @@ -3239,7 +3239,7 @@ void tst_TestCore::testCopyModelRewriter1() ModelNode rootNode2 = view2->rootModelNode(); QVERIFY(rootNode2.isValid()); - QCOMPARE(rootNode2.type(), QLatin1String("Qt/Rectangle")); + QCOMPARE(rootNode2.type(), QLatin1String("QtQuick/Rectangle")); // @@ -3264,7 +3264,7 @@ void tst_TestCore::testCopyModelRewriter1() const QLatin1String expected( "\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " id: root\n" @@ -3339,7 +3339,7 @@ void tst_TestCore::testCopyModelRewriter1() void tst_TestCore::testCopyModelRewriter2() { const QLatin1String qmlString1("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" "id: root\n" @@ -3379,7 +3379,7 @@ void tst_TestCore::testCopyModelRewriter2() const QLatin1String qmlString2("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" "}"); @@ -3388,7 +3388,7 @@ void tst_TestCore::testCopyModelRewriter2() textEdit1.setPlainText(qmlString1); NotIndentingTextEditModifier textModifier1(&textEdit1); - QScopedPointer model1(Model::create("Qt/Item", 4, 7)); + QScopedPointer model1(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model1.data()); QScopedPointer view1(new TestView(model1.data())); @@ -3401,7 +3401,7 @@ void tst_TestCore::testCopyModelRewriter2() ModelNode rootNode1 = view1->rootModelNode(); QVERIFY(rootNode1.isValid()); - QCOMPARE(rootNode1.type(), QLatin1String("Qt/Rectangle")); + QCOMPARE(rootNode1.type(), QLatin1String("QtQuick/Rectangle")); // read in 2 @@ -3410,7 +3410,7 @@ void tst_TestCore::testCopyModelRewriter2() textEdit2.setPlainText(qmlString2); NotIndentingTextEditModifier textModifier2(&textEdit2); - QScopedPointer model2(Model::create("Qt/Item", 4, 7)); + QScopedPointer model2(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model2.data()); QScopedPointer view2(new TestView(model2.data())); @@ -3422,7 +3422,7 @@ void tst_TestCore::testCopyModelRewriter2() ModelNode rootNode2 = view2->rootModelNode(); QVERIFY(rootNode2.isValid()); - QCOMPARE(rootNode2.type(), QLatin1String("Qt/Rectangle")); + QCOMPARE(rootNode2.type(), QLatin1String("QtQuick/Rectangle")); // @@ -3431,7 +3431,7 @@ void tst_TestCore::testCopyModelRewriter2() merger.replaceModel(rootNode1); QVERIFY(rootNode2.isValid()); - QCOMPARE(rootNode2.type(), QLatin1String("Qt/Rectangle")); + QCOMPARE(rootNode2.type(), QLatin1String("QtQuick/Rectangle")); QCOMPARE(textEdit2.toPlainText(), qmlString1); } @@ -3446,7 +3446,7 @@ void tst_TestCore::testSubComponentManager() textEdit.setPlainText(file.readAll()); NotIndentingTextEditModifier modifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); model->setFileUrl(QUrl::fromLocalFile(fileName)); QScopedPointer subComponentManager(new SubComponentManager(model->metaInfo(), 0)); subComponentManager->update(QUrl::fromLocalFile(fileName), modifier.text().toUtf8()); @@ -3460,9 +3460,9 @@ void tst_TestCore::testSubComponentManager() QVERIFY(testRewriterView->rootModelNode().isValid()); - QVERIFY(model->metaInfo().nodeMetaInfo("Qt/Rectangle").properties(true).keys().contains("border.width")); + QVERIFY(model->metaInfo().nodeMetaInfo("QtQuick/Rectangle").properties(true).keys().contains("border.width")); - QVERIFY(model->metaInfo().hasNodeMetaInfo("Qt/Pen")); + QVERIFY(model->metaInfo().hasNodeMetaInfo("QtQuick/Pen")); NodeMetaInfo myButtonMetaInfo = model->metaInfo().nodeMetaInfo("MyButton"); QVERIFY(myButtonMetaInfo.isValid()); QVERIFY(myButtonMetaInfo.properties(true).keys().contains("border.width")); @@ -3471,7 +3471,7 @@ void tst_TestCore::testSubComponentManager() void tst_TestCore::testAnchorsAndRewriting() { - const QString qmlString("import Qt 4.7\n" + const QString qmlString("import QtQuick 1.0\n" "Rectangle {\n" " id: root\n" " x: 10;\n" @@ -3494,7 +3494,7 @@ void tst_TestCore::testAnchorsAndRewriting() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -3507,7 +3507,7 @@ void tst_TestCore::testAnchorsAndRewriting() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QLatin1String("Qt/Rectangle")); + QCOMPARE(rootNode.type(), QLatin1String("QtQuick/Rectangle")); QmlItemNode rootItemNode = view->rootQmlItemNode(); QVERIFY(rootItemNode.isValid()); @@ -3532,7 +3532,7 @@ void tst_TestCore::testAnchorsAndRewriting() void tst_TestCore::testAnchorsAndRewritingCenter() { - const QString qmlString("import Qt 4.7\n" + const QString qmlString("import QtQuick 1.0\n" "Rectangle {\n" " id: root\n" " x: 10;\n" @@ -3555,7 +3555,7 @@ void tst_TestCore::testAnchorsAndRewritingCenter() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -3568,7 +3568,7 @@ void tst_TestCore::testAnchorsAndRewritingCenter() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QLatin1String("Qt/Rectangle")); + QCOMPARE(rootNode.type(), QLatin1String("QtQuick/Rectangle")); QmlItemNode rootItemNode = view->rootQmlItemNode(); QVERIFY(rootItemNode.isValid()); @@ -3582,7 +3582,7 @@ void tst_TestCore::testAnchorsAndRewritingCenter() void tst_TestCore::loadQml() { -char qmlString[] = "import Qt 4.7\n" +char qmlString[] = "import QtQuick 1.0\n" "Rectangle {\n" "id: root;\n" "width: 200;\n" @@ -3623,7 +3623,7 @@ char qmlString[] = "import Qt 4.7\n" textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -3632,14 +3632,14 @@ char qmlString[] = "import Qt 4.7\n" ModelNode rootModelNode(view->rootModelNode()); QVERIFY(rootModelNode.isValid()); - QCOMPARE(rootModelNode.type(), QString("Qt/Item")); + QCOMPARE(rootModelNode.type(), QString("QtQuick/Item")); QScopedPointer testRewriterView(new TestRewriterView()); testRewriterView->setTextModifier(&textModifier); model->attachView(testRewriterView.data()); QVERIFY(rootModelNode.isValid()); - QCOMPARE(rootModelNode.type(), QString("Qt/Rectangle")); + QCOMPARE(rootModelNode.type(), QString("QtQuick/Rectangle")); QCOMPARE(rootModelNode.id(), QString("root")); QCOMPARE(rootModelNode.variantProperty("width").value().toInt(), 200); QCOMPARE(rootModelNode.variantProperty("height").value().toInt(), 200); @@ -3649,7 +3649,7 @@ char qmlString[] = "import Qt 4.7\n" QCOMPARE(rootModelNode.nodeListProperty("data").toModelNodeList().count(), 3); ModelNode textNode1 = rootModelNode.nodeListProperty("data").toModelNodeList().first(); QVERIFY(textNode1.isValid()); - QCOMPARE(textNode1.type(), QString("Qt/Text")); + QCOMPARE(textNode1.type(), QString("QtQuick/Text")); QCOMPARE(textNode1.id(), QString("text1")); QCOMPARE(textNode1.variantProperty("text").value().toString(), QString("Hello World")); QVERIFY(textNode1.hasProperty("anchors.centerIn")); @@ -3665,13 +3665,13 @@ char qmlString[] = "import Qt 4.7\n" ModelNode rectNode = rootModelNode.nodeListProperty("data").toModelNodeList().at(1); QVERIFY(rectNode.isValid()); - QCOMPARE(rectNode.type(), QString("Qt/Rectangle")); + QCOMPARE(rectNode.type(), QString("QtQuick/Rectangle")); QCOMPARE(rectNode.id(), QString("rectangle")); QVERIFY(rectNode.hasProperty("gradient")); QVERIFY(rectNode.property("gradient").isNodeProperty()); ModelNode gradientNode = rectNode.nodeProperty("gradient").modelNode(); QVERIFY(gradientNode.isValid()); - QCOMPARE(gradientNode.type(), QString("Qt/Gradient")); + QCOMPARE(gradientNode.type(), QString("QtQuick/Gradient")); QVERIFY(gradientNode.hasProperty("stops")); QVERIFY(gradientNode.property("stops").isNodeListProperty()); QCOMPARE(gradientNode.nodeListProperty("stops").toModelNodeList().count(), 2); @@ -3682,15 +3682,15 @@ char qmlString[] = "import Qt 4.7\n" QVERIFY(stop1.isValid()); QVERIFY(stop2.isValid()); - QCOMPARE(stop1.type(), QString("Qt/GradientStop")); - QCOMPARE(stop2.type(), QString("Qt/GradientStop")); + QCOMPARE(stop1.type(), QString("QtQuick/GradientStop")); + QCOMPARE(stop2.type(), QString("QtQuick/GradientStop")); QCOMPARE(stop1.variantProperty("position").value().toInt(), 0); QCOMPARE(stop2.variantProperty("position").value().toInt(), 1); ModelNode textNode2 = rootModelNode.nodeListProperty("data").toModelNodeList().last(); QVERIFY(textNode2.isValid()); - QCOMPARE(textNode2.type(), QString("Qt/Text")); + QCOMPARE(textNode2.type(), QString("QtQuick/Text")); QCOMPARE(textNode2.id(), QString("text2")); QCOMPARE(textNode2.variantProperty("width").value().toInt(), 80); QCOMPARE(textNode2.variantProperty("height").value().toInt(), 20); @@ -3701,17 +3701,17 @@ char qmlString[] = "import Qt 4.7\n" void tst_TestCore::testMetaInfo() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); // test whether default type is registered - QVERIFY(model->metaInfo().hasNodeMetaInfo("Qt/Item", 4, 7)); + QVERIFY(model->metaInfo().hasNodeMetaInfo("QtQuick/Item", 1, 0)); // test whether types from plugins are registered QVERIFY(model->metaInfo().hasNodeMetaInfo("QtWebKit/WebView", 1, 0)); // test whether non-qml type is registered - QVERIFY(model->metaInfo().hasNodeMetaInfo("QGraphicsObject", 4, 7)); // Qt 4.7 namespace + QVERIFY(model->metaInfo().hasNodeMetaInfo("QGraphicsObject", 1, 0)); // Qt 4.7 namespace QVERIFY(model->metaInfo().hasNodeMetaInfo("QGraphicsObject", 1, 0)); // webkit 1.0 namespace } @@ -3723,20 +3723,20 @@ void tst_TestCore::testMetaInfoSimpleType() // qmlRegisterType("Qt",4,7,"Item") // - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); - QVERIFY(model->metaInfo().hasNodeMetaInfo("Qt/Item", 4, 7)); - QVERIFY(model->metaInfo().hasNodeMetaInfo("Qt/Item", 4, 7)); + QVERIFY(model->metaInfo().hasNodeMetaInfo("QtQuick/Item", 1, 0)); + QVERIFY(model->metaInfo().hasNodeMetaInfo("QtQuick/Item", 1, 0)); - NodeMetaInfo itemMetaInfo = model->metaInfo().nodeMetaInfo("Qt/Item", 4, 7); - NodeMetaInfo itemMetaInfo2 = model->metaInfo().nodeMetaInfo("Qt/Item", 4, 7); + NodeMetaInfo itemMetaInfo = model->metaInfo().nodeMetaInfo("QtQuick/Item", 1, 0); + NodeMetaInfo itemMetaInfo2 = model->metaInfo().nodeMetaInfo("QtQuick/Item", 1, 0); QCOMPARE(itemMetaInfo, itemMetaInfo2); QVERIFY(itemMetaInfo.isValid()); - QCOMPARE(itemMetaInfo.typeName(), QLatin1String("Qt/Item")); - QCOMPARE(itemMetaInfo.majorVersion(), 4); - QCOMPARE(itemMetaInfo.minorVersion(), 7); + QCOMPARE(itemMetaInfo.typeName(), QLatin1String("QtQuick/Item")); + QCOMPARE(itemMetaInfo.majorVersion(), 1); + QCOMPARE(itemMetaInfo.minorVersion(), 0); // super classes NodeMetaInfo graphicsObjectInfo = itemMetaInfo.directSuperClass(); @@ -3745,17 +3745,15 @@ void tst_TestCore::testMetaInfoSimpleType() QCOMPARE(graphicsObjectInfo.majorVersion(), -1); QCOMPARE(graphicsObjectInfo.minorVersion(), -1); - QCOMPARE(itemMetaInfo.superClasses().size(), 2); // QGraphicsObject, Qt/QtObject - QVERIFY(itemMetaInfo.isSubclassOf("QGraphicsObject", 4, 7)); - QVERIFY(itemMetaInfo.isSubclassOf("Qt/QtObject", 4, 7)); + QCOMPARE(itemMetaInfo.superClasses().size(), 2); // QGraphicsObject, QtQuick/QtObject + QVERIFY(itemMetaInfo.isSubclassOf("QGraphicsObject", 1, 0)); + QVERIFY(itemMetaInfo.isSubclassOf("QtQuick/QtObject", 1, 0)); // availableInVersion - QVERIFY(itemMetaInfo.availableInVersion(4, 7)); - QVERIFY(itemMetaInfo.availableInVersion(4, 8)); - QVERIFY(itemMetaInfo.availableInVersion(5, 0)); + QVERIFY(itemMetaInfo.availableInVersion(1, 0)); QVERIFY(itemMetaInfo.availableInVersion(-1, -1)); - QVERIFY(!itemMetaInfo.availableInVersion(4, 6)); - QVERIFY(!itemMetaInfo.availableInVersion(3, 7)); + QVERIFY(!itemMetaInfo.availableInVersion(0, 8)); + QVERIFY(!itemMetaInfo.availableInVersion(0, 9)); } void tst_TestCore::testMetaInfoUncreatableType() @@ -3765,23 +3763,23 @@ void tst_TestCore::testMetaInfoUncreatableType() // qmlRegisterUncreatableType("Qt",4,7,"Animation",QDeclarativeAbstractAnimation::tr("Animation is an abstract class")); // - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); - QVERIFY(model->metaInfo().hasNodeMetaInfo("Qt/Animation")); - NodeMetaInfo animationTypeInfo = model->metaInfo().nodeMetaInfo("Qt/Animation", 4, 7); + QVERIFY(model->metaInfo().hasNodeMetaInfo("QtQuick/Animation")); + NodeMetaInfo animationTypeInfo = model->metaInfo().nodeMetaInfo("QtQuick/Animation", 1, 0); QVERIFY(animationTypeInfo.isValid()); QVERIFY(animationTypeInfo.isValid()); - QCOMPARE(animationTypeInfo.typeName(), QLatin1String("Qt/Animation")); - QCOMPARE(animationTypeInfo.majorVersion(), 4); - QCOMPARE(animationTypeInfo.minorVersion(), 7); + QCOMPARE(animationTypeInfo.typeName(), QLatin1String("QtQuick/Animation")); + QCOMPARE(animationTypeInfo.majorVersion(), 1); + QCOMPARE(animationTypeInfo.minorVersion(), 0); NodeMetaInfo qObjectTypeInfo = animationTypeInfo.directSuperClass(); QVERIFY(qObjectTypeInfo.isValid()); - QCOMPARE(qObjectTypeInfo.typeName(), QLatin1String("Qt/QtObject")); - QCOMPARE(qObjectTypeInfo.majorVersion(), 4); - QCOMPARE(qObjectTypeInfo.minorVersion(), 7); + QCOMPARE(qObjectTypeInfo.typeName(), QLatin1String("QtQuick/QtObject")); + QCOMPARE(qObjectTypeInfo.majorVersion(), 1); + QCOMPARE(qObjectTypeInfo.minorVersion(), 0); QCOMPARE(animationTypeInfo.superClasses().size(), 1); } @@ -3792,11 +3790,11 @@ void tst_TestCore::testMetaInfoExtendedType() // qmlRegisterExtendedType("Qt",4,7,"QGraphicsWidget"); // - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); - QVERIFY(model->metaInfo().hasNodeMetaInfo("Qt/QGraphicsWidget")); - NodeMetaInfo graphicsWidgetTypeInfo = model->metaInfo().nodeMetaInfo("Qt/QGraphicsWidget", 4, 7); + QVERIFY(model->metaInfo().hasNodeMetaInfo("QtQuick/QGraphicsWidget")); + NodeMetaInfo graphicsWidgetTypeInfo = model->metaInfo().nodeMetaInfo("QtQuick/QGraphicsWidget", 1, 0); QVERIFY(graphicsWidgetTypeInfo.isValid()); QVERIFY(graphicsWidgetTypeInfo.hasProperty("layout")); // from QGraphicsWidgetDeclarativeUI QVERIFY(graphicsWidgetTypeInfo.hasProperty("font")); // from QGraphicsWidget @@ -3822,13 +3820,13 @@ void tst_TestCore::testMetaInfoCustomType() { // Test type registered with qmlRegisterCustomType: // - // qmlRegisterCustomType("Qt", 4, 7, "PropertyChanges", new QDeclarativePropertyChangesParser); + // qmlRegisterCustomType("Qt", 1, 0, "PropertyChanges", new QDeclarativePropertyChangesParser); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); - QVERIFY(model->metaInfo().hasNodeMetaInfo("Qt/PropertyChanges")); - NodeMetaInfo propertyChangesInfo = model->metaInfo().nodeMetaInfo("Qt/PropertyChanges", 4, 7); + QVERIFY(model->metaInfo().hasNodeMetaInfo("QtQuick/PropertyChanges")); + NodeMetaInfo propertyChangesInfo = model->metaInfo().nodeMetaInfo("QtQuick/PropertyChanges", 1, 0); QVERIFY(propertyChangesInfo.isValid()); QVERIFY(propertyChangesInfo.hasProperty("target")); // from QDeclarativePropertyChanges QVERIFY(propertyChangesInfo.hasProperty("restoreEntryValues")); // from QDeclarativePropertyChanges @@ -3847,14 +3845,14 @@ void tst_TestCore::testMetaInfoCustomType() void tst_TestCore::testMetaInfoEnums() { - QScopedPointer model(Model::create("Qt/Text")); + QScopedPointer model(Model::create("QtQuick/Text")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); QVERIFY(view.data()); model->attachView(view.data()); - QCOMPARE(view->rootModelNode().metaInfo().typeName(), QString("Qt/Text")); + QCOMPARE(view->rootModelNode().metaInfo().typeName(), QString("QtQuick/Text")); QVERIFY(view->rootModelNode().metaInfo().hasProperty("transformOrigin")); @@ -3871,14 +3869,14 @@ void tst_TestCore::testMetaInfoEnums() void tst_TestCore::testMetaInfoProperties() { - QScopedPointer model(Model::create("Qt/Text")); + QScopedPointer model(Model::create("QtQuick/Text")); QVERIFY(model.data()); - NodeMetaInfo textNodeMetaInfo = model->metaInfo().nodeMetaInfo("Qt/TextEdit", 4, 7); + NodeMetaInfo textNodeMetaInfo = model->metaInfo().nodeMetaInfo("QtQuick/TextEdit", 1, 0); QVERIFY(textNodeMetaInfo.hasProperty("text")); // QDeclarativeTextEdit QVERIFY(textNodeMetaInfo.hasProperty("parent")); // QDeclarativeItem QVERIFY(textNodeMetaInfo.hasProperty("x")); // QGraphicsObject - QVERIFY(textNodeMetaInfo.hasProperty("objectName")); // Qt/QObject + QVERIFY(textNodeMetaInfo.hasProperty("objectName")); // QtQuick/QObject QVERIFY(!textNodeMetaInfo.hasProperty("bla")); QVERIFY(textNodeMetaInfo.property("text").isValid()); @@ -3891,18 +3889,18 @@ void tst_TestCore::testMetaInfoProperties() void tst_TestCore::testMetaInfoDotProperties() { - QScopedPointer model(Model::create("Qt/Text")); + QScopedPointer model(Model::create("QtQuick/Text")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); QVERIFY(view.data()); model->attachView(view.data()); - QVERIFY(model->metaInfo().hasNodeMetaInfo("Qt/Text")); + QVERIFY(model->metaInfo().hasNodeMetaInfo("QtQuick/Text")); - QVERIFY(model->metaInfo().hasNodeMetaInfo("Qt/Pen")); + QVERIFY(model->metaInfo().hasNodeMetaInfo("QtQuick/Pen")); - QCOMPARE(view->rootModelNode().metaInfo().typeName(), QString("Qt/Text")); + QCOMPARE(view->rootModelNode().metaInfo().typeName(), QString("QtQuick/Text")); QVERIFY(!view->rootModelNode().metaInfo().property("text").isValueType()); QVERIFY(view->rootModelNode().metaInfo().hasProperty("font")); QVERIFY(view->rootModelNode().metaInfo().property("font").isValueType()); @@ -3914,7 +3912,7 @@ void tst_TestCore::testMetaInfoDotProperties() QVERIFY(view->rootModelNode().metaInfo().hasProperty("font.pointSize", true)); QVERIFY(view->rootModelNode().metaInfo().property("font.pointSize", true).isValid()); - ModelNode rectNode(addNodeListChild(view->rootModelNode(), "Qt/Rectangle", 4, 7, "data")); + ModelNode rectNode(addNodeListChild(view->rootModelNode(), "QtQuick/Rectangle", 1, 0, "data")); QVERIFY(rectNode.metaInfo().properties(true).keys().contains("pos.x")); @@ -3933,15 +3931,15 @@ void tst_TestCore::testMetaInfoDotProperties() void tst_TestCore::testMetaInfoListProperties() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); QVERIFY(view.data()); model->attachView(view.data()); - QVERIFY(model->metaInfo().hasNodeMetaInfo("Qt/Item")); - QCOMPARE(view->rootModelNode().metaInfo().typeName(), QString("Qt/Item")); + QVERIFY(model->metaInfo().hasNodeMetaInfo("QtQuick/Item")); + QCOMPARE(view->rootModelNode().metaInfo().typeName(), QString("QtQuick/Item")); QVERIFY(view->rootModelNode().metaInfo().hasProperty("states")); QVERIFY(view->rootModelNode().metaInfo().property("states").isListProperty()); @@ -3965,10 +3963,10 @@ void tst_TestCore::testMetaInfoListProperties() void tst_TestCore::testStatesRewriter() { QPlainTextEdit textEdit; - textEdit.setPlainText("import Qt 4.7; Item {}\n"); + textEdit.setPlainText("import QtQuick 1.0; Item {}\n"); NotIndentingTextEditModifier modifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); QVERIFY(view.data()); @@ -4012,10 +4010,10 @@ void tst_TestCore::testStatesRewriter() void tst_TestCore::testGradientsRewriter() { QPlainTextEdit textEdit; - textEdit.setPlainText("\nimport Qt 4.7\n\nItem {\n}\n"); + textEdit.setPlainText("\nimport QtQuick 1.0\n\nItem {\n}\n"); NotIndentingTextEditModifier modifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); QVERIFY(view.data()); @@ -4031,9 +4029,9 @@ void tst_TestCore::testGradientsRewriter() QVERIFY(rootModelNode.isValid()); - ModelNode rectNode(addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data")); + ModelNode rectNode(addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data")); - const QLatin1String expected1("\nimport Qt 4.7\n" + const QLatin1String expected1("\nimport QtQuick 1.0\n" "\n" "Item {\n" "Rectangle {\n" @@ -4041,11 +4039,11 @@ void tst_TestCore::testGradientsRewriter() "}\n"); QCOMPARE(textEdit.toPlainText(), expected1); - ModelNode gradientNode(addNodeChild(rectNode, "Qt/Gradient", 4, 7, "gradient")); + ModelNode gradientNode(addNodeChild(rectNode, "QtQuick/Gradient", 1, 0, "gradient")); QVERIFY(rectNode.hasNodeProperty("gradient")); - const QLatin1String expected2("\nimport Qt 4.7\n" + const QLatin1String expected2("\nimport QtQuick 1.0\n" "\n" "Item {\n" "Rectangle {\n" @@ -4062,11 +4060,11 @@ void tst_TestCore::testGradientsRewriter() propertyList.append(qMakePair(QString("position"), QVariant::fromValue(0))); propertyList.append(qMakePair(QString("color"), QVariant::fromValue(QColor(Qt::red)))); - ModelNode gradientStop1(gradientNode.view()->createModelNode("Qt/GradientStop", 4, 7, propertyList)); + ModelNode gradientStop1(gradientNode.view()->createModelNode("QtQuick/GradientStop", 1, 0, propertyList)); QVERIFY(gradientStop1.isValid()); stops.reparentHere(gradientStop1); - const QLatin1String expected3("\nimport Qt 4.7\n" + const QLatin1String expected3("\nimport QtQuick 1.0\n" "\n" "Item {\n" "Rectangle {\n" @@ -4085,11 +4083,11 @@ void tst_TestCore::testGradientsRewriter() propertyList.append(qMakePair(QString("position"), QVariant::fromValue(0.5))); propertyList.append(qMakePair(QString("color"), QVariant::fromValue(QColor(Qt::blue)))); - ModelNode gradientStop2(gradientNode.view()->createModelNode("Qt/GradientStop", 4, 7, propertyList)); + ModelNode gradientStop2(gradientNode.view()->createModelNode("QtQuick/GradientStop", 1, 0, propertyList)); QVERIFY(gradientStop2.isValid()); stops.reparentHere(gradientStop2); - const QLatin1String expected4("\nimport Qt 4.7\n" + const QLatin1String expected4("\nimport QtQuick 1.0\n" "\n" "Item {\n" "Rectangle {\n" @@ -4113,11 +4111,11 @@ void tst_TestCore::testGradientsRewriter() propertyList.append(qMakePair(QString("position"), QVariant::fromValue(0.8))); propertyList.append(qMakePair(QString("color"), QVariant::fromValue(QColor(Qt::yellow)))); - ModelNode gradientStop3(gradientNode.view()->createModelNode("Qt/GradientStop", 4, 7, propertyList)); + ModelNode gradientStop3(gradientNode.view()->createModelNode("QtQuick/GradientStop", 1, 0, propertyList)); QVERIFY(gradientStop3.isValid()); stops.reparentHere(gradientStop3); - const QLatin1String expected5("\nimport Qt 4.7\n" + const QLatin1String expected5("\nimport QtQuick 1.0\n" "\n" "Item {\n" "Rectangle {\n" @@ -4144,7 +4142,7 @@ void tst_TestCore::testGradientsRewriter() gradientNode.removeProperty("stops"); - const QLatin1String expected6("\nimport Qt 4.7\n" + const QLatin1String expected6("\nimport QtQuick 1.0\n" "\n" "Item {\n" "Rectangle {\n" @@ -4161,7 +4159,7 @@ void tst_TestCore::testGradientsRewriter() propertyList.append(qMakePair(QString("position"), QVariant::fromValue(0))); propertyList.append(qMakePair(QString("color"), QVariant::fromValue(QColor(Qt::blue)))); - gradientStop1 = gradientNode.view()->createModelNode("Qt/GradientStop", 4, 7, propertyList); + gradientStop1 = gradientNode.view()->createModelNode("QtQuick/GradientStop", 1, 0, propertyList); QVERIFY(gradientStop1.isValid()); stops.reparentHere(gradientStop1); @@ -4169,7 +4167,7 @@ void tst_TestCore::testGradientsRewriter() void tst_TestCore::testQmlModelStates() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); QVERIFY(view.data()); @@ -4202,7 +4200,7 @@ void tst_TestCore::testQmlModelStates() void tst_TestCore::testInstancesStates() { // -// import Qt 4.7 +// import QtQuick 1.0 // // Rectangle { // Text { @@ -4230,7 +4228,7 @@ void tst_TestCore::testInstancesStates() // } // - QScopedPointer model(Model::create("Qt/Rectangle", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Rectangle", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); QVERIFY(view.data()); @@ -4241,28 +4239,28 @@ void tst_TestCore::testInstancesStates() // ModelNode rootNode = view->rootModelNode(); - ModelNode textNode = view->createModelNode("Qt/Text", 4, 7); + ModelNode textNode = view->createModelNode("QtQuick/Text", 1, 0); textNode.setId("targetObject"); textNode.variantProperty("text").setValue("base state"); rootNode.nodeListProperty("data").reparentHere(textNode); - ModelNode propertyChanges1Node = view->createModelNode("Qt/PropertyChanges", 4, 7); + ModelNode propertyChanges1Node = view->createModelNode("QtQuick/PropertyChanges", 1, 0); propertyChanges1Node.bindingProperty("target").setExpression("targetObject"); propertyChanges1Node.variantProperty("x").setValue(10); propertyChanges1Node.variantProperty("text").setValue("state1"); - ModelNode state1Node = view->createModelNode("Qt/State", 4, 7); + ModelNode state1Node = view->createModelNode("QtQuick/State", 1, 0); state1Node.variantProperty("name").setValue("state1"); state1Node.nodeListProperty("changes").reparentHere(propertyChanges1Node); rootNode.nodeListProperty("states").reparentHere(state1Node); - ModelNode propertyChanges2Node = view->createModelNode("Qt/PropertyChanges", 4, 7); + ModelNode propertyChanges2Node = view->createModelNode("QtQuick/PropertyChanges", 1, 0); propertyChanges2Node.bindingProperty("target").setExpression("targetObject"); propertyChanges2Node.variantProperty("text").setValue("state2"); - ModelNode state2Node = view->createModelNode("Qt/State", 4, 7); + ModelNode state2Node = view->createModelNode("QtQuick/State", 1, 0); state2Node.variantProperty("name").setValue("state2"); state2Node.nodeListProperty("changes").reparentHere(propertyChanges2Node); @@ -4359,7 +4357,7 @@ void tst_TestCore::testInstancesStates() // // move property changes of current state out of state - ModelNode state3Node = view->createModelNode("Qt/State", 4, 7); + ModelNode state3Node = view->createModelNode("QtQuick/State", 1, 0); QDeclarativeListReference changes(state1, "changes"); QCOMPARE(changes.count(), 1); state3Node.nodeListProperty("changes").reparentHere(propertyChanges1Node); @@ -4382,7 +4380,7 @@ void tst_TestCore::testInstancesStates() textNode.variantProperty("text").setValue("base state"); // expressions - ModelNode textNode2 = view->createModelNode("Qt/Text", 4, 7); + ModelNode textNode2 = view->createModelNode("QtQuick/Text", 1, 0); textNode2.setId("targetObject2"); textNode2.variantProperty("text").setValue("textNode2"); @@ -4442,7 +4440,7 @@ void tst_TestCore::testInstancesStates() void tst_TestCore::testStates() { // -// import Qt 4.7 +// import QtQuick 1.0 // // Rectangle { // Text { @@ -4461,7 +4459,7 @@ void tst_TestCore::testStates() // } // - QScopedPointer model(Model::create("Qt/Rectangle", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Rectangle", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); QVERIFY(view.data()); @@ -4470,7 +4468,7 @@ void tst_TestCore::testStates() // build up model ModelNode rootNode = view->rootModelNode(); - ModelNode textNode = view->createModelNode("Qt/Text", 4, 7); + ModelNode textNode = view->createModelNode("QtQuick/Text", 1, 0); textNode.setId("targetObject"); textNode.variantProperty("text").setValue("base state"); @@ -4486,7 +4484,7 @@ void tst_TestCore::testStates() QVERIFY(textItem.isValid()); QmlModelState state1(rootItem.states().addState("state 1")); //add state "state 1" - QCOMPARE(state1.modelNode().type(), QString("Qt/State")); + QCOMPARE(state1.modelNode().type(), QString("QtQuick/State")); QVERIFY(view->currentState().isBaseState()); @@ -4519,7 +4517,7 @@ void tst_TestCore::testStates() QCOMPARE(changes.modelNode().variantProperty("text").value(), QVariant("state 1")); QCOMPARE(changes.modelNode().bindingProperty("target").expression(), QString("targetObject")); QCOMPARE(changes.target(), textNode); - QCOMPARE(changes.modelNode().type(), QString("Qt/PropertyChanges")); + QCOMPARE(changes.modelNode().type(), QString("QtQuick/PropertyChanges")); QCOMPARE(changes.modelNode().parentProperty().name(), QString("changes")); QCOMPARE(changes.modelNode().parentProperty().parentModelNode(), state1.modelNode()); @@ -4538,7 +4536,7 @@ void tst_TestCore::testStates() void tst_TestCore::testStatesBaseState() { // -// import Qt 4.7 +// import QtQuick 1.0 // // Rectangle { // Text { @@ -4557,7 +4555,7 @@ void tst_TestCore::testStatesBaseState() // } // - QScopedPointer model(Model::create("Qt/Rectangle", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Rectangle", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); QVERIFY(view.data()); @@ -4566,7 +4564,7 @@ void tst_TestCore::testStatesBaseState() // build up model ModelNode rootNode = view->rootModelNode(); - ModelNode textNode = view->createModelNode("Qt/Text", 4, 7); + ModelNode textNode = view->createModelNode("QtQuick/Text", 1, 0); textNode.setId("targetObject"); textNode.variantProperty("text").setValue("base state"); @@ -4582,7 +4580,7 @@ void tst_TestCore::testStatesBaseState() QVERIFY(textItem.isValid()); QmlModelState state1(rootItem.states().addState("state 1")); //add state "state 1" - QCOMPARE(state1.modelNode().type(), QString("Qt/State")); + QCOMPARE(state1.modelNode().type(), QString("QtQuick/State")); QVERIFY(view->currentState().isBaseState()); @@ -4592,7 +4590,7 @@ void tst_TestCore::testStatesBaseState() QVERIFY(textItem.propertyAffectedByCurrentState("text")); QCOMPARE(textItem.instanceValue("text"), QVariant("state 1")); - ModelNode newNode = view->createModelNode("Qt/Rectangle", 4, 7); + ModelNode newNode = view->createModelNode("QtQuick/Rectangle", 1, 0); QVERIFY(!QmlObjectNode(newNode).currentState().isBaseState()); view->setCurrentState(view->baseState()); //set currentState base state @@ -4614,13 +4612,13 @@ void tst_TestCore::testStatesBaseState() void tst_TestCore::testInstancesIdResolution() { - QScopedPointer model(Model::create("Qt/Rectangle", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Rectangle", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); QVERIFY(view.data()); model->attachView(view.data()); - // import Qt 4.7 + // import QtQuick 1.0 // // Rectangle { // id: root @@ -4638,7 +4636,7 @@ void tst_TestCore::testInstancesIdResolution() rootNode.variantProperty("width").setValue(100); rootNode.variantProperty("height").setValue(100); - ModelNode item1Node = view->createModelNode("Qt/Rectangle", 4, 7); + ModelNode item1Node = view->createModelNode("QtQuick/Rectangle", 1, 0); item1Node.setId("item1"); item1Node.bindingProperty("width").setExpression("root.width"); item1Node.bindingProperty("height").setExpression("item2.height"); @@ -4658,7 +4656,7 @@ void tst_TestCore::testInstancesIdResolution() // height: root.height // } - ModelNode item2Node = view->createModelNode("Qt/Rectangle", 4, 7); + ModelNode item2Node = view->createModelNode("QtQuick/Rectangle", 1, 0); item2Node.setId("item2"); item2Node.bindingProperty("width").setExpression("root.width / 2"); item2Node.bindingProperty("height").setExpression("root.height"); @@ -4683,7 +4681,7 @@ void tst_TestCore::testInstancesIdResolution() // height: 80 // } - ModelNode item3Node = view->createModelNode("Qt/Rectangle", 4, 7); + ModelNode item3Node = view->createModelNode("QtQuick/Rectangle", 1, 0); item3Node.setId("item3"); item3Node.variantProperty("height").setValue(80); rootNode.nodeListProperty("data").reparentHere(item3Node); @@ -4701,16 +4699,16 @@ void tst_TestCore::testInstancesNotInScene() // test whether deleting an instance which is not in the scene crashes // - QScopedPointer model(Model::create("Qt/Rectangle", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Rectangle", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); QVERIFY(view.data()); model->attachView(view.data()); - ModelNode node1 = view->createModelNode("Qt/Item", 4, 7); + ModelNode node1 = view->createModelNode("QtQuick/Item", 1, 0); node1.setId("node1"); - ModelNode node2 = view->createModelNode("Qt/Item", 4, 7); + ModelNode node2 = view->createModelNode("QtQuick/Item", 1, 0); node2.setId("node2"); node1.nodeListProperty("children").reparentHere(node2); @@ -4722,21 +4720,21 @@ void tst_TestCore::testInstancesBindingsInStatesStress() { //This is a stress test to provoke a crash for (int j=0;j<20;j++) { - QScopedPointer model(Model::create("Qt/Rectangle", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Rectangle", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); QVERIFY(view.data()); model->attachView(view.data()); - ModelNode node1 = view->createModelNode("Qt/Item", 4, 7); + ModelNode node1 = view->createModelNode("QtQuick/Item", 1, 0); node1.setId("node1"); view->rootModelNode().nodeListProperty("children").reparentHere(node1); - ModelNode node2 = view->createModelNode("Qt/Rectangle", 4, 7); + ModelNode node2 = view->createModelNode("QtQuick/Rectangle", 1, 0); node2.setId("node2"); - ModelNode node3 = view->createModelNode("Qt/Rectangle", 4, 7); + ModelNode node3 = view->createModelNode("QtQuick/Rectangle", 1, 0); node3.setId("node3"); node1.nodeListProperty("children").reparentHere(node2); @@ -4827,21 +4825,21 @@ void tst_TestCore::testInstancesPropertyChangeTargets() //this tests checks if a change of the target of a CropertyChange //node is handled correctly - QScopedPointer model(Model::create("Qt/Rectangle", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Rectangle", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); QVERIFY(view.data()); model->attachView(view.data()); - ModelNode node1 = view->createModelNode("Qt/Item", 4, 7); + ModelNode node1 = view->createModelNode("QtQuick/Item", 1, 0); node1.setId("node1"); view->rootModelNode().nodeListProperty("children").reparentHere(node1); - ModelNode node2 = view->createModelNode("Qt/Rectangle", 4, 7); + ModelNode node2 = view->createModelNode("QtQuick/Rectangle", 1, 0); node2.setId("node2"); - ModelNode node3 = view->createModelNode("Qt/Rectangle", 4, 7); + ModelNode node3 = view->createModelNode("QtQuick/Rectangle", 1, 0); node3.setId("node3"); node1.nodeListProperty("children").reparentHere(node2); @@ -4933,21 +4931,21 @@ void tst_TestCore::testInstancesPropertyChangeTargets() void tst_TestCore::testInstancesDeletePropertyChanges() { - QScopedPointer model(Model::create("Qt/Rectangle", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Rectangle", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); QVERIFY(view.data()); model->attachView(view.data()); - ModelNode node1 = view->createModelNode("Qt/Item", 4, 7); + ModelNode node1 = view->createModelNode("QtQuick/Item", 1, 0); node1.setId("node1"); view->rootModelNode().nodeListProperty("children").reparentHere(node1); - ModelNode node2 = view->createModelNode("Qt/Rectangle", 4, 7); + ModelNode node2 = view->createModelNode("QtQuick/Rectangle", 1, 0); node2.setId("node2"); - ModelNode node3 = view->createModelNode("Qt/Rectangle", 4, 7); + ModelNode node3 = view->createModelNode("QtQuick/Rectangle", 1, 0); node3.setId("node3"); node1.nodeListProperty("children").reparentHere(node2); @@ -5022,7 +5020,7 @@ void tst_TestCore::testInstancesDeletePropertyChanges() void tst_TestCore::testInstancesChildrenLowLevel() { - QScopedPointer model(Model::create("Qt/Rectangle", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Rectangle", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new NodeInstanceView); @@ -5034,11 +5032,11 @@ void tst_TestCore::testInstancesChildrenLowLevel() rootModelNode.setId("rootModelNode"); - ModelNode childNode1 = addNodeListChild(rootModelNode, "Qt/Text", 4, 7, "data"); + ModelNode childNode1 = addNodeListChild(rootModelNode, "QtQuick/Text", 1, 0, "data"); QVERIFY(childNode1.isValid()); childNode1.setId("childNode1"); - ModelNode childNode2 = addNodeListChild(rootModelNode, "Qt/TextEdit", 4, 7, "data"); + ModelNode childNode2 = addNodeListChild(rootModelNode, "QtQuick/TextEdit", 1, 0, "data"); QVERIFY(childNode2.isValid()); childNode2.setId("childNode2"); @@ -5112,7 +5110,7 @@ void tst_TestCore::testInstancesChildrenLowLevel() void tst_TestCore::testInstancesResourcesLowLevel() { - QScopedPointer model(Model::create("Qt/Rectangle", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Rectangle", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new NodeInstanceView); @@ -5124,15 +5122,15 @@ void tst_TestCore::testInstancesResourcesLowLevel() rootModelNode.setId("rootModelNode"); - ModelNode childNode1 = addNodeListChild(rootModelNode, "Qt/Text", 4, 7, "data"); + ModelNode childNode1 = addNodeListChild(rootModelNode, "QtQuick/Text", 1, 0, "data"); QVERIFY(childNode1.isValid()); childNode1.setId("childNode1"); - ModelNode childNode2 = addNodeListChild(rootModelNode, "Qt/TextEdit", 4, 7, "data"); + ModelNode childNode2 = addNodeListChild(rootModelNode, "QtQuick/TextEdit", 1, 0, "data"); QVERIFY(childNode2.isValid()); childNode2.setId("childNode2"); - ModelNode listModel = addNodeListChild(rootModelNode, "Qt/ListModel", 4, 7, "data"); + ModelNode listModel = addNodeListChild(rootModelNode, "QtQuick/ListModel", 1, 0, "data"); QVERIFY(listModel.isValid()); listModel.setId("listModel"); @@ -5188,6 +5186,8 @@ void tst_TestCore::testInstancesResourcesLowLevel() QCOMPARE(listReferenceData.at(1), child1Item); QCOMPARE(listReferenceData.at(2), child2Item); + QSKIP("This crashes", SkipAll); //### todo might be critical in the future + listReferenceChildren.clear(); QCOMPARE(listReferenceData.count(), 1); @@ -5209,7 +5209,7 @@ void tst_TestCore::testInstancesResourcesLowLevel() QCOMPARE(listReferenceData.at(1), child1Item); QCOMPARE(listReferenceData.at(2), child2Item); - ModelNode listModel2 = addNodeListChild(rootModelNode, "Qt/ListModel", 4, 7, "data"); + ModelNode listModel2 = addNodeListChild(rootModelNode, "QtQuick/ListModel", 1, 0, "data"); QVERIFY(listModel2.isValid()); listModel2.setId("listModel2"); @@ -5257,7 +5257,7 @@ void tst_TestCore::testInstancesResourcesLowLevel() void tst_TestCore::testInstancesFlickableLowLevel() { - QScopedPointer model(Model::create("Qt/Flickable", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Flickable", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new NodeInstanceView); @@ -5269,15 +5269,15 @@ void tst_TestCore::testInstancesFlickableLowLevel() rootModelNode.setId("rootModelNode"); - ModelNode childNode1 = addNodeListChild(rootModelNode, "Qt/Text", 4, 7, "flickableData"); + ModelNode childNode1 = addNodeListChild(rootModelNode, "QtQuick/Text", 1, 0, "flickableData"); QVERIFY(childNode1.isValid()); childNode1.setId("childNode1"); - ModelNode childNode2 = addNodeListChild(rootModelNode, "Qt/TextEdit", 4, 7, "flickableData"); + ModelNode childNode2 = addNodeListChild(rootModelNode, "QtQuick/TextEdit", 1, 0, "flickableData"); QVERIFY(childNode2.isValid()); childNode2.setId("childNode2"); - ModelNode listModel = addNodeListChild(rootModelNode, "Qt/ListModel", 4, 7, "flickableData"); + ModelNode listModel = addNodeListChild(rootModelNode, "QtQuick/ListModel", 1, 0, "flickableData"); QVERIFY(listModel.isValid()); listModel.setId("listModel"); @@ -5345,7 +5345,7 @@ void tst_TestCore::testInstancesFlickableLowLevel() void tst_TestCore::testInstancesReorderChildrenLowLevel() { - QScopedPointer model(Model::create("Qt/Rectangle", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Rectangle", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new NodeInstanceView); @@ -5357,23 +5357,23 @@ void tst_TestCore::testInstancesReorderChildrenLowLevel() rootModelNode.setId("rootModelNode"); - ModelNode childNode1 = addNodeListChild(rootModelNode, "Qt/Text", 4, 7, "data"); + ModelNode childNode1 = addNodeListChild(rootModelNode, "QtQuick/Text", 1, 0, "data"); QVERIFY(childNode1.isValid()); childNode1.setId("childNode1"); - ModelNode childNode2 = addNodeListChild(rootModelNode, "Qt/TextEdit", 4, 7, "data"); + ModelNode childNode2 = addNodeListChild(rootModelNode, "QtQuick/TextEdit", 1, 0, "data"); QVERIFY(childNode2.isValid()); childNode2.setId("childNode2"); - ModelNode listModel = addNodeListChild(rootModelNode, "Qt/ListModel", 4, 7, "data"); + ModelNode listModel = addNodeListChild(rootModelNode, "QtQuick/ListModel", 1, 0, "data"); QVERIFY(listModel.isValid()); listModel.setId("listModel"); - ModelNode childNode3 = addNodeListChild(rootModelNode, "Qt/TextEdit", 4, 7, "data"); + ModelNode childNode3 = addNodeListChild(rootModelNode, "QtQuick/TextEdit", 1, 0, "data"); QVERIFY(childNode3.isValid()); childNode3.setId("childNode3"); - ModelNode childNode4 = addNodeListChild(rootModelNode, "Qt/TextEdit", 4, 7, "data"); + ModelNode childNode4 = addNodeListChild(rootModelNode, "QtQuick/TextEdit", 1, 0, "data"); QVERIFY(childNode4.isValid()); childNode4.setId("childNode4"); @@ -5444,7 +5444,7 @@ void tst_TestCore::testInstancesReorderChildrenLowLevel() void tst_TestCore::testQmlModelStatesInvalidForRemovedNodes() { - QScopedPointer model(Model::create("Qt/Rectangle", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Rectangle", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -5461,11 +5461,11 @@ void tst_TestCore::testQmlModelStatesInvalidForRemovedNodes() QVERIFY(state1.isValid()); QCOMPARE(state1.name(), QString("state1")); - ModelNode childNode = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); + ModelNode childNode = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); QVERIFY(childNode.isValid()); childNode.setId("childNode"); - ModelNode subChildNode = addNodeListChild(childNode, "Qt/Rectangle", 4, 7, "data"); + ModelNode subChildNode = addNodeListChild(childNode, "QtQuick/Rectangle", 1, 0, "data"); QVERIFY(subChildNode.isValid()); subChildNode.setId("subChildNode"); @@ -5485,7 +5485,7 @@ void tst_TestCore::testInstancesAttachToExistingModel() // Test attaching nodeinstanceview to an existing model // - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -5493,7 +5493,7 @@ void tst_TestCore::testInstancesAttachToExistingModel() model->attachView(view.data()); ModelNode rootNode = view->rootModelNode(); - ModelNode rectangleNode = addNodeListChild(rootNode, "Qt/Rectangle", 4, 7, "data"); + ModelNode rectangleNode = addNodeListChild(rootNode, "QtQuick/Rectangle", 1, 0, "data"); rectangleNode.variantProperty("width").setValue(100); @@ -5518,7 +5518,7 @@ void tst_TestCore::testInstancesAttachToExistingModel() void tst_TestCore::testQmlModelAddMultipleStates() { - QScopedPointer model(Model::create("Qt/Rectangle", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Rectangle", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -5549,7 +5549,7 @@ void tst_TestCore::testQmlModelAddMultipleStates() void tst_TestCore::testQmlModelRemoveStates() { - QScopedPointer model(Model::create("Qt/Rectangle", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Rectangle", 1, 0)); QScopedPointer view(new TestView(model.data())); QVERIFY(view.data()); @@ -5579,10 +5579,10 @@ void tst_TestCore::testQmlModelRemoveStates() void tst_TestCore::testQmlModelStateWithName() { QPlainTextEdit textEdit1; - textEdit1.setPlainText("import Qt 4.7; Rectangle { id: theRect; width: 100; states: [ State { name: \"a\"; PropertyChanges { target: theRect; width: 200; } } ] }\n"); + textEdit1.setPlainText("import QtQuick 1.0; Rectangle { id: theRect; width: 100; states: [ State { name: \"a\"; PropertyChanges { target: theRect; width: 200; } } ] }\n"); NotIndentingTextEditModifier modifier1(&textEdit1); - QScopedPointer model1(Model::create("Qt/Item")); + QScopedPointer model1(Model::create("QtQuick/Item")); TestRewriterView *testRewriterView1 = new TestRewriterView(model1.data()); testRewriterView1->setTextModifier(&modifier1); @@ -5604,7 +5604,7 @@ void tst_TestCore::testQmlModelStateWithName() view->setCurrentState(rootNode.states().allStates().at(0)); rootNode.setVariantProperty("width", 112); - const QLatin1String expected1("import Qt 4.7; Rectangle { id: theRect; width: 100; states: [ State { name: \"a\"; PropertyChanges { target: theRect; width: 112 } } ] }\n"); + const QLatin1String expected1("import QtQuick 1.0; Rectangle { id: theRect; width: 100; states: [ State { name: \"a\"; PropertyChanges { target: theRect; width: 112 } } ] }\n"); QCOMPARE(textEdit1.toPlainText(), expected1); QVERIFY(!rootNode.isInBaseState()); @@ -5624,10 +5624,10 @@ void tst_TestCore::testQmlModelStateWithName() void tst_TestCore::testRewriterAutomaticSemicolonAfterChangedProperty() { QPlainTextEdit textEdit1; - textEdit1.setPlainText("import Qt 4.7; Rectangle {\n width: 640\n height: 480\n}\n"); + textEdit1.setPlainText("import QtQuick 1.0; Rectangle {\n width: 640\n height: 480\n}\n"); NotIndentingTextEditModifier modifier1(&textEdit1); - QScopedPointer model1(Model::create("Qt/Item")); + QScopedPointer model1(Model::create("QtQuick/Item")); TestRewriterView *testRewriterView1 = new TestRewriterView(model1.data()); testRewriterView1->setTextModifier(&modifier1); @@ -5644,7 +5644,7 @@ void tst_TestCore::testRewriterAutomaticSemicolonAfterChangedProperty() void tst_TestCore::defaultPropertyValues() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -5654,12 +5654,12 @@ void tst_TestCore::defaultPropertyValues() QCOMPARE(view->rootModelNode().variantProperty("x").value().toDouble(), 0.0); QCOMPARE(view->rootModelNode().variantProperty("width").value().toDouble(), 0.0); - ModelNode rectNode(addNodeListChild(view->rootModelNode(), "Qt/Rectangle", 4, 7, "data")); + ModelNode rectNode(addNodeListChild(view->rootModelNode(), "QtQuick/Rectangle", 1, 0, "data")); QCOMPARE(rectNode.variantProperty("y").value().toDouble(), 0.0); QCOMPARE(rectNode.variantProperty("width").value().toDouble(), 0.0); - ModelNode imageNode(addNodeListChild(view->rootModelNode(), "Qt/Image", 4, 7, "data")); + ModelNode imageNode(addNodeListChild(view->rootModelNode(), "QtQuick/Image", 1, 0, "data")); QCOMPARE(imageNode.variantProperty("y").value().toDouble(), 0.0); QCOMPARE(imageNode.variantProperty("width").value().toDouble(), 0.0); @@ -5668,10 +5668,10 @@ void tst_TestCore::defaultPropertyValues() void tst_TestCore::testModelPropertyValueTypes() { QPlainTextEdit textEdit1; - textEdit1.setPlainText("import Qt 4.7; Rectangle { width: 100; radius: 1.5; color: \"red\"; }"); + textEdit1.setPlainText("import QtQuick 1.0; Rectangle { width: 100; radius: 1.5; color: \"red\"; }"); NotIndentingTextEditModifier modifier1(&textEdit1); - QScopedPointer model1(Model::create("Qt/Item")); + QScopedPointer model1(Model::create("QtQuick/Item")); QScopedPointer testRewriterView1(new TestRewriterView()); testRewriterView1->setTextModifier(&modifier1); @@ -5689,7 +5689,7 @@ void tst_TestCore::testModelPropertyValueTypes() void tst_TestCore::testModelNodeInHierarchy() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -5697,9 +5697,9 @@ void tst_TestCore::testModelNodeInHierarchy() model->attachView(view.data()); QVERIFY(view->rootModelNode().isInHierarchy()); - ModelNode node1 = addNodeListChild(view->rootModelNode(), "Qt/Item", 4, 7, "data"); + ModelNode node1 = addNodeListChild(view->rootModelNode(), "QtQuick/Item", 1, 0, "data"); QVERIFY(node1.isInHierarchy()); - ModelNode node2 = view->createModelNode("Qt/Item", 4, 7); + ModelNode node2 = view->createModelNode("QtQuick/Item", 1, 0); QVERIFY(!node2.isInHierarchy()); node2.nodeListProperty("data").reparentHere(node1); QVERIFY(!node2.isInHierarchy()); @@ -5710,11 +5710,11 @@ void tst_TestCore::testModelNodeInHierarchy() void tst_TestCore::testModelNodeIsAncestorOf() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); // - // import Qt 4.7 + // import QtQuick 1.0 // Item { // Item { // id: item2 @@ -5732,11 +5732,11 @@ void tst_TestCore::testModelNodeIsAncestorOf() model->attachView(view.data()); view->rootModelNode().setId("item1"); - ModelNode item2 = addNodeListChild(view->rootModelNode(), "Qt/Item", 4, 7, "data"); + ModelNode item2 = addNodeListChild(view->rootModelNode(), "QtQuick/Item", 1, 0, "data"); item2.setId("item2"); - ModelNode item3 = addNodeListChild(view->rootModelNode(), "Qt/Item", 4, 7, "data"); + ModelNode item3 = addNodeListChild(view->rootModelNode(), "QtQuick/Item", 1, 0, "data"); item3.setId("item3"); - ModelNode item4 = addNodeListChild(item3, "Qt/Item", 4, 7, "data"); + ModelNode item4 = addNodeListChild(item3, "QtQuick/Item", 1, 0, "data"); item4.setId("item4"); QVERIFY(view->rootModelNode().isAncestorOf(item2)); @@ -5749,7 +5749,7 @@ void tst_TestCore::testModelNodeIsAncestorOf() void tst_TestCore::testModelDefaultProperties() { - QScopedPointer model(Model::create("Qt/Rectangle")); + QScopedPointer model(Model::create("QtQuick/Rectangle")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -5765,10 +5765,10 @@ void tst_TestCore::testModelDefaultProperties() void tst_TestCore::loadAnchors() { QPlainTextEdit textEdit1; - textEdit1.setPlainText("import Qt 4.7; Item { width: 100; height: 100; Rectangle { anchors.left: parent.left; anchors.horizontalCenter: parent.horizontalCenter; anchors.rightMargin: 20; }}"); + textEdit1.setPlainText("import QtQuick 1.0; Item { width: 100; height: 100; Rectangle { anchors.left: parent.left; anchors.horizontalCenter: parent.horizontalCenter; anchors.rightMargin: 20; }}"); NotIndentingTextEditModifier modifier1(&textEdit1); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QScopedPointer testRewriterView1(new TestRewriterView()); testRewriterView1->setTextModifier(&modifier1); @@ -5804,10 +5804,10 @@ void tst_TestCore::loadAnchors() void tst_TestCore::changeAnchors() { QPlainTextEdit textEdit1; - textEdit1.setPlainText("import Qt 4.7; Item { width: 100; height: 100; Rectangle { anchors.left: parent.left; anchors.horizontalCenter: parent.horizontalCenter; anchors.rightMargin: 20; }}"); + textEdit1.setPlainText("import QtQuick 1.0; Item { width: 100; height: 100; Rectangle { anchors.left: parent.left; anchors.horizontalCenter: parent.horizontalCenter; anchors.rightMargin: 20; }}"); NotIndentingTextEditModifier modifier1(&textEdit1); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QScopedPointer testRewriterView1(new TestRewriterView()); testRewriterView1->setTextModifier(&modifier1); @@ -5865,10 +5865,10 @@ void tst_TestCore::changeAnchors() void tst_TestCore::anchorToSibling() { QPlainTextEdit textEdit1; - textEdit1.setPlainText("import Qt 4.7; Item { Rectangle {} Rectangle { id: secondChild } }"); + textEdit1.setPlainText("import QtQuick 1.0; Item { Rectangle {} Rectangle { id: secondChild } }"); NotIndentingTextEditModifier modifier1(&textEdit1); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QScopedPointer testRewriterView1(new TestRewriterView()); testRewriterView1->setTextModifier(&modifier1); @@ -5909,10 +5909,10 @@ void tst_TestCore::anchorToSibling() void tst_TestCore::removeFillAnchorByDetaching() { QPlainTextEdit textEdit1; - textEdit1.setPlainText("import Qt 4.7; Item { width: 100; height: 100; Rectangle { id: child; anchors.fill: parent } }"); + textEdit1.setPlainText("import QtQuick 1.0; Item { width: 100; height: 100; Rectangle { id: child; anchors.fill: parent } }"); NotIndentingTextEditModifier modifier1(&textEdit1); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QScopedPointer testRewriterView1(new TestRewriterView()); testRewriterView1->setTextModifier(&modifier1); @@ -5989,10 +5989,10 @@ void tst_TestCore::removeFillAnchorByDetaching() void tst_TestCore::removeFillAnchorByChanging() { QPlainTextEdit textEdit1; - textEdit1.setPlainText("import Qt 4.7; Item { width: 100; height: 100; Rectangle { id: child; anchors.fill: parent } }"); + textEdit1.setPlainText("import QtQuick 1.0; Item { width: 100; height: 100; Rectangle { id: child; anchors.fill: parent } }"); NotIndentingTextEditModifier modifier1(&textEdit1); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QScopedPointer testRewriterView1(new TestRewriterView()); testRewriterView1->setTextModifier(&modifier1); @@ -6069,7 +6069,7 @@ void tst_TestCore::removeFillAnchorByChanging() void tst_TestCore::testModelBindings() { - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); NodeInstanceView *nodeInstanceView = new NodeInstanceView(model.data()); @@ -6089,7 +6089,7 @@ void tst_TestCore::testModelBindings() QCOMPARE(rootInstance.size().width(), 200.0); QCOMPARE(rootInstance.size().height(), 100.0); - ModelNode childNode = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); + ModelNode childNode = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); childNode.variantProperty("width") = 100; childNode.variantProperty("height") = 100; @@ -6127,7 +6127,7 @@ void tst_TestCore::testModelBindings() void tst_TestCore::testModelDynamicProperties() { - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); TestView *testView = new TestView(model.data()); @@ -6171,7 +6171,7 @@ void tst_TestCore::testModelDynamicProperties() void tst_TestCore::testModelSliding() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -6180,10 +6180,10 @@ void tst_TestCore::testModelSliding() ModelNode rootModelNode(view->rootModelNode()); - ModelNode rect00(addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data")); - ModelNode rect01(addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data")); - ModelNode rect02(addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data")); - ModelNode rect03(addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data")); + ModelNode rect00(addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data")); + ModelNode rect01(addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data")); + ModelNode rect02(addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data")); + ModelNode rect03(addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data")); QVERIFY(rect00.isValid()); QVERIFY(rect01.isValid()); @@ -6239,13 +6239,13 @@ void tst_TestCore::testModelSliding() void tst_TestCore::testRewriterChangeId() { - const char* qmlString = "import Qt 4.7\nRectangle { }"; + const char* qmlString = "import QtQuick 1.0\nRectangle { }"; QPlainTextEdit textEdit; textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -6264,25 +6264,25 @@ void tst_TestCore::testRewriterChangeId() QCOMPARE(rootModelNode.id(), QString("rectId")); - QString expected = "import Qt 4.7\n" + QString expected = "import QtQuick 1.0\n" "Rectangle { id: rectId }"; QCOMPARE(textEdit.toPlainText(), expected); // change id for node outside of hierarchy - ModelNode node = view->createModelNode("Qt/Item", 4, 7); + ModelNode node = view->createModelNode("QtQuick/Item", 1, 0); node.setId("myId"); } void tst_TestCore::testRewriterRemoveId() { - const char* qmlString = "import Qt 4.7\nRectangle { id: rect }"; + const char* qmlString = "import QtQuick 1.0\nRectangle { id: rect }"; QPlainTextEdit textEdit; textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -6300,7 +6300,7 @@ void tst_TestCore::testRewriterRemoveId() // // remove id in text // - const char* qmlString2 = "import Qt 4.7\nRectangle { }"; + const char* qmlString2 = "import QtQuick 1.0\nRectangle { }"; textEdit.setPlainText(qmlString2); QCOMPARE(rootModelNode.id(), QString()); @@ -6308,13 +6308,13 @@ void tst_TestCore::testRewriterRemoveId() void tst_TestCore::testRewriterChangeValueProperty() { - const char* qmlString = "import Qt 4.7\nRectangle { x: 10; y: 10 }"; + const char* qmlString = "import QtQuick 1.0\nRectangle { x: 10; y: 10 }"; QPlainTextEdit textEdit; textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -6337,14 +6337,14 @@ void tst_TestCore::testRewriterChangeValueProperty() // change property for node outside of hierarchy PropertyListType properties; properties.append(QPair("x", 10)); - ModelNode node = view->createModelNode("Qt/Item", 4, 7, properties); + ModelNode node = view->createModelNode("QtQuick/Item", 1, 0, properties); node.variantProperty("x").setValue(20); } void tst_TestCore::testRewriterRemoveValueProperty() { const QLatin1String qmlString("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "Rectangle {\n" " x: 10\n" " y: 10;\n" @@ -6354,7 +6354,7 @@ void tst_TestCore::testRewriterRemoveValueProperty() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -6375,7 +6375,7 @@ void tst_TestCore::testRewriterRemoveValueProperty() rootModelNode.removeProperty("x"); const QLatin1String expected("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "Rectangle {\n" " y: 10;\n" "}\n"); @@ -6384,19 +6384,19 @@ void tst_TestCore::testRewriterRemoveValueProperty() // remove property for node outside of hierarchy PropertyListType properties; properties.append(QPair("x", 10)); - ModelNode node = view->createModelNode("Qt/Item", 4, 7, properties); + ModelNode node = view->createModelNode("QtQuick/Item", 1, 0, properties); node.removeProperty("x"); } void tst_TestCore::testRewriterSignalProperty() { - const char* qmlString = "import Qt 4.7\nRectangle { onColorChanged: {} }"; + const char* qmlString = "import QtQuick 1.0\nRectangle { onColorChanged: {} }"; QPlainTextEdit textEdit; textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -6416,13 +6416,13 @@ void tst_TestCore::testRewriterSignalProperty() void tst_TestCore::testRewriterObjectTypeProperty() { - const char* qmlString = "import Qt 4.7\nRectangle { x: 10; y: 10 }"; + const char* qmlString = "import QtQuick 1.0\nRectangle { x: 10; y: 10 }"; QPlainTextEdit textEdit; textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -6436,11 +6436,11 @@ void tst_TestCore::testRewriterObjectTypeProperty() ModelNode rootModelNode(view->rootModelNode()); QVERIFY(rootModelNode.isValid()); - QCOMPARE(rootModelNode.type(), QLatin1String("Qt/Rectangle")); + QCOMPARE(rootModelNode.type(), QLatin1String("QtQuick/Rectangle")); - view->changeRootNodeType(QLatin1String("Qt/Text"), 4, 7); + view->changeRootNodeType(QLatin1String("QtQuick/Text"), 1, 0); - QCOMPARE(rootModelNode.type(), QLatin1String("Qt/Text")); + QCOMPARE(rootModelNode.type(), QLatin1String("QtQuick/Text")); } void tst_TestCore::testRewriterPropertyChanges() @@ -6450,7 +6450,7 @@ void tst_TestCore::testRewriterPropertyChanges() // Use a slightly more complicated example so that target properties are not resolved in default scope const char* qmlString - = "import Qt 4.7\n" + = "import QtQuick 1.0\n" "Rectangle {\n" " Text {\n" " id: targetObj\n" @@ -6470,7 +6470,7 @@ void tst_TestCore::testRewriterPropertyChanges() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -6483,7 +6483,7 @@ void tst_TestCore::testRewriterPropertyChanges() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QString("Qt/Rectangle")); + QCOMPARE(rootNode.type(), QString("QtQuick/Rectangle")); QVERIFY(rootNode.propertyNames().contains(QLatin1String("data"))); QVERIFY(rootNode.propertyNames().contains(QLatin1String("states"))); QCOMPARE(rootNode.propertyNames().count(), 2); @@ -6494,7 +6494,7 @@ void tst_TestCore::testRewriterPropertyChanges() ModelNode stateNode = statesProperty.toModelNodeList().first(); QVERIFY(stateNode.isValid()); - QCOMPARE(stateNode.type(), QString("Qt/State")); + QCOMPARE(stateNode.type(), QString("QtQuick/State")); QCOMPARE(stateNode.propertyNames(), QStringList("changes")); NodeListProperty stateChangesProperty = stateNode.property("changes").toNodeListProperty(); @@ -6521,13 +6521,13 @@ void tst_TestCore::testRewriterListModel() try { // ListModel uses a custom parser - const char* qmlString = "import Qt 4.7; ListModel {\n ListElement {\n age: 12\n} \n}"; + const char* qmlString = "import QtQuick 1.0; ListModel {\n ListElement {\n age: 12\n} \n}"; QPlainTextEdit textEdit; textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer testRewriterView(new TestRewriterView()); @@ -6556,7 +6556,7 @@ void tst_TestCore::testRewriterListModel() void tst_TestCore::testRewriterAddProperty() { const QLatin1String qmlString("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" "}"); @@ -6564,7 +6564,7 @@ void tst_TestCore::testRewriterAddProperty() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -6577,7 +6577,7 @@ void tst_TestCore::testRewriterAddProperty() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QString("Qt/Rectangle")); + QCOMPARE(rootNode.type(), QString("QtQuick/Rectangle")); rootNode.variantProperty(QLatin1String("x")).setValue(123); @@ -6586,7 +6586,7 @@ void tst_TestCore::testRewriterAddProperty() QCOMPARE(rootNode.variantProperty(QLatin1String("x")).value(), QVariant(123)); const QLatin1String expected("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" "x: 123\n" @@ -6597,7 +6597,7 @@ void tst_TestCore::testRewriterAddProperty() void tst_TestCore::testRewriterAddPropertyInNestedObject() { const QLatin1String qmlString("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " Rectangle {\n" @@ -6608,7 +6608,7 @@ void tst_TestCore::testRewriterAddPropertyInNestedObject() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -6621,18 +6621,18 @@ void tst_TestCore::testRewriterAddPropertyInNestedObject() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QLatin1String("Qt/Rectangle")); + QCOMPARE(rootNode.type(), QLatin1String("QtQuick/Rectangle")); ModelNode childNode = rootNode.nodeListProperty(QLatin1String("data")).toModelNodeList().at(0); QVERIFY(childNode.isValid()); - QCOMPARE(childNode.type(), QLatin1String("Qt/Rectangle")); + QCOMPARE(childNode.type(), QLatin1String("QtQuick/Rectangle")); QCOMPARE(childNode.id(), QLatin1String("rectangle1")); childNode.variantProperty(QLatin1String("x")).setValue(10); childNode.variantProperty(QLatin1String("y")).setValue(10); const QLatin1String expected("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " Rectangle {\n" @@ -6646,7 +6646,7 @@ void tst_TestCore::testRewriterAddPropertyInNestedObject() void tst_TestCore::testRewriterAddObjectDefinition() { - const QLatin1String qmlString("import Qt 4.7\n" + const QLatin1String qmlString("import QtQuick 1.0\n" "\n" "Rectangle {\n" "}"); @@ -6654,7 +6654,7 @@ void tst_TestCore::testRewriterAddObjectDefinition() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -6667,20 +6667,20 @@ void tst_TestCore::testRewriterAddObjectDefinition() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QString("Qt/Rectangle")); + QCOMPARE(rootNode.type(), QString("QtQuick/Rectangle")); - ModelNode childNode = view->createModelNode("Qt/MouseArea", 4, 7); + ModelNode childNode = view->createModelNode("QtQuick/MouseArea", 1, 0); rootNode.nodeAbstractProperty(QLatin1String("data")).reparentHere(childNode); QCOMPARE(rootNode.nodeProperty(QLatin1String("data")).toNodeListProperty().toModelNodeList().size(), 1); childNode = rootNode.nodeProperty(QLatin1String("data")).toNodeListProperty().toModelNodeList().at(0); - QCOMPARE(childNode.type(), QString(QLatin1String("Qt/MouseArea"))); + QCOMPARE(childNode.type(), QString(QLatin1String("QtQuick/MouseArea"))); } void tst_TestCore::testRewriterAddStatesArray() { const QLatin1String qmlString("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" "}"); @@ -6688,7 +6688,7 @@ void tst_TestCore::testRewriterAddStatesArray() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -6700,13 +6700,13 @@ void tst_TestCore::testRewriterAddStatesArray() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QString("Qt/Rectangle")); + QCOMPARE(rootNode.type(), QString("QtQuick/Rectangle")); - ModelNode stateNode = view->createModelNode("Qt/State", 4, 7); + ModelNode stateNode = view->createModelNode("QtQuick/State", 1, 0); rootNode.nodeListProperty(QLatin1String("states")).reparentHere(stateNode); const QString expected1 = QLatin1String("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" "states: [\n" @@ -6716,11 +6716,11 @@ void tst_TestCore::testRewriterAddStatesArray() "}"); QCOMPARE(textEdit.toPlainText(), expected1); - ModelNode stateNode2 = view->createModelNode("Qt/State", 4, 7); + ModelNode stateNode2 = view->createModelNode("QtQuick/State", 1, 0); rootNode.nodeListProperty(QLatin1String("states")).reparentHere(stateNode2); const QString expected2 = QLatin1String("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" "states: [\n" @@ -6736,7 +6736,7 @@ void tst_TestCore::testRewriterAddStatesArray() void tst_TestCore::testRewriterRemoveStates() { const QLatin1String qmlString("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " states: [\n" @@ -6750,7 +6750,7 @@ void tst_TestCore::testRewriterRemoveStates() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -6762,7 +6762,7 @@ void tst_TestCore::testRewriterRemoveStates() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QString("Qt/Rectangle")); + QCOMPARE(rootNode.type(), QString("QtQuick/Rectangle")); NodeListProperty statesProperty = rootNode.nodeListProperty(QLatin1String("states")); QVERIFY(statesProperty.isValid()); @@ -6772,7 +6772,7 @@ void tst_TestCore::testRewriterRemoveStates() state.destroy(); const QLatin1String expected1("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " states: [\n" @@ -6786,7 +6786,7 @@ void tst_TestCore::testRewriterRemoveStates() state.destroy(); const QLatin1String expected2("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" "}"); @@ -6796,7 +6796,7 @@ void tst_TestCore::testRewriterRemoveStates() void tst_TestCore::testRewriterRemoveObjectDefinition() { const QLatin1String qmlString("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " MouseArea {\n" @@ -6808,7 +6808,7 @@ void tst_TestCore::testRewriterRemoveObjectDefinition() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -6821,24 +6821,24 @@ void tst_TestCore::testRewriterRemoveObjectDefinition() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QString("Qt/Rectangle")); + QCOMPARE(rootNode.type(), QString("QtQuick/Rectangle")); QCOMPARE(rootNode.nodeProperty(QLatin1String("data")).toNodeListProperty().toModelNodeList().size(), 2); ModelNode childNode = rootNode.nodeProperty(QLatin1String("data")).toNodeListProperty().toModelNodeList().at(1); - QCOMPARE(childNode.type(), QString(QLatin1String("Qt/MouseArea"))); + QCOMPARE(childNode.type(), QString(QLatin1String("QtQuick/MouseArea"))); childNode.destroy(); QCOMPARE(rootNode.nodeProperty(QLatin1String("data")).toNodeListProperty().toModelNodeList().size(), 1); childNode = rootNode.nodeProperty(QLatin1String("data")).toNodeListProperty().toModelNodeList().at(0); - QCOMPARE(childNode.type(), QString(QLatin1String("Qt/MouseArea"))); + QCOMPARE(childNode.type(), QString(QLatin1String("QtQuick/MouseArea"))); childNode.destroy(); QVERIFY(!rootNode.hasProperty(QLatin1String("data"))); const QString expected = QLatin1String("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " // some comment here\n" @@ -6846,9 +6846,9 @@ void tst_TestCore::testRewriterRemoveObjectDefinition() QCOMPARE(textEdit.toPlainText(), expected); // don't crash when deleting nodes not in any hierarchy - ModelNode node1 = view->createModelNode("Qt/Rectangle", 4, 7); - ModelNode node2 = addNodeListChild(node1, "Qt/Item", 4, 7, "data"); - ModelNode node3 = addNodeListChild(node2, "Qt/Item", 4, 7, "data"); + ModelNode node1 = view->createModelNode("QtQuick/Rectangle", 1, 0); + ModelNode node2 = addNodeListChild(node1, "QtQuick/Item", 1, 0, "data"); + ModelNode node3 = addNodeListChild(node2, "QtQuick/Item", 1, 0, "data"); node3.destroy(); node1.destroy(); @@ -6857,7 +6857,7 @@ void tst_TestCore::testRewriterRemoveObjectDefinition() void tst_TestCore::testRewriterRemoveScriptBinding() { const QLatin1String qmlString("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " x: 10; // some comment\n" @@ -6867,7 +6867,7 @@ void tst_TestCore::testRewriterRemoveScriptBinding() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -6880,7 +6880,7 @@ void tst_TestCore::testRewriterRemoveScriptBinding() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QString("Qt/Rectangle")); + QCOMPARE(rootNode.type(), QString("QtQuick/Rectangle")); QCOMPARE(rootNode.properties().size(), 2); QVERIFY(rootNode.hasProperty(QLatin1String("x"))); @@ -6897,7 +6897,7 @@ void tst_TestCore::testRewriterRemoveScriptBinding() QCOMPARE(rootNode.properties().size(), 0); const QString expected = QLatin1String("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " // some comment\n" @@ -6908,7 +6908,7 @@ void tst_TestCore::testRewriterRemoveScriptBinding() void tst_TestCore::testRewriterNodeReparenting() { const QLatin1String qmlString("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " Item {\n" @@ -6920,7 +6920,7 @@ void tst_TestCore::testRewriterNodeReparenting() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -6933,15 +6933,15 @@ void tst_TestCore::testRewriterNodeReparenting() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QString("Qt/Rectangle")); + QCOMPARE(rootNode.type(), QString("QtQuick/Rectangle")); ModelNode itemNode = rootNode.nodeListProperty("data").toModelNodeList().at(0); QVERIFY(itemNode.isValid()); - QCOMPARE(itemNode.type(), QLatin1String("Qt/Item")); + QCOMPARE(itemNode.type(), QLatin1String("QtQuick/Item")); ModelNode mouseArea = itemNode.nodeListProperty("data").toModelNodeList().at(0); QVERIFY(mouseArea.isValid()); - QCOMPARE(mouseArea.type(), QLatin1String("Qt/MouseArea")); + QCOMPARE(mouseArea.type(), QLatin1String("QtQuick/MouseArea")); rootNode.nodeListProperty("data").reparentHere(mouseArea); @@ -6949,7 +6949,7 @@ void tst_TestCore::testRewriterNodeReparenting() QCOMPARE(rootNode.nodeListProperty("data").toModelNodeList().size(), 2); QString expected = "\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " Item {\n" @@ -6961,9 +6961,9 @@ void tst_TestCore::testRewriterNodeReparenting() QCOMPARE(textEdit.toPlainText(), expected); // reparenting outside of the hierarchy - ModelNode node1 = view->createModelNode("Qt/Rectangle", 4, 7); - ModelNode node2 = view->createModelNode("Qt/Item", 4, 7); - ModelNode node3 = view->createModelNode("Qt/Item", 4, 7); + ModelNode node1 = view->createModelNode("QtQuick/Rectangle", 1, 0); + ModelNode node2 = view->createModelNode("QtQuick/Item", 1, 0); + ModelNode node3 = view->createModelNode("QtQuick/Item", 1, 0); node2.nodeListProperty("data").reparentHere(node3); node1.nodeListProperty("data").reparentHere(node2); @@ -6971,7 +6971,7 @@ void tst_TestCore::testRewriterNodeReparenting() rootNode.nodeListProperty("data").reparentHere(node1); expected = "\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " Item {\n" @@ -6991,11 +6991,11 @@ void tst_TestCore::testRewriterNodeReparenting() QCOMPARE(textEdit.toPlainText(), expected); // reparent out of the hierarchy - ModelNode node4 = view->createModelNode("Qt/Rectangle", 4, 7); + ModelNode node4 = view->createModelNode("QtQuick/Rectangle", 1, 0); node4.nodeListProperty("data").reparentHere(node1); expected = "\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " Item {\n" @@ -7011,7 +7011,7 @@ void tst_TestCore::testRewriterNodeReparenting() void tst_TestCore::testRewriterNodeReparentingWithTransaction() { const QLatin1String qmlString("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " id: rootItem\n" @@ -7028,7 +7028,7 @@ void tst_TestCore::testRewriterNodeReparentingWithTransaction() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -7041,17 +7041,17 @@ void tst_TestCore::testRewriterNodeReparentingWithTransaction() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QLatin1String("Qt/Rectangle")); + QCOMPARE(rootNode.type(), QLatin1String("QtQuick/Rectangle")); QCOMPARE(rootNode.id(), QLatin1String("rootItem")); ModelNode item1Node = rootNode.nodeListProperty("data").toModelNodeList().at(0); QVERIFY(item1Node.isValid()); - QCOMPARE(item1Node.type(), QLatin1String("Qt/Item")); + QCOMPARE(item1Node.type(), QLatin1String("QtQuick/Item")); QCOMPARE(item1Node.id(), QLatin1String("firstItem")); ModelNode item2Node = rootNode.nodeListProperty("data").toModelNodeList().at(1); QVERIFY(item2Node.isValid()); - QCOMPARE(item2Node.type(), QLatin1String("Qt/Item")); + QCOMPARE(item2Node.type(), QLatin1String("QtQuick/Item")); QCOMPARE(item2Node.id(), QLatin1String("secondItem")); RewriterTransaction transaction = testRewriterView->beginRewriterTransaction(); @@ -7062,7 +7062,7 @@ void tst_TestCore::testRewriterNodeReparentingWithTransaction() transaction.commit(); const QLatin1String expected("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " id: rootItem\n" @@ -7081,7 +7081,7 @@ void tst_TestCore::testRewriterNodeReparentingWithTransaction() void tst_TestCore::testRewriterMovingInOut() { const QLatin1String qmlString("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" "}"); @@ -7089,7 +7089,7 @@ void tst_TestCore::testRewriterMovingInOut() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -7102,13 +7102,13 @@ void tst_TestCore::testRewriterMovingInOut() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QString("Qt/Rectangle")); + QCOMPARE(rootNode.type(), QString("QtQuick/Rectangle")); - ModelNode newNode = view->createModelNode("Qt/MouseArea", 4, 7); + ModelNode newNode = view->createModelNode("QtQuick/MouseArea", 1, 0); rootNode.nodeListProperty(QLatin1String("data")).reparentHere(newNode); const QLatin1String expected1("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" "MouseArea {\n" @@ -7127,7 +7127,7 @@ void tst_TestCore::testRewriterMovingInOut() newNode.destroy(); const QLatin1String expected2("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" "}"); @@ -7137,7 +7137,7 @@ void tst_TestCore::testRewriterMovingInOut() void tst_TestCore::testRewriterMovingInOutWithTransaction() { const QLatin1String qmlString("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" "}"); @@ -7145,7 +7145,7 @@ void tst_TestCore::testRewriterMovingInOutWithTransaction() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -7158,11 +7158,11 @@ void tst_TestCore::testRewriterMovingInOutWithTransaction() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QString("Qt/Rectangle")); + QCOMPARE(rootNode.type(), QString("QtQuick/Rectangle")); RewriterTransaction transaction = view->beginRewriterTransaction(); - ModelNode newNode = view->createModelNode("Qt/MouseArea", 4, 7); + ModelNode newNode = view->createModelNode("QtQuick/MouseArea", 1, 0); rootNode.nodeListProperty(QLatin1String("data")).reparentHere(newNode); #define move(node, x, y) {\ @@ -7178,7 +7178,7 @@ void tst_TestCore::testRewriterMovingInOutWithTransaction() transaction.commit(); const QLatin1String expected2("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" "}"); @@ -7188,7 +7188,7 @@ void tst_TestCore::testRewriterMovingInOutWithTransaction() void tst_TestCore::testRewriterComplexMovingInOut() { const QLatin1String qmlString("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " Item {\n" @@ -7198,7 +7198,7 @@ void tst_TestCore::testRewriterComplexMovingInOut() textEdit.setPlainText(qmlString); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -7211,14 +7211,14 @@ void tst_TestCore::testRewriterComplexMovingInOut() ModelNode rootNode = view->rootModelNode(); QVERIFY(rootNode.isValid()); - QCOMPARE(rootNode.type(), QString("Qt/Rectangle")); + QCOMPARE(rootNode.type(), QString("QtQuick/Rectangle")); ModelNode itemNode = rootNode.nodeListProperty(QLatin1String("data")).toModelNodeList().at(0); - ModelNode newNode = view->createModelNode("Qt/MouseArea", 4, 7); + ModelNode newNode = view->createModelNode("QtQuick/MouseArea", 1, 0); rootNode.nodeListProperty(QLatin1String("data")).reparentHere(newNode); const QLatin1String expected1("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " Item {\n" @@ -7238,7 +7238,7 @@ void tst_TestCore::testRewriterComplexMovingInOut() move(newNode, 3, 3); const QLatin1String expected2("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " Item {\n" @@ -7254,7 +7254,7 @@ void tst_TestCore::testRewriterComplexMovingInOut() itemNode.nodeListProperty(QLatin1String("data")).reparentHere(newNode); const QLatin1String expected3("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " Item {\n" @@ -7274,7 +7274,7 @@ void tst_TestCore::testRewriterComplexMovingInOut() newNode.destroy(); const QLatin1String expected4("\n" - "import Qt 4.7\n" + "import QtQuick 1.0\n" "\n" "Rectangle {\n" " Item {\n" @@ -7286,10 +7286,10 @@ void tst_TestCore::testRewriterComplexMovingInOut() void tst_TestCore::removeCenteredInAnchorByDetaching() { QPlainTextEdit textEdit1; - textEdit1.setPlainText("import Qt 4.7; Item { Rectangle { id: child; anchors.centerIn: parent } }"); + textEdit1.setPlainText("import QtQuick 1.0; Item { Rectangle { id: child; anchors.centerIn: parent } }"); NotIndentingTextEditModifier modifier1(&textEdit1); - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QScopedPointer testRewriterView1(new TestRewriterView()); testRewriterView1->setTextModifier(&modifier1); @@ -7340,7 +7340,7 @@ void tst_TestCore::removeCenteredInAnchorByDetaching() void tst_TestCore::changePropertyBinding() { - QScopedPointer model(Model::create("Qt/Item")); + QScopedPointer model(Model::create("QtQuick/Item")); QVERIFY(model.data()); QScopedPointer view(new TestView(model.data())); @@ -7349,7 +7349,7 @@ void tst_TestCore::changePropertyBinding() ModelNode rootModelNode(view->rootModelNode()); rootModelNode.variantProperty("width") = 20; - ModelNode firstChild = addNodeListChild(rootModelNode, "Qt/Rectangle", 4, 7, "data"); + ModelNode firstChild = addNodeListChild(rootModelNode, "QtQuick/Rectangle", 1, 0, "data"); firstChild.bindingProperty("width").setExpression(QString("parent.width")); firstChild.variantProperty("height")= 10; QVERIFY(firstChild.isValid()); @@ -7389,7 +7389,7 @@ void tst_TestCore::loadTestFiles() textEdit.setPlainText(QString(file.readAll())); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer testRewriterView(new TestRewriterView()); @@ -7400,7 +7400,7 @@ void tst_TestCore::loadTestFiles() QVERIFY(model.data()); ModelNode rootModelNode(testRewriterView->rootModelNode()); QVERIFY(rootModelNode.isValid()); - QCOMPARE(rootModelNode.type(), QLatin1String("Qt/Item")); + QCOMPARE(rootModelNode.type(), QLatin1String("QtQuick/Item")); QVERIFY(rootModelNode.allDirectSubModelNodes().isEmpty()); } @@ -7412,7 +7412,7 @@ void tst_TestCore::loadTestFiles() textEdit.setPlainText(QString(file.readAll())); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer testRewriterView(new TestRewriterView()); @@ -7423,14 +7423,14 @@ void tst_TestCore::loadTestFiles() QVERIFY(model.data()); ModelNode rootModelNode(testRewriterView->rootModelNode()); QVERIFY(rootModelNode.isValid()); - QCOMPARE(rootModelNode.type(), QLatin1String("Qt/Rectangle")); + QCOMPARE(rootModelNode.type(), QLatin1String("QtQuick/Rectangle")); QCOMPARE(rootModelNode.allDirectSubModelNodes().count(), 1); QCOMPARE(rootModelNode.variantProperty("width").value().toInt(), 200); QCOMPARE(rootModelNode.variantProperty("height").value().toInt(), 200); ModelNode textNode(rootModelNode.allDirectSubModelNodes().first()); QVERIFY(textNode.isValid()); - QCOMPARE(textNode.type(), QLatin1String("Qt/Text")); + QCOMPARE(textNode.type(), QLatin1String("QtQuick/Text")); QCOMPARE(textNode.variantProperty("x").value().toInt(), 66); QCOMPARE(textNode.variantProperty("y").value().toInt(), 93); } @@ -7442,7 +7442,7 @@ void tst_TestCore::loadTestFiles() textEdit.setPlainText(QString(file.readAll())); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer testRewriterView(new TestRewriterView()); @@ -7453,7 +7453,7 @@ void tst_TestCore::loadTestFiles() QVERIFY(model.data()); ModelNode rootModelNode(testRewriterView->rootModelNode()); QVERIFY(rootModelNode.isValid()); - QCOMPARE(rootModelNode.type(), QLatin1String("Qt/Rectangle")); + QCOMPARE(rootModelNode.type(), QLatin1String("QtQuick/Rectangle")); QCOMPARE(rootModelNode.allDirectSubModelNodes().count(), 4); QCOMPARE(rootModelNode.variantProperty("width").value().toInt(), 200); QCOMPARE(rootModelNode.variantProperty("height").value().toInt(), 200); @@ -7464,14 +7464,14 @@ void tst_TestCore::loadTestFiles() ModelNode textNode(rootModelNode.nodeListProperty("data").toModelNodeList().first()); QVERIFY(textNode.isValid()); QCOMPARE(textNode.id(), QLatin1String("text")); - QCOMPARE(textNode.type(), QLatin1String("Qt/Text")); + QCOMPARE(textNode.type(), QLatin1String("QtQuick/Text")); QCOMPARE(textNode.variantProperty("x").value().toInt(), 66); QCOMPARE(textNode.variantProperty("y").value().toInt(), 93); ModelNode imageNode(rootModelNode.nodeListProperty("data").toModelNodeList().last()); QVERIFY(imageNode.isValid()); QCOMPARE(imageNode.id(), QLatin1String("image1")); - QCOMPARE(imageNode.type(), QLatin1String("Qt/Image")); + QCOMPARE(imageNode.type(), QLatin1String("QtQuick/Image")); QCOMPARE(imageNode.variantProperty("x").value().toInt(), 41); QCOMPARE(imageNode.variantProperty("y").value().toInt(), 46); QCOMPARE(imageNode.variantProperty("source").value().toUrl(), QUrl("images/qtcreator.png")); @@ -7491,7 +7491,7 @@ void tst_TestCore::loadTestFiles() textEdit.setPlainText(QString(file.readAll())); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer testRewriterView(new TestRewriterView()); @@ -7503,12 +7503,12 @@ void tst_TestCore::loadTestFiles() QVERIFY(model.data()); ModelNode rootModelNode(testRewriterView->rootModelNode()); QVERIFY(rootModelNode.isValid()); - QCOMPARE(rootModelNode.type(), QLatin1String("Qt/Rectangle")); + QCOMPARE(rootModelNode.type(), QLatin1String("QtQuick/Rectangle")); QVERIFY(!rootModelNode.allDirectSubModelNodes().isEmpty()); } } -static QString rectWithGradient = "import Qt 4.7\n" +static QString rectWithGradient = "import QtQuick 1.0\n" "Rectangle {\n" " gradient: Gradient {\n" " id: pGradient\n" @@ -7528,7 +7528,7 @@ void tst_TestCore::loadGradient() textEdit.setPlainText(rectWithGradient); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer testRewriterView(new TestRewriterView()); @@ -7547,7 +7547,7 @@ void tst_TestCore::loadGradient() QVERIFY(gradientProperty.isNodeProperty()); ModelNode gradientPropertyModelNode = gradientProperty.toNodeProperty().modelNode(); QVERIFY(gradientPropertyModelNode.isValid()); - QCOMPARE(gradientPropertyModelNode.type(), QString("Qt/Gradient")); + QCOMPARE(gradientPropertyModelNode.type(), QString("QtQuick/Gradient")); QCOMPARE(gradientPropertyModelNode.allDirectSubModelNodes().size(), 2); AbstractProperty stopsProperty = gradientPropertyModelNode.property("stops"); @@ -7560,7 +7560,7 @@ void tst_TestCore::loadGradient() ModelNode pOne = stops.first(); ModelNode pTwo = stops.last(); - QCOMPARE(pOne.type(), QString("Qt/GradientStop")); + QCOMPARE(pOne.type(), QString("QtQuick/GradientStop")); QCOMPARE(pOne.id(), QString("pOne")); QCOMPARE(pOne.allDirectSubModelNodes().size(), 0); QCOMPARE(pOne.propertyNames().size(), 2); @@ -7569,7 +7569,7 @@ void tst_TestCore::loadGradient() QCOMPARE(pOne.variantProperty("color").value().type(), QVariant::Color); QCOMPARE(pOne.variantProperty("color").value().value(), QColor("lightsteelblue")); - QCOMPARE(pTwo.type(), QString("Qt/GradientStop")); + QCOMPARE(pTwo.type(), QString("QtQuick/GradientStop")); QCOMPARE(pTwo.id(), QString("pTwo")); QCOMPARE(pTwo.allDirectSubModelNodes().size(), 0); QCOMPARE(pTwo.propertyNames().size(), 2); @@ -7582,8 +7582,8 @@ void tst_TestCore::loadGradient() { ModelNode gradientNode = rootModelNode.allDirectSubModelNodes().last(); QVERIFY(gradientNode.isValid()); - QVERIFY(!gradientNode.metaInfo().isSubclassOf("Qt/Item", -1, -1)); - QCOMPARE(gradientNode.type(), QString("Qt/Gradient")); + QVERIFY(!gradientNode.metaInfo().isSubclassOf("QtQuick/Item", -1, -1)); + QCOMPARE(gradientNode.type(), QString("QtQuick/Gradient")); QCOMPARE(gradientNode.id(), QString("secondGradient")); QCOMPARE(gradientNode.allDirectSubModelNodes().size(), 2); @@ -7597,7 +7597,7 @@ void tst_TestCore::loadGradient() ModelNode nOne = stops.first(); ModelNode nTwo = stops.last(); - QCOMPARE(nOne.type(), QString("Qt/GradientStop")); + QCOMPARE(nOne.type(), QString("QtQuick/GradientStop")); QCOMPARE(nOne.id(), QString("nOne")); QCOMPARE(nOne.allDirectSubModelNodes().size(), 0); QCOMPARE(nOne.propertyNames().size(), 2); @@ -7606,7 +7606,7 @@ void tst_TestCore::loadGradient() QCOMPARE(nOne.variantProperty("color").value().type(), QVariant::Color); QCOMPARE(nOne.variantProperty("color").value().value(), QColor("blue")); - QCOMPARE(nTwo.type(), QString("Qt/GradientStop")); + QCOMPARE(nTwo.type(), QString("QtQuick/GradientStop")); QCOMPARE(nTwo.id(), QString("nTwo")); QCOMPARE(nTwo.allDirectSubModelNodes().size(), 0); QCOMPARE(nTwo.propertyNames().size(), 2); @@ -7624,7 +7624,7 @@ void tst_TestCore::changeGradientId() textEdit.setPlainText(rectWithGradient); NotIndentingTextEditModifier textModifier(&textEdit); - QScopedPointer model(Model::create("Qt/Item", 4, 7)); + QScopedPointer model(Model::create("QtQuick/Item", 1, 0)); QVERIFY(model.data()); QScopedPointer testRewriterView(new TestRewriterView()); @@ -7657,7 +7657,7 @@ void tst_TestCore::changeGradientId() firstStop.destroy(); QVERIFY(!firstStop.isValid()); - ModelNode gradientStop = addNodeListChild(gradientNode, "Qt/GradientStop", 4, 7, "stops"); + ModelNode gradientStop = addNodeListChild(gradientNode, "QtQuick/GradientStop", 1, 0, "stops"); gradientStop.variantProperty("position") = 0.5; gradientStop.variantProperty("color") = QColor("yellow"); diff --git a/tests/auto/qml/qmldesigner/data/fx/attributes.qml b/tests/auto/qml/qmldesigner/data/fx/attributes.qml index e2d4ed37c41..d58d77908b5 100644 --- a/tests/auto/qml/qmldesigner/data/fx/attributes.qml +++ b/tests/auto/qml/qmldesigner/data/fx/attributes.qml @@ -1,4 +1,4 @@ -import Qt 4.7 +import QtQuick 1.0 Item { id: id; diff --git a/tests/auto/qml/qmldesigner/data/fx/empty.qml b/tests/auto/qml/qmldesigner/data/fx/empty.qml index dd9e9ea1930..f6760b6a9fa 100644 --- a/tests/auto/qml/qmldesigner/data/fx/empty.qml +++ b/tests/auto/qml/qmldesigner/data/fx/empty.qml @@ -1,4 +1,4 @@ -import Qt 4.7 +import QtQuick 1.0 Item { } diff --git a/tests/auto/qml/qmldesigner/data/fx/helloworld.qml b/tests/auto/qml/qmldesigner/data/fx/helloworld.qml index bc17ab1b27d..d225c436306 100644 --- a/tests/auto/qml/qmldesigner/data/fx/helloworld.qml +++ b/tests/auto/qml/qmldesigner/data/fx/helloworld.qml @@ -1,4 +1,4 @@ -import Qt 4.7 +import QtQuick 1.0 Rectangle { width: 200 diff --git a/tests/auto/qml/qmldesigner/data/fx/properties.qml b/tests/auto/qml/qmldesigner/data/fx/properties.qml index 12b79f63f80..e9078ff8e76 100644 --- a/tests/auto/qml/qmldesigner/data/fx/properties.qml +++ b/tests/auto/qml/qmldesigner/data/fx/properties.qml @@ -1,4 +1,4 @@ -import Qt 4.7 +import QtQuick 1.0 Item { property bool pushed diff --git a/tests/auto/qml/qmldesigner/data/fx/states.qml b/tests/auto/qml/qmldesigner/data/fx/states.qml index 2e50ca9b7be..836e0ca0173 100644 --- a/tests/auto/qml/qmldesigner/data/fx/states.qml +++ b/tests/auto/qml/qmldesigner/data/fx/states.qml @@ -1,4 +1,4 @@ -import Qt 4.7 +import QtQuick 1.0 Rectangle { id: rect diff --git a/tests/auto/qml/qmldesigner/data/fx/topitem.qml b/tests/auto/qml/qmldesigner/data/fx/topitem.qml index 244a7ac6f3e..84ef3c829c8 100644 --- a/tests/auto/qml/qmldesigner/data/fx/topitem.qml +++ b/tests/auto/qml/qmldesigner/data/fx/topitem.qml @@ -1,5 +1,5 @@ -import Qt 4.7 -import Qt 4.7 as Qt46 +import QtQuick 1.0 +import QtQuick 1.0 as Qt46 import "subitems" import "subitems" as Subdir From 141ca58827a543cbe00bd8db2bd092715a47ef78 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Mon, 27 Sep 2010 12:45:56 +0200 Subject: [PATCH 071/118] QmlJSDebugClient: Update library to latest changes in qt Protocol / classes changed with commit fd9771c29d Reviewed-by: Christiaan Janssen --- .../qmljsdebugclient/qdeclarativedebug.cpp | 149 +++++++------ .../qmljsdebugclient/qdeclarativedebug_p.h | 12 +- .../qdeclarativedebugclient.cpp | 199 +++++++++++++----- .../qdeclarativedebugclient_p.h | 9 +- .../debugger/qml/qmldebuggerclient.cpp | 1 - .../qmljsinspector/qmljsobserverclient.cpp | 1 - 6 files changed, 242 insertions(+), 129 deletions(-) diff --git a/src/libs/qmljsdebugclient/qdeclarativedebug.cpp b/src/libs/qmljsdebugclient/qdeclarativedebug.cpp index 1c78a7c91cf..e3b653008ec 100644 --- a/src/libs/qmljsdebugclient/qdeclarativedebug.cpp +++ b/src/libs/qmljsdebugclient/qdeclarativedebug.cpp @@ -51,18 +51,22 @@ public: QDeclarativeEngineDebugClient(QDeclarativeDebugConnection *client, QDeclarativeEngineDebugPrivate *p); protected: + virtual void statusChanged(Status status); virtual void messageReceived(const QByteArray &); private: QDeclarativeEngineDebugPrivate *priv; + friend class QDeclarativeEngineDebugPrivate; }; class QDeclarativeEngineDebugPrivate { // Q_DECLARE_PUBLIC(QDeclarativeEngineDebug) public: - QDeclarativeEngineDebugPrivate(QDeclarativeDebugConnection *); + QDeclarativeEngineDebugPrivate(QDeclarativeEngineDebug *, QDeclarativeDebugConnection *); + ~QDeclarativeEngineDebugPrivate(); + void statusChanged(QDeclarativeEngineDebug::Status status); void message(const QByteArray &); QDeclarativeEngineDebugClient *client; @@ -90,19 +94,31 @@ QDeclarativeEngineDebugClient::QDeclarativeEngineDebugClient(QDeclarativeDebugCo QDeclarativeEngineDebugPrivate *p) : QDeclarativeDebugClient(QLatin1String("QDeclarativeEngine"), client), priv(p) { - setEnabled(true); +} + +void QDeclarativeEngineDebugClient::statusChanged(Status status) +{ + if (priv) + priv->statusChanged(static_cast(status)); } void QDeclarativeEngineDebugClient::messageReceived(const QByteArray &data) { - priv->message(data); + if (priv) + priv->message(data); } -QDeclarativeEngineDebugPrivate::QDeclarativeEngineDebugPrivate(QDeclarativeDebugConnection *c) -: client(new QDeclarativeEngineDebugClient(c, this)), nextId(0) +QDeclarativeEngineDebugPrivate::QDeclarativeEngineDebugPrivate(QDeclarativeEngineDebug *q, QDeclarativeDebugConnection *c) +: client(new QDeclarativeEngineDebugClient(c, this)), q_ptr(q), nextId(0) { } +QDeclarativeEngineDebugPrivate::~QDeclarativeEngineDebugPrivate() +{ + if (client) + client->priv = 0; +} + int QDeclarativeEngineDebugPrivate::getId() { return nextId++; @@ -116,7 +132,7 @@ void QDeclarativeEngineDebugPrivate::remove(QDeclarativeEngineDebug *c, QDeclara } } -void QDeclarativeEngineDebugPrivate::remove(QDeclarativeEngineDebug *c, +void QDeclarativeEngineDebugPrivate::remove(QDeclarativeEngineDebug *c, QDeclarativeDebugRootContextQuery *q) { if (c && q) { @@ -125,6 +141,44 @@ void QDeclarativeEngineDebugPrivate::remove(QDeclarativeEngineDebug *c, } } +// from qdeclarativeenginedebug_p.h +struct QDeclarativeObjectData { + QUrl url; + int lineNumber; + int columnNumber; + QString idString; + QString objectName; + QString objectType; + int objectId; + int contextId; +}; + +QDataStream &operator>>(QDataStream &ds, QDeclarativeObjectData &data) +{ + ds >> data.url >> data.lineNumber >> data.columnNumber >> data.idString + >> data.objectName >> data.objectType >> data.objectId >> data.contextId; + return ds; +} + +struct QDeclarativeObjectProperty { + enum Type { Unknown, Basic, Object, List, SignalProperty }; + Type type; + QString name; + QVariant value; + QString valueTypeName; + QString binding; + bool hasNotifySignal; +}; + +QDataStream &operator>>(QDataStream &ds, QDeclarativeObjectProperty &data) +{ + int type; + ds >> type >> data.name >> data.value >> data.valueTypeName + >> data.binding >> data.hasNotifySignal; + data.type = (QDeclarativeObjectProperty::Type)type; + return ds; +} + void QDeclarativeEngineDebugPrivate::remove(QDeclarativeEngineDebug *c, QDeclarativeDebugObjectQuery *q) { if (c && q) { @@ -141,41 +195,6 @@ void QDeclarativeEngineDebugPrivate::remove(QDeclarativeEngineDebug *c, QDeclara } } -//from qdeclarativeenginedebug.cpp -struct QDeclarativeObjectData { - QUrl url; - int lineNumber; - int columnNumber; - QString idString; - QString objectName; - QString objectType; - int objectId; - int contextId; -}; -QDataStream &operator>>(QDataStream &ds, QDeclarativeObjectData &data) -{ - ds >> data.url >> data.lineNumber >> data.columnNumber >> data.idString - >> data.objectName >> data.objectType >> data.objectId >> data.contextId; - return ds; -} -struct QDeclarativeObjectProperty { - enum Type { Unknown, Basic, Object, List, SignalProperty }; - Type type; - QString name; - QVariant value; - QString valueTypeName; - QString binding; - bool hasNotifySignal; -}; -QDataStream &operator>>(QDataStream &ds, QDeclarativeObjectProperty &data) -{ - int type; - ds >> type >> data.name >> data.value >> data.valueTypeName - >> data.binding >> data.hasNotifySignal; - data.type = (QDeclarativeObjectProperty::Type)type; - return ds; -} - void QDeclarativeEngineDebugPrivate::decode(QDataStream &ds, QDeclarativeDebugObjectReference &o, bool simple) { @@ -260,6 +279,11 @@ void QDeclarativeEngineDebugPrivate::decode(QDataStream &ds, QDeclarativeDebugCo } } +void QDeclarativeEngineDebugPrivate::statusChanged(QDeclarativeEngineDebug::Status status) +{ + emit q_ptr->statusChanged(status); +} + void QDeclarativeEngineDebugPrivate::message(const QByteArray &data) { QDataStream ds(data); @@ -378,18 +402,25 @@ void QDeclarativeEngineDebugPrivate::message(const QByteArray &data) } QDeclarativeEngineDebug::QDeclarativeEngineDebug(QDeclarativeDebugConnection *client, QObject *parent) -: QObject(parent), d_ptr(new QDeclarativeEngineDebugPrivate(client)) +: QObject(parent), d_ptr(new QDeclarativeEngineDebugPrivate(this, client)) { - d_ptr->q_ptr = this; } -QDeclarativeEngineDebug::~QDeclarativeEngineDebug() {} + +QDeclarativeEngineDebug::~QDeclarativeEngineDebug() { } + +QDeclarativeEngineDebug::Status QDeclarativeEngineDebug::status() const +{ + Q_D(const QDeclarativeEngineDebug); + + return static_cast(d->client->status()); +} QDeclarativeDebugPropertyWatch *QDeclarativeEngineDebug::addWatch(const QDeclarativeDebugPropertyReference &property, QObject *parent) { Q_D(QDeclarativeEngineDebug); QDeclarativeDebugPropertyWatch *watch = new QDeclarativeDebugPropertyWatch(parent); - if (d->client->isConnected()) { + if (d->client->status() == QDeclarativeDebugClient::Enabled) { int queryId = d->getId(); watch->m_queryId = queryId; watch->m_client = this; @@ -418,7 +449,7 @@ QDeclarativeDebugObjectExpressionWatch *QDeclarativeEngineDebug::addWatch(const { Q_D(QDeclarativeEngineDebug); QDeclarativeDebugObjectExpressionWatch *watch = new QDeclarativeDebugObjectExpressionWatch(parent); - if (d->client->isConnected()) { + if (d->client->status() == QDeclarativeDebugClient::Enabled) { int queryId = d->getId(); watch->m_queryId = queryId; watch->m_client = this; @@ -441,7 +472,7 @@ QDeclarativeDebugWatch *QDeclarativeEngineDebug::addWatch(const QDeclarativeDebu Q_D(QDeclarativeEngineDebug); QDeclarativeDebugWatch *watch = new QDeclarativeDebugWatch(parent); - if (d->client->isConnected()) { + if (d->client->status() == QDeclarativeDebugClient::Enabled) { int queryId = d->getId(); watch->m_queryId = queryId; watch->m_client = this; @@ -477,7 +508,7 @@ void QDeclarativeEngineDebug::removeWatch(QDeclarativeDebugWatch *watch) d->watched.remove(watch->queryId()); - if (d->client && d->client->isConnected()) { + if (d->client && d->client->status() == QDeclarativeDebugClient::Enabled) { QByteArray message; QDataStream ds(&message, QIODevice::WriteOnly); ds << QByteArray("NO_WATCH") << watch->queryId(); @@ -490,7 +521,7 @@ QDeclarativeDebugEnginesQuery *QDeclarativeEngineDebug::queryAvailableEngines(QO Q_D(QDeclarativeEngineDebug); QDeclarativeDebugEnginesQuery *query = new QDeclarativeDebugEnginesQuery(parent); - if (d->client->isConnected()) { + if (d->client->status() == QDeclarativeDebugClient::Enabled) { query->m_client = this; int queryId = d->getId(); query->m_queryId = queryId; @@ -512,7 +543,7 @@ QDeclarativeDebugRootContextQuery *QDeclarativeEngineDebug::queryRootContexts(co Q_D(QDeclarativeEngineDebug); QDeclarativeDebugRootContextQuery *query = new QDeclarativeDebugRootContextQuery(parent); - if (d->client->isConnected() && engine.debugId() != -1) { + if (d->client->status() == QDeclarativeDebugClient::Enabled && engine.debugId() != -1) { query->m_client = this; int queryId = d->getId(); query->m_queryId = queryId; @@ -534,7 +565,7 @@ QDeclarativeDebugObjectQuery *QDeclarativeEngineDebug::queryObject(const QDeclar Q_D(QDeclarativeEngineDebug); QDeclarativeDebugObjectQuery *query = new QDeclarativeDebugObjectQuery(parent); - if (d->client->isConnected() && object.debugId() != -1) { + if (d->client->status() == QDeclarativeDebugClient::Enabled && object.debugId() != -1) { query->m_client = this; int queryId = d->getId(); query->m_queryId = queryId; @@ -557,7 +588,7 @@ QDeclarativeDebugObjectQuery *QDeclarativeEngineDebug::queryObjectRecursive(cons Q_D(QDeclarativeEngineDebug); QDeclarativeDebugObjectQuery *query = new QDeclarativeDebugObjectQuery(parent); - if (d->client->isConnected() && object.debugId() != -1) { + if (d->client->status() == QDeclarativeDebugClient::Enabled && object.debugId() != -1) { query->m_client = this; int queryId = d->getId(); query->m_queryId = queryId; @@ -566,9 +597,7 @@ QDeclarativeDebugObjectQuery *QDeclarativeEngineDebug::queryObjectRecursive(cons QByteArray message; QDataStream ds(&message, QIODevice::WriteOnly); ds << QByteArray("FETCH_OBJECT") << queryId << object.debugId() - << true << true; // Note: dumping all the properties is slow, and make noticable lags. - // TODO: Find an alternative to this when they are needed by the live preview - + << true << true; d->client->sendMessage(message); } else { query->m_state = QDeclarativeDebugQuery::Error; @@ -582,7 +611,7 @@ QDeclarativeDebugExpressionQuery *QDeclarativeEngineDebug::queryExpressionResult Q_D(QDeclarativeEngineDebug); QDeclarativeDebugExpressionQuery *query = new QDeclarativeDebugExpressionQuery(parent); - if (d->client->isConnected() && objectDebugId != -1) { + if (d->client->status() == QDeclarativeDebugClient::Enabled && objectDebugId != -1) { query->m_client = this; query->m_expr = expr; int queryId = d->getId(); @@ -606,7 +635,7 @@ bool QDeclarativeEngineDebug::setBindingForObject(int objectDebugId, const QStri { Q_D(QDeclarativeEngineDebug); - if (d->client->isConnected() && objectDebugId != -1) { + if (d->client->status() == QDeclarativeDebugClient::Enabled && objectDebugId != -1) { QByteArray message; QDataStream ds(&message, QIODevice::WriteOnly); ds << QByteArray("SET_BINDING") << objectDebugId << propertyName << bindingExpression << isLiteralValue; @@ -621,7 +650,7 @@ bool QDeclarativeEngineDebug::resetBindingForObject(int objectDebugId, const QSt { Q_D(QDeclarativeEngineDebug); - if (d->client->isConnected() && objectDebugId != -1) { + if (d->client->status() == QDeclarativeDebugClient::Enabled && objectDebugId != -1) { QByteArray message; QDataStream ds(&message, QIODevice::WriteOnly); ds << QByteArray("RESET_BINDING") << objectDebugId << propertyName; @@ -637,7 +666,7 @@ bool QDeclarativeEngineDebug::setMethodBody(int objectDebugId, const QString &me { Q_D(QDeclarativeEngineDebug); - if (d->client->isConnected() && objectDebugId != -1) { + if (d->client->status() == QDeclarativeDebugClient::Enabled && objectDebugId != -1) { QByteArray message; QDataStream ds(&message, QIODevice::WriteOnly); ds << QByteArray("SET_METHOD_BODY") << objectDebugId << methodName << methodBody; @@ -701,6 +730,7 @@ QString QDeclarativeDebugObjectExpressionWatch::expression() const return m_expr; } + QDeclarativeDebugQuery::QDeclarativeDebugQuery(QObject *parent) : QObject(parent), m_state(Waiting) { @@ -1025,4 +1055,3 @@ bool QDeclarativeDebugPropertyReference::hasNotifySignal() const } } - diff --git a/src/libs/qmljsdebugclient/qdeclarativedebug_p.h b/src/libs/qmljsdebugclient/qdeclarativedebug_p.h index 982e581f690..dfb880250ee 100644 --- a/src/libs/qmljsdebugclient/qdeclarativedebug_p.h +++ b/src/libs/qmljsdebugclient/qdeclarativedebug_p.h @@ -63,15 +63,18 @@ class QDeclarativeDebugObjectReference; class QDeclarativeDebugFileReference; class QDeclarativeDebugEngineReference; class QDeclarativeEngineDebugPrivate; -class QDeclarativeEngineDebug; class QDeclarativeEngineDebug : public QObject { Q_OBJECT public: + enum Status { NotConnected, Unavailable, Enabled }; + explicit QDeclarativeEngineDebug(QDeclarativeDebugConnection *, QObject * = 0); ~QDeclarativeEngineDebug(); + Status status() const; + QDeclarativeDebugPropertyWatch *addWatch(const QDeclarativeDebugPropertyReference &, QObject *parent = 0); QDeclarativeDebugWatch *addWatch(const QDeclarativeDebugContextReference &, const QString &, @@ -100,16 +103,15 @@ public: bool resetBindingForObject(int objectDebugId, const QString &propertyName); bool setMethodBody(int objectDebugId, const QString &methodName, const QString &methodBody); -signals: +Q_SIGNALS: void newObjects(); + void statusChanged(Status status); private: Q_DECLARE_PRIVATE(QDeclarativeEngineDebug) - Q_DISABLE_COPY(QDeclarativeEngineDebug) QScopedPointer d_ptr; }; - class QDeclarativeDebugWatch : public QObject { Q_OBJECT @@ -368,7 +370,6 @@ private: int m_queryId; QVariant m_expr; QVariant m_result; - }; } @@ -378,6 +379,5 @@ Q_DECLARE_METATYPE(QmlJsDebugClient::QDeclarativeDebugObjectReference) Q_DECLARE_METATYPE(QmlJsDebugClient::QDeclarativeDebugContextReference) Q_DECLARE_METATYPE(QmlJsDebugClient::QDeclarativeDebugPropertyReference) -QT_END_HEADER #endif // QDECLARATIVEDEBUG_H diff --git a/src/libs/qmljsdebugclient/qdeclarativedebugclient.cpp b/src/libs/qmljsdebugclient/qdeclarativedebugclient.cpp index 7fa4ef3004a..a78575a54ca 100644 --- a/src/libs/qmljsdebugclient/qdeclarativedebugclient.cpp +++ b/src/libs/qmljsdebugclient/qdeclarativedebugclient.cpp @@ -48,6 +48,20 @@ namespace QmlJsDebugClient { +const int protocolVersion = 1; +const QString serverId = QLatin1String("QDeclarativeDebugServer"); +const QString clientId = QLatin1String("QDeclarativeDebugClient"); + +class QDeclarativeDebugClientPrivate +{ +// Q_DECLARE_PUBLIC(QDeclarativeDebugClient) +public: + QDeclarativeDebugClientPrivate(); + + QString name; + QDeclarativeDebugConnection *client; +}; + class QDeclarativeDebugConnectionPrivate : public QObject { Q_OBJECT @@ -56,40 +70,123 @@ public: QDeclarativeDebugConnection *q; QPacketProtocol *protocol; - QStringList enabled; + bool gotHello; + QStringList serverPlugins; QHash plugins; + + void advertisePlugins(); + public Q_SLOTS: void connected(); void readyRead(); }; QDeclarativeDebugConnectionPrivate::QDeclarativeDebugConnectionPrivate(QDeclarativeDebugConnection *c) -: QObject(c), q(c), protocol(0) +: QObject(c), q(c), protocol(0), gotHello(false) { protocol = new QPacketProtocol(q, this); QObject::connect(c, SIGNAL(connected()), this, SLOT(connected())); QObject::connect(protocol, SIGNAL(readyRead()), this, SLOT(readyRead())); } +void QDeclarativeDebugConnectionPrivate::advertisePlugins() +{ + if (!q->isConnected() || !gotHello) + return; + + QPacket pack; + pack << serverId << 1 << plugins.keys(); + protocol->send(pack); + q->flush(); +} + void QDeclarativeDebugConnectionPrivate::connected() { QPacket pack; - pack << QString(QLatin1String("QDeclarativeDebugServer")) << enabled; + pack << serverId << 0 << protocolVersion << plugins.keys(); protocol->send(pack); + q->flush(); } void QDeclarativeDebugConnectionPrivate::readyRead() { - QPacket pack = protocol->read(); - QString name; QByteArray message; - pack >> name >> message; + if (!gotHello) { + QPacket pack = protocol->read(); + QString name; - QHash::Iterator iter = - plugins.find(name); - if (iter == plugins.end()) { - qWarning() << "QDeclarativeDebugConnection: Message received for missing plugin" << name; - } else { - (*iter)->messageReceived(message); + pack >> name; + + bool validHello = false; + if (name == clientId) { + int op = -1; + pack >> op; + if (op == 0) { + int version = -1; + pack >> version; + if (version == protocolVersion) { + pack >> serverPlugins; + validHello = true; + } + } + } + + if (!validHello) { + qWarning("QDeclarativeDebugConnection: Invalid hello message"); + QObject::disconnect(protocol, SIGNAL(readyRead()), this, SLOT(readyRead())); + return; + } + gotHello = true; + + QHash::Iterator iter = plugins.begin(); + for (; iter != plugins.end(); ++iter) { + QDeclarativeDebugClient::Status newStatus = QDeclarativeDebugClient::Unavailable; + if (serverPlugins.contains(iter.key())) + newStatus = QDeclarativeDebugClient::Enabled; + iter.value()->statusChanged(newStatus); + } + } + + while (protocol->packetsAvailable()) { + QPacket pack = protocol->read(); + QString name; + pack >> name; + + if (name == clientId) { + int op = -1; + pack >> op; + + if (op == 1) { + // Service Discovery + QStringList oldServerPlugins = serverPlugins; + pack >> serverPlugins; + + QHash::Iterator iter = plugins.begin(); + for (; iter != plugins.end(); ++iter) { + const QString pluginName = iter.key(); + QDeclarativeDebugClient::Status newStatus = QDeclarativeDebugClient::Unavailable; + if (serverPlugins.contains(pluginName)) + newStatus = QDeclarativeDebugClient::Enabled; + + if (oldServerPlugins.contains(pluginName) + != serverPlugins.contains(pluginName)) { + iter.value()->statusChanged(newStatus); + } + } + } else { + qWarning() << "QDeclarativeDebugConnection: Unknown control message id" << op; + } + } else { + QByteArray message; + pack >> message; + + QHash::Iterator iter = + plugins.find(name); + if (iter == plugins.end()) { + qWarning() << "QDeclarativeDebugConnection: Message received for missing plugin" << name; + } else { + (*iter)->messageReceived(message); + } + } } } @@ -98,29 +195,28 @@ QDeclarativeDebugConnection::QDeclarativeDebugConnection(QObject *parent) { } +QDeclarativeDebugConnection::~QDeclarativeDebugConnection() +{ + QHash::iterator iter = d->plugins.begin(); + for (; iter != d->plugins.end(); ++iter) { + iter.value()->d_func()->client = 0; + iter.value()->statusChanged(QDeclarativeDebugClient::NotConnected); + } +} + bool QDeclarativeDebugConnection::isConnected() const { return state() == ConnectedState; } -class QDeclarativeDebugClientPrivate -{ -public: - QDeclarativeDebugClientPrivate(); - - QString name; - QDeclarativeDebugConnection *client; - bool enabled; -}; - QDeclarativeDebugClientPrivate::QDeclarativeDebugClientPrivate() -: client(0), enabled(false) +: client(0) { } QDeclarativeDebugClient::QDeclarativeDebugClient(const QString &name, QDeclarativeDebugConnection *parent) - : QObject(parent), d(new QDeclarativeDebugClientPrivate) +: QObject(parent), d(new QDeclarativeDebugClientPrivate()) { d->name = name; d->client = parent; @@ -133,60 +229,49 @@ QDeclarativeDebugClient::QDeclarativeDebugClient(const QString &name, d->client = 0; } else { d->client->d->plugins.insert(name, this); + d->client->d->advertisePlugins(); } } -QDeclarativeDebugClient::~QDeclarativeDebugClient() {} +QDeclarativeDebugClient::~QDeclarativeDebugClient() +{ + if (d->client && d->client->d) { + d->client->d->plugins.remove(d->name); + d->client->d->advertisePlugins(); + } +} QString QDeclarativeDebugClient::name() const { return d->name; } -bool QDeclarativeDebugClient::isEnabled() const +QDeclarativeDebugClient::Status QDeclarativeDebugClient::status() const { - return d->enabled; -} + if (!d->client + || !d->client->isConnected() + || !d->client->d->gotHello) + return NotConnected; -void QDeclarativeDebugClient::setEnabled(bool e) -{ - if (e == d->enabled) - return; + if (d->client->d->serverPlugins.contains(d->name)) + return Enabled; - d->enabled = e; - - if (d->client) { - if (e) - d->client->d->enabled.append(d->name); - else - d->client->d->enabled.removeAll(d->name); - - if (d->client->state() == QTcpSocket::ConnectedState) { - QPacket pack; - pack << QString(QLatin1String("QDeclarativeDebugServer")); - if (e) pack << (int)1; - else pack << (int)2; - pack << d->name; - d->client->d->protocol->send(pack); - } - } -} - -bool QDeclarativeDebugClient::isConnected() const -{ - if (!d->client) - return false; - return d->client->isConnected(); + return Unavailable; } void QDeclarativeDebugClient::sendMessage(const QByteArray &message) { - if (!d->client || !d->client->isConnected()) + if (status() != Enabled) return; QPacket pack; pack << d->name << message; d->client->d->protocol->send(pack); + d->client->flush(); +} + +void QDeclarativeDebugClient::statusChanged(Status) +{ } void QDeclarativeDebugClient::messageReceived(const QByteArray &) diff --git a/src/libs/qmljsdebugclient/qdeclarativedebugclient_p.h b/src/libs/qmljsdebugclient/qdeclarativedebugclient_p.h index ffc3b0d8449..f29e58a1b25 100644 --- a/src/libs/qmljsdebugclient/qdeclarativedebugclient_p.h +++ b/src/libs/qmljsdebugclient/qdeclarativedebugclient_p.h @@ -55,6 +55,7 @@ class QDeclarativeDebugConnection : public QTcpSocket Q_DISABLE_COPY(QDeclarativeDebugConnection) public: QDeclarativeDebugConnection(QObject * = 0); + ~QDeclarativeDebugConnection(); bool isConnected() const; private: @@ -71,19 +72,19 @@ class QDeclarativeDebugClient : public QObject Q_DISABLE_COPY(QDeclarativeDebugClient) public: + enum Status { NotConnected, Unavailable, Enabled }; + QDeclarativeDebugClient(const QString &, QDeclarativeDebugConnection *parent); ~QDeclarativeDebugClient(); QString name() const; - bool isEnabled() const; - void setEnabled(bool); - - bool isConnected() const; + Status status() const; void sendMessage(const QByteArray &); protected: + virtual void statusChanged(Status); virtual void messageReceived(const QByteArray &); private: diff --git a/src/plugins/debugger/qml/qmldebuggerclient.cpp b/src/plugins/debugger/qml/qmldebuggerclient.cpp index a4d852fb93c..c3b81549365 100644 --- a/src/plugins/debugger/qml/qmldebuggerclient.cpp +++ b/src/plugins/debugger/qml/qmldebuggerclient.cpp @@ -37,7 +37,6 @@ namespace Internal { QmlDebuggerClient::QmlDebuggerClient(QmlJsDebugClient::QDeclarativeDebugConnection* client) : QDeclarativeDebugClient(QLatin1String("JSDebugger"), client) { - setEnabled(true); } QmlDebuggerClient::~QmlDebuggerClient() diff --git a/src/plugins/qmljsinspector/qmljsobserverclient.cpp b/src/plugins/qmljsinspector/qmljsobserverclient.cpp index 2670008ad65..734977f2e48 100644 --- a/src/plugins/qmljsinspector/qmljsobserverclient.cpp +++ b/src/plugins/qmljsinspector/qmljsobserverclient.cpp @@ -53,7 +53,6 @@ QmlJSObserverClient::QmlJSObserverClient(QDeclarativeDebugConnection *client, : QDeclarativeDebugClient(QLatin1String("QDeclarativeObserverMode"), client) , m_connection(client) { - setEnabled(true); } void QmlJSObserverClient::messageReceived(const QByteArray &message) From f343cc4bd4506e77e52de5ac44cf63d0947e9775 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Mon, 27 Sep 2010 10:25:01 +0200 Subject: [PATCH 072/118] QmlJSDebugger: Update API to changes in QDeclarativeEngine Reviewed-by: Christiaan Janssen --- share/qtcreator/qml/qmljsdebugger/include/jsdebuggeragent.h | 2 +- .../qml/qmljsdebugger/include/qdeclarativeobserverservice.h | 2 +- share/qtcreator/qml/qmljsdebugger/jsdebuggeragent.cpp | 3 ++- .../qml/qmljsdebugger/qdeclarativeobserverservice.cpp | 4 ++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/share/qtcreator/qml/qmljsdebugger/include/jsdebuggeragent.h b/share/qtcreator/qml/qmljsdebugger/include/jsdebuggeragent.h index 39b559cabe3..47b17c409cd 100644 --- a/share/qtcreator/qml/qmljsdebugger/include/jsdebuggeragent.h +++ b/share/qtcreator/qml/qmljsdebugger/include/jsdebuggeragent.h @@ -103,7 +103,7 @@ public: const QVariant &argument = QVariant()); void messageReceived(const QByteArray &); - void enabledChanged(bool); + void statusChanged(Status status); public slots: // void pauses(); diff --git a/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeobserverservice.h b/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeobserverservice.h index 121a847684e..9120c51e849 100644 --- a/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeobserverservice.h +++ b/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeobserverservice.h @@ -98,7 +98,7 @@ Q_SIGNALS: void clearComponentCacheRequested(); protected: - virtual void enabledChanged(bool enabled); + virtual void statusChanged(Status status); virtual void messageReceived(const QByteArray &); private: diff --git a/share/qtcreator/qml/qmljsdebugger/jsdebuggeragent.cpp b/share/qtcreator/qml/qmljsdebugger/jsdebuggeragent.cpp index 4258882e10c..d398150720f 100644 --- a/share/qtcreator/qml/qmljsdebugger/jsdebuggeragent.cpp +++ b/share/qtcreator/qml/qmljsdebugger/jsdebuggeragent.cpp @@ -511,9 +511,10 @@ void JSDebuggerAgent::continueExec() loop.quit(); } -void JSDebuggerAgent::enabledChanged(bool on) +void JSDebuggerAgent::statusChanged(Status status) { engine()->setAgent(on ? this : 0); + engine()->setAgent((status == QDeclarativeDebugService::Enabled) ? this : 0); } } // namespace QmlJSDebugger diff --git a/share/qtcreator/qml/qmljsdebugger/qdeclarativeobserverservice.cpp b/share/qtcreator/qml/qmljsdebugger/qdeclarativeobserverservice.cpp index 16b5145e74a..0b79609551f 100644 --- a/share/qtcreator/qml/qmljsdebugger/qdeclarativeobserverservice.cpp +++ b/share/qtcreator/qml/qmljsdebugger/qdeclarativeobserverservice.cpp @@ -60,9 +60,9 @@ QDeclarativeObserverService *QDeclarativeObserverService::instance() return serviceInstance(); } -void QDeclarativeObserverService::enabledChanged(bool enabled) +void QDeclarativeObserverService::statusChanged(Status status) { - emit debuggingClientChanged(enabled); + emit debuggingClientChanged((status == Enabled)); } void QDeclarativeObserverService::messageReceived(const QByteArray &message) From eff5ceea64f39708039915d0e867f62ff5a7ea7f Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Mon, 27 Sep 2010 10:46:08 +0200 Subject: [PATCH 073/118] QmlJsDebugger: Remove dependency to Qt private headers being installed Copy over the private header files to creator source tree, along the lines of the what the designer plugin does. Reviewed-by: Christiaan Janssen --- .../editor/abstractformeditortool.cpp | 2 +- .../editor/rubberbandselectionmanipulator.cpp | 2 +- .../editor/selectionindicator.cpp | 2 +- .../qmljsdebugger/editor/selectiontool.cpp | 2 +- .../editor/singleselectionmanipulator.cpp | 2 +- .../editor/subcomponenteditortool.cpp | 2 +- .../qml/qmljsdebugger/editor/zoomtool.cpp | 2 +- .../qmljsdebugger/include/jsdebuggeragent.h | 3 +- .../include/qdeclarativeobserverservice.h | 2 +- .../qt_private/qdeclarativedebughelper_p.h | 67 ++++++++++++++ .../qt_private/qdeclarativedebugservice_p.h | 92 +++++++++++++++++++ .../qml/qmljsdebugger/jsdebuggeragent.cpp | 5 +- .../qml/qmljsdebugger/private_headers.pri | 17 ---- .../qdeclarativeviewobserver.cpp | 21 ++--- .../qdeclarativeviewobserver_p.h | 6 +- .../qml/qmljsdebugger/qmljsdebugger-lib.pri | 28 +++--- .../qt4projectmanager/qmlobservertool.cpp | 9 +- 17 files changed, 204 insertions(+), 60 deletions(-) create mode 100644 share/qtcreator/qml/qmljsdebugger/include/qt_private/qdeclarativedebughelper_p.h create mode 100644 share/qtcreator/qml/qmljsdebugger/include/qt_private/qdeclarativedebugservice_p.h delete mode 100644 share/qtcreator/qml/qmljsdebugger/private_headers.pri diff --git a/share/qtcreator/qml/qmljsdebugger/editor/abstractformeditortool.cpp b/share/qtcreator/qml/qmljsdebugger/editor/abstractformeditortool.cpp index 557a3011120..dea47b7e998 100644 --- a/share/qtcreator/qml/qmljsdebugger/editor/abstractformeditortool.cpp +++ b/share/qtcreator/qml/qmljsdebugger/editor/abstractformeditortool.cpp @@ -29,7 +29,7 @@ #include "abstractformeditortool.h" #include "qdeclarativeviewobserver.h" -#include "qdeclarativeviewobserver_p.h" +#include "../qdeclarativeviewobserver_p.h" #include diff --git a/share/qtcreator/qml/qmljsdebugger/editor/rubberbandselectionmanipulator.cpp b/share/qtcreator/qml/qmljsdebugger/editor/rubberbandselectionmanipulator.cpp index 379ba98c44d..43e3575470c 100644 --- a/share/qtcreator/qml/qmljsdebugger/editor/rubberbandselectionmanipulator.cpp +++ b/share/qtcreator/qml/qmljsdebugger/editor/rubberbandselectionmanipulator.cpp @@ -28,7 +28,7 @@ **************************************************************************/ #include "rubberbandselectionmanipulator.h" -#include "qdeclarativeviewobserver_p.h" +#include "../qdeclarativeviewobserver_p.h" #include diff --git a/share/qtcreator/qml/qmljsdebugger/editor/selectionindicator.cpp b/share/qtcreator/qml/qmljsdebugger/editor/selectionindicator.cpp index 49ed137b57e..d6ba81bd736 100644 --- a/share/qtcreator/qml/qmljsdebugger/editor/selectionindicator.cpp +++ b/share/qtcreator/qml/qmljsdebugger/editor/selectionindicator.cpp @@ -28,7 +28,7 @@ **************************************************************************/ #include "selectionindicator.h" -#include "qdeclarativeviewobserver_p.h" +#include "../qdeclarativeviewobserver_p.h" #include "qmlobserverconstants.h" #include diff --git a/share/qtcreator/qml/qmljsdebugger/editor/selectiontool.cpp b/share/qtcreator/qml/qmljsdebugger/editor/selectiontool.cpp index b677a105771..fdc8b2dc2e6 100644 --- a/share/qtcreator/qml/qmljsdebugger/editor/selectiontool.cpp +++ b/share/qtcreator/qml/qmljsdebugger/editor/selectiontool.cpp @@ -31,7 +31,7 @@ #include "layeritem.h" //#include "resizehandleitem.h" -#include "qdeclarativeviewobserver_p.h" +#include "../qdeclarativeviewobserver_p.h" #include diff --git a/share/qtcreator/qml/qmljsdebugger/editor/singleselectionmanipulator.cpp b/share/qtcreator/qml/qmljsdebugger/editor/singleselectionmanipulator.cpp index d0064815496..e982385650c 100644 --- a/share/qtcreator/qml/qmljsdebugger/editor/singleselectionmanipulator.cpp +++ b/share/qtcreator/qml/qmljsdebugger/editor/singleselectionmanipulator.cpp @@ -29,7 +29,7 @@ #include "singleselectionmanipulator.h" #include "qdeclarativeviewobserver.h" -#include "qdeclarativeviewobserver_p.h" +#include "../qdeclarativeviewobserver_p.h" #include namespace QmlJSDebugger { diff --git a/share/qtcreator/qml/qmljsdebugger/editor/subcomponenteditortool.cpp b/share/qtcreator/qml/qmljsdebugger/editor/subcomponenteditortool.cpp index 5089944ddba..700c0ecf2e5 100644 --- a/share/qtcreator/qml/qmljsdebugger/editor/subcomponenteditortool.cpp +++ b/share/qtcreator/qml/qmljsdebugger/editor/subcomponenteditortool.cpp @@ -1,5 +1,5 @@ #include "subcomponenteditortool.h" -#include "qdeclarativeviewobserver_p.h" +#include "../qdeclarativeviewobserver_p.h" #include "subcomponentmasklayeritem.h" #include "layeritem.h" diff --git a/share/qtcreator/qml/qmljsdebugger/editor/zoomtool.cpp b/share/qtcreator/qml/qmljsdebugger/editor/zoomtool.cpp index 2bb152e2d63..c1d310002b2 100644 --- a/share/qtcreator/qml/qmljsdebugger/editor/zoomtool.cpp +++ b/share/qtcreator/qml/qmljsdebugger/editor/zoomtool.cpp @@ -1,5 +1,5 @@ #include "zoomtool.h" -#include "qdeclarativeviewobserver_p.h" +#include "../qdeclarativeviewobserver_p.h" #include #include diff --git a/share/qtcreator/qml/qmljsdebugger/include/jsdebuggeragent.h b/share/qtcreator/qml/qmljsdebugger/include/jsdebuggeragent.h index 47b17c409cd..5c0fb017231 100644 --- a/share/qtcreator/qml/qmljsdebugger/include/jsdebuggeragent.h +++ b/share/qtcreator/qml/qmljsdebugger/include/jsdebuggeragent.h @@ -57,9 +57,10 @@ #include #include #include -#include #include +#include "qt_private/qdeclarativedebugservice_p.h" + #include "qmljsdebugger_global.h" QT_FORWARD_DECLARE_CLASS(QScriptContext); diff --git a/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeobserverservice.h b/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeobserverservice.h index 9120c51e849..0711348bbec 100644 --- a/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeobserverservice.h +++ b/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeobserverservice.h @@ -42,7 +42,7 @@ #ifndef QDECLARATIVEDESIGNDEBUGSERVER_H #define QDECLARATIVEDESIGNDEBUGSERVER_H -#include +#include "qt_private/qdeclarativedebugservice_p.h" #include "qmlobserverconstants.h" #include "qmljsdebugger_global.h" diff --git a/share/qtcreator/qml/qmljsdebugger/include/qt_private/qdeclarativedebughelper_p.h b/share/qtcreator/qml/qmljsdebugger/include/qt_private/qdeclarativedebughelper_p.h new file mode 100644 index 00000000000..c9cb8391212 --- /dev/null +++ b/share/qtcreator/qml/qmljsdebugger/include/qt_private/qdeclarativedebughelper_p.h @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtDeclarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QDECLARATIVEDEBUGHELPER_P_H +#define QDECLARATIVEDEBUGHELPER_P_H + +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +class QScriptEngine; +class QDeclarativeEngine; + +// Helper methods to access private API through a stable interface +// This is used in the qmljsdebugger library of QtCreator. +class Q_DECLARATIVE_EXPORT QDeclarativeDebugHelper +{ +public: + static QScriptEngine *getScriptEngine(QDeclarativeEngine *engine); + static void setAnimationSlowDownFactor(qreal factor); +}; + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // QDECLARATIVEDEBUGHELPER_P_H diff --git a/share/qtcreator/qml/qmljsdebugger/include/qt_private/qdeclarativedebugservice_p.h b/share/qtcreator/qml/qmljsdebugger/include/qt_private/qdeclarativedebugservice_p.h new file mode 100644 index 00000000000..0cadbe5b585 --- /dev/null +++ b/share/qtcreator/qml/qmljsdebugger/include/qt_private/qdeclarativedebugservice_p.h @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtDeclarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QDECLARATIVEDEBUGSERVICE_H +#define QDECLARATIVEDEBUGSERVICE_H + +#include + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(Declarative) + +class QDeclarativeDebugServicePrivate; +class Q_DECLARATIVE_EXPORT QDeclarativeDebugService : public QObject +{ + Q_OBJECT + Q_DECLARE_PRIVATE(QDeclarativeDebugService) + Q_DISABLE_COPY(QDeclarativeDebugService) + +public: + explicit QDeclarativeDebugService(const QString &, QObject *parent = 0); + ~QDeclarativeDebugService(); + + QString name() const; + + enum Status { NotConnected, Unavailable, Enabled }; + Status status() const; + + void sendMessage(const QByteArray &); + + static int idForObject(QObject *); + static QObject *objectForId(int); + + static QString objectToString(QObject *obj); + + static bool isDebuggingEnabled(); + static bool hasDebuggingClient(); + +protected: + virtual void statusChanged(Status); + virtual void messageReceived(const QByteArray &); + +private: + friend class QDeclarativeDebugServer; +}; + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // QDECLARATIVEDEBUGSERVICE_H + diff --git a/share/qtcreator/qml/qmljsdebugger/jsdebuggeragent.cpp b/share/qtcreator/qml/qmljsdebugger/jsdebuggeragent.cpp index d398150720f..00b6ea27489 100644 --- a/share/qtcreator/qml/qmljsdebugger/jsdebuggeragent.cpp +++ b/share/qtcreator/qml/qmljsdebugger/jsdebuggeragent.cpp @@ -40,6 +40,7 @@ ****************************************************************************/ #include "jsdebuggeragent.h" +#include "qt_private/qdeclarativedebughelper_p.h" #include #include @@ -49,7 +50,6 @@ #include #include #include -#include namespace QmlJSDebugger { @@ -193,7 +193,7 @@ JSDebuggerAgent::JSDebuggerAgent(QScriptEngine *engine) JSDebuggerAgent::JSDebuggerAgent(QDeclarativeEngine *engine) : QDeclarativeDebugService("JSDebugger") - , QScriptEngineAgent(QDeclarativeEnginePrivate::getScriptEngine(engine)) + , QScriptEngineAgent(QDeclarativeDebugHelper::getScriptEngine(engine)) , state(NoState) {} @@ -513,7 +513,6 @@ void JSDebuggerAgent::continueExec() void JSDebuggerAgent::statusChanged(Status status) { - engine()->setAgent(on ? this : 0); engine()->setAgent((status == QDeclarativeDebugService::Enabled) ? this : 0); } diff --git a/share/qtcreator/qml/qmljsdebugger/private_headers.pri b/share/qtcreator/qml/qmljsdebugger/private_headers.pri deleted file mode 100644 index fc353961781..00000000000 --- a/share/qtcreator/qml/qmljsdebugger/private_headers.pri +++ /dev/null @@ -1,17 +0,0 @@ -# Try to find location of Qt private headers (see README) -isEmpty(QT_PRIVATE_HEADERS) { - QT_PRIVATE_HEADERS = $$[QT_INSTALL_HEADERS] -} - -INCLUDEPATH += \ - $${QT_PRIVATE_HEADERS} \ - $${QT_PRIVATE_HEADERS}/QtCore \ - $${QT_PRIVATE_HEADERS}/QtGui \ - $${QT_PRIVATE_HEADERS}/QtScript \ - $${QT_PRIVATE_HEADERS}/QtDeclarative -DEPENDPATH += \ - $${QT_PRIVATE_HEADERS} \ - $${QT_PRIVATE_HEADERS}/QtCore \ - $${QT_PRIVATE_HEADERS}/QtGui \ - $${QT_PRIVATE_HEADERS}/QtScript \ - $${QT_PRIVATE_HEADERS}/QtDeclarative diff --git a/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver.cpp b/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver.cpp index 81cd9b018ba..39e3f2a11c9 100644 --- a/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver.cpp +++ b/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver.cpp @@ -39,6 +39,8 @@ #include "qmltoolbar.h" #include "jsdebuggeragent.h" +#include "qt_private/qdeclarativedebughelper_p.h" + #include #include #include @@ -47,10 +49,7 @@ #include #include #include - #include -#include -#include namespace QmlJSDebugger { @@ -626,11 +625,13 @@ void QDeclarativeViewObserver::continueExecution(qreal slowdownFactor) data->slowdownFactor = slowdownFactor; static const qreal animSpeedSnapDelta = 0.01f; - bool useStandardSpeed = (qAbs(1.0f - data->slowdownFactor) < animSpeedSnapDelta); - QUnifiedTimer *timer = QUnifiedTimer::instance(); - timer->setSlowdownFactor(data->slowdownFactor); - timer->setSlowModeEnabled(!useStandardSpeed); + qreal slowDownFactor = data->slowdownFactor; + if (qAbs(1.0f - slowDownFactor) < animSpeedSnapDelta) { + slowDownFactor = 1.0f; + } + + QDeclarativeDebugHelper::setAnimationSlowDownFactor(slowDownFactor); data->executionPaused = false; emit executionStarted(data->slowdownFactor); @@ -639,9 +640,7 @@ void QDeclarativeViewObserver::continueExecution(qreal slowdownFactor) void QDeclarativeViewObserver::pauseExecution() { - QUnifiedTimer *timer = QUnifiedTimer::instance(); - timer->setSlowdownFactor(0); - timer->setSlowModeEnabled(true); + QDeclarativeDebugHelper::setAnimationSlowDownFactor(0.0f); data->executionPaused = true; emit executionPaused(); @@ -796,7 +795,7 @@ void QDeclarativeViewObserverPrivate::createToolbar() void QDeclarativeViewObserver::setDebugMode(bool isDebugMode) { if (isDebugMode && !data->jsDebuggerAgent) - data->jsDebuggerAgent = new JSDebuggerAgent(QDeclarativeEnginePrivate::getScriptEngine(data->view->engine())); + data->jsDebuggerAgent = new JSDebuggerAgent(data->view->engine()); } } //namespace QmlJSDebugger diff --git a/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver_p.h b/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver_p.h index a276c4350e2..516877dd586 100644 --- a/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver_p.h +++ b/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver_p.h @@ -27,8 +27,8 @@ ** **************************************************************************/ -#ifndef QDECLARATIVEDESIGNVIEW_P_H -#define QDECLARATIVEDESIGNVIEW_P_H +#ifndef QDECLARATIVEVIEWOBSERVER_P_H +#define QDECLARATIVEVIEWOBSERVER_P_H #include #include @@ -138,4 +138,4 @@ public: } // namespace QmlJSDebugger -#endif // QDECLARATIVEDESIGNVIEW_P_H +#endif // QDECLARATIVEVIEWOBSERVER_P_H diff --git a/share/qtcreator/qml/qmljsdebugger/qmljsdebugger-lib.pri b/share/qtcreator/qml/qmljsdebugger/qmljsdebugger-lib.pri index f8e482e38c7..ec99cd06cc5 100644 --- a/share/qtcreator/qml/qmljsdebugger/qmljsdebugger-lib.pri +++ b/share/qtcreator/qml/qmljsdebugger/qmljsdebugger-lib.pri @@ -1,6 +1,6 @@ QT += declarative script -INCLUDEPATH += $$PWD $$PWD/include editor -DEPENDPATH += $$PWD $$PWD/include editor +INCLUDEPATH += $$PWD/include +DEPENDPATH += $$PWD $$PWD/include editor $$PWD/qt-private contains(CONFIG, dll) { DEFINES += BUILD_QMLJSDEBUGGER_LIB @@ -8,28 +8,28 @@ contains(CONFIG, dll) { DEFINES += BUILD_QMLJSDEBUGGER_STATIC_LIB } -include($$PWD/private_headers.pri) - ## Input HEADERS += \ - $$PWD/include/jsdebuggeragent.h \ - $$PWD/include/qmljsdebugger_global.h + include/jsdebuggeragent.h \ + include/qmljsdebugger_global.h \ + include/qt_private/qdeclarativedebughelper_p.h \ + include/qt_private/qdeclarativedebugservice_p.h SOURCES += \ - $$PWD/jsdebuggeragent.cpp + jsdebuggeragent.cpp contains(DEFINES, QMLOBSERVER) { include($$PWD/editor/editor.pri) HEADERS += \ - $$PWD/include/qdeclarativeviewobserver.h \ - $$PWD/include/qdeclarativeobserverservice.h \ - $$PWD/include/qmlobserverconstants.h \ - $$PWD/qdeclarativeviewobserver_p.h + include/qdeclarativeviewobserver.h \ + include/qdeclarativeobserverservice.h \ + include/qmlobserverconstants.h \ + qdeclarativeviewobserver_p.h SOURCES += \ - $$PWD/qdeclarativeviewobserver.cpp \ - $$PWD/qdeclarativeobserverservice.cpp + qdeclarativeviewobserver.cpp \ + qdeclarativeobserverservice.cpp } -OTHER_FILES += $$PWD/qmljsdebugger.pri +OTHER_FILES += qmljsdebugger.pri diff --git a/src/plugins/qt4projectmanager/qmlobservertool.cpp b/src/plugins/qt4projectmanager/qmlobservertool.cpp index 7b556f2a313..1a456062af0 100644 --- a/src/plugins/qt4projectmanager/qmlobservertool.cpp +++ b/src/plugins/qt4projectmanager/qmlobservertool.cpp @@ -139,13 +139,15 @@ QString QmlObserverTool::copy(const QString &qtInstallData, QString *errorMessag << QLatin1String("LICENSE.LGPL") << QLatin1String("LGPL_EXCEPTION.TXT"); QStringList debuggerLibFiles; - debuggerLibFiles << QLatin1String("jsdebuggeragent.cpp") << QLatin1String("private_headers.pri") + debuggerLibFiles << QLatin1String("jsdebuggeragent.cpp") << QLatin1String("qdeclarativeobserverservice.cpp") << QLatin1String("qdeclarativeviewobserver.cpp") << QLatin1String("qdeclarativeviewobserver_p.h") << QLatin1String("qmljsdebugger.pri") << QLatin1String("qmljsdebugger.pro") << QLatin1String("qmljsdebugger-lib.pri") << QLatin1String("include/jsdebuggeragent.h") << QLatin1String("include/qdeclarativeobserverservice.h") << QLatin1String("include/qdeclarativeviewobserver.h") << QLatin1String("include/qmljsdebugger_global.h") - << QLatin1String("include/qmlobserverconstants.h"); + << QLatin1String("include/qmlobserverconstants.h") + << QLatin1String("include/qt_private/qdeclarativedebughelper_p.h") + << QLatin1String("include/qt_private/qdeclarativedebugservice_p.h"); QStringList debuggerLibEditorFiles; debuggerLibEditorFiles << QLatin1String("abstractformeditortool.cpp") << QLatin1String("abstractformeditortool.h") @@ -183,7 +185,8 @@ QString QmlObserverTool::copy(const QString &qtInstallData, QString *errorMessag foreach(const QString &directory, directories) { if (!mkpath(directory + QLatin1String("/content/images"), errorMessage) || !mkpath(directory + QLatin1String("/qmljsdebugger/editor/images"), errorMessage) - || !mkpath(directory + QLatin1String("/qmljsdebugger/include"), errorMessage)) + || !mkpath(directory + QLatin1String("/qmljsdebugger/include"), errorMessage) + || !mkpath(directory + QLatin1String("/qmljsdebugger/include/qt_private"), errorMessage)) { continue; } else { From 6929d66ff23d9a84b6e1d425dcf234192f3ce9bc Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Tue, 28 Sep 2010 12:59:29 +0200 Subject: [PATCH 074/118] QmlObserver: Prevent messages from being sent if there is no server side Actually this is fixed in QDeclarativeService::sendMessage, too, but the fix won't be part of 4.7.1, so better double-check. Reviewed-by: Christiaan Janssen --- .../qmljsdebugger/include/qdeclarativeobserverservice.h | 2 ++ .../qml/qmljsdebugger/qdeclarativeobserverservice.cpp | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeobserverservice.h b/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeobserverservice.h index 0711348bbec..66084cd92c4 100644 --- a/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeobserverservice.h +++ b/share/qtcreator/qml/qmljsdebugger/include/qdeclarativeobserverservice.h @@ -70,6 +70,8 @@ public: void reloaded(); QString idStringForObject(QObject *obj) const; + void sendMessage(const QByteArray &message); + public Q_SLOTS: void selectedColorChanged(const QColor &color); void contextPathUpdated(const QStringList &contextPath); diff --git a/share/qtcreator/qml/qmljsdebugger/qdeclarativeobserverservice.cpp b/share/qtcreator/qml/qmljsdebugger/qdeclarativeobserverservice.cpp index 0b79609551f..114cd15cf6c 100644 --- a/share/qtcreator/qml/qmljsdebugger/qdeclarativeobserverservice.cpp +++ b/share/qtcreator/qml/qmljsdebugger/qdeclarativeobserverservice.cpp @@ -236,4 +236,12 @@ QString QDeclarativeObserverService::idStringForObject(QObject *obj) const return idString; } +void QDeclarativeObserverService::sendMessage(const QByteArray &message) +{ + if (status() != Enabled) + return; + + QDeclarativeDebugService::sendMessage(message); +} + } // namespace QmlJSDebugger From 3e080e082de9b0cb89f4e3e27ab375e0dad6db06 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Wed, 29 Sep 2010 13:57:05 +0200 Subject: [PATCH 075/118] QmlJSDebugger: Check for Qt 4.7.1 or newer before enabling qml debugging Reviewed-by: Christiaan Janssen --- .../qmlapplicationviewer.pri | 39 ++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/share/qtcreator/templates/qmlapp/qmlapplicationviewer/qmlapplicationviewer.pri b/share/qtcreator/templates/qmlapp/qmlapplicationviewer/qmlapplicationviewer.pri index 701d8c61d5d..aa172906eb6 100644 --- a/share/qtcreator/templates/qmlapp/qmlapplicationviewer/qmlapplicationviewer.pri +++ b/share/qtcreator/templates/qmlapp/qmlapplicationviewer/qmlapplicationviewer.pri @@ -10,16 +10,45 @@ INCLUDEPATH += $$PWD contains(DEFINES, QMLOBSERVER) { DEFINES *= QMLJSDEBUGGER } + +defineTest(minQtVersion) { + maj = $$1 + min = $$2 + patch = $$3 + isEqual(QT_MAJOR_VERSION, $$maj) { + isEqual(QT_MINOR_VERSION, $$min) { + isEqual(QT_PATCH_VERSION, $$patch) { + return(true) + } + greaterThan(QT_PATCH_VERSION, $$patch) { + return(true) + } + } + greaterThan(QT_MINOR_VERSION, $$min) { + return(true) + } + } + return(false) +} + contains(DEFINES, QMLJSDEBUGGER) { CONFIG(debug, debug|release) { - isEmpty(QMLJSDEBUGGER_PATH) { + !minQtVersion(4, 7, 1) { warning() - warning(Debugging QML requires the qmljsdebugger library that ships with Qt Creator.) - warning(Please specify its location on the qmake command line, e.g.) - warning( qmake -r QMLJSDEBUGGER_PATH=$CREATORDIR/share/qtcreator/qml/qmljsdebugger) + warning("Debugging QML requires the qmljsdebugger library that ships with Qt Creator.") + warning("This library requires Qt 4.7.1 or newer.") warning() - error(QMLJSDEBUGGER defined, but no QMLJSDEBUGGER_PATH set on command line. Aborting.) + error("Qt version $$QT_VERSION too old for QmlJS Debugging. Aborting.") + } + isEmpty(QMLJSDEBUGGER_PATH) { + warning() + warning("Debugging QML requires the qmljsdebugger library that ships with Qt Creator.") + warning("Please specify its location on the qmake command line, eg") + warning(" qmake -r QMLJSDEBUGGER_PATH=$CREATORDIR/share/qtcreator/qmljsdebugger") + warning() + + error("QMLJSDEBUGGER defined, but no QMLJSDEBUGGER_PATH set on command line. Aborting.") DEFINES -= QMLJSDEBUGGER } else { include($$QMLJSDEBUGGER_PATH/qmljsdebugger-lib.pri) From 8ad34357b837356a5e3fe4499006f0a412447d72 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 30 Sep 2010 14:04:04 +0200 Subject: [PATCH 076/118] QmlJSDebugger: Fix warning about JSAgent already connected We now instantiate an extra JSDebugger object in the generated class. Reviewed-by: aportale --- share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver.cpp | 3 --- src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver.cpp b/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver.cpp index 39e3f2a11c9..d48d4eff537 100644 --- a/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver.cpp +++ b/share/qtcreator/qml/qmljsdebugger/qdeclarativeviewobserver.cpp @@ -117,9 +117,6 @@ QDeclarativeViewObserver::QDeclarativeViewObserver(QDeclarativeView *view, QObje data->createToolbar(); data->_q_changeToSingleSelectTool(); - - // always start debug mode - that's what this design view is for. - setDebugMode(true); } QDeclarativeViewObserver::~QDeclarativeViewObserver() diff --git a/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp b/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp index d14dc88fb91..d323107c664 100644 --- a/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp +++ b/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp @@ -474,7 +474,7 @@ bool QmlStandaloneApp::updateFiles(const QList &list, Q return true; } -const int QmlStandaloneApp::StubVersion = 7; +const int QmlStandaloneApp::StubVersion = 8; } // namespace Internal } // namespace Qt4ProjectManager From 226a82d3dc74384d820ea63a1b330eb2ad341042 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 30 Sep 2010 14:05:20 +0200 Subject: [PATCH 077/118] QmlDebugger: Log status of different services Reviewed-by: Christiaan Janssen --- src/plugins/debugger/qml/qmladapter.cpp | 35 +++++++++++ src/plugins/debugger/qml/qmladapter.h | 5 ++ .../debugger/qml/qmldebuggerclient.cpp | 5 ++ src/plugins/debugger/qml/qmldebuggerclient.h | 2 + src/plugins/debugger/qml/qmlengine.cpp | 7 +++ src/plugins/debugger/qml/qmlengine.h | 1 + .../qmljsinspector/qmljsclientproxy.cpp | 60 ++++++++++++------- src/plugins/qmljsinspector/qmljsclientproxy.h | 2 +- .../qmljsinspector/qmljsobserverclient.cpp | 5 ++ .../qmljsinspector/qmljsobserverclient.h | 3 + 10 files changed, 102 insertions(+), 23 deletions(-) diff --git a/src/plugins/debugger/qml/qmladapter.cpp b/src/plugins/debugger/qml/qmladapter.cpp index fbea843d19e..985fc4d9810 100644 --- a/src/plugins/debugger/qml/qmladapter.cpp +++ b/src/plugins/debugger/qml/qmladapter.cpp @@ -143,6 +143,16 @@ void QmlAdapter::connectionErrorOccurred(QAbstractSocket::SocketError socketErro emit connectionError(socketError); } +void QmlAdapter::clientStatusChanged(QDeclarativeDebugClient::Status status) +{ + QString serviceName; + if (QDeclarativeDebugClient *client = qobject_cast(sender())) { + serviceName = client->name(); + } + + logServiceStatusChange(serviceName, status); +} + void QmlAdapter::connectionStateChanged() { switch (d->m_conn->state()) { @@ -165,6 +175,7 @@ void QmlAdapter::connectionStateChanged() if (!d->m_mainClient) { d->m_mainClient = new QDeclarativeEngineDebug(d->m_conn, this); + logServiceStatusChange(QLatin1String("QmlObserver"), static_cast(d->m_mainClient->status())); } createDebuggerClient(); @@ -185,11 +196,15 @@ void QmlAdapter::createDebuggerClient() { d->m_qmlClient = new Internal::QmlDebuggerClient(d->m_conn); + connect(d->m_qmlClient, SIGNAL(newStatus(QDeclarativeDebugClient::Status)), + this, SLOT(clientStatusChanged(QDeclarativeDebugClient::Status))); connect(d->m_engine.data(), SIGNAL(sendMessage(QByteArray)), d->m_qmlClient, SLOT(slotSendMessage(QByteArray))); connect(d->m_qmlClient, SIGNAL(messageWasReceived(QByteArray)), d->m_engine.data(), SLOT(messageReceived(QByteArray))); + logServiceStatusChange(d->m_qmlClient->name(), d->m_qmlClient->status()); + //engine->startSuccessful(); // FIXME: AAA: port to new debugger states } @@ -237,4 +252,24 @@ void QmlAdapter::setConnectionAttemptInterval(int interval) d->m_connectionTimer->setInterval(interval); } +void QmlAdapter::logServiceStatusChange(const QString &service, QDeclarativeDebugClient::Status newStatus) +{ + switch (newStatus) { + case QDeclarativeDebugClient::Unavailable: { + showConnectionErrorMessage(tr("Error: Cannot connect to debug service '%1'. Debugging functionality will be limited.").arg(service)); + emit serviceConnectionError(service); + break; + } + case QDeclarativeDebugClient::Enabled: { + showConnectionStatusMessage(tr("Connected to debug service '%1'.").arg(service)); + break; + } + + case QDeclarativeDebugClient::NotConnected: { + showConnectionStatusMessage(tr("Not connected to debug service '%1'.").arg(service)); + break; + } + } +} + } // namespace Debugger diff --git a/src/plugins/debugger/qml/qmladapter.h b/src/plugins/debugger/qml/qmladapter.h index 6118a05543f..8cbce251397 100644 --- a/src/plugins/debugger/qml/qmladapter.h +++ b/src/plugins/debugger/qml/qmladapter.h @@ -36,6 +36,7 @@ #include "debugger_global.h" #include +#include "qmldebuggerclient.h" namespace QmlJsDebugClient { class QDeclarativeEngineDebug; @@ -72,15 +73,19 @@ public: void setMaxConnectionAttempts(int maxAttempts); void setConnectionAttemptInterval(int interval); + void logServiceStatusChange(const QString &service, QDeclarativeDebugClient::Status newStatus); + signals: void aboutToDisconnect(); void connected(); void disconnected(); void connectionStartupFailed(); void connectionError(QAbstractSocket::SocketError socketError); + void serviceConnectionError(const QString serviceName); private slots: void connectionErrorOccurred(QAbstractSocket::SocketError socketError); + void clientStatusChanged(QDeclarativeDebugClient::Status status); void connectionStateChanged(); void pollInferior(); diff --git a/src/plugins/debugger/qml/qmldebuggerclient.cpp b/src/plugins/debugger/qml/qmldebuggerclient.cpp index c3b81549365..b0953df3004 100644 --- a/src/plugins/debugger/qml/qmldebuggerclient.cpp +++ b/src/plugins/debugger/qml/qmldebuggerclient.cpp @@ -43,6 +43,11 @@ QmlDebuggerClient::~QmlDebuggerClient() { } +void QmlDebuggerClient::statusChanged(Status status) +{ + emit newStatus(status); +} + void QmlDebuggerClient::messageReceived(const QByteArray &data) { emit messageWasReceived(data); diff --git a/src/plugins/debugger/qml/qmldebuggerclient.h b/src/plugins/debugger/qml/qmldebuggerclient.h index 191e3570d52..271f632a94a 100644 --- a/src/plugins/debugger/qml/qmldebuggerclient.h +++ b/src/plugins/debugger/qml/qmldebuggerclient.h @@ -44,12 +44,14 @@ public: virtual ~QmlDebuggerClient(); signals: + void newStatus(QDeclarativeDebugClient::Status status); void messageWasReceived(const QByteArray &data); private Q_SLOTS: void slotSendMessage(const QByteArray &message); protected: + virtual void statusChanged(Status status); virtual void messageReceived(const QByteArray &data); }; diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index a0b2be77468..b4c361d55b3 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -218,6 +218,12 @@ void QmlEngine::connectionError(QAbstractSocket::SocketError socketError) plugin()->showMessage(tr("QML Debugger: Remote host closed connection."), StatusBar); } + +void QmlEngine::serviceConnectionError(const QString &serviceName) +{ + plugin()->showMessage(tr("QML Debugger: Couldn't connect to service '%1'.").arg(serviceName), StatusBar); +} + void QmlEngine::runEngine() { QTC_ASSERT(state() == EngineRunRequested, qDebug() << state()); @@ -327,6 +333,7 @@ void QmlEngine::setupEngine() d->m_adapter->setConnectionAttemptInterval(ConnectionAttemptDefaultInterval); connect(d->m_adapter, SIGNAL(connectionError(QAbstractSocket::SocketError)), SLOT(connectionError(QAbstractSocket::SocketError))); + connect(d->m_adapter, SIGNAL(serviceConnectionError(QString)), SLOT(serviceConnectionError(QString))); connect(d->m_adapter, SIGNAL(connected()), SLOT(connectionEstablished())); connect(d->m_adapter, SIGNAL(connectionStartupFailed()), SLOT(connectionStartupFailed())); diff --git a/src/plugins/debugger/qml/qmlengine.h b/src/plugins/debugger/qml/qmlengine.h index 5f12e25eee5..998a183aa4b 100644 --- a/src/plugins/debugger/qml/qmlengine.h +++ b/src/plugins/debugger/qml/qmlengine.h @@ -117,6 +117,7 @@ private slots: void connectionEstablished(); void connectionStartupFailed(); void connectionError(QAbstractSocket::SocketError error); + void serviceConnectionError(const QString &service); private: void expandObject(const QByteArray &iname, quint64 objectId); diff --git a/src/plugins/qmljsinspector/qmljsclientproxy.cpp b/src/plugins/qmljsinspector/qmljsclientproxy.cpp index fca7bb4fe0c..4bd763c7fde 100644 --- a/src/plugins/qmljsinspector/qmljsclientproxy.cpp +++ b/src/plugins/qmljsinspector/qmljsclientproxy.cpp @@ -65,8 +65,14 @@ ClientProxy::ClientProxy(Debugger::QmlAdapter *adapter, QObject *parent) void ClientProxy::connectToServer() { m_designClient = new QmlJSObserverClient(m_adapter->connection(), this); - emit connected(); + if (m_designClient->status() == QDeclarativeDebugClient::Enabled) + emit connected(); + + m_adapter->logServiceStatusChange(m_designClient->name(), m_designClient->status()); + + connect(m_designClient, SIGNAL(connectedStatusChanged(QDeclarativeDebugClient::Status)), + this, SLOT(clientStatusChanged(QDeclarativeDebugClient::Status))); connect(m_designClient, SIGNAL(currentObjectsChanged(QList)), SLOT(onCurrentObjectsChanged(QList))); connect(m_designClient, SIGNAL(colorPickerActivated()), @@ -90,9 +96,24 @@ void ClientProxy::connectToServer() reloadEngines(); } +void ClientProxy::clientStatusChanged(QDeclarativeDebugClient::Status status) +{ + QString serviceName; + if (QDeclarativeDebugClient *client = qobject_cast(sender())) { + serviceName = client->name(); + } + + m_adapter->logServiceStatusChange(serviceName, status); + + if (status == QDeclarativeDebugClient::Enabled) + emit connected(); +} + void ClientProxy::disconnectFromServer() { if (m_designClient) { + disconnect(m_designClient, SIGNAL(connectedStatusChanged(QDeclarativeDebugClient::Status)), + this, SLOT(clientStatusChanged(QDeclarativeDebugClient::Status))); disconnect(m_designClient, SIGNAL(currentObjectsChanged(QList)), this, SLOT(onCurrentObjectsChanged(QList))); disconnect(m_designClient, SIGNAL(colorPickerActivated()), @@ -164,7 +185,7 @@ void ClientProxy::onCurrentObjectsChanged(const QList< int >& debugIds, bool req void ClientProxy::setSelectedItemsByObjectId(const QList &objectRefs) { - if (isConnected() && m_designClient) + if (isConnected()) m_designClient->setSelectedItemsByObjectId(objectRefs); } @@ -285,7 +306,7 @@ QDeclarativeDebugExpressionQuery *ClientProxy::queryExpressionResult(int objectD void ClientProxy::clearComponentCache() { - if (isDesignClientConnected()) + if (isConnected()) m_designClient->clearComponentCache(); } @@ -365,7 +386,7 @@ void ClientProxy::objectTreeFetched(QDeclarativeDebugQuery::State state) buildDebugIdHashRecursive(it); emit objectTreeUpdated(); - if (isDesignClientConnected()) { + if (isConnected()) { if (!m_designClient->selectedItemIds().isEmpty()) onCurrentObjectsChanged(m_designClient->selectedItemIds(), false); @@ -410,76 +431,70 @@ void ClientProxy::buildDebugIdHashRecursive(const QDeclarativeDebugObjectReferen void ClientProxy::reloadQmlViewer() { - if (isDesignClientConnected()) + if (isConnected()) m_designClient->reloadViewer(); } void ClientProxy::setDesignModeBehavior(bool inDesignMode) { - if (isDesignClientConnected()) + if (isConnected()) m_designClient->setDesignModeBehavior(inDesignMode); } void ClientProxy::setAnimationSpeed(qreal slowdownFactor) { - if (isDesignClientConnected()) + if (isConnected()) m_designClient->setAnimationSpeed(slowdownFactor); } void ClientProxy::changeToColorPickerTool() { - if (isDesignClientConnected()) + if (isConnected()) m_designClient->changeToColorPickerTool(); } void ClientProxy::changeToZoomTool() { - if (isDesignClientConnected()) + if (isConnected()) m_designClient->changeToZoomTool(); } void ClientProxy::changeToSelectTool() { - if (isDesignClientConnected()) + if (isConnected()) m_designClient->changeToSelectTool(); } void ClientProxy::changeToSelectMarqueeTool() { - if (isDesignClientConnected()) + if (isConnected()) m_designClient->changeToSelectMarqueeTool(); } void ClientProxy::createQmlObject(const QString &qmlText, int parentDebugId, const QStringList &imports, const QString &filename) { - if (isDesignClientConnected()) + if (isConnected()) m_designClient->createQmlObject(qmlText, parentDebugId, imports, filename); } void ClientProxy::destroyQmlObject(int debugId) { - if (isDesignClientConnected()) + if (isConnected()) m_designClient->destroyQmlObject(debugId); } void ClientProxy::reparentQmlObject(int debugId, int newParent) { - if (isDesignClientConnected()) + if (isConnected()) m_designClient->reparentQmlObject(debugId, newParent); } void ClientProxy::setContextPathIndex(int contextIndex) { - if (isDesignClientConnected()) + if (isConnected()) m_designClient->setContextPathIndex(contextIndex); } - -bool ClientProxy::isDesignClientConnected() const -{ - return (m_designClient && m_adapter->isConnected()); -} - void ClientProxy::reloadEngines() { if (m_engineQuery) { @@ -518,7 +533,8 @@ Debugger::QmlAdapter *ClientProxy::qmlAdapter() const bool ClientProxy::isConnected() const { - return m_adapter->isConnected(); + return m_designClient && m_designClient->status() == QDeclarativeDebugClient::Enabled + && m_client && m_client->status() == QDeclarativeEngineDebug::Enabled; } void ClientProxy::newObjects() diff --git a/src/plugins/qmljsinspector/qmljsclientproxy.h b/src/plugins/qmljsinspector/qmljsclientproxy.h index 1c7c2162f66..81a7a5d08c5 100644 --- a/src/plugins/qmljsinspector/qmljsclientproxy.h +++ b/src/plugins/qmljsinspector/qmljsclientproxy.h @@ -125,6 +125,7 @@ public slots: private slots: void disconnectFromServer(); void connectToServer(); + void clientStatusChanged(QDeclarativeDebugClient::Status status); void contextChanged(); @@ -135,7 +136,6 @@ private slots: void newObjects(); private: - bool isDesignClientConnected() const; void reloadEngines(); QList objectReferences(const QDeclarativeDebugObjectReference &objectRef) const; diff --git a/src/plugins/qmljsinspector/qmljsobserverclient.cpp b/src/plugins/qmljsinspector/qmljsobserverclient.cpp index 734977f2e48..aef5b972388 100644 --- a/src/plugins/qmljsinspector/qmljsobserverclient.cpp +++ b/src/plugins/qmljsinspector/qmljsobserverclient.cpp @@ -55,6 +55,11 @@ QmlJSObserverClient::QmlJSObserverClient(QDeclarativeDebugConnection *client, { } +void QmlJSObserverClient::statusChanged(Status status) +{ + emit connectedStatusChanged(status); +} + void QmlJSObserverClient::messageReceived(const QByteArray &message) { QDataStream ds(message); diff --git a/src/plugins/qmljsinspector/qmljsobserverclient.h b/src/plugins/qmljsinspector/qmljsobserverclient.h index 7928984f898..2c7753a4397 100644 --- a/src/plugins/qmljsinspector/qmljsobserverclient.h +++ b/src/plugins/qmljsinspector/qmljsobserverclient.h @@ -80,6 +80,8 @@ public: void clearComponentCache(); signals: + void connectedStatusChanged(QDeclarativeDebugClient::Status status); + void currentObjectsChanged(const QList &debugIds); void selectedColorChanged(const QColor &color); void colorPickerActivated(); @@ -92,6 +94,7 @@ signals: void contextPathUpdated(const QStringList &path); protected: + virtual void statusChanged(Status); virtual void messageReceived(const QByteArray &); private: From a03e75726a02a1e2e4adee69769a0e7070d5c851 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 30 Sep 2010 15:03:42 +0200 Subject: [PATCH 078/118] QmlDebugger: Buffer messages in QmlAdapter until client is ready Don't 'loose' messages at startup because the client is not enabled yet / sendMessage will silently fail. Reviewed-by: Christiaan Janssen --- src/plugins/debugger/qml/qmladapter.cpp | 27 ++++++++++++++++++- src/plugins/debugger/qml/qmladapter.h | 2 ++ .../debugger/qml/qmldebuggerclient.cpp | 5 ---- src/plugins/debugger/qml/qmldebuggerclient.h | 3 --- 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/plugins/debugger/qml/qmladapter.cpp b/src/plugins/debugger/qml/qmladapter.cpp index 985fc4d9810..4c32f3c68a8 100644 --- a/src/plugins/debugger/qml/qmladapter.cpp +++ b/src/plugins/debugger/qml/qmladapter.cpp @@ -36,6 +36,8 @@ #include #include +#include + namespace Debugger { struct QmlAdapterPrivate { @@ -49,6 +51,7 @@ struct QmlAdapterPrivate { int m_connectionAttempts; int m_maxConnectionAttempts; QDeclarativeDebugConnection *m_conn; + QList sendBuffer; }; QmlAdapterPrivate::QmlAdapterPrivate(DebuggerEngine *engine, QmlAdapter *q) : @@ -133,6 +136,16 @@ bool QmlAdapter::connectToViewer() return true; } +void QmlAdapter::sendMessage(const QByteArray &msg) +{ + if (d->m_qmlClient->status() == QDeclarativeDebugClient::Enabled) { + flushSendBuffer(); + d->m_qmlClient->sendMessage(msg); + } else { + d->sendBuffer.append(msg); + } +} + void QmlAdapter::connectionErrorOccurred(QAbstractSocket::SocketError socketError) { showConnectionErrorMessage(tr("Error: (%1) %2", "%1=error code, %2=error message") @@ -151,6 +164,9 @@ void QmlAdapter::clientStatusChanged(QDeclarativeDebugClient::Status status) } logServiceStatusChange(serviceName, status); + + if (status == QDeclarativeDebugClient::Enabled) + flushSendBuffer(); } void QmlAdapter::connectionStateChanged() @@ -199,7 +215,7 @@ void QmlAdapter::createDebuggerClient() connect(d->m_qmlClient, SIGNAL(newStatus(QDeclarativeDebugClient::Status)), this, SLOT(clientStatusChanged(QDeclarativeDebugClient::Status))); connect(d->m_engine.data(), SIGNAL(sendMessage(QByteArray)), - d->m_qmlClient, SLOT(slotSendMessage(QByteArray))); + this, SLOT(sendMessage(QByteArray))); connect(d->m_qmlClient, SIGNAL(messageWasReceived(QByteArray)), d->m_engine.data(), SLOT(messageReceived(QByteArray))); @@ -272,4 +288,13 @@ void QmlAdapter::logServiceStatusChange(const QString &service, QDeclarativeDebu } } +void QmlAdapter::flushSendBuffer() +{ + QTC_ASSERT(d->m_qmlClient->status() == QDeclarativeDebugClient::Enabled, return); + foreach (const QByteArray &msg, d->sendBuffer) { + d->m_qmlClient->sendMessage(msg); + } + d->sendBuffer.clear(); +} + } // namespace Debugger diff --git a/src/plugins/debugger/qml/qmladapter.h b/src/plugins/debugger/qml/qmladapter.h index 8cbce251397..329faec69a1 100644 --- a/src/plugins/debugger/qml/qmladapter.h +++ b/src/plugins/debugger/qml/qmladapter.h @@ -84,6 +84,7 @@ signals: void serviceConnectionError(const QString serviceName); private slots: + void sendMessage(const QByteArray &msg); void connectionErrorOccurred(QAbstractSocket::SocketError socketError); void clientStatusChanged(QDeclarativeDebugClient::Status status); void connectionStateChanged(); @@ -94,6 +95,7 @@ private: void createDebuggerClient(); void showConnectionStatusMessage(const QString &message); void showConnectionErrorMessage(const QString &message); + void flushSendBuffer(); private: QScopedPointer d; diff --git a/src/plugins/debugger/qml/qmldebuggerclient.cpp b/src/plugins/debugger/qml/qmldebuggerclient.cpp index b0953df3004..99ebc0019c4 100644 --- a/src/plugins/debugger/qml/qmldebuggerclient.cpp +++ b/src/plugins/debugger/qml/qmldebuggerclient.cpp @@ -53,10 +53,5 @@ void QmlDebuggerClient::messageReceived(const QByteArray &data) emit messageWasReceived(data); } -void QmlDebuggerClient::slotSendMessage(const QByteArray &message) -{ - QDeclarativeDebugClient::sendMessage(message); -} - } // Internal } // Debugger diff --git a/src/plugins/debugger/qml/qmldebuggerclient.h b/src/plugins/debugger/qml/qmldebuggerclient.h index 271f632a94a..2345a56d923 100644 --- a/src/plugins/debugger/qml/qmldebuggerclient.h +++ b/src/plugins/debugger/qml/qmldebuggerclient.h @@ -47,9 +47,6 @@ signals: void newStatus(QDeclarativeDebugClient::Status status); void messageWasReceived(const QByteArray &data); -private Q_SLOTS: - void slotSendMessage(const QByteArray &message); - protected: virtual void statusChanged(Status status); virtual void messageReceived(const QByteArray &data); From c502c6e8183fcde97691116c4ff3fcc0558c23a0 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Fri, 1 Oct 2010 13:52:05 +0200 Subject: [PATCH 079/118] QmlJS: Fix an instance of relying on the Qt package name. Reviewed-by: Thomas Hartmann --- src/libs/qmljs/qmljsscopebuilder.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libs/qmljs/qmljsscopebuilder.cpp b/src/libs/qmljs/qmljsscopebuilder.cpp index d1c9374b1d3..2fbdc0403c6 100644 --- a/src/libs/qmljs/qmljsscopebuilder.cpp +++ b/src/libs/qmljs/qmljsscopebuilder.cpp @@ -282,7 +282,8 @@ const ObjectValue *ScopeBuilder::isPropertyChangesObject(const Context *context, while (prototype) { if (const QmlObjectValue *qmlMetaObject = dynamic_cast(prototype)) { if (qmlMetaObject->className() == QLatin1String("PropertyChanges") - && qmlMetaObject->packageName() == QLatin1String("Qt")) + && (qmlMetaObject->packageName() == QLatin1String("Qt") + || qmlMetaObject->packageName() == QLatin1String("QtQuick"))) return prototype; } prototype = prototype->prototype(context); From f710584603c9322b57dd3725edbcd1051965e9ad Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 1 Oct 2010 14:14:51 +0200 Subject: [PATCH 080/118] QmlDesigner: do not allow deprectaed Qt 4.7 imports for Bauhaus Bauhaus does not support import Qt 4.7 anymore Reviewed-by: Kai Koehne --- .../qmldesigner/designercore/include/rewriterview.h | 1 + .../qmldesigner/designercore/model/rewriterview.cpp | 10 ++++++++++ .../designercore/model/texttomodelmerger.cpp | 10 ++++++++++ 3 files changed, 21 insertions(+) diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h index c53764c4193..dc488fa647a 100644 --- a/src/plugins/qmldesigner/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h @@ -78,6 +78,7 @@ public: public: Error(); Error(const QDeclarativeError &qmlError); + Error(const QString &shortDescription); Error(Exception *exception); Type type() const diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index 741e05884c0..19837bee51f 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -71,6 +71,16 @@ RewriterView::Error::Error(const QDeclarativeError &qmlError): { } +RewriterView::Error::Error(const QString &shortDescription) : + m_type(ParseError), + m_line(1), + m_column(0), + m_description(shortDescription), + m_url() +{ +} + + QString RewriterView::Error::toString() const { QString str; diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index bd289d0aefc..5319445aaf4 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -587,6 +587,16 @@ bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceH setupImports(doc, differenceHandler); + foreach (const Import &import, m_rewriterView->model()->imports()) { + if (import.url() == "Qt") { + QList errors; + RewriterView::Error error(QObject::tr("Deprecated import: import Qt 4.7 use import QtQuick 1.0 instead")); + errors.append(error); + m_rewriterView->setErrors(errors); + return false; + } + } + UiObjectMember *astRootNode = 0; if (UiProgram *program = doc->qmlProgram()) if (program->members) From 97a56a627ac1f3d7093efb1df255e1ef7b036368 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 1 Oct 2010 15:49:09 +0200 Subject: [PATCH 081/118] Maemo: Fix UTFS timeout timer not being stopped in some cases. --- .../qt-maemo/maemoremotemounter.cpp | 41 +++++++++++-------- .../qt-maemo/maemoremotemounter.h | 15 ++++--- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.cpp index 32403854ae4..092f478a2c3 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.cpp @@ -89,7 +89,7 @@ void MaemoRemoteMounter::mount() if (!m_toolChain->allowsRemoteMounts()) m_mountSpecs.clear(); if (m_mountSpecs.isEmpty()) { - m_state = Inactive; + setState(Inactive); emit reportProgress(tr("No directories to mount")); emit mounted(); } else { @@ -121,7 +121,7 @@ void MaemoRemoteMounter::unmount() SLOT(handleUnmountProcessFinished(int))); connect(m_unmountProcess.data(), SIGNAL(errorOutputAvailable(QByteArray)), this, SLOT(handleUmountStderr(QByteArray))); - m_state = Unmounting; + setState(Unmounting); m_unmountProcess->start(); } @@ -131,7 +131,7 @@ void MaemoRemoteMounter::handleUnmountProcessFinished(int exitStatus) if (m_state == Inactive) return; - m_state = Inactive; + setState(Inactive); QString errorMsg; switch (exitStatus) { @@ -165,7 +165,7 @@ void MaemoRemoteMounter::handleUnmountProcessFinished(int exitStatus) void MaemoRemoteMounter::stop() { - m_state = Inactive; + setState(Inactive); if (m_utfsClientUploader) { disconnect(m_utfsClientUploader.data(), 0, this, 0); m_utfsClientUploader->closeChannel(); @@ -190,7 +190,7 @@ void MaemoRemoteMounter::deployUtfsClient() this, SLOT(handleUploaderInitializationFailed(QString))); m_utfsClientUploader->initialize(); - m_state = UploaderInitializing; + setState(UploaderInitializing); } void MaemoRemoteMounter::handleUploaderInitializationFailed(const QString &reason) @@ -199,7 +199,7 @@ void MaemoRemoteMounter::handleUploaderInitializationFailed(const QString &reaso if (m_state == UploaderInitializing) { emit error(tr("Failed to establish SFTP connection: %1").arg(reason)); - m_state = Inactive; + setState(Inactive); } } @@ -218,11 +218,11 @@ void MaemoRemoteMounter::handleUploaderInitialized() m_uploadJobId = m_utfsClientUploader->uploadFile(localFile, utfsClientOnDevice(), SftpOverwriteExisting); if (m_uploadJobId == SftpInvalidJob) { - m_state = Inactive; + setState(Inactive); emit error(tr("Could not upload UTFS client (%1).").arg(localFile)); + } else { + setState(UploadRunning); } - - m_state = UploadRunning; } void MaemoRemoteMounter::handleUploadFinished(Core::SftpJobId jobId, @@ -241,7 +241,7 @@ void MaemoRemoteMounter::handleUploadFinished(Core::SftpJobId jobId, m_uploadJobId = SftpInvalidJob; if (!errorMsg.isEmpty()) { emit error(tr("Could not upload UTFS client: %1").arg(errorMsg)); - m_state = Inactive; + setState(Inactive); return; } @@ -285,14 +285,14 @@ void MaemoRemoteMounter::startUtfsClients() this, SLOT(handleUtfsClientStderr(QByteArray))); m_mountProcess->start(); - m_state = UtfsClientsStarting; + setState(UtfsClientsStarting); } void MaemoRemoteMounter::handleUtfsClientsStarted() { ASSERT_STATE(QList() << UtfsClientsStarting << Inactive); if (m_state == UtfsClientsStarting) { - m_state = UtfsClientsStarted; + setState(UtfsClientsStarted); QTimer::singleShot(250, this, SLOT(startUtfsServers())); } } @@ -305,7 +305,7 @@ void MaemoRemoteMounter::handleUtfsClientsFinished(int exitStatus) if (m_state == Inactive) return; - m_state = Inactive; + setState(Inactive); if (exitStatus == SshRemoteProcess::ExitedNormally && m_mountProcess->exitCode() == 0) { m_utfsServerTimer->stop(); @@ -352,7 +352,7 @@ void MaemoRemoteMounter::startUtfsServers() utfsServerProc->start(utfsServer(), utfsServerArgs); } - m_state = UtfsServersStarted; + setState(UtfsServersStarted); } void MaemoRemoteMounter::handleUtfsServerStderr() @@ -377,10 +377,9 @@ void MaemoRemoteMounter::handleUtfsServerError(QProcess::ProcessError) .arg(QString::fromLocal8Bit(errorOutput)); } killAllUtfsServers(); - m_utfsServerTimer->stop(); emit error(tr("Error running UTFS server: %1").arg(errorString)); - m_state = Inactive; + setState(Inactive); } void MaemoRemoteMounter::handleUtfsServerFinished(int /* exitCode */, @@ -436,8 +435,9 @@ void MaemoRemoteMounter::handleUtfsServerTimeout() killAllUtfsServers(); emit error(tr("Timeout waiting for UTFS servers to connect.")); + // TODO: utfs clients are still waiting; kill them here - m_state = Inactive; + setState(Inactive); } void MaemoRemoteMounter::assertState(State expectedState, const char *func) @@ -452,5 +452,12 @@ void MaemoRemoteMounter::assertState(const QList &expectedStates, qDebug("Unexpected state %d at %s.", m_state, func)) } +void MaemoRemoteMounter::setState(State newState) +{ + if (newState == Inactive) + m_utfsServerTimer->stop(); + m_state = newState; +} + } // namespace Internal } // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.h b/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.h index 155bb4a210b..4533e130686 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.h @@ -95,6 +95,15 @@ private slots: void startUtfsServers(); private: + enum State { + Inactive, Unmounting, UploaderInitializing, UploadRunning, + UtfsClientsStarting, UtfsClientsStarted, UtfsServersStarted + }; + + void assertState(State expectedState, const char *func); + void assertState(const QList &expectedStates, const char *func); + void setState(State newState); + void deployUtfsClient(); void startUtfsClients(); void killUtfsServer(QProcess *proc); @@ -127,12 +136,6 @@ private: QByteArray m_umountStderr; MaemoPortList m_portList; - enum State { - Inactive, Unmounting, UploaderInitializing, UploadRunning, - UtfsClientsStarting, UtfsClientsStarted, UtfsServersStarted - }; - void assertState(State expectedState, const char *func); - void assertState(const QList &expectedStates, const char *func); State m_state; }; From fad242c91317862f244baac55e77aafd5b8b36cd Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 1 Oct 2010 16:20:18 +0200 Subject: [PATCH 082/118] Maemo: Kill UTFS clients as well as UTFS servers in case of an error. --- .../qt-maemo/maemoremotemounter.cpp | 12 ++++++++++-- .../qt4projectmanager/qt-maemo/maemoremotemounter.h | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.cpp index 092f478a2c3..3aca439313d 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.cpp @@ -308,7 +308,6 @@ void MaemoRemoteMounter::handleUtfsClientsFinished(int exitStatus) setState(Inactive); if (exitStatus == SshRemoteProcess::ExitedNormally && m_mountProcess->exitCode() == 0) { - m_utfsServerTimer->stop(); emit reportProgress(tr("Mount operation succeeded.")); emit mounted(); } else { @@ -377,6 +376,7 @@ void MaemoRemoteMounter::handleUtfsServerError(QProcess::ProcessError) .arg(QString::fromLocal8Bit(errorOutput)); } killAllUtfsServers(); + killUtfsClients(); emit error(tr("Error running UTFS server: %1").arg(errorString)); setState(Inactive); @@ -434,8 +434,8 @@ void MaemoRemoteMounter::handleUtfsServerTimeout() return; killAllUtfsServers(); + killUtfsClients(); emit error(tr("Timeout waiting for UTFS servers to connect.")); - // TODO: utfs clients are still waiting; kill them here setState(Inactive); } @@ -459,5 +459,13 @@ void MaemoRemoteMounter::setState(State newState) m_state = newState; } +void MaemoRemoteMounter::killUtfsClients() +{ + const SshRemoteProcess::Ptr utfsClientKiller + = m_connection->createRemoteProcess("pkill utfs-client; sleep 1; " + "pkill -9 utfs-client"); + utfsClientKiller->start(); +} + } // namespace Internal } // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.h b/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.h index 4533e130686..9445d3d050d 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemoremotemounter.h @@ -108,6 +108,7 @@ private: void startUtfsClients(); void killUtfsServer(QProcess *proc); void killAllUtfsServers(); + void killUtfsClients(); QString utfsClientOnDevice() const; QString utfsServer() const; From cb5f706352d41e4b52f2c88fee6c2d6887cb5e7b Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 1 Oct 2010 16:54:40 +0200 Subject: [PATCH 083/118] UI text - fix capitalization in Qt Quick Application wizard Reviewed-by: Christian Kandeler --- .../wizards/abstractmobileappwizard.cpp | 4 ++-- .../wizards/mobileappwizardoptionspage.ui | 10 +++++----- .../qt4projectmanager/wizards/mobileappwizardpages.cpp | 6 +++--- .../wizards/qmlstandaloneappwizardpages.cpp | 2 +- .../wizards/qmlstandaloneappwizardsourcespage.ui | 6 +++--- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp index a2ba842938b..deb753b07fb 100644 --- a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp @@ -49,10 +49,10 @@ AbstractMobileAppWizardDialog::AbstractMobileAppWizardDialog(QWidget *parent) resize(900, 450); m_targetsPage->setImportDirectoryBrowsingEnabled(false); int pageId = addPage(m_targetsPage); - wizardProgress()->item(pageId)->setTitle(tr("Qt versions")); + wizardProgress()->item(pageId)->setTitle(tr("Qt Versions")); m_optionsPage = new MobileAppWizardOptionsPage; pageId = addPage(m_optionsPage); - wizardProgress()->item(pageId)->setTitle(tr("Application options")); + wizardProgress()->item(pageId)->setTitle(tr("Application Options")); } diff --git a/src/plugins/qt4projectmanager/wizards/mobileappwizardoptionspage.ui b/src/plugins/qt4projectmanager/wizards/mobileappwizardoptionspage.ui index 78878deca39..95a6bc5f1cd 100644 --- a/src/plugins/qt4projectmanager/wizards/mobileappwizardoptionspage.ui +++ b/src/plugins/qt4projectmanager/wizards/mobileappwizardoptionspage.ui @@ -32,7 +32,7 @@ - Orientation Behavior: + Orientation behavior: orientationBehaviorComboBox @@ -52,7 +52,7 @@ - Symbian specific + Symbian Specific @@ -64,7 +64,7 @@ - Application Icon (.svg): + Application icon (.svg): symbianAppIconLoadToolButton @@ -164,7 +164,7 @@ - Maemo specific + Maemo Specific @@ -176,7 +176,7 @@ - Application Icon (64x64): + Application icon (64x64): diff --git a/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.cpp b/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.cpp index 6ba89cd368a..0c6b696b6c7 100644 --- a/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.cpp +++ b/src/plugins/qt4projectmanager/wizards/mobileappwizardpages.cpp @@ -59,11 +59,11 @@ MobileAppWizardOptionsPage::MobileAppWizardOptionsPage(QWidget *parent) connect(m_d->ui.maemoPngIconButton, SIGNAL(clicked()), this, SLOT(openMaemoPngIcon())); - m_d->ui.orientationBehaviorComboBox->addItem(tr("Auto rotate orientation"), + m_d->ui.orientationBehaviorComboBox->addItem(tr("Automatically Rotate Orientation"), AbstractMobileApp::Auto); - m_d->ui.orientationBehaviorComboBox->addItem(tr("Lock to landscape orientation"), + m_d->ui.orientationBehaviorComboBox->addItem(tr("Lock to Landscape Orientation"), AbstractMobileApp::LockLandscape); - m_d->ui.orientationBehaviorComboBox->addItem(tr("Lock to portrait orientation"), + m_d->ui.orientationBehaviorComboBox->addItem(tr("Lock to Portrait Orientation"), AbstractMobileApp::LockPortrait); } diff --git a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizardpages.cpp b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizardpages.cpp index 34a071b2ec6..d458ca6073e 100644 --- a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizardpages.cpp +++ b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizardpages.cpp @@ -53,7 +53,7 @@ QmlStandaloneAppWizardSourcesPage::QmlStandaloneAppWizardSourcesPage(QWidget *pa m_d->ui.setupUi(this); m_d->ui.mainQmlFileLineEdit->setExpectedKind(Utils::PathChooser::File); m_d->ui.mainQmlFileLineEdit->setPromptDialogFilter(QLatin1String("*.qml")); - m_d->ui.mainQmlFileLineEdit->setPromptDialogTitle(tr("Select the main QML file of the application.")); + m_d->ui.mainQmlFileLineEdit->setPromptDialogTitle(tr("Select QML File")); m_d->ui.addModuleUriButton->setIcon(QIcon(QLatin1String(Core::Constants::ICON_PLUS))); m_d->ui.removeModuleUriButton->setIcon(QIcon(QLatin1String(Core::Constants::ICON_MINUS))); m_d->ui.addImportPathButton->setIcon(QIcon(QLatin1String(Core::Constants::ICON_PLUS))); diff --git a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizardsourcespage.ui b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizardsourcespage.ui index 1766bba1bea..235e0b0a823 100644 --- a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizardsourcespage.ui +++ b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizardsourcespage.ui @@ -17,7 +17,7 @@ - Main QML file + Main QML File @@ -78,7 +78,7 @@ - URIs (e.g. 'org.mydomain.MyQmlModule') + URIs (e.g. 'org.mydomain.MyQmlModule'): @@ -122,7 +122,7 @@ - Import Paths + Import paths: From 1cd2791d23089b031d2e0e50d8063b6668b56e32 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 1 Oct 2010 17:15:46 +0200 Subject: [PATCH 084/118] debugger: fix disabling of breakpoints using the context menu Reviewed-by: Robert Loehning Task-number: QTCREATORBUG-2543, QTCREATORBUG-2544 --- src/plugins/debugger/debuggerengine.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index 59a77d55cc0..2bc800610aa 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -326,7 +326,7 @@ void DebuggerEnginePrivate::breakpointSetRemoveMarginActionTriggered() QAction *act = qobject_cast(sender()); QTC_ASSERT(act, return); QList list = act->data().toList(); - QTC_ASSERT(list.size() >= 3, return); + QTC_ASSERT(list.size() >= 3, qDebug() << list; return); const QString fileName = list.at(0).toString(); const int lineNumber = list.at(1).toInt(); const quint64 address = list.at(2).toULongLong(); @@ -338,7 +338,7 @@ void DebuggerEnginePrivate::breakpointEnableDisableMarginActionTriggered() QAction *act = qobject_cast(sender()); QTC_ASSERT(act, return); QList list = act->data().toList(); - QTC_ASSERT(list.size() == 2, return); + QTC_ASSERT(list.size() == 3, qDebug() << list; return); const QString fileName = list.at(0).toString(); const int lineNumber = list.at(1).toInt(); m_breakHandler.toggleBreakpointEnabled(fileName, lineNumber); @@ -347,7 +347,7 @@ void DebuggerEnginePrivate::breakpointEnableDisableMarginActionTriggered() void DebuggerEnginePrivate::handleContextMenuRequest(const QVariant ¶meters) { const QList list = parameters.toList(); - QTC_ASSERT(list.size() == 3, return); + QTC_ASSERT(list.size() == 3, qDebug() << list; return); TextEditor::ITextEditor *editor = (TextEditor::ITextEditor *)(list.at(0).value()); int lineNumber = list.at(1).toInt(); From 8a48ef786965b849d3c120a4963eaccc6121908c Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Fri, 1 Oct 2010 16:58:11 +0200 Subject: [PATCH 085/118] QmlJSInspector: Remove disconnect without a connect --- src/plugins/qmljsinspector/qmljsclientproxy.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/plugins/qmljsinspector/qmljsclientproxy.cpp b/src/plugins/qmljsinspector/qmljsclientproxy.cpp index 4bd763c7fde..59d430f5e02 100644 --- a/src/plugins/qmljsinspector/qmljsclientproxy.cpp +++ b/src/plugins/qmljsinspector/qmljsclientproxy.cpp @@ -132,8 +132,6 @@ void ClientProxy::disconnectFromServer() this, SIGNAL(selectedColorChanged(QColor))); disconnect(m_designClient, SIGNAL(contextPathUpdated(QStringList)), this, SIGNAL(contextPathUpdated(QStringList))); - disconnect(m_designClient, SIGNAL(treeRefreshRequested()), - this, SLOT(refreshObjectTree())); delete m_designClient; m_designClient = 0; @@ -165,6 +163,7 @@ void ClientProxy::onCurrentObjectsChanged(const QList< int >& debugIds, bool req { QList selectedItems; + qDebug() << __FUNCTION__ << debugIds; foreach (int debugId, debugIds) { QDeclarativeDebugObjectReference ref = objectReferenceForId(debugId); if (ref.debugId() != -1) { From 83e2a378508935b400d83aa08f8a89d4f7e78339 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Fri, 1 Oct 2010 16:28:45 +0200 Subject: [PATCH 086/118] QmlObserver: Disable UI when no server plugin exists Reviewed-by: Christiaan Janssen --- src/plugins/debugger/qml/qmladapter.h | 1 - .../qmljsinspector/qmljsclientproxy.cpp | 29 +++++++++++++----- src/plugins/qmljsinspector/qmljsclientproxy.h | 4 ++- src/plugins/qmljsinspector/qmljsinspector.cpp | 30 +++++++++++++++---- src/plugins/qmljsinspector/qmljsinspector.h | 2 ++ 5 files changed, 51 insertions(+), 15 deletions(-) diff --git a/src/plugins/debugger/qml/qmladapter.h b/src/plugins/debugger/qml/qmladapter.h index 329faec69a1..64478569d7b 100644 --- a/src/plugins/debugger/qml/qmladapter.h +++ b/src/plugins/debugger/qml/qmladapter.h @@ -76,7 +76,6 @@ public: void logServiceStatusChange(const QString &service, QDeclarativeDebugClient::Status newStatus); signals: - void aboutToDisconnect(); void connected(); void disconnected(); void connectionStartupFailed(); diff --git a/src/plugins/qmljsinspector/qmljsclientproxy.cpp b/src/plugins/qmljsinspector/qmljsclientproxy.cpp index 59d430f5e02..d86f59cb78a 100644 --- a/src/plugins/qmljsinspector/qmljsclientproxy.cpp +++ b/src/plugins/qmljsinspector/qmljsclientproxy.cpp @@ -53,10 +53,10 @@ ClientProxy::ClientProxy(Debugger::QmlAdapter *adapter, QObject *parent) , m_designClient(0) , m_engineQuery(0) , m_contextQuery(0) + , m_isConnected(false) { m_requestObjectsTimer.setSingleShot(true); m_requestObjectsTimer.setInterval(3000); - connect(m_adapter, SIGNAL(aboutToDisconnect()), SLOT(disconnectFromServer())); connect(m_client, SIGNAL(newObjects()), this, SLOT(newObjects())); connect(&m_requestObjectsTimer, SIGNAL(timeout()), this, SLOT(refreshObjectTree())); connectToServer(); @@ -66,8 +66,6 @@ void ClientProxy::connectToServer() { m_designClient = new QmlJSObserverClient(m_adapter->connection(), this); - if (m_designClient->status() == QDeclarativeDebugClient::Enabled) - emit connected(); m_adapter->logServiceStatusChange(m_designClient->name(), m_designClient->status()); @@ -93,7 +91,9 @@ void ClientProxy::connectToServer() SIGNAL(selectedColorChanged(QColor))); connect(m_designClient, SIGNAL(contextPathUpdated(QStringList)), SIGNAL(contextPathUpdated(QStringList))); + reloadEngines(); + updateConnected(); } void ClientProxy::clientStatusChanged(QDeclarativeDebugClient::Status status) @@ -105,8 +105,7 @@ void ClientProxy::clientStatusChanged(QDeclarativeDebugClient::Status status) m_adapter->logServiceStatusChange(serviceName, status); - if (status == QDeclarativeDebugClient::Enabled) - emit connected(); + updateConnected(); } void ClientProxy::disconnectFromServer() @@ -147,6 +146,8 @@ void ClientProxy::disconnectFromServer() qDeleteAll(m_objectTreeQuery); m_objectTreeQuery.clear(); + + updateConnected(); } void ClientProxy::refreshObjectTree() @@ -494,6 +495,21 @@ void ClientProxy::setContextPathIndex(int contextIndex) m_designClient->setContextPathIndex(contextIndex); } +void ClientProxy::updateConnected() +{ + bool isConnected = m_designClient && m_designClient->status() == QDeclarativeDebugClient::Enabled + && m_client && m_client->status() == QDeclarativeEngineDebug::Enabled; + + if (isConnected != m_isConnected) { + m_isConnected = isConnected; + if (isConnected) { + emit connected(); + } else { + emit disconnected(); + } + } +} + void ClientProxy::reloadEngines() { if (m_engineQuery) { @@ -532,8 +548,7 @@ Debugger::QmlAdapter *ClientProxy::qmlAdapter() const bool ClientProxy::isConnected() const { - return m_designClient && m_designClient->status() == QDeclarativeDebugClient::Enabled - && m_client && m_client->status() == QDeclarativeEngineDebug::Enabled; + return m_isConnected; } void ClientProxy::newObjects() diff --git a/src/plugins/qmljsinspector/qmljsclientproxy.h b/src/plugins/qmljsinspector/qmljsclientproxy.h index 81a7a5d08c5..bfd628e64f0 100644 --- a/src/plugins/qmljsinspector/qmljsclientproxy.h +++ b/src/plugins/qmljsinspector/qmljsclientproxy.h @@ -92,7 +92,6 @@ signals: void selectedItemsChanged(const QList &selectedItems); void connected(); - void aboutToDisconnect(); void disconnected(); void colorPickerActivated(); @@ -136,6 +135,7 @@ private slots: void newObjects(); private: + void updateConnected(); void reloadEngines(); QList objectReferences(const QDeclarativeDebugObjectReference &objectRef) const; @@ -157,6 +157,8 @@ private: QList m_engines; QTimer m_requestObjectsTimer; DebugIdHash m_debugIdHash; + + bool m_isConnected; }; } // namespace Internal diff --git a/src/plugins/qmljsinspector/qmljsinspector.cpp b/src/plugins/qmljsinspector/qmljsinspector.cpp index 4f0c39fe0eb..6c25985f643 100644 --- a/src/plugins/qmljsinspector/qmljsinspector.cpp +++ b/src/plugins/qmljsinspector/qmljsinspector.cpp @@ -501,6 +501,20 @@ void InspectorUi::setSelectedItemsByObjectReference(QListenable(); + m_crumblePath->setEnabled(true); + m_objectTreeWidget->setEnabled(true); +} + +void InspectorUi::disable() +{ + m_toolbar->disable(); + m_crumblePath->setEnabled(false); + m_objectTreeWidget->setEnabled(false); +} + void InspectorUi::gotoObjectReferenceDefinition(const QDeclarativeDebugObjectReference &obj) { Q_UNUSED(obj); @@ -686,8 +700,8 @@ void InspectorUi::disableLivePreview() void InspectorUi::setupToolbar(bool doConnect) { if (doConnect) { - connect(m_clientProxy, SIGNAL(connected()), m_toolbar, SLOT(enable())); - connect(m_clientProxy, SIGNAL(disconnected()), m_toolbar, SLOT(disable())); + connect(m_clientProxy, SIGNAL(connected()), this, SLOT(enable())); + connect(m_clientProxy, SIGNAL(disconnected()), this, SLOT(disable())); connect(m_toolbar, SIGNAL(designModeSelected(bool)), m_clientProxy, SLOT(setDesignModeBehavior(bool))); connect(m_toolbar, SIGNAL(reloadSelected()), m_clientProxy, SLOT(reloadQmlViewer())); @@ -705,10 +719,9 @@ void InspectorUi::setupToolbar(bool doConnect) connect(m_clientProxy, SIGNAL(selectedColorChanged(QColor)), m_toolbar, SLOT(setSelectedColor(QColor))); connect(m_clientProxy, SIGNAL(animationSpeedChanged(qreal)), m_toolbar, SLOT(setAnimationSpeed(qreal))); - m_toolbar->enable(); } else { - disconnect(m_clientProxy, SIGNAL(connected()), m_toolbar, SLOT(enable())); - disconnect(m_clientProxy, SIGNAL(disconnected()), m_toolbar, SLOT(disable())); + disconnect(m_clientProxy, SIGNAL(connected()), this, SLOT(enable())); + disconnect(m_clientProxy, SIGNAL(disconnected()), this, SLOT(disable())); disconnect(m_toolbar, SIGNAL(designModeSelected(bool)), m_clientProxy, SLOT(setDesignModeBehavior(bool))); disconnect(m_toolbar, SIGNAL(reloadSelected()), m_clientProxy, SLOT(reloadQmlViewer())); @@ -726,6 +739,11 @@ void InspectorUi::setupToolbar(bool doConnect) disconnect(m_clientProxy, SIGNAL(selectedColorChanged(QColor)), m_toolbar, SLOT(setSelectedColor(QColor))); disconnect(m_clientProxy, SIGNAL(animationSpeedChanged(qreal)), m_toolbar, SLOT(setAnimationSpeed(qreal))); - m_toolbar->disable(); + } + + if (m_clientProxy && m_clientProxy->isConnected()) { + enable(); + } else { + disable(); } } diff --git a/src/plugins/qmljsinspector/qmljsinspector.h b/src/plugins/qmljsinspector/qmljsinspector.h index 494b0fde913..ae56e4eca1a 100644 --- a/src/plugins/qmljsinspector/qmljsinspector.h +++ b/src/plugins/qmljsinspector/qmljsinspector.h @@ -119,6 +119,8 @@ public slots: void setApplyChangesToQmlObserver(bool applyChanges); private slots: + void enable(); + void disable(); void gotoObjectReferenceDefinition(const QDeclarativeDebugObjectReference &obj); void setSelectedItemsByObjectReference(QList objectReferences); From 4cbbe9ca7be2b07f928f4cc1554d9149d6d99f2a Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Fri, 1 Oct 2010 17:30:50 +0200 Subject: [PATCH 087/118] QmlInspector: Fix regression making the observer unusable We've to wait with reloadEngines until the services are actually enabled. --- src/plugins/qmljsinspector/qmljsclientproxy.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmljsinspector/qmljsclientproxy.cpp b/src/plugins/qmljsinspector/qmljsclientproxy.cpp index d86f59cb78a..2521c91a573 100644 --- a/src/plugins/qmljsinspector/qmljsclientproxy.cpp +++ b/src/plugins/qmljsinspector/qmljsclientproxy.cpp @@ -92,7 +92,6 @@ void ClientProxy::connectToServer() connect(m_designClient, SIGNAL(contextPathUpdated(QStringList)), SIGNAL(contextPathUpdated(QStringList))); - reloadEngines(); updateConnected(); } @@ -504,6 +503,7 @@ void ClientProxy::updateConnected() m_isConnected = isConnected; if (isConnected) { emit connected(); + reloadEngines(); } else { emit disconnected(); } From 5a6faea21f6af9f74de7007949451e668515a4ca Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Fri, 1 Oct 2010 17:42:13 +0200 Subject: [PATCH 088/118] QmlJsInspector: Remove unconditional qDebug --- src/plugins/qmljsinspector/qmljsclientproxy.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/plugins/qmljsinspector/qmljsclientproxy.cpp b/src/plugins/qmljsinspector/qmljsclientproxy.cpp index 2521c91a573..42f15c14d87 100644 --- a/src/plugins/qmljsinspector/qmljsclientproxy.cpp +++ b/src/plugins/qmljsinspector/qmljsclientproxy.cpp @@ -163,7 +163,6 @@ void ClientProxy::onCurrentObjectsChanged(const QList< int >& debugIds, bool req { QList selectedItems; - qDebug() << __FUNCTION__ << debugIds; foreach (int debugId, debugIds) { QDeclarativeDebugObjectReference ref = objectReferenceForId(debugId); if (ref.debugId() != -1) { From d40007938c721b4985cd4ee88baedbd935971a6c Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 1 Oct 2010 17:43:23 +0200 Subject: [PATCH 089/118] debugger: fix QObject property dumping on Windows The problem of gdb finding QVector::malloc instead of the global malloc appeared again. The workaorund is to use calloc which is not used by Qt. However, for transfering string literal data to the inferior gdb uses malloc internally outside our control, so we cannot use string literals in inferior calls at all. In the particular case of QObject property names we are lucky as the data already exists in the inferior memory. This patch just uses it. Reviewed-by: Leandro Melo Task: QTCREATORBUG-2533 --- share/qtcreator/gdbmacros/gdbmacros.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/share/qtcreator/gdbmacros/gdbmacros.py b/share/qtcreator/gdbmacros/gdbmacros.py index e3574f5325a..0a0bcec04dc 100644 --- a/share/qtcreator/gdbmacros/gdbmacros.py +++ b/share/qtcreator/gdbmacros/gdbmacros.py @@ -770,7 +770,8 @@ def qdump__QObject(d, item): # % (d.ns, item.value.address, propertyName) #exp = '"((\'%sQObject\'*)%s)"' % (d.ns, item.value.address,) #warn("EXPRESSION: %s" % exp) - value = call(item.value, 'property("%s")' % propertyName) + value = call(item.value, 'property(%s)' + % cleanAddress(metaStringData + metaData[offset])) value1 = value["d"] #warn(" CODE: %s" % value1["type"]) # Type 1 and 2 are bool and int. Try to save a few cycles in this case: From cbdf363709e8355785c60e10903da299c3cb1235 Mon Sep 17 00:00:00 2001 From: Pawel Polanski Date: Fri, 1 Oct 2010 18:37:30 +0200 Subject: [PATCH 090/118] Unable to change the value of a variable while debugging Symbian - issue fixed Reviewed-by: hjk --- src/plugins/debugger/gdb/symbian.cpp | 8 +++-- src/plugins/debugger/gdb/trkgdbadapter.cpp | 34 ++++++++++++++++++++++ src/plugins/debugger/gdb/trkgdbadapter.h | 2 ++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/plugins/debugger/gdb/symbian.cpp b/src/plugins/debugger/gdb/symbian.cpp index 4cae2ce81bc..636c83da85e 100644 --- a/src/plugins/debugger/gdb/symbian.cpp +++ b/src/plugins/debugger/gdb/symbian.cpp @@ -548,7 +548,7 @@ QVector gdbStartupSequence() } // namespace Symbian // Generic gdb server helpers: Read address/length off a memory -// command like 'm845,455','X845,455' +// command like 'm845,455','X845,455:' QPair parseGdbReadMemoryRequest(const QByteArray &cmd) { QPair rc(0, 0); @@ -559,7 +559,11 @@ QPair parseGdbReadMemoryRequest(const QByteArray &cmd) rc.first = cmd.mid(1, pos - 1).toULongLong(&ok, 16); if (!ok) return rc; - rc.second = cmd.mid(pos + 1).toUInt(&ok, 16); + const int colonPos = cmd.indexOf(':'); + if (colonPos == -1) + rc.second = cmd.mid(pos + 1).toUInt(&ok, 16); + else + rc.second = cmd.mid(pos + 1, colonPos - pos - 1 ).toUInt(&ok, 16); if (!ok) rc.first = 0; return rc; diff --git a/src/plugins/debugger/gdb/trkgdbadapter.cpp b/src/plugins/debugger/gdb/trkgdbadapter.cpp index 1e32fcb26fd..05d1ba6bc40 100644 --- a/src/plugins/debugger/gdb/trkgdbadapter.cpp +++ b/src/plugins/debugger/gdb/trkgdbadapter.cpp @@ -829,6 +829,17 @@ void TrkGdbAdapter::handleGdbServerCommand(const QByteArray &cmd) sendGdbServerMessage("E20", msg.toLatin1()); } } // qPart/qXfer + + else if (cmd.startsWith("X")) { + logMessage(msgGdbPacket(QLatin1String("Write memory"))); + // X addr,length + sendGdbServerAck(); + const QPair addrLength = parseGdbReadMemoryRequest(cmd); + int pos = cmd.indexOf(':'); + m_snapshot.resetMemory(); + writeMemory(addrLength.first, cmd.mid(pos + 1, addrLength.second)); + } + else { logMessage(msgGdbPacket(QLatin1String("FIXME unknown: ") + QString::fromAscii(cmd)), LogWarning); @@ -1444,6 +1455,29 @@ void TrkGdbAdapter::readMemory(uint addr, uint len, bool buffered) tryAnswerGdbMemoryRequest(buffered); } +void TrkGdbAdapter::writeMemory(uint addr, const QByteArray &data) +{ + Q_ASSERT(data.size() < (2 << 16)); + if (m_verbose > 2) { + logMessage(_("writeMemory %1 bytes from 0x%2 blocksize=%3 data=%4") + .arg(data.size()).arg(addr, 0, 16).arg(MemoryChunkSize).arg(QString::fromLatin1(data.toHex()))); + } + + sendTrkMessage(0x11, TrkCB(handleWriteMemory), + trkWriteMemoryMessage(addr, data)); +} + +void TrkGdbAdapter::handleWriteMemory(const TrkResult &result) +{ + logMessage(" RESULT: " + result.toString() + result.cookie.toString()); + if (result.errorCode()) { + logMessage("ERROR: " + result.errorString(), LogError); + sendGdbServerMessage("E01"); + return; + } + sendGdbServerMessage("OK"); +} + void TrkGdbAdapter::interruptInferior() { sendTrkMessage(0x1a, TrkCallback(), trkInterruptMessage(), "Interrupting..."); diff --git a/src/plugins/debugger/gdb/trkgdbadapter.h b/src/plugins/debugger/gdb/trkgdbadapter.h index 1e7873815e9..2ea7e1bcfab 100644 --- a/src/plugins/debugger/gdb/trkgdbadapter.h +++ b/src/plugins/debugger/gdb/trkgdbadapter.h @@ -162,12 +162,14 @@ private: void handleStep(const TrkResult &result); void handleReadRegisters(const TrkResult &result); void handleWriteRegister(const TrkResult &result); + void handleWriteMemory(const TrkResult &result); void reportToGdb(const TrkResult &result); void gdbSetCurrentThread(const QByteArray &cmd, const char *why); //void reportReadMemoryBuffered(const TrkResult &result); //void reportReadMemoryUnbuffered(const TrkResult &result); void readMemory(uint addr, uint len, bool buffered); + void writeMemory(uint addr, const QByteArray &data); void handleDirectTrk(const TrkResult &response); void directStep(uint addr); From 77259d1d386652fea9c2d40c934bbbbe282e2e2a Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 1 Oct 2010 18:42:00 +0200 Subject: [PATCH 091/118] fakevim: reset op count when leaving insert mode Reviewed-by: Alessandro Portale Task-number: QTCREATORBUG-2552 --- src/plugins/fakevim/fakevimhandler.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index 605fdcf173a..39e397b698b 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -2659,6 +2659,8 @@ EventResult FakeVimHandler::Private::handleInsertMode(const Input &input) enterCommandMode(); m_submode = NoSubMode; m_ctrlVActive = false; + m_opcount.clear(); + m_mvcount.clear(); } else if (m_ctrlVActive) { insertInInsertMode(input.raw()); } else if (input.isControl('v')) { From 043cf532ecac1a3a69dd6af356e638012dc232ec Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Sat, 2 Oct 2010 18:26:51 +0200 Subject: [PATCH 092/118] Improved the comments in the generate qml app code. This was committed to the master branch, but was supposed to go into 2.1 (I misunderstood the branching strategy of Creator 2.1). Since this does not change Creator code: Reviewed-by: Trustme --- share/qtcreator/templates/qmlapp/app.pro | 3 ++- .../qmlapp/qmlapplicationviewer/qmlapplicationviewer.pri | 2 +- share/qtcreator/templates/shared/deployment.pri | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/share/qtcreator/templates/qmlapp/app.pro b/share/qtcreator/templates/qmlapp/app.pro index e893e8e3c20..d441773ecd0 100644 --- a/share/qtcreator/templates/qmlapp/app.pro +++ b/share/qtcreator/templates/qmlapp/app.pro @@ -27,9 +27,10 @@ symbian:ICON = symbianicon.svg #DEFINES += QMLJSDEBUGGER #DEFINES += QMLOBSERVER +# The .cpp file which was generated for your project. Feel free to hack it. SOURCES += main.cpp +# Please do not modify the following three lines. Required for deployment. include(qmlapplicationviewer/qmlapplicationviewer.pri) include(../shared/deployment.pri) - qtcAddDeployment() diff --git a/share/qtcreator/templates/qmlapp/qmlapplicationviewer/qmlapplicationviewer.pri b/share/qtcreator/templates/qmlapp/qmlapplicationviewer/qmlapplicationviewer.pri index aa172906eb6..319587d7821 100644 --- a/share/qtcreator/templates/qmlapp/qmlapplicationviewer/qmlapplicationviewer.pri +++ b/share/qtcreator/templates/qmlapp/qmlapplicationviewer/qmlapplicationviewer.pri @@ -1,5 +1,5 @@ # This file should not be edited. -# Following versions of Qt Creator might offer new version. +# Future versions of Qt Creator might offer updated versions of this file. QT += declarative diff --git a/share/qtcreator/templates/shared/deployment.pri b/share/qtcreator/templates/shared/deployment.pri index 77a0d84fda7..bb79115aafc 100644 --- a/share/qtcreator/templates/shared/deployment.pri +++ b/share/qtcreator/templates/shared/deployment.pri @@ -1,5 +1,5 @@ # This file should not be edited. -# Following versions of Qt Creator might offer new version. +# Future versions of Qt Creator might offer updated versions of this file. defineTest(qtcAddDeployment) { for(deploymentfolder, DEPLOYMENTFOLDERS) { From b9d3c1f54ae4d952781a686b950f4b5f315bf5ac Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Sun, 3 Oct 2010 09:23:48 +0200 Subject: [PATCH 093/118] No Samba while including files (The other Samba is meant. The slow one, not the nice one.) Creator manages to feed the CppModelManager with all kinds of wrong include paths. That is usually not a big issue as long as that path is not a simple "/". CppManager appended a separator to all incoming include paths. And when the above "/" was passed in, we had (on my machine) 7 seconds of Samba Network lookup, multiple times during a parse. And the sad thing was that my dear colleagues in the Intranet did not even have the searched-for header files on their shared folders. This patch makes sure that a separator is only appended if the path does not already end with one. The real core of the issue (wrong include paths from Creator) still needs to be fixed. Done-with: Roberto Raggi --- src/plugins/cpptools/cppmodelmanager.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index d1415bb281b..69198cedf14 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -361,6 +361,12 @@ QString CppPreprocessor::tryIncludeFile(QString &fileName, IncludeType type, uns return contents; } +static inline void appendDirSeparatorIfNeeded(QString &path) +{ + if (!path.endsWith(QLatin1Char('/'), Qt::CaseInsensitive)) + path += QLatin1Char('/'); +} + QString CppPreprocessor::tryIncludeFile_helper(QString &fileName, IncludeType type, unsigned *revision) { QFileInfo fileInfo(fileName); @@ -373,7 +379,7 @@ QString CppPreprocessor::tryIncludeFile_helper(QString &fileName, IncludeType ty if (type == IncludeLocal && m_currentDoc) { QFileInfo currentFileInfo(m_currentDoc->fileName()); QString path = currentFileInfo.absolutePath(); - path += QLatin1Char('/'); + appendDirSeparatorIfNeeded(path); path += fileName; path = QDir::cleanPath(path); QString contents; @@ -385,7 +391,7 @@ QString CppPreprocessor::tryIncludeFile_helper(QString &fileName, IncludeType ty foreach (const QString &includePath, m_includePaths) { QString path = includePath; - path += QLatin1Char('/'); + appendDirSeparatorIfNeeded(path); path += fileName; path = QDir::cleanPath(path); QString contents; @@ -398,7 +404,7 @@ QString CppPreprocessor::tryIncludeFile_helper(QString &fileName, IncludeType ty // look in the system include paths foreach (const QString &includePath, m_systemIncludePaths) { QString path = includePath; - path += QLatin1Char('/'); + appendDirSeparatorIfNeeded(path); path += fileName; path = QDir::cleanPath(path); QString contents; @@ -415,7 +421,7 @@ QString CppPreprocessor::tryIncludeFile_helper(QString &fileName, IncludeType ty foreach (const QString &frameworkPath, m_frameworkPaths) { QString path = frameworkPath; - path += QLatin1Char('/'); + appendDirSeparatorIfNeeded(path); path += frameworkName; path += QLatin1String(".framework/Headers/"); path += name; From 493710c2ac31cc97a9095c32896fc3151ec549c8 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Sun, 3 Oct 2010 09:28:03 +0200 Subject: [PATCH 094/118] Do not scan "/" for include files The scanning phase was in some cases insanely long. Reason was that Creator feeds wrong paths to the CppModelManager, for example "/". The scanning phase did what it was told to: scan that whole Harddrive. This patch makes sure that the scanning is not done for "/" Done-With: Roberto --- src/plugins/cpptools/cppmodelmanager.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index 69198cedf14..ec71eb4ee6b 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -1231,6 +1231,9 @@ void CppModelManager::updateIncludesInPaths(QFutureInterface &future, const QString path = paths.takeFirst(); + if (path == QLatin1String("/")) + continue; + // Skip non-existing paths if (!QFile::exists(path)) continue; From 0a9edfe1c0a883cd815415171b53ae2ad2bbd5c0 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Sun, 3 Oct 2010 10:35:14 +0200 Subject: [PATCH 095/118] Added comment --- share/qtcreator/templates/mobileapp/app.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/qtcreator/templates/mobileapp/app.pro b/share/qtcreator/templates/mobileapp/app.pro index e844231a7f7..8d2933ce19c 100644 --- a/share/qtcreator/templates/mobileapp/app.pro +++ b/share/qtcreator/templates/mobileapp/app.pro @@ -21,6 +21,6 @@ SOURCES += main.cpp mainwindow.cpp HEADERS += mainwindow.h FORMS += mainwindow.ui +# Please do not modify the following two lines. Required for deployment. include(../shared/deployment.pri) - qtcAddDeployment() From 4816893621ab33f035f5626c69789644ab285769 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Sun, 3 Oct 2010 10:38:21 +0200 Subject: [PATCH 096/118] Maemo: Close old SFTP channel when creating a new one. --- src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.cpp index 3b03a7bfeab..804f7e4d880 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeploystep.cpp @@ -486,6 +486,11 @@ void MaemoDeployStep::setupMount() void MaemoDeployStep::prepareSftpConnection() { + // TODO: Close channel when upload has finished/failed/etc. + if (m_uploader) { + disconnect(m_uploader.data(), 0, this, 0); + m_uploader->closeChannel(); + } m_uploader = m_connection->createSftpChannel(); connect(m_uploader.data(), SIGNAL(initialized()), this, SLOT(handleSftpChannelInitialized())); From 646ec206330fa835233b4492491a994b64ee9bb3 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Mon, 4 Oct 2010 09:27:25 +0200 Subject: [PATCH 097/118] Debugging helpers: Only fail if there was a chance of success. Task-number: QTCREATORBUG-2563 Reviewed-by: Kai Koehne --- src/plugins/qt4projectmanager/qmldumptool.cpp | 2 +- src/plugins/qt4projectmanager/qmldumptool.h | 2 +- .../qt4projectmanager/qmlobservertool.cpp | 2 +- .../qt4projectmanager/qmlobservertool.h | 2 +- .../qt4projectmanager/qtoptionspage.cpp | 28 +++++++++++++------ 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/plugins/qt4projectmanager/qmldumptool.cpp b/src/plugins/qt4projectmanager/qmldumptool.cpp index 0fc5411414f..e39956b8a14 100644 --- a/src/plugins/qt4projectmanager/qmldumptool.cpp +++ b/src/plugins/qt4projectmanager/qmldumptool.cpp @@ -126,7 +126,7 @@ static inline QStringList validBinaryFilenames() << QLatin1String("qmldump.app/Contents/MacOS/qmldump"); } -bool QmlDumpTool::canBuild(QtVersion *qtVersion) +bool QmlDumpTool::canBuild(const QtVersion *qtVersion) { const QString installHeaders = qtVersion->versionInfo().value("QT_INSTALL_HEADERS"); const QString header = installHeaders + QLatin1String("/QtDeclarative/private/qdeclarativemetatype_p.h"); diff --git a/src/plugins/qt4projectmanager/qmldumptool.h b/src/plugins/qt4projectmanager/qmldumptool.h index 3201f7ba3e6..6924690865b 100644 --- a/src/plugins/qt4projectmanager/qmldumptool.h +++ b/src/plugins/qt4projectmanager/qmldumptool.h @@ -47,7 +47,7 @@ class QtVersion; class QT4PROJECTMANAGER_EXPORT QmlDumpTool : public Utils::BuildableHelperLibrary { public: - static bool canBuild(QtVersion *qtVersion); + static bool canBuild(const QtVersion *qtVersion); static QString toolForProject(ProjectExplorer::Project *project); static QString toolByInstallData(const QString &qtInstallData); static QStringList locationsByInstallData(const QString &qtInstallData); diff --git a/src/plugins/qt4projectmanager/qmlobservertool.cpp b/src/plugins/qt4projectmanager/qmlobservertool.cpp index 1a456062af0..e444d89bbb6 100644 --- a/src/plugins/qt4projectmanager/qmlobservertool.cpp +++ b/src/plugins/qt4projectmanager/qmlobservertool.cpp @@ -51,7 +51,7 @@ static inline QStringList validBinaryFilenames() << QLatin1String("QMLObserver.app/Contents/MacOS/QMLObserver"); } -bool QmlObserverTool::canBuild(QtVersion *qtVersion) +bool QmlObserverTool::canBuild(const QtVersion *qtVersion) { return checkMinimumQtVersion(qtVersion->qtVersionString(), 4, 7, 1); } diff --git a/src/plugins/qt4projectmanager/qmlobservertool.h b/src/plugins/qt4projectmanager/qmlobservertool.h index 89cbca67460..78c8ffc5ae9 100644 --- a/src/plugins/qt4projectmanager/qmlobservertool.h +++ b/src/plugins/qt4projectmanager/qmlobservertool.h @@ -48,7 +48,7 @@ class QtVersion; class QT4PROJECTMANAGER_EXPORT QmlObserverTool : public Utils::BuildableHelperLibrary { public: - static bool canBuild(QtVersion *qtVersion); + static bool canBuild(const QtVersion *qtVersion); static QString toolForProject(ProjectExplorer::Project *project); static QString toolByInstallData(const QString &qtInstallData); static QStringList locationsByInstallData(const QString &qtInstallData); diff --git a/src/plugins/qt4projectmanager/qtoptionspage.cpp b/src/plugins/qt4projectmanager/qtoptionspage.cpp index 01798677512..9c3d23dcd77 100644 --- a/src/plugins/qt4projectmanager/qtoptionspage.cpp +++ b/src/plugins/qt4projectmanager/qtoptionspage.cpp @@ -33,6 +33,8 @@ #include "qt4projectmanagerconstants.h" #include "qt4target.h" #include "qtversionmanager.h" +#include "qmldumptool.h" +#include "qmlobservertool.h" #include #include @@ -238,7 +240,9 @@ QtOptionsPageWidget::QtOptionsPageWidget(QWidget *parent, QList ver QIcon QtOptionsPageWidget::debuggerHelperIconForQtVersion(const QtVersion *version) { - if (version->hasDebuggingHelper() && version->hasQmlDump() && version->hasQmlObserver()) { + if (version->hasDebuggingHelper() + && (!QmlDumpTool::canBuild(version) || version->hasQmlDump()) + && (!QmlObserverTool::canBuild(version) || version->hasQmlObserver())) { return m_debuggingHelperOkIcon; } else if (!version->hasDebuggingHelper() && !version->hasQmlDump() && !version->hasQmlObserver()) { return m_debuggingHelperErrorIcon; @@ -248,7 +252,9 @@ QIcon QtOptionsPageWidget::debuggerHelperIconForQtVersion(const QtVersion *versi QPixmap QtOptionsPageWidget::debuggerHelperPixmapForQtVersion(const QtVersion *version) { - if (version->hasDebuggingHelper() && version->hasQmlDump() && version->hasQmlObserver()) { + if (version->hasDebuggingHelper() + && (!QmlDumpTool::canBuild(version) || version->hasQmlDump()) + && (!QmlObserverTool::canBuild(version) || version->hasQmlObserver())) { return m_debuggingHelperOkPixmap; } else if (!version->hasDebuggingHelper() && !version->hasQmlDump() && !version->hasQmlObserver()) { return m_debuggingHelperErrorPixmap; @@ -311,7 +317,9 @@ void QtOptionsPageWidget::debuggingHelperBuildFinished(const QString &name, cons QTC_ASSERT(item, return) item->setData(2, Qt::UserRole, output); QSharedPointerQtVersion qtVersion = m_versions.at(index); - const bool success = qtVersion->hasDebuggingHelper() && qtVersion->hasQmlDump() && qtVersion->hasQmlObserver(); + const bool success = qtVersion->hasDebuggingHelper() + && (!QmlDumpTool::canBuild(qtVersion.data()) || qtVersion->hasQmlDump()) + && (!QmlObserverTool::canBuild(qtVersion.data()) || qtVersion->hasQmlObserver()); item->setData(2, Qt::DecorationRole, debuggerHelperIconForQtVersion(qtVersion.data())); // Update bottom control if the selection is still the same @@ -404,12 +412,16 @@ static inline QString msgHtmlHelperToolTip(const QString &gdbHelperPath, const Q QString notFound = QtOptionsPageWidget::tr("Binary not found"); //: Tooltip showing the debugging helper library file. - return QtOptionsPageWidget::tr("" + return QtOptionsPageWidget::tr("
File:
%1
" + "" + "" "" "" + "" "" "" "" + "" "" "" "" @@ -432,12 +444,10 @@ void QtOptionsPageWidget::updateDebuggingHelperStateLabel(const QtVersion *versi { QString tooltip; if (version && version->isValid()) { - const bool hasHelpers = version->hasDebuggingHelper() && version->hasQmlDump() && version->hasQmlObserver(); m_ui->debuggingHelperStateLabel->setPixmap(debuggerHelperPixmapForQtVersion(version)); - if (hasHelpers) - tooltip = msgHtmlHelperToolTip(version->debuggingHelperLibrary(), - version->qmlDumpTool(), - version->qmlObserverTool()); + tooltip = msgHtmlHelperToolTip(version->debuggingHelperLibrary(), + version->qmlDumpTool(), + version->qmlObserverTool()); } else { m_ui->debuggingHelperStateLabel->setPixmap(QPixmap()); } From c03fff096842950f4d493f91c29e791b84b18260 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Mon, 4 Oct 2010 09:44:18 +0200 Subject: [PATCH 098/118] QmlProject: Stop program when exiting creator Task-number: QTCREATORBUG-2501 --- src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp b/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp index c0c0b7ce977..d41ac9df639 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectruncontrol.cpp @@ -77,6 +77,7 @@ QmlRunControl::QmlRunControl(QmlProjectRunConfiguration *runConfiguration, QStri QmlRunControl::~QmlRunControl() { + stop(); } void QmlRunControl::start() From a95ed6420ddab14d8928646954f21d9b8e395bba Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Sun, 3 Oct 2010 00:28:36 +0200 Subject: [PATCH 099/118] New wizards: Handle Symbian icon like Maemo icon De-clutter the app profile: - Call the Symbian icon .svg - Define the Symbian icon in the deployment .pri file Task-Number: QTCREATORBUG-2578 Reviewed-by: ck --- share/qtcreator/templates/mobileapp/app.pro | 2 -- share/qtcreator/templates/qmlapp/app.pro | 2 -- share/qtcreator/templates/shared/deployment.pri | 2 ++ src/plugins/qt4projectmanager/wizards/abstractmobileapp.cpp | 2 +- 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/share/qtcreator/templates/mobileapp/app.pro b/share/qtcreator/templates/mobileapp/app.pro index 8d2933ce19c..9936500fe32 100644 --- a/share/qtcreator/templates/mobileapp/app.pro +++ b/share/qtcreator/templates/mobileapp/app.pro @@ -15,8 +15,6 @@ DEFINES += NETWORKACCESS # TARGETUID3 # symbian:TARGET.UID3 = 0xE1111234 -symbian:ICON = symbianicon.svg - SOURCES += main.cpp mainwindow.cpp HEADERS += mainwindow.h FORMS += mainwindow.ui diff --git a/share/qtcreator/templates/qmlapp/app.pro b/share/qtcreator/templates/qmlapp/app.pro index d441773ecd0..f488604cbf6 100644 --- a/share/qtcreator/templates/qmlapp/app.pro +++ b/share/qtcreator/templates/qmlapp/app.pro @@ -20,8 +20,6 @@ DEFINES += NETWORKACCESS # TARGETUID3 # symbian:TARGET.UID3 = 0xE1111234 -symbian:ICON = symbianicon.svg - # Define QMLJSDEBUGGER to enable basic debugging (setting breakpoints etc) # Define QMLOBSERVER for advanced features (requires experimental QmlInspector plugin!) #DEFINES += QMLJSDEBUGGER diff --git a/share/qtcreator/templates/shared/deployment.pri b/share/qtcreator/templates/shared/deployment.pri index bb79115aafc..7ec5a99ae53 100644 --- a/share/qtcreator/templates/shared/deployment.pri +++ b/share/qtcreator/templates/shared/deployment.pri @@ -16,6 +16,7 @@ for(deploymentfolder, DEPLOYMENTFOLDERS) { MAINPROFILEPWD = $$PWD symbian { + ICON = $${TARGET}.svg TARGET.EPOCHEAPSIZE = 0x20000 0x2000000 contains(DEFINES, ORIENTATIONLOCK):LIBS += -lavkon -leikcore -leiksrv -lcone contains(DEFINES, NETWORKACCESS):TARGET.CAPABILITY += NetworkServices @@ -81,6 +82,7 @@ symbian { INSTALLS += desktopfile icon target } +export (ICON) export (INSTALLS) export (DEPLOYMENT) export (TARGET.EPOCHEAPSIZE) diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileapp.cpp b/src/plugins/qt4projectmanager/wizards/abstractmobileapp.cpp index 422ddd246ac..e9775f3f13e 100644 --- a/src/plugins/qt4projectmanager/wizards/abstractmobileapp.cpp +++ b/src/plugins/qt4projectmanager/wizards/abstractmobileapp.cpp @@ -167,7 +167,7 @@ QString AbstractMobileApp::path(int fileType) const case DesktopOrigin: return originsRootShared + QLatin1String("app.desktop"); case DeploymentPri: return outputPathBase() + DeploymentPriFileName; case DeploymentPriOrigin: return originsRootShared + DeploymentPriFileName; - case SymbianSvgIcon: return outputPathBase() + symbianIconFileName; + case SymbianSvgIcon: return outputPathBase() + projectName() + QLatin1String(".svg"); case SymbianSvgIconOrigin: return !m_symbianSvgIcon.isEmpty() ? m_symbianSvgIcon : originsRootShared + symbianIconFileName; case MaemoPngIcon: return outputPathBase() + projectName() + QLatin1String(".png"); From e1aa293544930b44f5518e7b143dcfdad35b6f3e Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Mon, 4 Oct 2010 04:10:54 +0200 Subject: [PATCH 100/118] Qt Quick app wizard: Merge two .pri files into one As an project tree unclutter measure, we now append the deployment.pri to the qmlapplicationviewer.pri while generating the stub for Qt Quick Apps. At the same tame we keep te Qt Mobile App wizard intact, which continues to generate the deployment.pri file. And we also keep the qmlapp/app.pro template functioning as project, therefore we leave the include(../shared/deployment.pri) in qmlapp/app.pro and let the wizard remove that incude. Task-Number: QTCREATORBUG-2568 Reviewed-By: ck --- share/qtcreator/templates/qmlapp/app.pro | 3 ++- .../qt4projectmanager/wizards/abstractmobileapp.cpp | 1 - src/plugins/qt4projectmanager/wizards/mobileapp.cpp | 1 + src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp | 7 ++++--- tests/manual/qmlstandalone/main.cpp | 3 +-- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/share/qtcreator/templates/qmlapp/app.pro b/share/qtcreator/templates/qmlapp/app.pro index f488604cbf6..cb0abcbfd31 100644 --- a/share/qtcreator/templates/qmlapp/app.pro +++ b/share/qtcreator/templates/qmlapp/app.pro @@ -28,7 +28,8 @@ symbian:TARGET.UID3 = 0xE1111234 # The .cpp file which was generated for your project. Feel free to hack it. SOURCES += main.cpp -# Please do not modify the following three lines. Required for deployment. +# Please do not modify the following two lines. Required for deployment. include(qmlapplicationviewer/qmlapplicationviewer.pri) +# INCLUDE_DEPLOYMENT_PRI (wizard will remove the include and append deployment.pri to qmlapplicationviewer.pri, instead) # include(../shared/deployment.pri) qtcAddDeployment() diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileapp.cpp b/src/plugins/qt4projectmanager/wizards/abstractmobileapp.cpp index e9775f3f13e..3c5b4a18e31 100644 --- a/src/plugins/qt4projectmanager/wizards/abstractmobileapp.cpp +++ b/src/plugins/qt4projectmanager/wizards/abstractmobileapp.cpp @@ -319,7 +319,6 @@ Core::GeneratedFiles AbstractMobileApp::generateFiles(QString *errorMessage) con files << file(generateFile(AbstractGeneratedFileInfo::SymbianSvgIconFile, errorMessage), path(SymbianSvgIcon)); files << file(generateFile(AbstractGeneratedFileInfo::MaemoPngIconFile, errorMessage), path(MaemoPngIcon)); files << file(generateFile(AbstractGeneratedFileInfo::DesktopFile, errorMessage), path(Desktop)); - files << file(generateFile(AbstractGeneratedFileInfo::DeploymentPriFile, errorMessage), path(DeploymentPri)); return files; } #endif // CREATORLESSTEST diff --git a/src/plugins/qt4projectmanager/wizards/mobileapp.cpp b/src/plugins/qt4projectmanager/wizards/mobileapp.cpp index 2debd118029..dc9bd1ff832 100644 --- a/src/plugins/qt4projectmanager/wizards/mobileapp.cpp +++ b/src/plugins/qt4projectmanager/wizards/mobileapp.cpp @@ -94,6 +94,7 @@ Core::GeneratedFiles MobileApp::generateFiles(QString *errorMessage) const { Core::GeneratedFiles files = AbstractMobileApp::generateFiles(errorMessage); + files.append(file(generateFile(AbstractGeneratedFileInfo::DeploymentPriFile, errorMessage), path(DeploymentPri))); files.append(file(generateFile(MobileAppGeneratedFileInfo::MainWindowCppFile, errorMessage), path(MainWindowCpp))); files.append(file(generateFile(MobileAppGeneratedFileInfo::MainWindowHFile, errorMessage), path(MainWindowH))); files.append(file(generateFile(MobileAppGeneratedFileInfo::MainWindowUiFile, errorMessage), path(MainWindowUi))); diff --git a/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp b/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp index d323107c664..b6039a61246 100644 --- a/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp +++ b/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp @@ -261,6 +261,8 @@ void QmlStandaloneApp::handleCurrentProFileTemplateLine(const QString &line, } proFile << endl; + } else if (line.contains(QLatin1String("# INCLUDE_DEPLOYMENT_PRI"))) { + proFileTemplate.readLine(); // eats 'include(deployment.pri)' } } @@ -378,6 +380,7 @@ QByteArray QmlStandaloneApp::generateFileExtended(int fileType, break; case QmlAppGeneratedFileInfo::AppViewerPriFile: data = readBlob(path(AppViewerPriOrigin), errorMessage); + data.append(readBlob(path(DeploymentPriOrigin), errorMessage)); *comment = ProFileComment; *versionAndCheckSum = true; break; @@ -408,9 +411,7 @@ static QList updateableFiles(const QString &mainProFile } files[] = { {QmlAppGeneratedFileInfo::AppViewerPriFile, appViewerPriFileName}, {QmlAppGeneratedFileInfo::AppViewerHFile, appViewerHFileName}, - {QmlAppGeneratedFileInfo::AppViewerCppFile, appViewerCppFileName}, - {QmlAppGeneratedFileInfo::DeploymentPriFile, - QLatin1String("../") + AbstractMobileApp::DeploymentPriFileName} + {QmlAppGeneratedFileInfo::AppViewerCppFile, appViewerCppFileName} }; const QFileInfo mainProFileInfo(mainProFile); const int size = sizeof(files) / sizeof(files[0]); diff --git a/tests/manual/qmlstandalone/main.cpp b/tests/manual/qmlstandalone/main.cpp index f6eaf4778ea..03a40925871 100644 --- a/tests/manual/qmlstandalone/main.cpp +++ b/tests/manual/qmlstandalone/main.cpp @@ -52,8 +52,7 @@ bool QmlStandaloneApp::generateFiles(QString *errorMessage) const && writeFile(generateFile(QmlAppGeneratedFileInfo::AppViewerHFile, errorMessage), path(AppViewerH)) && writeFile(generateFile(QmlAppGeneratedFileInfo::SymbianSvgIconFile, errorMessage), path(SymbianSvgIcon)) && writeFile(generateFile(QmlAppGeneratedFileInfo::MaemoPngIconFile, errorMessage), path(MaemoPngIcon)) - && writeFile(generateFile(QmlAppGeneratedFileInfo::DesktopFile, errorMessage), path(Desktop)) - && writeFile(generateFile(QmlAppGeneratedFileInfo::DeploymentPriFile, errorMessage), path(DeploymentPri)); + && writeFile(generateFile(QmlAppGeneratedFileInfo::DesktopFile, errorMessage), path(Desktop)); } QString AbstractMobileApp::templatesRoot() From 5d0177ac40145461649fbca6310344428e0de575 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Sat, 2 Oct 2010 17:51:36 +0200 Subject: [PATCH 101/118] Merged 'New Qt quick App' and 'Import Qml App' Wizards The only difference between these wizards was that in the Import Wizard, the user was able to chose a .qml file. So, why not merge them. Also, this commit is a nice code reduction. The module deployment feature was killed by popular demand. Apparently, nobody writes or deploys Qml modules, these days. Let's see when they want to have it back ;) Task-Number: QTCREATORBUG-2505 Reviewed-by: ck --- .../qt4projectmanagerplugin.cpp | 3 +- .../wizards/qmlstandaloneappwizard.cpp | 72 ++------ .../wizards/qmlstandaloneappwizard.h | 12 +- .../wizards/qmlstandaloneappwizardpages.cpp | 103 +---------- .../wizards/qmlstandaloneappwizardpages.h | 14 -- .../qmlstandaloneappwizardsourcespage.ui | 169 +++++------------- 6 files changed, 79 insertions(+), 294 deletions(-) diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp index 0ed22615959..6f926c4fd57 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp +++ b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp @@ -140,8 +140,7 @@ bool Qt4ProjectManagerPlugin::initialize(const QStringList &arguments, QString * MobileAppWizard *mobileWizard = new MobileAppWizard; addAutoReleasedObject(mobileWizard); - addAutoReleasedObject(new QmlStandaloneAppWizard(QmlStandaloneAppWizard::NewQmlFile)); - addAutoReleasedObject(new QmlStandaloneAppWizard(QmlStandaloneAppWizard::ImportQmlFile)); + addAutoReleasedObject(new QmlStandaloneAppWizard()); LibraryWizard *libWizard = new LibraryWizard; addAutoReleasedObject(libWizard); diff --git a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.cpp b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.cpp index 600000d2c7a..0ad152b1fd3 100644 --- a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.cpp @@ -52,48 +52,36 @@ class QmlStandaloneAppWizardDialog : public AbstractMobileAppWizardDialog Q_OBJECT public: - explicit QmlStandaloneAppWizardDialog(QmlStandaloneAppWizard::WizardType type, QWidget *parent = 0); + explicit QmlStandaloneAppWizardDialog(QWidget *parent = 0); private: - QmlStandaloneAppWizard::WizardType m_type; class QmlStandaloneAppWizardSourcesPage *m_qmlSourcesPage; friend class QmlStandaloneAppWizard; }; -QmlStandaloneAppWizardDialog::QmlStandaloneAppWizardDialog(QmlStandaloneAppWizard::WizardType type, - QWidget *parent) +QmlStandaloneAppWizardDialog::QmlStandaloneAppWizardDialog(QWidget *parent) : AbstractMobileAppWizardDialog(parent) - , m_type(type) , m_qmlSourcesPage(0) { - setWindowTitle(m_type == QmlStandaloneAppWizard::NewQmlFile - ? tr("New Qt Quick Application") - : tr("Qt Quick Application from Existing QML Directory")); - setIntroDescription(m_type == QmlStandaloneAppWizard::NewQmlFile - ? tr("This wizard generates a Qt Quick application project.") - : tr("This wizard imports an existing QML directory and creates a Qt Quick application project from it.")); + setWindowTitle(tr("New Qt Quick Application")); + setIntroDescription(tr("This wizard generates a Qt Quick application project.")); - if (m_type == QmlStandaloneAppWizard::ImportQmlFile) { - m_qmlSourcesPage = new QmlStandaloneAppWizardSourcesPage; - m_qmlSourcesPage->setMainQmlFileChooserVisible(true); - const int qmlSourcesPagePageId = addPage(m_qmlSourcesPage); - wizardProgress()->item(qmlSourcesPagePageId)->setTitle(tr("QML Sources")); - } + m_qmlSourcesPage = new QmlStandaloneAppWizardSourcesPage; + const int qmlSourcesPagePageId = addPage(m_qmlSourcesPage); + wizardProgress()->item(qmlSourcesPagePageId)->setTitle(tr("QML Sources")); } class QmlStandaloneAppWizardPrivate { - QmlStandaloneAppWizard::WizardType type; class QmlStandaloneApp *standaloneApp; class QmlStandaloneAppWizardDialog *wizardDialog; friend class QmlStandaloneAppWizard; }; -QmlStandaloneAppWizard::QmlStandaloneAppWizard(WizardType type) - : AbstractMobileAppWizard(parameters(type)) +QmlStandaloneAppWizard::QmlStandaloneAppWizard() + : AbstractMobileAppWizard(parameters()) , m_d(new QmlStandaloneAppWizardPrivate) { - m_d->type = type; m_d->standaloneApp = new QmlStandaloneApp; m_d->wizardDialog = 0; } @@ -104,21 +92,13 @@ QmlStandaloneAppWizard::~QmlStandaloneAppWizard() delete m_d; } -Core::BaseFileWizardParameters QmlStandaloneAppWizard::parameters(WizardType type) +Core::BaseFileWizardParameters QmlStandaloneAppWizard::parameters() { Core::BaseFileWizardParameters parameters(ProjectWizard); parameters.setIcon(QIcon(QLatin1String(Constants::ICON_QML_STANDALONE))); - parameters.setDisplayName(type == QmlStandaloneAppWizard::NewQmlFile - ? tr("Qt Quick Application") - : tr("Import Existing QML Directory")); - parameters.setId(QLatin1String(type == QmlStandaloneAppWizard::NewQmlFile - ? "QA.QMLA Application" - : "QA.QMLB Imported Application")); - parameters.setDescription(type == QmlStandaloneAppWizard::NewQmlFile - ? tr("Creates a Qt Quick application that you can deploy to mobile devices.") - : tr("Imports an existing QML directory and converts it into a " - "Qt Quick application project. " - "You can deploy the application to mobile devices.")); + parameters.setDisplayName(tr("Qt Quick Application")); + parameters.setId(QLatin1String("QA.QMLA Application")); + parameters.setDescription(tr("Creates a Qt Quick application that you can deploy to mobile devices.")); parameters.setCategory(QLatin1String(Constants::QT_APP_WIZARD_CATEGORY)); parameters.setDisplayCategory(QCoreApplication::translate(Constants::QT_APP_WIZARD_TR_SCOPE, Constants::QT_APP_WIZARD_TR_CATEGORY)); @@ -127,12 +107,7 @@ Core::BaseFileWizardParameters QmlStandaloneAppWizard::parameters(WizardType typ AbstractMobileAppWizardDialog *QmlStandaloneAppWizard::createWizardDialogInternal(QWidget *parent) const { - m_d->wizardDialog = new QmlStandaloneAppWizardDialog(m_d->type, parent); - if (m_d->wizardDialog->m_qmlSourcesPage) { - connect(m_d->wizardDialog->m_qmlSourcesPage, - SIGNAL(externalModulesChanged(QStringList, QStringList)), - SLOT(handleModulesChange(QStringList, QStringList))); - } + m_d->wizardDialog = new QmlStandaloneAppWizardDialog(parent); const QList &qtVersions = TargetSetupPage::importInfosForKnownQtVersions(); QList qmlQtVersions; @@ -157,19 +132,16 @@ void QmlStandaloneAppWizard::prepareGenerateFiles(const QWizard *w, { Q_UNUSED(errorMessage) const QmlStandaloneAppWizardDialog *wizard = qobject_cast(w); - if (wizard->m_qmlSourcesPage) { - m_d->standaloneApp->setMainQmlFile(wizard->m_qmlSourcesPage->mainQmlFile()); - m_d->standaloneApp->setExternalModules( - wizard->m_qmlSourcesPage->moduleUris(), - wizard->m_qmlSourcesPage->moduleImportPaths()); - } + const QString mainQmlFile = wizard->m_qmlSourcesPage->mainQmlFile(); + if (!mainQmlFile.isEmpty()) + m_d->standaloneApp->setMainQmlFile(mainQmlFile); } bool QmlStandaloneAppWizard::postGenerateFilesInternal(const Core::GeneratedFiles &l, QString *errorMessage) { const bool success = ProjectExplorer::CustomProjectWizard::postGenerateOpen(l, errorMessage); - if (success && m_d->type == QmlStandaloneAppWizard::ImportQmlFile) { + if (success && !m_d->standaloneApp->mainQmlFile().isEmpty()) { ProjectExplorer::ProjectExplorerPlugin::instance()->setCurrentFile(0, m_d->standaloneApp->mainQmlFile()); Core::EditorManager::instance()->openEditor(m_d->standaloneApp->mainQmlFile(), QString(), Core::EditorManager::ModeSwitch); @@ -177,14 +149,6 @@ bool QmlStandaloneAppWizard::postGenerateFilesInternal(const Core::GeneratedFile return success; } -void QmlStandaloneAppWizard::handleModulesChange(const QStringList &uris, const QStringList &paths) -{ - Q_ASSERT(m_d->wizardDialog->m_qmlSourcesPage); - QmlStandaloneApp testApp; - testApp.setExternalModules(uris, paths); - m_d->wizardDialog->m_qmlSourcesPage->setModulesError(testApp.error()); -} - AbstractMobileApp *QmlStandaloneAppWizard::app() const { return m_d->standaloneApp; diff --git a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.h b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.h index 662021c19ef..46d8a26908c 100644 --- a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.h +++ b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.h @@ -40,19 +40,11 @@ class QmlStandaloneAppWizard : public AbstractMobileAppWizard Q_OBJECT public: - enum WizardType { - NewQmlFile, - ImportQmlFile - }; - - QmlStandaloneAppWizard(WizardType type); + QmlStandaloneAppWizard(); virtual ~QmlStandaloneAppWizard(); -private slots: - void handleModulesChange(const QStringList &uris, const QStringList &paths); - private: - static Core::BaseFileWizardParameters parameters(WizardType type); + static Core::BaseFileWizardParameters parameters(); virtual AbstractMobileApp *app() const; virtual AbstractMobileAppWizardDialog *wizardDialog() const; diff --git a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizardpages.cpp b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizardpages.cpp index d458ca6073e..ec6fb23f785 100644 --- a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizardpages.cpp +++ b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizardpages.cpp @@ -42,7 +42,6 @@ namespace Internal { class QmlStandaloneAppWizardSourcesPagePrivate { Ui::QmlStandaloneAppWizardSourcesPage ui; - bool mainQmlFileChooserVisible; friend class QmlStandaloneAppWizardSourcesPage; }; @@ -54,15 +53,12 @@ QmlStandaloneAppWizardSourcesPage::QmlStandaloneAppWizardSourcesPage(QWidget *pa m_d->ui.mainQmlFileLineEdit->setExpectedKind(Utils::PathChooser::File); m_d->ui.mainQmlFileLineEdit->setPromptDialogFilter(QLatin1String("*.qml")); m_d->ui.mainQmlFileLineEdit->setPromptDialogTitle(tr("Select QML File")); - m_d->ui.addModuleUriButton->setIcon(QIcon(QLatin1String(Core::Constants::ICON_PLUS))); - m_d->ui.removeModuleUriButton->setIcon(QIcon(QLatin1String(Core::Constants::ICON_MINUS))); - m_d->ui.addImportPathButton->setIcon(QIcon(QLatin1String(Core::Constants::ICON_PLUS))); - m_d->ui.removeImportPathButton->setIcon(QIcon(QLatin1String(Core::Constants::ICON_MINUS))); - setMainQmlFileChooserVisible(true); - setModulesError(QString()); connect(m_d->ui.mainQmlFileLineEdit, SIGNAL(changed(QString)), SIGNAL(completeChanged())); - connect(m_d->ui.urisListWidget, SIGNAL(itemChanged(QListWidgetItem*)), SLOT(handleModulesChanged())); - connect(m_d->ui.importPathsListWidget, SIGNAL(itemChanged(QListWidgetItem*)), SLOT(handleModulesChanged())); + connect(m_d->ui.importExistingQmlRadioButton, + SIGNAL(toggled(bool)), SIGNAL(completeChanged())); + connect(m_d->ui.newQmlRadioButton, SIGNAL(toggled(bool)), + m_d->ui.mainQmlFileLineEdit, SLOT(setDisabled(bool))); + m_d->ui.newQmlRadioButton->setChecked(true); } QmlStandaloneAppWizardSourcesPage::~QmlStandaloneAppWizardSourcesPage() @@ -72,95 +68,14 @@ QmlStandaloneAppWizardSourcesPage::~QmlStandaloneAppWizardSourcesPage() QString QmlStandaloneAppWizardSourcesPage::mainQmlFile() const { - return m_d->ui.mainQmlFileLineEdit->path(); + return m_d->ui.importExistingQmlRadioButton->isChecked() ? + m_d->ui.mainQmlFileLineEdit->path() : QString(); } bool QmlStandaloneAppWizardSourcesPage::isComplete() const { - return (!m_d->mainQmlFileChooserVisible || m_d->ui.mainQmlFileLineEdit->isValid()) - && m_d->ui.errorLabel->text().isEmpty(); -} - -void QmlStandaloneAppWizardSourcesPage::setMainQmlFileChooserVisible(bool visible) -{ - m_d->mainQmlFileChooserVisible = visible; - m_d->ui.mainQmlFileGroupBox->setVisible(m_d->mainQmlFileChooserVisible); -} - -void QmlStandaloneAppWizardSourcesPage::setModulesError(const QString &error) -{ - m_d->ui.errorLabel->setText(error); - m_d->ui.errorLabel->setVisible(!error.isEmpty()); -} - -void QmlStandaloneAppWizardSourcesPage::on_addModuleUriButton_clicked() -{ - QListWidgetItem *item = new QListWidgetItem(m_d->ui.urisListWidget); - item->setFlags(item->flags() | Qt::ItemIsEditable); - m_d->ui.urisListWidget->setCurrentItem(item); - m_d->ui.urisListWidget->editItem(item); -} - -static bool removeListWidgetItem(QListWidget *list) -{ - const int currentRow = list->currentRow(); - if (currentRow >= 0) { - list->takeItem(currentRow); - return true; - } - return false; -} - -void QmlStandaloneAppWizardSourcesPage::on_removeModuleUriButton_clicked() -{ - if (removeListWidgetItem(m_d->ui.urisListWidget)) - handleModulesChanged(); -} - -void QmlStandaloneAppWizardSourcesPage::on_addImportPathButton_clicked() -{ - const QString path = QFileDialog::getExistingDirectory(this, - tr("Select an import path for QML modules."), mainQmlFile()); - if (!path.isEmpty()) { - QListWidgetItem *item = new QListWidgetItem(QDir::toNativeSeparators(path), m_d->ui.importPathsListWidget); - item->setFlags(item->flags() | Qt::ItemIsEditable); - m_d->ui.importPathsListWidget->setCurrentItem(item); - } -} - -void QmlStandaloneAppWizardSourcesPage::on_removeImportPathButton_clicked() -{ - if (removeListWidgetItem(m_d->ui.importPathsListWidget)) - handleModulesChanged(); -} - -static inline QStringList ertriesFromListWidget(const QListWidget &listWidget) -{ - QStringList result; - for (int i = 0; i < listWidget.count(); ++i) { - const QString text = listWidget.item(i)->text().trimmed(); - if (!text.isEmpty()) - result.append(text); - } - return result; -} - -void QmlStandaloneAppWizardSourcesPage::handleModulesChanged() -{ - const QStringList uris = ertriesFromListWidget(*m_d->ui.urisListWidget); - const QStringList paths = ertriesFromListWidget(*m_d->ui.importPathsListWidget); - emit externalModulesChanged(uris, paths); - emit completeChanged(); -} - -QStringList QmlStandaloneAppWizardSourcesPage::moduleUris() const -{ - return ertriesFromListWidget(*m_d->ui.urisListWidget); -} - -QStringList QmlStandaloneAppWizardSourcesPage::moduleImportPaths() const -{ - return ertriesFromListWidget(*m_d->ui.importPathsListWidget); + return !m_d->ui.importExistingQmlRadioButton->isChecked() + || m_d->ui.mainQmlFileLineEdit->isValid(); } } // namespace Internal diff --git a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizardpages.h b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizardpages.h index 5ce91e3a92f..96f56603a1a 100644 --- a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizardpages.h +++ b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizardpages.h @@ -47,20 +47,6 @@ public: QString mainQmlFile() const; virtual bool isComplete() const; - void setMainQmlFileChooserVisible(bool visible); - void setModulesError(const QString &error); - QStringList moduleUris() const; - QStringList moduleImportPaths() const; - -private slots: - void on_addModuleUriButton_clicked(); - void on_removeModuleUriButton_clicked(); - void on_addImportPathButton_clicked(); - void on_removeImportPathButton_clicked(); - void handleModulesChanged(); - -signals: - void externalModulesChanged(const QStringList &uris, const QStringList &importPaths) const; private: class QmlStandaloneAppWizardSourcesPagePrivate *m_d; diff --git a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizardsourcespage.ui b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizardsourcespage.ui index 235e0b0a823..ffe258e3863 100644 --- a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizardsourcespage.ui +++ b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizardsourcespage.ui @@ -6,8 +6,8 @@ 0 0 - 494 - 346 + 605 + 386 @@ -19,131 +19,60 @@ Main QML File - - + + + + + New 'main.qml' file, generated by this wizard. + + + + + + + Import an existing .qml file + + + + + + + + Qt::Horizontal + + + QSizePolicy::Maximum + + + + 12 + 20 + + + + - - - QML Modules + + + + 0 + 1 + + + + Note: All files and directories which reside in the same directory as the Main QML File will be deployed. You can anytime modify the contents of that directory before deploying. + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true - - - - - Qt::Vertical - - - false - - - - - - - - - - + - - - - - - - - - - - - - - - Qt::Vertical - - - QSizePolicy::MinimumExpanding - - - - 20 - 0 - - - - - - - - URIs (e.g. 'org.mydomain.MyQmlModule'): - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - Qt::Vertical - - - QSizePolicy::MinimumExpanding - - - - 20 - 0 - - - - - - - - Import paths: - - - - - - - - - - - - 75 - true - - - - Error - - - - From cad8dcbb6a5d5ccacc48bbc9565911f96173d2db Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Mon, 4 Oct 2010 10:44:23 +0200 Subject: [PATCH 102/118] Only update Qml App stub files The update mechanism kicked in also for Qml Mobile apps, which happen to have a deployment.pri file aswell. But that was wrong. The update must only happen if all qml app stub files were found. This patch fixes it. Task-Number: QTCREATORBUG-2529 Reviewed-by: ck --- src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp b/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp index b6039a61246..93198f44536 100644 --- a/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp +++ b/src/plugins/qt4projectmanager/wizards/qmlstandaloneapp.cpp @@ -425,6 +425,8 @@ static QList updateableFiles(const QString &mainProFile file.fileInfo = QFileInfo(fileName); result.append(file); } + if (result.count() != size) + result.clear(); // All files must be found. No wrong/partial updates, please. return result; } From 19866faeab763bdeb01e366f36c48e990744d373 Mon Sep 17 00:00:00 2001 From: Pawel Polanski Date: Mon, 4 Oct 2010 10:38:10 +0200 Subject: [PATCH 103/118] Null pointer exception when calling context menu on an empty area of Target step in new application wizard - fixed Reviewed-by: Tobias Hunger --- src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp index a9b6b2a7db0..a5862f5390e 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp @@ -516,13 +516,13 @@ void TargetSetupPage::handleDoubleClicks(QTreeWidgetItem *item, int column) } } -void TargetSetupPage::contextMenuRequested(const QPoint & position) +void TargetSetupPage::contextMenuRequested(const QPoint &position) { m_contextMenu->clear(); QTreeWidgetItem *item = m_ui->versionTree->itemAt(position); m_contextMenu = new QMenu(this); - if (item->parent()) { + if (item && item->parent()) { // Qt version item QAction *onlyThisAction = new QAction(tr("Check only this version"), m_contextMenu); connect(onlyThisAction, SIGNAL(triggered()), this, SLOT(checkOneTriggered())); From d6575ef3a3a8e3cc38081f27e075c37bf592d914 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 4 Oct 2010 11:47:31 +0200 Subject: [PATCH 104/118] Debugger[CDB]: Adapt internal std::string dumper to MSVC2010. New STL implementation. Reviewed-by: hjk --- .../debugger/cdb/symbolgroupcontext.cpp | 59 +++++++++++++++---- src/plugins/debugger/cdb/symbolgroupcontext.h | 1 + 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/src/plugins/debugger/cdb/symbolgroupcontext.cpp b/src/plugins/debugger/cdb/symbolgroupcontext.cpp index 569d20c5e44..72b8320c0ba 100644 --- a/src/plugins/debugger/cdb/symbolgroupcontext.cpp +++ b/src/plugins/debugger/cdb/symbolgroupcontext.cpp @@ -373,12 +373,23 @@ static inline QString msgExpandFailed(const QString &prefix, unsigned long index return QString::fromLatin1("Unable to expand '%1' %2: %3").arg(prefix).arg(index).arg(why); } +bool SymbolGroupContext::expandSymbol(unsigned long index, QString *errorMessage) +{ + return expandSymbol(m_inameIndexMap.key(index), index, errorMessage); +} + // Expand a symbol using the symbol group interface. bool SymbolGroupContext::expandSymbol(const QString &prefix, unsigned long index, QString *errorMessage) { if (debug) qDebug() << '>' << Q_FUNC_INFO << '\n' << prefix << index; + if (index >= unsigned(m_symbolParameters.size())) { + *errorMessage = QString::fromLatin1("Index %1 (%2) out of range 0..%3."). + arg(index).arg(prefix).arg(m_symbolParameters.size()); + return false; + } + switch (symbolState(index)) { case LeafSymbol: *errorMessage = QString::fromLatin1("Attempt to expand leaf node '%1' %2!").arg(prefix).arg(index); @@ -556,7 +567,7 @@ unsigned SymbolGroupContext::dumpValueRaw(unsigned long index, name.truncate(shadowedPos); } // For class hierarchies, we get sometimes complicated std::template types here. - // (std::map extends std::tree<>... Remove them for display only. + // (std::map extends std::tree<>... Remove them for display only. *nameIn = formatShadowedName(removeInnerTemplateType(name), shadowedNumber); *typeNameIn = getSymbolString(m_symbolGroup, &IDebugSymbolGroup2::GetSymbolTypeNameWide, index); // Check for uninitialized variables at level 0 only. @@ -616,7 +627,7 @@ unsigned SymbolGroupContext::dumpValue(unsigned long index, ULONG *typeIdIn, QString *typeNameIn, QString *valueIn) -{ +{ unsigned rc = dumpValueRaw(index, inameIn, nameIn, addrIn, typeIdIn, typeNameIn, valueIn); do { @@ -714,7 +725,7 @@ int SymbolGroupContext::dumpQString(unsigned long index, if (!expandSymbol(iname, index, &errorMessage)) return 2; const unsigned long dIndex = index + 4; - if (!expandSymbol(iname, dIndex, &errorMessage)) + if (!expandSymbol(dIndex, &errorMessage)) return 3; const unsigned long sizeIndex = dIndex + 3; const unsigned long arrayIndex = dIndex + 4; @@ -760,27 +771,49 @@ int SymbolGroupContext::dumpStdString(unsigned long index, { QString errorMessage; - // Expand string ->string_val->_bx. if (!expandSymbol(inameIn, index, &errorMessage)) return 1; - const unsigned long bxIndex = index + 3; - if (!expandSymbol(inameIn, bxIndex, &errorMessage)) - return 2; - // Check if size is something sane - const int sizeIndex = index + 6; + int sizeIndex = -1; + int bufIndex = -1; + if (m_symbolParameters.at(index).SubElements >= 3 + && m_inameIndexMap.key(index + 3).endsWith(QLatin1String("Bx"))) { + // Up to MSVC 2008 + const int bxIndex = index + 3; + if (m_symbolParameters.at(bxIndex).SubElements < 2 + || !expandSymbol(index + 3, &errorMessage)) + return 2; + // Check if size is something sane + sizeIndex = index + 6; + bufIndex = index + 4; + } else { + // MSVC10 onwards: Large nested string_val structure containing Bx + if (m_symbolParameters.at(index + 1).SubElements < 5 + || !expandSymbol(index + 1, &errorMessage)) + return 3; + const int bxIndex = index + 3; + if (m_symbolParameters.at(bxIndex).SubElements < 3 + || !m_inameIndexMap.key(bxIndex).endsWith(QLatin1String("Bx")) + || !expandSymbol(bxIndex, &errorMessage)) + return 4; + sizeIndex = index + 7; + bufIndex = index + 4; + } + if (sizeIndex < 0 || bufIndex < 0 + || sizeIndex >= m_symbolParameters.size() || bufIndex >= m_symbolParameters.size()) + return 5; + // Extract size and buffer qint64 size; if (!getSG_DecimalIntValue(m_symbolGroup, sizeIndex, &size)) - return 3; + return 6; if (size < 0) return 1; // Just copy over the value of the buf[]-array, which should be the string - const QChar doubleQuote = QLatin1Char('"'); - const int bufIndex = index + 4; *valueIn = getSymbolString(m_symbolGroup, &IDebugSymbolGroup2::GetSymbolValueTextWide, bufIndex); + const QChar doubleQuote = QLatin1Char('"'); const int quotePos = valueIn->indexOf(doubleQuote); if (quotePos == -1) - return 1; + return 7; valueIn->remove(0, quotePos); if (valueIn->size() > maxStringLength) { valueIn->truncate(maxStringLength); diff --git a/src/plugins/debugger/cdb/symbolgroupcontext.h b/src/plugins/debugger/cdb/symbolgroupcontext.h index 214af95dfc0..559e64a6747 100644 --- a/src/plugins/debugger/cdb/symbolgroupcontext.h +++ b/src/plugins/debugger/cdb/symbolgroupcontext.h @@ -143,6 +143,7 @@ private: void clear(); bool expandSymbol(const QString &prefix, unsigned long index, QString *errorMessage); + bool expandSymbol(unsigned long index, QString *errorMessage); void populateINameIndexMap(const QString &prefix, unsigned long parentId, unsigned long end); QString symbolINameAt(unsigned long index) const; inline QString formatShadowedName(const QString &name, int n) const; From a5c7d465abec73fc2e01684957679682ccf2bb09 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Mon, 4 Oct 2010 11:56:10 +0200 Subject: [PATCH 105/118] Debugging helpers: Only build qmldump/qmlobserver for desktop targets. Task-number: QTCREATORBUG-2575 Reviewed-by: Kai Koehne --- src/plugins/qt4projectmanager/qmldumptool.cpp | 3 ++- src/plugins/qt4projectmanager/qmlobservertool.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/plugins/qt4projectmanager/qmldumptool.cpp b/src/plugins/qt4projectmanager/qmldumptool.cpp index e39956b8a14..eac0415f922 100644 --- a/src/plugins/qt4projectmanager/qmldumptool.cpp +++ b/src/plugins/qt4projectmanager/qmldumptool.cpp @@ -130,7 +130,8 @@ bool QmlDumpTool::canBuild(const QtVersion *qtVersion) { const QString installHeaders = qtVersion->versionInfo().value("QT_INSTALL_HEADERS"); const QString header = installHeaders + QLatin1String("/QtDeclarative/private/qdeclarativemetatype_p.h"); - return checkMinimumQtVersion(qtVersion->qtVersionString(), 4, 7, 1) || QFile::exists(header); + return qtVersion->supportsTargetId(Constants::DESKTOP_TARGET_ID) + && (checkMinimumQtVersion(qtVersion->qtVersionString(), 4, 7, 1) || QFile::exists(header)); } static QtVersion *qtVersionForProject(ProjectExplorer::Project *project) diff --git a/src/plugins/qt4projectmanager/qmlobservertool.cpp b/src/plugins/qt4projectmanager/qmlobservertool.cpp index e444d89bbb6..f2b55cbac65 100644 --- a/src/plugins/qt4projectmanager/qmlobservertool.cpp +++ b/src/plugins/qt4projectmanager/qmlobservertool.cpp @@ -53,7 +53,8 @@ static inline QStringList validBinaryFilenames() bool QmlObserverTool::canBuild(const QtVersion *qtVersion) { - return checkMinimumQtVersion(qtVersion->qtVersionString(), 4, 7, 1); + return qtVersion->supportsTargetId(Constants::DESKTOP_TARGET_ID) + && checkMinimumQtVersion(qtVersion->qtVersionString(), 4, 7, 1); } QString QmlObserverTool::toolForProject(ProjectExplorer::Project *project) From 2578810334618e6f87614f12875de3dc9d563898 Mon Sep 17 00:00:00 2001 From: Lasse Holmstedt Date: Mon, 4 Oct 2010 12:02:52 +0200 Subject: [PATCH 106/118] Debugging helpers: Preserve whole build log Otherwise, users might only see parts of the build that succeeded, but not the failed ones (depending on build order). Reviewed-by: ckamm --- share/qtcreator/qml/qmlobserver/qmlobserver.pro | 2 -- src/plugins/qt4projectmanager/qmldumptool.cpp | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/share/qtcreator/qml/qmlobserver/qmlobserver.pro b/share/qtcreator/qml/qmlobserver/qmlobserver.pro index 06df9ecaccd..d05ca7ee1e6 100644 --- a/share/qtcreator/qml/qmlobserver/qmlobserver.pro +++ b/share/qtcreator/qml/qmlobserver/qmlobserver.pro @@ -16,8 +16,6 @@ exists($$PWD/qmljsdebugger/qmljsdebugger-lib.pri) { include($$PWD/../qmljsdebugger/qmljsdebugger-lib.pri) } -DESTDIR = $$IDE_BIN_PATH - mac { QMAKE_INFO_PLIST=Info_mac.plist TARGET=QMLObserver diff --git a/src/plugins/qt4projectmanager/qmldumptool.cpp b/src/plugins/qt4projectmanager/qmldumptool.cpp index eac0415f922..cc675ce6b0f 100644 --- a/src/plugins/qt4projectmanager/qmldumptool.cpp +++ b/src/plugins/qt4projectmanager/qmldumptool.cpp @@ -223,11 +223,11 @@ QString QmlDumpTool::copy(const QString &qtInstallData, QString *errorMessage) QString sourcePath = Core::ICore::instance()->resourcePath() + QLatin1String("/qml/qmldump/"); // Try to find a writeable directory. - foreach(const QString &directory, directories) + foreach(const QString &directory, directories) { if (copyFiles(sourcePath, files, directory, errorMessage)) { - errorMessage->clear(); return directory; } + } *errorMessage = QCoreApplication::translate("ProjectExplorer::QmlDumpTool", "qmldump could not be built in any of the directories:\n- %1\n\nReason: %2") .arg(directories.join(QLatin1String("\n- ")), *errorMessage); From ccecfd701e1154f4ebf6085683b5602a759067a6 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 4 Oct 2010 12:19:28 +0200 Subject: [PATCH 107/118] Debugger: Fix manual test. to work at least for debug-in-source builds. Reviewed-by: hjk Task-number: QTCREATORBUG-2546 --- tests/manual/gdbdebugger/simple/simple_gdbtest_app.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/manual/gdbdebugger/simple/simple_gdbtest_app.cpp b/tests/manual/gdbdebugger/simple/simple_gdbtest_app.cpp index 5066ce98d64..fb7b6b9e579 100644 --- a/tests/manual/gdbdebugger/simple/simple_gdbtest_app.cpp +++ b/tests/manual/gdbdebugger/simple/simple_gdbtest_app.cpp @@ -935,13 +935,13 @@ void testPlugin() QLibrary lib(dir + "/libsimple_gdbtest_plugin.dylib"); #endif #ifdef Q_OS_WIN - QLibrary lib(dir + "/libsimple_gdbtest_plugin.dll"); + QLibrary lib(dir + "/debug/simple_gdbtest_plugin.dll"); #endif #ifdef Q_OS_SYMBIAN QLibrary lib(dir + "/libsimple_gdbtest_plugin.dll"); #endif int (*foo)() = (int(*)()) lib.resolve("pluginTest"); - qDebug() << "library resolve: " << foo; + qDebug() << "library resolve: " << foo << lib.fileName(); if (foo) { int res = foo(); res += 1; @@ -2076,6 +2076,7 @@ int main(int argc, char *argv[]) Q_UNUSED(s); Q_UNUSED(w); + return 0; } QT_BEGIN_NAMESPACE From ed6f28522d77fb96e7c78e9f139412bc82d350f6 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Mon, 4 Oct 2010 13:18:40 +0200 Subject: [PATCH 108/118] QmlInspector: Fix regression in live preview ClientProxy::isEnabled() now only returns true when the server plugins are available too. Wait until then before using it to initialize the livepreview objects. Reviewed-by: Lasse Holmstedt --- src/plugins/qmljsinspector/qmljsinspectorplugin.cpp | 13 ++++++++++--- src/plugins/qmljsinspector/qmljsinspectorplugin.h | 1 + 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmljsinspector/qmljsinspectorplugin.cpp b/src/plugins/qmljsinspector/qmljsinspectorplugin.cpp index a972d1ba505..a89f00d0baa 100644 --- a/src/plugins/qmljsinspector/qmljsinspectorplugin.cpp +++ b/src/plugins/qmljsinspector/qmljsinspectorplugin.cpp @@ -118,14 +118,16 @@ void InspectorPlugin::extensionsInitialized() m_inspectorUi->setupUi(); } -// The adapter object is only added to the pool with a succesful connection, -// so we can immediately init our stuff. void InspectorPlugin::objectAdded(QObject *object) { Debugger::QmlAdapter *adapter = qobject_cast(object); if (adapter) { m_clientProxy = new ClientProxy(adapter); - m_inspectorUi->connected(m_clientProxy); + if (m_clientProxy->isConnected()) { + clientProxyConnected(); + } else { + connect(m_clientProxy, SIGNAL(connected()), this, SLOT(clientProxyConnected())); + } return; } @@ -148,4 +150,9 @@ void InspectorPlugin::aboutToRemoveObject(QObject *obj) } } +void InspectorPlugin::clientProxyConnected() +{ + m_inspectorUi->connected(m_clientProxy); +} + Q_EXPORT_PLUGIN(InspectorPlugin) diff --git a/src/plugins/qmljsinspector/qmljsinspectorplugin.h b/src/plugins/qmljsinspector/qmljsinspectorplugin.h index ea4a378c74e..f0f9500fb74 100644 --- a/src/plugins/qmljsinspector/qmljsinspectorplugin.h +++ b/src/plugins/qmljsinspector/qmljsinspectorplugin.h @@ -74,6 +74,7 @@ public: private slots: void objectAdded(QObject *object); void aboutToRemoveObject(QObject *obj); + void clientProxyConnected(); private: void createActions(); From 38d990636ff43e960048dbbeeedd2ae85b87fe38 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 4 Oct 2010 13:30:25 +0200 Subject: [PATCH 109/118] CodePaster[CodePaster]: Allow for fetching complete URLs. Reviewed-by: Tobias Hunger Task-number: QTCREATORBUG-2542 --- src/plugins/cpaster/codepasterprotocol.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/plugins/cpaster/codepasterprotocol.cpp b/src/plugins/cpaster/codepasterprotocol.cpp index bc8137abfd8..bd7657656c8 100644 --- a/src/plugins/cpaster/codepasterprotocol.cpp +++ b/src/plugins/cpaster/codepasterprotocol.cpp @@ -99,13 +99,24 @@ void CodePasterProtocol::fetch(const QString &id) QTC_ASSERT(!m_fetchReply, return; ) QString hostName = m_page->hostName(); - QString link = "http://"; - link.append(hostName); - link.append("/?format=raw&id="); - link.append(id); + const QString httpPrefix = "http://"; + QString link; + // Did the user enter a complete URL instead of an id? + if (id.startsWith(httpPrefix)) { + // Append 'raw' format option + link = id; + link += QLatin1String("&format=raw"); + const int idPos = id.lastIndexOf(QLatin1Char('=')); + m_fetchId = idPos != -1 ? id.mid(idPos + 1) : id; + } else { + link = httpPrefix; + link.append(hostName); + link.append("/?format=raw&id="); + link.append(id); + m_fetchId = id; + } m_fetchReply = httpGet(link); connect(m_fetchReply, SIGNAL(finished()), this, SLOT(fetchFinished())); - m_fetchId = id; } void CodePasterProtocol::list() From 29d4a329af9101bfd4c8f28c5c4faf42e65e7ab9 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 4 Oct 2010 12:54:14 +0200 Subject: [PATCH 110/118] Maemo: Fix desktop file contents, ignore missing desktop file. Task-number: https://projects.maemo.org/bugzilla/show_bug.cgi?id=195541 Reviewed-by: kh1 --- .../qt-maemo/maemopackagecreationstep.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.cpp index 3ab3575939d..476346c9264 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemopackagecreationstep.cpp @@ -128,6 +128,7 @@ void MaemoPackageCreationStep::run(QFutureInterface &fi) { bool success; if (m_packagingEnabled) { + // TODO: Make the build process asynchronous; i.e. no waitFor()-functions etc. QProcess * const buildProc = new QProcess; connect(buildProc, SIGNAL(readyReadStandardOutput()), this, SLOT(handleBuildOutput())); @@ -548,9 +549,6 @@ void MaemoPackageCreationStep::addWorkaroundForHarmattanBug(const QString &rules const int makeInstallEol = content.indexOf('\n', makeInstallLine); if (makeInstallEol == -1) return; - const QByteArray lineBefore("Icon=" + projectName().toUtf8()); - const QByteArray lineAfter("Icon=/usr/share/icons/hicolor/64x64/apps/" - + projectName().toUtf8() + ".png"); QString desktopFileDir = QFileInfo(rulesFile).dir().path() + QLatin1Char('/') + projectName() + QLatin1String("/usr/share/applications/"); @@ -563,15 +561,18 @@ void MaemoPackageCreationStep::addWorkaroundForHarmattanBug(const QString &rules int insertPos = makeInstallEol + 1; foreach (const Qt4ProFileNode * const proFile, proFiles) { const QString appName = proFile->targetInformation().target; + const QByteArray lineBefore("Icon=" + appName.toUtf8()); + const QByteArray lineAfter("Icon=/usr/share/icons/hicolor/64x64/apps/" + + appName.toUtf8() + ".png"); const QString desktopFilePath - = desktopFileDir + appName + QLatin1String(".desktop"); + = desktopFileDir + appName + QLatin1String(".desktop"); const QString tmpFile = desktopFileDir + appName + QLatin1String(".sed"); const QByteArray sedCmd = "\tsed 's:" + lineBefore + ':' + lineAfter - + ":' " + desktopFilePath.toLocal8Bit() + " > " + tmpFile.toUtf8() - + '\n'; - const QByteArray mvCmd = "\tmv " + tmpFile.toUtf8() + ' ' - + desktopFilePath.toUtf8() + '\n'; + + ":' " + desktopFilePath.toLocal8Bit() + " > " + + tmpFile.toLocal8Bit() + " || echo -n\n"; + const QByteArray mvCmd = "\tmv " + tmpFile.toLocal8Bit() + ' ' + + desktopFilePath.toLocal8Bit() + " || echo -n\n"; content.insert(insertPos, sedCmd); insertPos += sedCmd.length(); content.insert(insertPos, mvCmd); From abfb22a68e132c8b65063cccd2e97f5b706e76cc Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Mon, 4 Oct 2010 14:23:20 +0200 Subject: [PATCH 111/118] QmlDebugger: Make JS breakpoints not pending when they're hit Task-number: QTCREATORBUG-2590 Reviewed-by: Christiaan Janssen --- src/plugins/debugger/qml/qmlengine.cpp | 29 ++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index b4c361d55b3..b85302b3edb 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -661,9 +661,34 @@ void QmlEngine::messageReceived(const QByteArray &message) tr("

An Uncaught Exception occured in %1:

%2

") .arg(stackFrames.value(0).file, Qt::escape(error)); showMessageBox(QMessageBox::Information, tr("Uncaught Exception"), msg); + } else { + // + // Make breakpoint non-pending + // + QString file; + int line = -1; + + if (!stackFrames.isEmpty()) { + file = stackFrames.at(0).file; + line = stackFrames.at(0).line; + + if (isShadowBuildProject()) { + file = fromShadowBuildFilename(file); + } + } + + Internal::BreakHandler *handler = breakHandler(); + for (int index = 0; index != handler->size(); ++index) { + Internal::BreakpointData *data = handler->at(index); + QString processedFilename = data->fileName; + + if (processedFilename == file + && data->lineNumber == line) { + data->pending = false; + data->updateMarker(); + } + } } - - } else if (command == "RESULT") { Internal::WatchData data; QByteArray iname; From 70c189e2bdfe5e76c583a3a5eeeaf8db8f0e046a Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Mon, 4 Oct 2010 14:32:50 +0200 Subject: [PATCH 112/118] QmlJS: Fix instances of using lookupContext() on invalid info. Task-number: QTCREATORBUG-2594 Done-with: Thomas Hartmann --- src/plugins/qmljseditor/qmljseditor.cpp | 26 ++++++++++++++------- src/plugins/qmljseditor/qmloutlinemodel.cpp | 2 +- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index 651586ee43f..c3a465b27b5 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -984,8 +984,8 @@ static UiQualifiedId *qualifiedTypeNameId(UiObjectMember *m) void QmlJSTextEditor::updateCursorPositionNow() { - if (m_contextPane && document() && !semanticInfo().document.isNull() && - document()->revision() == semanticInfo().document->editorRevision()) + if (m_contextPane && document() && semanticInfo().isValid() + && document()->revision() == semanticInfo().document->editorRevision()) { Node *oldNode = m_semanticInfo.declaringMemberNoProperties(m_oldCursorPosition); Node *newNode = m_semanticInfo.declaringMemberNoProperties(position()); @@ -1225,7 +1225,7 @@ void QmlJSTextEditor::setSelectedElements() endPos = textCursor().position(); } - if (m_semanticInfo.document) { + if (m_semanticInfo.isValid()) { SelectedElement selectedMembers; QList members = selectedMembers(m_semanticInfo.lookupContext(), startPos, endPos); @@ -1459,7 +1459,7 @@ void QmlJSTextEditor::findUsages() void QmlJSTextEditor::showContextPane() { - if (m_contextPane) { + if (m_contextPane && m_semanticInfo.isValid()) { Node *newNode = m_semanticInfo.declaringMemberNoProperties(position()); m_contextPane->apply(editableInterface(), m_semanticInfo.lookupContext(), newNode, false, true); m_oldCursorPosition = position(); @@ -1487,7 +1487,7 @@ void QmlJSTextEditor::updateToolTipNow() if (!TextEditor::ToolTip::instance()->isVisible()) return; - if (m_contextPane) { + if (m_contextPane && m_semanticInfo.isValid()) { Node *newNode = m_semanticInfo.declaringMemberNoProperties(m_toolTipPosition); m_contextPane->apply(editableInterface(), m_semanticInfo.lookupContext(), newNode, false, true); m_oldCursorPosition = m_toolTipPosition; @@ -1574,8 +1574,12 @@ void QmlJSTextEditor::wheelEvent(QWheelEvent *event) BaseTextEditor::wheelEvent(event); - if (visible) - m_contextPane->apply(editableInterface(), m_semanticInfo.lookupContext(), m_semanticInfo.declaringMemberNoProperties(position()), false, true); + if (visible) { + LookupContext::Ptr lookupContext; + if (m_semanticInfo.isValid()) + lookupContext = m_semanticInfo.lookupContext(); + m_contextPane->apply(editableInterface(), lookupContext, m_semanticInfo.declaringMemberNoProperties(position()), false, true); + } } void QmlJSTextEditor::resizeEvent(QResizeEvent *event) @@ -1876,8 +1880,12 @@ QModelIndex QmlJSTextEditor::indexForPosition(unsigned cursorPosition, const QMo bool QmlJSTextEditor::hideContextPane() { bool b = (m_contextPane) && m_contextPane->widget()->isVisible(); - if (b) - m_contextPane->apply(editableInterface(), m_semanticInfo.lookupContext(), 0, false); + if (b) { + LookupContext::Ptr lookupContext; + if (m_semanticInfo.isValid()) + lookupContext = m_semanticInfo.lookupContext(); + m_contextPane->apply(editableInterface(), lookupContext, 0, false); + } return b; } diff --git a/src/plugins/qmljseditor/qmloutlinemodel.cpp b/src/plugins/qmljseditor/qmloutlinemodel.cpp index 595cf7afe7a..b2a44a93666 100644 --- a/src/plugins/qmljseditor/qmloutlinemodel.cpp +++ b/src/plugins/qmljseditor/qmloutlinemodel.cpp @@ -38,7 +38,7 @@ QVariant QmlOutlineItem::data(int role) const if (role == Qt::ToolTipRole) { AST::SourceLocation location = m_outlineModel->sourceLocation(index()); AST::UiQualifiedId *uiQualifiedId = m_outlineModel->idNode(index()); - if (!uiQualifiedId || !location.isValid()) + if (!uiQualifiedId || !location.isValid() || !m_outlineModel->m_semanticInfo.isValid()) return QVariant(); QList astPath = m_outlineModel->m_semanticInfo.astPath(location.begin()); From 36b17fd9747ae3a9666e3288e570dd4e81e462b0 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 4 Oct 2010 14:50:58 +0200 Subject: [PATCH 113/118] Wizards: Move QML standalone app wizard to QML category. Task-number: QTCREATORBUG-2510 Reviewed-by: Alessandro Portale --- .../qmlprojectmanager/qmlprojectapplicationwizard.cpp | 9 +++++---- src/plugins/qmlprojectmanager/qmlprojectconstants.h | 6 ------ src/plugins/qmlprojectmanager/qmlprojectimportwizard.cpp | 7 ++++--- .../qt4projectmanager/qt4projectmanagerconstants.h | 8 +++++++- .../qt4projectmanager/wizards/qmlstandaloneappwizard.cpp | 6 +++--- 5 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/plugins/qmlprojectmanager/qmlprojectapplicationwizard.cpp b/src/plugins/qmlprojectmanager/qmlprojectapplicationwizard.cpp index 260cd600038..c58241c2c89 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectapplicationwizard.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectapplicationwizard.cpp @@ -32,6 +32,7 @@ #include "qmlprojectconstants.h" #include +#include #include @@ -61,7 +62,7 @@ QmlProjectApplicationWizard::~QmlProjectApplicationWizard() Core::BaseFileWizardParameters QmlProjectApplicationWizard::parameters() { Core::BaseFileWizardParameters parameters(ProjectWizard); - parameters.setIcon(QIcon(QLatin1String(Constants::QML_WIZARD_ICON))); + parameters.setIcon(QIcon(QLatin1String(Qt4ProjectManager::Constants::QML_WIZARD_ICON))); parameters.setDisplayName(tr("Qt Quick UI")); parameters.setId(QLatin1String("QA.QML Application")); @@ -70,9 +71,9 @@ Core::BaseFileWizardParameters QmlProjectApplicationWizard::parameters() "You can review Qt Quick UI projects in the QML Viewer and you need not build them. " "You do not need to have the development environment installed " "on your computer to create and run this type of projects.")); - parameters.setCategory(QLatin1String(Constants::QML_WIZARD_CATEGORY)); - parameters.setDisplayCategory(QCoreApplication::translate(Constants::QML_WIZARD_TR_SCOPE, - Constants::QML_WIZARD_TR_CATEGORY)); + parameters.setCategory(QLatin1String(Qt4ProjectManager::Constants::QML_WIZARD_CATEGORY)); + parameters.setDisplayCategory(QCoreApplication::translate(Qt4ProjectManager::Constants::QML_WIZARD_TR_SCOPE, + Qt4ProjectManager::Constants::QML_WIZARD_TR_CATEGORY)); return parameters; } diff --git a/src/plugins/qmlprojectmanager/qmlprojectconstants.h b/src/plugins/qmlprojectmanager/qmlprojectconstants.h index cd014f52767..3a4bda66a00 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectconstants.h +++ b/src/plugins/qmlprojectmanager/qmlprojectconstants.h @@ -47,12 +47,6 @@ const char *const FILES_EDITOR_ID = "Qt4.QmlProjectEditor"; const char *const FILES_EDITOR_DISPLAY_NAME = QT_TRANSLATE_NOOP("OpenWith::Editors", ".qmlproject Editor"); const char *const FILES_MIMETYPE = QMLMIMETYPE; -// Wizard category -const char * const QML_WIZARD_CATEGORY = "F.Projects"; // (after Qt) -const char * const QML_WIZARD_TR_SCOPE = "QmlProjectManager"; -const char * const QML_WIZARD_TR_CATEGORY = QT_TRANSLATE_NOOP("QmlProjectManager", "Qt Quick Project"); -const char * const QML_WIZARD_ICON = ":/qmlproject/images/qml_wizard.png"; - } // namespace Constants } // namespace QmlProjectManager diff --git a/src/plugins/qmlprojectmanager/qmlprojectimportwizard.cpp b/src/plugins/qmlprojectmanager/qmlprojectimportwizard.cpp index 640f0175e38..e3537db8411 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectimportwizard.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectimportwizard.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -116,9 +117,9 @@ Core::BaseFileWizardParameters QmlProjectImportWizard::parameters() parameters.setDisplayName(tr("Import Existing QML Directory")); parameters.setId(QLatin1String("QI.QML Import")); parameters.setDescription(tr("Creates a QML project from an existing directory of QML files.")); - parameters.setCategory(QLatin1String(Constants::QML_WIZARD_CATEGORY)); - parameters.setDisplayCategory(QCoreApplication::translate(Constants::QML_WIZARD_TR_SCOPE, - Constants::QML_WIZARD_TR_CATEGORY)); + parameters.setCategory(QLatin1String(Qt4ProjectManager::Constants::QML_WIZARD_CATEGORY)); + parameters.setDisplayCategory(QCoreApplication::translate(Qt4ProjectManager::Constants::QML_WIZARD_TR_SCOPE, + Qt4ProjectManager::Constants::QML_WIZARD_TR_CATEGORY)); return parameters; } diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h index 9d62da41eee..db3b1719f89 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h +++ b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h @@ -88,11 +88,17 @@ const char * const QT_SETTINGS_TR_CATEGORY = QT_TRANSLATE_NOOP("Qt4ProjectMan const char * const QTVERSION_SETTINGS_PAGE_ID = "Qt Versions"; const char * const QTVERSION_SETTINGS_PAGE_NAME = QT_TRANSLATE_NOOP("Qt4ProjectManager", "Qt Versions"); -// Wizard categories +// C++ wizard categories const char * const QT_APP_WIZARD_CATEGORY = "C.QtApplicationProjects"; const char * const QT_APP_WIZARD_TR_SCOPE = "Qt4ProjectManager"; const char * const QT_APP_WIZARD_TR_CATEGORY = QT_TRANSLATE_NOOP("Qt4ProjectManager", "Qt C++ Project"); +// QML wizard categories +const char * const QML_WIZARD_CATEGORY = "F.Projects"; // (after Qt) +const char * const QML_WIZARD_TR_SCOPE = "QmlProjectManager"; +const char * const QML_WIZARD_TR_CATEGORY = QT_TRANSLATE_NOOP("QmlProjectManager", "Qt Quick Project"); +const char * const QML_WIZARD_ICON = ":/qmlproject/images/qml_wizard.png"; + // Tasks const char * const PROFILE_EVALUATE = "Qt4ProjectManager.ProFileEvaluate"; diff --git a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.cpp b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.cpp index 0ad152b1fd3..b15b995dd49 100644 --- a/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/qmlstandaloneappwizard.cpp @@ -99,9 +99,9 @@ Core::BaseFileWizardParameters QmlStandaloneAppWizard::parameters() parameters.setDisplayName(tr("Qt Quick Application")); parameters.setId(QLatin1String("QA.QMLA Application")); parameters.setDescription(tr("Creates a Qt Quick application that you can deploy to mobile devices.")); - parameters.setCategory(QLatin1String(Constants::QT_APP_WIZARD_CATEGORY)); - parameters.setDisplayCategory(QCoreApplication::translate(Constants::QT_APP_WIZARD_TR_SCOPE, - Constants::QT_APP_WIZARD_TR_CATEGORY)); + parameters.setCategory(QLatin1String(Constants::QML_WIZARD_CATEGORY)); + parameters.setDisplayCategory(QCoreApplication::translate(Constants::QML_WIZARD_TR_SCOPE, + Constants::QML_WIZARD_TR_CATEGORY)); return parameters; } From 02bae06191822a5db6aad4a46a60bf7749c6312f Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 4 Oct 2010 15:24:09 +0200 Subject: [PATCH 114/118] Doc - availability of environment variables in custom build steps Reviewed-by: Tobias Hunger --- doc/images/qtcreator-build-environment.png | Bin 0 -> 37798 bytes doc/images/qtcreator-build-steps-custom.png | Bin 0 -> 9257 bytes doc/images/qtcreator-build-steps.png | Bin 47422 -> 18046 bytes doc/images/qtcreator-clean-steps.png | Bin 7205 -> 22513 bytes doc/qtcreator.qdoc | 27 +++++++++++++++++--- 5 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 doc/images/qtcreator-build-environment.png create mode 100644 doc/images/qtcreator-build-steps-custom.png diff --git a/doc/images/qtcreator-build-environment.png b/doc/images/qtcreator-build-environment.png new file mode 100644 index 0000000000000000000000000000000000000000..fe00b2e98e2c4c0e53d0ee40e3f632381092b14f GIT binary patch literal 37798 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 literal 0 HcmV?d00001 diff --git a/doc/images/qtcreator-build-steps-custom.png b/doc/images/qtcreator-build-steps-custom.png new file mode 100644 index 0000000000000000000000000000000000000000..27e1be044b33f6a63f147c5581f835961c162bbe GIT binary patch literal 9257 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 literal 0 HcmV?d00001 diff --git a/doc/images/qtcreator-build-steps.png b/doc/images/qtcreator-build-steps.png index c629428f4ccd8eb0c50a55733fcd0a1ffbb4669d..7e506f515084acc224f3fe65b5b79c2adf7a35ec 100644 GIT binary patch delta 17947 zcmdn@iRoVtqhe=(pF1y?6c+;n1FxrtOArGCGdBYRqcH~)0|UdyA`X^`it?OXEId3W zb~_>tP4v81|MqTeN%YmZ`hVunHGeZ>35)u}Qn3W@Q}VTPS#XEz^J8883g4%lG0tAb9d?lNi z5(5JRgTV^jauCfR$}TCyz`)QTYNP_UK0I(IygAk z>!jp_c{g`FI%tt!pPH4G^*^}h(d`MMj0_A8s)aLCKUd87cEhAI?MM6LC$sEqp4c#{ z?)|mO#pTVt>PqG}EC2qU|4G2}e9g?|p07Nnt+Wj8_3C7o-(sFBH|J1+2m=GdnLh8f zDSqBA&sR`cWb1#;W%rCs zoXd9bf3nP7m3!}<2|EKr1NWTU+y7p*aX%USjAy=p za?rC!Q%p{-6isdO->De$)TsQpjojW9R%Iy?1)vl)gK;~L=giGX-|wBC5~4bH+Lp8D z%p^{9FG;jQ{vd&b+1bZ-J$cQuf{*{G1F73~9^Lva(j)F+4NDDB?+d z<+1%oSr`}?0)*C_W@BJrNND8&DLSxO zkS>^NE|e6ho#Fw~5q5%9jjNCTT70zo__1R}JLl-spHAiBU|?W)P_t^~%9ZQa@Bj1Z z^!a(VtMli~n)Rq(Ohwa7m0_`PZxA*RNdh@%NvuY{S67utMi&P29B9$0ts)uH3e*?CGhg?R>IEX&%1{ zChDBtx^?T%n)-b*8$mvv;%+y8{o1u#@1(YHnu7cV^WLvokD3C`_!MRa28KMxr))D) zK`ad>tYOiu`#(;hJeiS!K}X>5;lt|w^Y(l^CM~WTm2%V6)^@Ik$~4{RvctUQ7IM26 zyt}f^;BQj>lRfjBLXL!ohd=LL@@%_g^y23`T^V*vIP=9crE&kW8@uh>)l(Yh-@a*8 z_~?kceC?NO(fN_r&diuMukQ8Q?R>IUCC|>xJY;%h%HiMd_t*b^yItP8?9CsO^z%&y zr_KI3vir~@?uf)>BHuJRF!?t)-$oNHnSuEpZ9I~?h-Lu(SepU4D^Emah zWrgU6*l8TSTeCxFnP0p5Q|bTdurrsYJ)Fz6AI9p50o%R3gbUkOyn|E)2ef|F@PoBKGx;lT)$74IQwCDP*kKO%E>8gI+$8IK7 z`_D7aXLKLFRi3)}=FYCHvI&ZgN3(g=g%Y2O#}rP8vn+gcq*GX3$bY%=M3F$Nr-9q{ zJbL+d&id1ySw_)sQF>(S?x*8X!Uj$U59&t*Fo(|hrH z!KF$QOIH7u_RqE`eB|=zWtfuEM(6eKME$jVU9S8pak37TeYJbewvS+o9;y{@^jOGp zOrXHY<7lv+G`E>zhu!owM=Bm@FWJw&{E-qTQ|HH!Y>S0QZmycudlzpEwlC7 z_hl(t9p=_&&h|M~qn26vN%k1qweQQey!sjVP2<}4WkGviUoS6N^E_9(x0L79vuW4A zFH4y@W!lq&e8F!^w~1N2j(cmcZ*>OmGmEDo`5VlqzWS=^`gO0Y{+D&}_ix``$dsJBm>aDH*Gxi29UpMpI;ROrpmHwVw9DAnEabIlz zk%B4qQeQteFAX{MIPsXS+_5RE^H=P@QQT&}gx&PULK`#ooZQrc01=k`I;V|3|DHL; z>*P1xTf!IRZY3-U=lkA1?l{P+W zbzhmA>21DnyK}>p+p{-aPrg%s==_SMJ)iu&59o;S8XoU$ot+@pe>%Hw<&1cNAWhF{ zsgZu2&716XDuVvZiSV{^f32p;LEf|CXPAe%{viR@L9$MCb4Qdd~X2h{c|5+sY2N@vaVE zFDEa5e}Db|e}8`;KYl!Xecax}!)*KHZpvIL>U_O^|G!@IdlfI2PVbYm)$$aQkB-_| z^i(>3PvNU8EAwj}OaK1hrw>m)sW5NzRMEt@B*= zdBN4w5|dRrJ%n7+Z4epSuaa5>yo=P6XYwx#v3j*#F|4;QZXx$7I} zDsUui*thTA+f7+tKTkgXQ)!v5lEj>+jPo z)x}90?kQ<_Ez+2J!KS{RZ%3T+<9OA}r^9b~H-6Qz{978aJI&VZ?vp*YYj(ZS=e}ki z*Dn65Nqu3~x!lZ8KWo$`OUi@5`4pq2Yb5JmU0M16NB{pHXY=cl_fLOezW?XhcKN!B zM@Kpjnd(Gs$#{IMH~ZR}hi}(KZcclAthd;@Dy97C)NncLvYecpHH+&PKYqLYzFpy? zBhmSLuU@@c`sv9@`M)pRrOoqXa8jEL zDtw=voh_UGlxy|s)tCQSD=)L&D(n5>JC|cYm7PRf+?(|#ue7J0pZ1~S-~tbwIUQUs zN8(>jIrPUjX3~$%W()UsdQ3{;u5a9*V0df``?I#!%}Sa1%yyb*=3kzqlBqv^Uq{MM z@A5mR4_(|Ka^>DNuB#73mhTG|Ir(SV;Vbo4*D~LCY?S>Pp~le@uaZ{nemU+ktD}Oa zRYKmyxaP3Ew>G^`Z8;i;AZYhq0%K=Omx{ z{KP1gW$DuOn>ZG|oTpg1?#sn(hTh^Vj-C@;0=e2*+qu)Tmx_2r9kUm6xf2}J zep!jFR!~fDt74Gd#V18gEB;1WUcN7XWxsiD_u=R4*2ni3eRiuBzNOl^!R652;3(5S z&76|=u5&N(`1XwF`QZlp@VP=NVtx{RA@`JSWxI$a z$GAnczrTGvxv5v$d|r0S=d_%hH;?=6^D;A6u3o+S<1uMf&rK>;FH3%HI<2>Q_3Gb$ zp4KzcIi>k@GDoY{HWR2Z}%(X_O{&c*wU*#v&_`oTqmn|E1AT9SM(H| zufIseYTHD0CAVoCl^&nIWtsY1Xn*8^Kfg`{%e<{!RFLdfy>>l&vDmumxqY&h@n6bM zt~V3Y6sS{*`m%P%lgmdXJWr`t{}a>L7<7Nmls8=+9Y+>C+`B!aKK{yfe`oQQf(Rj3 zA=i_Ci?{6*ovXU~^0pVv4mxu@T2yNVdL)vkeXlN7b+R}UW4A;^@k680#j4mhj<-Z5 zG%qll@yxTxE3u3D%kacbXrZ{V&41OvDPPV9ty}EjH|N-dH_PufRxRs_U3@4yJ$|Vp8N}9AKhrU+yUX5!+Ht$z@7tYplq;F{^z?dtc}Yo0 zS=qgh`>e06i~W7kU4H7lUAC&TE_wugV@~>wVXSHPfg$N75r3?DEr~hZrcdhwz{zl>YPY>-+RRlecS(Y&8l)8$e z!gOZY*CnqyqNc{h3AtWo*IKK;Os+#oxV}a0x!79MGaZv&Y8fxP#2CGJ{`S(de{DY4 zPEs&PYI0cQ(Hbwno4L&@QQ5V|^*#evx#P}|NfIH#D%A(Bg>4B`4_cm=6WufYhSh%M zmcuDOjwDDMCOvfN?A-BfV?;HV#h$fO%#@CvUtwu{p(>s4#zyg@ANHSgVvZ4;q~Y}| zBH&7W?V_`dk0mAv@J)W`Gto@=?d7=YFE>{-UH7P-c=>er0q@4Sf7d(L@7!SDE*tN& z#KYi`mE-c#{Rd7vJ@gZ`;1sRMTYAa8Np#wm7280d%+2%CGT+%1lfK-(|L@!O{eN}+ z`^|E1g;Z5-Njp1>SK2J+#)g9xkH7g?2Q5lI-gmdS{=6-}-H!*mN?-HITA5f_WN3c) zcwGMT!6mQP?e43e|1SRD)A(h}mStsSb#(kMFDcowef#%E-THEJa{GQho6Rp%P-ACV z;N9lsKWWW=iOl1NE^c_y?Nak~qR?xVN6M?eIvPG&-EWcl*K29e5%H9r8G3>re<~gP zRaKg<^s1!c{POAb8UlGUu6~Zt-OkH#aYe-Y&w)x44MJ1vj71k++p7~Kza+y?L1 zG4qr}w8)~JH~Cr&-LjN*=6INNE?OF>)V@ygyz`Y3Z6VKFs}(wxyz4hO&A-gktKI7< z7-&>-yQBKa(bF>_1mr2?LN;uFK}_5ZFS!Mzu(;DYo~Nb zB*mnH!%{`UH-rlE${cRq8t@^1r|M#8eVQV55-hJomGCjWT=efDo$`d&RZ9g6n z-m@)8WUt}s6;io+9}YA!=jP@v_n)s95cMYJo@V`|3-x>I^VFuLxxU)Ha`LbHd~=_7 zE|=7y&kuEsr#%NyZR3g4j%0m|9>?8kL$&%Wy_bhx3_n$Si5%Zlrw4*J!-yO zbYC65e%qZ{YyYa$UwS${eqZ8Yw&Tg}Zf>`3-RkEV4Gx}cYpb;A)~#Ew*X>?6Tr<>K}Fac8bi+#7ImQ%<~@1h`Xg5xqTc zuFBMU-UXi%PEJx~=a)12x6I54WPZWcyt})K+6(M-Vs~BHw1ev%#5E)glYFT52z~b4 z{{PQ~&h374twQVHIWRCVtU9wP_4K+OkGk6B>vl{zbYjA)lYQdxYu2y+{mgv-%^No& z-bH{_Jv`iA4yuceiqEh3^Knt@M8(j__Wxh{^Vk2rJ^$C0Qvi`^?w`fPS&6MDJB`Tedno% zA)9o9f3=(6-=n)WZ|8UM`uTqz#T{SdRmo$;$iQ&M<7p#$; zVPax(ed^|&Yl5det+Dg3oN06a@7w(Sj};ev`4*kG^U3K?^Zz|upS$$4k>JzMKmW|x z%Fn{knDA+WNM%l$4a!X=;5nrrPP`>LV(d+fq_xHWuv;S}VB%RZj`15y8 z+5NO#NPpVBy6(j8FNdS2*tQ-26?m(Vfq|j^>hmD=V@#?`Y`Y#w2E|vae@)+fGbe1e z`lL%a>1Maz_m|r_{Bew*?{dV+Ida|o%h$!#b?3iW^6yPR$5HFsO9k`|p7h%%_%T<^ zz4<1fPVzf%4GfR2wZ%J1%4#b&pjnUR^73Zs z{xcEWe9iOB`}EqNSzPzFD0^m#-FjJJzg47va^m!bDxZHx&X?dfOj;Wzax*Xl zq#Dii@%HZicH`5$Z8bkX3B8`V`}c$;`@VhKQLkZrWXkL*ogEP??#sV_)1w{FpS*D4 z&fSTXa!XZL7IdXOyz#wK`LxkVBgy=O=Th9FXU$HT88z?6)%Ei-E_S7ry}8g;zp{No zs&|@+^Vw-eJ2p!*Fs!3wvrLW!G+|E7aUHd~vI=Rp=Zi|Tisvc&~k2}l~pK$Vi z4Nk9~@6uDLQv2y_uSmakbJ(OQ*S6hA`m`c?ZS~Ci{%v7Ay{}BgpNjwa7RG(V`CRRF zzL}0HN8dS5O0}GS{`t>{#Cg?!v;U{MUrw&?H#IdiO)Yy>%sq@_P764e*W-(NAbQ_>pNG$$|NHy7K?@55gTZ8;Ouzb{8xH;a zz4>O*@dp{p;=^=~KA%_n-nKq>Zt|UFybKKD>vrzp=hQkrN!8o#=ab3W>-T)>um6(_ zEzZN^Yrm?`ui2Dxa#9eNvhymn>2XyrA3R7<5HRqY!oDW|AMWfX#YgbjG74GGEW>cu-5_bj$hRtEWZfk&R)OrS3mHm8fx3xhJ zb)VPo0@Xq0CTBF1)2-ofBl^S7(3paZty`OIm3Q z7cNYS294Wm1$icW1ljogoA6-bqr%cVF0ZolGcqy^cyuDSX)M+Wy3brIB;WY!+2mgd zLi#r^)JukYe=C(Tm+acn6BEh(V(N-gGl_4~?KMA=SFYc?ck|}C+gD6^<}2N|^-4}h z#Oo=a>Wh!3o81CUqKGb^!qeHWV7UK5c<_>n^y>M`?Ps4&+w83PY)@pL=%fEj;xg#P&1 zH>N06Rkp)_>fBs<4C|NKJUAY-XY)cw-6#H&gDa|3&p6l4<(>QYW?g-~z2Nz~PO5W2 z^D`@Ajvk+|q$1|h@`XIYxu4x%W#{+*Zok9c$R+OK{aj>`oy}4AC0w7sr*FQwMnP)X zO9lpp1-C@cPk2<=na*gF2%-(&PE&dM|C_Gcq{LsHhW$(Yx{p4dR3Bg9=QxE??t9M~ z2gbuC3vAnzH0LSqQL1PSicg>K^5p$_zSfASNd@vk3=9Wa7yQtPp2K4tR+qYH?S4>6 z^Ww6w=>FX9u2!diZRgt9zTKBo%u@OEoxkE-88%`3{T;1s^<`F5FIkCJ9lN}I%MmAM=N^uof(#4}Usulr%|E%hyWhTb z%WuA2?7fC(5qmZ}igcZy8rs=u|9suvs!~W>Dd{Euv2}5~4{a)Zd1>k4!-vnFJ$q}~ zr8@qVw~knEt#11B_a?WBEod_K^Rq)|Cj9w(GiPTqXlnCS>(p#UhI$5uH4_v=XKp;~ zep(ikk+*97&HZv{PU`Le)3~CK^ZV!jDfr_7$!cNY>vpze?8-1q@wmEVTiULTiJlNA zWF5V%d`L$cWU4GUSHUyY36#mXhr4sGKKUtIAOB7O)SSFG*}tZKX@+EqN9eQt_3vLl z6; zpZ2y*pp>0o6SGE7ccViaXhuzRO-rPin3NQk;bSpRugUHS+m0_yUbt|fq#S5!v0&es zq-nbMZr0yZ|G0ANw{z8BkJnDRay?HfOR1J^-NJ>&dS7i9Ov(KJZ1Sm?sdlE~@1OL` zY8jg3%AA2V=B}Q){dK0@UOsQtkAA7%nQKdq-Cg}?$-c7VZy6XE0?vA!n80J{JljIUe07v`AFKAYD5=OgqXMFV$jTVA!$XY}T~16IGUK-n)5W!N1${r)l^t zoXeW;_lf(TpP^q}eSM5iyHnkyUu&ictn^*3dQv|kE4j{IS?QQWu$;z0iFd_GK6^i( zynp`v)J^THwkjQ6Yj}IL5vu^Gsq=M%k!tm=cgtfB$KESqPcm8`2;$a0zOw0dylwv8 zbq6NLG%7MOgsigsd(@+L&(bBow{>>>Sr`!26CC67IVL@9YJ^99?c2A7|0h&#>1_Sw z{L(MiZ~c)lnbl2^9l2{S=JZ;MdA{qrn6CCN|F!3<*;TiC{@bvhylZ&t&aO29oZq+g z?A~(xXp;B4zQ6}|?J+6utV}Pj(lS`W?XoaVdfu-;Gv~j_3^qUWcx6$BYq!g9?k%|& z`=c7d1rKDsGg3KbGpSOl>u3Gnl-V;TE!pzZV86X?*(%OSdxhq<8efpaF3c=j zyUIwyZr--9DwAzkIt;!NK8g zc|w9hf=vLgs#tbzZrQu#Tk}ru2Whsojh_0>iZyA)owquY?CmjDcgSa%9gKt zmf6?6*=Y83&gW&ii<37-tl4@sd$-%NTa%9Mjh=7*_0T=u+pZ?zOW%j_n_ml?sVKRw z^`n->*7_GlA70$K+;m>Pda+-u@!a+q3zhzQF8Z6B+xzitpFi8vmwqlQQ#NhAntkWe ztF0-aOaE|wZu5EU@MoiCLbmqC2ps_q0l~`m+!etqmmC&jj?Q4823t+2qh^3FUS8<*(x{*wW<9LR{0O?^aEF4Uv2x~ z_E!G|(aA^bb<}p>zBMWK53Au!uS|J|+q)*8OgR;?{Bd0V^>y#AT${BmqCO#f`t}Ik zxct?&HTl;!tU2%VVt%@;*S2k|vCJw6|uSN zCf>XDPGaTps8vNghwB7;6IUOvde2>vym7|HZC<>c9(%=HL^xP9rb?M^&sgucIxctT z+xKcRt4zgi)NcH$nV9*-H2V6R=Z=E)94tXARhCX#+o+eXCAK(4>nQs(o#m%Z*dD)? znwDxQV9Y-&@9MuQpW4EzqFeK>HaaxS?~l;AdRMeyN5Qr*uZ8D!^OjdnzH7Vga2W%) zOKF;iYTaJG9V!0Nv#Y8Z|C@Nb+_k;(CU!4vc~~L1+ImTG_fl`!E7ezielyzZ zaDDQ&U}aqXWFN2Rqwf%By9}Ybk+3!77iAssAICXqb@%VeIKiJOT0b3 zbirzC(e6N-}vaZtnD*a z$gkY0A35{#$|vt4Hf_B+`_0W;lT}jZsZCwPlq(p?rOsW`eEOry&X7DAA1$j5OSZo# z>YY-!{x{Q;OM=G@>gVV!ikcc{x6}HWfk#N7;>^6ofk%@J^B>qf?#*zu4pllGoOI>d zi}>5Sp4G|i`Odmxxw`0%^WOJ|0s&yE;!ub4bL0 zVPa<9IBT1kl$@MdXlmV8KAwp0+rC}NS;}bXAR^ImbxUsURQ8_$dQhm-TT_&s~q zMDM-T$hh-#wpMbEp@G7ABgaj4s+}j)mYl7SW8*pObuY|I>-nYIUK?j@Kkfa* z?pjhtOs39FVecTLm3dqKZJm0FwNCLp_mW+cW10U%tXF-oZpzxJjg1k#FH_iZqIv3{ zJN~@Q9C0FR*|KFn7GJ!0aoe_SmzVobH&@Vj@Kd(_|NZ^nOWS2b|9LlTTx+`VfR6f> zQ_(+pqI6!Ht~xN`l$gWKYF>t?-bLY+){?z1YyrD4Am45hR?~%w5RBv5j|`2?Opth)kn{2 zsCYjtwk#7<)&B5?agO+j39Du&-emvmC2;Jk{ zHSF!{h4s@mnQz;AvmyJXq%uIYWP_H+sRK3+1r0Hz2Ifp5?}58 z?aLA_osCc4N?ogar@t+9ecpnp|6lYcZtb12>)+&`&%d_qo^|%7^f`3(=6f1m%d^IQF*E3FmpKktfDp8mxqr#j!Ua*Z9|$<{AX7!C239E1ul{qpI}Q{Lz@dv_%WAy+v$gI zrMCTL+kUC`H`AuwXOjc2`R!a+lD%I{v@|c)sVIKuwYqg_Wjgw=cO2WY?}g{~+<@zL z=T^@ztL@Kaxn-vodurBYhN*0lL07$&1;u?<_sq{;{Y&l2t*cjW-4%X(n&VD*Qhjfu zgF@Jgqh71+Z{}7%4BnpOYq^f^smzAkZpYP3Uik})PkZw+uv>GoP@}^EQ&%I?<@@|+ zJiBzoe2-9l_KbACb=Oba-s&xRB*^Zn_RO}#3$7;>dsIE|YoBH=7gF6lnQ@<&TTXWL zCU5EF$NP)#rAq92)j4yuS8nd>ysbTdUu@l3KlgIeX6v@)^Bbp`Y^}=WobtBh>z(y1 zOZyVF6i)XDvIvN}GN1SC!*i zGI*0uZo7OUd)m{7d7F5ZwGu6_278@7IbH7H*{S8tx^XrQ4WaK+}CvoZDSRj_&%{nFN*6*rDk&{>EnC(f7*Pgq+ zx+;(Rqt(hSsi|j`*}Qs;qnM|5bTBa=Zk%D~@X&78iQW0}r8o8otl1mf>hJV)?rkMS z(TK30bNW>`={99|g!SJ~OwCX={&r9NgVnlSk0bm&O?THVsb|u#PVopmy-#UPrQ<1w z@a@ynzFIdnGDgY;OwTD=d*4=Tdg|#f4ZP;|mU$(1d#YzF*KeKfdb!y2>0X!Qo-%MzD*#2)FE^>XFUooN{xc5TBOZTl;!ydlcR{a%QcR>$sMA)6UrdLw8< z#Bv$21#5Q{SLZ3ttuC+cnwv7~>Z7wOmwe4Xv@f;Hlz9rj(UMo9FN}ICZoBpDi9Kvw zRqFlig}HjN=KI;kP%<7mF>-q?xa1jhncsOvX$$qlpmk;E8;@KZ+&um110R}Kl;=ifcCtX-V0#{F?ujIz<%54*ax zN+Tn;T3<5_;4R;FGu+-ZaDLLUuaT2&bN|Gx-!?06-?3Hugw~{XMtbMI%Qo0Omu1x+ z)#~mwN--C9%Bi6~t% zD`tgu{q?wnv|T(+(U ztv=iI%hTd_t<%&CwbOTRiCuq@DL(8QQ}p&7D~dTYuO0vNe#Np~>1B)m>fCxz{#tPV z`Fs0V7wk&lSvf1=X%quPLvf2CXd0;@5`C)3OX_&hT&B8vq`a(5nH>eogkTS$ap2fq_AX1G3;2`%>ho^AxXMxiZJLy6oa2 z*VG=+sN4ga=q(u+zkDglU7LBsH4Z)-E<{GqJRc3=hA4<3`5LU{LgmEi18l`?2Db?9n}w zQ-8j=xHvdCxVN|WmRl{4X8rWjv9({XnwpwkzI^#92R{P?gO<15{PWL0AMcmfFIV`y zdfT?Lqg|rO$;rofJmvK!rS9Ce&20Yp>B^uv%!W@Vo`2rDb?daWV@9Eaqjz5UQ&t%s*XkV_Aos*=CtG$WgZfuSMj z#Hu3pAhu=kJ##h(Pw4vb>eZ{7iC6A~g!={w-v9G8dVNjY?7|#D1_m*$oic82ZrgHh z7QMN#@$=0U8?URL+4QmG_>2!7veS5rSN6O=scN>iWdAx4aNhDJCv{$k*4u#FF<-pb z*YDZDlq*@D*?;%6cxEA=zF3hVL&K}-CsSt4niaNs(Z!6$N#%D-!_8)w-VXh?)X!@l z|H`dXkL)n25%k=??Oe3W+J`PmHuYEMCtqIKv3^~1oaMrbR<^a8lRm_=Uffo=Zc4;Y zpYw^0pFZD`WnkFxU`_P)cl`A~4nKMF&5S@u{)$a z*VMU4s_2ou_|xyzRm#nq<_NLd*4h7O)tvM+es!05pn+i+BdHywz#gAUuwSc%KTTc`8iw9UD*_rP@AuHb$4BD zet!GL+`TOp8tuaMf%|{u*PFaDzov6~(;IP?!h(Qlo|eMDGPlez$Tq)vW6CvaHd!Up z@ONc?749wz`|D^pO1|Ic)9FGLGN__E5RF!e$aZ?dm)M?X z@y8~nik*v&NN5)=l1QHPBtUz;<%$w*@zhCA1U6i&3fUl5wrbA>%Z=gZ4qY@ze(0h% zoufXk{?Ao6U7PCTSH+fg=z9dd4HBN2rCgh@C;oTNLUF&^EAveQ#X39cpRH0^?!Eph z8v{e=<1X!WC(<@2CnxjU|M@UGf1jnH;m6nU|E+{N=UA0y-QJdKez)W@yL`=uX8Au4 zCc4YboB;wIZj0@Ip7ifA?dj|L_hq?#?f1Lo>S}6szi*zGv#r{4WSP2}TH2Po=XSmF zP;|18`N*m{N5G@!#q6aW=bulhPZQ`oxWEOpJo3n9Zl$gtudXJmdL~_T(R)*}Ld8?( z%zgfu3I_8v+9VAf6I_l+B%fmb9jL zrAG}Wt2h>%4p0ePvO%-{;;JH^!#|cJo)MYxd1-hyGeg7Ybro$1dYLjlN{c>z{OH`y zcemnk@18S9#p7$9oDfVt>7!Qs{cgFxudm?6uh-+(_sR)gytOsE^ToE?dDWlKn(yAV zD^29gj~^EHcXlj2@bFX5`zzNp=YQ;dzv<81zIuMn2>S=0zuSI}m}pmF;IGW&#~ZPE zRwVmDiD03~_xAU{ zufM(h{iAMuvuhVFT=;O#`u(2o_p0N691@>3d$#?*ACDzj4eadR{n#P${8#tHHc9#0 zXM}_oUEDBD`J;(zmrKv~zg~jzwY7T>3y389=xTK)H6G;NDmE|og}dYj&J`MuSI#P) zDa85Ez_rHlZH8U9N6?YquxTxL;pn4#TcbWpIx_bii`Q} zxc@-UML2POzqsfk%f=-g*^$o|cSKlBOqlpf!L^uaqJZe@TE}VKw@#f&kZ5id=DgIe zrZ}s($626B>8VhY|Ll;Ihb~SELR%}{#Qanwl)Vj(86TRlb3^^YPt#Sxa*myOnbRW4 z-QM~uq1KjLT`2MEN9B0cES->v3M{Ug;-*)R{a<}O?S^)avEN*)7QwWydy=!3rL4;` zn=Z$|pvAObb9Tox-RN)q|9|vvzf;65`1aP;*Y9?}ulsaTz4OJd*X!&5e!U(Y74>e% z-f zzh38HVCa&NluYcIT3284b=Q+g-jhzM_+Q!46*b-WP0YTU%H<;O_A}h8V%@K>wEq0l zdviC1#wqGDF*q!padG?K)l>Ff|0Qwh#fyyS=-V@m)6c!n1Z_;?I(mFUpNwVDJBMd? zSB0)_Yj2-Dd-hgcQB!a$BtURYd6qSw324U~Q%Hi)tEP5vOOs)B@!xIs3=9l02gFWD zOxoKI9&}(pw5A~KPp|V6va+(y&9mK|adDB68>o#Wx^&sHWp@^|BpetJ_(bheb) zrT16XtzK=Y5g*mn~I)#J$CzR zzV-9ZKR`fV+9VIYL~c9UE#BYTn+V>Q zCN^c(tXaQ){W`6`|IeG7n}50G@?;hjZCbZ(-NuaF07#KpP)qvVm{qpv4?;M_m=jOic z64gF->{yRv{Up1XBm19EJOBK&AZP;3q4LS+pSNyBosM;z5daDYSWqp!-+qLB`Uh7~ zv+IFaNM6FrXGzR$d##WSX$nLW*v(4EYh%$N1u z^v(o>G_sy}YEW-vv?=xUwB+M`bI-f=?$s-t=KE%a@e2WOyVZXVNXi6MiInd1$nsk? zcX36{#49r2#TghDtV%JOxop|8tE)0hq82=fEx$YUY}(zjskJL72N|hsT)fVC$+hLe z>LTkoKFftO+Dr&%@%sAf)QqkVo0aw~nm0wbvmpCs6KLw5=k>L<^}i3x|1+?({JH!7 z-*u~3uXdR9WZBZCsqgRYJw082e*Xur^s^J*DEqCv7dNq^^|$kx4W$$Mr}E5_*XrN- zb??f9eDe-^k2Y%EfnrvNR*7Jq__vQaWaHtp3NFzoi!UB<4HIGcqt}btLBnc;RTOkl9kX=_%yT z8u4+GV0?fIXiv$`7`^En#)?v+9UUzhdi9` zFsZmI={37d((rQe5xBD9h{F2Q8#xUl*1J#RFjfsqbq-O`6zcK#_Tz2z7KR_36P3XG zM1EDpyC^AT*Uya#?B`dnXg$`;z`!6rL3`Z}rP*iudV6jEd^nuH@8`24M~Om6f@-x7{td>?>dM;UItAhh}%V%9JD!P?GBX_e9;^@S1^@)vwF*|9!bzet+(a z89&~n+gE>iaZzaYycsiQTr9J`JolEWT(E?{RE^*JUyC$^CMs~;s{bjb6wDQ-B0X8j zE^fcT)nGBu?wuGtFF#+6w{4Y~Vts9%BC7Se`#HOos5SL{wEphV@kz%|UwBJe@uX_) zWAmcSm>3vBrrhjR%=|ASFK=J+;zFF*ckyB)FPheXiJ z_m6bu)L$rKJKmF+m*H#`c=&C=(w@Sd*N+N~$S$tw6XKHfGcZV((9l!Ot^py-)-35*A15Di(ffyz5V!iG zCabNgY(Eog;(T~MSxr$YKE07Mn7>A_)1%|rmZGc^-+s)kT5_R(&3f}5v&i4s`9~`@ zH7%-p4_YCks z>XzRrJpSwJ>+*MZPD(s(|MPnPztyQcFE^dm`~6hEerMU+TdUXYTD5ZJ%W2VhGhID4 zd-Qj#NXyFVvbQRD;1C^s`{m{3>4Ds58m^RI_7&`Gyvv-?7CNr(mnF_vojR;wBECm(<&DL?Nc^-{2pAY z>X=-MG~-bQ6|m`lb}ndTO9rj|WeD353@Wr^bSD_9RLdKJt3p^87&@kcWr#ov)Mel4 zJfpl@T)%!=>dtM~OmddoUl|)7UjF05!(+#eE%ly0@B0nV5|&3gk(*L3E^_Vd?G^ua z_SPmHdCQ`dr>CYK>;1JW2R397dm|m>umdaL0|rKXGhRZ63m`5$0Cf#?H$P&a2JHVe zYqYQbJ8XX=(ma-dfz=SSnBdRh8#ivO3|@Xp$X8M~dfS^%r}gV!ENnj|3tEgbW&X?C z|LT92*N4Z4m;e9!-Q3J0c)BU;>MGC{+w=8yzjMH=OBy~I-)#qNCJtR4HrJ+dQ_RIF7f()B z4__Nq`s~ciB6d*i{WN_qzvr~4th-;GXnJeGz`zg@VXWe`2vnDG&pW*R@6$y~a_9g1 zVz%XO z*ZQySdfofBdG0N} z%&$4O^faTdOnMi3a?874uYW$S{`c?w`-!QUzr(jJzYNl!cT4XjyII~Xy^p8lt32+0 zxsYAu3R?R*&(F_K3A~ohI=ijp+nbv!LEy-{A7AE{#}xj4{?6}sx%#qY%j%c?d)~Y~ zZ-3tLMrL+CnIFs7Z}*vR^=^Y}>7OelRlnD+4qqR)x9aQROV{Q1*1r0&GIK3Mea@f! z##PJm{@=MXSr{O5r6WB#vdee-Ae zd0+qc;{eE#H#@4&AO4jX930HfCsTi+s_MakM$OHe)6dVlKN&RsBzh{5M|1x9=lARX zmhO6eZdpy;>1n%-*6;sUXZOEO?eeFs$G1!5iEhd_yyt!8)7I<8Gkw%1SN>gheSXEm z+F-_iH$L2V3VphL&xDgHMl*HSo12=N+WylHp84Havg&W=GBD89Pcc$fuACY5u720% zPWhcr^-iVSGryZNq}RzOu4zc zTxI_A-Kmk=@(t^>eSSZGUH#q6-1Ow8HGQ`=T6?)dOg~NDz5m;;Ulx-y^Rga&{d{ZI ztXW3ZWqanG-)&aA+-P11(-L3M$eU%4;#2o;|AcM7{Yfjmm-%^adEMju?|pA7|G8I3 z+rO`zxT5|ibhYa3Z7YmJD`&d>|Mq#FcxT6pbMi~&_V&H_dHmhZO@T@Bcab-o1Ox?EKU8=M|g%D*s;BJ+J!f#b-0+tLo31Ubp%C6X%)ZzGwwG~NM0Pr2|D|M!PC{xWt~$(6957!Hl6?g literal 47422 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�?Y-Fcxtsa%dh!^nKiz0&=so~ZIJo7r`G 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 diff --git a/doc/images/qtcreator-clean-steps.png b/doc/images/qtcreator-clean-steps.png index 778f06891668fc2b01c4e6f9faefce95fffa241d..6f99b3a998dc584827b64f0d3cafd34308c2119b 100644 GIT binary patch literal 22513 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 delta 7028 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 + Custom Process Step}. + + By default, custom steps are disabled. To activate a custom step, select + the \gui{Enable custom process step} check-box. + + \image qtcreator-build-steps-custom.png "Custom Process Step" + + You can use any environment variables as values in the fields. For a list + of variable names, click \gui {Build Environment > Details}. You can specify + variables as ${VARNAME} or %VARNAME%. For example, ${BUILDDIR} or %BUILDDIR%. + + \note Qt Creator sets SOURCEDIR and BUILDDIR as part of the build environment. + For more information, see \l{Build Environment}. + \section1 Clean Steps You can use the cleaning process to remove intermediate files. This process @@ -3046,10 +3063,10 @@ You can define the cleaning steps for your builds in the \gui{Clean Steps}: \list \o To add a clean step using make or a custom process, click - \gui{Add clean step} and select the type of step you want to add. + \gui{Add Clean Step} and select the type of step you want to add. - By default, custom steps are disabled. Activate custom steps by - checking the \gui{Enable custom process step} check-box. + By default, custom steps are disabled. To activate a custom step, + select the \gui{Enable custom process step} check-box. \o To remove a clean step, click \gui{Remove Item}. \o To change the order of steps, click \inlineimage qtcreator-movestep.png @@ -3066,6 +3083,8 @@ variables or add, reset and unset new variables based on your project requirements. + \image qtcreator-build-environment.png "Build Environment" + */ From 074c2d6a68a0fe516fd0d100dfb4877b15835739 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Mon, 4 Oct 2010 11:09:27 +0200 Subject: [PATCH 115/118] QmlDesigner.rewriter: fix Qt 4.7 imports This patch adds a MessageBox that asks for confirmation to fix Qt 4.7 imports into QtQuick 1.0 imports. Reviewed-by: Kai Koehne --- .../designercore/model/texttomodelmerger.cpp | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 5319445aaf4..0c2e9438671 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -31,6 +31,8 @@ #include "bindingproperty.h" #include "filemanager/firstdefinitionfinder.h" #include "filemanager/objectlengthcalculator.h" +#include "filemanager/qmlrefactoring.h" +#include "rewriteaction.h" #include "nodeproperty.h" #include "propertyparser.h" #include "textmodifier.h" @@ -47,6 +49,7 @@ #include #include #include +#include using namespace QmlJS; using namespace QmlJS::AST; @@ -589,13 +592,37 @@ bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceH foreach (const Import &import, m_rewriterView->model()->imports()) { if (import.url() == "Qt") { + if (QMessageBox::question (0, QObject::tr("Deprecated import: import Qt 4.7", "QmlDesigner::TextToModelMerger"), + QObject::tr("Deprecated import: import Qt 4.7\nuse import QtQuick 1.0 instead.\n\nDo you want to automatically fix the import?", + "QmlDesigner::TextToModelMerger"), + QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok) == QMessageBox::Ok) { + QmlDesigner::QmlRefactoring refactoring(doc, *m_rewriterView->textModifier(), QStringList()); + RemoveImportRewriteAction removeImportRewriteAction(import); + + m_rewriterView->textModifier()->startGroup(); + + Import qtQuickImport = Import::createLibraryImport("QtQuick", "1.0"); + AddImportRewriteAction addImportRewriteAction(qtQuickImport); + bool success = addImportRewriteAction.execute(refactoring, *m_rewriterView->positionStorage()); + + if (success) { + success = refactoring.reparseDocument(); + } + success = removeImportRewriteAction.execute(refactoring, *m_rewriterView->positionStorage()); + + m_rewriterView->textModifier()->commitGroup(); + + return false; + } else { QList errors; - RewriterView::Error error(QObject::tr("Deprecated import: import Qt 4.7 use import QtQuick 1.0 instead")); + RewriterView::Error error(QObject::tr("Deprecated import: import Qt 4.7 use import QtQuick 1.0 instead", + "QmlDesigner::TextToModelMerger")); errors.append(error); m_rewriterView->setErrors(errors); return false; } } + } UiObjectMember *astRootNode = 0; if (UiProgram *program = doc->qmlProgram()) From ed01ffd39ce307b63dbd92b2c542bd411c04d6c8 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Mon, 4 Oct 2010 15:33:29 +0200 Subject: [PATCH 116/118] QmlDesigner.propertyEditor: adding missing qml file This file got somehow missing during renaming Reviewed-by: Trust Me --- .../propertyeditor/QtQuick/ComboBox.qml | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 share/qtcreator/qmldesigner/propertyeditor/QtQuick/ComboBox.qml diff --git a/share/qtcreator/qmldesigner/propertyeditor/QtQuick/ComboBox.qml b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/ComboBox.qml new file mode 100644 index 00000000000..c4aa6c7d0bb --- /dev/null +++ b/share/qtcreator/qmldesigner/propertyeditor/QtQuick/ComboBox.qml @@ -0,0 +1,71 @@ +import Qt 4.7 +import Bauhaus 1.0 + +QWidget { + + id: comboBox + + property variant backendValue; + property variant baseStateFlag; + property alias enabled: box.enabled; + + property alias items: box.items; + property alias currentText: box.currentText; + + + onBaseStateFlagChanged: { + evaluate(); + } + + property variant isEnabled: comboBox.enabled + onIsEnabledChanged: { + evaluate(); + } + + function evaluate() { + if (backendValue === undefined) + return; + if (!enabled) { + box.setStyleSheet("color: "+scheme.disabledColor); + } else { + if (baseStateFlag) { + if (backendValue.isInModel) + box.setStyleSheet("QComboBox,QComboBox:on{color: "+scheme.changedBaseColor+"}QComboBox:off{color:"+scheme.optionsColor+"}"); + else + box.setStyleSheet("QComboBox,QComboBox:on{color: "+scheme.defaultColor+"}QComboBox:off{color:"+scheme.optionsColor+"}"); + } else { + if (backendValue.isInSubState) + box.setStyleSheet("QComboBox,QComboBox:on{color: "+scheme.changedStateColor+"}QComboBox:off{color:"+scheme.optionsColor+"}"); + else + box.setStyleSheet("QComboBox,QComboBox:on{color: "+scheme.defaultColor+"}QComboBox:off{color:"+scheme.optionsColor+"}"); + } + } + } + + ColorScheme { id:scheme; } + + layout: HorizontalLayout { + QComboBox { + id: box + property variant backendValue: comboBox.backendValue + onCurrentTextChanged: { backendValue.value = currentText; evaluate(); } + onItemsChanged: { + if (comboBox.backendValue.value == curentText) + return; + box.setCurrentTextSilent(comboBox.backendValue.value); + } + + property variant backendValueValue: comboBox.backendValue.value + onBackendValueValueChanged: { + if (comboBox.backendValue.value == curentText) + return; + box.setCurrentTextSilent(comboBox.backendValue.value); + } + ExtendedFunctionButton { + backendValue: comboBox.backendValue; + y: 3 + x: 3 + } + } + } +} From 685ae6bc55f8a0b5fb94c059daa1f414aa57e6eb Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Mon, 4 Oct 2010 15:38:29 +0200 Subject: [PATCH 117/118] QmlDesigner.propertyEditor: cache QtQuick items instead of Qt Fixes caching for Qt Quick items. Also the emptyPane is found again. Reviewed-by: Kai Koehne --- .../components/propertyeditor/propertyeditor.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp index 97273b7863c..24832155730 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp @@ -716,10 +716,10 @@ void PropertyEditor::modelAttached(Model *model) m_locked = true; - setupPane("Qt/Rectangle"); - setupPane("Qt/Text"); - setupPane("Qt/TextInput"); - setupPane("Qt/TextEdit"); + setupPane("QtQuick/Rectangle"); + setupPane("QtQuick/Text"); + setupPane("QtQuick/TextInput"); + setupPane("QtQuick/TextEdit"); resetView(); m_locked = false; @@ -895,7 +895,7 @@ QUrl PropertyEditor::qmlForNode(const ModelNode &modelNode, QString &className) } } } - return fileToUrl(QDir(m_qmlDir).filePath("Qt/emptyPane.qml")); + return fileToUrl(QDir(m_qmlDir).filePath("QtQuick/emptyPane.qml")); } QString PropertyEditor::locateQmlFile(const QString &relativePath) const From c7142affef4b4ea78306254b62da13d66f9be0af Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Mon, 4 Oct 2010 15:37:15 +0200 Subject: [PATCH 118/118] Git: Only allow commit if author information is valid Check author information to be valid before enableing the commit button. Task-number: QTCREATORBUG-2410 --- src/libs/utils/submiteditorwidget.cpp | 43 +++++---- src/libs/utils/submiteditorwidget.h | 7 +- src/plugins/git/gitsubmiteditorwidget.cpp | 39 +++++++- src/plugins/git/gitsubmiteditorwidget.h | 15 ++++ src/plugins/git/gitsubmitpanel.ui | 105 ++++++++++++++++------ 5 files changed, 160 insertions(+), 49 deletions(-) diff --git a/src/libs/utils/submiteditorwidget.cpp b/src/libs/utils/submiteditorwidget.cpp index 0c8aa30a1c4..10cade5c2e1 100644 --- a/src/libs/utils/submiteditorwidget.cpp +++ b/src/libs/utils/submiteditorwidget.cpp @@ -139,7 +139,6 @@ struct SubmitEditorWidgetPrivate Ui::SubmitEditorWidget m_ui; bool m_filesSelected; - bool m_filesChecked; int m_fileNameColumn; int m_activatedRow; bool m_emptyFileListEnabled; @@ -148,16 +147,18 @@ struct SubmitEditorWidgetPrivate QVBoxLayout *m_fieldLayout; QList m_fieldWidgets; int m_lineWidth; + + bool m_commitEnabled; }; SubmitEditorWidgetPrivate::SubmitEditorWidgetPrivate() : m_filesSelected(false), - m_filesChecked(false), m_fileNameColumn(1), m_activatedRow(-1), m_emptyFileListEnabled(false), m_fieldLayout(0), - m_lineWidth(defaultLineWidth) + m_lineWidth(defaultLineWidth), + m_commitEnabled(false) { } @@ -209,10 +210,10 @@ void SubmitEditorWidget::registerActions(QAction *editorUndoAction, QAction *edi int count = 0; if (const QAbstractItemModel *model = m_d->m_ui.fileView->model()) count = model->rowCount(); - qDebug() << Q_FUNC_INFO << submitAction << count << "items" << m_d->m_filesChecked; + qDebug() << Q_FUNC_INFO << submitAction << count << "items"; } - submitAction->setEnabled(m_d->m_filesChecked); - connect(this, SIGNAL(fileCheckStateChanged(bool)), submitAction, SLOT(setEnabled(bool))); + m_d->m_commitEnabled = !canSubmit(); + connect(this, SIGNAL(submitActionEnabledChanged(bool)), submitAction, SLOT(setEnabled(bool))); // Wire setText via QActionSetTextSlotHelper. QActionSetTextSlotHelper *actionSlotHelper = submitAction->findChild(); if (!actionSlotHelper) @@ -243,7 +244,7 @@ void SubmitEditorWidget::unregisterActions(QAction *editorUndoAction, QAction * } if (submitAction) { - disconnect(this, SIGNAL(fileCheckStateChanged(bool)), submitAction, SLOT(setEnabled(bool))); + disconnect(this, SIGNAL(submitActionEnabledChanged(bool)), submitAction, SLOT(setEnabled(bool))); // Just deactivate the QActionSetTextSlotHelper on the action disconnect(this, SIGNAL(submitActionTextChanged(QString)), 0, 0); } @@ -448,18 +449,20 @@ void SubmitEditorWidget::updateActions() void SubmitEditorWidget::updateSubmitAction() { const unsigned checkedCount = checkedFilesCount(); - const bool newFilesCheckedState = m_d->m_emptyFileListEnabled || checkedCount > 0; + const bool newCommitState = canSubmit(); // Emit signal to update action - if (m_d->m_filesChecked != newFilesCheckedState) { - m_d->m_filesChecked = newFilesCheckedState; - emit fileCheckStateChanged(m_d->m_filesChecked); + if (m_d->m_commitEnabled != newCommitState) { + m_d->m_commitEnabled = newCommitState; + emit submitActionEnabledChanged(m_d->m_commitEnabled); + } + if (m_d->m_ui.fileView && m_d->m_ui.fileView->model()) { + // Update button text. + const int fileCount = m_d->m_ui.fileView->model()->rowCount(); + const QString msg = checkedCount ? + tr("Commit %1/%n Files", 0, fileCount).arg(checkedCount) : + tr("Commit"); + emit submitActionTextChanged(msg); } - // Update button text. - const int fileCount = m_d->m_ui.fileView->model()->rowCount(); - const QString msg = checkedCount ? - tr("Commit %1/%n Files", 0, fileCount).arg(checkedCount) : - tr("Commit"); - emit submitActionTextChanged(msg); } // Enable diff depending on selected files @@ -509,6 +512,12 @@ void SubmitEditorWidget::insertTopWidget(QWidget *w) m_d->m_ui.vboxLayout->insertWidget(0, w); } +bool SubmitEditorWidget::canSubmit() const +{ + const unsigned checkedCount = checkedFilesCount(); + return m_d->m_emptyFileListEnabled || checkedCount > 0; +} + void SubmitEditorWidget::addSubmitFieldWidget(SubmitFieldWidget *f) { if (!m_d->m_fieldLayout) { diff --git a/src/libs/utils/submiteditorwidget.h b/src/libs/utils/submiteditorwidget.h index 457783a9d7f..37d1c8b0bd9 100644 --- a/src/libs/utils/submiteditorwidget.h +++ b/src/libs/utils/submiteditorwidget.h @@ -129,8 +129,8 @@ public: signals: void diffSelected(const QStringList &); void fileSelectionChanged(bool someFileSelected); - void fileCheckStateChanged(bool someFileChecked); void submitActionTextChanged(const QString &); + void submitActionEnabledChanged(const bool); public slots: void checkAll(); @@ -139,13 +139,16 @@ public slots: protected: virtual void changeEvent(QEvent *e); void insertTopWidget(QWidget *w); + virtual bool canSubmit() const; + +protected slots: + void updateSubmitAction(); private slots: void triggerDiffSelected(); void diffActivated(const QModelIndex &index); void diffActivatedDelayed(); void updateActions(); - void updateSubmitAction(); void updateDiffAction(); void editorCustomContextMenuRequested(const QPoint &); void fileListCustomContextMenuRequested(const QPoint & pos); diff --git a/src/plugins/git/gitsubmiteditorwidget.cpp b/src/plugins/git/gitsubmiteditorwidget.cpp index 1a02f4a8a18..5014a8b20f8 100644 --- a/src/plugins/git/gitsubmiteditorwidget.cpp +++ b/src/plugins/git/gitsubmiteditorwidget.cpp @@ -34,10 +34,13 @@ #include #include +#include +#include #include #include #include +#include #include namespace Git { @@ -116,11 +119,19 @@ GitSubmitEditorWidget::GitSubmitEditorWidget(QWidget *parent) : m_gitSubmitPanelUi.setupUi(m_gitSubmitPanel); insertTopWidget(m_gitSubmitPanel); new GitSubmitHighlighter(descriptionEdit()); + + m_emailValidator = new QRegExpValidator(QRegExp(QLatin1String("[^@ ]+@[^@ ]+\\.[a-zA-Z]+")), this); + + m_gitSubmitPanelUi.emailLineEdit->setValidator(m_emailValidator); + connect(m_gitSubmitPanelUi.authorLineEdit, SIGNAL(textChanged(QString)), + this, SLOT(authorInformationChanged())); + connect(m_gitSubmitPanelUi.emailLineEdit, SIGNAL(textChanged(QString)), + this, SLOT(authorInformationChanged())); } void GitSubmitEditorWidget::setPanelInfo(const GitSubmitEditorPanelInfo &info) { - m_gitSubmitPanelUi.repositoryLabel->setText(info.repository); + m_gitSubmitPanelUi.repositoryLabel->setText(QDir::toNativeSeparators(info.repository)); m_gitSubmitPanelUi.branchLabel->setText(info.branch); } @@ -136,6 +147,32 @@ void GitSubmitEditorWidget::setPanelData(const GitSubmitEditorPanelData &data) { m_gitSubmitPanelUi.authorLineEdit->setText(data.author); m_gitSubmitPanelUi.emailLineEdit->setText(data.email); + authorInformationChanged(); +} + +bool GitSubmitEditorWidget::canSubmit() const +{ + if (m_gitSubmitPanelUi.authorLineEdit->text().isEmpty() + || !emailIsValid()) + return false; + return SubmitEditorWidget::canSubmit(); +} + +void GitSubmitEditorWidget::authorInformationChanged() +{ + m_gitSubmitPanelUi.invalidAuthorLabel-> + setVisible(m_gitSubmitPanelUi.authorLineEdit->text().isEmpty()); + m_gitSubmitPanelUi.invalidEmailLabel-> + setVisible(!emailIsValid()); + + updateSubmitAction(); +} + +bool GitSubmitEditorWidget::emailIsValid() const +{ + int pos = m_gitSubmitPanelUi.emailLineEdit->cursorPosition(); + return m_emailValidator->validate(m_gitSubmitPanelUi.emailLineEdit->text(), pos) + == QValidator::Acceptable; } } // namespace Internal diff --git a/src/plugins/git/gitsubmiteditorwidget.h b/src/plugins/git/gitsubmiteditorwidget.h index 40d744641fd..64e4c5aac3c 100644 --- a/src/plugins/git/gitsubmiteditorwidget.h +++ b/src/plugins/git/gitsubmiteditorwidget.h @@ -31,8 +31,13 @@ #define GITSUBMITEDITORWIDGET_H #include "ui_gitsubmitpanel.h" + #include +QT_BEGIN_NAMESPACE +class QValidator; +QT_END_NAMESPACE + namespace Git { namespace Internal { @@ -49,6 +54,7 @@ struct GitSubmitEditorPanelData; class GitSubmitEditorWidget : public Utils::SubmitEditorWidget { + Q_OBJECT public: explicit GitSubmitEditorWidget(QWidget *parent = 0); @@ -59,9 +65,18 @@ public: void setPanelInfo(const GitSubmitEditorPanelInfo &info); +protected: + bool canSubmit() const; + +private slots: + void authorInformationChanged(); + private: + bool emailIsValid() const; + QWidget *m_gitSubmitPanel; Ui::GitSubmitPanel m_gitSubmitPanelUi; + QValidator *m_emailValidator; }; } // namespace Internal diff --git a/src/plugins/git/gitsubmitpanel.ui b/src/plugins/git/gitsubmitpanel.ui index 7dfa9b3ba0f..c790299aa11 100644 --- a/src/plugins/git/gitsubmitpanel.ui +++ b/src/plugins/git/gitsubmitpanel.ui @@ -6,8 +6,8 @@ 0 0 - 374 - 229 + 364 + 172
@@ -59,49 +59,96 @@ Commit Information - - - - - - - Author: - - - - - - - - - - Email: - - - - - - - + + + + + Author: + + - + + + + + 150 + 0 + + + + + + + + + 20 + 20 + + + + + + + :/projectexplorer/images/compile_error.png + + + + Qt::Horizontal + + QSizePolicy::MinimumExpanding + - 161 + 5 20 + + + + Email: + + + + + + + + 150 + 0 + + + + + + + + + 20 + 20 + + + + + + + :/projectexplorer/images/compile_error.png + + + - + + +
GDB debugging helpers
File:
%1
Last modified:%2
Size:%3 Bytes
QML type dumper
File:
%4
Last modified:%5
Size:%6 Bytes
QML observer
File:
%7
Last modified:%8
Size:%9 Bytes