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:
Friedemann Kleint
2009-08-07 14:10:36 +02:00
parent 50fb8bfb03
commit debb3961c2
6 changed files with 346 additions and 204 deletions

View File

@@ -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&nbsp;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()