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