You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
piklab/src/progs/gui/hardware_config_widget.cpp

205 lines
7.1 KiB

/***************************************************************************
* Copyright (C) 2005-2007 Nicolas Hadacek <hadacek@kde.org> *
* Copyright (C) 2003-2004 Alain Gibaud <alain.gibaud@free.fr> *
* *
* 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 "hardware_config_widget.h"
#include <tqlabel.h>
#include <kpushbutton.h>
#include "progs/base/prog_config.h"
#include "devices/base/device_group.h"
#include "common/gui/misc_gui.h"
//-----------------------------------------------------------------------------
Hardware::HConfigWidget::HConfigWidget(::Programmer::Base &base, TQWidget *parent, bool edit)
: TQFrame(parent, "hardware_config_widget"), _edit(edit), _connected(false), _base(base)
{
_hardware = 0;
TQHBoxLayout *top = new TQHBoxLayout(this, 0, 10);
_mainVBox = new TQVBoxLayout(top);
if (edit) {
_editVBox = new TQVBoxLayout(top);
top->setStretchFactor(_editVBox, 1);
} else _editVBox = 0;
}
//-----------------------------------------------------------------------------
Hardware::EditDialog::EditDialog(ConfigWidget *cwidget, const TQString &name, const Port::Description &pd, Data *data)
: KDialogBase(Plain, i18n("Edit and test hardware"), Ok|Cancel, Cancel, cwidget, "hardware_edit_dialog", true, true),
_cwidget(cwidget), _savedName(name), _oldData(data)
{
setButtonOK(i18n("Save"));
setButtonCancel(i18n("Close"));
TQGridLayout *grid = new TQGridLayout(plainPage(), 1, 1, 0, 10);
grid->setColStretch(2, 1);
TQLabel *label = new TQLabel(i18n("Hardware name:"), plainPage());
grid->addWidget(label, 0, 0);
_name = new TQLineEdit(name, plainPage());
grid->addWidget(_name, 0, 1);
label = new TQLabel(i18n("%1 at %2:").tqarg(pd.type.label()).tqarg(pd.device), plainPage());
grid->addWidget(label, 1, 0);
label = new TQLabel(plainPage());
grid->addWidget(label, 1, 1);
_hc = cwidget->createHardwareConfigWidget(plainPage(), true);
grid->addMultiCellWidget(_hc, 2,2, 0,2);
grid->setRowStretch(3, 1);
bool ok = _hc->set(pd, *data);
label->setText(ok ? i18n("Connected") : i18n("Not Connected"));
}
void Hardware::EditDialog::slotOk()
{
if ( _name->text().isEmpty() ) {
MessageBox::sorry(i18n("Could not save configuration: hardware name is empty."), Log::Show);
return;
}
if ( _cwidget->_config->isStandardHardware(_name->text()) ) {
MessageBox::sorry(i18n("The hardware name is already used for a standard hardware."), Log::Show);
return;
}
TQStringList names = _cwidget->_config->hardwareNames(PortType::Nb_Types); // all hardwares
if ( names.contains(_name->text()) ) {
if ( !MessageBox::askContinue(i18n("Do you want to overwrite this custom hardware \"%1\"?").tqarg(_name->text()),
KStdGuiItem::save()) ) return;
}
delete _oldData;
_oldData = _hc->data();
_cwidget->_config->writeCustomHardware(_name->text(), *_oldData);
_savedName = _name->text();
KDialogBase::accept();
}
void Hardware::EditDialog::slotCancel()
{
Data *data = _hc->data();
bool equal = _oldData->isEqual(*data);
delete data;
if ( !equal && !MessageBox::askContinue(i18n("Closing will discard changes you have made. Close anyway?"), KStdGuiItem::close()) )
return;
KDialogBase::reject();
}
//-----------------------------------------------------------------------------
Hardware::ConfigWidget::ConfigWidget(::Programmer::Base *base, Config *config, TQWidget *parent)
: ::Programmer::ConfigWidget(base->group(), parent), _base(base), _config(config), _hc(0)
{
// programmer combo
uint row = numRows();
_configCombo = new TQComboBox(this);
connect(_configCombo, TQT_SIGNAL(activated(int)), TQT_SLOT(configChanged(int)));
addWidget(_configCombo, row,row, 0,0);
row++;
// hardware config
TQHBoxLayout *hbox = new TQHBoxLayout(10);
_hbox = new TQHBoxLayout(10);
hbox->addLayout(_hbox);
addLayout(hbox, row,row, 0,1);
row++;
// comment
_comment = new KTextBrowser(this);
addWidget(_comment, row,row, 0,1);
row++;
// buttons
TQVBoxLayout *vbox = new TQVBoxLayout(hbox);
_editButton = new KPushButton(this);
connect(_editButton, TQT_SIGNAL(clicked()), TQT_SLOT(editClicked()));
vbox->addWidget(_editButton);
_deleteButton = new KPushButton(i18n("Delete"), this);
connect(_deleteButton, TQT_SIGNAL(clicked()), TQT_SLOT(deleteClicked()));
vbox->addWidget(_deleteButton);
vbox->addStretch(1);
}
void Hardware::ConfigWidget::saveConfig()
{
::Programmer::ConfigWidget::saveConfig();
_config->writeCurrentHardware(_hc->portDescription().type, _names[_configCombo->currentItem()]);
}
void Hardware::ConfigWidget::configChanged(int i)
{
set(_hc->portDescription(), i);
}
bool Hardware::ConfigWidget::set(const Port::Description &pd, uint i)
{
Data *hd = _config->hardwareData(_names[i]);
if ( _hc==0 ) {
_hc = createHardwareConfigWidget(this, false);
_hc->show();
_hbox->addWidget(_hc);
}
bool ok = _hc->set(pd, *hd);
delete hd;
TQString s = _config->comment(_names[i]);
if ( s.isEmpty() ) _comment->hide();
else {
_comment->setText(s);
_comment->show();
}
bool custom = !_config->isStandardHardware(_names[i]);
_editButton->setText(custom ? i18n("Edit/Test...") : i18n("New/Test..."));
_deleteButton->setEnabled(custom);
return ok;
}
bool Hardware::ConfigWidget::setPort(const ::Programmer::HardwareDescription &hd)
{
updateList(hd.port.type);
int i = _names.findIndex(_config->currentHardware(hd.port.type));
if ( i!=-1 ) _configCombo->setCurrentItem(i);
return set(hd.port, _configCombo->currentItem());
}
void Hardware::ConfigWidget::updateList(PortType type)
{
_configCombo->clear();
_names = _config->hardwareNames(type);
for (uint i=0; i<_names.count(); i++) {
bool standard = _config->isStandardHardware(_names[i]);
TQString s = (standard ? _config->label(_names[i]) : i18n("%1 <custom>").tqarg(_names[i]));
_configCombo->insertItem(s);
}
}
void Hardware::ConfigWidget::editClicked()
{
TQString name = _names[_configCombo->currentItem()];
TQString cname = (_config->isStandardHardware(name) ? TQString() : name);
Port::Description pd = _hc->portDescription();
EditDialog *hcd = new EditDialog(this, cname, pd, _hc->data());
int res = hcd->exec();
if ( res==TQDialog::Rejected ) return;
updateList(pd.type);
int index = _names.findIndex(hcd->savedName());
_configCombo->setCurrentItem(index);
configChanged(_configCombo->currentItem());
}
void Hardware::ConfigWidget::deleteClicked()
{
TQString name = _names[_configCombo->currentItem()];
if ( !MessageBox::askContinue(i18n("Do you want to delete custom hardware \"%1\"?").tqarg(name),
KStdGuiItem::del()) ) return;
_config->deleteCustomHardware(name);
updateList(_hc->portDescription().type);
configChanged(_configCombo->currentItem());
}