]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/preferences.h
default texture is notex, not textures/ dir
[xonotic/netradiant.git] / radiant / preferences.h
index 3d0647148fae457f3026c541929afa8bf64bba33..a2e1b8e27fae52c56de740ad412d187ed7f248fb 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;
-}
-CPrefAssignment() { mVal = NULL; }
-CPrefAssignment( const CPrefAssignment& ass );
-virtual ~CPrefAssignment() { }
-virtual CPrefAssignment& operator =( const CPrefAssignment& ass );
+    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 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);
+    }
 };
 
+typedef Callback<void(PreferencesPage &)> PreferencesPageCallback;
 
-/*!
-   generic preferences storage class, using xml files
- */
-class CXMLPropertyBag
-{
-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;
+class PreferenceGroup {
+public:
+    virtual PreferencesPage createPage(const char *treeName, const char *frameName) = 0;
+};
 
-/*!
-   store assignment in the property list if not already there
- */
-void PushAssignment( const char *name, PrefTypes_t type, void *pV );
+typedef Callback<void(PreferenceGroup &)> PreferenceGroupCallback;
 
-/*!
-   find the xmlnode relating to the epair name
- */
-xmlNodePtr EpairForName( const char *name );
+void PreferencesDialog_addInterfacePreferences(const PreferencesPageCallback &callback);
 
-public:
-CXMLPropertyBag();
-virtual ~CXMLPropertyBag(){
-       if ( InUse() ) {
-               Clear();
-       }
-};
+void PreferencesDialog_addInterfacePage(const PreferenceGroupCallback &callback);
 
-/*!
-   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 );
+void PreferencesDialog_addDisplayPreferences(const PreferencesPageCallback &callback);
 
-/*!
-   returns whether or not the property bag is already open
- */
-qboolean InUse() { return ( mpDoc != NULL ); };
+void PreferencesDialog_addDisplayPage(const PreferenceGroupCallback &callback);
 
-/*!
-   unload the xml doc, and free the tree
- */
-void Clear();
+void PreferencesDialog_addSettingsPreferences(const PreferencesPageCallback &callback);
 
-/*|
-   read data from our XML file
- */
-void ReadXMLFile( const char* pFilename );
+void PreferencesDialog_addSettingsPage(const PreferenceGroupCallback &callback);
 
-/*|
-   write out the property bag to an XML data file
-   return is success/fail
- */
-qboolean WriteXMLFile( const char* pFilename );
+void PreferencesDialog_restartRequired(const char *staticName);
 
-/*!
-   update the xml tree with data form the property list, usually in preparation for a write
- */
-void UpdatePrefTree();
+template<typename Value>
+class LatchedValue {
+public:
+    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;
+    }
+};
 
-/*!
-   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
@@ -164,125 +222,55 @@ qboolean mbEmpty;
    generate a piece that just says "the game pack is there", but put the rest of the config somwhere
    else (i.e. not generated, copied over during setup .. for instance in the game tools directory)
  */
-class CGameDescription
-{
-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 ); }
-
-void Dump();
-};
-
-/*!
-   select games, copy editing assets and write out configuration files
- */
+class CGameDescription {
+    typedef std::map<CopiedString, CopiedString> GameDescription;
 
-#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
+    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();
 };
 
-protected:
-Str m_strName;
-Str m_strMod;
-Str m_strEngine;
-int m_nComboSelect;
-
-// maps from m_nComboSelect to the games
-int m_availGames[GAME_COUNT];
-};
+extern CGameDescription *g_pGameDescription;
 
-/*!
-   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
+class PrefsDlg;
 
-GtkComboBox   *mGameCombo;      // combo box holds the selection of available game
+class PreferencesPage;
 
-/*!
-   global prefs storage
- */
-CXMLPropertyBag mGlobalPrefs;
+class StringOutputStream;
 
-#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
+   standalone dialog for games selection, and more generally global settings
  */
-static bool m_bNetRun;
-#endif
-
-bool m_bDoGameInstall;
-
-CGameInstall mGameInstall;
-
+class CGameDialog : public Dialog {
 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:
 
@@ -297,69 +285,57 @@ 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;
 /*!
    log console to radiant.log
    m_bForceLogConsole is an obscure forced latching situation
  */
-bool m_bLogConsole;
-bool m_bForceLogConsole;
+    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;
-}
-virtual ~CGameDialog();
+    std::list<CGameDescription *> mGames;
 
-void AddPacksURL( Str &s );
+    CGameDialog() :
+            m_sGameFile(""),
+            m_bGamePrompt(true),
+            m_bForceLogConsole(false)
+    {
+    }
+
+    virtual ~CGameDialog();
 
 /*!
    intialize the game dialog, called at CPrefsDlg::Init
    will scan for games, load prefs, and do game selection dialog if needed
  */
-void Init();
+    void Init();
 
 /*!
    reset the global settings by removing the file
  */
-void Reset();
+    void Reset();
 
 /*!
    run the dialog UI for the list of games
  */
-void DoGameDialog();
-
-/*!
-   call out to the game installation dialog
- */
-void DoGameInstall();
+    void DoGameDialog();
 
 /*!
    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
@@ -368,7 +344,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
@@ -378,343 +354,114 @@ GtkWidget *GetGlobalFrame();
    could have named the class differently I guess
  */
 /*@{*/
-void LoadPrefs();   ///< load from file into variables
-void SavePrefs();   ///< save pref variables to file
+    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
  */
-void ScanForGames();
+    void ScanForGames();
 
 /*!
-   inits g_PrefsDlg.m_global_rc_path
+   inits g_Preferences.m_global_rc_path
  */
-void InitGlobalPrefPath();
+    void InitGlobalPrefPath();
 
 /*!
    uses m_nComboItem to find the right mGames
  */
-CGameDescription *GameDescriptionForComboItem();
-
-/*!
-   callback for the game install button
- */
-static void SInstallCallback( GtkWidget *widget, gpointer data );
-
-void UpdateGameCombo();
+    CGameDescription *GameDescriptionForComboItem();
 };
 
-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 PrefsDlg : public Dialog
-{
-
-public:
 /*!
-   local prefs file
+   this holds global level preferences
  */
-CXMLPropertyBag mLocalPrefs;
+extern CGameDialog g_GamesDialog;
 
-// will enable/disable stuff according to the situation
-void DoSensitivity();
-void PreModal() { DoSensitivity(); }
 
-// enable/disable custom editor entry
-void DoEditorSensitivity();
+class texdef_t;
 
-/*!
-   this holds global level preferences
- */
-CGameDialog mGamesDialog;
+class PrefsDlg : public Dialog {
+public:
 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;
-
-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 );
+    ui::Widget m_notebook{ui::null};
 
-PrefsDlg ();
-virtual ~PrefsDlg (){
-       g_string_free( m_rc_path, true );
-       g_string_free( m_inipath, true );
-}
+    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;
+    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;
+    GString *m_rc_path;
 
 /*!
    holds per-game settings
    m_rc_path+"local.pref"
    \todo FIXME at some point this should become XML property bag code too
  */
-GString *m_inipath;
+    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
+    void Init();
 
-// 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
+/*! Utility function for swapping notebook pages for tree list selections */
+    void showPrefPage(ui::Widget prefpage);
 
-#ifdef _WIN32
-bool m_bNativeGUI;
-bool m_bStartOnPrimMon;
-#endif
+protected:
 
-bool m_bPatchBBoxSelect;
+/*! Dialog API */
+    ui::Window BuildDialog();
 
-// 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];
+    void PostModal(EMessageBoxReturn code);
+};
 
-windowPosInfo_t mWindowInfo;
+extern PrefsDlg g_Preferences;
 
-bool m_bLatchedDetachableMenus;
-bool m_bLatchedPatchToolbar;
-bool m_bLatchedWideToolbar;
-bool m_bLatchedPluginToolbar;
-int m_nLatchedShader;
-int m_nLatchedTextureQuality;
+struct preferences_globals_t {
+    // disabled all INI / registry read write .. used when shutting down after registry cleanup
+    bool disable_ini;
 
-// RIANT
-// texture compression format
-int m_nTextureCompressionFormat;
+    preferences_globals_t() : disable_ini(false)
+    {
+    }
+};
 
-int m_nLightRadiuses;
+extern preferences_globals_t g_preferences_globals;
 
-bool m_bQ3Map2Texturing;
+void PreferencesDialog_constructWindow(ui::Window main_window);
 
-#ifdef ATIHACK_812
-bool m_bGlATIHack;
-#endif
+void PreferencesDialog_destroyWindow();
 
-#ifdef NVIDIA_AERO_HACK
-bool m_bGlNvidiaAeroHack;
-int m_bGlNvidiaAeroHackPrevState;
-#endif
+void PreferencesDialog_showDialog();
 
-void UpdateData( bool retrieve );
+void GlobalPreferences_Init();
 
-/*! Utility function for swapping notebook pages for tree list selections */
-void showPrefPage( int prefpage );
+void Preferences_Init();
 
-protected:
-/*! Scan for game description files and build a list */
-void ScanForGames();
+void Preferences_Load();
 
-/*! Dialog API */
-void BuildDialog();
-void PostModal( int code );
-};
+void Preferences_Save();
+
+void Preferences_Reset();
 
-#endif // _PREFERENCES_H_
+
+#endif