Preferences.cpp

Go to the documentation of this file.
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 /* QDataStream::Qt_3 ? */ );
00154 
00155     // 0x0011 means 0.11.x version.
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 

Generated on Sun Mar 1 17:30:47 2009 for toMOTko by  doxygen 1.5.6