forked from qt-creator/qt-creator
Debugger: Improve the helper build mechanism on the settings page.
- Give the controls a tooltip listing file details (date) - Make building a QtConcurrent task - Make log window scroll to bottom and pop up on error - Make the build code pass on error messages about copying the source files to the log file - Clean up the building code string-wise, use QLatin1String and translate messages, cache the icons
This commit is contained in:
@@ -3,14 +3,43 @@
|
||||
#include "ui_qtversionmanager.h"
|
||||
#include "qt4projectmanagerconstants.h"
|
||||
#include "qtversionmanager.h"
|
||||
#include <coreplugin/coreconstants.h>
|
||||
#include <utils/treewidgetcolumnstretcher.h>
|
||||
|
||||
#include <coreplugin/coreconstants.h>
|
||||
#include <coreplugin/icore.h>
|
||||
#include <coreplugin/progressmanager/progressmanager.h>
|
||||
#include <utils/treewidgetcolumnstretcher.h>
|
||||
#include <utils/qtcassert.h>
|
||||
|
||||
#include <QtCore/QFuture>
|
||||
#include <QtCore/QtConcurrentRun>
|
||||
#include <QtCore/QDebug>
|
||||
#include <QtCore/QDir>
|
||||
#include <QtCore/QDateTime>
|
||||
|
||||
using namespace Qt4ProjectManager;
|
||||
using namespace Qt4ProjectManager::Internal;
|
||||
|
||||
///
|
||||
// DebuggingHelperBuildTask
|
||||
///
|
||||
|
||||
DebuggingHelperBuildTask::DebuggingHelperBuildTask(const QtVersion &version) :
|
||||
m_version(new QtVersion(version))
|
||||
{
|
||||
}
|
||||
|
||||
DebuggingHelperBuildTask::~DebuggingHelperBuildTask()
|
||||
{
|
||||
delete m_version;
|
||||
}
|
||||
|
||||
void DebuggingHelperBuildTask::run()
|
||||
{
|
||||
const QString output = m_version->buildDebuggingHelperLibrary();
|
||||
emit finished(m_version->name(), output);
|
||||
deleteLater();
|
||||
}
|
||||
|
||||
///
|
||||
// QtOptionsPage
|
||||
///
|
||||
@@ -65,6 +94,11 @@ void QtOptionsPage::apply()
|
||||
|
||||
QtOptionsPageWidget::QtOptionsPageWidget(QWidget *parent, QList<QtVersion *> versions, QtVersion *defaultVersion)
|
||||
: QWidget(parent)
|
||||
, m_debuggingHelperOkPixmap(QLatin1String(":/extensionsystem/images/ok.png"))
|
||||
, m_debuggingHelperErrorPixmap(QLatin1String(":/extensionsystem/images/error.png"))
|
||||
, m_debuggingHelperOkIcon(m_debuggingHelperOkPixmap)
|
||||
, m_debuggingHelperErrorIcon(m_debuggingHelperErrorPixmap)
|
||||
|
||||
, m_defaultVersion(versions.indexOf(defaultVersion))
|
||||
, m_specifyNameString(tr("<specify a name>"))
|
||||
, m_specifyPathString(tr("<specify a path>"))
|
||||
@@ -106,10 +140,7 @@ QtOptionsPageWidget::QtOptionsPageWidget(QWidget *parent, QList<QtVersion *> ver
|
||||
item->setData(0, Qt::UserRole, version->uniqueId());
|
||||
|
||||
if (version->isValid()) {
|
||||
if (version->hasDebuggingHelper())
|
||||
item->setData(2, Qt::DecorationRole, QIcon(":/extensionsystem/images/ok.png"));
|
||||
else
|
||||
item->setData(2, Qt::DecorationRole, QIcon(":/extensionsystem/images/error.png"));
|
||||
item->setData(2, Qt::DecorationRole, version->hasDebuggingHelper() ? m_debuggingHelperOkIcon : m_debuggingHelperErrorIcon);
|
||||
} else {
|
||||
item->setData(2, Qt::DecorationRole, QIcon());
|
||||
}
|
||||
@@ -160,27 +191,62 @@ QtOptionsPageWidget::QtOptionsPageWidget(QWidget *parent, QList<QtVersion *> ver
|
||||
updateState();
|
||||
}
|
||||
|
||||
QtVersion *QtOptionsPageWidget::currentVersion() const
|
||||
{
|
||||
if (QTreeWidgetItem *currentItem = m_ui->qtdirList->currentItem()) {
|
||||
const int currentItemIndex = indexForTreeItem(currentItem);
|
||||
if (currentItemIndex >= 0 && currentItemIndex < m_versions.size())
|
||||
return m_versions.at(currentItemIndex);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int findVersionByName(const QList<QtVersion *> &l, const QString &name)
|
||||
{
|
||||
const int size = l.size();
|
||||
for (int i = 0; i < size; i++)
|
||||
if (l.at(i)->name() == name)
|
||||
return i;
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Update with results of terminated helper build
|
||||
void QtOptionsPageWidget::debuggingHelperBuildFinished(const QString &name, const QString &output)
|
||||
{
|
||||
const int index = findVersionByName(m_versions, name);
|
||||
if (index == -1)
|
||||
return; // Oops, somebody managed to delete the version
|
||||
// Update item view
|
||||
QtVersion *version = m_versions.at(index);
|
||||
QTreeWidgetItem *item = treeItemForIndex(index);
|
||||
QTC_ASSERT(item, return)
|
||||
item->setData(2, Qt::UserRole, output);
|
||||
const bool success = version->hasDebuggingHelper();
|
||||
item->setData(2, Qt::DecorationRole, success ? m_debuggingHelperOkIcon : m_debuggingHelperErrorIcon);
|
||||
|
||||
// Update bottom control if the selection is still the same
|
||||
if (version == currentVersion()) {
|
||||
m_ui->showLogButton->setEnabled(true);
|
||||
updateDebuggingHelperStateLabel(version);
|
||||
if (!success)
|
||||
showDebuggingBuildLog();
|
||||
}
|
||||
}
|
||||
|
||||
void QtOptionsPageWidget::buildDebuggingHelper()
|
||||
{
|
||||
// Find the qt version for this button..
|
||||
QTreeWidgetItem *currentItem = m_ui->qtdirList->currentItem();
|
||||
int currentItemIndex = indexForTreeItem(currentItem);
|
||||
if (currentItemIndex < 0)
|
||||
return;
|
||||
|
||||
QtVersion *version = m_versions[currentItemIndex];
|
||||
|
||||
QString result = m_versions.at(currentItemIndex)->buildDebuggingHelperLibrary();
|
||||
currentItem->setData(2, Qt::UserRole, result);
|
||||
|
||||
if (version->hasDebuggingHelper()) {
|
||||
m_ui->debuggingHelperStateLabel->setPixmap(QPixmap(":/extensionsystem/images/ok.png"));
|
||||
currentItem->setData(2, Qt::DecorationRole, QIcon(":/extensionsystem/images/ok.png"));
|
||||
} else {
|
||||
m_ui->debuggingHelperStateLabel->setPixmap(QPixmap(":/extensionsystem/images/error.png"));
|
||||
currentItem->setData(2, Qt::DecorationRole, QIcon(":/extensionsystem/images/error.png"));
|
||||
if (QtVersion *version = currentVersion()) {
|
||||
m_ui->showLogButton->setEnabled(false);
|
||||
// Run a debugging helper build task in the background.
|
||||
DebuggingHelperBuildTask *buildTask = new DebuggingHelperBuildTask(*version);
|
||||
connect(buildTask, SIGNAL(finished(QString,QString)), this, SLOT(debuggingHelperBuildFinished(QString,QString)),
|
||||
Qt::QueuedConnection);
|
||||
QFuture<void> task = QtConcurrent::run(buildTask, &DebuggingHelperBuildTask::run);
|
||||
const QString taskName = tr("Building helpers");
|
||||
Core::ICore::instance()->progressManager()->addTask(task, taskName,
|
||||
QLatin1String("Qt4ProjectManager::BuildHelpers"),
|
||||
Core::ProgressManager::CloseOnSuccess);
|
||||
}
|
||||
m_ui->showLogButton->setEnabled(true);
|
||||
}
|
||||
|
||||
void QtOptionsPageWidget::showDebuggingBuildLog()
|
||||
@@ -190,10 +256,13 @@ void QtOptionsPageWidget::showDebuggingBuildLog()
|
||||
int currentItemIndex = indexForTreeItem(currentItem);
|
||||
if (currentItemIndex < 0)
|
||||
return;
|
||||
// Show text and scroll to bottom
|
||||
QDialog dlg;
|
||||
Ui_ShowBuildLog ui;
|
||||
ui.setupUi(&dlg);
|
||||
ui.log->setPlainText(currentItem->data(2, Qt::UserRole).toString());
|
||||
ui.log->moveCursor(QTextCursor::End);
|
||||
ui.log->ensureCursorVisible();
|
||||
dlg.exec();
|
||||
}
|
||||
|
||||
@@ -243,12 +312,41 @@ void QtOptionsPageWidget::removeQtDir()
|
||||
updateState();
|
||||
}
|
||||
|
||||
// Format html table tooltip about helpers
|
||||
static inline QString msgHtmlHelperToolTip(const QFileInfo &fi)
|
||||
{
|
||||
return QtOptionsPageWidget::tr("<html><body><table><tr><td>File:</td><td><pre>%1</pre></td></tr>"
|
||||
"<tr><td>Last modified:</td><td>%2</td></tr>"
|
||||
"<tr><td>Size:</td><td>%3 Bytes</td></tr></table></body></html>").
|
||||
arg(fi.absoluteFilePath()).
|
||||
arg(fi.lastModified().toString(Qt::SystemLocaleLongDate)).
|
||||
arg(fi.size());
|
||||
}
|
||||
|
||||
// Update the state label with a pixmap and set a tooltip describing
|
||||
// the file on neighbouring controls.
|
||||
void QtOptionsPageWidget::updateDebuggingHelperStateLabel(const QtVersion *version)
|
||||
{
|
||||
QString tooltip;
|
||||
if (version && version->isValid()) {
|
||||
const bool hasHelper = version->hasDebuggingHelper();
|
||||
m_ui->debuggingHelperStateLabel->setPixmap(hasHelper ? m_debuggingHelperOkPixmap : m_debuggingHelperErrorPixmap);
|
||||
if (hasHelper)
|
||||
tooltip = msgHtmlHelperToolTip(QFileInfo(version->debuggingHelperLibrary()));
|
||||
} else {
|
||||
m_ui->debuggingHelperStateLabel->setPixmap(QPixmap());
|
||||
}
|
||||
m_ui->debuggingHelperStateLabel->setToolTip(tooltip);
|
||||
m_ui->debuggingHelperLabel->setToolTip(tooltip);
|
||||
m_ui->showLogButton->setToolTip(tooltip);
|
||||
m_ui->rebuildButton->setToolTip(tooltip);
|
||||
}
|
||||
|
||||
void QtOptionsPageWidget::updateState()
|
||||
{
|
||||
int currentIndex = indexForTreeItem(m_ui->qtdirList->currentItem());
|
||||
bool enabled = (currentIndex >= 0);
|
||||
bool isAutodetected = (enabled
|
||||
&& m_versions.at(currentIndex)->isAutodetected());
|
||||
const QtVersion *version = currentVersion();
|
||||
const bool enabled = version != 0;
|
||||
const bool isAutodetected = enabled && version->isAutodetected();
|
||||
m_ui->delButton->setEnabled(enabled && !isAutodetected);
|
||||
m_ui->nameEdit->setEnabled(enabled && !isAutodetected);
|
||||
m_ui->qtPath->setEnabled(enabled && !isAutodetected);
|
||||
@@ -257,15 +355,9 @@ void QtOptionsPageWidget::updateState()
|
||||
bool hasLog = enabled && !m_ui->qtdirList->currentItem()->data(2, Qt::UserRole).toString().isEmpty();
|
||||
m_ui->showLogButton->setEnabled(hasLog);
|
||||
|
||||
QtVersion *version = 0;
|
||||
if (enabled)
|
||||
version = m_versions.at(currentIndex);
|
||||
if (version) {
|
||||
m_ui->rebuildButton->setEnabled(version->isValid());
|
||||
if (version->hasDebuggingHelper())
|
||||
m_ui->debuggingHelperStateLabel->setPixmap(QPixmap(":/extensionsystem/images/ok.png"));
|
||||
else
|
||||
m_ui->debuggingHelperStateLabel->setPixmap(QPixmap(":/extensionsystem/images/error.png"));
|
||||
updateDebuggingHelperStateLabel(version);
|
||||
} else {
|
||||
m_ui->rebuildButton->setEnabled(false);
|
||||
m_ui->debuggingHelperStateLabel->setPixmap(QPixmap());
|
||||
@@ -358,11 +450,11 @@ void QtOptionsPageWidget::showEnvironmentPage(QTreeWidgetItem *item)
|
||||
}
|
||||
}
|
||||
|
||||
int QtOptionsPageWidget::indexForTreeItem(QTreeWidgetItem *item) const
|
||||
int QtOptionsPageWidget::indexForTreeItem(const QTreeWidgetItem *item) const
|
||||
{
|
||||
if (!item || !item->parent())
|
||||
return -1;
|
||||
int uniqueId = item->data(0, Qt::UserRole).toInt();
|
||||
const int uniqueId = item->data(0, Qt::UserRole).toInt();
|
||||
for (int index = 0; index < m_versions.size(); ++index) {
|
||||
if (m_versions.at(index)->uniqueId() == uniqueId)
|
||||
return index;
|
||||
@@ -507,16 +599,10 @@ void QtOptionsPageWidget::updateCurrentQtPath()
|
||||
|
||||
showEnvironmentPage(currentItem);
|
||||
|
||||
if (m_versions[currentItemIndex]->isValid()) {
|
||||
bool hasLog = !currentItem->data(2, Qt::UserRole).toString().isEmpty();
|
||||
bool hasHelper = m_versions[currentItemIndex]->hasDebuggingHelper();
|
||||
if (hasHelper) {
|
||||
currentItem->setData(2, Qt::DecorationRole, QIcon(":/extensionsystem/images/ok.png"));
|
||||
m_ui->debuggingHelperStateLabel->setPixmap(QPixmap(":/extensionsystem/images/ok.png"));
|
||||
} else {
|
||||
currentItem->setData(2, Qt::DecorationRole, QIcon(":/extensionsystem/images/error.png"));
|
||||
m_ui->debuggingHelperStateLabel->setPixmap(QPixmap(":/extensionsystem/images/error.png"));
|
||||
}
|
||||
const QtVersion *version = m_versions.at(currentItemIndex);
|
||||
if (version->isValid()) {
|
||||
const bool hasLog = !currentItem->data(2, Qt::UserRole).toString().isEmpty();
|
||||
currentItem->setData(2, Qt::DecorationRole, version->hasDebuggingHelper() ? m_debuggingHelperOkIcon : m_debuggingHelperErrorIcon);
|
||||
m_ui->showLogButton->setEnabled(hasLog);
|
||||
m_ui->rebuildButton->setEnabled(true);
|
||||
} else {
|
||||
@@ -524,6 +610,7 @@ void QtOptionsPageWidget::updateCurrentQtPath()
|
||||
m_ui->debuggingHelperStateLabel->setPixmap(QPixmap());
|
||||
m_ui->rebuildButton->setEnabled(true);
|
||||
}
|
||||
updateDebuggingHelperStateLabel(version);
|
||||
}
|
||||
|
||||
void QtOptionsPageWidget::updateCurrentMingwDirectory()
|
||||
|
||||
Reference in New Issue
Block a user