00001 #include "PreferencesDialog.h"
00002
00003 const QString PreferencesDialog::fontSizeNameList[] = {
00004 QT_TR_NOOP( "VerySmall" ), QT_TR_NOOP( "Small" ), QT_TR_NOOP( "Medium" ), QT_TR_NOOP( "Large" ), QT_TR_NOOP( "VeryLarge" )
00005 };
00006
00007 const QString PreferencesDialog::firstLanguageList[] = {
00008 QString( "en" ), QString( "fr" ), QString( "es" ), QString( "ja" )
00009 };
00010
00011 const QString PreferencesDialog::studyLanguageList[] = {
00012 QString( "en" ), QString( "fr" ), QString( "es" ), QString( "ja" ), QString( "de" ), QString( "ar" ), QString( "bg" ), QString( "el" ),
00013 QString( "it" ), QString( "ko" ), QString( "nl" ), QString( "pt" ), QString( "ru" ), QString( "sw" ), QString( "th" ), QString( "vi" ),
00014 QString( "zh" )
00015 };
00016
00017 PreferencesDialog::PreferencesDialog( QWidget* parent, Preferences* prefs )
00018 : QDialog( parent, 0, true ), prefs( prefs ), grabAccelKeyFor( NULL ), ignoreReturn( false ), keyboardAccelModified( false ) {
00019 init();
00020 }
00021
00022 PreferencesDialog::~PreferencesDialog() {
00023 delete languageUpdateNotifier;
00024 }
00025
00026 void PreferencesDialog::init() {
00027 tab = new QTabWidget( this, "Tab" );
00028
00029 quizPage = new QWidget( tab, "QuizPage" );
00030
00031 quizLengthOptionsPanel = new QVGroupBox( tr( "Length" ), quizPage, "QuizLengthOptionsPanel" );
00032 revealingOptionsPanel = new QHGroupBox( tr( "RevealingOrders" ), quizPage, "RevealingOptionsPanel" );
00033
00034 sequencesViewPanel = new QVBox( revealingOptionsPanel );
00035 sequencesViewPanel->setSpacing( 2 );
00036 sequencesView = new SmartListView( sequencesViewPanel, "SequencesView" );
00037 sequencesView->addColumn( QString::null );
00038 sequencesView->header()->hide();
00039 sequencesViewButtons = new QHBox( sequencesViewPanel );
00040 sequencesViewButtons->setSpacing( 2 );
00041
00042 addSequenceButton = new QPushButton( "+", sequencesViewButtons, "AddSequenceButton" );
00043 QToolTip::add( addSequenceButton, tr( "Add revealing sequence" ) );
00044 connect( addSequenceButton, SIGNAL( clicked() ), this, SLOT( addSequence() ) );
00045 removeSequenceButton = new QPushButton( "-", sequencesViewButtons, "RemoveSequenceButton" );
00046 QToolTip::add( removeSequenceButton, tr( "Remove revealing sequence" ) );
00047 connect( removeSequenceButton, SIGNAL( clicked() ), this, SLOT( removeSequence() ) );
00048
00049
00050 initSequences();
00051 connect( sequencesView, SIGNAL( selectionChanged( QListViewItem* ) ), this, SLOT( updateUi() ) );
00052
00053 revealingOptionsPanel->addSpace( 6 );
00054
00055 sequencesLabelBox = new QVGroupBox( tr( "QuizWindow" ), revealingOptionsPanel, "SequencesLabelBox" );
00056 sequencesLabel = new QLabel( sequencesLabelBox );
00057 sequencesLabel->setPixmap( Resource::loadPixmap( "SequenceMapLandscape" ) );
00058
00059 sequencesViewPanel->setMaximumHeight( sequencesLabelBox->sizeHint().height() );
00060
00061 quizLengthSlider = new QSlider( 0, TermScheduler::poolCount - 1, 1, 1, QSlider::Horizontal, quizLengthOptionsPanel, "QuizLengthSlider" );
00062 quizLengthLabelsPanel = new QHBox( quizLengthOptionsPanel, "QuizLengthLabelsPanel" );
00063 quizLengthShortestLabel = new QLabel( tr( "QuizLengthShortest" ), quizLengthLabelsPanel, "QuizLengthShortestLabel" );
00064 quizLengthMediumLabel = new QLabel( tr( "QuizLengthMedium" ), quizLengthLabelsPanel, "QuizLengthMediumLabel" );
00065 quizLengthMediumLabel->setAlignment( QLabel::AlignCenter );
00066 quizLengthLongestLabel = new QLabel( tr( "QuizLengthLongest" ), quizLengthLabelsPanel, "QuizLengthLongestLabel" );
00067 quizLengthLongestLabel->setAlignment( QLabel::AlignRight );
00068
00069 quizLengthSlider->setValue( prefs->getQuizLength() );
00070
00071 quizPageFiller = new QWidget( quizPage, "QuizPageFiller" );
00072
00073 quizLayout = new QVBoxLayout( quizPage );
00074 quizLayout->addWidget( quizLengthOptionsPanel );
00075 quizLayout->addWidget( revealingOptionsPanel );
00076 quizLayout->addWidget( quizPageFiller, 1 );
00077
00078 fontPage = new QWidget( tab, "FontPage" );
00079
00080
00081 fontsPanel = new QVBox( fontPage, "FontsPanel" );
00082 fontsPanel->setSpacing( 2 );
00083
00084 labelsFontPanel = new QHBox( fontsPanel, "LabelsFontPanel" );
00085 labelsFontPanel->setSpacing( 2 );
00086 labelsFontLabel = new QLabel( tr( "LabelsFont" ), labelsFontPanel, "LabelsFontLabel" );
00087 labelsFontFamilyComboBox = new QComboBox( labelsFontPanel, "LabelsFontFamilyComboBox" );
00088 labelsFontSizeComboBox = new QComboBox( labelsFontPanel, "LabelsFontSizeComboBox" );
00089 resetDefaultLabelsFontButton = new QPushButton( tr( "ResetDefaultValue" ), labelsFontPanel, "ResetDefaultLabelsFontButton" );
00090 connect( resetDefaultLabelsFontButton, SIGNAL( clicked() ), this, SLOT( resetDefaultLabelsFont() ) );
00091
00092 initFontFamilyValues( labelsFontFamilyComboBox );
00093 selectFontFamily( labelsFontFamilyComboBox, prefs->getLabelsFontFamily() );
00094 initFontSizeValues( labelsFontSizeComboBox );
00095 selectFontSize( labelsFontSizeComboBox, prefs->getLabelsFontSizeModifier() );
00096
00097 fontPanel = new QHBox( fontsPanel, "FontPanel" );
00098 fontPanel->setSpacing( 2 );
00099 fontLabel = new QLabel( tr( "FieldsFont" ), fontPanel, "FontLabel" );
00100 fontFamilyComboBox = new QComboBox( fontPanel, "FontFamilyComboBox" );
00101 fontSizeComboBox = new QComboBox( fontPanel, "FontSizeComboBox" );
00102 resetDefaultFontButton = new QPushButton( tr( "ResetDefaultValue" ), fontPanel, "ResetDefaultFontButton" );
00103 connect( resetDefaultFontButton, SIGNAL( clicked() ), this, SLOT( resetDefaultFont() ) );
00104
00105 initFontFamilyValues( fontFamilyComboBox );
00106 selectFontFamily( fontFamilyComboBox, prefs->getFontFamily() );
00107 initFontSizeValues( fontSizeComboBox );
00108 selectFontSize( fontSizeComboBox, prefs->getFontSizeModifier() );
00109
00110 fontOverridesPanel = new QVGroupBox( tr( "LanguageFontOverrides" ), fontsPanel, "LanguageFontsPanel" );
00111 fontOverridesScrollView = new QScrollView( fontOverridesPanel, "FontOverridesScrollView" );
00112 fontOverridesScrollView->setResizePolicy( QScrollView::AutoOneFit );
00113 fontOverridesBox = new QWidget( fontOverridesScrollView->viewport() );
00114 fontOverridesBoxLayout = new QVBoxLayout( fontOverridesBox );
00115 fontOverridesScrollView->addChild( fontOverridesBox );
00116 initFontOverrides();
00117
00118 fontPageFiller = new QWidget( fontPage, "FontPageFiller" );
00119
00120 fontPageLayout = new QVBoxLayout( fontPage );
00121 fontPageLayout->setSpacing( 2 );
00122 fontPageLayout->addWidget( fontsPanel );
00123 fontPageLayout->addWidget( fontPageFiller, 1 );
00124
00125 interfacePage = new QWidget( tab, "InterfacePage" );
00126
00127 miscInterfaceOptionsPanel = new QGrid( 2, interfacePage, "MiscInterfaceOptionsPanel" );
00128
00129 digraphPanel = new QVGroupBox( tr( "BuiltInSupportForAccents" ), miscInterfaceOptionsPanel, "DigraphPanel" );
00130 digraphCheckBox = new QCheckBox( tr( "DigraphesEnabled" ), digraphPanel, "DigraphCheckBox" );
00131 digraphCheckBox->setChecked( prefs->isDigraphEnabled() );
00132
00133 hideQuizButtonPanel = new QVGroupBox( tr( "QuizOptions" ), miscInterfaceOptionsPanel, "HideQuizButtonPanel" );
00134 hideQuizButtonCheckBox = new QCheckBox( tr( "hideQuizButtons" ), hideQuizButtonPanel, "HideQuizButtonCheckBox" );
00135 hideQuizButtonCheckBox->setChecked( prefs->areQuizButtonsHidden() );
00136
00137 showAltTextInTermListPanel = new QVGroupBox( tr( "GlossaryManagerOptions" ), miscInterfaceOptionsPanel, "ShowAltTextInTermListPanel" );
00138 showAltTextInTermListCheckBox = new QCheckBox( tr( "ShowAltInTermList" ), showAltTextInTermListPanel, "ShowAltInTermListCheckBox" );
00139 showAltTextInTermListCheckBox->setChecked( prefs->isAltInTermListShown() );
00140
00141 keyboardAccelPanel = new QVGroupBox( tr( "Keyboard Accelerators" ), interfacePage, "KeyboardAccelPanel" );
00142 keyboardAccelListView = new SmartListView( keyboardAccelPanel, "KeyboardAccelListView" );
00143 keyboardAccelListView->addColumn( tr( "Action" ), 280 );
00144 keyboardAccelListView->addColumn( tr( "Key" ), 140 );
00145 keyboardAccelListView->setSorting( -1 );
00146 keyboardAccelListView->setAllColumnsShowFocus( true );
00147 keyboardAccelListView->setStretchColumn( 0 );
00148 int actionCount = sizeof( action ) / sizeof( QAction* );
00149 for( int i = actionCount - 1; i >= 0; i-- ) {
00150 KeyActionListViewItem* actionItem = new KeyActionListViewItem( keyboardAccelListView, action[ i ], (Action)i );
00151 actionItem->setText( 0, action[ i ]->text() );
00152 actionItem->setPixmap( 0, action[ i ]->iconSet().pixmap() );
00153 keyboardAccelListView->insertItem( actionItem );
00154 }
00155 connect( keyboardAccelListView, SIGNAL( returnPressed( QListViewItem* ) ), this, SLOT( keyActionClicked( QListViewItem* ) ) );
00156 connect( keyboardAccelListView, SIGNAL( currentChanged( QListViewItem* ) ), this, SLOT( cancelSetAccelKey() ) );
00157 connect( tab, SIGNAL( selected( const QString& ) ), this, SLOT( cancelSetAccelKey() ) );
00158
00159 keyboardAccelButtonPanel = new QWidget( keyboardAccelPanel, "KeyboardAccelButtonPanel" );
00160 keyboardAccelButtonPanelFiller = new QWidget( keyboardAccelButtonPanel, "KeyboardAccelButtonPanelFiller" );
00161 clearAccelKeyButton = new QPushButton( tr( "Clear key" ), keyboardAccelButtonPanel );
00162 setAccelKeyButton = new QPushButton( tr( "Set key" ), keyboardAccelButtonPanel );
00163 resetAccelKeyButton = new QPushButton( tr( "Reset key" ), keyboardAccelButtonPanel );
00164
00165 keyboardAccelButtonPanelLayout = new QHBoxLayout( keyboardAccelButtonPanel );
00166 keyboardAccelButtonPanelLayout->setSpacing( 2 );
00167 keyboardAccelButtonPanelLayout->addWidget( keyboardAccelButtonPanelFiller, 1 );
00168 keyboardAccelButtonPanelLayout->addWidget( clearAccelKeyButton );
00169 keyboardAccelButtonPanelLayout->addWidget( setAccelKeyButton );
00170 keyboardAccelButtonPanelLayout->addWidget( resetAccelKeyButton );
00171
00172 connect( clearAccelKeyButton, SIGNAL( clicked() ), this, SLOT( clearAccelKey() ) );
00173 connect( setAccelKeyButton, SIGNAL( clicked() ), this, SLOT( setAccelKey() ) );
00174 connect( resetAccelKeyButton, SIGNAL( clicked() ), this, SLOT( resetAccelKey() ) );
00175
00176 interfacePageFiller = new QWidget( interfacePage, "InterfacePageFiller" );
00177
00178 interfacePageLayout = new QVBoxLayout( interfacePage );
00179 interfacePageLayout->setSpacing( 2 );
00180 interfacePageLayout->addWidget( miscInterfaceOptionsPanel );
00181 interfacePageLayout->addWidget( keyboardAccelPanel );
00182 interfacePageLayout->addWidget( interfacePageFiller, 1 );
00183
00184 languagePage = new QWidget( tab, "LanguagePage" );
00185
00186 languagesPanel = new QVBox( languagePage, "LanguagesPanel" );
00187 languagesPanel->setSpacing( 2 );
00188
00189 studyLanguagesListView = new SmartListView( languagesPanel, "StudyLanguagesListView" );
00190 studyLanguagesListView->setAllColumnsShowFocus( true );
00191 studyLanguagesListView->addColumn( tr( "StudyLanguages" ) );
00192 studyLanguagesListView->setStretchColumn( 0 );
00193 languagesPanel->setStretchFactor( studyLanguagesListView, 1 );
00194
00195 languageUpdateNotifier = new LanguageUpdateNotifier();
00196 connect( languageUpdateNotifier, SIGNAL( languageAdded( const QString& ) ), this, SLOT( addFontOverride( const QString& ) ) );
00197 connect( languageUpdateNotifier, SIGNAL( languageRemoved( const QString& ) ), this, SLOT( removeFontOverride( const QString& ) ) );
00198
00199 initStudyLanguageValues();
00200
00201 languagesRightPanel = new QWidget( languagesPanel, "LanguagesRightPanel" );
00202 languagesRightPanelLayout = new QVBoxLayout( languagesRightPanel );
00203
00204 languagesRightPanelFiller = new QWidget( languagesRightPanel, "LanguageRightPanelFiller" );
00205
00206 languagesRightPanelLayout->addWidget( languagesRightPanelFiller, 1 );
00207
00208 languagePageFiller = new QWidget( languagePage, "LanguagePageFiller" );
00209
00210 languageLayout = new QVBoxLayout( languagePage );
00211 languageLayout->setSpacing( 2 );
00212 languageLayout->addWidget( languagesPanel );
00213 languageLayout->addWidget( languagePageFiller, 1 );
00214 tab->addTab( quizPage, tr( "Quiz" ) );
00215 tab->addTab( languagePage, tr( "Languages" ) );
00216 tab->addTab( fontPage, tr( "Fonts" ) );
00217 tab->addTab( interfacePage, tr( "Interface" ) );
00218
00219 mainLayout = new QVBoxLayout( this );
00220 mainLayout->addWidget( tab, 1 );
00221
00222 setCaption( tr( "Preferences..." ) );
00223
00224 updateUi();
00225 }
00226
00227 void PreferencesDialog::initFontFamilyValues( QComboBox* comboBox, bool withEmptyEntry = false ) const {
00228 QFontDatabase fontDatabase;
00229 QStringList families = fontDatabase.families( false );
00230 if( withEmptyEntry )
00231 comboBox->insertItem( QString::null );
00232 comboBox->insertStringList( families );
00233 }
00234
00235 void PreferencesDialog::initFontSizeValues( QComboBox* comboBox, bool withEmptyEntry = false ) const {
00236 int fontSizeNameListLength = sizeof( fontSizeNameList ) / sizeof( QString );
00237 if( withEmptyEntry )
00238 comboBox->insertItem( QString::null );
00239 for( int i = 0; i < fontSizeNameListLength; i++ )
00240 comboBox->insertItem( tr( fontSizeNameList[ i ] ) );
00241 }
00242
00243 void PreferencesDialog::initFontOverrides() {
00244 QValueList<QString> lang( prefs->getStudyLanguages() );
00245 int i = 0;
00246 for( QValueList<QString>::ConstIterator it = lang.begin(); it != lang.end(); it++, i++ ) {
00247 QString language( *it );
00248 QHBox* fontOverrideBox = new QHBox( fontOverridesBox );
00249 fontOverrideBox->setSpacing( 2 );
00250 fontOverrideBox->setMargin( 2 );
00251 QLabel* fontOverrideLabel = new QLabel( QObject::tr( language ), fontOverrideBox );
00252 QComboBox* fontOverrideFamilyComboBox = new QComboBox( fontOverrideBox );
00253 initFontFamilyValues( fontOverrideFamilyComboBox, true );
00254 if( prefs->isFontOverrideFamilyDefined( language ) )
00255 selectFontFamily( fontOverrideFamilyComboBox, prefs->getFontOverrideFamily( language ) );
00256 QComboBox* fontOverrideSizeComboBox = new QComboBox( fontOverrideBox );
00257 initFontSizeValues( fontOverrideSizeComboBox, true );
00258 if( prefs->isFontOverrideSizeDefined( language ) )
00259 selectFontSize( fontOverrideSizeComboBox, prefs->getFontOverrideSize( language ), true );
00260 fontOverrideBox->setStretchFactor( fontOverrideLabel, 1 );
00261
00262 fontOverrideBoxes.append( fontOverrideBox );
00263 fontOverrideLabels.append( fontOverrideLabel );
00264 fontOverrideFamilyComboBoxes.append( fontOverrideFamilyComboBox );
00265 fontOverrideSizeComboBoxes.append( fontOverrideSizeComboBox );
00266
00267 fontOverridesBoxLayout->addWidget( fontOverrideBox, 0 );
00268 }
00269 fontOverridesBoxFiller = new QWidget( fontOverridesBox );
00270 fontOverridesBoxLayout->addWidget( fontOverridesBoxFiller, 1 );
00271 }
00272
00273 void PreferencesDialog::initSequences() {
00274 int seqCount = prefs->getRevealingSequenceCount();
00275 for( int i = 0; i < seqCount; i++ ) {
00276 Sequence seq = prefs->getRevealingSequenceAt( i );
00277 SequenceListItem* item = new SequenceListItem( sequencesView, seq.toHumanReadableString(), seq );
00278 item->setOn( seq.isEnabled() );
00279 }
00280 }
00281
00282 void PreferencesDialog::initStudyLanguageValues() const {
00283 int studyLanguageListLength = sizeof( studyLanguageList ) / sizeof( QString );
00284 for( int i = 0; i < studyLanguageListLength; i++ ) {
00285 StudyLanguageItem* lang = new StudyLanguageItem( studyLanguagesListView, languageUpdateNotifier );
00286 lang->setText( 0, QObject::tr( studyLanguageList[ i ] ) );
00287 bool isStudied( prefs->isStudyLanguage( studyLanguageList[ i ] ) );
00288 lang->setOn( isStudied );
00289 studyLanguagesListView->insertItem( lang );
00290 }
00291 }
00292
00293 void PreferencesDialog::selectFontFamily( QComboBox* comboBox, const QString& fontFamily ) {
00294 for( int i = 0; i < comboBox->count(); i++ ) {
00295 if( comboBox->text( i ) == fontFamily )
00296 comboBox->setCurrentItem( i );
00297 }
00298 }
00299
00300 void PreferencesDialog::selectFontSize( QComboBox* comboBox, int fontSizeModifier, bool withEmptyEntry = false ) {
00301 int fontSizeNameListLength = sizeof( fontSizeNameList ) / sizeof( QString );
00302 int sizeIndex = fontSizeModifier + ( fontSizeNameListLength - 1 ) / 2;
00303 if( withEmptyEntry )
00304 sizeIndex++;
00305 comboBox->setCurrentItem( sizeIndex );
00306 }
00307
00308 void PreferencesDialog::selectLanguage( QComboBox* comboBox, const QString& langCode ) {
00309 int itemCount = comboBox->count();
00310 for( int i = 0; i < itemCount; i++ ) {
00311 if( comboBox->text( i ) == QObject::tr( langCode ) ) {
00312 comboBox->setCurrentItem( i );
00313 return;
00314 }
00315 }
00316 }
00317
00318 void PreferencesDialog::accept() {
00319 cancelSetAccelKey();
00320
00321 if( !isRevealingSequenceSelectionValid() ) {
00322 tab->showPage( quizPage );
00323 QMessageBox::warning( this, QObject::tr( "Warning" ), tr( "RevealingOrderMandatory" ) );
00324 return;
00325 }
00326
00327 if( !isStudyLanguageSelectionValid() ) {
00328 tab->showPage( languagePage );
00329 QMessageBox::warning( this, QObject::tr( "Warning" ), tr( "StudyLanguagesMandatory" ) );
00330 return;
00331 }
00332
00333 prefs->setQuizLength( quizLengthSlider->value() );
00334
00335 prefs->clearRevealingSequences();
00336 for( SequenceListItem* item = (SequenceListItem*)sequencesView->firstChild(); item; item = (SequenceListItem*)item->nextSibling() )
00337 prefs->addRevealingSequence( item->getSequence() );
00338
00339 prefs->setLabelsFontFamily( labelsFontFamilyComboBox->text( labelsFontFamilyComboBox->currentItem() ) );
00340 int fontSizeNameListLength = sizeof( fontSizeNameList ) / sizeof( QString );
00341 int labelsFontSizeModifier = labelsFontSizeComboBox->currentItem() - ( fontSizeNameListLength - 1 ) / 2;
00342 prefs->setLabelsFontSizeModifier( labelsFontSizeModifier );
00343
00344 prefs->setFontFamily( fontFamilyComboBox->text( fontFamilyComboBox->currentItem() ) );
00345 int fontSizeModifier = fontSizeComboBox->currentItem() - ( fontSizeNameListLength - 1 ) / 2;
00346 prefs->setFontSizeModifier( fontSizeModifier );
00347
00348 prefs->clearFontOverrideFamilies();
00349 prefs->clearFontOverrideSizes();
00350 int fontOverrideCount = fontOverrideLabels.count();
00351 for( int i = 0; i < fontOverrideCount; i++ ) {
00352 const QString& language = Util::getLanguageCode( fontOverrideLabels.at( i )->text() );
00353 if( fontOverrideFamilyComboBoxes.at( i )->currentItem() > 0 )
00354 prefs->setFontOverrideFamily( language, fontOverrideFamilyComboBoxes.at( i )->currentText() );
00355 if( fontOverrideSizeComboBoxes.at( i )->currentItem() > 0 ) {
00356 int fontSizeModifier = ( fontOverrideSizeComboBoxes.at( i )->currentItem() - 1 ) - ( fontSizeNameListLength - 1 ) / 2;
00357 prefs->setFontOverrideSize( language, fontSizeModifier );
00358 }
00359 }
00360
00361 bool firstLanguageExists = false;
00362 bool testLanguageExists = false;
00363 prefs->clearStudyLanguages();
00364 for( QCheckListItem* item = (QCheckListItem*)studyLanguagesListView->firstChild(); item; item = (QCheckListItem*)item->nextSibling() ) {
00365 if( item->isOn() ) {
00366 QString langCode( Util::getLanguageCode( item->text() ) );
00367 prefs->addStudyLanguage( langCode );
00368 if( !firstLanguageExists )
00369 firstLanguageExists = ( prefs->getFirstLanguage() == langCode );
00370 if( !testLanguageExists )
00371 testLanguageExists = (prefs->getTestLanguage() == langCode );
00372 }
00373 }
00374 if( !firstLanguageExists )
00375 prefs->setFirstLanguage( QString::null );
00376 if( !testLanguageExists )
00377 prefs->setTestLanguage( QString::null );
00378
00379 prefs->setDigraphEnabled( digraphCheckBox->isOn() );
00380 prefs->setQuizButtonsHidden( hideQuizButtonCheckBox->isOn() );
00381 prefs->setAltInTermListShown( showAltTextInTermListCheckBox->isOn() );
00382
00383 if( keyboardAccelModified ) {
00384 for( KeyActionListViewItem* item = (KeyActionListViewItem*)keyboardAccelListView->firstChild(); item ;
00385 item = (KeyActionListViewItem*)item->nextSibling() ) {
00386 QAction *action = item->getAction();
00387 action->setAccel( item->getKey() );
00388 prefs->setAccelerator( item->getActionIndex(), item->getKey() );
00389 }
00390 }
00391
00392 QDialog::accept();
00393 }
00394
00395 void PreferencesDialog::updateUi() {
00396 removeSequenceButton->setEnabled( sequencesView->currentItem() );
00397 }
00398
00399 bool PreferencesDialog::isRevealingSequenceSelectionValid() const {
00400 for( SequenceListItem* item = (SequenceListItem*)sequencesView->firstChild(); item; item = (SequenceListItem*)item->nextSibling() ) {
00401 if( item->isOn() )
00402 return( true );
00403 }
00404
00405 return( false );
00406 }
00407
00408 bool PreferencesDialog::isRevealingSequenceDefined( const QString& seqStr ) const {
00409 for( SequenceListItem* item = (SequenceListItem*)sequencesView->firstChild(); item; item = (SequenceListItem*)item->nextSibling() ) {
00410 if( item->getSequence().toHumanReadableString() == seqStr )
00411 return( true );
00412 }
00413
00414 return( false );
00415 }
00416
00417 bool PreferencesDialog::isStudyLanguageSelectionValid() const {
00418 int checkedLangCount = 0;
00419 for( QCheckListItem* item = (QCheckListItem*)studyLanguagesListView->firstChild(); item; item = (QCheckListItem*)item->nextSibling() ) {
00420 if( item->isOn() )
00421 checkedLangCount++;
00422 }
00423 return( checkedLangCount >= 2 );
00424 }
00425
00426 void PreferencesDialog::resizeEvent( QResizeEvent* evt ) {
00427 QString pictFilename( "SequenceMap" + (QString)( evt->size().width() > evt->size().height() ? "Landscape" : "Portrait" ) );
00428 sequencesLabel->setPixmap( Resource::loadPixmap( pictFilename ) );
00429 sequencesViewPanel->setMaximumHeight( sequencesLabelBox->sizeHint().height() );
00430 QDialog::resizeEvent( evt );
00431 }
00432
00433 void PreferencesDialog::resetDefaultLabelsFont() {
00434 selectFontFamily( labelsFontFamilyComboBox, prefs->getDefaultLabelsFontFamily() );
00435 selectFontSize( labelsFontSizeComboBox, prefs->getDefaultLabelsFontSizeModifier() );
00436 }
00437
00438 void PreferencesDialog::resetDefaultFont() {
00439 selectFontFamily( fontFamilyComboBox, prefs->getDefaultFontFamily() );
00440 selectFontSize( fontSizeComboBox, prefs->getDefaultFontSizeModifier() );
00441 }
00442
00443 void PreferencesDialog::addFontOverride( const QString& language ) {
00444
00445 int fontOverrideCount = fontOverrideLabels.count();
00446 for( int i = 0; i < fontOverrideCount; i++ ) {
00447 if( fontOverrideLabels.at( i )->text() == QObject::tr( language ) )
00448 return;
00449 }
00450
00451 QHBox* fontOverrideBox = new QHBox( fontOverridesBox );
00452 fontOverrideBox->setSpacing( 2 );
00453 fontOverrideBox->setMargin( 2 );
00454 QLabel* fontOverrideLabel = new QLabel( QObject::tr( language ), fontOverrideBox );
00455 QComboBox* fontOverrideFamilyComboBox = new QComboBox( fontOverrideBox );
00456 initFontFamilyValues( fontOverrideFamilyComboBox, true );
00457 if( prefs->isFontOverrideFamilyDefined( language ) )
00458 selectFontFamily( fontOverrideFamilyComboBox, prefs->getFontOverrideFamily( language ) );
00459 QComboBox* fontOverrideSizeComboBox = new QComboBox( fontOverrideBox );
00460 initFontSizeValues( fontOverrideSizeComboBox, true );
00461 if( prefs->isFontOverrideSizeDefined( language ) )
00462 selectFontSize( fontOverrideSizeComboBox, prefs->getFontOverrideSize( language ), true );
00463 fontOverrideBox->setStretchFactor( fontOverrideLabel, 1 );
00464
00465 fontOverrideBoxes.append( fontOverrideBox );
00466 fontOverrideLabels.append( fontOverrideLabel );
00467 fontOverrideFamilyComboBoxes.append( fontOverrideFamilyComboBox );
00468 fontOverrideSizeComboBoxes.append( fontOverrideSizeComboBox );
00469
00470 int indexOfFiller = fontOverridesBoxLayout->findWidget( fontOverridesBoxFiller );
00471 fontOverridesBoxLayout->insertWidget( indexOfFiller, fontOverrideBox );
00472 }
00473
00474 void PreferencesDialog::removeFontOverride( const QString& language ) {
00475 int fontOverrideCount = fontOverrideLabels.count();
00476 for( int i = 0; i < fontOverrideCount; i++ ) {
00477 if( fontOverrideLabels.at( i )->text() == QObject::tr( language ) ) {
00478 QHBox* fontOverrideBox = fontOverrideBoxes.at( i );
00479
00480 fontOverrideLabels.remove( i );
00481 fontOverrideFamilyComboBoxes.remove( i );
00482 fontOverrideSizeComboBoxes.remove( i );
00483 fontOverrideBoxes.remove( i );
00484
00485 fontOverridesBox->removeChild( fontOverrideBox );
00486
00487 break;
00488 }
00489 }
00490 }
00491
00492 void PreferencesDialog::setAccelKey() {
00493 KeyActionListViewItem* item = (KeyActionListViewItem*)keyboardAccelListView->currentItem();
00494 if( item == NULL )
00495 return;
00496 item->setText( 1, tr( "<press key>" ) );
00497 grabAccelKeyFor = item;
00498 grabKeyboard();
00499 }
00500
00501 void PreferencesDialog::clearAccelKey() {
00502 cancelSetAccelKey();
00503
00504 KeyActionListViewItem* item = (KeyActionListViewItem*)keyboardAccelListView->currentItem();
00505 if( item == NULL )
00506 return;
00507 item->setKey( 0 );
00508 keyboardAccelModified = true;
00509 }
00510
00511 void PreferencesDialog::resetAccelKey() {
00512 cancelSetAccelKey();
00513
00514 KeyActionListViewItem* item = (KeyActionListViewItem*)keyboardAccelListView->currentItem();
00515 if( item == NULL )
00516 return;
00517 item->setKey( prefs->getDefaultAccelerator( item->getActionIndex() ) );
00518 keyboardAccelModified = true;
00519 }
00520
00521 void PreferencesDialog::cancelSetAccelKey() {
00522 if( grabAccelKeyFor != NULL ) {
00523 KeyActionListViewItem* ka = (KeyActionListViewItem*)grabAccelKeyFor;
00524 ka->updateText();
00525 grabAccelKeyFor = NULL;
00526 releaseKeyboard();
00527 }
00528 }
00529
00530 void PreferencesDialog::keyActionClicked( QListViewItem* ) {
00531 ignoreReturn = true;
00532 setAccelKey();
00533 }
00534
00535 void PreferencesDialog::keyPressEvent( QKeyEvent *evt ) {
00536 if( grabAccelKeyFor != NULL ) {
00537 switch (evt->key()) {
00538 case Key_Shift:
00539 case Key_Control:
00540 case Key_Meta:
00541 case Key_Alt:
00542 case Key_CapsLock:
00543 case Key_NumLock:
00544 case Key_ScrollLock:
00545 case Key_F22:
00546 evt->ignore();
00547 break;
00548 default:
00549 if( ignoreReturn && evt->key() == Key_Return ) {
00550 evt->ignore();
00551 break;
00552 }
00553
00554
00555 KeyActionListViewItem *ka = (KeyActionListViewItem*)grabAccelKeyFor;
00556
00557 int keyCode = evt->key();
00558 if( (evt->state() & ShiftButton) != 0 )
00559 keyCode |= SHIFT;
00560 if( (evt->state() & AltButton) != 0 )
00561 keyCode |= ALT;
00562 if( (evt->state() & ControlButton) != 0 )
00563 keyCode |= CTRL;
00564
00565
00566 releaseKeyboard();
00567
00568
00569 bool cancelBinding = false;
00570 for( KeyActionListViewItem *item = (KeyActionListViewItem*)keyboardAccelListView->firstChild(); item != NULL;
00571 item = (KeyActionListViewItem*)item->nextSibling() ) {
00572 if( item == ka )
00573 continue;
00574
00575 if( item->getKey() == keyCode ) {
00576 int sel = QMessageBox::warning( this, tr( "Duplicate key binding" ),
00577 tr( "Key '" ) + Util::describeKey( keyCode ) + tr( "'\nis currently assigned to\n'" ) + item->getAction()->text() +
00578 tr( "'.\nOverwrite the current assignment?" ), QMessageBox::No, QMessageBox::Yes );
00579 if( sel == QMessageBox::Yes )
00580 item->setKey( 0 );
00581 else {
00582 cancelBinding = true;
00583 break;
00584 }
00585 }
00586 }
00587
00588 if( cancelBinding )
00589 ka->updateText();
00590 else {
00591 ka->setKey( keyCode );
00592 keyboardAccelModified = true;
00593 }
00594
00595 grabAccelKeyFor = NULL;
00596 evt->accept();
00597 break;
00598 }
00599 }
00600 ignoreReturn = false;
00601
00602 QDialog::keyPressEvent( evt );
00603 }
00604
00605 void PreferencesDialog::addSequence() {
00606 SequenceDialog dialog( prefs, this );
00607 dialog.showMaximized();
00608 int result = dialog.exec();
00609 if( result ) {
00610 Sequence sequence = dialog.getSequence();
00611
00612 if( !isRevealingSequenceDefined( sequence.toHumanReadableString() ) ) {
00613 SequenceListItem* item = new SequenceListItem( sequencesView, sequence.toHumanReadableString(), sequence );
00614 item->setOn( true );
00615 }
00616 }
00617 }
00618
00619 void PreferencesDialog::removeSequence() {
00620 QListViewItem* currSeqItem = sequencesView->currentItem();
00621 if( currSeqItem ) {
00622 delete( currSeqItem );
00623 updateUi();
00624 }
00625 }