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