forked from qt-creator/qt-creator
Merge remote-tracking branch 'origin/4.3'
Change-Id: Idcd88f9ef7183779751e64cb878fe5c383d9ef8a
This commit is contained in:
@@ -24,6 +24,7 @@
|
||||
############################################################################
|
||||
|
||||
import os
|
||||
import codecs
|
||||
import copy
|
||||
import collections
|
||||
import struct
|
||||
@@ -436,7 +437,7 @@ class DumperBase:
|
||||
elif self.currentValue.encoding == 'utf8':
|
||||
value = self.hexdecode(value)
|
||||
elif self.currentValue.encoding == 'utf16':
|
||||
b = bytes.fromhex(value)
|
||||
b = bytes(bytearray.fromhex(value))
|
||||
value = codecs.decode(b, 'utf-16')
|
||||
self.put('"%s"' % value)
|
||||
if self.currentValue.elided:
|
||||
@@ -1501,20 +1502,20 @@ class DumperBase:
|
||||
|
||||
return customEventFunc in (self.qtCustomEventFunc, self.qtCustomEventPltFunc)
|
||||
|
||||
def extractQObjectProperty(objectPtr):
|
||||
vtablePtr = self.extractPointer(objectPtr)
|
||||
metaObjectFunc = self.extractPointer(vtablePtr)
|
||||
cmd = '((void*(*)(void*))0x%x)((void*)0x%x)' % (metaObjectFunc, objectPtr)
|
||||
try:
|
||||
#warn('MO CMD: %s' % cmd)
|
||||
res = self.parseAndEvaluate(cmd)
|
||||
#warn('MO RES: %s' % res)
|
||||
self.bump('successfulMetaObjectCall')
|
||||
return res.pointer()
|
||||
except:
|
||||
self.bump('failedMetaObjectCall')
|
||||
#warn('COULD NOT EXECUTE: %s' % cmd)
|
||||
return 0
|
||||
# def extractQObjectProperty(objectPtr):
|
||||
# vtablePtr = self.extractPointer(objectPtr)
|
||||
# metaObjectFunc = self.extractPointer(vtablePtr)
|
||||
# cmd = '((void*(*)(void*))0x%x)((void*)0x%x)' % (metaObjectFunc, objectPtr)
|
||||
# try:
|
||||
# #warn('MO CMD: %s' % cmd)
|
||||
# res = self.parseAndEvaluate(cmd)
|
||||
# #warn('MO RES: %s' % res)
|
||||
# self.bump('successfulMetaObjectCall')
|
||||
# return res.pointer()
|
||||
# except:
|
||||
# self.bump('failedMetaObjectCall')
|
||||
# #warn('COULD NOT EXECUTE: %s' % cmd)
|
||||
# return 0
|
||||
|
||||
def extractMetaObjectPtr(self, objectPtr, typeobj):
|
||||
""" objectPtr - address of *potential* instance of QObject derived class
|
||||
@@ -1863,10 +1864,6 @@ class DumperBase:
|
||||
self.putTypedPointer('[extraData]', extraData,
|
||||
ns + 'QObjectPrivate::ExtraData')
|
||||
|
||||
if connectionListsPtr:
|
||||
self.putTypedPointer('[connectionLists]', connectionListsPtr,
|
||||
ns + 'QObjectConnectionListVector')
|
||||
|
||||
with SubItem(self, '[metaObject]'):
|
||||
self.putAddress(metaObjectPtr)
|
||||
self.putNumChild(1)
|
||||
@@ -1874,6 +1871,40 @@ class DumperBase:
|
||||
with Children(self):
|
||||
self.putQObjectGutsHelper(0, 0, -1, metaObjectPtr, 'QMetaObject')
|
||||
|
||||
with SubItem(self, '[connections]'):
|
||||
if connectionListsPtr:
|
||||
typeName = ns + 'QVector<' + ns + 'QObjectPrivate::ConnectionList>'
|
||||
self.putItem(self.createValue(connectionListsPtr, typeName))
|
||||
else:
|
||||
self.putItemCount(0)
|
||||
|
||||
with SubItem(self, '[signals]'):
|
||||
self.putItemCount(signalCount)
|
||||
if self.isExpanded():
|
||||
with Children(self):
|
||||
j = -1
|
||||
for i in range(signalCount):
|
||||
t = self.split('IIIII', dataPtr + 56 + 20 * i)
|
||||
flags = t[4]
|
||||
if flags != 0x06:
|
||||
continue
|
||||
j += 1
|
||||
with SubItem(self, j):
|
||||
name = self.metaString(metaObjectPtr, t[0], revision)
|
||||
self.putType(' ')
|
||||
self.putValue(name)
|
||||
self.putNumChild(1)
|
||||
with Children(self):
|
||||
putt('[nameindex]', t[0])
|
||||
#putt('[type]', 'signal')
|
||||
putt('[argc]', t[1])
|
||||
putt('[parameter]', t[2])
|
||||
putt('[tag]', t[3])
|
||||
putt('[flags]', t[4])
|
||||
putt('[localindex]', str(i))
|
||||
putt('[globalindex]', str(globalOffset + i))
|
||||
#self.putQObjectConnections(dd)
|
||||
|
||||
|
||||
if isQMetaObject or isQObject:
|
||||
with SubItem(self, '[properties]'):
|
||||
@@ -2012,20 +2043,6 @@ class DumperBase:
|
||||
self.putValue(globalOffset + localIndex)
|
||||
|
||||
|
||||
#with SubItem(self, '[signals]'):
|
||||
# self.putItemCount(signalCount)
|
||||
# signalNames = metaData(52, -14, 5)
|
||||
# warn('NAMES: %s' % signalNames)
|
||||
# if self.isExpanded():
|
||||
# with Children(self):
|
||||
# putt('A', 'b')
|
||||
# for i in range(signalCount):
|
||||
# k = signalNames[i]
|
||||
# with SubItem(self, k):
|
||||
# self.putEmptyValue()
|
||||
# if dd:
|
||||
# self.putQObjectConnections(dd)
|
||||
|
||||
def putQObjectConnections(self, dd):
|
||||
with SubItem(self, '[connections]'):
|
||||
ptrSize = self.ptrSize()
|
||||
|
@@ -1078,6 +1078,26 @@ def qdump__QMetaObject(d, value):
|
||||
d.putMembersItem(value)
|
||||
|
||||
|
||||
def qdump__QObjectPrivate__ConnectionList(d, value):
|
||||
d.putNumChild(1)
|
||||
if d.isExpanded():
|
||||
i = 0
|
||||
with Children(d):
|
||||
first, last = value.split('pp')
|
||||
currentConnection = first
|
||||
connectionType = d.createType('QObjectPrivate::Connection')
|
||||
while currentConnection and currentConnection != last:
|
||||
sender, receiver, slotObj, nextConnectionList, nextp, prev = \
|
||||
d.split('pppppp', currentConnection)
|
||||
d.putSubItem(i, d.createValue(currentConnection, connectionType))
|
||||
currentConnection = nextp
|
||||
i += 1
|
||||
d.putFields(value)
|
||||
d.putItemCount(i)
|
||||
else:
|
||||
d.putSpecialValue('minimumitemcount', 0)
|
||||
|
||||
|
||||
def qdump__QPixmap(d, value):
|
||||
if d.qtVersion() < 0x050000:
|
||||
(vtbl, painters, dataPtr) = value.split('ppp');
|
||||
|
@@ -618,26 +618,6 @@ void ManhattanStyle::drawControl(ControlElement element, const QStyleOption *opt
|
||||
return QProxyStyle::drawControl(element, option, painter, widget);
|
||||
|
||||
switch (element) {
|
||||
case CE_TabBarTabShape:
|
||||
// Most styles draw a single dark outline. This looks rather ugly when combined with our
|
||||
// single pixel dark separator so we adjust the first tab to compensate for this
|
||||
|
||||
if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(option)) {
|
||||
QStyleOptionTab adjustedTab = *tab;
|
||||
if (tab->cornerWidgets == QStyleOptionTab::NoCornerWidgets && (
|
||||
tab->position == QStyleOptionTab::Beginning ||
|
||||
tab->position == QStyleOptionTab::OnlyOneTab))
|
||||
{
|
||||
if (option->direction == Qt::LeftToRight)
|
||||
adjustedTab.rect = adjustedTab.rect.adjusted(-1, 0, 0, 0);
|
||||
else
|
||||
adjustedTab.rect = adjustedTab.rect.adjusted(0, 0, 1 ,0);
|
||||
}
|
||||
QProxyStyle::drawControl(element, &adjustedTab, painter, widget);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
||||
case CE_MenuItem:
|
||||
painter->save();
|
||||
if (const QStyleOptionMenuItem *mbi = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) {
|
||||
|
@@ -208,7 +208,14 @@ const char pp_configuration[] =
|
||||
"#define __finally\n"
|
||||
"#define __inline inline\n"
|
||||
"#define __forceinline inline\n"
|
||||
"#define __pragma(x)\n";
|
||||
"#define __pragma(x)\n"
|
||||
"#define __w64\n"
|
||||
"#define __int64 long long\n"
|
||||
"#define __int32 long\n"
|
||||
"#define __int16 short\n"
|
||||
"#define __int8 char\n"
|
||||
"#define __ptr32\n"
|
||||
"#define __ptr64\n";
|
||||
|
||||
QSet<QString> CppModelManager::timeStampModifiedFiles(const QList<Document::Ptr> &documentsToCheck)
|
||||
{
|
||||
|
@@ -303,7 +303,7 @@ QmlEngine::QmlEngine(const DebuggerRunParameters &startParameters, DebuggerEngin
|
||||
connect(d->connection, &QmlDebugConnection::logStateChange,
|
||||
this, &QmlEngine::showConnectionStateMessage);
|
||||
connect(d->connection, &QmlDebugConnection::logError, this,
|
||||
[this](const QString &error) { showMessage("QML Debugger: " + error, StatusBar); });
|
||||
[this](const QString &error) { showMessage("QML Debugger: " + error, LogWarning); });
|
||||
|
||||
connect(d->connection, &QmlDebugConnection::connectionFailed,
|
||||
this, &QmlEngine::connectionFailed);
|
||||
@@ -1261,6 +1261,8 @@ void QmlEngine::connectionFailed()
|
||||
{
|
||||
// this is only an error if we are already connected and something goes wrong.
|
||||
if (isConnected()) {
|
||||
showMessage(tr("QML Debugger: Connection failed."), StatusBar);
|
||||
|
||||
if (!isSlaveEngine()) { // normal flow for slave engine when gdb exits
|
||||
notifyInferiorSpontaneousStop();
|
||||
notifyInferiorIll();
|
||||
|
@@ -606,7 +606,15 @@ void QmlInspectorAgent::addWatchData(const ObjectReference &obj,
|
||||
name = obj.className();
|
||||
|
||||
if (name.isEmpty())
|
||||
return;
|
||||
name = obj.name();
|
||||
|
||||
if (name.isEmpty()) {
|
||||
FileReference file = obj.source();
|
||||
name = file.url().fileName() + ':' + QString::number(file.lineNumber());
|
||||
}
|
||||
|
||||
if (name.isEmpty())
|
||||
name = tr("<anonymous>");
|
||||
|
||||
// object
|
||||
auto objWatch = new WatchItem;
|
||||
|
@@ -498,7 +498,8 @@ void IosConfigurations::loadProvisioningData(bool notify)
|
||||
}
|
||||
|
||||
const QDir provisioningProflesDir(provisioningProfileDirPath);
|
||||
foreach (QFileInfo fileInfo, provisioningProflesDir.entryInfoList({"*.mobileprovision"}, QDir::NoDotAndDotDot | QDir::Files)) {
|
||||
const QStringList filters = {"*.mobileprovision"};
|
||||
foreach (QFileInfo fileInfo, provisioningProflesDir.entryInfoList(filters, QDir::NoDotAndDotDot | QDir::Files)) {
|
||||
QDomDocument provisioningDoc;
|
||||
auto profile = std::make_shared<ProvisioningProfile>();
|
||||
QString teamID;
|
||||
|
@@ -382,6 +382,9 @@ void ModelIndexer::onProjectFileListChanged(ProjectExplorer::Project *project)
|
||||
|
||||
void ModelIndexer::scanProject(ProjectExplorer::Project *project)
|
||||
{
|
||||
if (!project->rootProjectNode())
|
||||
return;
|
||||
|
||||
// TODO harmonize following code with findFirstModel()?
|
||||
QStringList files = project->files(ProjectExplorer::Project::SourceFiles);
|
||||
QQueue<QueuedFile> filesQueue;
|
||||
|
@@ -270,23 +270,10 @@ bool AbstractMsvcToolChain::canClone() const
|
||||
}
|
||||
|
||||
// Function must be thread-safe!
|
||||
QByteArray AbstractMsvcToolChain::msvcPredefinedMacros(const QStringList cxxflags,
|
||||
const Utils::Environment& env) const
|
||||
QByteArray AbstractMsvcToolChain::msvcPredefinedMacros(const QStringList,
|
||||
const Utils::Environment&) const
|
||||
{
|
||||
Q_UNUSED(cxxflags);
|
||||
Q_UNUSED(env);
|
||||
|
||||
static const QByteArray predefinedMacros(
|
||||
"#define __MSVCRT__\n"
|
||||
"#define __w64\n"
|
||||
"#define __int64 long long\n"
|
||||
"#define __int32 long\n"
|
||||
"#define __int16 short\n"
|
||||
"#define __int8 char\n"
|
||||
"#define __ptr32\n"
|
||||
"#define __ptr64\n");
|
||||
|
||||
return predefinedMacros;
|
||||
return QByteArray();
|
||||
}
|
||||
|
||||
bool AbstractMsvcToolChain::generateEnvironmentSettings(const Utils::Environment &env,
|
||||
|
@@ -260,22 +260,85 @@ static QString generateDisplayName(const QString &name,
|
||||
|
||||
static QByteArray msvcCompilationFile()
|
||||
{
|
||||
static const char* macros[] = {"_ATL_VER", "_CHAR_UNSIGNED", "__CLR_VER",
|
||||
"__cplusplus_cli", "__COUNTER__", "__cplusplus",
|
||||
"_CPPLIB_VER", "_CPPRTTI", "_CPPUNWIND",
|
||||
"_DEBUG", "_DLL", "__FUNCDNAME__",
|
||||
"__FUNCSIG__", "__FUNCTION__", "_INTEGRAL_MAX_BITS",
|
||||
"_M_ALPHA", "_M_AAMD64", "_M_CEE", "_M_CEE_PURE",
|
||||
"_M_CEE_SAFE", "_M_IX86", "_M_IA64",
|
||||
"_M_IX86_FP", "_M_MPPC", "_M_MRX000",
|
||||
"_M_PPC", "_M_X64", "_MANAGED",
|
||||
"_MFC_VER", "_MSC_BUILD", "_MSC_EXTENSIONS",
|
||||
"_MSC_FULL_VER", "_MSC_VER", "__MSVC_RUNTIME_CHECKS",
|
||||
"_MT", "_NATIVE_WCHAR_T_DEFINED", "_OPENMP",
|
||||
"_VC_NODEFAULTLIB", "_WCHAR_T_DEFINED", "_WIN32",
|
||||
"_WIN32_WCE", "_WIN64", "_Wp64",
|
||||
"__DATE__", "__TIME__", "__TIMESTAMP__",
|
||||
0};
|
||||
static const char* macros[] = {
|
||||
"_ATL_VER",
|
||||
"__ATOM__",
|
||||
"__AVX__",
|
||||
"__AVX2__",
|
||||
"_CHAR_UNSIGNED",
|
||||
"__CLR_VER",
|
||||
"_CMMN_INTRIN_FUNC",
|
||||
"_CONTROL_FLOW_GUARD",
|
||||
"__COUNTER__",
|
||||
"__cplusplus",
|
||||
"__cplusplus_cli",
|
||||
"__cplusplus_winrt",
|
||||
"_CPPLIB_VER",
|
||||
"_CPPRTTI",
|
||||
"_CPPUNWIND",
|
||||
"__DATE__",
|
||||
"_DEBUG",
|
||||
"_DLL",
|
||||
"__FILE__",
|
||||
"__func__",
|
||||
"__FUNCDNAME__",
|
||||
"__FUNCSIG__",
|
||||
"__FUNCTION__",
|
||||
"_INTEGRAL_MAX_BITS",
|
||||
"__INTELLISENSE__",
|
||||
"_ISO_VOLATILE",
|
||||
"_KERNEL_MODE",
|
||||
"__LINE__",
|
||||
"_M_AAMD64",
|
||||
"_M_ALPHA",
|
||||
"_M_AMD64",
|
||||
"_MANAGED",
|
||||
"_M_ARM",
|
||||
"_M_ARM64",
|
||||
"_M_ARM_ARMV7VE",
|
||||
"_M_ARM_FP",
|
||||
"_M_ARM_NT",
|
||||
"_M_ARMT",
|
||||
"_M_CEE",
|
||||
"_M_CEE_PURE",
|
||||
"_M_CEE_SAFE",
|
||||
"_MFC_VER",
|
||||
"_M_FP_EXCEPT",
|
||||
"_M_FP_FAST",
|
||||
"_M_FP_PRECISE",
|
||||
"_M_FP_STRICT",
|
||||
"_M_IA64",
|
||||
"_M_IX86",
|
||||
"_M_IX86_FP",
|
||||
"_M_MPPC",
|
||||
"_M_MRX000",
|
||||
"_M_PPC",
|
||||
"_MSC_BUILD",
|
||||
"_MSC_EXTENSIONS",
|
||||
"_MSC_FULL_VER",
|
||||
"_MSC_VER",
|
||||
"_MSVC_LANG",
|
||||
"__MSVC_RUNTIME_CHECKS",
|
||||
"_MT",
|
||||
"_M_THUMB",
|
||||
"_M_X64",
|
||||
"_NATIVE_WCHAR_T_DEFINED",
|
||||
"_OPENMP",
|
||||
"_PREFAST_",
|
||||
"__STDC__",
|
||||
"__STDC_HOSTED__",
|
||||
"__STDCPP_THREADS__",
|
||||
"__TIME__",
|
||||
"__TIMESTAMP__",
|
||||
"_VC_NODEFAULTLIB",
|
||||
"_WCHAR_T_DEFINED",
|
||||
"_WIN32",
|
||||
"_WIN32_WCE",
|
||||
"_WIN64",
|
||||
"_WINRT_DLL",
|
||||
"_Wp64",
|
||||
0
|
||||
};
|
||||
QByteArray file = "#define __PPOUT__(x) V##x=x\n\n";
|
||||
for (int i = 0; macros[i] != 0; ++i) {
|
||||
const QByteArray macro(macros[i]);
|
||||
@@ -287,11 +350,66 @@ static QByteArray msvcCompilationFile()
|
||||
}
|
||||
|
||||
// Run MSVC 'cl' compiler to obtain #defines.
|
||||
// Function must be thread-safe!
|
||||
// This function must be thread-safe!
|
||||
//
|
||||
// Some notes regarding the used approach:
|
||||
//
|
||||
// It seems that there is no reliable way to get all the
|
||||
// predefined macros for a cl invocation. The following two
|
||||
// approaches are unfortunately limited since both lead to an
|
||||
// incomplete list of actually predefined macros and come with
|
||||
// other problems, too.
|
||||
//
|
||||
// 1) Maintain a list of predefined macros from the official
|
||||
// documentation (for MSVC2015, e.g. [1]). Feed cl with a
|
||||
// temporary file that queries the values of those macros.
|
||||
//
|
||||
// Problems:
|
||||
// * Maintaining that list.
|
||||
// * The documentation is incomplete, we do not get all
|
||||
// predefined macros. E.g. the cl from MSVC2015, set up
|
||||
// with "vcvars.bat x86_arm", predefines among others
|
||||
// _M_ARMT, but that's not reflected in the
|
||||
// documentation.
|
||||
//
|
||||
// 2) Run cl with the undocumented options /B1 and /Bx, as
|
||||
// described in [2].
|
||||
//
|
||||
// Note: With qmake from Qt >= 5.8 it's possible to print
|
||||
// the macros formatted as preprocessor code in an easy to
|
||||
// read/compare/diff way:
|
||||
//
|
||||
// > cl /nologo /c /TC /B1 qmake NUL
|
||||
// > cl /nologo /c /TP /Bx qmake NUL
|
||||
//
|
||||
// Problems:
|
||||
// * Using undocumented options.
|
||||
// * Resulting macros are incomplete.
|
||||
// For example, the nowadays default option /Zc:wchar_t
|
||||
// predefines _WCHAR_T_DEFINED, but this is not reflected
|
||||
// with this approach.
|
||||
//
|
||||
// To work around this we would need extra cl invocations
|
||||
// to get the actual values of the missing macros
|
||||
// (approach 1).
|
||||
//
|
||||
// Currently we combine both approaches in this way:
|
||||
// * As base, maintain the list from the documentation and
|
||||
// update it once a new MSVC version is released.
|
||||
// * Enrich it with macros that we discover with approach 2
|
||||
// once a new MSVC version is released.
|
||||
// * Enrich it further with macros that are not covered with
|
||||
// the above points.
|
||||
//
|
||||
// TODO: Update the predefined macros for MSVC 2017 once the
|
||||
// page exists.
|
||||
//
|
||||
// [1] https://msdn.microsoft.com/en-us/library/b0084kay.aspx
|
||||
// [2] http://stackoverflow.com/questions/3665537/how-to-find-out-cl-exes-built-in-macros
|
||||
QByteArray MsvcToolChain::msvcPredefinedMacros(const QStringList cxxflags,
|
||||
const Utils::Environment &env) const
|
||||
{
|
||||
QByteArray predefinedMacros = AbstractMsvcToolChain::msvcPredefinedMacros(cxxflags, env);
|
||||
QByteArray predefinedMacros;
|
||||
|
||||
QStringList toProcess;
|
||||
foreach (const QString &arg, cxxflags) {
|
||||
|
@@ -419,7 +419,7 @@ void Project::setDocument(Core::IDocument *doc)
|
||||
d->m_document = doc;
|
||||
|
||||
if (!d->m_rootProjectNode) {
|
||||
auto newRoot = new ProjectNode(projectFilePath());
|
||||
auto newRoot = new ProjectNode(projectDirectory());
|
||||
newRoot->setDisplayName(displayName());
|
||||
newRoot->addNode(new FileNode(projectFilePath(), FileType::Project, false));
|
||||
setRootProjectNode(newRoot);
|
||||
|
@@ -124,7 +124,7 @@ QVariant FlatModel::data(const QModelIndex &index, int role) const
|
||||
case Qt::FontRole: {
|
||||
QFont font;
|
||||
if (Project *project = SessionManager::startupProject()) {
|
||||
if (node == project->rootProjectNode())
|
||||
if (node == SessionManager::nodeForProject(project))
|
||||
font.setBold(true);
|
||||
}
|
||||
result = font;
|
||||
@@ -227,7 +227,7 @@ ExpandData FlatModel::expandDataForNode(const Node *node) const
|
||||
|
||||
void FlatModel::handleProjectAdded(Project *project)
|
||||
{
|
||||
Node *node = project->rootProjectNode();
|
||||
Node *node = SessionManager::nodeForProject(project);
|
||||
m_toExpand.insert(expandDataForNode(node));
|
||||
if (WrapperNode *wrapper = wrapperForNode(node)) {
|
||||
wrapper->forFirstLevelChildren([this](WrapperNode *child) {
|
||||
|
@@ -637,6 +637,7 @@ FolderNode::AddNewInformation FolderNode::addNewInformation(const QStringList &f
|
||||
|
||||
void FolderNode::addNode(Node *node)
|
||||
{
|
||||
QTC_ASSERT(node, return);
|
||||
QTC_ASSERT(!node->parentFolderNode(), qDebug("File node has already a parent folder"));
|
||||
node->setParentFolderNode(this);
|
||||
m_nodes.append(node);
|
||||
|
@@ -680,6 +680,15 @@ Project *SessionManager::projectForNode(Node *node)
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Node *SessionManager::nodeForProject(Project *project)
|
||||
{
|
||||
for (const QPair<Project *,ProjectNode*> &pair : d->m_projects) {
|
||||
if (pair.first == project)
|
||||
return pair.second;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Project *SessionManager::projectForFile(const Utils::FileName &fileName)
|
||||
{
|
||||
const QList<Project *> &projectList = projects();
|
||||
|
@@ -116,6 +116,7 @@ public:
|
||||
static SessionNode *sessionNode();
|
||||
|
||||
static Project *projectForNode(Node *node);
|
||||
static Node *nodeForProject(Project *project);
|
||||
static Node *nodeForFile(const Utils::FileName &fileName);
|
||||
static Project *projectForFile(const Utils::FileName &fileName);
|
||||
|
||||
|
@@ -442,7 +442,8 @@ QmakeProFileNode *DesktopQmakeRunConfiguration::projectNode() const
|
||||
QmakeProject *project = qmakeProject();
|
||||
QTC_ASSERT(project, return nullptr);
|
||||
QmakeProFileNode *rootNode = project->rootProjectNode();
|
||||
QTC_ASSERT(rootNode, return nullptr);
|
||||
if (!rootNode)
|
||||
return nullptr;
|
||||
return rootNode->findProFileFor(m_proFilePath);
|
||||
}
|
||||
|
||||
|
@@ -69,10 +69,10 @@ public:
|
||||
QmakeProFileNode *proFileNode() const;
|
||||
|
||||
protected:
|
||||
QmakeProject *m_project;
|
||||
QmakeProject *m_project = nullptr;
|
||||
|
||||
private:
|
||||
QmakeProFileNode *m_qmakeProFileNode;
|
||||
QmakeProFileNode *m_qmakeProFileNode = nullptr;
|
||||
};
|
||||
|
||||
// Implements ProjectNode for qmake .pro files
|
||||
|
@@ -37,17 +37,17 @@
|
||||
#include <designmodecontext.h>
|
||||
#include <modelnode.h>
|
||||
#include <model.h>
|
||||
#include <QDebug>
|
||||
#include <QPair>
|
||||
#include <QString>
|
||||
#include <QTimer>
|
||||
#include <zoomaction.h>
|
||||
#include <nodeabstractproperty.h>
|
||||
#include <nodelistproperty.h>
|
||||
#include <rewriterview.h>
|
||||
#include <zoomaction.h>
|
||||
|
||||
#include <coreplugin/icore.h>
|
||||
#include <utils/algorithm.h>
|
||||
|
||||
#include <QDebug>
|
||||
#include <QPair>
|
||||
#include <QString>
|
||||
#include <QTimer>
|
||||
|
||||
namespace QmlDesigner {
|
||||
@@ -81,6 +81,14 @@ void FormEditorView::modelAttached(Model *model)
|
||||
setupFormEditorItemTree(rootModelNode());
|
||||
|
||||
m_formEditorWidget->updateActions();
|
||||
|
||||
if (!rewriterView()->errors().isEmpty())
|
||||
formEditorWidget()->showErrorMessageBox(rewriterView()->errors());
|
||||
else
|
||||
formEditorWidget()->hideErrorMessageBox();
|
||||
|
||||
if (!rewriterView()->warnings().isEmpty())
|
||||
formEditorWidget()->showWarningMessageBox(rewriterView()->warnings());
|
||||
}
|
||||
|
||||
|
||||
|
@@ -114,6 +114,10 @@ void TextEditorView::modelAttached(Model *model)
|
||||
void TextEditorView::modelAboutToBeDetached(Model *model)
|
||||
{
|
||||
AbstractView::modelAboutToBeDetached(model);
|
||||
|
||||
m_widget->setTextEditor(0);
|
||||
|
||||
QmlDesignerPlugin::instance()->emitCurrentTextEditorChanged(QmlDesignerPlugin::instance()->currentDesignDocument()->textEditor());
|
||||
}
|
||||
|
||||
void TextEditorView::importsChanged(const QList<Import> &/*addedImports*/, const QList<Import> &/*removedImports*/)
|
||||
|
@@ -68,21 +68,24 @@ void TextEditorWidget::setTextEditor(TextEditor::BaseTextEditor *textEditor)
|
||||
{
|
||||
TextEditor::BaseTextEditor *oldEditor = m_textEditor.release();
|
||||
m_textEditor.reset(textEditor);
|
||||
layout()->removeWidget(m_statusBar);
|
||||
layout()->addWidget(textEditor->editorWidget());
|
||||
layout()->addWidget(m_statusBar);
|
||||
setFocusProxy(textEditor->editorWidget());
|
||||
|
||||
QmlDesignerPlugin::instance()->emitCurrentTextEditorChanged(textEditor);
|
||||
if (textEditor) {
|
||||
layout()->removeWidget(m_statusBar);
|
||||
layout()->addWidget(textEditor->editorWidget());
|
||||
layout()->addWidget(m_statusBar);
|
||||
setFocusProxy(textEditor->editorWidget());
|
||||
|
||||
connect(textEditor->editorWidget(), &QPlainTextEdit::cursorPositionChanged,
|
||||
this, [this]() {
|
||||
/* Cursor position is changed by rewriter */
|
||||
if (!m_blockCurserSelectionSyncronisation)
|
||||
m_updateSelectionTimer.start();
|
||||
});
|
||||
QmlDesignerPlugin::instance()->emitCurrentTextEditorChanged(textEditor);
|
||||
|
||||
textEditor->editorWidget()->installEventFilter(this);
|
||||
connect(textEditor->editorWidget(), &QPlainTextEdit::cursorPositionChanged,
|
||||
this, [this]() {
|
||||
/* Cursor position is changed by rewriter */
|
||||
if (!m_blockCurserSelectionSyncronisation)
|
||||
m_updateSelectionTimer.start();
|
||||
});
|
||||
|
||||
textEditor->editorWidget()->installEventFilter(this);
|
||||
}
|
||||
|
||||
if (oldEditor)
|
||||
oldEditor->deleteLater();
|
||||
@@ -113,6 +116,12 @@ void TextEditorWidget::jumpTextCursorToSelectedModelNode()
|
||||
{
|
||||
ModelNode selectedNode;
|
||||
|
||||
if (hasFocus())
|
||||
return;
|
||||
|
||||
if (m_textEditor && m_textEditor->editorWidget()->hasFocus())
|
||||
return;
|
||||
|
||||
if (!m_textEditorView->selectedModelNodes().isEmpty())
|
||||
selectedNode = m_textEditorView->selectedModelNodes().first();
|
||||
|
||||
|
@@ -371,6 +371,8 @@ bool itemIsMovable(const ModelNode &modelNode)
|
||||
if (modelNode.metaInfo().isSubclassOf("QtQuick.Controls.Tab"))
|
||||
return false;
|
||||
|
||||
if (!modelNode.parentProperty().isNodeListProperty())
|
||||
return false;
|
||||
|
||||
return NodeHints::fromModelNode(modelNode).isMovable();
|
||||
}
|
||||
|
@@ -283,16 +283,15 @@ void QmlDesignerPlugin::integrateIntoQtCreator(QWidget *modeWidget)
|
||||
if (d && currentEditor && checkIfEditorIsQtQuick(currentEditor) &&
|
||||
!documentIsAlreadyOpen(currentDesignDocument(), currentEditor, newMode)) {
|
||||
|
||||
if (!isDesignerMode(newMode) && isDesignerMode(oldMode))
|
||||
hideDesigner();
|
||||
else if (currentEditor && isDesignerMode(newMode))
|
||||
if (isDesignerMode(newMode)) {
|
||||
showDesigner();
|
||||
else if (currentDesignDocument())
|
||||
hideDesigner();
|
||||
} else if (currentDesignDocument() ||
|
||||
(!isDesignerMode(newMode) && isDesignerMode(oldMode))) {
|
||||
hideDesigner();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
d->viewManager.designerActionManager().polishActions();
|
||||
}
|
||||
|
||||
|
@@ -33,10 +33,9 @@ namespace Internal {
|
||||
|
||||
QmlProfilerTextMark::QmlProfilerTextMark(QmlProfilerTool *tool, int typeId, const QString &fileName,
|
||||
int lineNumber) :
|
||||
TextMark(fileName, lineNumber, Constants::TEXT_MARK_CATEGORY), m_tool(tool),
|
||||
TextMark(fileName, lineNumber, Constants::TEXT_MARK_CATEGORY, 3.5), m_tool(tool),
|
||||
m_typeIds(1, typeId)
|
||||
{
|
||||
setWidthFactor(3.5);
|
||||
}
|
||||
|
||||
void QmlProfilerTextMark::addTypeId(int typeId)
|
||||
|
@@ -44,10 +44,11 @@ void SilverSearcherPlugin::extensionsInitialized()
|
||||
{
|
||||
}
|
||||
|
||||
#ifdef WITH_TESTS
|
||||
QList<QObject *> SilverSearcherPlugin::createTestObjects() const
|
||||
{
|
||||
return {new OutputParserTest};
|
||||
}
|
||||
|
||||
#endif
|
||||
} // namespace Internal
|
||||
} // namespace SilverSearcher
|
||||
|
@@ -36,8 +36,8 @@ class SilverSearcherPlugin : public ExtensionSystem::IPlugin
|
||||
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "SilverSearcher.json")
|
||||
|
||||
public:
|
||||
bool initialize(const QStringList &arguments, QString *errorString);
|
||||
void extensionsInitialized();
|
||||
bool initialize(const QStringList &arguments, QString *errorString) override;
|
||||
void extensionsInitialized() override;
|
||||
#ifdef WITH_TESTS
|
||||
private:
|
||||
QList<QObject *> createTestObjects() const override;
|
||||
|
@@ -41,14 +41,14 @@ using namespace TextEditor::Internal;
|
||||
|
||||
namespace TextEditor {
|
||||
|
||||
TextMark::TextMark(const QString &fileName, int lineNumber, Id category)
|
||||
TextMark::TextMark(const QString &fileName, int lineNumber, Id category, double widthFactor)
|
||||
: m_baseTextDocument(0),
|
||||
m_fileName(fileName),
|
||||
m_lineNumber(lineNumber),
|
||||
m_priority(NormalPriority),
|
||||
m_visible(true),
|
||||
m_category(category),
|
||||
m_widthFactor(1.0)
|
||||
m_widthFactor(widthFactor)
|
||||
{
|
||||
if (!m_fileName.isEmpty())
|
||||
TextEditorPlugin::baseTextMarkRegistry()->add(this);
|
||||
|
@@ -50,7 +50,7 @@ namespace Internal { class TextMarkRegistry; }
|
||||
class TEXTEDITOR_EXPORT TextMark
|
||||
{
|
||||
public:
|
||||
TextMark(const QString &fileName, int lineNumber, Core::Id category);
|
||||
TextMark(const QString &fileName, int lineNumber, Core::Id category, double widthFactor = 1.0);
|
||||
virtual ~TextMark();
|
||||
|
||||
// determine order on markers on the same line.
|
||||
|
@@ -42,11 +42,10 @@ namespace Constants { const char CALLGRIND_TEXT_MARK_CATEGORY[] = "Callgrind.Tex
|
||||
|
||||
CallgrindTextMark::CallgrindTextMark(const QPersistentModelIndex &index,
|
||||
const QString &fileName, int lineNumber)
|
||||
: TextEditor::TextMark(fileName, lineNumber, Constants::CALLGRIND_TEXT_MARK_CATEGORY)
|
||||
: TextEditor::TextMark(fileName, lineNumber, Constants::CALLGRIND_TEXT_MARK_CATEGORY, 4.0)
|
||||
, m_modelIndex(index)
|
||||
{
|
||||
setPriority(TextEditor::TextMark::HighPriority);
|
||||
setWidthFactor(4.0);
|
||||
}
|
||||
|
||||
void CallgrindTextMark::paint(QPainter *painter, const QRect &paintRect) const
|
||||
|
@@ -47,6 +47,7 @@ const char ID[] = "ProjectExplorer.ToolChain.Id";
|
||||
const char DISPLAYNAME[] = "ProjectExplorer.ToolChain.DisplayName";
|
||||
const char AUTODETECTED[] = "ProjectExplorer.ToolChain.Autodetect";
|
||||
const char LANGUAGE_KEY[] = "ProjectExplorer.ToolChain.Language";
|
||||
const char LANGUAGE_KEY_V2[] = "ProjectExplorer.ToolChain.LanguageV2";
|
||||
|
||||
// GCC ToolChain:
|
||||
const char PATH[] = "ProjectExplorer.GccToolChain.Path";
|
||||
@@ -265,7 +266,30 @@ QVariantMap AddToolChainOperation::addToolChain(const QVariantMap &map, const QS
|
||||
|
||||
KeyValuePairList data;
|
||||
data << KeyValuePair({tc, ID}, QVariant(id));
|
||||
data << KeyValuePair({tc, LANGUAGE_KEY}, QVariant(lang));
|
||||
|
||||
// Language compatibility hack for 4.2:
|
||||
QString newLang; // QtC 4.3 and later
|
||||
QString oldLang; // QtC 4.2
|
||||
int langInt = lang.toInt(&ok);
|
||||
Q_UNUSED(langInt);
|
||||
if (lang == "2" || lang == "Cxx") {
|
||||
newLang = "Cxx";
|
||||
oldLang = "2";
|
||||
} else if (lang == "1" || lang == "C") {
|
||||
newLang = "C";
|
||||
oldLang = "1";
|
||||
} else if (ok) {
|
||||
std::cerr << "Error: Language ID must be 1 for C, 2 for Cxx "
|
||||
<< "or a string like (\"C\", \"Cxx\", \"Nim\", etc.)" << std::endl;
|
||||
return {};
|
||||
} else if (!ok) {
|
||||
newLang = lang;
|
||||
oldLang = "";
|
||||
}
|
||||
if (!oldLang.isEmpty())
|
||||
data << KeyValuePair({tc, LANGUAGE_KEY}, QVariant(oldLang));
|
||||
if (!newLang.isEmpty())
|
||||
data << KeyValuePair({tc, LANGUAGE_KEY_V2}, QVariant(newLang));
|
||||
data << KeyValuePair({tc, DISPLAYNAME}, QVariant(uniqueName));
|
||||
data << KeyValuePair({tc, AUTODETECTED}, QVariant(true));
|
||||
data << KeyValuePair({tc, PATH}, QVariant(path));
|
||||
|
@@ -2723,7 +2723,8 @@ void tst_Dumpers::dumper_data()
|
||||
|
||||
+ Check("ob", "\"An Object\"", "@QWidget")
|
||||
+ Check("ob1", "\"Another Object\"", "@QObject")
|
||||
+ Check("ob2", "\"A Subobject\"", "@QObject");
|
||||
+ Check("ob2", "\"A Subobject\"", "@QObject")
|
||||
+ Check("ob.[extra].[connections].0.0.receiver", "\"Another Object\"", "@QObject");
|
||||
|
||||
|
||||
QString senderData =
|
||||
|
Reference in New Issue
Block a user