File indexing completed on 2024-04-14 05:36:49

0001 /***************************************************************************
0002  *   Copyright (C) 2005 by David Saxton                                    *
0003  *   david@bluehaze.org                                                    *
0004  *                                                                         *
0005  *   This program is free software; you can redistribute it and/or modify  *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  ***************************************************************************/
0010 
0011 #include "settingsdlg.h"
0012 #include "inputdialog.h"
0013 #include "picprogrammer.h"
0014 #include "port.h"
0015 
0016 #include <KComboBox>
0017 #include <KLineEdit>
0018 #include <KLocalizedString>
0019 #include <KMessageBox>
0020 #include <KSharedConfig>
0021 
0022 #include <QGroupBox>
0023 #include <QLabel>
0024 #include <QSlider>
0025 #include <QStandardPaths>
0026 #include <QTimer>
0027 
0028 #include <ktlconfig.h>
0029 #include <ui_asmformattingwidget.h>
0030 #include <ui_generaloptionswidget.h>
0031 #include <ui_gpasmsettingswidget.h>
0032 #include <ui_gplinksettingswidget.h>
0033 #include <ui_logicwidget.h>
0034 #include <ui_picprogrammerconfigwidget.h>
0035 #include <ui_sdccoptionswidget.h>
0036 
0037 class GeneralOptionsWidget : public QWidget, public Ui::GeneralOptionsWidget
0038 {
0039 public:
0040     GeneralOptionsWidget(QWidget *parent)
0041         : QWidget(parent)
0042     {
0043         setupUi(this);
0044     }
0045 };
0046 
0047 class GpasmSettingsWidget : public QWidget, public Ui::GpasmSettingsWidget
0048 {
0049 public:
0050     GpasmSettingsWidget(QWidget *parent)
0051         : QWidget(parent)
0052     {
0053         setupUi(this);
0054     }
0055 };
0056 
0057 class SDCCOptionsWidget : public QWidget, public Ui::SDCCOptionsWidget
0058 {
0059 public:
0060     SDCCOptionsWidget(QWidget *parent)
0061         : QWidget(parent)
0062     {
0063         setupUi(this);
0064     }
0065 };
0066 
0067 class AsmFormattingWidget : public QWidget, public Ui::AsmFormattingWidget
0068 {
0069 public:
0070     AsmFormattingWidget(QWidget *parent)
0071         : QWidget(parent)
0072     {
0073         setupUi(this);
0074     }
0075 };
0076 
0077 class LogicWidget : public QWidget, public Ui::LogicWidget
0078 {
0079 public:
0080     LogicWidget(QWidget *parent)
0081         : QWidget(parent)
0082     {
0083         setupUi(this);
0084     }
0085 };
0086 
0087 class PicProgrammerConfigWidget : public QWidget, public Ui::PicProgrammerConfigWidget
0088 {
0089 public:
0090     PicProgrammerConfigWidget(QWidget *parent)
0091         : QWidget(parent)
0092     {
0093         setupUi(this);
0094     }
0095 };
0096 
0097 class GplinkSettingsWidget : public QWidget, public Ui::GplinkSettingsWidget
0098 {
0099 public:
0100     GplinkSettingsWidget(QWidget *parent)
0101         : QWidget(parent)
0102     {
0103         setupUi(this);
0104     }
0105 };
0106 
0107 // Make sure that this value is the same as that in ktechlab.kcfg
0108 const int defaultRefreshRate = 50;
0109 
0110 SettingsDlg::SettingsDlg(QWidget *parent, const char *name, KCoreConfigSkeleton *config)
0111     : KConfigDialog(parent, name, config)
0112 {
0113     m_generalOptionsWidget = new GeneralOptionsWidget(this);
0114     m_generalOptionsWidget->setObjectName("generalOptionsWidget");
0115     m_gpasmSettingsWidget = new GpasmSettingsWidget(this);
0116     m_gpasmSettingsWidget->setObjectName("gpasmSettingsWidget");
0117     m_sdccOptionsWidget = new SDCCOptionsWidget(this);
0118     m_sdccOptionsWidget->setObjectName("sdccOptionsWidget");
0119     m_asmFormattingWidget = new AsmFormattingWidget(this);
0120     m_asmFormattingWidget->setObjectName("asmFormattingWidget");
0121     m_logicWidget = new LogicWidget(this);
0122     m_logicWidget->setObjectName("logicWidget");
0123     m_picProgrammerConfigWidget = new PicProgrammerConfigWidget(this);
0124     m_picProgrammerConfigWidget->setObjectName("picProgrammerConfigWidget");
0125     m_gplinkSettingsWidget = new GplinkSettingsWidget(this);
0126     m_gplinkSettingsWidget->setObjectName("gplinkSettingsWidget");
0127 
0128     m_pPicProgrammerSettings = new PicProgrammerSettings;
0129 
0130     m_logicWidget->kcfg_LogicOutputHighImpedance->setSuffix(QString(" ") + QChar(0x3a9));
0131     m_logicWidget->kcfg_LogicOutputLowImpedance->setSuffix(QString(" ") + QChar(0x3a9));
0132 
0133     addPage(m_generalOptionsWidget, i18n("General"), "ktechlab", i18n("General Options"));
0134     addPage(m_picProgrammerConfigWidget, i18n("Programmer"), "network-connect", i18n("PIC Programmer"));
0135     addPage(m_asmFormattingWidget, i18n("Formatter"), "indent_asm", i18n("Assembly Formatter"));
0136     addPage(m_logicWidget, i18n("Logic"), "logic_or", i18n("Electronic Logic Values"));
0137     addPage(m_gpasmSettingsWidget, "Gpasm", "convert_to_hex", "gpasm");
0138     addPage(m_gplinkSettingsWidget, "Gplink", "merge", "gplink");
0139     addPage(m_sdccOptionsWidget, "SDCC", "text-x-csrc", "SDCC");
0140 
0141     connect(m_generalOptionsWidget->refreshRateSlider, &QSlider::valueChanged, this, &SettingsDlg::slotUpdateRefreshRateLabel);
0142     connect(m_picProgrammerConfigWidget->kcfg_PicProgrammerProgram, qOverload<const QString &>(&KComboBox::textActivated), this, &SettingsDlg::slotUpdatePicProgrammerDescription);
0143     connect(m_picProgrammerConfigWidget->removeButton, &QPushButton::clicked, this, &SettingsDlg::slotRemoveProgrammerConfig);
0144     connect(m_picProgrammerConfigWidget->addButton, &QPushButton::clicked, this, &SettingsDlg::slotAddProgrammerConfig);
0145 
0146     connect(m_picProgrammerConfigWidget->initCommand, &KLineEdit::textChanged, this, &SettingsDlg::slotSaveCurrentProgrammerConfig);
0147     connect(m_picProgrammerConfigWidget->readCommand, &KLineEdit::textChanged, this, &SettingsDlg::slotSaveCurrentProgrammerConfig);
0148     connect(m_picProgrammerConfigWidget->writeCommand, &KLineEdit::textChanged, this, &SettingsDlg::slotSaveCurrentProgrammerConfig);
0149     connect(m_picProgrammerConfigWidget->verifyCommand, &KLineEdit::textChanged, this, &SettingsDlg::slotSaveCurrentProgrammerConfig);
0150     connect(m_picProgrammerConfigWidget->blankCheckCommand, &KLineEdit::textChanged, this, &SettingsDlg::slotSaveCurrentProgrammerConfig);
0151     connect(m_picProgrammerConfigWidget->eraseCommand, &KLineEdit::textChanged, this, &SettingsDlg::slotSaveCurrentProgrammerConfig);
0152 
0153     m_generalOptionsWidget->kcfg_GridColor->setEnabled(KTLConfig::showGrid());
0154 
0155     m_picProgrammerConfigWidget->kcfg_PicProgrammerPort->insertItems(m_picProgrammerConfigWidget->kcfg_PicProgrammerPort->count(), Port::ports());
0156     slotUpdatePicProgrammerDescription();
0157 }
0158 
0159 SettingsDlg::~SettingsDlg()
0160 {
0161     delete m_pPicProgrammerSettings;
0162 }
0163 
0164 void SettingsDlg::show()
0165 {
0166     KComboBox *combo = m_picProgrammerConfigWidget->kcfg_PicProgrammerProgram;
0167     combo->setEditable(true);
0168     KConfigDialog::show();
0169     combo->setEditable(false);
0170 }
0171 
0172 void SettingsDlg::slotUpdateRefreshRateLabel(int sliderValue)
0173 {
0174     const QString number = QString::number(sliderValueToRefreshRate(sliderValue));
0175     switch (sliderValue) {
0176     case 0:
0177         m_generalOptionsWidget->refreshRateLabel->setText(i18n("Lowest (%1 FPS)", number));
0178         break;
0179     case 1:
0180         m_generalOptionsWidget->refreshRateLabel->setText(i18n("Low (%1 FPS)", number));
0181         break;
0182     case 2:
0183         m_generalOptionsWidget->refreshRateLabel->setText(i18n("Medium (%1 FPS)", number));
0184         break;
0185     case 3:
0186         m_generalOptionsWidget->refreshRateLabel->setText(i18n("High (%1 FPS)", number));
0187         break;
0188     case 4:
0189         m_generalOptionsWidget->refreshRateLabel->setText(i18n("Highest (%1 FPS)", number));
0190         break;
0191     default:
0192         m_generalOptionsWidget->refreshRateLabel->setText(i18n("Unknown value"));
0193         break;
0194     }
0195     updateButtons();
0196 }
0197 
0198 void SettingsDlg::slotUpdatePicProgrammerDescription()
0199 {
0200     QString program = m_picProgrammerConfigWidget->kcfg_PicProgrammerProgram->currentText();
0201 
0202     ProgrammerConfig config = m_pPicProgrammerSettings->config(program);
0203     QString description = config.description;
0204 
0205     bool customProgrammer = !m_pPicProgrammerSettings->isPredefined(program);
0206 
0207     QString executable = config.executable;
0208     if (executable.isEmpty())
0209         executable = program.toLower();
0210 
0211     QString programLocation = QStandardPaths::findExecutable(executable);
0212     if (programLocation.isNull())
0213         description.prepend(i18n("<b>%1</b> cannot be found.<br>", executable));
0214     else
0215         description.prepend(i18n("<b>%1</b> found: %2<br>", executable, programLocation));
0216 
0217     m_picProgrammerConfigWidget->m_pProgrammerDescription->setText(description);
0218     m_picProgrammerConfigWidget->removeButton->setEnabled(customProgrammer);
0219 
0220     KLineEdit *edit;
0221 
0222 #define SETUP_COMMAND(name)                                                                                                                                                                                                                    \
0223     edit = m_picProgrammerConfigWidget->name;                                                                                                                                                                                                  \
0224     edit->setText(config.name);                                                                                                                                                                                                                \
0225     edit->setEnabled(customProgrammer);                                                                                                                                                                                                        \
0226     edit->setToolTip(customProgrammer ? QString() : config.name)
0227 
0228     SETUP_COMMAND(initCommand);
0229     SETUP_COMMAND(readCommand);
0230     SETUP_COMMAND(writeCommand);
0231     SETUP_COMMAND(verifyCommand);
0232     SETUP_COMMAND(blankCheckCommand);
0233     SETUP_COMMAND(eraseCommand);
0234 
0235 #undef SETUP_COMMAND
0236 }
0237 
0238 void SettingsDlg::slotSaveCurrentProgrammerConfig()
0239 {
0240     QString program = m_picProgrammerConfigWidget->kcfg_PicProgrammerProgram->currentText();
0241 
0242     if (m_pPicProgrammerSettings->isPredefined(program))
0243         return;
0244 
0245     ProgrammerConfig config;
0246 
0247     config.initCommand = m_picProgrammerConfigWidget->initCommand->text();
0248     config.readCommand = m_picProgrammerConfigWidget->readCommand->text();
0249     config.writeCommand = m_picProgrammerConfigWidget->writeCommand->text();
0250     config.verifyCommand = m_picProgrammerConfigWidget->verifyCommand->text();
0251     config.blankCheckCommand = m_picProgrammerConfigWidget->blankCheckCommand->text();
0252     config.eraseCommand = m_picProgrammerConfigWidget->eraseCommand->text();
0253 
0254     m_pPicProgrammerSettings->saveConfig(program, config);
0255 }
0256 
0257 void SettingsDlg::slotRemoveProgrammerConfig()
0258 {
0259     KComboBox *combo = m_picProgrammerConfigWidget->kcfg_PicProgrammerProgram;
0260 
0261     QString program = combo->currentText();
0262 
0263     KMessageBox::ButtonCode confirm = static_cast<KMessageBox::ButtonCode>(
0264         KMessageBox::warningContinueCancel(this, i18n("Remove programmer configuration \"%1\"?", program),
0265                                            i18n("Remove \"%1\"", program)
0266     ));
0267     if (confirm == KMessageBox::Cancel)
0268         return;
0269 
0270     m_pPicProgrammerSettings->removeConfig(program);
0271     combo->removeItem(combo->currentIndex());
0272     slotUpdatePicProgrammerDescription();
0273 }
0274 
0275 void SettingsDlg::slotAddProgrammerConfig()
0276 {
0277     KComboBox *combo = m_picProgrammerConfigWidget->kcfg_PicProgrammerProgram;
0278 
0279     QStringList takenNames;
0280     int count = combo->count();
0281     for (int i = 0; i < count; ++i)
0282         takenNames << combo->itemText(i).toLower();
0283 
0284     NameValidator *nv = new NameValidator(takenNames);
0285 
0286     bool ok = false;
0287     QString name = InputDialog::getText(i18n("Configuration Name"), i18n("Name"), QString(), /* 0,*/ &ok, this, /* 0,*/ nv);
0288 
0289     delete nv;
0290 
0291     if (!ok)
0292         return;
0293 
0294     ProgrammerConfig config;
0295     config.executable = name.toLower();
0296 
0297     m_pPicProgrammerSettings->saveConfig(name, config);
0298 
0299     combo->insertItem(combo->count(), name);
0300     // combo->setCurrentItem( count );
0301     combo->setCurrentItem(name);
0302     slotUpdatePicProgrammerDescription();
0303 }
0304 
0305 int SettingsDlg::refreshRateToSliderValue(int refreshRate)
0306 {
0307     switch (refreshRate) {
0308     case 10:
0309         return 0;
0310     case 25:
0311         return 1;
0312     case 50:
0313         return 2;
0314     case 75:
0315         return 3;
0316     case 100:
0317         return 4;
0318     default:
0319         return -1;
0320     }
0321 }
0322 
0323 int SettingsDlg::sliderValueToRefreshRate(int sliderValue)
0324 {
0325     switch (sliderValue) {
0326     case 0:
0327         return 10;
0328     case 1:
0329         return 25;
0330     case 2:
0331         return 50;
0332     case 3:
0333         return 75;
0334     case 4:
0335         return 100;
0336     default:
0337         return -1;
0338     }
0339 }
0340 
0341 void SettingsDlg::updateSettings()
0342 {
0343     // KConfig * config = kapp->config();
0344     KSharedConfigPtr config = KSharedConfig::openConfig();
0345 
0346     KConfigSkeleton::ItemInt *item = dynamic_cast<KConfigSkeleton::ItemInt *>(KTLConfig::self()->findItem("RefreshRate"));
0347     if (!item)
0348         return;
0349 
0350     int newRefreshRate = sliderValueToRefreshRate(m_generalOptionsWidget->refreshRateSlider->value());
0351 
0352     if (newRefreshRate != KTLConfig::refreshRate()) {
0353         item->setValue(newRefreshRate);
0354         KConfigGroup grWorkArea = config->group("WorkArea");
0355         if (newRefreshRate != defaultRefreshRate)
0356             grWorkArea.writeEntry("RefreshRate", newRefreshRate);
0357         else
0358             grWorkArea.deleteEntry("RefreshRate");
0359 
0360         emit settingsChanged(objectName());
0361     }
0362 
0363     QTimer::singleShot(0, this, SLOT(slotUpdateSettings()));
0364 }
0365 
0366 void SettingsDlg::slotUpdateSettings()
0367 {
0368     // KConfig * config = kapp->config();
0369     KSharedConfigPtr config = KSharedConfig::openConfig();
0370 
0371     KConfigSkeleton::ItemString *item = dynamic_cast<KConfigSkeleton::ItemString *>(KTLConfig::self()->findItem("PicProgrammerProgram"));
0372     if (!item)
0373         return;
0374 
0375     KComboBox *combo = m_picProgrammerConfigWidget->kcfg_PicProgrammerProgram;
0376     QString newProgram = combo->currentText();
0377 
0378     if (newProgram != KTLConfig::picProgrammerProgram()) {
0379         item->setValue(newProgram);
0380         KConfigGroup grPicProg = config->group("PicProgramming");
0381         if (newProgram != "picp")
0382             grPicProg.writeEntry("PicProgrammerProgram", newProgram);
0383         else
0384             grPicProg.deleteEntry("PicProgrammerProgram");
0385 
0386         emit settingsChanged(objectName());
0387     }
0388 
0389     m_pPicProgrammerSettings->save(config.data());
0390 
0391     config->sync();
0392 }
0393 
0394 void SettingsDlg::updateWidgets()
0395 {
0396     m_generalOptionsWidget->refreshRateSlider->setValue(refreshRateToSliderValue(KTLConfig::refreshRate()));
0397 
0398     // m_pPicProgrammerSettings->load( kapp->config() );
0399     m_pPicProgrammerSettings->load(KSharedConfig::openConfig().data());
0400 
0401     QStringList programmerNames = m_pPicProgrammerSettings->configNames(false);
0402 
0403     KComboBox *combo = m_picProgrammerConfigWidget->kcfg_PicProgrammerProgram;
0404     combo->clear();
0405     combo->insertItems(combo->count(), programmerNames);
0406     // combo->setSizeLimit( programmerNames.size() );
0407     combo->setMaxCount(programmerNames.size());
0408 
0409     QTimer::singleShot(0, this, SLOT(slotUpdateWidgets()));
0410 }
0411 
0412 void SettingsDlg::slotUpdateWidgets()
0413 {
0414     KComboBox *combo = m_picProgrammerConfigWidget->kcfg_PicProgrammerProgram;
0415 
0416     combo->setItemText(combo->currentIndex(), KTLConfig::picProgrammerProgram());
0417     slotUpdatePicProgrammerDescription();
0418 }
0419 
0420 void SettingsDlg::updateWidgetsDefault()
0421 {
0422     m_generalOptionsWidget->refreshRateSlider->setValue(refreshRateToSliderValue(defaultRefreshRate));
0423     slotUpdatePicProgrammerDescription();
0424 }
0425 
0426 bool SettingsDlg::hasChanged()
0427 {
0428     if (sliderValueToRefreshRate(m_generalOptionsWidget->refreshRateSlider->value()) == KTLConfig::refreshRate())
0429         return KConfigDialog::hasChanged();
0430     return true;
0431 }
0432 
0433 bool SettingsDlg::isDefault()
0434 {
0435     if (sliderValueToRefreshRate(m_generalOptionsWidget->refreshRateSlider->value()) == defaultRefreshRate)
0436         return KConfigDialog::isDefault();
0437 
0438     return false;
0439 }
0440 
0441 #include "moc_settingsdlg.cpp"