settingsdlg.cpp

00001 /***************************************************************************
00002  *   Copyright (C) 2005 by David Saxton                                    *
00003  *   david@bluehaze.org                                                    *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
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 // Make sure that this value is the same as that in ktechlab.kcfg
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"

Generated on Tue May 8 17:05:32 2007 for KTechLab by  doxygen 1.5.1