X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=radiant%2Fpreferences.cpp;h=7372a74a0adc30167b185f54f9a0b745cdef52ce;hb=89f86ebc45c0f0375d55b4c56bf95dca6891426f;hp=3794e954bc425b2ad43bf719ecae909c043e21bc;hpb=d052c83e50a258421e1f51ac99b135b403c18989;p=xonotic%2Fnetradiant.git diff --git a/radiant/preferences.cpp b/radiant/preferences.cpp index 3794e954..7372a74a 100644 --- a/radiant/preferences.cpp +++ b/radiant/preferences.cpp @@ -204,13 +204,10 @@ bool Preferences_Save( PreferenceDictionary& preferences, const char* filename ) } bool Preferences_Save_Safe( PreferenceDictionary& preferences, const char* filename ){ - Array tmpName( filename, filename + strlen( filename ) + 1 + 3 ); - *( tmpName.end() - 4 ) = 'T'; - *( tmpName.end() - 3 ) = 'M'; - *( tmpName.end() - 2 ) = 'P'; - *( tmpName.end() - 1 ) = '\0'; + std::string tmpName( filename ); + tmpName += "TMP"; - return Preferences_Save( preferences, tmpName.data() ) + return Preferences_Save( preferences, tmpName.c_str() ) && ( !file_exists( filename ) || file_remove( filename ) ) && file_move( tmpName.data(), filename ); } @@ -223,7 +220,7 @@ struct LogConsole { static void Import(bool value) { g_Console_enableLogging = value; - Sys_LogFile(g_Console_enableLogging); + Sys_EnableLogFile(g_Console_enableLogging); } }; @@ -351,6 +348,30 @@ ui::Window CGameDialog::BuildDialog(){ return create_simple_modal_dialog_window( "Global Preferences", m_modal, frame ); } +static void StringReplace( std::string& input, const std::string& first, const std::string& second ) +{ + size_t found = 0; + while ( ( found = input.find(first, found) ) != std::string::npos ) + { + input.replace( found, first.length(), second ); + } +} + +// FIXME, for some unknown reason it sorts “Quake 3” after “Quake 4”. +static bool CompareGameName( CGameDescription *first, CGameDescription *second ) +{ + std::string string1( first->getRequiredKeyValue( "name" ) ); + std::string string2( second->getRequiredKeyValue( "name" ) ); + + // HACK: Replace some roman numerals. + StringReplace( string1, " III", " 3" ); + StringReplace( string2, " III", " 3" ); + StringReplace( string1, " II", " 2" ); + StringReplace( string2, " II", " 2" ); + + return string1 < string2; +} + void CGameDialog::ScanForGames(){ StringOutputStream strGamesPath( 256 ); strGamesPath << DataPath_get() << "gamepacks/games/"; @@ -382,6 +403,8 @@ void CGameDialog::ScanForGames(){ } else { globalErrorStream() << "XML parser failed on '" << strPath.c_str() << "'\n"; } + + mGames.sort(CompareGameName); }); } @@ -707,6 +730,9 @@ ui::Window PrefsDlg::BuildDialog(){ ui::Window dialog = ui::Window(create_floating_window( RADIANT_NAME " Preferences", m_parent )); + gtk_window_set_transient_for( dialog, m_parent ); + gtk_window_set_position( dialog, GTK_WIN_POS_CENTER_ON_PARENT ); + { auto mainvbox = ui::VBox( FALSE, 5 ); dialog.add(mainvbox); @@ -934,31 +960,39 @@ void PreferencesDialog_restartRequired( const char* staticName ){ g_restart_required.push_back( staticName ); } -void PreferencesDialog_showDialog(){ - if ( ConfirmModified( "Edit Preferences" ) && g_Preferences.DoModal() == eIDOK ) { - if ( !g_restart_required.empty() ) { - StringOutputStream message( 256 ); - message << "Preference changes require a restart:\n\n"; +bool PreferencesDialog_isRestartRequired(){ + return !g_restart_required.empty(); +} - for ( std::vector::iterator i = g_restart_required.begin(); i != g_restart_required.end(); ++i ) - { - message << ( *i ) << '\n'; - } +void PreferencesDialog_restartIfRequired(){ + if ( !g_restart_required.empty() ) { + StringOutputStream message( 256 ); + message << "Preference changes require a restart:\n\n"; - message << "\nRestart now?"; + for ( std::vector::iterator i = g_restart_required.begin(); i != g_restart_required.end(); ++i ) + { + message << ( *i ) << '\n'; + } - auto ret = ui::alert( MainFrame_getWindow(), message.c_str(), "Restart " RADIANT_NAME "?", ui::alert_type::YESNO, ui::alert_icon::Question ); + message << "\nRestart now?"; - g_restart_required.clear(); + auto ret = ui::alert( MainFrame_getWindow(), message.c_str(), "Restart " RADIANT_NAME "?", ui::alert_type::YESNO, ui::alert_icon::Question ); - if ( ret == ui::alert_response::YES ) { - g_GamesDialog.m_bSkipGamePromptOnce = true; - Radiant_Restart(); - } + g_restart_required.clear(); + + if ( ret == ui::alert_response::YES ) { + g_GamesDialog.m_bSkipGamePromptOnce = true; + Radiant_Restart(); } } } +void PreferencesDialog_showDialog(){ + if ( ConfirmModified( "Edit Preferences" ) && g_Preferences.DoModal() == eIDOK ) { + PreferencesDialog_restartIfRequired(); + } +} + struct GameName { static void Export(const Callback &returnz) { returnz(gamename_get());