X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=radiant%2Fpreferences.h;h=a7739d4dce474fa6bdae9165e85422097c68d153;hb=611170782a3eb4f8e771afe90d2e336487bddf4e;hp=3d0647148fae457f3026c541929afa8bf64bba33;hpb=377547668d2b0204d18ed63640ead48338102066;p=xonotic%2Fnetradiant.git diff --git a/radiant/preferences.h b/radiant/preferences.h index 3d064714..a7739d4d 100644 --- a/radiant/preferences.h +++ b/radiant/preferences.h @@ -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. @@ -19,139 +19,153 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef _PREFERENCES_H_ -#define _PREFERENCES_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. + */ -#include "dialog.h" -#include "gtkr_list.h" -//#include "profile.h" +#if !defined( INCLUDED_PREFERENCES_H ) +#define INCLUDED_PREFERENCES_H -#ifdef _WIN32 -#define NVIDIA_AERO_HACK -#endif +#include "libxml/parser.h" +#include "dialog.h" +#include +#include +#include "property.h" -#define MAX_TEXTURE_QUALITY 3 +void Widget_connectToggleDependency( ui::Widget self, ui::Widget toggleButton ); -enum PrefTypes_t -{ - PREF_STR, - PREF_INT, - PREF_BOOL, - PREF_FLOAT, - PREF_VEC3, - PREF_WNDPOS, -}; - -/*! - 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 const &cb ){ + return m_dialog.addCheckBox( m_vbox, name, flag, cb ); +} +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 ); +} +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 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 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 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 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 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 &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 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 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 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 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 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 +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 +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); + } + } }; +template +Property make_property(LatchedValue &self) { + return make_property, T>(self); +} + /*! holds information for a given game I'm a bit unclear on that still @@ -166,126 +180,60 @@ qboolean mbEmpty; */ class CGameDescription { +typedef std::map 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" -#define ET_PACK "ETPack" - -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_ET, - 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 @@ -297,42 +245,37 @@ public: what game has been selected this is the name of the .game file */ -Str m_sGameFile; +CopiedString m_sGameFile; /*! - auto-load the game on startup - this is linked to auto-load checkbox + prompt which game to load on startup */ -bool m_bAutoLoadGame; +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 */ -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 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 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 @@ -349,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 & importCallback ) const; /*! construction of the dialog frame @@ -368,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 @@ -382,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 @@ -402,7 +329,7 @@ private: void ScanForGames(); /*! - inits g_PrefsDlg.m_global_rc_path + inits g_Preferences.m_global_rc_path */ void InitGlobalPrefPath(); @@ -410,112 +337,47 @@ 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 mGames; +std::list 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; - -void UpdateTextureCompression(); -#ifdef ATIHACK_812 -void UpdateATIHack(); -#endif - -#ifdef NVIDIA_AERO_HACK -void UpdateNvidiaAeroHack(); -#endif +ui::Widget m_notebook{ui::null}; -void LoadPrefs(); -void SavePrefs(); -void LoadTexdefPref( texdef_t* pTexdef, const char* pName ); - -PrefsDlg (); -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 ); + } } /*! path for global settings - win32: g_strAppPath - linux: ~/.radiant// + 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/// + win32: GameToolsPath + linux: ~/.radiant/[version]/[gamename]/ */ GString *m_rc_path; @@ -529,192 +391,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