forked from qt-creator/qt-creator
Adds dynamic ui completion. Wohoo :)
This means, creating a new project, we immediately have completion for the ui file. Also adding stuff to the ui file now changes the codemodel immediately. Yet todo, are tests under windows and suppressing a warning if the form contains a toplevel spacer.
This commit is contained in:
@@ -24,5 +24,6 @@ will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.</license>
|
|||||||
<dependency name="CppTools" version="1.1.80"/>
|
<dependency name="CppTools" version="1.1.80"/>
|
||||||
<dependency name="CppEditor" version="1.1.80"/>
|
<dependency name="CppEditor" version="1.1.80"/>
|
||||||
<dependency name="Help" version="1.1.80"/>
|
<dependency name="Help" version="1.1.80"/>
|
||||||
|
<dependency name="Designer" version="1.1.80"/>
|
||||||
</dependencyList>
|
</dependencyList>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#include "qt4nodes.h"
|
#include "qt4nodes.h"
|
||||||
#include "qt4project.h"
|
#include "qt4project.h"
|
||||||
#include "qt4projectmanager.h"
|
#include "qt4projectmanager.h"
|
||||||
|
#include "qtuicodemodelsupport.h"
|
||||||
|
|
||||||
#include <projectexplorer/nodesvisitor.h>
|
#include <projectexplorer/nodesvisitor.h>
|
||||||
#include <projectexplorer/filewatcher.h>
|
#include <projectexplorer/filewatcher.h>
|
||||||
@@ -540,13 +541,22 @@ Qt4ProFileNode::Qt4ProFileNode(Qt4Project *project,
|
|||||||
|
|
||||||
Qt4ProFileNode::~Qt4ProFileNode()
|
Qt4ProFileNode::~Qt4ProFileNode()
|
||||||
{
|
{
|
||||||
|
CppTools::CppModelManagerInterface *modelManager
|
||||||
|
= ExtensionSystem::PluginManager::instance()->getObject<CppTools::CppModelManagerInterface>();
|
||||||
|
QMap<QString, Qt4UiCodeModelSupport *>::const_iterator it, end;
|
||||||
|
end = m_uiCodeModelSupport.constEnd();
|
||||||
|
for (it = m_uiCodeModelSupport.constBegin(); it != end; ++it) {
|
||||||
|
modelManager->removeEditorSupport(it.value());
|
||||||
|
delete it.value();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Qt4ProFileNode::buildStateChanged(ProjectExplorer::Project *project)
|
void Qt4ProFileNode::buildStateChanged(ProjectExplorer::Project *project)
|
||||||
{
|
{
|
||||||
if (project == m_project && !ProjectExplorer::ProjectExplorerPlugin::instance()->buildManager()->isBuilding(m_project))
|
if (project == m_project && !ProjectExplorer::ProjectExplorerPlugin::instance()->buildManager()->isBuilding(m_project)) {
|
||||||
updateUiFiles();
|
QStringList filesToUpdate = updateUiFiles();
|
||||||
|
updateCodeModelSupportFromBuild(filesToUpdate);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Qt4ProFileNode::hasTargets() const
|
bool Qt4ProFileNode::hasTargets() const
|
||||||
@@ -717,6 +727,7 @@ void Qt4ProFileNode::update()
|
|||||||
emit qt4Watcher->variablesChanged(this, m_varValues, newVarValues);
|
emit qt4Watcher->variablesChanged(this, m_varValues, newVarValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
createUiCodeModelSupport();
|
||||||
updateUiFiles();
|
updateUiFiles();
|
||||||
|
|
||||||
foreach (NodesWatcher *watcher, watchers())
|
foreach (NodesWatcher *watcher, watchers())
|
||||||
@@ -746,17 +757,16 @@ namespace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// This function is triggered after a build, and updates the state ui files
|
// This function is triggered after a build, and updates the state ui files
|
||||||
// That is it adds files that didn't exist yet to the project tree, and calls
|
|
||||||
// updateSourceFiles() for files that changed
|
|
||||||
// It does so by storing a modification time for each ui file we know about.
|
// It does so by storing a modification time for each ui file we know about.
|
||||||
|
|
||||||
// TODO this function should also be called if the build directory is changed
|
// TODO this function should also be called if the build directory is changed
|
||||||
void Qt4ProFileNode::updateUiFiles()
|
QStringList Qt4ProFileNode::updateUiFiles()
|
||||||
{
|
{
|
||||||
|
qDebug()<<"Qt4ProFileNode::updateUiFiles()";
|
||||||
// Only those two project types can have ui files for us
|
// Only those two project types can have ui files for us
|
||||||
if (m_projectType != ApplicationTemplate
|
if (m_projectType != ApplicationTemplate
|
||||||
&& m_projectType != LibraryTemplate)
|
&& m_projectType != LibraryTemplate)
|
||||||
return;
|
return QStringList();
|
||||||
|
|
||||||
// Find all ui files
|
// Find all ui files
|
||||||
FindUiFileNodesVisitor uiFilesVisitor;
|
FindUiFileNodesVisitor uiFilesVisitor;
|
||||||
@@ -841,7 +851,8 @@ void Qt4ProFileNode::updateUiFiles()
|
|||||||
m_uitimestamps.insert(file->path(), QFileInfo(file->path()).lastModified());
|
m_uitimestamps.insert(file->path(), QFileInfo(file->path()).lastModified());
|
||||||
toUpdate << file->path();
|
toUpdate << file->path();
|
||||||
|
|
||||||
// Also adding files depending on that.
|
// Also adding files depending on that
|
||||||
|
// We only need to do that for files that were newly created
|
||||||
QString fileName = QFileInfo(file->path()).fileName();
|
QString fileName = QFileInfo(file->path()).fileName();
|
||||||
foreach (CPlusPlus::Document::Ptr doc, modelManager->snapshot()) {
|
foreach (CPlusPlus::Document::Ptr doc, modelManager->snapshot()) {
|
||||||
if (doc->includedFiles().contains(fileName)) {
|
if (doc->includedFiles().contains(fileName)) {
|
||||||
@@ -852,7 +863,7 @@ void Qt4ProFileNode::updateUiFiles()
|
|||||||
}
|
}
|
||||||
addFileNodes(toAdd, this);
|
addFileNodes(toAdd, this);
|
||||||
}
|
}
|
||||||
m_project->addUiFilesToCodeModel(toUpdate);
|
return toUpdate;
|
||||||
}
|
}
|
||||||
|
|
||||||
ProFileReader *Qt4PriFileNode::createProFileReader() const
|
ProFileReader *Qt4PriFileNode::createProFileReader() const
|
||||||
@@ -1012,6 +1023,83 @@ void Qt4ProFileNode::invalidate()
|
|||||||
emit qt4Watcher->projectTypeChanged(this, oldType, InvalidProject);
|
emit qt4Watcher->projectTypeChanged(this, oldType, InvalidProject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Qt4ProFileNode::updateCodeModelSupportFromBuild(const QStringList &files)
|
||||||
|
{
|
||||||
|
qDebug()<<"Qt4ProFileNode::updateCodeModelSupportFromBuild"<<files;
|
||||||
|
foreach (const QString &file, files) {
|
||||||
|
QMap<QString, Qt4UiCodeModelSupport *>::const_iterator it, end;
|
||||||
|
end = m_uiCodeModelSupport.constEnd();
|
||||||
|
for (it = m_uiCodeModelSupport.constBegin(); it != end; ++it) {
|
||||||
|
if (it.value()->fileName() == file)
|
||||||
|
it.value()->updateFromBuild();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Qt4ProFileNode::updateCodeModelSupportFromEditor(const QString &uiFileName, Designer::Internal::FormWindowEditor *fw)
|
||||||
|
{
|
||||||
|
QMap<QString, Qt4UiCodeModelSupport *>::const_iterator it;
|
||||||
|
it = m_uiCodeModelSupport.constFind(uiFileName);
|
||||||
|
if (it != m_uiCodeModelSupport.constEnd()) {
|
||||||
|
it.value()->updateFromEditor(fw);
|
||||||
|
}
|
||||||
|
foreach (ProjectExplorer::ProjectNode *pro, subProjectNodes())
|
||||||
|
if (Qt4ProFileNode *qt4proFileNode = qobject_cast<Qt4ProFileNode *>(pro))
|
||||||
|
qt4proFileNode->updateCodeModelSupportFromEditor(uiFileName, fw);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Qt4ProFileNode::createUiCodeModelSupport()
|
||||||
|
{
|
||||||
|
qDebug()<<"creatUiCodeModelSupport()";
|
||||||
|
CppTools::CppModelManagerInterface *modelManager
|
||||||
|
= ExtensionSystem::PluginManager::instance()->getObject<CppTools::CppModelManagerInterface>();
|
||||||
|
|
||||||
|
// First move all to
|
||||||
|
QMap<QString, Qt4UiCodeModelSupport *> oldCodeModelSupport;
|
||||||
|
oldCodeModelSupport = m_uiCodeModelSupport;
|
||||||
|
m_uiCodeModelSupport.clear();
|
||||||
|
|
||||||
|
// Only those two project types can have ui files for us
|
||||||
|
if (m_projectType == ApplicationTemplate || m_projectType == LibraryTemplate) {
|
||||||
|
// Find all ui files
|
||||||
|
FindUiFileNodesVisitor uiFilesVisitor;
|
||||||
|
this->accept(&uiFilesVisitor);
|
||||||
|
const QList<FileNode*> uiFiles = uiFilesVisitor.uiFileNodes;
|
||||||
|
|
||||||
|
// Find the UiDir, there can only ever be one
|
||||||
|
QString uiDir = buildDir();
|
||||||
|
QStringList tmp = m_varValues[UiDirVar];
|
||||||
|
if (tmp.size() != 0)
|
||||||
|
uiDir = tmp.first();
|
||||||
|
|
||||||
|
foreach (FileNode *uiFile, uiFiles) {
|
||||||
|
const QString uiHeaderFilePath
|
||||||
|
= QString("%1/ui_%2.h").arg(uiDir, QFileInfo(uiFile->path()).completeBaseName());
|
||||||
|
|
||||||
|
qDebug()<<"code model support for "<<uiFile->path()<<" "<<uiHeaderFilePath;
|
||||||
|
QMap<QString, Qt4UiCodeModelSupport *>::iterator it = oldCodeModelSupport.find(uiFile->path());
|
||||||
|
if (it != oldCodeModelSupport.end()) {
|
||||||
|
qDebug()<<"updated old codemodelsupport";
|
||||||
|
Qt4UiCodeModelSupport *cms = it.value();
|
||||||
|
cms->setFileName(uiHeaderFilePath);
|
||||||
|
m_uiCodeModelSupport.insert(it.key(), cms);
|
||||||
|
oldCodeModelSupport.erase(it);
|
||||||
|
} else {
|
||||||
|
qDebug()<<"adding new codemodelsupport";
|
||||||
|
Qt4UiCodeModelSupport *cms = new Qt4UiCodeModelSupport(modelManager, m_project, uiFile->path(), uiHeaderFilePath);
|
||||||
|
m_uiCodeModelSupport.insert(uiFile->path(), cms);
|
||||||
|
modelManager->addEditorSupport(cms);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Remove old
|
||||||
|
QMap<QString, Qt4UiCodeModelSupport *>::const_iterator it, end;
|
||||||
|
end = oldCodeModelSupport.constEnd();
|
||||||
|
for (it = oldCodeModelSupport.constBegin(); it!=end; ++it) {
|
||||||
|
modelManager->removeEditorSupport(it.value());
|
||||||
|
delete it.value();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Qt4NodesWatcher::Qt4NodesWatcher(QObject *parent)
|
Qt4NodesWatcher::Qt4NodesWatcher(QObject *parent)
|
||||||
: NodesWatcher(parent)
|
: NodesWatcher(parent)
|
||||||
|
|||||||
@@ -52,6 +52,12 @@ namespace ProjectExplorer {
|
|||||||
class FileWatcher;
|
class FileWatcher;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace Designer {
|
||||||
|
namespace Internal {
|
||||||
|
class FormWindowEditor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
namespace Qt4ProjectManager {
|
namespace Qt4ProjectManager {
|
||||||
|
|
||||||
// Import base classes into namespace
|
// Import base classes into namespace
|
||||||
@@ -76,6 +82,7 @@ namespace Internal {
|
|||||||
|
|
||||||
using ProjectExplorer::FileType;
|
using ProjectExplorer::FileType;
|
||||||
class ProFileReader;
|
class ProFileReader;
|
||||||
|
class Qt4UiCodeModelSupport;
|
||||||
|
|
||||||
// Type of projects
|
// Type of projects
|
||||||
enum Qt4ProjectType {
|
enum Qt4ProjectType {
|
||||||
@@ -127,7 +134,6 @@ public:
|
|||||||
|
|
||||||
//internal
|
//internal
|
||||||
ProFileReader *createProFileReader() const;
|
ProFileReader *createProFileReader() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void clear();
|
void clear();
|
||||||
static QStringList varNames(FileType type);
|
static QStringList varNames(FileType type);
|
||||||
@@ -165,6 +171,8 @@ private:
|
|||||||
// watching changes to the .pro and .pri files on disk
|
// watching changes to the .pro and .pri files on disk
|
||||||
ProjectExplorer::FileWatcher *m_fileWatcher;
|
ProjectExplorer::FileWatcher *m_fileWatcher;
|
||||||
|
|
||||||
|
QMap<QString, Qt4UiCodeModelSupport *> m_uiCodeModelSupport;
|
||||||
|
|
||||||
// managed by Qt4ProFileNode
|
// managed by Qt4ProFileNode
|
||||||
friend class Qt4ProFileNode;
|
friend class Qt4ProFileNode;
|
||||||
};
|
};
|
||||||
@@ -186,6 +194,8 @@ public:
|
|||||||
|
|
||||||
QStringList variableValue(const Qt4Variable var) const;
|
QStringList variableValue(const Qt4Variable var) const;
|
||||||
|
|
||||||
|
void updateCodeModelSupportFromBuild(const QStringList &files);
|
||||||
|
void updateCodeModelSupportFromEditor(const QString &uiFileName, Designer::Internal::FormWindowEditor *fw);
|
||||||
public slots:
|
public slots:
|
||||||
void scheduleUpdate();
|
void scheduleUpdate();
|
||||||
void update();
|
void update();
|
||||||
@@ -193,7 +203,8 @@ private slots:
|
|||||||
void buildStateChanged(ProjectExplorer::Project*);
|
void buildStateChanged(ProjectExplorer::Project*);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void updateUiFiles();
|
void createUiCodeModelSupport();
|
||||||
|
QStringList updateUiFiles();
|
||||||
Qt4ProFileNode *createSubProFileNode(const QString &path);
|
Qt4ProFileNode *createSubProFileNode(const QString &path);
|
||||||
|
|
||||||
QStringList uiDirPaths(ProFileReader *reader) const;
|
QStringList uiDirPaths(ProFileReader *reader) const;
|
||||||
|
|||||||
@@ -245,10 +245,6 @@ Qt4Project::Qt4Project(Qt4Manager *manager, const QString& fileName) :
|
|||||||
m_updateCodeModelTimer.setSingleShot(true);
|
m_updateCodeModelTimer.setSingleShot(true);
|
||||||
m_updateCodeModelTimer.setInterval(20);
|
m_updateCodeModelTimer.setInterval(20);
|
||||||
connect(&m_updateCodeModelTimer, SIGNAL(timeout()), this, SLOT(updateCodeModel()));
|
connect(&m_updateCodeModelTimer, SIGNAL(timeout()), this, SLOT(updateCodeModel()));
|
||||||
|
|
||||||
m_addUiFilesTimer.setSingleShot(true);
|
|
||||||
m_addUiFilesTimer.setInterval(20);
|
|
||||||
connect(&m_addUiFilesTimer, SIGNAL(timeout()), this, SLOT(addUiFiles()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Qt4Project::~Qt4Project()
|
Qt4Project::~Qt4Project()
|
||||||
@@ -376,27 +372,6 @@ namespace {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
void Qt4Project::addUiFilesToCodeModel(const QStringList &files)
|
|
||||||
{
|
|
||||||
// if we already have a full updateCodeModel() scheduled
|
|
||||||
// then we don't need to this seperately
|
|
||||||
// since that one will add also all the ui files
|
|
||||||
if (m_updateCodeModelTimer.isActive())
|
|
||||||
return;
|
|
||||||
m_addUiFilesTimer.start();
|
|
||||||
m_uiFilesToAdd << files;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Qt4Project::addUiFiles()
|
|
||||||
{
|
|
||||||
if (m_updateCodeModelTimer.isActive())
|
|
||||||
return;
|
|
||||||
CppTools::CppModelManagerInterface *modelManager =
|
|
||||||
ExtensionSystem::PluginManager::instance()->getObject<CppTools::CppModelManagerInterface>();
|
|
||||||
modelManager->updateSourceFiles(m_uiFilesToAdd);
|
|
||||||
m_uiFilesToAdd.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Qt4Project::scheduleUpdateCodeModel(Qt4ProjectManager::Internal::Qt4ProFileNode *pro)
|
void Qt4Project::scheduleUpdateCodeModel(Qt4ProjectManager::Internal::Qt4ProFileNode *pro)
|
||||||
{
|
{
|
||||||
m_updateCodeModelTimer.start();
|
m_updateCodeModelTimer.start();
|
||||||
|
|||||||
@@ -184,9 +184,6 @@ public:
|
|||||||
|
|
||||||
void notifyChanged(const QString &name);
|
void notifyChanged(const QString &name);
|
||||||
|
|
||||||
// called by qt4ProjectNode to add ui_*.h files to the codemodel
|
|
||||||
void addUiFilesToCodeModel(const QStringList &files);
|
|
||||||
|
|
||||||
QString makeCommand(const QString &buildConfiguration) const;
|
QString makeCommand(const QString &buildConfiguration) const;
|
||||||
|
|
||||||
// Is called by qmakestep qt4configurationwidget if the settings change
|
// Is called by qmakestep qt4configurationwidget if the settings change
|
||||||
@@ -253,8 +250,6 @@ private:
|
|||||||
Internal::Qt4ProjectFiles *m_projectFiles;
|
Internal::Qt4ProjectFiles *m_projectFiles;
|
||||||
|
|
||||||
QTimer m_updateCodeModelTimer;
|
QTimer m_updateCodeModelTimer;
|
||||||
QTimer m_addUiFilesTimer;
|
|
||||||
QStringList m_uiFilesToAdd;
|
|
||||||
QList<Qt4ProjectManager::Internal::Qt4ProFileNode *> m_proFilesForCodeModelUpdate;
|
QList<Qt4ProjectManager::Internal::Qt4ProFileNode *> m_proFilesForCodeModelUpdate;
|
||||||
|
|
||||||
QMap<QString, Internal::CodeModelInfo> m_codeModelInfo;
|
QMap<QString, Internal::CodeModelInfo> m_codeModelInfo;
|
||||||
|
|||||||
@@ -47,6 +47,7 @@
|
|||||||
#include <projectexplorer/project.h>
|
#include <projectexplorer/project.h>
|
||||||
#include <projectexplorer/projectexplorerconstants.h>
|
#include <projectexplorer/projectexplorerconstants.h>
|
||||||
#include <utils/listutils.h>
|
#include <utils/listutils.h>
|
||||||
|
#include <designer/formwindoweditor.h>
|
||||||
|
|
||||||
#include <QtCore/QCoreApplication>
|
#include <QtCore/QCoreApplication>
|
||||||
#include <QtCore/QDir>
|
#include <QtCore/QDir>
|
||||||
@@ -81,7 +82,9 @@ Qt4Manager::Qt4Manager(Qt4ProjectManagerPlugin *plugin)
|
|||||||
m_plugin(plugin),
|
m_plugin(plugin),
|
||||||
m_projectExplorer(0),
|
m_projectExplorer(0),
|
||||||
m_contextProject(0),
|
m_contextProject(0),
|
||||||
m_languageID(0)
|
m_languageID(0),
|
||||||
|
m_lastEditor(0),
|
||||||
|
m_dirty(false)
|
||||||
{
|
{
|
||||||
m_languageID = Core::UniqueIDManager::instance()->
|
m_languageID = Core::UniqueIDManager::instance()->
|
||||||
uniqueIdentifier(ProjectExplorer::Constants::LANG_CXX);
|
uniqueIdentifier(ProjectExplorer::Constants::LANG_CXX);
|
||||||
@@ -110,6 +113,64 @@ void Qt4Manager::notifyChanged(const QString &name)
|
|||||||
void Qt4Manager::init()
|
void Qt4Manager::init()
|
||||||
{
|
{
|
||||||
m_projectExplorer = ProjectExplorer::ProjectExplorerPlugin::instance();
|
m_projectExplorer = ProjectExplorer::ProjectExplorerPlugin::instance();
|
||||||
|
connect(Core::EditorManager::instance(), SIGNAL(editorAboutToClose(Core::IEditor*)),
|
||||||
|
this, SLOT(editorAboutToClose(Core::IEditor*)));
|
||||||
|
|
||||||
|
connect(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor*)),
|
||||||
|
this, SLOT(editorChanged(Core::IEditor*)));
|
||||||
|
|
||||||
|
foreach(Core::IEditor *editor, Core::EditorManager::instance()->openedEditors())
|
||||||
|
editorOpened(editor);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Qt4Manager::editorChanged(Core::IEditor *editor)
|
||||||
|
{
|
||||||
|
// Handle old editor
|
||||||
|
Designer::Internal::FormWindowEditor *lastEditor = qobject_cast<Designer::Internal::FormWindowEditor *>(m_lastEditor);
|
||||||
|
if (lastEditor) {
|
||||||
|
disconnect(lastEditor, SIGNAL(changed()), this, SLOT(uiEditorContentsChanged()));
|
||||||
|
|
||||||
|
if (m_dirty) {
|
||||||
|
foreach(Qt4Project *project, m_projects)
|
||||||
|
project->rootProjectNode()->updateCodeModelSupportFromEditor(lastEditor->file()->fileName(), lastEditor);
|
||||||
|
m_dirty = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_lastEditor = editor;
|
||||||
|
|
||||||
|
// Handle new editor
|
||||||
|
if (Designer::Internal::FormWindowEditor *fw = qobject_cast<Designer::Internal::FormWindowEditor *>(editor))
|
||||||
|
connect(fw, SIGNAL(changed()), this, SLOT(uiEditorContentsChanged()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Qt4Manager::editorAboutToClose(Core::IEditor *editor)
|
||||||
|
{
|
||||||
|
if (m_lastEditor == editor) {
|
||||||
|
// Oh no our editor is going to be closed
|
||||||
|
// get the content first
|
||||||
|
Designer::Internal::FormWindowEditor *lastEditor = qobject_cast<Designer::Internal::FormWindowEditor *>(m_lastEditor);
|
||||||
|
if (lastEditor) {
|
||||||
|
disconnect(lastEditor, SIGNAL(changed()), this, SLOT(uiEditorContentsChanged()));
|
||||||
|
if (m_dirty) {
|
||||||
|
foreach(Qt4Project *project, m_projects)
|
||||||
|
project->rootProjectNode()->updateCodeModelSupportFromEditor(lastEditor->file()->fileName(), lastEditor);
|
||||||
|
m_dirty = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_lastEditor = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Qt4Manager::uiEditorContentsChanged()
|
||||||
|
{
|
||||||
|
// cast sender, get filename
|
||||||
|
if (m_dirty)
|
||||||
|
return;
|
||||||
|
Designer::Internal::FormWindowEditor *fw = qobject_cast<Designer::Internal::FormWindowEditor *>(sender());
|
||||||
|
if (!fw)
|
||||||
|
return;
|
||||||
|
m_dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Qt4Manager::projectContext() const
|
int Qt4Manager::projectContext() const
|
||||||
|
|||||||
@@ -36,6 +36,10 @@
|
|||||||
|
|
||||||
#include <QtCore/QModelIndex>
|
#include <QtCore/QModelIndex>
|
||||||
|
|
||||||
|
namespace Core {
|
||||||
|
class IEditor;
|
||||||
|
}
|
||||||
|
|
||||||
namespace ExtensionSystem {
|
namespace ExtensionSystem {
|
||||||
class PluginManager;
|
class PluginManager;
|
||||||
}
|
}
|
||||||
@@ -92,6 +96,12 @@ public slots:
|
|||||||
void runQMake();
|
void runQMake();
|
||||||
void runQMakeContextMenu();
|
void runQMakeContextMenu();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void editorOpened(Core::IEditor *editor);
|
||||||
|
void editorAboutToClose(Core::IEditor *editor);
|
||||||
|
void uiEditorContentsChanged();
|
||||||
|
void editorChanged(Core::IEditor*);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QList<Qt4Project *> m_projects;
|
QList<Qt4Project *> m_projects;
|
||||||
void runQMake(ProjectExplorer::Project *p);
|
void runQMake(ProjectExplorer::Project *p);
|
||||||
@@ -104,7 +114,8 @@ private:
|
|||||||
ProjectExplorer::Project *m_contextProject;
|
ProjectExplorer::Project *m_contextProject;
|
||||||
|
|
||||||
int m_languageID;
|
int m_languageID;
|
||||||
|
Core::IEditor *m_lastEditor;
|
||||||
|
bool m_dirty;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Qt4ProjectManager
|
} // namespace Qt4ProjectManager
|
||||||
|
|||||||
@@ -36,7 +36,8 @@ HEADERS = qt4projectmanagerplugin.h \
|
|||||||
qt4buildenvironmentwidget.h \
|
qt4buildenvironmentwidget.h \
|
||||||
projectloadwizard.h \
|
projectloadwizard.h \
|
||||||
qtversionmanager.h \
|
qtversionmanager.h \
|
||||||
qtoptionspage.h
|
qtoptionspage.h \
|
||||||
|
qtuicodemodelsupport.h
|
||||||
SOURCES = qt4projectmanagerplugin.cpp \
|
SOURCES = qt4projectmanagerplugin.cpp \
|
||||||
qt4projectmanager.cpp \
|
qt4projectmanager.cpp \
|
||||||
qt4project.cpp \
|
qt4project.cpp \
|
||||||
@@ -68,7 +69,8 @@ SOURCES = qt4projectmanagerplugin.cpp \
|
|||||||
qt4buildenvironmentwidget.cpp \
|
qt4buildenvironmentwidget.cpp \
|
||||||
projectloadwizard.cpp \
|
projectloadwizard.cpp \
|
||||||
qtversionmanager.cpp \
|
qtversionmanager.cpp \
|
||||||
qtoptionspage.cpp
|
qtoptionspage.cpp \
|
||||||
|
qtuicodemodelsupport.cpp
|
||||||
FORMS = envvariablespage.ui \
|
FORMS = envvariablespage.ui \
|
||||||
enveditdialog.ui \
|
enveditdialog.ui \
|
||||||
proeditorcontainer.ui \
|
proeditorcontainer.ui \
|
||||||
@@ -83,5 +85,4 @@ RESOURCES = qt4projectmanager.qrc \
|
|||||||
wizards/wizards.qrc
|
wizards/wizards.qrc
|
||||||
include(../../shared/proparser/proparser.pri)
|
include(../../shared/proparser/proparser.pri)
|
||||||
DEFINES += QT_NO_CAST_TO_ASCII
|
DEFINES += QT_NO_CAST_TO_ASCII
|
||||||
|
|
||||||
OTHER_FILES += Qt4ProjectManager.pluginspec
|
OTHER_FILES += Qt4ProjectManager.pluginspec
|
||||||
|
|||||||
@@ -2,3 +2,4 @@ include(../../plugins/projectexplorer/projectexplorer.pri)
|
|||||||
include(../../plugins/cpptools/cpptools.pri)
|
include(../../plugins/cpptools/cpptools.pri)
|
||||||
include(../../plugins/cppeditor/cppeditor.pri)
|
include(../../plugins/cppeditor/cppeditor.pri)
|
||||||
include(../../plugins/help/help.pri)
|
include(../../plugins/help/help.pri)
|
||||||
|
include(../../plugins/designer/designer.pri)
|
||||||
|
|||||||
@@ -384,6 +384,7 @@ void QtVersion::setPath(const QString &path)
|
|||||||
m_versionInfoUpToDate = false;
|
m_versionInfoUpToDate = false;
|
||||||
m_mkspecUpToDate = false;
|
m_mkspecUpToDate = false;
|
||||||
m_qmakeCommand = QString::null;
|
m_qmakeCommand = QString::null;
|
||||||
|
m_uicCommand = QString::null;
|
||||||
// TODO do i need to optimize this?
|
// TODO do i need to optimize this?
|
||||||
m_hasDebuggingHelper = !debuggingHelperLibrary().isEmpty();
|
m_hasDebuggingHelper = !debuggingHelperLibrary().isEmpty();
|
||||||
}
|
}
|
||||||
@@ -753,6 +754,29 @@ QString QtVersion::qmakeCommand() const
|
|||||||
return QString::null;
|
return QString::null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString QtVersion::uicCommand() const
|
||||||
|
{
|
||||||
|
if (!isValid())
|
||||||
|
return QString::null;
|
||||||
|
if (!m_uicCommand.isNull())
|
||||||
|
return m_uicCommand;
|
||||||
|
QString qtdirbin = versionInfo().value("QT_INSTALL_BINS") + "/";
|
||||||
|
QStringList possibleCommands;
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
possibleCommands<< "uic.exe";
|
||||||
|
#else
|
||||||
|
possibleCommands << "uic-qt4" << "uic4" << "uic" ;
|
||||||
|
#endif
|
||||||
|
foreach (const QString &possibleCommand, possibleCommands) {
|
||||||
|
const QString &fullPath = qtdirbin + possibleCommand;
|
||||||
|
if (QFileInfo(fullPath).exists()) {
|
||||||
|
m_uicCommand = QDir::cleanPath(fullPath);
|
||||||
|
return m_uicCommand;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return QString::null;
|
||||||
|
}
|
||||||
|
|
||||||
ProjectExplorer::ToolChain::ToolChainType QtVersion::toolchainType() const
|
ProjectExplorer::ToolChain::ToolChainType QtVersion::toolchainType() const
|
||||||
{
|
{
|
||||||
if (!isValid())
|
if (!isValid())
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ public:
|
|||||||
QString mkspec() const;
|
QString mkspec() const;
|
||||||
QString mkspecPath() const;
|
QString mkspecPath() const;
|
||||||
QString qmakeCommand() const;
|
QString qmakeCommand() const;
|
||||||
|
QString uicCommand() const;
|
||||||
QString qtVersionString() const;
|
QString qtVersionString() const;
|
||||||
// Returns the PREFIX, BINPREFIX, DOCPREFIX and similar information
|
// Returns the PREFIX, BINPREFIX, DOCPREFIX and similar information
|
||||||
QHash<QString,QString> versionInfo() const;
|
QHash<QString,QString> versionInfo() const;
|
||||||
@@ -109,7 +110,6 @@ private:
|
|||||||
mutable QString m_mkspec; // updated lazily
|
mutable QString m_mkspec; // updated lazily
|
||||||
mutable QString m_mkspecFullPath;
|
mutable QString m_mkspecFullPath;
|
||||||
QString m_mingwDirectory;
|
QString m_mingwDirectory;
|
||||||
QString m_prependPath;
|
|
||||||
QString m_msvcVersion;
|
QString m_msvcVersion;
|
||||||
mutable QHash<QString,QString> m_versionInfo; // updated lazily
|
mutable QHash<QString,QString> m_versionInfo; // updated lazily
|
||||||
int m_id;
|
int m_id;
|
||||||
@@ -118,6 +118,7 @@ private:
|
|||||||
mutable bool m_defaultConfigIsDebug;
|
mutable bool m_defaultConfigIsDebug;
|
||||||
mutable bool m_defaultConfigIsDebugAndRelease;
|
mutable bool m_defaultConfigIsDebugAndRelease;
|
||||||
mutable QString m_qmakeCommand;
|
mutable QString m_qmakeCommand;
|
||||||
|
mutable QString m_uicCommand;
|
||||||
// This is updated on first call to qmakeCommand
|
// This is updated on first call to qmakeCommand
|
||||||
// That function is called from updateVersionInfo()
|
// That function is called from updateVersionInfo()
|
||||||
mutable QString m_qtVersionString;
|
mutable QString m_qtVersionString;
|
||||||
|
|||||||
Reference in New Issue
Block a user