]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - radiant/preferences.h
* introduced a new config variable to be able to load maps directly from the enginePa...
[xonotic/netradiant.git] / radiant / preferences.h
1 /*
2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
4
5 This file is part of GtkRadiant.
6
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20 */
21
22 #ifndef _PREFERENCES_H_
23 #define _PREFERENCES_H_
24
25 #include "dialog.h"
26 #include "gtkr_list.h"
27 //#include "profile.h"
28
29 #define MAX_TEXTURE_QUALITY 3
30
31 enum PrefTypes_t
32 {
33   PREF_STR,
34   PREF_INT,
35   PREF_BOOL,
36   PREF_FLOAT,
37   PREF_VEC3,
38   PREF_WNDPOS,
39 };
40
41 /*!
42 a preference assignment, name, type and pointer to value
43 we don't store the xmlNodePtr because the document itself can be thrown away upon any LoadPref
44 (see CGameDialog::UpdatePrefTree)
45 */
46 class CPrefAssignment
47 {
48 public:
49   Str mName;
50   PrefTypes_t mType;
51   void *mVal;
52
53   CPrefAssignment(const char *name, PrefTypes_t Type, void *Val)
54   {
55     mName = name; mType = Type; mVal = Val;
56   }
57   CPrefAssignment() { mVal = NULL; }
58   CPrefAssignment(const CPrefAssignment& ass);
59   virtual ~CPrefAssignment() { }
60   virtual CPrefAssignment& operator =(const CPrefAssignment& ass);
61 };
62
63
64 /*!
65 generic preferences storage class, using xml files
66 */
67 class CXMLPropertyBag
68 {
69 private:
70   /*!
71   local prefs file
72   */
73   xmlDocPtr mpDoc;
74   xmlNodePtr mpDocNode;
75
76   /*!
77   prefs assignments (what pref name, what type, what variable)
78   */
79   list<CPrefAssignment> mPrefAssignments;
80
81   /*!
82   name of file to load/save as
83   */
84   Str mStrFilename;
85
86   /*!
87   store assignment in the property list if not already there
88   */
89   void PushAssignment(const char *name, PrefTypes_t type, void *pV);
90
91   /*!
92   find the xmlnode relating to the epair name
93   */
94   xmlNodePtr EpairForName(const char *name);
95
96 public:
97   CXMLPropertyBag();
98   virtual ~CXMLPropertyBag()
99   {
100     if (InUse())
101       Clear();
102   };
103
104   /*!
105   read a pref setting, if doesn't exist, will add it to the xml tree (using default value provided)
106   \arg name the name of the pref
107   \arg pV pointer to the value
108   \arg V default value
109   those functions will fill in the list of preferences assignments
110     (name, type and pointer to value)
111     this is used in UpdatePrefTree
112   */
113   void GetPref(const char *name, Str *pV, const char *V);
114   void GetPref(const char *name, int *pV, int V);
115   void GetPref(const char *name, bool *pV, bool V);
116   void GetPref(const char *name, float *pV, float V);
117   void GetPref(const char *name, float *pV, float* V);
118   void GetPref(const char *name, window_position_t* pV, window_position_t V);
119
120   /*!
121   returns whether or not the property bag is already open
122   */
123   qboolean InUse() { return (mpDoc != NULL); };
124
125   /*!
126   unload the xml doc, and free the tree
127   */
128   void Clear();
129
130   /*|
131   read data from our XML file
132   */
133   void ReadXMLFile(const char* pFilename);
134
135   /*|
136   write out the property bag to an XML data file
137   return is success/fail
138   */
139   qboolean WriteXMLFile(const char* pFilename);
140
141   /*!
142   update the xml tree with data form the property list, usually in preparation for a write
143   */
144   void UpdatePrefTree();
145
146   /*!
147   did the file have any data or not?
148   */
149   qboolean mbEmpty;
150 };
151
152 /*!
153 holds information for a given game
154 I'm a bit unclear on that still
155 it holds game specific configuration stuff
156 such as base names, engine names, some game specific features to activate in the various modules
157 it is not strictly a prefs thing since the user is not supposed to edit that (unless he is hacking
158 support for a new game)
159
160 what we do now is fully generate the information for this during the setup. We might want to
161 generate a piece that just says "the game pack is there", but put the rest of the config somwhere
162 else (i.e. not generated, copied over during setup .. for instance in the game tools directory)
163 */
164 class CGameDescription
165 {
166 public:
167   xmlDocPtr mpDoc; ///< the game description xml tree
168   Str mGameToolsPath; ///< the explicit path to the game-dependent modules
169   Str mGameName; ///< name of the game used in dialogs
170   Str mGameFile; ///< the .game file that describes this game
171   Str mBaseGame; ///< basegame directory
172   Str mEnginePath; ///< path to the engine
173   Str mEngine; ///< engine name
174 #if defined (__linux__) || defined (__APPLE__)
175   Str mUserPathPrefix; ///< prefix for ~/.q3a ~/.wolf init, only on *nix
176 #endif
177   Str mShaderPath; ///< the path in which to look for shaders
178   Str mShaderlist; ///< shaderlist file
179   float mTextureDefaultScale; ///< default scale (0.5 in q3, 1.0 in q1/q2, 0.25 in JK2 ..)
180   bool mEClassSingleLoad; ///< only load a single eclass definition file
181   bool mNoPatch; ///< this game doesn't support patch technology
182   Str mCaulkShader; ///< the shader to use for caulking
183   bool quake2; ///< set this to true to get quake2
184   bool noMapsInHome; ///< set this if you want to open the engine path/base dir/maps dir for map open/save dialoges */
185
186   CGameDescription() { mpDoc = NULL; }
187   /*!
188   \todo parse basic info from the node
189   user-friendly name of the game
190   essential parameters (such as the start dir)
191   */
192   CGameDescription(xmlDocPtr pDoc, const Str &GameFile);
193   virtual ~CGameDescription() { xmlFreeDoc(mpDoc); }
194
195   void Dump();
196 };
197
198 /*!
199 select games, copy editing assets and write out configuration files
200  */
201
202 #define Q3_PACK "Q3Pack"
203 #define URT_PACK "UrTPack"
204 #define UFOAI_PACK "UFOAIPack"
205 #define Q2W_PACK "Q2WPack"
206 #define WARSOW_PACK "WarsowPack"
207 #define NEXUIZ_PACK "NexuizPack"
208 #define Q2_PACK "Q2Pack"
209
210 class CGameInstall : public Dialog {
211 public:
212         CGameInstall();
213         void ScanGames();
214         void Run();
215         void BuildDialog();
216
217         static void OnBtnBrowseEngine( GtkWidget *widget, gpointer data );
218         static void OnGameSelectChanged( GtkWidget *widget, gpointer data );
219
220         enum gameType_e {
221                 GAME_NONE = 0,
222                 GAME_Q3 = 1,
223                 GAME_URT,
224                 GAME_UFOAI,
225                 GAME_Q2W,
226                 GAME_WARSOW,
227                 GAME_NEXUIZ,
228                 GAME_Q2,
229                 GAME_COUNT
230         };
231
232 protected:
233         Str             m_strName;
234         Str             m_strMod;
235         Str             m_strEngine;
236         int             m_nComboSelect;
237
238         // maps from m_nComboSelect to the games
239         int     m_availGames[GAME_COUNT];
240 };
241
242 /*!
243 standalone dialog for games selection, and more generally global settings
244 */
245 class CGameDialog : public Dialog
246 {
247   GtkWidget *mFrame; ///< this is built on-demand first time it's used
248   GtkWidget *mTopBox; ///< top level box used to store the dialog frame, must unhook after modal use
249
250   GtkComboBox   *mGameCombo;    // combo box holds the selection of available game
251
252   /*!
253   global prefs storage
254   */
255   CXMLPropertyBag mGlobalPrefs;
256
257 #ifdef _WIN32
258   /*!
259   run from a network share
260   this one is not being saved out in prefs, since we need to know before we load prefs
261   we use a dummy file NETRUN_FILENAME as flag
262   all done with static stuff
263   */
264   static bool m_bNetRun;
265 #endif
266
267   bool m_bDoGameInstall;
268
269   CGameInstall mGameInstall;
270
271 protected:
272
273   int m_nComboSelect; ///< intermediate int value for combo in dialog box
274
275 public:
276
277   /*!
278   those settings are saved in the global prefs file
279   I'm too lazy to wrap behind protected access, not sure this needs to be public
280   NOTE: those are preference settings. if you change them it is likely that you would
281   have to restart the editor for them to take effect
282   */
283   /*@{*/
284   /*!
285   what game has been selected
286   this is the name of the .game file
287   */
288   Str m_sGameFile;
289   /*!
290   auto-load the game on startup
291   this is linked to auto-load checkbox
292   */
293   bool m_bAutoLoadGame;
294   /*!
295   log console to radiant.log
296   m_bForceLogConsole is an obscure forced latching situation
297   */
298   bool m_bLogConsole;
299   bool m_bForceLogConsole;
300   /*@}*/
301
302   /*!
303   points somewhere in mGames, set once at startup
304   */
305   CGameDescription *m_pCurrentGameDescription;
306
307   /*!
308   the list of game descriptions we scanned from the game/ dir
309   */
310   list<CGameDescription *> mGames;
311
312   CGameDialog() {
313           mFrame = NULL;
314           m_pCurrentGameDescription = NULL;
315           m_bLogConsole = false;
316           m_bForceLogConsole = false;
317           m_bDoGameInstall = true;      // go through DoModal at least once
318           mGameCombo = NULL;
319   }
320   virtual ~CGameDialog();
321
322   void AddPacksURL( Str &s );
323
324   /*!
325   intialize the game dialog, called at CPrefsDlg::Init
326   will scan for games, load prefs, and do game selection dialog if needed
327   */
328   void Init();
329
330   /*!
331   reset the global settings by removing the file
332   */
333   void Reset();
334
335   /*!
336   run the dialog UI for the list of games
337   */
338   void DoGameDialog();
339
340   /*!
341         call out to the game installation dialog
342   */
343   void DoGameInstall();
344
345   /*!
346   Dialog API
347   this is only called when the dialog is built at startup for main engine select
348   */
349   void BuildDialog();
350   void UpdateData( bool retrieve );
351
352   /*!
353   construction of the dialog frame
354   this is the part to be re-used in prefs dialog
355   for the standalone dialog, we include this in a modal box
356   for prefs, we hook the frame in the main notebook
357   build the frame on-demand (only once)
358   */
359   GtkWidget *GetGlobalFrame();
360
361   /*!
362   global preferences subsystem
363   XML-based this time, hopefully this will generalize to other prefs
364   LoadPrefs has hardcoded defaults
365   NOTE: it may not be strictly 'CGameDialog' to put the global prefs here
366     could have named the class differently I guess
367   */
368   /*@{*/
369   void LoadPrefs(); ///< load from file into variables
370   void SavePrefs(); ///< save pref variables to file
371   /*@}*/
372
373   /*!
374   read or set netrun (check file)
375   \param retrieve
376     if false, will check if netrun file is present and will set m_bNetRun
377     if true, will create/erase the netrun file depending on m_bNetRun
378     NOTE: this is not backwards, 'retrieve' means 'retrieve from settings dialog' - in terms of UI
379   */
380   static void UpdateNetrun(bool retrieve);
381   /*!
382   get current netrun setting
383   */
384   static bool GetNetrun();
385
386 private:
387   /*!
388   scan for .game files, load them
389   */
390   void ScanForGames();
391
392   /*!
393   inits g_PrefsDlg.m_global_rc_path
394   */
395   void InitGlobalPrefPath();
396
397   /*!
398   uses m_nComboItem to find the right mGames
399   */
400   CGameDescription *GameDescriptionForComboItem();
401
402   /*!
403         callback for the game install button
404   */
405   static void SInstallCallback( GtkWidget *widget, gpointer data );
406
407   void UpdateGameCombo();
408 };
409
410 typedef struct {
411   int nEntitySplit1;
412   int nEntitySplit2;
413
414   window_position_t position;
415
416   window_position_t posEntityWnd;
417   window_position_t posMapInfoWnd;
418   window_position_t posCamWnd;
419   window_position_t posZWnd;
420   window_position_t posXYWnd;
421   window_position_t posXZWnd;
422   window_position_t posYZWnd;
423   window_position_t posPatchWnd;
424   window_position_t posSurfaceWnd;
425   window_position_t posEntityInfoWnd;
426
427   int nXYHeight;
428   int nZWidth;
429   int nXYWidth;
430   int nCamWidth;
431   int nCamHeight;
432   int nZFloatWidth;
433   int nState;
434 } windowPosInfo_t;
435
436 class PrefsDlg : public Dialog
437 {
438
439 public:
440   /*!
441   local prefs file
442   */
443   CXMLPropertyBag mLocalPrefs;
444
445   // will enable/disable stuff according to the situation
446   void DoSensitivity();
447   void PreModal() { DoSensitivity(); }
448
449   // enable/disable custom editor entry
450   void DoEditorSensitivity();
451
452   /*!
453   this holds global level preferences
454   */
455   CGameDialog mGamesDialog;
456 protected:
457   // warning about old project files
458   bool m_bWarn;
459   list<CGameDescription *> mGames;
460
461 public:
462   // last light intensity used in the CLightPrompt dialog, stored in registry
463   int m_iLastLightIntensity;
464   // these mirror what goes in the combo box
465   // see PrefDlg::m_nShader, tells wether to load NONE / COMMON or ALL shaders at parsing stage
466   enum {SHADER_NONE = 0, SHADER_COMMON, SHADER_ALL};
467
468   // Gef: updated preferences dialog
469   /*! Preference notebook page numbers */
470   enum {PTAB_FRONT = 0, PTAB_GAME_SETTINGS, PTAB_2D, PTAB_CAMERA, PTAB_TEXTURE, PTAB_LAYOUT, PTAB_MOUSE,
471         PTAB_EDITING, PTAB_STARTUP, PTAB_PATHS, PTAB_MISC, PTAB_BSPMONITOR} pref_tabs;
472
473   GtkWidget *notebook;
474
475   void UpdateTextureCompression();
476
477 #ifdef ATIHACK_812
478   void UpdateATIHack();
479 #endif
480
481   void LoadPrefs();
482   void SavePrefs();
483   void LoadTexdefPref(texdef_t* pTexdef, char* pName);
484
485   PrefsDlg ();
486   virtual ~PrefsDlg ()
487   {
488     g_string_free (m_rc_path, true );
489     g_string_free (m_inipath, true );
490   }
491
492   /*!
493   path for global settings
494   win32: g_strAppPath
495   linux: ~/.radiant/<version>/
496   */
497   GString *m_global_rc_path;
498
499   /*!
500   path to per-game settings
501   used for various game dependant storage
502   win32: g_strGameToolsPath
503   linux: ~/.radiant/<version>/<gamename>/
504   */
505   GString *m_rc_path;
506
507   /*!
508   holds per-game settings
509   m_rc_path+"local.pref"
510   \todo FIXME at some point this should become XML property bag code too
511   */
512   GString *m_inipath;
513
514   // initialize the above paths
515   void Init();
516
517 #if 0
518   // DEPRECATED: use engine path from the current game description instead
519         // path to the top-level installation
520         Str     m_strEnginePath;
521   // name of executable
522   // quake2 quake3 etc
523         Str     m_strEngine;
524   // we use this Str to store the full path to the engine: m_strEnginePath + m_strEngine
525   // it's not stored in the registry or anything, just ued for display in prefs
526   Str   m_strPrefsDlgEngine;
527 #endif
528
529   // Dialog Data
530   int   m_nMouse;
531   MainFrame::EViewStyle m_nView;
532   bool  m_bTextureLock;
533   bool  m_bLoadLast;
534         // path to the project loaded at startup
535         // if g_PrefsDlg can't find the information in the ini file
536         // it will try to guess and eventually ask the user
537   Str   m_strLastProject;
538   /*!
539   version of last loaded project file
540   says -1 if there's no version loaded
541   if it's a manually constructed project file, will be 0
542   otherwise the actual 'version' epair
543   */
544   int   m_nLastProjectVer;
545   Str   m_strLastMap;
546   bool  m_bInternalBSP;
547   bool  m_bRightClick;
548   bool  m_bSetGame;
549   bool  m_bAutoSave;
550   bool  m_bLoadLastMap;
551   bool  m_bTextureWindow;
552   bool  m_bSnapShots;
553   float m_fTinySize;
554   bool  m_bCleanTiny;
555   bool  m_bCamXYUpdate;
556   int   m_nCamDragMultiSelect;
557   bool  m_bCamDragMultiSelect;
558   bool  m_bCamFreeLook;
559   bool  m_bCamFreeLookStrafe;
560   bool  m_bCamInverseMouse;
561   bool  m_bCamDiscrete;
562   bool  m_bNewLightDraw;
563   Str   m_strPrefabPath;
564   int   m_nWhatGame;
565   bool  m_bALTEdge;
566   bool  m_bFaceColors;
567   bool  m_bXZVis;
568   bool  m_bYZVis;
569   bool  m_bZVis;
570   bool  m_bSizePaint;
571   bool  m_bDLLEntities;
572   bool  m_bRotateLock;
573   bool  m_bDetachableMenus;
574   bool  m_bPatchToolbar;
575   bool  m_bWideToolbar;
576   bool  m_bPluginToolbar;
577   bool  m_bNoClamp;
578         //++timo this is most likely broken, I don't know what it's supposed to do
579   Str   m_strUserPath;
580   int   m_nRotation;
581   bool  m_bChaseMouse;
582   bool  m_bTextureScrollbar;
583   bool  m_bDisplayLists;
584   bool  m_bAntialiasedPointsAndLines; // Fishman - Add antialiazed points and lines support. 09/03/00
585   bool  m_bShowShaders;
586   int   m_nShader;
587   bool  m_bNoStipple;
588   int   m_nUndoLevels;
589   bool  m_bVertexSplit;
590
591   int   m_nMouseButtons;
592   int   m_nAngleSpeed;
593   int   m_nMoveSpeed;
594   int   m_nAutoSave;
595   bool  m_bCubicClipping;
596   int   m_nCubicScale;
597   bool  m_bSelectCurves;
598   bool  m_bSelectModels;
599   int   m_nEntityShowState;
600   int   m_nTextureScale;
601   bool  m_bNormalizeColors;
602   bool  m_bSwitchClip;
603   bool  m_bSelectWholeEntities;
604   int   m_nTextureQuality;
605   bool  m_bGLLighting;
606   bool  m_bTexturesShaderlistOnly;
607   int   m_nSubdivisions;
608   bool  m_bFloatingZ;
609   bool  m_bLatchedFloatingZ;
610   // Gef: Kyro GL_POINT workaround
611   bool  m_bGlPtWorkaround;
612
613   // how many menus in the texture thing before we split?
614   int   m_nTextureMenuSplit;
615
616   // watch the BSP process through network connections
617   // true: trigger the BSP steps one by one and monitor them through the network
618   // false: create a BAT / .sh file and execute it. don't bother monitoring it.
619   bool  m_bWatchBSP;
620   // do we stop the compilation process if we come accross a leak?
621   bool  m_bLeakStop;
622   // timeout when beginning a step (in seconds)
623   // if we don't get a connection quick enough we assume something failed and go back to idling
624   int   m_iTimeout;
625   bool  m_bRunQuake;
626   // store prefs setting for automatic sleep mode activation
627   bool  m_bDoSleep;
628
629   bool m_bClipCaulk;
630
631   // make the texture increments match the grid changes
632   bool m_bSnapTToGrid;
633
634   // try to fix the target/targetname conflicts when importing a map (default true)
635   bool m_bDoTargetFix;
636
637   // the increment step we use against the wheel mouse
638   int m_nWheelInc;
639
640 #ifdef _WIN32
641   // use the file associations to open files instead of builtin Gtk editor
642   bool m_bUseWin32Editor;
643 #else
644   // custom shader editor
645   bool m_bUseCustomEditor;
646   Str  m_strEditorCommand;  // this is the command executed
647 #endif
648
649 #ifdef _WIN32
650   bool m_bNativeGUI;
651   bool m_bStartOnPrimMon;
652 #endif
653
654   bool m_bPatchBBoxSelect;
655
656   // RR2DO2: latched data, for settings that require a restart. We don't want to set
657   // these directly in case users set them under preferences and then continue working
658   // with the editor.
659   MainFrame::EViewStyle m_nLatchedView;
660   int m_nMRUCount;
661   Str m_strMRUFiles[4];
662
663   windowPosInfo_t mWindowInfo;
664
665   bool  m_bLatchedDetachableMenus;
666   bool  m_bLatchedPatchToolbar;
667   bool  m_bLatchedWideToolbar;
668   bool  m_bLatchedPluginToolbar;
669   int   m_nLatchedShader;
670   int   m_nLatchedTextureQuality;
671
672   // RIANT
673   // texture compression format
674   int m_nTextureCompressionFormat;
675
676   int m_nLightRadiuses;
677
678   bool m_bQ3Map2Texturing;
679
680 #ifdef ATIHACK_812
681         bool m_bGlATIHack;
682 #endif
683
684   void UpdateData (bool retrieve);
685
686   /*! Utility function for swapping notebook pages for tree list selections */
687   void showPrefPage(int prefpage);
688
689 protected:
690   /*! Scan for game description files and build a list */
691   void ScanForGames();
692
693   /*! Dialog API */
694   void BuildDialog ();
695   void PostModal (int code);
696 };
697
698 #endif // _PREFERENCES_H_