00001 #include "Preferences.h"
00002
00003 const uint Preferences::fontSizeList[] = { 10, 12, 16, 18, 24, 32, 48, 72 };
00004
00005 Preferences::Preferences()
00006 : quizLength( MEDIUM ), interfaceLanguage( QString( "en" ) ), digraphEnabled( false ), quizButtonsHidden( false ), altInTermListShown( false ),
00007 firstLanguage( QString( "en" ) ), testLanguage( QString( "ja" ) ),
00008 labelsFontFamily( Util::getDefaultLabelsFontFamily() ), labelsFontSizeModifier( Util::getDefaultLabelsFontSizeModifier() ),
00009 fontFamily( Util::getDefaultFontFamily() ), fontSizeModifier( Util::getDefaultFontSizeModifier() ),
00010 languageFilterEnabled( true ) {
00011 initDefaultKeyboardAccelerators();
00012
00013 sequences.clear();
00014 sequences.append( Sequence( "0+4-2-1+3:off" ) );
00015 sequences.append( Sequence( "0-2+4-1+3:on" ) );
00016 sequences.append( Sequence( "2+4-1-0+3:off" ) );
00017
00018 studyLanguages.clear();
00019 studyLanguages.append( QString( "en" ) );
00020 studyLanguages.append( QString( "ja" ) );
00021 }
00022
00023 Preferences::~Preferences() {
00024 }
00025
00026 bool Preferences::load() {
00027 QFile prefsFile( prefsFilename );
00028 if( prefsFile.exists() ) {
00029 if( !prefsFile.open( IO_ReadOnly ) ) {
00030 cerr << "Cannot open prefs data file: " << prefsFilename << endl;
00031 return( false );
00032 }
00033
00034 QByteArray compressedData( prefsFile.readAll() );
00035 QByteArray data( Util::qUncompress( compressedData ) );
00036
00037 QDataStream in( data, IO_ReadOnly );
00038
00039 Q_UINT32 tempMagicNumber;
00040 Q_UINT16 tempVersion;
00041
00042 uint tempQuizLength;
00043 SequenceList tempSequences;
00044 int tempLanguageFilterEnabledAsInt;
00045 QString tempInterfaceLanguage;
00046 int tempDigraphEnabledAsInt;
00047 int tempQuizButtonsHiddenAsInt;
00048 int tempAltInTermListShownAsInt;
00049 QString tempFirstLanguage;
00050 QString tempTestLanguage;
00051 QValueList<QString> tempStudyLanguages;
00052 QValueList<int> tempClosedFolders;
00053 QString tempLabelsFontFamily;
00054 int tempLabelsFontSizeModifier;
00055 QString tempFontFamily;
00056 int tempFontSizeModifier;
00057 QMap<QString,QString> tempFontOverrideFamilies;
00058 QMap<QString,int> tempFontOverrideSizes;
00059 QMap<int,int> tempAccel;
00060
00061 in >> tempMagicNumber >> tempVersion;
00062
00063 if( tempMagicNumber != Preferences::magicNumber )
00064 cerr << "Wrong magic number: Incompatible data file for prefs file." << endl;
00065 if( tempVersion > 0x0011 )
00066 cerr << "Prefs data file is from a more recent version. Upgrade toMOTko." << endl;
00067
00068 in.setVersion( 3 );
00069 in >> tempQuizLength >> tempSequences;
00070 in >> tempLanguageFilterEnabledAsInt >> tempInterfaceLanguage >> tempDigraphEnabledAsInt >> tempQuizButtonsHiddenAsInt >> tempAltInTermListShownAsInt;
00071 in >> tempFirstLanguage >> tempTestLanguage;
00072 in >> tempStudyLanguages;
00073 in >> tempClosedFolders;
00074 in >> tempLabelsFontFamily >> tempLabelsFontSizeModifier >> tempFontFamily >> tempFontSizeModifier >> tempFontOverrideFamilies >> tempFontOverrideSizes;
00075 in >> tempAccel;
00076
00077 prefsFile.close();
00078
00079 quizLength = tempQuizLength;
00080 sequences = tempSequences;
00081 languageFilterEnabled = ( tempLanguageFilterEnabledAsInt == 1 );
00082 interfaceLanguage = tempInterfaceLanguage;
00083 digraphEnabled = ( tempDigraphEnabledAsInt == 1 );
00084 quizButtonsHidden = ( tempQuizButtonsHiddenAsInt == 1 );
00085 altInTermListShown = ( tempAltInTermListShownAsInt == 1 );
00086 firstLanguage = tempFirstLanguage;
00087 testLanguage = tempTestLanguage;
00088 studyLanguages = tempStudyLanguages;
00089 closedFolders = tempClosedFolders;
00090 labelsFontFamily = tempLabelsFontFamily;
00091 labelsFontSizeModifier = tempLabelsFontSizeModifier;
00092 fontFamily = tempFontFamily;
00093 fontSizeModifier = tempFontSizeModifier;
00094 fontOverrideFamilies = tempFontOverrideFamilies;
00095 fontOverrideSizes = tempFontOverrideSizes;
00096 accel = tempAccel;
00097 }
00098 else {
00099 QFile prefsXmlFile( prefsXmlFilename );
00100 if( prefsXmlFile.exists() ) {
00101 PreferencesParser parser;
00102 QXmlInputSource source( prefsXmlFile );
00103 QXmlSimpleReader reader;
00104 reader.setContentHandler( &parser );
00105 reader.parse( source );
00106 setQuizLength( parser.getQuizLength() );
00107 int seqCount = parser.getRevealingSequenceCount();
00108 if( seqCount > 0 ) {
00109 clearRevealingSequences();
00110 for( int i = 0; i < seqCount; i++ ) {
00111 Sequence seq = parser.getRevealingSequenceAt( i );
00112 addRevealingSequence( seq );
00113 }
00114 }
00115 setInterfaceLanguage( parser.getInterfaceLanguage() );
00116 setDigraphEnabled( parser.isDigraphEnabled() );
00117 setQuizButtonsHidden( parser.areQuizButtonsHidden() );
00118 setAltInTermListShown( parser.isAltInTermListShown() );
00119 setFirstLanguage( parser.getFirstLanguage() );
00120 QValueList<QString> tempStudyLanguages( parser.getStudyLanguages() );
00121 if( !tempStudyLanguages.isEmpty() ) {
00122 studyLanguages.clear();
00123 for( QValueList<QString>::ConstIterator it = tempStudyLanguages.begin(); it != tempStudyLanguages.end(); it++ ) {
00124 QString language(*it);
00125 addStudyLanguage( language );
00126 if( parser.isFontOverrideFamilyDefined( language ) )
00127 setFontOverrideFamily( language, parser.getFontOverrideFamily( language ) );
00128 if( parser.isFontOverrideSizeDefined( language ) )
00129 setFontOverrideSize( language, parser.getFontOverrideSize( language ) );
00130 }
00131 }
00132 setTestLanguage( parser.getTestLanguage() );
00133 setLabelsFontFamily( parser.getLabelsFontFamily() );
00134 setLabelsFontSizeModifier( parser.getLabelsFontSizeModifier() );
00135 setFontFamily( parser.getFontFamily() );
00136 setFontSizeModifier( parser.getFontSizeModifier() );
00137 setLanguageFilterEnabled( parser.isLanguageFilterEnabled() );
00138 QValueList<int> closedFolders = parser.getClosedFolders();
00139 for( QValueList<int>::ConstIterator it = closedFolders.begin(); it != closedFolders.end(); it++ )
00140 setFolderOpen( *it, false );
00141 QMap<int,int> accels = parser.getAccelerators();
00142 for( QMap<int,int>::ConstIterator it = accels.begin(); it != accels.end(); it++ )
00143 setAccelerator( (Action)it.key(), it.data() );
00144 }
00145 }
00146 return( true );
00147 }
00148
00149 bool Preferences::save() {
00150 QByteArray data;
00151
00152 QDataStream out( data, IO_WriteOnly );
00153 out.setVersion( 3 );
00154
00155
00156 out << Q_UINT32( Preferences::magicNumber ) << Q_UINT16( 0x0011 );
00157
00158 out << quizLength << sequences;
00159 int languageFilterEnabledAsInt = ( languageFilterEnabled ? 1 : 0 );
00160 int digraphEnabledAsInt = ( digraphEnabled ? 1 : 0 );
00161 int quizButtonsHiddenAsInt = ( quizButtonsHidden ? 1 : 0 );
00162 int altInTermListShownAsInt = ( altInTermListShown ? 1 : 0 );
00163 out << languageFilterEnabledAsInt << interfaceLanguage << digraphEnabledAsInt << quizButtonsHiddenAsInt << altInTermListShownAsInt;
00164 out << firstLanguage << testLanguage;
00165 out << studyLanguages;
00166 out << closedFolders;
00167 out << labelsFontFamily << labelsFontSizeModifier << fontFamily << fontSizeModifier << fontOverrideFamilies << fontOverrideSizes;
00168 out << accel;
00169
00170 QByteArray compressedData( Util::qCompress( data ) );
00171
00172 QFile dataFile( prefsFilename );
00173 QFileInfo dataFileInfo( dataFile );
00174
00175 if( !Util::makeDirectory( dataFileInfo.dirPath() ) )
00176 return( false );
00177
00178 if( !dataFile.open( IO_WriteOnly ) )
00179 return( false );
00180
00181 int ret = dataFile.writeBlock( compressedData );
00182 dataFile.close();
00183
00184 if( ret == -1 || dataFile.status() != IO_Ok ) {
00185 dataFile.resetStatus();
00186 return( false );
00187 }
00188
00189 return( true );
00190 }
00191
00192 uint Preferences::getQuizLength() const {
00193 return( quizLength );
00194 }
00195
00196 void Preferences::setQuizLength( uint quizLength ) {
00197 this->quizLength = quizLength;
00198 }
00199
00200 void Preferences::clearRevealingSequences() {
00201 sequences.clear();
00202 }
00203
00204 void Preferences::addRevealingSequence( Sequence sequence ) {
00205 sequences.append( sequence );
00206 }
00207
00208 int Preferences::getRevealingSequence( const QString& seqStr ) {
00209 int i = 0;
00210 for( SequenceList::ConstIterator it = sequences.begin(); it != sequences.end(); it++, i++ ) {
00211 Sequence seq = *it;
00212 if( seq.toHumanReadableString() == seqStr )
00213 return( i );
00214 }
00215 return( -1 );
00216 }
00217
00218 void Preferences::removeRevealingSequence( int index ) {
00219 sequences.remove( sequences.at( index ) );
00220 }
00221
00222 void Preferences::removeRevealingSequence( const QString& seqStr ) {
00223 for( SequenceList::Iterator it = sequences.begin(); it != sequences.end(); it++ ) {
00224 Sequence seq = *it;
00225 if( seq.toHumanReadableString() == seqStr )
00226 sequences.remove( it );
00227 }
00228 }
00229
00230 int Preferences::getActiveRevealingSequenceCount() {
00231 int count = 0;
00232 for( SequenceList::Iterator it = sequences.begin(); it != sequences.end(); it++ ) {
00233 Sequence seq = *it;
00234 if( seq.isEnabled() )
00235 count++;
00236 }
00237 return( count );
00238 }
00239
00240 int Preferences::getRevealingSequenceCount() const {
00241 return( sequences.count() );
00242 }
00243
00244 Sequence Preferences::getRevealingSequenceAt( int index ) {
00245 return( sequences[ index ] );
00246 }
00247
00248 QString Preferences::getInterfaceLanguage() const {
00249 return( interfaceLanguage );
00250 }
00251
00252 void Preferences::setInterfaceLanguage( const QString& interfaceLanguage ) {
00253 this->interfaceLanguage = interfaceLanguage;
00254 }
00255
00256 bool Preferences::isDigraphEnabled() const {
00257 return( digraphEnabled );
00258 }
00259
00260 void Preferences::setDigraphEnabled( bool isEnabled ) {
00261 this->digraphEnabled = isEnabled;
00262 }
00263
00264 bool Preferences::areQuizButtonsHidden() const {
00265 return( quizButtonsHidden );
00266 }
00267
00268 void Preferences::setQuizButtonsHidden( bool areHidden ) {
00269 this->quizButtonsHidden = areHidden;
00270 }
00271
00272 bool Preferences::isAltInTermListShown() const {
00273 return( altInTermListShown );
00274 }
00275
00276 void Preferences::setAltInTermListShown( bool isShown ) {
00277 this->altInTermListShown = isShown;
00278 }
00279
00280 QString Preferences::getFirstLanguage() const {
00281 return( firstLanguage );
00282 }
00283
00284 void Preferences::setFirstLanguage( const QString& firstLanguage ) {
00285 this->firstLanguage = firstLanguage;
00286 }
00287
00288 QValueList<QString> Preferences::getStudyLanguages() {
00289 return( studyLanguages );
00290 }
00291
00292 bool Preferences::isStudyLanguage( const QString& language ) {
00293 return( studyLanguages.contains( language ) );
00294 }
00295
00296 void Preferences::addStudyLanguage( const QString& language ) {
00297 studyLanguages.append( language );
00298 }
00299
00300 void Preferences::removeStudyLanguage( const QString& language ) {
00301 studyLanguages.remove( language );
00302 }
00303
00304 void Preferences::clearStudyLanguages() {
00305 studyLanguages.clear();
00306 }
00307
00308 QString Preferences::getTestLanguage() const {
00309 return( testLanguage );
00310 }
00311
00312 void Preferences::setTestLanguage( const QString& testLanguage ) {
00313 this->testLanguage = testLanguage;
00314 }
00315
00316 QString Preferences::getFontFamily() const {
00317 return( fontFamily );
00318 }
00319
00320 void Preferences::setFontFamily( const QString& fontFamily ) {
00321 this->fontFamily = fontFamily;
00322 }
00323
00324 QString Preferences::getDefaultFontFamily() const {
00325 return( Util::getDefaultFontFamily() );
00326 }
00327
00328 int Preferences::getDefaultFontSizeModifier() const {
00329 return( Util::getDefaultFontSizeModifier() );
00330 }
00331
00332 int Preferences::getFontSizeModifier() const {
00333 return( fontSizeModifier );
00334 }
00335
00336 void Preferences::setFontSizeModifier( int fontSizeModifier ) {
00337 this->fontSizeModifier = fontSizeModifier;
00338 }
00339
00340 QFont Preferences::getLargeFont( const QString& language = QString::null ) const {
00341 QString family( isFontOverrideFamilyDefined( language ) ? getFontOverrideFamily( language ) : fontFamily );
00342 int sizeModif( isFontOverrideSizeDefined( language ) ? getFontOverrideSize( language ) : getFontSizeModifier() );
00343 return( getFont( family, fontSizeList[ 4 + sizeModif ] ) );
00344 }
00345
00346 QFont Preferences::getMediumFont( const QString& language = QString::null ) const {
00347 QString family( isFontOverrideFamilyDefined( language ) ? getFontOverrideFamily( language ) : fontFamily );
00348 int sizeModif( isFontOverrideSizeDefined( language ) ? getFontOverrideSize( language ) : getFontSizeModifier() );
00349 return( getFont( family, fontSizeList[ 3 + sizeModif ] ) );
00350 }
00351
00352 QFont Preferences::getSmallFont( const QString& language = QString::null ) const {
00353 QString family( isFontOverrideFamilyDefined( language ) ? getFontOverrideFamily( language ) : fontFamily );
00354 int sizeModif( isFontOverrideSizeDefined( language ) ? getFontOverrideSize( language ) : getFontSizeModifier() );
00355 return( getFont( family, fontSizeList[ 2 + sizeModif ] ) );
00356 }
00357
00358 QFont Preferences::getBestFont( const QString& lang1, const QString& lang2 ) const {
00359 if( lang1 == QString( "en" ) )
00360 return( getMediumFont( lang2 ) );
00361 else if( lang2 == QString( "en" ) )
00362 return( getMediumFont( lang1 ) );
00363 else {
00364 QFont font1( getMediumFont( lang1 ) );
00365 QFont font2( getMediumFont( lang2 ) );
00366 if( font1.family() == font2.family() ) {
00367 int pointSize = font1.pointSize() > font2.pointSize() ? font1.pointSize() : font2.pointSize();
00368 return( QFont( font1.family(), pointSize ) );
00369 }
00370 else
00371 return( getMediumFont() );
00372 }
00373 }
00374
00375 QString Preferences::getLabelsFontFamily() const {
00376 return( labelsFontFamily );
00377 }
00378
00379 void Preferences::setLabelsFontFamily( const QString& labelsFontFamily ) {
00380 this->labelsFontFamily = labelsFontFamily;
00381 }
00382
00383 QString Preferences::getDefaultLabelsFontFamily() const {
00384 return( Util::getDefaultLabelsFontFamily() );
00385 }
00386
00387 int Preferences::getDefaultLabelsFontSizeModifier() const {
00388 return( Util::getDefaultLabelsFontSizeModifier() );
00389 }
00390
00391 int Preferences::getLabelsFontSizeModifier() const {
00392 return( labelsFontSizeModifier );
00393 }
00394
00395 void Preferences::setLabelsFontSizeModifier( int labelsFontSizeModifier ) {
00396 this->labelsFontSizeModifier = labelsFontSizeModifier;
00397 }
00398
00399 QFont Preferences::getLabelsFont() const {
00400 return( getFont( labelsFontFamily, fontSizeList[ 3 + getLabelsFontSizeModifier() ] ) );
00401 }
00402
00403 QString Preferences::getFontOverrideFamily( const QString& language ) const {
00404 return( fontOverrideFamilies[ language ] );
00405 }
00406
00407 int Preferences::getFontOverrideSize( const QString& language ) const {
00408 return( fontOverrideSizes[ language ] );
00409 }
00410
00411 void Preferences::setFontOverrideFamily( const QString& language, const QString& fontFamily ) {
00412 fontOverrideFamilies[ language ] = fontFamily;
00413 }
00414
00415 void Preferences::setFontOverrideSize( const QString& language, int fontSize ) {
00416 fontOverrideSizes[ language ] = fontSize;
00417 }
00418
00419 bool Preferences::isFontOverrideFamilyDefined( const QString& language ) const {
00420 return( fontOverrideFamilies.contains( language ) );
00421 }
00422
00423 bool Preferences::isFontOverrideSizeDefined( const QString& language ) const {
00424 return( fontOverrideSizes.contains( language ) );
00425 }
00426
00427 void Preferences::clearFontOverrideFamilies() {
00428 fontOverrideFamilies.clear();
00429 }
00430
00431 void Preferences::clearFontOverrideSizes() {
00432 fontOverrideSizes.clear();
00433 }
00434
00435 void Preferences::setLanguageFilterEnabled( bool isEnabled ) {
00436 languageFilterEnabled = isEnabled;
00437 }
00438
00439 bool Preferences::isLanguageFilterEnabled() const {
00440 return( languageFilterEnabled );
00441 }
00442
00443 bool Preferences::isFolderOpen( int folderId ) const {
00444 return( !closedFolders.contains( folderId ) );
00445 }
00446
00447 void Preferences::setFolderOpen( int folderId, bool isOpen ) {
00448 if( isOpen )
00449 closedFolders.remove( folderId );
00450 else {
00451 if( !closedFolders.contains( folderId ) )
00452 closedFolders.append( folderId );
00453 }
00454 }
00455
00456 void Preferences::setApplicationDirName( const QString& applDir ) {
00457 prefsXmlFilename = applDir + QString( "/prefs.xml" );
00458 prefsFilename = applDir + QString( "/prefs.dat.z" );
00459 }
00460
00461 int Preferences::getDefaultAccelerator( Action action ) {
00462 return( defaultAccel[ action ] );
00463 }
00464
00465 void Preferences::setAccelerator( Action action, int newAccel ) {
00466 if( defaultAccel[ action ] == newAccel ) {
00467 if( accel.contains( action ) )
00468 accel.remove( action );
00469 }
00470 else
00471 accel[ action ] = newAccel;
00472 }
00473
00474 int Preferences::getAccelerator( Action action ) {
00475 if( accel.contains( action ) )
00476 return( accel[ action ] );
00477 else
00478 return( getDefaultAccelerator( action ) );
00479 }
00480
00481 void Preferences::initDefaultKeyboardAccelerators() {
00482 defaultAccel[ ACTION_REVEAL ] = Key_Space;
00483 defaultAccel[ ACTION_RIGHT_ANSWER ] = Key_Return;
00484 defaultAccel[ ACTION_WRONG_ANSWER ] = Key_Backspace;
00485 defaultAccel[ ACTION_EDIT_QUIZ_TERM ] = CTRL + Key_Return;
00486 defaultAccel[ ACTION_START_QUIZ ] = CTRL + Key_S;
00487 defaultAccel[ ACTION_MANAGE_GLOSSARIES ] = CTRL + Key_M;
00488 defaultAccel[ ACTION_IMPORT ] = 0;
00489 defaultAccel[ ACTION_EXPORT ] = 0;
00490 defaultAccel[ ACTION_SHOW_ALL_GLOSSARIES_AND_TERMS ] = 0;
00491 defaultAccel[ ACTION_PREFERENCES ] = CTRL + Key_P;
00492 defaultAccel[ ACTION_QUIT ] = CTRL + Key_Q;
00493 defaultAccel[ ACTION_ADD_FOLDER ] = CTRL + Key_F;
00494 defaultAccel[ ACTION_ADD_GLOSSARY ] = CTRL + Key_G;
00495 defaultAccel[ ACTION_REMOVE_ITEM ] = CTRL + Key_BackSpace;
00496 defaultAccel[ ACTION_ADD_TERM ] = CTRL + Key_W;
00497 defaultAccel[ ACTION_EDIT_TERM ] = CTRL + Key_E;
00498 defaultAccel[ ACTION_REMOVE_TERMS ] = CTRL + Key_D;
00499 defaultAccel[ ACTION_CHECK_ALL_TERMS ] = CTRL + Key_A;
00500 defaultAccel[ ACTION_INVERSE_CHECKED_TERMS ] = CTRL + Key_I;
00501 defaultAccel[ ACTION_MAXIMIZE ] = CTRL + Key_Space;
00502 defaultAccel[ ACTION_SEARCH ] = CTRL + Key_Comma;
00503 }
00504
00505 QFont Preferences::getFont( const QString& fontFamily, uint size ) const {
00506 return( QFont( fontFamily, size, QFont::Normal, false, QFont::Unicode ) );
00507 }
00508