]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/preferences.h
radiant: ask user to restart the editor when map load switches the brush format
[xonotic/netradiant.git] / radiant / preferences.h
index 6aad97dde5c653a909b20b708f088efcfef8c3da..8c657fe7251fd80605ad5dd818227a235b5dffe5 100644 (file)
@@ -1,5 +1,5 @@
 /*
-   Copyright (C) 1999-2007 id Software, Inc. and contributors.
+   Copyright (C) 1999-2006 Id Software, Inc. and contributors.
    For a list of contributors, see the accompanying CONTRIBUTORS file.
 
    This file is part of GtkRadiant.
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef _PREFERENCES_H_
-#define _PREFERENCES_H_
-
-#include "dialog.h"
-#include "gtkr_list.h"
-//#include "profile.h"
+/*
+   The following source code is licensed by Id Software and subject to the terms of
+   its LIMITED USE SOFTWARE LICENSE AGREEMENT, a copy of which is included with
+   GtkRadiant. If you did not receive a LIMITED USE SOFTWARE LICENSE AGREEMENT,
+   please contact Id Software immediately at info@idsoftware.com.
+ */
 
-#ifdef _WIN32
-#define NVIDIA_AERO_HACK
-#endif
+#if !defined( INCLUDED_PREFERENCES_H )
+#define INCLUDED_PREFERENCES_H
 
-#define MAX_TEXTURE_QUALITY 3
+#include "libxml/parser.h"
+#include "dialog.h"
+#include <list>
+#include <map>
+#include "property.h"
 
-enum PrefTypes_t
-{
-       PREF_STR,
-       PREF_INT,
-       PREF_BOOL,
-       PREF_FLOAT,
-       PREF_VEC3,
-       PREF_WNDPOS,
-};
+void Widget_connectToggleDependency( ui::Widget self, ui::Widget toggleButton );
 
-/*!
-   a preference assignment, name, type and pointer to value
-   we don't store the xmlNodePtr because the document itself can be thrown away upon any LoadPref
-   (see CGameDialog::UpdatePrefTree)
- */
-class CPrefAssignment
+class PreferencesPage
 {
+Dialog& m_dialog;
+ui::VBox m_vbox;
 public:
-Str mName;
-PrefTypes_t mType;
-void *mVal;
-
-CPrefAssignment( const char *name, PrefTypes_t Type, void *Val ){
-       mName = name; mType = Type; mVal = Val;
+PreferencesPage( Dialog& dialog, ui::VBox vbox ) : m_dialog( dialog ), m_vbox( vbox ){
+}
+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, Property<bool> const &cb ){
+       return m_dialog.addCheckBox( m_vbox, name, flag, 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 ){
+       m_dialog.addCombo( m_vbox, name, data, 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, 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, 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 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, 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, 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, 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 ){
+       return m_dialog.addPathEntry( m_vbox, name, data, 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, 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, Property<float> const &cb ){
+       return m_dialog.addSpinner( m_vbox, name, value, lower, upper, cb );
 }
-CPrefAssignment() { mVal = NULL; }
-CPrefAssignment( const CPrefAssignment& ass );
-virtual ~CPrefAssignment() { }
-virtual CPrefAssignment& operator =( const CPrefAssignment& ass );
 };
 
+typedef Callback<void(PreferencesPage&)> PreferencesPageCallback;
 
-/*!
-   generic preferences storage class, using xml files
- */
-class CXMLPropertyBag
+class PreferenceGroup
 {
-private:
-/*!
-   local prefs file
- */
-xmlDocPtr mpDoc;
-xmlNodePtr mpDocNode;
-
-/*!
-   prefs assignments (what pref name, what type, what variable)
- */
-list<CPrefAssignment> mPrefAssignments;
-
-/*!
-   name of file to load/save as
- */
-Str mStrFilename;
-
-/*!
-   store assignment in the property list if not already there
- */
-void PushAssignment( const char *name, PrefTypes_t type, void *pV );
-
-/*!
-   find the xmlnode relating to the epair name
- */
-xmlNodePtr EpairForName( const char *name );
-
 public:
-CXMLPropertyBag();
-virtual ~CXMLPropertyBag(){
-       if ( InUse() ) {
-               Clear();
-       }
+virtual PreferencesPage createPage( const char* treeName, const char* frameName ) = 0;
 };
 
-/*!
-   read a pref setting, if doesn't exist, will add it to the xml tree (using default value provided)
-   \arg name the name of the pref
-   \arg pV pointer to the value
-   \arg V default value
-   those functions will fill in the list of preferences assignments
-   (name, type and pointer to value)
-   this is used in UpdatePrefTree
- */
-void GetPref( const char *name, Str *pV, const char *V );
-void GetPref( const char *name, int *pV, int V );
-void GetPref( const char *name, bool *pV, bool V );
-void GetPref( const char *name, float *pV, float V );
-void GetPref( const char *name, float *pV, float* V );
-void GetPref( const char *name, window_position_t* pV, window_position_t V );
+typedef Callback<void(PreferenceGroup&)> PreferenceGroupCallback;
 
-/*!
-   returns whether or not the property bag is already open
- */
-qboolean InUse() { return ( mpDoc != NULL ); };
+void PreferencesDialog_addInterfacePreferences( const PreferencesPageCallback& callback );
+void PreferencesDialog_addInterfacePage( const PreferenceGroupCallback& callback );
+void PreferencesDialog_addDisplayPreferences( const PreferencesPageCallback& callback );
+void PreferencesDialog_addDisplayPage( const PreferenceGroupCallback& callback );
+void PreferencesDialog_addSettingsPreferences( const PreferencesPageCallback& callback );
+void PreferencesDialog_addSettingsPage( const PreferenceGroupCallback& callback );
 
-/*!
-   unload the xml doc, and free the tree
- */
-void Clear();
+bool PreferencesDialog_isRestartRequired();
+void PreferencesDialog_restartRequired( const char* staticName );
 
-/*|
-   read data from our XML file
- */
-void ReadXMLFile( const char* pFilename );
+template<typename Value>
+class LatchedValue {
+public:
+    Value m_value;
+    Value m_latched;
+    const char *m_description;
 
-/*|
-   write out the property bag to an XML data file
-   return is success/fail
- */
-qboolean WriteXMLFile( const char* pFilename );
+    LatchedValue(Value value, const char *description) : m_latched(value), m_description(description) {
+    }
 
-/*!
-   update the xml tree with data form the property list, usually in preparation for a write
- */
-void UpdatePrefTree();
+    void useLatched() {
+        m_value = m_latched;
+    }
+};
 
-/*!
-   did the file have any data or not?
- */
-qboolean mbEmpty;
+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 T>
+Property<T> make_property(LatchedValue<T> &self) {
+       return make_property<LatchedValue<T>, T>(self);
+}
+
 /*!
    holds information for a given game
    I'm a bit unclear on that still
@@ -166,124 +180,60 @@ qboolean mbEmpty;
  */
 class CGameDescription
 {
+typedef std::map<CopiedString, CopiedString> GameDescription;
+
 public:
-xmlDocPtr mpDoc;   ///< the game description xml tree
-Str mGameToolsPath;   ///< the explicit path to the game-dependent modules
-Str mGameName;   ///< name of the game used in dialogs
-Str mGameFile;   ///< the .game file that describes this game
-Str mBaseGame;   ///< basegame directory
-Str mEnginePath;   ///< path to the engine
-Str mEngine;   ///< engine name
-Str mMultiplayerEngine;   ///< engine name
-#if defined ( __linux__ ) || defined ( __APPLE__ )
-Str mUserPathPrefix;   ///< prefix for ~/.q3a ~/.wolf init, only on *nix
-#endif
-Str mShaderPath;   ///< the path in which to look for shaders
-Str mShaderlist;   ///< shaderlist file
-float mTextureDefaultScale;   ///< default scale (0.5 in q3, 1.0 in q1/q2, 0.25 in JK2 ..)
-bool mEClassSingleLoad;   ///< only load a single eclass definition file
-bool mNoPatch;   ///< this game doesn't support patch technology
-Str mCaulkShader;   ///< the shader to use for caulking
-bool quake2;   ///< set this to true to get quake2
-bool noMapsInHome;   ///< set this if you want to open the engine path/base dir/maps dir for map open/save dialoges */
-
-CGameDescription() { mpDoc = NULL; }
-/*!
-   \todo parse basic info from the node
-   user-friendly name of the game
-   essential parameters (such as the start dir)
- */
-CGameDescription( xmlDocPtr pDoc, const Str &GameFile );
-virtual ~CGameDescription() { xmlFreeDoc( mpDoc ); }
+CopiedString mGameFile;   ///< the .game file that describes this game
+GameDescription m_gameDescription;
+
+CopiedString mGameToolsPath;   ///< the explicit path to the game-dependent modules
+CopiedString mGameType;   ///< the type of the engine
+
+const char* getKeyValue( const char* key ) const {
+       GameDescription::const_iterator i = m_gameDescription.find( key );
+       if ( i != m_gameDescription.end() ) {
+               return ( *i ).second.c_str();
+       }
+       return "";
+}
+const char* getRequiredKeyValue( const char* key ) const {
+       GameDescription::const_iterator i = m_gameDescription.find( key );
+       if ( i != m_gameDescription.end() ) {
+               return ( *i ).second.c_str();
+       }
+       ERROR_MESSAGE( "game attribute " << makeQuoted( key ) << " not found in " << makeQuoted( mGameFile.c_str() ) );
+       return "";
+}
+
+CGameDescription( xmlDocPtr pDoc, const CopiedString &GameFile );
 
 void Dump();
 };
 
-/*!
-   select games, copy editing assets and write out configuration files
- */
+extern CGameDescription *g_pGameDescription;
 
-#define Q3_PACK "Q3Pack"
-#define URT_PACK "UrTPack"
-#define UFOAI_PACK "UFOAIPack"
-#define Q2W_PACK "Q2WPack"
-#define WARSOW_PACK "WarsowPack"
-#define NEXUIZ_PACK "NexuizPack"
-#define Q2_PACK "Q2Pack"
-#define TREMULOUS_PACK "TremulousPack"
-#define JA_PACK "JAPack"
-#define REACTION_PACK "ReactionPack"
-
-class CGameInstall : public Dialog {
-public:
-CGameInstall();
-void ScanGames();
-void Run();
-void BuildDialog();
-
-static void OnBtnBrowseEngine( GtkWidget *widget, gpointer data );
-static void OnGameSelectChanged( GtkWidget *widget, gpointer data );
-
-enum gameType_e {
-       GAME_NONE = 0,
-       GAME_Q3 = 1,
-       GAME_URT,
-       GAME_UFOAI,
-       GAME_Q2W,
-       GAME_WARSOW,
-       GAME_NEXUIZ,
-       GAME_Q2,
-       GAME_TREMULOUS,
-       GAME_JA,
-       GAME_REACTION,
-       GAME_COUNT
-};
+class PrefsDlg;
 
-protected:
-Str m_strName;
-Str m_strMod;
-Str m_strEngine;
-int m_nComboSelect;
+class PreferencesPage;
 
-// maps from m_nComboSelect to the games
-int m_availGames[GAME_COUNT];
-};
+class StringOutputStream;
 
 /*!
    standalone dialog for games selection, and more generally global settings
  */
 class CGameDialog : public Dialog
 {
-GtkWidget *mFrame;   ///< this is built on-demand first time it's used
-GtkWidget *mTopBox;   ///< top level box used to store the dialog frame, must unhook after modal use
-
-GtkComboBox   *mGameCombo;      // combo box holds the selection of available game
-
-/*!
-   global prefs storage
- */
-CXMLPropertyBag mGlobalPrefs;
-
-#ifdef _WIN32
-/*!
-   run from a network share
-   this one is not being saved out in prefs, since we need to know before we load prefs
-   we use a dummy file NETRUN_FILENAME as flag
-   all done with static stuff
- */
-static bool m_bNetRun;
-#endif
-
-bool m_bDoGameInstall;
-
-CGameInstall mGameInstall;
-
 protected:
 
-int m_nComboSelect;   ///< intermediate int value for combo in dialog box
+mutable int m_nComboSelect;   ///< intermediate int value for combo in dialog box
 
 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
@@ -295,42 +245,37 @@ public:
    what game has been selected
    this is the name of the .game file
  */
-Str m_sGameFile;
+CopiedString m_sGameFile;
+/*!
+   prompt which game to load on startup
+ */
+bool m_bGamePrompt;
 /*!
-   auto-load the game on startup
-   this is linked to auto-load checkbox
+   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_bAutoLoadGame;
+bool m_bSkipGamePromptOnce;
 /*!
    log console to radiant.log
    m_bForceLogConsole is an obscure forced latching situation
  */
-bool m_bLogConsole;
 bool m_bForceLogConsole;
 /*@}*/
 
-/*!
-   points somewhere in mGames, set once at startup
- */
-CGameDescription *m_pCurrentGameDescription;
-
 /*!
    the list of game descriptions we scanned from the game/ dir
  */
-list<CGameDescription *> mGames;
-
-CGameDialog() {
-       mFrame = NULL;
-       m_pCurrentGameDescription = NULL;
-       m_bLogConsole = false;
-       m_bForceLogConsole = false;
-       m_bDoGameInstall = true;    // go through DoModal at least once
-       mGameCombo = NULL;
+std::list<CGameDescription*> mGames;
+
+CGameDialog() :
+       m_sGameFile( "" ),
+       m_bGamePrompt( true ),
+       m_bSkipGamePromptOnce( false ),
+       m_bForceLogConsole( false ){
 }
 virtual ~CGameDialog();
 
-void AddPacksURL( Str &s );
-
 /*!
    intialize the game dialog, called at CPrefsDlg::Init
    will scan for games, load prefs, and do game selection dialog if needed
@@ -347,17 +292,14 @@ void Reset();
  */
 void DoGameDialog();
 
-/*!
-   call out to the game installation dialog
- */
-void DoGameInstall();
-
 /*!
    Dialog API
    this is only called when the dialog is built at startup for main engine select
  */
-void BuildDialog();
-void UpdateData( bool retrieve );
+ui::Window BuildDialog();
+
+void GameFileImport( int value );
+void GameFileExport( const Callback<void(int)> & importCallback ) const;
 
 /*!
    construction of the dialog frame
@@ -366,7 +308,7 @@ void UpdateData( bool retrieve );
    for prefs, we hook the frame in the main notebook
    build the frame on-demand (only once)
  */
-GtkWidget *GetGlobalFrame();
+void CreateGlobalFrame( PreferencesPage& page );
 
 /*!
    global preferences subsystem
@@ -380,19 +322,6 @@ void LoadPrefs();   ///< load from file into variables
 void SavePrefs();   ///< save pref variables to file
 /*@}*/
 
-/*!
-   read or set netrun (check file)
-   \param retrieve
-   if false, will check if netrun file is present and will set m_bNetRun
-   if true, will create/erase the netrun file depending on m_bNetRun
-   NOTE: this is not backwards, 'retrieve' means 'retrieve from settings dialog' - in terms of UI
- */
-static void UpdateNetrun( bool retrieve );
-/*!
-   get current netrun setting
- */
-static bool GetNetrun();
-
 private:
 /*!
    scan for .game files, load them
@@ -400,7 +329,7 @@ private:
 void ScanForGames();
 
 /*!
-   inits g_PrefsDlg.m_global_rc_path
+   inits g_Preferences.m_global_rc_path
  */
 void InitGlobalPrefPath();
 
@@ -408,112 +337,43 @@ void InitGlobalPrefPath();
    uses m_nComboItem to find the right mGames
  */
 CGameDescription *GameDescriptionForComboItem();
+};
 
 /*!
-   callback for the game install button
+   this holds global level preferences
  */
-static void SInstallCallback( GtkWidget *widget, gpointer data );
+extern CGameDialog g_GamesDialog;
 
-void UpdateGameCombo();
-};
 
-typedef struct {
-       int nEntitySplit1;
-       int nEntitySplit2;
-
-       window_position_t position;
-
-       window_position_t posEntityWnd;
-       window_position_t posMapInfoWnd;
-       window_position_t posCamWnd;
-       window_position_t posZWnd;
-       window_position_t posXYWnd;
-       window_position_t posXZWnd;
-       window_position_t posYZWnd;
-       window_position_t posPatchWnd;
-       window_position_t posSurfaceWnd;
-       window_position_t posEntityInfoWnd;
-
-       int nXYHeight;
-       int nZWidth;
-       int nXYWidth;
-       int nCamWidth;
-       int nCamHeight;
-       int nZFloatWidth;
-       int nState;
-} windowPosInfo_t;
+class texdef_t;
 
 class PrefsDlg : public Dialog
 {
-
 public:
-/*!
-   local prefs file
- */
-CXMLPropertyBag mLocalPrefs;
-
-// will enable/disable stuff according to the situation
-void DoSensitivity();
-void PreModal() { DoSensitivity(); }
-
-// enable/disable custom editor entry
-void DoEditorSensitivity();
-
-/*!
-   this holds global level preferences
- */
-CGameDialog mGamesDialog;
 protected:
-// warning about old project files
-bool m_bWarn;
-list<CGameDescription *> mGames;
+std::list<CGameDescription *> mGames;
 
 public:
-// last light intensity used in the CLightPrompt dialog, stored in registry
-int m_iLastLightIntensity;
-// these mirror what goes in the combo box
-// see PrefDlg::m_nShader, tells wether to load NONE / COMMON or ALL shaders at parsing stage
-enum {SHADER_NONE = 0, SHADER_COMMON, SHADER_ALL};
-
-// Gef: updated preferences dialog
-/*! Preference notebook page numbers */
-enum {PTAB_FRONT = 0, PTAB_GAME_SETTINGS, PTAB_2D, PTAB_CAMERA, PTAB_TEXTURE, PTAB_LAYOUT, PTAB_MOUSE,
-         PTAB_EDITING, PTAB_STARTUP, PTAB_PATHS, PTAB_BRUSH, PTAB_MISC, PTAB_BSPMONITOR} pref_tabs;
 
-GtkWidget *notebook;
+ui::Widget m_notebook{ui::null};
 
-void UpdateTextureCompression();
-
-#ifdef ATIHACK_812
-void UpdateATIHack();
-#endif
-
-#ifdef NVIDIA_AERO_HACK
-void UpdateNvidiaAeroHack();
-#endif
-
-void LoadPrefs();
-void SavePrefs();
-void LoadTexdefPref( texdef_t* pTexdef, const char* pName );
-
-PrefsDlg ();
-virtual ~PrefsDlg (){
+virtual ~PrefsDlg(){
        g_string_free( m_rc_path, true );
        g_string_free( m_inipath, true );
 }
 
 /*!
    path for global settings
-   win32: g_strAppPath
-   linux: ~/.radiant/<version>/
+   win32: AppPath
+   linux: ~/.radiant/[version]/
  */
 GString *m_global_rc_path;
 
 /*!
    path to per-game settings
    used for various game dependant storage
-   win32: g_strGameToolsPath
-   linux: ~/.radiant/<version>/<gamename>/
+   win32: GameToolsPath
+   linux: ~/.radiant/[version]/[gamename]/
  */
 GString *m_rc_path;
 
@@ -527,192 +387,41 @@ GString *m_inipath;
 // initialize the above paths
 void Init();
 
-#if 0
-// DEPRECATED: use engine path from the current game description instead
-// path to the top-level installation
-Str m_strEnginePath;
-// name of executable
-// quake2 quake3 etc
-Str m_strEngine;
-// we use this Str to store the full path to the engine: m_strEnginePath + m_strEngine
-// it's not stored in the registry or anything, just ued for display in prefs
-Str m_strPrefsDlgEngine;
-#endif
-
-// Dialog Data
-int m_nMouse;
-MainFrame::EViewStyle m_nView;
-bool m_bTextureLock;
-bool m_bLoadLast;
-// path to the project loaded at startup
-// if g_PrefsDlg can't find the information in the ini file
-// it will try to guess and eventually ask the user
-Str m_strLastProject;
-/*!
-   version of last loaded project file
-   says -1 if there's no version loaded
-   if it's a manually constructed project file, will be 0
-   otherwise the actual 'version' epair
- */
-int m_nLastProjectVer;
-Str m_strLastMap;
-bool m_bInternalBSP;
-bool m_bRightClick;
-bool m_bSetGame;
-bool m_bAutoSave;
-bool m_bLoadLastMap;
-bool m_bTextureWindow;
-bool m_bSnapShots;
-float m_fTinySize;
-bool m_bCleanTiny;
-bool m_bCamXYUpdate;
-int m_nCamDragMultiSelect;
-bool m_bCamDragMultiSelect;
-bool m_bCamFreeLook;
-bool m_bCamFreeLookStrafe;
-bool m_bCamInverseMouse;
-bool m_bCamDiscrete;
-bool m_bNewLightDraw;
-Str m_strPrefabPath;
-int m_nWhatGame;
-bool m_bALTEdge;
-bool m_bFaceColors;
-bool m_bXZVis;
-bool m_bYZVis;
-bool m_bZVis;
-bool m_bSizePaint;
-bool m_bDLLEntities;
-bool m_bRotateLock;
-bool m_bDetachableMenus;
-bool m_bPatchToolbar;
-bool m_bWideToolbar;
-bool m_bPluginToolbar;
-bool m_bNoClamp;
-//++timo this is most likely broken, I don't know what it's supposed to do
-bool m_bSnap;
-Str m_strUserPath;
-int m_nRotation;
-bool m_bChaseMouse;
-bool m_bTextureScrollbar;
-bool m_bDisplayLists;
-bool m_bAntialiasedPointsAndLines;    // Fishman - Add antialiazed points and lines support. 09/03/00
-bool m_bShowShaders;
-int m_nShader;
-bool m_bNoStipple;
-int m_nUndoLevels;
-bool m_bVertexSplit;
-
-int m_nMouseButtons;
-int m_nAngleSpeed;
-int m_nMoveSpeed;
-int m_nAutoSave;
-bool m_bCubicClipping;
-int m_nCubicScale;
-bool m_bSelectCurves;
-bool m_bSelectModels;
-int m_nEntityShowState;
-int m_nTextureScale;
-bool m_bNormalizeColors;
-bool m_bSwitchClip;
-bool m_bSelectWholeEntities;
-int m_nTextureQuality;
-bool m_bGLLighting;
-bool m_bTexturesShaderlistOnly;
-int m_nSubdivisions;
-float m_fDefTextureScale;
-bool m_bFloatingZ;
-bool m_bLatchedFloatingZ;
-// Gef: Kyro GL_POINT workaround
-bool m_bGlPtWorkaround;
-
-// how many menus in the texture thing before we split?
-int m_nTextureMenuSplit;
-
-// watch the BSP process through network connections
-// true: trigger the BSP steps one by one and monitor them through the network
-// false: create a BAT / .sh file and execute it. don't bother monitoring it.
-bool m_bWatchBSP;
-// do we stop the compilation process if we come accross a leak?
-bool m_bLeakStop;
-// timeout when beginning a step (in seconds)
-// if we don't get a connection quick enough we assume something failed and go back to idling
-int m_iTimeout;
-bool m_bRunQuake;
-// store prefs setting for automatic sleep mode activation
-bool m_bDoSleep;
-
-bool m_bClipCaulk;
-
-// make the texture increments match the grid changes
-bool m_bSnapTToGrid;
-
-// try to fix the target/targetname conflicts when importing a map (default true)
-bool m_bDoTargetFix;
-
-// the increment step we use against the wheel mouse
-int m_nWheelInc;
-
-#ifdef _WIN32
-// use the file associations to open files instead of builtin Gtk editor
-bool m_bUseWin32Editor;
-#else
-// custom shader editor
-bool m_bUseCustomEditor;
-Str m_strEditorCommand;     // this is the command executed
-#endif
-
-#ifdef _WIN32
-bool m_bNativeGUI;
-bool m_bStartOnPrimMon;
-#endif
-
-bool m_bPatchBBoxSelect;
-
-// RR2DO2: latched data, for settings that require a restart. We don't want to set
-// these directly in case users set them under preferences and then continue working
-// with the editor.
-MainFrame::EViewStyle m_nLatchedView;
-int m_nMRUCount;
-Str m_strMRUFiles[4];
+/*! Utility function for swapping notebook pages for tree list selections */
+void showPrefPage( ui::Widget prefpage );
 
-windowPosInfo_t mWindowInfo;
+protected:
 
-bool m_bLatchedDetachableMenus;
-bool m_bLatchedPatchToolbar;
-bool m_bLatchedWideToolbar;
-bool m_bLatchedPluginToolbar;
-int m_nLatchedShader;
-int m_nLatchedTextureQuality;
+/*! Dialog API */
+ui::Window BuildDialog();
+void PostModal( EMessageBoxReturn code );
+};
 
-// RIANT
-// texture compression format
-int m_nTextureCompressionFormat;
+extern PrefsDlg g_Preferences;
 
-int m_nLightRadiuses;
+struct preferences_globals_t
+{
+       // disabled all INI / registry read write .. used when shutting down after registry cleanup
+       bool disable_ini;
+       preferences_globals_t() : disable_ini( false ){
+       }
+};
+extern preferences_globals_t g_preferences_globals;
 
-bool m_bQ3Map2Texturing;
+void PreferencesDialog_constructWindow( ui::Window main_window );
+void PreferencesDialog_destroyWindow();
 
-#ifdef ATIHACK_812
-bool m_bGlATIHack;
-#endif
 
-#ifdef NVIDIA_AERO_HACK
-bool m_bGlNvidiaAeroHack;
-int m_bGlNvidiaAeroHackPrevState;
-#endif
+void PreferencesDialog_restartIfRequired();
+void PreferencesDialog_showDialog();
 
-void UpdateData( bool retrieve );
+void GlobalPreferences_Init();
+void Preferences_Init();
 
-/*! Utility function for swapping notebook pages for tree list selections */
-void showPrefPage( int prefpage );
+void Preferences_Load();
+void Preferences_Save();
 
-protected:
-/*! Scan for game description files and build a list */
-void ScanForGames();
+void Preferences_Reset();
 
-/*! Dialog API */
-void BuildDialog();
-void PostModal( int code );
-};
 
-#endif // _PREFERENCES_H_
+#endif