diff options
Diffstat (limited to 'src/tools/gui/toolchain_config_widget.cpp')
-rw-r--r-- | src/tools/gui/toolchain_config_widget.cpp | 301 |
1 files changed, 301 insertions, 0 deletions
diff --git a/src/tools/gui/toolchain_config_widget.cpp b/src/tools/gui/toolchain_config_widget.cpp new file mode 100644 index 0000000..aede699 --- /dev/null +++ b/src/tools/gui/toolchain_config_widget.cpp @@ -0,0 +1,301 @@ +/*************************************************************************** + * Copyright (C) 2005-2006 Nicolas Hadacek <hadacek@kde.org> * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + ***************************************************************************/ +#include "toolchain_config_widget.h" + +#include <qlabel.h> +#include <qlayout.h> +#include <qtooltip.h> +#include <qgroupbox.h> +#include <qtabwidget.h> +#include <kiconloader.h> +#include <ktextedit.h> + +#include "tools/list/compile_config.h" +#include "common/gui/purl_gui.h" +#include "common/global/process.h" +#include "common/gui/container.h" + +//---------------------------------------------------------------------------- +ToolchainConfigWidget::ToolchainConfigWidget(const Tool::Group &group, QWidget *parent) + : ::ConfigWidget(parent), + _group(group), _dirty(false), _outputType(0), _devicesData(group.nbCheckDevices()) +{ + _config = group.createConfig(0); +} + +ToolchainConfigWidget::~ToolchainConfigWidget() +{ + delete _config; +} + +void ToolchainConfigWidget::init() +{ + Container *container = new Container(this, Container::Sunken); + addWidget(container, 0,0, 0,3); + container->setColStretch(3, 1); + + uint row = 0; + QLabel *label = new QLabel(Compile::DirectoryType(Compile::DirectoryType::Executable).label() + ":", container); + container->addWidget(label, row,row, 0,0); + _dirs[Compile::DirectoryType::Executable] = new PURL::DirectoryWidget(container); + connect(_dirs[Compile::DirectoryType::Executable], SIGNAL(changed()), SLOT(forceDetect())); + container->addWidget(_dirs[Compile::DirectoryType::Executable], row,row, 1,3); + row++; + + label = new QLabel(i18n("Executable Type:"), container); + container->addWidget(label, row,row, 0,0); + _execType = new QComboBox(container); + FOR_EACH(Tool::ExecutableType, type) _execType->insertItem(type.label()); + connect(_execType, SIGNAL(activated(int)), SLOT(forceDetect())); + container->addWidget(_execType, row,row, 1,2); + row++; + + uint nbOutputTypes = 0; + FOR_EACH(Tool::OutputExecutableType, type) + if ( _group.hasOutputExecutableType(type) ) nbOutputTypes++; + if ( nbOutputTypes>1 ) { + label = new QLabel(i18n("Output Executable Type:"), container); + container->addWidget(label, row,row, 0,0); + _outputType = new KeyComboBox<Tool::OutputExecutableType>(container); + FOR_EACH(Tool::OutputExecutableType, type) + if ( _group.hasOutputExecutableType(type) ) _outputType->appendItem(type, type.label()); + connect(_outputType->widget(), SIGNAL(activated(int)), SLOT(forceDetect())); + container->addWidget(_outputType->widget(), row,row, 1,1); + row++; + } + + addCustomExecutableOptions(container); + + FOR_EACH(Tool::Category, k) { + const Tool::Base *base = _group.base(k); + if ( base==0 ) continue; + label = new QLabel(k.label(), container); + container->addWidget(label, row,row, 0,0); + _data[k].label = new QLabel(container); + container->addWidget(_data[k].label, row,row, 1,1); + _data[k].button = new KPushButton(KGuiItem(QString::null, "viewmag"), container); + connect(_data[k].button, SIGNAL(clicked()), SLOT(showDetails())); + container->addWidget(_data[k].button, row,row, 2,2); + row++; + } + + label = new QLabel(i18n("Device detection:"), container); + container->addWidget(label, row,row, 0,0); + _devicesLabel = new QLabel(container); + container->addWidget(_devicesLabel, row,row, 1,1); + KPushButton *button = new KPushButton(KGuiItem(QString::null, "viewmag"), container); + connect(button, SIGNAL(clicked()), SLOT(showDeviceDetails())); + container->addWidget(button, row,row, 2,2); + row++; + + row = numRows(); + FOR_EACH(Compile::DirectoryType, type) { + if ( type==Compile::DirectoryType::Executable ) continue; + if ( !_group.hasDirectory(type) ) _dirs[type] = 0; + else { + label = new QLabel(type.label() + ":", this); + addWidget(label, row,row, 0,0); + _dirs[type] = new PURL::DirectoryWidget(this); + addWidget(_dirs[type], row,row, 1,3); + row++; + } + } + + if ( !_group.comment().isEmpty() ) { + KTextEdit *w = new KTextEdit(_group.comment(), QString::null, this); + w->setReadOnly(true); + w->setWordWrap(QTextEdit::WidgetWidth); + addWidget(w, row,row, 0,3); + row++; + } + + setColStretch(3, 1); +} + +void ToolchainConfigWidget::loadConfig() +{ + _execType->blockSignals(true); + _execType->setCurrentItem(Compile::Config::withWine(_group) ? Tool::ExecutableType::Windows : Tool::ExecutableType::Unix); + _execType->blockSignals(false); + if (_outputType) { + _outputType->widget()->blockSignals(true); + _outputType->setCurrentItem(Compile::Config::outputExecutableType(_group)); + _outputType->widget()->blockSignals(false); + } + FOR_EACH(Compile::DirectoryType, type) { + if ( _dirs[type]==0 ) continue; + _dirs[type]->blockSignals(true); + _dirs[type]->setDirectory(Compile::Config::directory(_group, type)); + _dirs[type]->blockSignals(false); + } + _dirty = true; +} + +void ToolchainConfigWidget::saveConfig() +{ + Compile::Config::setWithWine(_group, withWine()); + if (_outputType) Compile::Config::setOutputExecutableType(_group, outputType()); + FOR_EACH(Compile::DirectoryType, type) + if ( _dirs[type] ) Compile::Config::setDirectory(_group, type, _dirs[type]->directory()); +} + +void ToolchainConfigWidget::forceDetect() +{ + _dirty = true; + detect(); +} + +void ToolchainConfigWidget::checkExecutableDone() +{ + FOR_EACH(Tool::Category, i) { + if ( _data[i].process!=sender() ) continue; + if ( _data[i].process->state()==::Process::Timedout ) { + _data[i].label->setText(i18n("Timeout")); + return; + } + _data[i].checkLines = _data[i].process->sout() + _data[i].process->serr(); + const Tool::Base *base = _group.base(i); + QString exec = base->baseExecutable(withWine(), outputType()); + if ( base->checkExecutableResult(withWine(), _data[i].checkLines) ) _data[i].label->setText(i18n("\"%1\" found").arg(exec)); + else _data[i].label->setText(i18n("\"%1\" not recognized").arg(exec)); + break; + } +} + +void ToolchainConfigWidget::checkDevicesDone() +{ + for(uint i=0; i<_devicesData.count(); i++) { + if ( _devicesData[i].process!=sender() ) continue; + if ( _devicesData[i].process->state()==::Process::Timedout ) { + _devicesLabel->setText(i18n("Timeout")); + return; + } + _devicesData[i].checkLines = _devicesData[i].process->sout() + _devicesData[i].process->serr(); + _devicesData[i].done = true; + break; + } + QValueList<const Device::Data *> list; + for(uint i=0; i<_devicesData.count(); i++) { + if ( !_devicesData[i].done ) return; + list += _group.getSupportedDevices(_devicesData[i].checkLines.join("\n")); + } + _devicesLabel->setText(i18n("Detected (%1)").arg(list.count())); +} + +bool ToolchainConfigWidget::withWine() const +{ + return ( _execType->currentItem()==Tool::ExecutableType::Windows ); +} + +Tool::OutputExecutableType ToolchainConfigWidget::outputType() const +{ + return (_outputType==0 ? Compile::Config::outputExecutableType(_group) : _outputType->currentItem()); +} + +QString ToolchainConfigWidget::baseExecutable(Tool::Category category) const +{ + return _group.base(category)->baseExecutable(withWine(), outputType()); +} + +::Process::LineOutput *ToolchainConfigWidget::checkExecutableProcess(Tool::Category category) const +{ + PURL::Directory execDir = _dirs[Compile::DirectoryType::Executable]->directory(); + return _group.base(category)->checkExecutableProcess(execDir, withWine(), outputType()); +} + +::Process::LineOutput *ToolchainConfigWidget::checkDevicesProcess(uint i) const +{ + PURL::Directory execDir = _dirs[Compile::DirectoryType::Executable]->directory(); + return _group.checkDevicesProcess(i, execDir, withWine()); +} + +void ToolchainConfigWidget::detect() +{ + if ( !_dirty ) return; + FOR_EACH(Tool::Category, k) { + if ( _data[k].label==0 ) continue; + if ( !_group.base(k)->checkExecutable() ) _data[k].label->setText(i18n("Unknown")); + else { + delete _data[k].process; + _data[k].checkLines.clear(); + _data[k].process = checkExecutableProcess(k); + _data[k].command = _data[k].process->prettyCommand(); + connect(_data[k].process, SIGNAL(done(int)), SLOT(checkExecutableDone())); + connect(_data[k].process, SIGNAL(timeout()), SLOT(checkExecutableDone())); + QString exec = baseExecutable(k); + if ( !_data[k].process->start(10000) ) _data[k].label->setText(i18n("\"%1\" not found").arg(exec)); + else _data[k].label->setText(i18n("Detecting \"%1\"...").arg(exec)); + } + } + if ( _group.checkDevicesCategory()==Tool::Category::Nb_Types ) { + QValueVector<QString> supported = _group.supportedDevices(); + _devicesLabel->setText(i18n("Hardcoded (%1)").arg(supported.count())); + } else { + for (uint i=0; i<_devicesData.count(); i++) { + delete _devicesData[i].process; + _devicesData[i].process = checkDevicesProcess(i); + _devicesData[i].command = _devicesData[i].process->prettyCommand(); + connect(_devicesData[i].process, SIGNAL(done(int)), SLOT(checkDevicesDone())); + connect(_devicesData[i].process, SIGNAL(timeout()), SLOT(checkDevicesDone())); + _devicesData[i].done = false; + _devicesData[i].checkLines.clear(); + if ( !_devicesData[i].process->start(10000) ) _devicesLabel->setText(i18n("Failed")); + else _devicesLabel->setText(i18n("Detecting ...")); + } + } + FOR_EACH(Compile::DirectoryType, type) { + if ( _dirs[type]==0 || type==Compile::DirectoryType::Executable ) continue; + PURL::Directory execDir = _dirs[Compile::DirectoryType::Executable]->directory(); + PURL::Directory dir = _group.autodetectDirectory(type, execDir, withWine()); + if ( !dir.isEmpty() ) _dirs[type]->setDirectory(dir); + } + _dirty = false; +} + +void ToolchainConfigWidget::showDetails() +{ + FOR_EACH(Tool::Category, k) { + if ( sender()!=_data[k].button ) continue; + QString s; + const Tool::Base *base = _group.base(k); + if ( base->checkExecutable() ) { + s += i18n("<qt><b>Command for executable detection:</b><br>%1<br>").arg(_data[k].command); + s += i18n("<b>Version string:</b><br>%1<br></qt>").arg(_data[k].checkLines.join("<br>")); + } else s += i18n("This tool cannot be automatically detected."); + MessageBox::text(s, Log::Show); + break; + } +} + +void ToolchainConfigWidget::showDeviceDetails() +{ + QString s; + if ( _group.checkDevicesCategory()==Tool::Category::Nb_Types ) { + s += "<qt>"; + QValueVector<QString> supported = _group.supportedDevices(); + for (uint i=0; i<supported.count(); i++) { + if ( i!=0 ) { + if ( (i%10)==0 ) s += "<br>"; + s += " "; + } + s += supported[i]; + } + s += "</qt>"; + } else { + uint nb = _group.nbCheckDevices(); + for (uint i=0; i<nb; i++) { + if ( nb==1 ) s += i18n("<qt><b>Command for devices detection:</b><br>%1<br>").arg(_devicesData[i].command); + else s += i18n("<qt><b>Command #%1 for devices detection:</b><br>%2<br>").arg(i+1).arg(_devicesData[i].command); + QString ss = _devicesData[i].checkLines.join("<br>"); + if ( nb==1 ) s += i18n("<b>Device string:</b><br>%1<br>").arg(ss); + else s += i18n("<b>Device string #%1:</b><br>%2<br>").arg(i+1).arg(ss); + } + } + MessageBox::text(s, Log::Show); +} |