]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/preferences.h
Merge branch 'NateEag-master-patch-12920' into 'master'
[xonotic/netradiant.git] / radiant / preferences.h
index 8d7f93aeb32b6b5f4d0c17918023382848dd1ebf..7ce4943ad26b3e46d5a528ff01b8f1cfe37208e1 100644 (file)
@@ -33,6 +33,7 @@
 #include "dialog.h"
 #include <list>
 #include <map>
+#include "property.h"
 
 void Widget_connectToggleDependency( ui::Widget self, ui::Widget toggleButton );
 
@@ -46,10 +47,10 @@ 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, ImportExportCallback<bool> const &cb ){
+ui::CheckButton appendCheckBox( const char* name, const char* flag, Property<bool> const &cb ){
        return m_dialog.addCheckBox( m_vbox, name, flag, cb );
 }
-void appendCombo( const char* name, StringArrayRange values, ImportExportCallback<int> const &cb ){
+void appendCombo( const char* name, StringArrayRange values, Property<int> const &cb ){
        m_dialog.addCombo( m_vbox, name, values, cb );
 }
 void appendCombo( const char* name, int& data, StringArrayRange values ){
@@ -58,37 +59,43 @@ 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, ImportExportCallback<int> const &cb ){
+void appendRadio( const char* name, StringArrayRange names, Property<int> 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, ImportExportCallback<int> const &cb ){
+void appendRadioIcons( const char* name, StringArrayRange icons, Property<int> 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, ImportExportCallback<int> const &cb ){
+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<int> 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, ImportExportCallback<std::size_t> const &cb){
+ui::Widget appendEntry( const char* name, Property<std::size_t> 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, ImportExportCallback<float> const &cb ){
+ui::Widget appendEntry( const char* name, Property<float> 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, ImportExportCallback<const char *> const &cb ){
+ui::Widget appendPathEntry( const char* name, bool browse_directory, Property<const char *> const &cb ){
        return m_dialog.addPathEntry( m_vbox, name, browse_directory, cb );
 }
 ui::Widget appendPathEntry( const char* name, CopiedString& data, bool directory ){
@@ -97,10 +104,10 @@ 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, ImportExportCallback<int> const &cb ){
+ui::SpinButton appendSpinner( const char* name, double value, double lower, double upper, Property<int> 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, ImportExportCallback<float> const &cb ){
+ui::SpinButton appendSpinner( const char* name, double value, double lower, double upper, Property<float> const &cb ){
        return m_dialog.addSpinner( m_vbox, name, value, lower, upper, cb );
 }
 };
@@ -122,6 +129,7 @@ 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<typename Value>
@@ -137,21 +145,25 @@ public:
     void useLatched() {
         m_value = m_latched;
     }
+};
 
-    void import(Value value) {
-        m_latched = value;
-        if (m_latched != m_value) {
-            PreferencesDialog_restartRequired(m_description);
-        }
-    }
+template<class T>
+struct PropertyImpl<LatchedValue<T>, T> {
+       static void Export(const LatchedValue<T> &self, const Callback<void(T)> &returnz) {
+               returnz(self.m_latched);
+       }
+
+       static void Import(LatchedValue<T> &self, T value) {
+               self.m_latched = value;
+               if (value != self.m_value) {
+                       PreferencesDialog_restartRequired(self.m_description);
+               }
+       }
 };
 
-template<class Self, class T = Self>
-ImportExportCallback<T> mkImportExportCallback(LatchedValue<Self> &self) {
-       return {
-                       MemberCaller<LatchedValue<Self>, void(T), &LatchedValue<Self>::import>(self),
-                       ReferenceCaller<Self, void(const Callback<void(T)> &), impexp<Self, T>::Export>(self.m_latched)
-       };
+template<class T>
+Property<T> make_property(LatchedValue<T> &self) {
+       return make_property<LatchedValue<T>, T>(self);
 }
 
 /*!
@@ -217,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
@@ -233,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
@@ -247,7 +270,8 @@ std::list<CGameDescription*> mGames;
 
 CGameDialog() :
        m_sGameFile( "" ),
-       m_bGamePrompt( true ),
+       m_bGamePrompt( false ),
+       m_bSkipGamePromptOnce( false ),
        m_bForceLogConsole( false ){
 }
 virtual ~CGameDialog();
@@ -275,7 +299,7 @@ void DoGameDialog();
 ui::Window BuildDialog();
 
 void GameFileImport( int value );
-void GameFileExport( const ImportExportCallback<int>::Import_t& importCallback ) const;
+void GameFileExport( const Callback<void(int)> & importCallback ) const;
 
 /*!
    construction of the dialog frame
@@ -334,9 +358,13 @@ public:
 ui::Widget m_notebook{ui::null};
 
 virtual ~PrefsDlg(){
+       if (m_rc_path) {
        g_string_free( m_rc_path, true );
+       }
+       if (m_inipath) {
        g_string_free( m_inipath, true );
 }
+}
 
 /*!
    path for global settings
@@ -387,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();