00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "asmformattingwidget.h"
00012 #include "generaloptionswidget.h"
00013 #include "gpasmsettingswidget.h"
00014 #include "logicwidget.h"
00015 #include "picprogrammerconfigwidget.h"
00016 #include "picprogrammer.h"
00017 #include "port.h"
00018 #include "sdccoptionswidget.h"
00019 #include "settingsdlg.h"
00020 #include "src/core/ktlconfig.h"
00021
00022 #include <kapplication.h>
00023 #include <kcolorbutton.h>
00024 #include <kcombobox.h>
00025 #include <kconfig.h>
00026 #include <kinputdialog.h>
00027 #include <klineedit.h>
00028 #include <klocale.h>
00029 #include <kmessagebox.h>
00030 #include <knuminput.h>
00031 #include <kpushbutton.h>
00032 #include <kstandarddirs.h>
00033 #include <qgroupbox.h>
00034 #include <qlabel.h>
00035 #include <qslider.h>
00036 #include <qtimer.h>
00037 #include <qtooltip.h>
00038 #include <qvalidator.h>
00039
00040
00041 const int defaultRefreshRate = 50;
00042
00043 SettingsDlg::SettingsDlg( QWidget *parent, const char *name, KConfigSkeleton *config )
00044 : KConfigDialog( parent, name, config )
00045 {
00046 m_generalOptionsWidget = new GeneralOptionsWidget( this, "generalOptionsWidget" );
00047 m_gpasmSettingsWidget = new GpasmSettingsWidget( this, "gpasmSettingsWidget" );
00048 m_sdccOptionsWidget = new SDCCOptionsWidget( this, "sdccOptionsWidget" );
00049 m_asmFormattingWidget = new AsmFormattingWidget( this, "asmFormattingWidget" );
00050 m_logicWidget = new LogicWidget( this, "logicWidget" );
00051 m_picProgrammerConfigWidget = new PicProgrammerConfigWidget( this, "picProgrammerConfigWidget" );
00052
00053 m_pPicProgrammerSettings = new PicProgrammerSettings;
00054
00055 m_logicWidget->kcfg_LogicOutputHighImpedance->setSuffix( QString(" ") + QChar(0x3a9) );
00056 m_logicWidget->kcfg_LogicOutputLowImpedance->setSuffix( QString(" ") + QChar(0x3a9) );
00057
00058 addPage( m_generalOptionsWidget, i18n("General"), "misc", i18n("General Options") );
00059 addPage( m_picProgrammerConfigWidget, i18n("Programmer"), "memory", i18n("PIC Programmer") );
00060 addPage( m_asmFormattingWidget, i18n("Formatter"), "indent_asm", i18n("Assembly Formatter") );
00061 addPage( m_logicWidget, i18n("Logic"), "logic_or", i18n("Electronic Logic Values") );
00062 addPage( m_gpasmSettingsWidget, "Gpasm", "convert_to_hex", "gpasm" );
00063 addPage( m_sdccOptionsWidget, "SDCC", "source_c", "SDCC" );
00064
00065 connect( m_generalOptionsWidget->refreshRateSlider, SIGNAL(valueChanged(int)), this, SLOT(slotUpdateRefreshRateLabel(int)) );
00066 connect( m_picProgrammerConfigWidget->kcfg_PicProgrammerProgram, SIGNAL(activated(const QString &)), this, SLOT(slotUpdatePicProgrammerDescription()) );
00067 connect( m_picProgrammerConfigWidget->removeButton, SIGNAL(clicked()), this, SLOT(slotRemoveProgrammerConfig()) );
00068 connect( m_picProgrammerConfigWidget->addButton, SIGNAL(clicked()), this, SLOT(slotAddProgrammerConfig()) );
00069
00070
00071 connect( m_picProgrammerConfigWidget->initCommand, SIGNAL(textChanged(const QString &)), this, SLOT(slotSaveCurrentProgrammerConfig()) );
00072 connect( m_picProgrammerConfigWidget->readCommand, SIGNAL(textChanged(const QString &)), this, SLOT(slotSaveCurrentProgrammerConfig()) );
00073 connect( m_picProgrammerConfigWidget->writeCommand, SIGNAL(textChanged(const QString &)), this, SLOT(slotSaveCurrentProgrammerConfig()) );
00074 connect( m_picProgrammerConfigWidget->verifyCommand, SIGNAL(textChanged(const QString &)), this, SLOT(slotSaveCurrentProgrammerConfig()) );
00075 connect( m_picProgrammerConfigWidget->blankCheckCommand, SIGNAL(textChanged(const QString &)), this, SLOT(slotSaveCurrentProgrammerConfig()) );
00076 connect( m_picProgrammerConfigWidget->eraseCommand, SIGNAL(textChanged(const QString &)), this, SLOT(slotSaveCurrentProgrammerConfig()) );
00077
00078
00079 m_generalOptionsWidget->kcfg_GridColor->setEnabled( KTLConfig::showGrid() );
00080
00081 m_picProgrammerConfigWidget->kcfg_PicProgrammerPort->insertStringList( Port::ports( Port::ExistsAndRW ) );
00082 slotUpdatePicProgrammerDescription();
00083 }
00084
00085
00086 SettingsDlg::~SettingsDlg()
00087 {
00088 delete m_pPicProgrammerSettings;
00089 }
00090
00091
00092 void SettingsDlg::show()
00093 {
00094 KComboBox * combo = m_picProgrammerConfigWidget->kcfg_PicProgrammerProgram;
00095 combo->setEditable( true );
00096 KConfigDialog::show();
00097 combo->setEditable( false );
00098 }
00099
00100
00101 void SettingsDlg::slotUpdateRefreshRateLabel( int sliderValue )
00102 {
00103 const QString number = QString::number( sliderValueToRefreshRate(sliderValue) );
00104 switch(sliderValue)
00105 {
00106 case 0:
00107 m_generalOptionsWidget->refreshRateLabel->setText( i18n("Lowest (%1 FPS)").arg(number) );
00108 break;
00109 case 1:
00110 m_generalOptionsWidget->refreshRateLabel->setText( i18n("Low (%1 FPS)").arg(number) );
00111 break;
00112 case 2:
00113 m_generalOptionsWidget->refreshRateLabel->setText( i18n("Medium (%1 FPS)").arg(number) );
00114 break;
00115 case 3:
00116 m_generalOptionsWidget->refreshRateLabel->setText( i18n("High (%1 FPS)").arg(number) );
00117 break;
00118 case 4:
00119 m_generalOptionsWidget->refreshRateLabel->setText( i18n("Highest (%1 FPS)").arg(number) );
00120 break;
00121 default:
00122 m_generalOptionsWidget->refreshRateLabel->setText( i18n("Unknown value") );
00123 break;
00124 }
00125 updateButtons();
00126 }
00127
00128
00129 void SettingsDlg::slotUpdatePicProgrammerDescription()
00130 {
00131 QString program = m_picProgrammerConfigWidget->kcfg_PicProgrammerProgram->currentText();
00132
00133 ProgrammerConfig config = m_pPicProgrammerSettings->config( program );
00134 QString description = config.description;
00135
00136 bool customProgrammer = ! m_pPicProgrammerSettings->isPredefined( program );
00137
00138 QString executable = config.executable;
00139 if ( executable.isEmpty() )
00140 executable = program.lower();
00141
00142 QString programLocation = KStandardDirs::findExe( executable );
00143 if ( programLocation.isNull() )
00144 description.prepend( i18n("<b>%1</b> cannot be found.<br>").arg( executable ) );
00145 else
00146 description.prepend( i18n("<b>%1</b> found: %2<br>").arg( executable ).arg(programLocation) );
00147
00148 m_picProgrammerConfigWidget->m_pProgrammerDescription->setText( description );
00149 m_picProgrammerConfigWidget->removeButton->setEnabled( customProgrammer );
00150
00151 KLineEdit * edit;
00152
00153 #define SETUP_COMMAND( name ) \
00154 edit = m_picProgrammerConfigWidget->name; \
00155 edit->setText( config.name ); \
00156 edit->setEnabled(customProgrammer); \
00157 QToolTip::add( edit, customProgrammer ? 0 : config.name )
00158
00159 SETUP_COMMAND( initCommand );
00160 SETUP_COMMAND( readCommand );
00161 SETUP_COMMAND( writeCommand );
00162 SETUP_COMMAND( verifyCommand );
00163 SETUP_COMMAND( blankCheckCommand );
00164 SETUP_COMMAND( eraseCommand );
00165
00166 #undef SETUP_COMMAND
00167 }
00168
00169
00170 void SettingsDlg::slotSaveCurrentProgrammerConfig()
00171 {
00172 QString program = m_picProgrammerConfigWidget->kcfg_PicProgrammerProgram->currentText();
00173
00174 if ( m_pPicProgrammerSettings->isPredefined( program ) )
00175 return;
00176
00177 ProgrammerConfig config;
00178
00179 config.initCommand = m_picProgrammerConfigWidget->initCommand->text();
00180 config.readCommand = m_picProgrammerConfigWidget->readCommand->text();
00181 config.writeCommand = m_picProgrammerConfigWidget->writeCommand->text();
00182 config.verifyCommand = m_picProgrammerConfigWidget->verifyCommand->text();
00183 config.blankCheckCommand = m_picProgrammerConfigWidget->blankCheckCommand->text();
00184 config.eraseCommand = m_picProgrammerConfigWidget->eraseCommand->text();
00185
00186 m_pPicProgrammerSettings->saveConfig( program, config );
00187 }
00188
00189
00190 void SettingsDlg::slotRemoveProgrammerConfig()
00191 {
00192 KComboBox * combo = m_picProgrammerConfigWidget->kcfg_PicProgrammerProgram;
00193
00194 QString program = combo->currentText();
00195
00196 KMessageBox::ButtonCode confirm = (KMessageBox::ButtonCode)KMessageBox::warningContinueCancel( this, i18n("Remove programmer configuration \"%1\"?").arg(program), i18n("Remove \"%1\"").arg(program), i18n("Remove") );
00197 if ( confirm == KMessageBox::Cancel )
00198 return;
00199
00200 m_pPicProgrammerSettings->removeConfig( program );
00201 combo->removeItem( combo->currentItem() );
00202 slotUpdatePicProgrammerDescription();
00203 }
00204
00205
00206 class NameValidator : public QValidator
00207 {
00208 public:
00209 NameValidator( QStringList unallowed )
00210 : QValidator(0) {
00211 m_unallowed = unallowed;
00212 }
00213
00214 virtual State validate( QString & input, int & ) const {
00215 return (input.isEmpty() || m_unallowed.contains( input.lower() )) ? Intermediate : Acceptable;
00216 }
00217
00218 protected:
00219 QStringList m_unallowed;
00220 };
00221
00222
00223 void SettingsDlg::slotAddProgrammerConfig()
00224 {
00225 KComboBox * combo = m_picProgrammerConfigWidget->kcfg_PicProgrammerProgram;
00226
00227 QStringList takenNames;
00228 int count = combo->count();
00229 for ( int i = 0; i < count; ++i )
00230 takenNames << combo->text(i).lower();
00231
00232 NameValidator * nv = new NameValidator( takenNames );
00233
00234 bool ok = false;
00235 QString name = KInputDialog::getText( i18n("Configuration Name"), i18n("Name"), 0, &ok, this, 0, nv );
00236
00237 delete nv;
00238
00239 if (!ok)
00240 return;
00241
00242 ProgrammerConfig config;
00243 config.executable = name.lower();
00244
00245 m_pPicProgrammerSettings->saveConfig( name, config );
00246
00247 combo->insertItem( name );
00248 combo->setCurrentItem( count );
00249 slotUpdatePicProgrammerDescription();
00250 }
00251
00252
00253 int SettingsDlg::refreshRateToSliderValue( int refreshRate )
00254 {
00255 switch (refreshRate)
00256 {
00257 case 10: return 0;
00258 case 25: return 1;
00259 case 50: return 2;
00260 case 75: return 3;
00261 case 100: return 4;
00262 default: return -1;
00263 }
00264 }
00265
00266
00267 int SettingsDlg::sliderValueToRefreshRate( int sliderValue )
00268 {
00269 switch (sliderValue)
00270 {
00271 case 0: return 10;
00272 case 1: return 25;
00273 case 2: return 50;
00274 case 3: return 75;
00275 case 4: return 100;
00276 default: return -1;
00277 }
00278 }
00279
00280
00281 void SettingsDlg::updateSettings()
00282 {
00283 KConfig * config = kapp->config();
00284
00285 KConfigSkeleton::ItemInt *item = dynamic_cast<KConfigSkeleton::ItemInt*>(KTLConfig::self()->findItem( "RefreshRate" ));
00286 if ( !item )
00287 return;
00288
00289 int newRefreshRate = sliderValueToRefreshRate(m_generalOptionsWidget->refreshRateSlider->value());
00290
00291 if ( newRefreshRate != KTLConfig::refreshRate() )
00292 {
00293 item->setValue(newRefreshRate);
00294 config->setGroup("WorkArea");
00295 if ( newRefreshRate != defaultRefreshRate )
00296 config->writeEntry("RefreshRate",newRefreshRate);
00297 else
00298 config->deleteEntry("RefreshRate");
00299
00300 emit settingsChanged();
00301 }
00302
00303 QTimer::singleShot( 0, this, SLOT(slotUpdateSettings()) );
00304 }
00305
00306
00307 void SettingsDlg::slotUpdateSettings()
00308 {
00309 KConfig * config = kapp->config();
00310
00311 KConfigSkeleton::ItemString * item = dynamic_cast<KConfigSkeleton::ItemString*>(KTLConfig::self()->findItem( "PicProgrammerProgram" ));
00312 if ( !item )
00313 return;
00314
00315 KComboBox * combo = m_picProgrammerConfigWidget->kcfg_PicProgrammerProgram;
00316 QString newProgram = combo->currentText();
00317
00318 if ( newProgram != KTLConfig::picProgrammerProgram() )
00319 {
00320 item->setValue( newProgram );
00321 config->setGroup( "PicProgramming" );
00322 if ( newProgram != "picp" )
00323 config->writeEntry( "PicProgrammerProgram", newProgram );
00324 else
00325 config->deleteEntry( "PicProgrammerProgram" );
00326
00327 emit settingsChanged();
00328 }
00329
00330 m_pPicProgrammerSettings->save( config );
00331
00332 config->sync();
00333 }
00334
00335
00336 void SettingsDlg::updateWidgets()
00337 {
00338 m_generalOptionsWidget->refreshRateSlider->setValue( refreshRateToSliderValue( KTLConfig::refreshRate() ) );
00339
00340 m_pPicProgrammerSettings->load( kapp->config() );
00341
00342 QStringList programmerNames = m_pPicProgrammerSettings->configNames( false );
00343
00344 KComboBox * combo = m_picProgrammerConfigWidget->kcfg_PicProgrammerProgram;
00345 combo->clear();
00346 combo->insertStringList( programmerNames );
00347 combo->setSizeLimit( programmerNames.size() );
00348
00349 QTimer::singleShot( 0, this, SLOT(slotUpdateWidgets()) );
00350 }
00351
00352
00353 void SettingsDlg::slotUpdateWidgets()
00354 {
00355 KComboBox * combo = m_picProgrammerConfigWidget->kcfg_PicProgrammerProgram;
00356
00357 combo->setCurrentText( KTLConfig::picProgrammerProgram() );
00358 slotUpdatePicProgrammerDescription();
00359 }
00360
00361
00362 void SettingsDlg::updateWidgetsDefault()
00363 {
00364 m_generalOptionsWidget->refreshRateSlider->setValue( refreshRateToSliderValue( defaultRefreshRate ) );
00365 slotUpdatePicProgrammerDescription();
00366 }
00367
00368
00369 bool SettingsDlg::hasChanged()
00370 {
00371 if ( sliderValueToRefreshRate( m_generalOptionsWidget->refreshRateSlider->value() ) == KTLConfig::refreshRate() )
00372 return KConfigDialog::hasChanged();
00373 return true;
00374 }
00375
00376
00377 bool SettingsDlg::isDefault()
00378 {
00379 if ( sliderValueToRefreshRate( m_generalOptionsWidget->refreshRateSlider->value() ) == defaultRefreshRate )
00380 return KConfigDialog::isDefault();
00381
00382 return false;
00383 }
00384
00385
00386 #include "settingsdlg.moc"