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