forked from qt-creator/qt-creator
Merge commit 'origin/1.1'
Conflicts: src/plugins/debugger/debuggeractions.cpp src/plugins/debugger/gdboptionpage.ui
This commit is contained in:
@@ -43,10 +43,12 @@ unix:!macx {
|
||||
QMAKE_POST_LINK += $${QMAKE_COPY_FILE} $${COPYSRC} $${COPYDEST} $$SEPARATOR
|
||||
}
|
||||
|
||||
target.files += $$OUT_PWD/$$DESTDIR/$$IDE_APP_WRAPPER
|
||||
target.files += $$OUT_PWD/$$DESTDIR/$$IDE_APP_TARGET
|
||||
wrapper.files = $$OUT_PWD/$$DESTDIR/$$IDE_APP_WRAPPER
|
||||
wrapper.path = /bin
|
||||
|
||||
target.path = /bin
|
||||
INSTALLS += target
|
||||
|
||||
INSTALLS += target wrapper
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -75,6 +75,8 @@ CMakeOpenProjectWizard::CMakeOpenProjectWizard(CMakeManager *cmakeManager, const
|
||||
setPage(CMakeRunPageId, new CMakeRunPage(this));
|
||||
|
||||
setStartId(startid);
|
||||
setOption(QWizard::NoCancelButton);
|
||||
setOption(QWizard::NoBackButtonOnStartPage);
|
||||
}
|
||||
|
||||
CMakeOpenProjectWizard::CMakeOpenProjectWizard(CMakeManager *cmakeManager, const QString &sourceDirectory,
|
||||
@@ -87,6 +89,8 @@ CMakeOpenProjectWizard::CMakeOpenProjectWizard(CMakeManager *cmakeManager, const
|
||||
addPage(new CMakeRunPage(this, buildDirectory, false));
|
||||
foreach(const QString &buildDirectory, needToUpdate)
|
||||
addPage(new CMakeRunPage(this, buildDirectory, true));
|
||||
setOption(QWizard::NoCancelButton);
|
||||
setOption(QWizard::NoBackButtonOnStartPage);
|
||||
}
|
||||
|
||||
CMakeManager *CMakeOpenProjectWizard::cmakeManager() const
|
||||
@@ -255,6 +259,9 @@ void CMakeRunPage::initWidgets()
|
||||
|
||||
m_output = new QPlainTextEdit(this);
|
||||
m_output->setReadOnly(true);
|
||||
QSizePolicy pl = m_output->sizePolicy();
|
||||
pl.setVerticalStretch(1);
|
||||
m_output->setSizePolicy(pl);
|
||||
fl->addRow(m_output);
|
||||
}
|
||||
|
||||
|
||||
@@ -512,7 +512,6 @@ void CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader
|
||||
cleanMakeStep->setValue("clean", true);
|
||||
} else {
|
||||
// We have a user file, but we could still be missing the cbp file
|
||||
// TODO check that we have a cbp file and if not, open up a dialog ?
|
||||
// or simply run createXml with the saved settings
|
||||
QFileInfo sourceFileInfo(m_fileName);
|
||||
QStringList needToCreate;
|
||||
|
||||
@@ -155,7 +155,10 @@ QString CMakeManager::qtVersionForQMake(const QString &qmakePath)
|
||||
return QString();
|
||||
}
|
||||
|
||||
QString CMakeManager::findQtDir(const ProjectExplorer::Environment &env)
|
||||
// this is mostly a copy from qt4versionmanager
|
||||
// TODO refactor this code
|
||||
// returns QPair< QTDIR, QT_INSTALL_DATA >
|
||||
QPair<QString, QString> CMakeManager::findQtDir(const ProjectExplorer::Environment &env)
|
||||
{
|
||||
QStringList possibleCommands;
|
||||
// On windows noone has renamed qmake, right?
|
||||
@@ -171,21 +174,23 @@ QString CMakeManager::findQtDir(const ProjectExplorer::Environment &env)
|
||||
QFileInfo qmake(path + "/" + possibleCommand);
|
||||
if (qmake.exists()) {
|
||||
if (!qtVersionForQMake(qmake.absoluteFilePath()).isNull()) {
|
||||
QDir qtDir = qmake.absoluteDir();
|
||||
qtDir.cdUp();
|
||||
QProcess proc;
|
||||
proc.start(qmake.absoluteFilePath(), QStringList() << "-query" << "QT_INSTALL_DATA");
|
||||
if (proc.waitForFinished()) {
|
||||
return proc.readAll().trimmed();
|
||||
return qMakePair(qtDir.absolutePath(), QString(proc.readAll().trimmed()));
|
||||
} else {
|
||||
proc.kill();
|
||||
QDir dir(qmake.absoluteDir());
|
||||
dir.cdUp();
|
||||
return dir.absolutePath();
|
||||
return qMakePair(qtDir.absolutePath(), dir.absolutePath());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return QString();
|
||||
return qMakePair(QString(), QString());
|
||||
}
|
||||
|
||||
// This code is more or less duplicated in qtversionmanager
|
||||
@@ -195,14 +200,16 @@ QString CMakeManager::findDumperLibrary(const ProjectExplorer::Environment &env)
|
||||
static QString lastpath;
|
||||
if (lastenv == env)
|
||||
return lastpath;
|
||||
QString qtdir = findQtDir(env);
|
||||
if (qtdir.isEmpty())
|
||||
|
||||
QPair<QString, QString> pair = findQtDir(env);
|
||||
QString qtInstallDataDir = pair.second;
|
||||
if (qtInstallDataDir.isEmpty())
|
||||
return QString();
|
||||
|
||||
uint hash = qHash(qtdir);
|
||||
uint hash = qHash(pair.first);
|
||||
QStringList directories;
|
||||
directories
|
||||
<< (qtdir + "/qtc-debugging-helper/")
|
||||
<< (qtInstallDataDir + "/qtc-debugging-helper/")
|
||||
<< (QApplication::applicationDirPath() + "/../qtc-debugging-helper/" + QString::number(hash)) + "/"
|
||||
<< (QDesktopServices::storageLocation(QDesktopServices::DataLocation) + "/qtc-debugging-helper/" + QString::number(hash)) + "/";
|
||||
foreach(const QString &directory, directories) {
|
||||
|
||||
@@ -65,7 +65,7 @@ public:
|
||||
static QString findDumperLibrary(const ProjectExplorer::Environment &env);
|
||||
private:
|
||||
static QString qtVersionForQMake(const QString &qmakePath);
|
||||
static QString findQtDir(const ProjectExplorer::Environment &env);
|
||||
static QPair<QString, QString> findQtDir(const ProjectExplorer::Environment &env);
|
||||
int m_projectContext;
|
||||
int m_projectLanguage;
|
||||
CMakeSettingsPage *m_settingsPage;
|
||||
|
||||
@@ -334,31 +334,41 @@ EditorManager::EditorManager(ICore *core, QWidget *parent) :
|
||||
|
||||
m_d->m_splitAction = new QAction(tr("Split"), this);
|
||||
cmd = am->registerAction(m_d->m_splitAction, Constants::SPLIT, editManagerContext);
|
||||
#ifndef Q_OS_MAC
|
||||
cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+E,2")));
|
||||
#endif
|
||||
mwindow->addAction(cmd, Constants::G_WINDOW_SPLIT);
|
||||
connect(m_d->m_splitAction, SIGNAL(triggered()), this, SLOT(split()));
|
||||
|
||||
m_d->m_splitSideBySideAction = new QAction(tr("Split Side by Side"), this);
|
||||
cmd = am->registerAction(m_d->m_splitSideBySideAction, Constants::SPLIT_SIDE_BY_SIDE, editManagerContext);
|
||||
#ifndef Q_OS_MAC
|
||||
cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+E,3")));
|
||||
#endif
|
||||
mwindow->addAction(cmd, Constants::G_WINDOW_SPLIT);
|
||||
connect(m_d->m_splitSideBySideAction, SIGNAL(triggered()), this, SLOT(splitSideBySide()));
|
||||
|
||||
m_d->m_removeCurrentSplitAction = new QAction(tr("Remove Current Split"), this);
|
||||
cmd = am->registerAction(m_d->m_removeCurrentSplitAction, Constants::REMOVE_CURRENT_SPLIT, editManagerContext);
|
||||
#ifndef Q_OS_MAC
|
||||
cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+E,0")));
|
||||
#endif
|
||||
mwindow->addAction(cmd, Constants::G_WINDOW_SPLIT);
|
||||
connect(m_d->m_removeCurrentSplitAction, SIGNAL(triggered()), this, SLOT(removeCurrentSplit()));
|
||||
|
||||
m_d->m_removeAllSplitsAction = new QAction(tr("Remove All Splits"), this);
|
||||
cmd = am->registerAction(m_d->m_removeAllSplitsAction, Constants::REMOVE_ALL_SPLITS, editManagerContext);
|
||||
#ifndef Q_OS_MAC
|
||||
cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+E,1")));
|
||||
#endif
|
||||
mwindow->addAction(cmd, Constants::G_WINDOW_SPLIT);
|
||||
connect(m_d->m_removeAllSplitsAction, SIGNAL(triggered()), this, SLOT(removeAllSplits()));
|
||||
|
||||
m_d->m_gotoOtherSplitAction = new QAction(tr("Goto Other Split"), this);
|
||||
cmd = am->registerAction(m_d->m_gotoOtherSplitAction, Constants::GOTO_OTHER_SPLIT, editManagerContext);
|
||||
#ifndef Q_OS_MAC
|
||||
cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+E,o")));
|
||||
#endif
|
||||
mwindow->addAction(cmd, Constants::G_WINDOW_SPLIT);
|
||||
connect(m_d->m_gotoOtherSplitAction, SIGNAL(triggered()), this, SLOT(gotoOtherSplit()));
|
||||
|
||||
@@ -1538,6 +1548,7 @@ QByteArray EditorManager::saveState() const
|
||||
bool EditorManager::restoreState(const QByteArray &state)
|
||||
{
|
||||
closeAllEditors(true);
|
||||
removeAllSplits();
|
||||
QDataStream stream(state);
|
||||
|
||||
QByteArray version;
|
||||
|
||||
@@ -208,6 +208,8 @@ private slots:
|
||||
void goBackInNavigationHistory();
|
||||
void goForwardInNavigationHistory();
|
||||
void makeCurrentEditorWritable();
|
||||
|
||||
public slots:
|
||||
void split(Qt::Orientation orientation);
|
||||
void split();
|
||||
void splitSideBySide();
|
||||
|
||||
@@ -158,7 +158,7 @@ DebuggerSettings *DebuggerSettings::instance()
|
||||
instance->insertItem(UseDebuggingHelpers, item);
|
||||
item->setDefaultValue(true);
|
||||
item->setSettingsKey(debugModeGroup, QLatin1String("UseDebuggingHelper"));
|
||||
item->setText(tr("Use Debugging Helper"));
|
||||
item->setText(tr("Use debugging helper"));
|
||||
item->setCheckable(true);
|
||||
item->setDefaultValue(true);
|
||||
|
||||
|
||||
@@ -104,6 +104,7 @@ enum GdbCommandType
|
||||
GdbQuerySources,
|
||||
GdbAsyncOutput2,
|
||||
GdbStart,
|
||||
GdbExit,
|
||||
GdbAttached,
|
||||
GdbStubAttached,
|
||||
GdbExecRun,
|
||||
@@ -743,6 +744,9 @@ void GdbEngine::handleResult(const GdbResultRecord & record, int type,
|
||||
case GdbInfoThreads:
|
||||
handleInfoThreads(record);
|
||||
break;
|
||||
case GdbExit:
|
||||
handleExit(record);
|
||||
break;
|
||||
|
||||
case GdbShowVersion:
|
||||
handleShowVersion(record);
|
||||
@@ -1155,7 +1159,7 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data)
|
||||
+ data.findChild("signal-name").toString();
|
||||
}
|
||||
q->showStatusMessage(msg);
|
||||
sendCommand("-gdb-exit");
|
||||
sendCommand("-gdb-exit", GdbExit);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1513,7 +1517,7 @@ void GdbEngine::exitDebugger()
|
||||
sendCommand("detach");
|
||||
else
|
||||
sendCommand("kill");
|
||||
sendCommand("-gdb-exit");
|
||||
sendCommand("-gdb-exit", GdbExit);
|
||||
// 20s can easily happen when loading webkit debug information
|
||||
m_gdbProc.waitForFinished(20000);
|
||||
if (m_gdbProc.state() != QProcess::Running) {
|
||||
@@ -1785,6 +1789,12 @@ void GdbEngine::handleAttach()
|
||||
qq->reloadRegisters();
|
||||
}
|
||||
|
||||
void GdbEngine::handleExit(const GdbResultRecord &response)
|
||||
{
|
||||
Q_UNUSED(response);
|
||||
q->showStatusMessage(tr("Debugger exited."));
|
||||
}
|
||||
|
||||
void GdbEngine::stepExec()
|
||||
{
|
||||
setTokenBarrier();
|
||||
@@ -2198,6 +2208,11 @@ void GdbEngine::extractDataFromInfoBreak(const QString &output, BreakpointData *
|
||||
// within namespaces.
|
||||
// Sometimes the path is relative too.
|
||||
|
||||
// 2 breakpoint keep y <MULTIPLE> 0x0040168e
|
||||
// 2.1 y 0x0040168e in MainWindow::MainWindow(QWidget*) at mainwindow.cpp:7
|
||||
// 2.2 y 0x00401792 in MainWindow::MainWindow(QWidget*) at mainwindow.cpp:7
|
||||
|
||||
// tested in ../../../tests/auto/debugger/
|
||||
QRegExp re("MULTIPLE.*(0x[0-9a-f]+) in (.*)\\s+at (.*):([\\d]+)([^\\d]|$)");
|
||||
re.setMinimal(true);
|
||||
|
||||
@@ -2206,6 +2221,10 @@ void GdbEngine::extractDataFromInfoBreak(const QString &output, BreakpointData *
|
||||
data->bpFuncName = re.cap(2).trimmed();
|
||||
data->bpLineNumber = re.cap(4);
|
||||
QString full = fullName(re.cap(3));
|
||||
if (full.isEmpty()) {
|
||||
qDebug() << "NO FULL NAME KNOWN FOR" << re.cap(3);
|
||||
full = re.cap(3); // FIXME: wrong, but prevents recursion
|
||||
}
|
||||
data->markerLineNumber = data->bpLineNumber.toInt();
|
||||
data->markerFileName = full;
|
||||
data->bpFileName = full;
|
||||
@@ -3428,14 +3447,15 @@ void GdbEngine::handleQueryDebuggingHelper(const GdbResultRecord &record)
|
||||
m_availableSimpleDebuggingHelpers.append(item.data());
|
||||
if (m_availableSimpleDebuggingHelpers.isEmpty()) {
|
||||
m_debuggingHelperState = DebuggingHelperUnavailable;
|
||||
QMessageBox::warning(q->mainWindow(),
|
||||
tr("Cannot find special data dumpers"),
|
||||
tr("The debugged binary does not contain information needed for "
|
||||
"nice display of Qt data types.\n\n"
|
||||
"You might want to try including the file\n\n"
|
||||
".../share/qtcreator/gdbmacros/gdbmacros.cpp\n\n"
|
||||
"into your project directly.")
|
||||
);
|
||||
q->showStatusMessage(tr("Debugging helpers not found."));
|
||||
//QMessageBox::warning(q->mainWindow(),
|
||||
// tr("Cannot find special data dumpers"),
|
||||
// tr("The debugged binary does not contain information needed for "
|
||||
// "nice display of Qt data types.\n\n"
|
||||
// "You might want to try including the file\n\n"
|
||||
// ".../share/qtcreator/gdbmacros/gdbmacros.cpp\n\n"
|
||||
// "into your project directly.")
|
||||
// );
|
||||
} else {
|
||||
m_debuggingHelperState = DebuggingHelperAvailable;
|
||||
q->showStatusMessage(tr("%1 custom dumpers found.")
|
||||
|
||||
@@ -200,6 +200,7 @@ private:
|
||||
void handleQueryPwd(const GdbResultRecord &response);
|
||||
void handleQuerySources(const GdbResultRecord &response);
|
||||
void handleTargetCore(const GdbResultRecord &response);
|
||||
void handleExit(const GdbResultRecord &response);
|
||||
void debugMessage(const QString &msg);
|
||||
QString dumperLibraryName() const;
|
||||
|
||||
|
||||
232
src/plugins/debugger/gdboptionpage.ui
Normal file
232
src/plugins/debugger/gdboptionpage.ui
Normal file
@@ -0,0 +1,232 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>GdbOptionPage</class>
|
||||
<widget class="QWidget" name="GdbOptionPage">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>429</width>
|
||||
<height>452</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBoxLocations">
|
||||
<property name="title">
|
||||
<string>Gdb interaction</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_3">
|
||||
<property name="margin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLineEdit" name="environmentEdit"/>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="labelGdbLocation">
|
||||
<property name="toolTip">
|
||||
<string>This is either a full abolute path leading to the gdb binary you intend to use or the name of a gdb binary that will be searched in your PATH.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Gdb location:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="labelEnvironment">
|
||||
<property name="text">
|
||||
<string>Environment:</string>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>environmentEdit</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="labelGdbStartupScript">
|
||||
<property name="toolTip">
|
||||
<string>This is either empty or points to a file containing gdb commands that will be executed immediately after gdb starts up.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Gdb startup script:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="Core::Utils::PathChooser" name="scriptFileChooser" native="true"/>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="Core::Utils::PathChooser" name="gdbLocationChooser" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBoxPluginDebugging">
|
||||
<property name="title">
|
||||
<string>Behaviour of breakpoint setting in plugins</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QRadioButton" name="radioButtonAllPluginBreakpoints">
|
||||
<property name="toolTip">
|
||||
<string>This is the slowest but safest option.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Try to set breakpoints in plugins always automatically.</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QRadioButton" name="radioButtonSelectedPluginBreakpoints">
|
||||
<property name="text">
|
||||
<string>Try to set breakpoints in selected plugins</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Preferred</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>10</width>
|
||||
<height>10</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="labelSelectedPluginBreakpoints">
|
||||
<property name="text">
|
||||
<string>Matching regular expression: </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineEditSelectedPluginBreakpointsPattern"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QRadioButton" name="radioButtonNoPluginBreakpoints">
|
||||
<property name="text">
|
||||
<string>Never set breakpoints in plugins automatically</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>User interface</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxListSourceFiles">
|
||||
<property name="toolTip">
|
||||
<string>Checking this will populate the source file view automatically but might slow down debugger startup considerably.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Populate source file view automatically</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxSkipKnownFrames">
|
||||
<property name="toolTip">
|
||||
<string>When this option is checked, 'Step Into' compresses several steps into one in certain situations, leading to 'less noisy' debugging. So will, e.g., the atomic
|
||||
reference counting code be skipped, and a single 'Step Into' for a signal emission will end up directly in the slot connected to it.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Skip known frames when stepping</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxUseToolTips">
|
||||
<property name="toolTip">
|
||||
<string>Checking this will make enable tooltips for variable values during debugging. Since this can slow down debugging and does not provide reliable information as it does not use scope information, it is switched off by default.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Use tooltips while debugging</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<widget class="QLabel" name="labelMaximalStackDepth">
|
||||
<property name="text">
|
||||
<string>Maximal stack depth:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSpinBox" name="spinBoxMaximalStackDepth">
|
||||
<property name="layoutDirection">
|
||||
<enum>Qt::LeftToRight</enum>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="specialValueText">
|
||||
<string><unlimited></string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>999</number>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>10</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>10</width>
|
||||
<height>1</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>Core::Utils::PathChooser</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">utils/pathchooser.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -932,7 +932,6 @@ QString WatchHandler::watcherName(const QString &exp)
|
||||
void WatchHandler::watchExpression(const QString &exp)
|
||||
{
|
||||
// FIXME: 'exp' can contain illegal characters
|
||||
//MODEL_DEBUG("WATCH: " << exp);
|
||||
m_watchers[exp] = watcherCounter++;
|
||||
WatchData data;
|
||||
data.exp = exp;
|
||||
|
||||
@@ -96,7 +96,7 @@ public:
|
||||
} else if (index.column() == 0) {
|
||||
// the watcher name column
|
||||
theDebuggerAction(RemoveWatchExpression)->trigger(exp);
|
||||
theDebuggerAction(WatchExpression)->trigger(lineEdit->text());
|
||||
theDebuggerAction(WatchExpression)->trigger(value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -175,8 +175,6 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev)
|
||||
QModelIndex idx = indexAt(ev->pos());
|
||||
QModelIndex mi0 = idx.sibling(idx.row(), 0);
|
||||
QString exp = model()->data(mi0).toString();
|
||||
QModelIndex mi1 = idx.sibling(idx.row(), 0);
|
||||
QString value = model()->data(mi1).toString();
|
||||
|
||||
menu.addSeparator();
|
||||
int type = (m_type == LocalsType) ? WatchExpression : RemoveWatchExpression;
|
||||
|
||||
14
src/plugins/fakevim/README
Normal file
14
src/plugins/fakevim/README
Normal file
@@ -0,0 +1,14 @@
|
||||
|
||||
|
||||
fakevim is based on eventFilters installed on a QTextEdit or a QPlainTextEdit.
|
||||
It basically catches all keystrokes and modifies some internal state that
|
||||
make the resulting text in the editor look like it was using vim.
|
||||
|
||||
There are only a few files in here:
|
||||
|
||||
fakevimplugin.{h,cpp} - interaction with the rest of Creator
|
||||
fakevimactions.{h,cpp} - settings
|
||||
fakevimhandler.{h,cpp} - the "real" event
|
||||
|
||||
There are some more hints for developers in fakevimhandler.cpp
|
||||
|
||||
@@ -29,28 +29,33 @@
|
||||
|
||||
#include "fakevimhandler.h"
|
||||
|
||||
// Please do not add any direct dependencies to other Qt Creator code here.
|
||||
// Instead emit signals and let the FakeVimPlugin channel the information to
|
||||
// Qt Creator. The idea is to keep this file here in a "clean" state that
|
||||
// allows easy reuse with any QTextEdit or QPlainTextEdit derived class.
|
||||
|
||||
|
||||
// Some conventions:
|
||||
//
|
||||
// Use 1 based line numbers and 0 based column numbers. Even though
|
||||
// the 1 based line are not nice it matches vim's and QTextEdit's 'line'
|
||||
// concepts.
|
||||
// ATTENTION:
|
||||
//
|
||||
// Do not pass QTextCursor etc around unless really needed. Convert
|
||||
// early to line/column.
|
||||
// 1 Please do not add any direct dependencies to other Qt Creator code here.
|
||||
// Instead emit signals and let the FakeVimPlugin channel the information to
|
||||
// Qt Creator. The idea is to keep this file here in a "clean" state that
|
||||
// allows easy reuse with any QTextEdit or QPlainTextEdit derived class.
|
||||
//
|
||||
// There is always a "current" cursor (m_tc). A current "region of interest"
|
||||
// spans between m_anchor (== anchor()) and m_tc.position() (== position())
|
||||
// The value of m_tc.anchor() is not used.
|
||||
// 2 There are a few auto tests located in ../../../tests/auto/fakevim.
|
||||
// Commands that are covered there are marked as "// tested" below.
|
||||
//
|
||||
// 3 Some conventions:
|
||||
//
|
||||
// Use 1 based line numbers and 0 based column numbers. Even though
|
||||
// the 1 based line are not nice it matches vim's and QTextEdit's 'line'
|
||||
// concepts.
|
||||
//
|
||||
// Do not pass QTextCursor etc around unless really needed. Convert
|
||||
// early to line/column.
|
||||
//
|
||||
// There is always a "current" cursor (m_tc). A current "region of interest"
|
||||
// spans between m_anchor (== anchor()) and m_tc.position() (== position())
|
||||
// The value of m_tc.anchor() is not used.
|
||||
//
|
||||
|
||||
#include <utils/qtcassert.h>
|
||||
|
||||
|
||||
#include <QtCore/QDebug>
|
||||
#include <QtCore/QFile>
|
||||
#include <QtCore/QObject>
|
||||
@@ -277,7 +282,7 @@ public:
|
||||
|
||||
// to reduce line noise
|
||||
void moveToEndOfDocument() { m_tc.movePosition(EndOfDocument, MoveAnchor); }
|
||||
void moveToStartOfLine() { m_tc.movePosition(StartOfLine, MoveAnchor); }
|
||||
void moveToStartOfLine();
|
||||
void moveToEndOfLine();
|
||||
void moveUp(int n = 1) { moveDown(-n); }
|
||||
void moveDown(int n = 1); // { m_tc.movePosition(Down, MoveAnchor, n); }
|
||||
@@ -352,6 +357,8 @@ public:
|
||||
|
||||
// extra data for '.'
|
||||
void replay(const QString &text, int count);
|
||||
void setDotCommand(const QString &cmd) { m_dotCommand = cmd; }
|
||||
void setDotCommand(const QString &cmd, int n) { m_dotCommand = cmd.arg(n); }
|
||||
QString m_dotCommand;
|
||||
bool m_inReplay; // true if we are executing a '.'
|
||||
|
||||
@@ -612,8 +619,9 @@ void FakeVimHandler::Private::moveDown(int n)
|
||||
m_tc.movePosition(Down, MoveAnchor, n);
|
||||
#else
|
||||
const int col = m_tc.position() - m_tc.block().position();
|
||||
const int line = m_tc.block().blockNumber();
|
||||
const QTextBlock &block = m_tc.document()->findBlockByNumber(line + n);
|
||||
const int lastLine = m_tc.document()->lastBlock().blockNumber();
|
||||
const int targetLine = qMax(0, qMin(lastLine, m_tc.block().blockNumber() + n));
|
||||
const QTextBlock &block = m_tc.document()->findBlockByNumber(targetLine);
|
||||
const int pos = block.position();
|
||||
setPosition(pos + qMin(block.length() - 1, col));
|
||||
moveToTargetColumn();
|
||||
@@ -631,6 +639,17 @@ void FakeVimHandler::Private::moveToEndOfLine()
|
||||
#endif
|
||||
}
|
||||
|
||||
void FakeVimHandler::Private::moveToStartOfLine()
|
||||
{
|
||||
#if 0
|
||||
// does not work for "hidden" documents like in the autotests
|
||||
m_tc.movePosition(StartOfLine, MoveAnchor);
|
||||
#else
|
||||
const QTextBlock &block = m_tc.block();
|
||||
setPosition(block.position());
|
||||
#endif
|
||||
}
|
||||
|
||||
void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
|
||||
{
|
||||
//qDebug() << "ANCHOR: " << position() << anchor();
|
||||
@@ -655,7 +674,7 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
|
||||
if (anchor() >= position())
|
||||
m_anchor++;
|
||||
if (!dotCommand.isEmpty())
|
||||
m_dotCommand = "c" + dotCommand;
|
||||
setDotCommand("c" + dotCommand);
|
||||
QString text = removeSelectedText();
|
||||
//qDebug() << "CHANGING TO INSERT MODE" << text;
|
||||
m_registers[m_register] = text;
|
||||
@@ -667,7 +686,7 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
|
||||
if (anchor() >= position())
|
||||
m_anchor++;
|
||||
if (!dotCommand.isEmpty())
|
||||
m_dotCommand = "d" + dotCommand;
|
||||
setDotCommand("d" + dotCommand);
|
||||
m_registers[m_register] = removeSelectedText();
|
||||
m_submode = NoSubMode;
|
||||
if (atEndOfLine())
|
||||
@@ -693,8 +712,6 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
|
||||
updateMiniBuffer();
|
||||
}
|
||||
|
||||
moveToTargetColumn();
|
||||
|
||||
m_moveType = MoveInclusive;
|
||||
m_mvcount.clear();
|
||||
m_opcount.clear();
|
||||
@@ -846,13 +863,19 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
|
||||
} else if (m_submode == RegisterSubMode) {
|
||||
m_register = key;
|
||||
m_submode = NoSubMode;
|
||||
} else if (m_submode == ChangeSubMode && key == 'c') {
|
||||
moveToStartOfLine();
|
||||
} else if (m_submode == ChangeSubMode && key == 'c') { // tested
|
||||
moveDown(count() - 1);
|
||||
moveToEndOfLine();
|
||||
moveLeft();
|
||||
setAnchor();
|
||||
moveDown(count());
|
||||
moveToStartOfLine();
|
||||
setTargetColumn();
|
||||
moveUp(count() - 1);
|
||||
m_moveType = MoveLineWise;
|
||||
finishMovement("c");
|
||||
} else if (m_submode == DeleteSubMode && key == 'd') {
|
||||
m_lastInsertion.clear();
|
||||
setDotCommand("%1cc", count());
|
||||
finishMovement();
|
||||
} else if (m_submode == DeleteSubMode && key == 'd') { // tested
|
||||
moveToStartOfLine();
|
||||
setAnchor();
|
||||
moveDown(count());
|
||||
@@ -868,19 +891,19 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
|
||||
setAnchor();
|
||||
moveDown(count() - 1);
|
||||
m_moveType = MoveLineWise;
|
||||
m_dotCommand = QString("%1<<").arg(count());
|
||||
setDotCommand("%1<<", count());
|
||||
finishMovement();
|
||||
} else if (m_submode == ShiftRightSubMode && key == '>') {
|
||||
setAnchor();
|
||||
moveDown(count() - 1);
|
||||
m_moveType = MoveLineWise;
|
||||
m_dotCommand = QString("%1>>").arg(count());
|
||||
setDotCommand("%1>>", count());
|
||||
finishMovement();
|
||||
} else if (m_submode == IndentSubMode && key == '=') {
|
||||
setAnchor();
|
||||
moveDown(count() - 1);
|
||||
m_moveType = MoveLineWise;
|
||||
m_dotCommand = QString("%1>>").arg(count());
|
||||
setDotCommand("%1>>", count());
|
||||
finishMovement();
|
||||
} else if (m_submode == ZSubMode) {
|
||||
//qDebug() << "Z_MODE " << cursorLineInDocument() << linesOnScreen();
|
||||
@@ -927,7 +950,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
|
||||
m_tc.insertText(QString(count(), text.at(0)));
|
||||
m_moveType = MoveExclusive;
|
||||
m_submode = NoSubMode;
|
||||
m_dotCommand = QString("%1r%2").arg(count()).arg(text);
|
||||
setDotCommand("%1r" + text, count());
|
||||
finishMovement();
|
||||
} else {
|
||||
m_submode = NoSubMode;
|
||||
@@ -1072,6 +1095,8 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
|
||||
m_mode = InsertMode;
|
||||
moveToEndOfLine();
|
||||
m_lastInsertion.clear();
|
||||
} else if (key == control('a')) {
|
||||
// FIXME: eat it to prevent the global "select all" shortcut to trigger
|
||||
} else if (key == 'b') {
|
||||
m_moveType = MoveExclusive;
|
||||
moveToWordBoundary(false, false);
|
||||
@@ -1124,7 +1149,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
|
||||
handleStartOfLine();
|
||||
scrollToLineInDocument(cursorLineInDocument() - sline);
|
||||
finishMovement();
|
||||
} else if (key == 'e') {
|
||||
} else if (key == 'e') { // tested
|
||||
m_moveType = MoveInclusive;
|
||||
moveToWordBoundary(false, true);
|
||||
finishMovement();
|
||||
@@ -1174,13 +1199,13 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
|
||||
handleStartOfLine();
|
||||
finishMovement();
|
||||
} else if (key == 'i') {
|
||||
m_dotCommand = "i"; //QString("%1i").arg(count());
|
||||
setDotCommand("i"); // setDotCommand("%1i", count());
|
||||
enterInsertMode();
|
||||
updateMiniBuffer();
|
||||
if (atEndOfLine())
|
||||
moveLeft();
|
||||
} else if (key == 'I') {
|
||||
m_dotCommand = "I"; //QString("%1I").arg(count());
|
||||
setDotCommand("I"); // setDotCommand("%1I", count());
|
||||
enterInsertMode();
|
||||
if (m_gflag)
|
||||
moveToStartOfLine();
|
||||
@@ -1255,7 +1280,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
|
||||
search(lastSearchString(), !m_lastSearchForward);
|
||||
recordJump();
|
||||
} else if (key == 'o' || key == 'O') {
|
||||
m_dotCommand = QString("%1o").arg(count());
|
||||
setDotCommand("%1o", count());
|
||||
enterInsertMode();
|
||||
moveToFirstNonBlankOnLine();
|
||||
if (key == 'O')
|
||||
@@ -1292,18 +1317,18 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
|
||||
moveLeft();
|
||||
}
|
||||
}
|
||||
m_dotCommand = QString("%1p").arg(count());
|
||||
setDotCommand("%1p", count());
|
||||
finishMovement();
|
||||
} else if (key == 'r') {
|
||||
m_submode = ReplaceSubMode;
|
||||
m_dotCommand = "r";
|
||||
setDotCommand("r");
|
||||
} else if (key == 'R') {
|
||||
// FIXME: right now we repeat the insertion count() times,
|
||||
// but not the deletion
|
||||
m_lastInsertion.clear();
|
||||
m_mode = InsertMode;
|
||||
m_submode = ReplaceSubMode;
|
||||
m_dotCommand = "R";
|
||||
setDotCommand("R");
|
||||
} else if (key == control('r')) {
|
||||
redo();
|
||||
} else if (key == 's') {
|
||||
@@ -1312,7 +1337,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
|
||||
setAnchor();
|
||||
moveRight(qMin(count(), rightDist()));
|
||||
m_registers[m_register] = removeSelectedText();
|
||||
m_dotCommand = "s"; //QString("%1s").arg(count());
|
||||
setDotCommand("s"); // setDotCommand("%1s", count());
|
||||
m_opcount.clear();
|
||||
m_mvcount.clear();
|
||||
enterInsertMode();
|
||||
@@ -1339,7 +1364,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
|
||||
enterVisualMode(VisualLineMode);
|
||||
} else if (key == control('v')) {
|
||||
enterVisualMode(VisualBlockMode);
|
||||
} else if (key == 'w') {
|
||||
} else if (key == 'w') { // tested
|
||||
// Special case: "cw" and "cW" work the same as "ce" and "cE" if the
|
||||
// cursor is on a non-blank.
|
||||
if (m_submode == ChangeSubMode) {
|
||||
@@ -1368,7 +1393,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
|
||||
setAnchor();
|
||||
m_submode = DeleteSubMode;
|
||||
moveRight(qMin(count(), rightDist()));
|
||||
m_dotCommand = QString("%1x").arg(count());
|
||||
setDotCommand("%1x", count());
|
||||
finishMovement();
|
||||
} else if (key == 'X') {
|
||||
if (leftDist() > 0) {
|
||||
@@ -1998,16 +2023,16 @@ void FakeVimHandler::Private::highlightMatches(const QString &needle0)
|
||||
|
||||
void FakeVimHandler::Private::moveToFirstNonBlankOnLine()
|
||||
{
|
||||
QTextBlock block = m_tc.block();
|
||||
QTextDocument *doc = m_tc.document();
|
||||
m_tc.movePosition(StartOfLine, KeepAnchor);
|
||||
int firstPos = m_tc.position();
|
||||
const QTextBlock &block = m_tc.block();
|
||||
int firstPos = block.position();
|
||||
for (int i = firstPos, n = firstPos + block.length(); i < n; ++i) {
|
||||
if (!doc->characterAt(i).isSpace()) {
|
||||
m_tc.setPosition(i, KeepAnchor);
|
||||
setPosition(i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
setPosition(block.position());
|
||||
}
|
||||
|
||||
void FakeVimHandler::Private::indentRegion(QChar typedChar)
|
||||
@@ -2019,7 +2044,7 @@ void FakeVimHandler::Private::indentRegion(QChar typedChar)
|
||||
qSwap(beginLine, endLine);
|
||||
int amount = 0;
|
||||
emit q->indentRegion(&amount, beginLine, endLine, typedChar);
|
||||
m_dotCommand = QString("%1==").arg(endLine - beginLine + 1);
|
||||
setDotCommand("%1==", endLine - beginLine + 1);
|
||||
}
|
||||
|
||||
void FakeVimHandler::Private::shiftRegionRight(int repeat)
|
||||
@@ -2041,7 +2066,7 @@ void FakeVimHandler::Private::shiftRegionRight(int repeat)
|
||||
|
||||
setPosition(firstPos);
|
||||
moveToFirstNonBlankOnLine();
|
||||
m_dotCommand = QString("%1>>").arg(endLine - beginLine + 1);
|
||||
setDotCommand("%1>>", endLine - beginLine + 1);
|
||||
}
|
||||
|
||||
void FakeVimHandler::Private::shiftRegionLeft(int repeat)
|
||||
@@ -2078,17 +2103,20 @@ void FakeVimHandler::Private::shiftRegionLeft(int repeat)
|
||||
|
||||
setPosition(firstPos);
|
||||
moveToFirstNonBlankOnLine();
|
||||
m_dotCommand = QString("%1<<").arg(endLine - beginLine + 1);
|
||||
setDotCommand("%1<<", endLine - beginLine + 1);
|
||||
}
|
||||
|
||||
void FakeVimHandler::Private::moveToTargetColumn()
|
||||
{
|
||||
if (m_targetColumn == -1 || m_tc.block().length() <= m_targetColumn) {
|
||||
const QTextBlock &block = m_tc.block();
|
||||
const QTextBlock &block = m_tc.block();
|
||||
int col = m_tc.position() - m_tc.block().position();
|
||||
if (col == m_targetColumn)
|
||||
return;
|
||||
//qDebug() << "CORRECTING COLUMN FROM: " << col << "TO" << m_targetColumn;
|
||||
if (m_targetColumn == -1 || m_tc.block().length() <= m_targetColumn)
|
||||
m_tc.setPosition(block.position() + block.length() - 1, KeepAnchor);
|
||||
} else {
|
||||
else
|
||||
m_tc.setPosition(m_tc.block().position() + m_targetColumn, KeepAnchor);
|
||||
}
|
||||
}
|
||||
|
||||
/* if simple is given:
|
||||
@@ -2116,7 +2144,7 @@ void FakeVimHandler::Private::moveToWordBoundary(bool simple, bool forward)
|
||||
int lastClass = -1;
|
||||
while (true) {
|
||||
QChar c = doc->characterAt(m_tc.position() + (forward ? 1 : -1));
|
||||
qDebug() << "EXAMINING: " << c << " AT " << position();
|
||||
//qDebug() << "EXAMINING: " << c << " AT " << position();
|
||||
int thisClass = charClass(c, simple);
|
||||
if (thisClass != lastClass && lastClass != 0)
|
||||
--repeat;
|
||||
@@ -2360,6 +2388,7 @@ QString FakeVimHandler::Private::removeSelectedText()
|
||||
m_tc.setPosition(pos, KeepAnchor);
|
||||
QString from = m_tc.selection().toPlainText();
|
||||
m_tc.removeSelectedText();
|
||||
setAnchor();
|
||||
return from;
|
||||
}
|
||||
|
||||
|
||||
@@ -602,6 +602,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
|
||||
addAutoReleasedObject(new ProjectTreeWidgetFactory);
|
||||
addAutoReleasedObject(new FolderNavigationWidgetFactory);
|
||||
|
||||
// > -- Creator 1.0 compatibility code
|
||||
QStringList oldRecentProjects;
|
||||
if (QSettings *s = core->settings())
|
||||
oldRecentProjects = s->value("ProjectExplorer/RecentProjects/Files", QStringList()).toStringList();
|
||||
@@ -616,6 +617,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
|
||||
foreach(const QString &s, oldRecentProjects) {
|
||||
m_recentProjects.append(qMakePair(s, QFileInfo(s).fileName()));
|
||||
}
|
||||
// < -- Creator 1.0 compatibility code
|
||||
|
||||
// TODO restore recentProjects
|
||||
if (QSettings *s = core->settings()) {
|
||||
@@ -623,7 +625,8 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
|
||||
const QStringList displayNames = s->value("ProjectExplorer/RecentProjects/DisplayNames").toStringList();
|
||||
if (fileNames.size() == displayNames.size()) {
|
||||
for (int i = 0; i < fileNames.size(); ++i) {
|
||||
m_recentProjects.append(qMakePair(fileNames.at(i), displayNames.at(i)));
|
||||
if (QFileInfo(fileNames.at(i)).isFile())
|
||||
m_recentProjects.append(qMakePair(fileNames.at(i), displayNames.at(i)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1424,17 +1424,13 @@ QString QtVersion::buildDebuggingHelperLibrary()
|
||||
if (!success)
|
||||
continue;
|
||||
|
||||
output += QString("Building debugging helper library in %1\n").arg(directory);
|
||||
output += "\n";
|
||||
output += QString("Runinng %1 ...\n").arg(qmakeCommand());
|
||||
// Setup process
|
||||
QProcess proc;
|
||||
|
||||
QProcess qmake;
|
||||
ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment();
|
||||
addToEnvironment(env);
|
||||
|
||||
// TODO this is a hack to get, to be removed and rewritten for 1.2
|
||||
//
|
||||
// For MSVC and MINGW, we need a toolchain to get the right environment
|
||||
// For MSVC and MINGW, we need a toolchain to get the right environment
|
||||
ProjectExplorer::ToolChain *toolChain = 0;
|
||||
ProjectExplorer::ToolChain::ToolChainType t = toolchainType();
|
||||
if (t == ProjectExplorer::ToolChain::MinGW)
|
||||
@@ -1447,23 +1443,20 @@ QString QtVersion::buildDebuggingHelperLibrary()
|
||||
toolChain = 0;
|
||||
}
|
||||
|
||||
qmake.setEnvironment(env.toStringList());
|
||||
qmake.setWorkingDirectory(directory);
|
||||
qmake.setProcessChannelMode(QProcess::MergedChannels);
|
||||
proc.setEnvironment(env.toStringList());
|
||||
proc.setWorkingDirectory(directory);
|
||||
proc.setProcessChannelMode(QProcess::MergedChannels);
|
||||
|
||||
qmake.start(qmakeCommand(), QStringList()<<"-spec"<< mkspec() <<"gdbmacros.pro");
|
||||
qmake.waitForFinished();
|
||||
|
||||
output += qmake.readAll();
|
||||
output += QString("Building debugging helper library in %1\n").arg(directory);
|
||||
output += "\n";
|
||||
|
||||
QString make;
|
||||
// TODO this is butt ugly
|
||||
// only qt4projects have a toolchain() method. (Reason mostly, that in order to create
|
||||
// the toolchain, we need to have the path to gcc
|
||||
// which might depend on environment settings of the project
|
||||
// so we hardcode the toolchainType to make conversation here
|
||||
// and think about how to fix that later
|
||||
|
||||
QString make;
|
||||
if (t == ProjectExplorer::ToolChain::MinGW)
|
||||
make = "mingw32-make.exe";
|
||||
else if(t == ProjectExplorer::ToolChain::MSVC || t == ProjectExplorer::ToolChain::WINCE)
|
||||
@@ -1472,12 +1465,29 @@ QString QtVersion::buildDebuggingHelperLibrary()
|
||||
make = "make";
|
||||
|
||||
QString makeFullPath = env.searchInPath(make);
|
||||
if (!makeFullPath.isEmpty()) {
|
||||
output += QString("Running %1 clean...\n").arg(makeFullPath);
|
||||
proc.start(makeFullPath, QStringList() << "clean");
|
||||
proc.waitForFinished();
|
||||
output += proc.readAll();
|
||||
} else {
|
||||
output += QString("%1 not found in PATH\n").arg(make);
|
||||
break;
|
||||
}
|
||||
|
||||
output += QString("\nRuninng %1 ...\n").arg(qmakeCommand());
|
||||
|
||||
proc.start(qmakeCommand(), QStringList()<<"-spec"<< mkspec() <<"gdbmacros.pro");
|
||||
proc.waitForFinished();
|
||||
|
||||
output += proc.readAll();
|
||||
|
||||
output += "\n";
|
||||
if (!makeFullPath.isEmpty()) {
|
||||
output += QString("Running %1 ...\n").arg(makeFullPath);
|
||||
qmake.start(makeFullPath, QStringList());
|
||||
qmake.waitForFinished();
|
||||
output += qmake.readAll();
|
||||
proc.start(makeFullPath, QStringList());
|
||||
proc.waitForFinished();
|
||||
output += proc.readAll();
|
||||
} else {
|
||||
output += QString("%1 not found in PATH\n").arg(make);
|
||||
}
|
||||
|
||||
@@ -346,14 +346,15 @@ bool ProFileEvaluator::Private::parseLine(const QString &line0)
|
||||
m_contNextLine = escaped;
|
||||
if (escaped) {
|
||||
m_proitem.chop(1);
|
||||
updateItem();
|
||||
return true;
|
||||
} else {
|
||||
if (!m_syntaxError) {
|
||||
updateItem();
|
||||
if (!m_contNextLine)
|
||||
finalizeBlock();
|
||||
finalizeBlock();
|
||||
return true;
|
||||
}
|
||||
return !m_syntaxError;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -235,26 +235,26 @@ examples/xml/xmlstreamlint/xmlstreamlint
|
||||
examples/xmlpatterns/filetree/filetree
|
||||
examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel
|
||||
examples/xmlpatterns/recipes/recipes
|
||||
lib/libQt3Support.so.4.5.0
|
||||
lib/libQtAssistantClient.so.4.5.0
|
||||
lib/libQtCLucene.so.4.5.0
|
||||
lib/libQtCore.so.4.5.0
|
||||
lib/libQtDBus.so.4.5.0
|
||||
lib/libQtDesigner.so.4.5.0
|
||||
lib/libQtDesignerComponents.so.4.5.0
|
||||
lib/libQtGui.so.4.5.0
|
||||
lib/libQtHelp.so.4.5.0
|
||||
lib/libQtNetwork.so.4.5.0
|
||||
lib/libQtOpenGL.so.4.5.0
|
||||
lib/libQtScript.so.4.5.0
|
||||
lib/libQtScriptTools.so.4.5.0
|
||||
lib/libQtSql.so.4.5.0
|
||||
lib/libQtSvg.so.4.5.0
|
||||
lib/libQtTest.so.4.5.0
|
||||
lib/libQt3Support.so.4.5.1
|
||||
lib/libQtAssistantClient.so.4.5.1
|
||||
lib/libQtCLucene.so.4.5.1
|
||||
lib/libQtCore.so.4.5.1
|
||||
lib/libQtDBus.so.4.5.1
|
||||
lib/libQtDesigner.so.4.5.1
|
||||
lib/libQtDesignerComponents.so.4.5.1
|
||||
lib/libQtGui.so.4.5.1
|
||||
lib/libQtHelp.so.4.5.1
|
||||
lib/libQtNetwork.so.4.5.1
|
||||
lib/libQtOpenGL.so.4.5.1
|
||||
lib/libQtScript.so.4.5.1
|
||||
lib/libQtScriptTools.so.4.5.1
|
||||
lib/libQtSql.so.4.5.1
|
||||
lib/libQtSvg.so.4.5.1
|
||||
lib/libQtTest.so.4.5.1
|
||||
lib/libQtUiTools.a
|
||||
lib/libQtWebKit.so.4.5.0
|
||||
lib/libQtXml.so.4.5.0
|
||||
lib/libQtXmlPatterns.so.4.5.0
|
||||
lib/libQtWebKit.so.4.5.1
|
||||
lib/libQtXml.so.4.5.1
|
||||
lib/libQtXmlPatterns.so.4.5.1
|
||||
plugins/accessible/libqtaccessiblecompatwidgets.so
|
||||
plugins/accessible/libqtaccessiblewidgets.so
|
||||
plugins/codecs/libqcncodecs.so
|
||||
|
||||
Reference in New Issue
Block a user