]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - radiant/preferences.h
908616adc5eea9bd889d0428daddd25fb8b97253
[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(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(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(char *name, Str *pV, char *V);
114   void GetPref(char *name, int *pV, int V);
115   void GetPref(char *name, bool *pV, bool V);
116   void GetPref(char *name, float *pV, float V);
117   void GetPref(char *name, float *pV, float* V);
118   void GetPref(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
184   CGameDescription() { mpDoc = NULL; }
185   /*!
186   \todo parse basic info from the node
187   user-friendly name of the game
188   essential parameters (such as the start dir)
189   */
190   CGameDescription(xmlDocPtr pDoc, const Str &GameFile);
191   virtual ~CGameDescription() { xmlFreeDoc(mpDoc); }
192
193   void Dump();
194 };
195
196 /*!
197 select games, copy editing assets and write out configuration files
198  */
199 class CGameInstall : public Dialog {
200 public:
201         void Run();
202         void BuildDialog();
203
204         enum gameType_e {
205                 GAME_Q3,
206                 GAME_URT,
207                 GAME_WARSOW
208         };
209
210 protected:
211         Str m_strName;
212         Str     m_strMod;
213         Str m_strEngine;
214         int m_nComboSelect;
215 };
216
217 /*!
218 standalone dialog for games selection, and more generally global settings
219 */
220 class CGameDialog : public Dialog
221 {
222   GtkWidget *mFrame; ///< this is built on-demand first time it's used
223   GtkWidget *mTopBox; ///< top level box used to store the dialog frame, must unhook after modal use
224
225
226   /*!
227   global prefs storage
228   */
229   CXMLPropertyBag mGlobalPrefs;
230
231 #ifdef _WIN32
232   /*!
233   run from a network share
234   this one is not being saved out in prefs, since we need to know before we load prefs
235   we use a dummy file NETRUN_FILENAME as flag
236   all done with static stuff
237   */
238   static bool m_bNetRun;
239 #endif
240
241   bool m_bDoGameInstall;
242
243   CGameInstall mGameInstall;
244
245 protected:
246   
247   int m_nComboSelect; ///< intermediate int value for combo in dialog box
248
249 public:
250
251   /*! 
252   those settings are saved in the global prefs file 
253   I'm too lazy to wrap behind protected access, not sure this needs to be public
254   NOTE: those are preference settings. if you change them it is likely that you would
255   have to restart the editor for them to take effect
256   */
257   /*@{*/
258   /*!
259   what game has been selected
260   this is the name of the .game file
261   */
262   Str m_sGameFile;
263   /*!
264   auto-load the game on startup
265   this is linked to auto-load checkbox
266   */
267   bool m_bAutoLoadGame;
268   /*!
269   log console to radiant.log
270   m_bForceLogConsole is an obscure forced latching situation
271   */
272   bool m_bLogConsole;
273   bool m_bForceLogConsole;
274   /*@}*/
275
276   /*!
277   points somewhere in mGames, set once at startup
278   */
279   CGameDescription *m_pCurrentGameDescription;
280
281   /*!
282   the list of game descriptions we scanned from the game/ dir
283   */
284   list<CGameDescription *> mGames;
285
286   CGameDialog() {
287           mFrame = NULL;
288           m_pCurrentGameDescription = NULL;
289           m_bLogConsole = false;
290           m_bForceLogConsole = false;
291           m_bDoGameInstall = true;      // go through DoModal at least once
292   }
293   virtual ~CGameDialog(); 
294
295   void AddPacksURL( Str &s );
296     
297   /*!
298   intialize the game dialog, called at CPrefsDlg::Init
299   will scan for games, load prefs, and do game selection dialog if needed
300   */
301   void Init();
302
303   /*!
304   reset the global settings by removing the file
305   */
306   void Reset();
307
308   /*!
309   run the dialog UI for the list of games 
310   */
311   void DoGameDialog();
312
313   /*!
314         call out to the game installation dialog
315   */
316   void DoGameInstall();
317
318   /*!
319   Dialog API
320   this is only called when the dialog is built at startup for main engine select
321   */
322   void BuildDialog();
323   void UpdateData( bool retrieve );
324
325   /*!
326   construction of the dialog frame
327   this is the part to be re-used in prefs dialog
328   for the standalone dialog, we include this in a modal box
329   for prefs, we hook the frame in the main notebook
330   build the frame on-demand (only once)
331   */
332   GtkWidget *GetGlobalFrame();
333
334   /*!
335   global preferences subsystem
336   XML-based this time, hopefully this will generalize to other prefs
337   LoadPrefs has hardcoded defaults
338   NOTE: it may not be strictly 'CGameDialog' to put the global prefs here
339     could have named the class differently I guess
340   */
341   /*@{*/
342   void LoadPrefs(); ///< load from file into variables
343   void SavePrefs(); ///< save pref variables to file
344   /*@}*/
345
346   /*!
347   read or set netrun (check file)
348   \param retrieve 
349     if false, will check if netrun file is present and will set m_bNetRun
350     if true, will create/erase the netrun file depending on m_bNetRun
351     NOTE: this is not backwards, 'retrieve' means 'retrieve from settings dialog' - in terms of UI
352   */
353   static void UpdateNetrun(bool retrieve);
354   /*!
355   get current netrun setting
356   */
357   static bool GetNetrun();
358
359 private:
360   /*!
361   scan for .game files, load them
362   */
363   void ScanForGames();
364
365   /*!
366   inits g_PrefsDlg.m_global_rc_path
367   */
368   void InitGlobalPrefPath();
369
370   /*!
371   uses m_nComboItem to find the right mGames
372   */
373   CGameDescription *GameDescriptionForComboItem();
374
375   /*!
376         callback for the game install button
377   */
378   static void SInstallCallback( GtkWidget *widget, gpointer data );
379 };
380
381 typedef struct {
382   int nEntitySplit1;
383   int nEntitySplit2;
384   
385   window_position_t position;
386
387   window_position_t posEntityWnd;
388   window_position_t posMapInfoWnd;
389   window_position_t posCamWnd;
390   window_position_t posZWnd;
391   window_position_t posXYWnd;
392   window_position_t posXZWnd;
393   window_position_t posYZWnd;
394   window_position_t posPatchWnd;
395   window_position_t posSurfaceWnd;
396   window_position_t posEntityInfoWnd;
397
398   int nXYHeight;
399   int nZWidth;
400   int nXYWidth;
401   int nCamWidth;
402   int nCamHeight;
403   int nZFloatWidth;
404   int nState;
405 } windowPosInfo_t;
406
407 class PrefsDlg : public Dialog
408 {
409   
410 public:
411   /*!
412   local prefs file
413   */
414   CXMLPropertyBag mLocalPrefs;
415
416   // will enable/disable stuff according to the situation
417   void DoSensitivity();
418   void PreModal() { DoSensitivity(); }
419   
420   // enable/disable custom editor entry
421   void DoEditorSensitivity();
422   
423   /*!
424   this holds global level preferences
425   */
426   CGameDialog mGamesDialog;
427 protected:
428   // warning about old project files
429   bool m_bWarn;
430   list<CGameDescription *> mGames;
431   
432 public:
433   // last light intensity used in the CLightPrompt dialog, stored in registry
434   int m_iLastLightIntensity;
435   // these mirror what goes in the combo box
436   // see PrefDlg::m_nShader, tells wether to load NONE / COMMON or ALL shaders at parsing stage
437   enum {SHADER_NONE = 0, SHADER_COMMON, SHADER_ALL};
438
439   // Gef: updated preferences dialog
440   /*! Preference notebook page numbers */
441   enum {PTAB_FRONT = 0, PTAB_GAME_SETTINGS, PTAB_2D, PTAB_CAMERA, PTAB_TEXTURE, PTAB_LAYOUT, PTAB_MOUSE,
442         PTAB_EDITING, PTAB_STARTUP, PTAB_PATHS, PTAB_MISC, PTAB_BSPMONITOR} pref_tabs;
443   
444   GtkWidget *notebook;
445        
446   void UpdateTextureCompression();
447
448 #ifdef ATIHACK_812
449   void UpdateATIHack();
450 #endif
451         
452   void LoadPrefs();
453   void SavePrefs();
454   void LoadTexdefPref(texdef_t* pTexdef, char* pName);
455
456   PrefsDlg ();
457   virtual ~PrefsDlg ()
458   {
459     g_string_free (m_rc_path, true );
460     g_string_free (m_inipath, true );
461   }
462
463   /*!
464   path for global settings
465   win32: g_strAppPath
466   linux: ~/.radiant/<version>/
467   */
468   GString *m_global_rc_path;
469
470   /*!
471   path to per-game settings
472   used for various game dependant storage
473   win32: g_strGameToolsPath
474   linux: ~/.radiant/<version>/<gamename>/
475   */
476   GString *m_rc_path;
477
478   /*!
479   holds per-game settings
480   m_rc_path+"local.pref"
481   \todo FIXME at some point this should become XML property bag code too
482   */
483   GString *m_inipath;
484
485   // initialize the above paths
486   void Init();
487
488 #if 0
489   // DEPRECATED: use engine path from the current game description instead
490         // path to the top-level installation
491         Str     m_strEnginePath;
492   // name of executable
493   // quake2 quake3 etc
494         Str     m_strEngine;
495   // we use this Str to store the full path to the engine: m_strEnginePath + m_strEngine
496   // it's not stored in the registry or anything, just ued for display in prefs
497   Str   m_strPrefsDlgEngine;
498 #endif
499
500   // Dialog Data
501   int   m_nMouse;
502   MainFrame::EViewStyle m_nView;
503   bool  m_bTextureLock;
504   bool  m_bLoadLast;
505         // path to the project loaded at startup
506         // if g_PrefsDlg can't find the information in the ini file
507         // it will try to guess and eventually ask the user
508   Str   m_strLastProject;  
509   /*!
510   version of last loaded project file
511   says -1 if there's no version loaded
512   if it's a manually constructed project file, will be 0
513   otherwise the actual 'version' epair
514   */
515   int   m_nLastProjectVer;
516   Str   m_strLastMap;
517   bool  m_bInternalBSP;
518   bool  m_bRightClick;
519   bool  m_bSetGame;
520   bool  m_bAutoSave;
521   bool  m_bLoadLastMap;
522   bool  m_bTextureWindow;
523   bool  m_bSnapShots;
524   float m_fTinySize;
525   bool  m_bCleanTiny;
526   bool  m_bCamXYUpdate;
527   int   m_nCamDragMultiSelect;
528   bool  m_bCamDragMultiSelect;
529   bool  m_bCamFreeLook;
530   bool  m_bCamFreeLookStrafe;
531   bool  m_bCamInverseMouse;
532   bool  m_bCamDiscrete;
533   bool  m_bNewLightDraw;
534   Str   m_strPrefabPath;
535   int   m_nWhatGame;
536   bool  m_bALTEdge;
537   bool  m_bFaceColors;
538   bool  m_bXZVis;
539   bool  m_bYZVis;
540   bool  m_bZVis;
541   bool  m_bSizePaint;
542   bool  m_bDLLEntities;
543   bool  m_bRotateLock;
544   bool  m_bDetachableMenus;
545   bool  m_bPatchToolbar;
546   bool  m_bWideToolbar;
547   bool  m_bPluginToolbar;
548   bool  m_bNoClamp;
549         //++timo this is most likely broken, I don't know what it's supposed to do
550   Str   m_strUserPath;
551   int   m_nRotation;
552   bool  m_bChaseMouse;
553   bool  m_bTextureScrollbar;
554   bool  m_bDisplayLists;
555   bool  m_bAntialiasedPointsAndLines; // Fishman - Add antialiazed points and lines support. 09/03/00
556   bool  m_bShowShaders;
557   int   m_nShader;
558   bool  m_bNoStipple;
559   int   m_nUndoLevels;
560   bool  m_bVertexSplit;
561
562   int   m_nMouseButtons;
563   int   m_nAngleSpeed;
564   int   m_nMoveSpeed;
565   int   m_nAutoSave;
566   bool  m_bCubicClipping;
567   int   m_nCubicScale;
568   bool  m_bSelectCurves;
569   bool  m_bSelectModels;
570   int   m_nEntityShowState;
571   int   m_nTextureScale;
572   bool  m_bNormalizeColors;
573   bool  m_bSwitchClip;
574   bool  m_bSelectWholeEntities;
575   int   m_nTextureQuality;
576   bool  m_bGLLighting;
577   bool  m_bTexturesShaderlistOnly;
578   int   m_nSubdivisions;
579   bool  m_bFloatingZ;
580   bool  m_bLatchedFloatingZ;
581   // Gef: Kyro GL_POINT workaround
582   bool  m_bGlPtWorkaround;
583
584   // how many menus in the texture thing before we split?
585   int   m_nTextureMenuSplit;
586
587   // watch the BSP process through network connections
588   // true: trigger the BSP steps one by one and monitor them through the network
589   // false: create a BAT / .sh file and execute it. don't bother monitoring it.
590   bool  m_bWatchBSP;
591   // do we stop the compilation process if we come accross a leak?
592   bool  m_bLeakStop;
593   // timeout when beginning a step (in seconds)
594   // if we don't get a connection quick enough we assume something failed and go back to idling
595   int   m_iTimeout;
596   bool  m_bRunQuake;
597   // store prefs setting for automatic sleep mode activation
598   bool  m_bDoSleep;
599   
600   bool m_bClipCaulk;
601
602   // make the texture increments match the grid changes
603   bool m_bSnapTToGrid;
604
605   // try to fix the target/targetname conflicts when importing a map (default true)
606   bool m_bDoTargetFix;
607
608   // the increment step we use against the wheel mouse
609   int m_nWheelInc;
610
611 #ifdef _WIN32
612   // use the file associations to open files instead of builtin Gtk editor
613   bool m_bUseWin32Editor;
614 #else
615   // custom shader editor
616   bool m_bUseCustomEditor;
617   Str  m_strEditorCommand;  // this is the command executed
618 #endif
619
620 #ifdef _WIN32
621   bool m_bNativeGUI;
622   bool m_bStartOnPrimMon;
623 #endif
624
625   bool m_bPatchBBoxSelect;
626
627   // RR2DO2: latched data, for settings that require a restart. We don't want to set
628   // these directly in case users set them under preferences and then continue working
629   // with the editor.
630   MainFrame::EViewStyle m_nLatchedView;
631   int m_nMRUCount;
632   Str m_strMRUFiles[4];
633
634   windowPosInfo_t mWindowInfo;
635
636   bool  m_bLatchedDetachableMenus;
637   bool  m_bLatchedPatchToolbar;
638   bool  m_bLatchedWideToolbar;
639   bool  m_bLatchedPluginToolbar;
640   int   m_nLatchedShader;
641   int   m_nLatchedTextureQuality;
642
643   // RIANT
644   // texture compression format
645   int m_nTextureCompressionFormat;
646
647   int m_nLightRadiuses;
648   
649   bool m_bQ3Map2Texturing;
650
651 #ifdef ATIHACK_812
652         bool m_bGlATIHack;
653 #endif
654
655   void UpdateData (bool retrieve);
656
657   /*! Utility function for swapping notebook pages for tree list selections */
658   void showPrefPage(int prefpage);
659
660 protected:
661   /*! Scan for game description files and build a list */
662   void ScanForGames();
663
664   /*! Dialog API */
665   void BuildDialog ();
666   void PostModal (int code);
667 };
668
669 #endif // _PREFERENCES_H_