X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=radiant%2Fpreferences.h;h=a7739d4dce474fa6bdae9165e85422097c68d153;hb=611170782a3eb4f8e771afe90d2e336487bddf4e;hp=0aae24c761058a73e18f2b47e4e919154d85e161;hpb=18d60f90d7603cb420150739251cf98519c57406;p=xonotic%2Fnetradiant.git diff --git a/radiant/preferences.h b/radiant/preferences.h index 0aae24c7..a7739d4d 100644 --- a/radiant/preferences.h +++ b/radiant/preferences.h @@ -33,6 +33,7 @@ #include "dialog.h" #include #include +#include "property.h" void Widget_connectToggleDependency( ui::Widget self, ui::Widget toggleButton ); @@ -46,11 +47,11 @@ PreferencesPage( Dialog& dialog, ui::VBox vbox ) : m_dialog( dialog ), m_vbox( v ui::CheckButton appendCheckBox( const char* name, const char* flag, bool& data ){ return m_dialog.addCheckBox( m_vbox, name, flag, data ); } -ui::CheckButton appendCheckBox( const char* name, const char* flag, const BoolImportCallback& importCallback, const BoolExportCallback& exportCallback ){ - return m_dialog.addCheckBox( m_vbox, name, flag, importCallback, exportCallback ); +ui::CheckButton appendCheckBox( const char* name, const char* flag, Property const &cb ){ + return m_dialog.addCheckBox( m_vbox, name, flag, cb ); } -void appendCombo( const char* name, StringArrayRange values, const IntImportCallback& importCallback, const IntExportCallback& exportCallback ){ - m_dialog.addCombo( m_vbox, name, values, importCallback, exportCallback ); +void appendCombo( const char* name, StringArrayRange values, Property const &cb ){ + m_dialog.addCombo( m_vbox, name, values, cb ); } void appendCombo( const char* name, int& data, StringArrayRange values ){ m_dialog.addCombo( m_vbox, name, data, values ); @@ -58,38 +59,44 @@ void appendCombo( const char* name, int& data, StringArrayRange values ){ void appendSlider( const char* name, int& data, gboolean draw_value, const char* low, const char* high, double value, double lower, double upper, double step_increment, double page_increment ){ m_dialog.addSlider( m_vbox, name, data, draw_value, low, high, value, lower, upper, step_increment, page_increment ); } -void appendRadio( const char* name, StringArrayRange names, const IntImportCallback& importCallback, const IntExportCallback& exportCallback ){ - m_dialog.addRadio( m_vbox, name, names, importCallback, exportCallback ); +void appendRadio( const char* name, StringArrayRange names, Property const &cb ){ + m_dialog.addRadio( m_vbox, name, names, cb ); } void appendRadio( const char* name, int& data, StringArrayRange names ){ m_dialog.addRadio( m_vbox, name, data, names ); } -void appendRadioIcons( const char* name, StringArrayRange icons, const IntImportCallback& importCallback, const IntExportCallback& exportCallback ){ - m_dialog.addRadioIcons( m_vbox, name, icons, importCallback, exportCallback ); +void appendRadioIcons( const char* name, StringArrayRange icons, Property const &cb ){ + m_dialog.addRadioIcons( m_vbox, name, icons, cb ); } void appendRadioIcons( const char* name, int& data, StringArrayRange icons ){ m_dialog.addRadioIcons( m_vbox, name, data, icons ); } -ui::Widget appendEntry( const char* name, const IntImportCallback& importCallback, const IntExportCallback& exportCallback ){ - return m_dialog.addIntEntry( m_vbox, name, importCallback, exportCallback ); +ui::Widget appendSpacer( int dimension ){ + return m_dialog.addSpacer( m_vbox, dimension ); +} +ui::Widget appendLabel( const char* name, const char* text ){ + return m_dialog.addLabel( m_vbox, name, text ); +} +ui::Widget appendEntry( const char* name, Property const &cb ){ + return m_dialog.addIntEntry( m_vbox, name, cb ); } ui::Widget appendEntry( const char* name, int& data ){ return m_dialog.addEntry( m_vbox, name, data ); } -ui::Widget appendEntry( const char* name, const SizeImportCallback& importCallback, const SizeExportCallback& exportCallback ){ - return m_dialog.addSizeEntry( m_vbox, name, importCallback, exportCallback ); +ui::Widget appendEntry( const char* name, Property const &cb){ + return m_dialog.addSizeEntry( m_vbox, name, cb ); } ui::Widget appendEntry( const char* name, std::size_t& data ){ return m_dialog.addEntry( m_vbox, name, data ); } -ui::Widget appendEntry( const char* name, const FloatImportCallback& importCallback, const FloatExportCallback& exportCallback ){ - return m_dialog.addFloatEntry( m_vbox, name, importCallback, exportCallback ); +ui::Widget appendEntry( const char* name, Property const &cb ){ + return m_dialog.addFloatEntry( m_vbox, name, cb ); } ui::Widget appendEntry( const char* name, float& data ){ return m_dialog.addEntry( m_vbox, name, data ); } -ui::Widget appendPathEntry( const char* name, bool browse_directory, const StringImportCallback& importCallback, const StringExportCallback& exportCallback ){ - return m_dialog.addPathEntry( m_vbox, name, browse_directory, importCallback, exportCallback ); +ui::Widget appendPathEntry( const char* name, bool browse_directory, Property const &cb ){ + return m_dialog.addPathEntry( m_vbox, name, browse_directory, cb ); } ui::Widget appendPathEntry( const char* name, CopiedString& data, bool directory ){ return m_dialog.addPathEntry( m_vbox, name, data, directory ); @@ -97,11 +104,11 @@ ui::Widget appendPathEntry( const char* name, CopiedString& data, bool directory ui::SpinButton appendSpinner( const char* name, int& data, double value, double lower, double upper ){ return m_dialog.addSpinner( m_vbox, name, data, value, lower, upper ); } -ui::SpinButton appendSpinner( const char* name, double value, double lower, double upper, const IntImportCallback& importCallback, const IntExportCallback& exportCallback ){ - return m_dialog.addSpinner( m_vbox, name, value, lower, upper, importCallback, exportCallback ); +ui::SpinButton appendSpinner( const char* name, double value, double lower, double upper, Property const &cb ){ + return m_dialog.addSpinner( m_vbox, name, value, lower, upper, cb ); } -ui::SpinButton appendSpinner( const char* name, double value, double lower, double upper, const FloatImportCallback& importCallback, const FloatExportCallback& exportCallback ){ - return m_dialog.addSpinner( m_vbox, name, value, lower, upper, importCallback, exportCallback ); +ui::SpinButton appendSpinner( const char* name, double value, double lower, double upper, Property const &cb ){ + return m_dialog.addSpinner( m_vbox, name, value, lower, upper, cb ); } }; @@ -122,34 +129,42 @@ void PreferencesDialog_addDisplayPage( const PreferenceGroupCallback& callback ) void PreferencesDialog_addSettingsPreferences( const PreferencesPageCallback& callback ); void PreferencesDialog_addSettingsPage( const PreferenceGroupCallback& callback ); +bool PreferencesDialog_isRestartRequired(); void PreferencesDialog_restartRequired( const char* staticName ); template -class LatchedValue -{ +class LatchedValue { public: -Value m_value; -Value m_latched; -const char* m_description; + Value m_value; + Value m_latched; + const char *m_description; -LatchedValue( Value value, const char* description ) : m_latched( value ), m_description( description ){ -} -void useLatched(){ - m_value = m_latched; -} -void import( Value value ){ - m_latched = value; - if ( m_latched != m_value ) { - PreferencesDialog_restartRequired( m_description ); - } -} + LatchedValue(Value value, const char *description) : m_latched(value), m_description(description) { + } + + void useLatched() { + m_value = m_latched; + } }; -typedef LatchedValue LatchedBool; -typedef MemberCaller LatchedBoolImportCaller; +template +struct PropertyImpl, T> { + static void Export(const LatchedValue &self, const Callback &returnz) { + returnz(self.m_latched); + } + + static void Import(LatchedValue &self, T value) { + self.m_latched = value; + if (value != self.m_value) { + PreferencesDialog_restartRequired(self.m_description); + } + } +}; -typedef LatchedValue LatchedInt; -typedef MemberCaller LatchedIntImportCaller; +template +Property make_property(LatchedValue &self) { + return make_property, T>(self); +} /*! holds information for a given game @@ -214,6 +229,11 @@ mutable int m_nComboSelect; ///< intermediate int value for combo in dialog bo public: +/*! + used to no ask for restart when switching game from Gobal Preferences window displayed on startup +*/ + +bool onStartup; /*! those settings are saved in the global prefs file I'm too lazy to wrap behind protected access, not sure this needs to be public @@ -230,6 +250,12 @@ CopiedString m_sGameFile; prompt which game to load on startup */ bool m_bGamePrompt; +/*! + when if m_bGamePrompt is true + do not prompt at startup which game to load this time, but prompt the next times + this is used to not uselessly prompt game after having restarted because user switched game + */ +bool m_bSkipGamePromptOnce; /*! log console to radiant.log m_bForceLogConsole is an obscure forced latching situation @@ -245,6 +271,7 @@ std::list mGames; CGameDialog() : m_sGameFile( "" ), m_bGamePrompt( true ), + m_bSkipGamePromptOnce( false ), m_bForceLogConsole( false ){ } virtual ~CGameDialog(); @@ -272,7 +299,7 @@ void DoGameDialog(); ui::Window BuildDialog(); void GameFileImport( int value ); -void GameFileExport( const IntImportCallback& importCallback ) const; +void GameFileExport( const Callback & importCallback ) const; /*! construction of the dialog frame @@ -330,9 +357,13 @@ public: ui::Widget m_notebook{ui::null}; -virtual ~PrefsDlg(){ - g_string_free( m_rc_path, true ); - g_string_free( m_inipath, true ); +virtual ~PrefsDlg() { + if (m_rc_path) { + g_string_free( m_rc_path, true ); + } + if (m_inipath) { + g_string_free( m_inipath, true ); + } } /*! @@ -384,6 +415,8 @@ extern preferences_globals_t g_preferences_globals; void PreferencesDialog_constructWindow( ui::Window main_window ); void PreferencesDialog_destroyWindow(); + +void PreferencesDialog_restartIfRequired(); void PreferencesDialog_showDialog(); void GlobalPreferences_Init();