]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - contrib/camera/funchandlers.cpp
some updates to the Linux build system - obtained a core binary and all required...
[xonotic/netradiant.git] / contrib / camera / funchandlers.cpp
1 /*\r
2 Copyright (C) 1999-2007 id Software, Inc. and contributors.\r
3 For a list of contributors, see the accompanying CONTRIBUTORS file.\r
4 \r
5 This file is part of GtkRadiant.\r
6 \r
7 GtkRadiant is free software; you can redistribute it and/or modify\r
8 it under the terms of the GNU General Public License as published by\r
9 the Free Software Foundation; either version 2 of the License, or\r
10 (at your option) any later version.\r
11 \r
12 GtkRadiant is distributed in the hope that it will be useful,\r
13 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
15 GNU General Public License for more details.\r
16 \r
17 You should have received a copy of the GNU General Public License\r
18 along with GtkRadiant; if not, write to the Free Software\r
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\r
20 */\r
21 \r
22 /*\r
23 Camera plugin for GtkRadiant\r
24 Copyright (C) 2002 Splash Damage Ltd.\r
25 */\r
26 \r
27 #include "camera.h"\r
28 \r
29 extern GtkWidget *g_pEditModeAddRadioButton;\r
30 \r
31 char* Q_realpath(const char *path, char *resolved_path, size_t size)\r
32 {\r
33 #if defined  (__linux__) || defined (__APPLE__)\r
34         return realpath(path, resolved_path);\r
35 #else\r
36         return _fullpath(resolved_path, path, size);    \r
37 #endif\r
38 }\r
39 \r
40 static void DoNewCamera( idCameraPosition::positionType type )\r
41 {\r
42         CCamera *cam = AllocCam();\r
43 \r
44         if( cam ) {\r
45                 char buf[128];\r
46                 sprintf( buf, "camera%i", cam->GetCamNum() );\r
47 \r
48                 cam->GetCam()->startNewCamera( type );\r
49                 cam->GetCam()->setName( buf );\r
50                 cam->GetCam()->buildCamera();\r
51 \r
52                 sprintf( buf, "Unsaved Camera %i", cam->GetCamNum() );\r
53                 cam->SetFileName( buf, false );\r
54 \r
55                 SetCurrentCam( cam );\r
56                 RefreshCamListCombo();\r
57 \r
58                 // Go to editmode Add\r
59                 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(g_pEditModeAddRadioButton), TRUE );\r
60 \r
61                 // Show the camera inspector\r
62                 DoCameraInspector();\r
63 \r
64                 // Start edit mode (if not initiated by DoCameraInspector)\r
65                 if( !g_bEditOn )\r
66                         DoStartEdit( GetCurrentCam() );\r
67         } else {\r
68       g_FuncTable.m_pfnMessageBox( (GtkWidget *)g_pRadiantWnd, "No free cameras available.", "Create Camera Error", MB_OK, NULL );\r
69         }\r
70 }\r
71 \r
72 void DoNewFixedCamera()\r
73 {\r
74         DoNewCamera( idCameraPosition::FIXED );\r
75 }\r
76 \r
77 void DoNewInterpolatedCamera()\r
78 {\r
79         DoNewCamera( idCameraPosition::INTERPOLATED );\r
80 }\r
81 \r
82 void DoNewSplineCamera()\r
83 {\r
84         DoNewCamera( idCameraPosition::SPLINE );\r
85 }\r
86 \r
87 void DoCameraInspector()\r
88 {\r
89   gtk_widget_show( g_pCameraInspectorWnd );\r
90 }\r
91 \r
92 void DoPreviewCamera()\r
93 {\r
94         if( GetCurrentCam() ) {\r
95                 g_iPreviewRunning = 1;\r
96                 g_FuncTable.m_pfnSysUpdateWindows( W_XY_OVERLAY | W_CAMERA );\r
97         }\r
98 }\r
99 \r
100 void DoLoadCamera()\r
101 {\r
102   char basepath[PATH_MAX];\r
103 \r
104         if( firstCam && firstCam->HasBeenSaved() )\r
105     ExtractFilePath( firstCam->GetFileName(), basepath );\r
106   else\r
107     strcpy( basepath, g_FuncTable.m_pfnGetGamePath() );\r
108 \r
109   const gchar *filename = g_FuncTable.m_pfnFileDialog( (GtkWidget *)g_pRadiantWnd, TRUE, "Open Camera File", basepath, "camera");\r
110 \r
111   if( filename )\r
112         {\r
113     CCamera *cam = AllocCam();\r
114     char fullpathtofile[PATH_MAX];\r
115 \r
116     if( cam ) {\r
117                         Q_realpath(filename, fullpathtofile, PATH_MAX);\r
118 \r
119       // see if this camera file was already loaded\r
120       CCamera *checkCam = firstCam->GetNext();  // not the first one as we just allocated it\r
121       while( checkCam ) {\r
122         if( !strcmp( fullpathtofile, checkCam->GetFileName() ) ) {\r
123           char error[PATH_MAX+64];\r
124           FreeCam( cam );\r
125           sprintf( error, "Camera file \'%s\' is already loaded", fullpathtofile );\r
126           g_FuncTable.m_pfnMessageBox( (GtkWidget *)g_pRadiantWnd, error, "Load error", MB_OK, NULL );\r
127           //g_free( filename );\r
128           return;\r
129         }\r
130         checkCam = checkCam->GetNext();\r
131       }\r
132 \r
133                         if( loadCamera( cam->GetCamNum(), fullpathtofile ) ) {\r
134                                 cam->GetCam()->buildCamera();\r
135         cam->SetFileName( filename, true );\r
136         SetCurrentCam( cam );\r
137         RefreshCamListCombo();\r
138         g_FuncTable.m_pfnSysUpdateWindows( W_XY_OVERLAY | W_CAMERA );\r
139       } else {\r
140         char error[PATH_MAX+64];\r
141         FreeCam( cam );\r
142         sprintf( error, "An error occured during the loading of \'%s\'", fullpathtofile );\r
143         g_FuncTable.m_pfnMessageBox( (GtkWidget *)g_pRadiantWnd, error, "Load error", MB_OK, NULL );\r
144       }\r
145 \r
146       //g_free( filename );\r
147     } else {\r
148                 g_FuncTable.m_pfnMessageBox( (GtkWidget *)g_pRadiantWnd, "No free camera slots available", "Load error", MB_OK, NULL );\r
149           }\r
150         }\r
151 }\r
152 \r
153 void DoSaveCamera() {\r
154   char basepath[PATH_MAX];\r
155 \r
156   if( !GetCurrentCam() )\r
157     return;\r
158 \r
159   if( GetCurrentCam()->GetFileName()[0] )\r
160     ExtractFilePath( GetCurrentCam()->GetFileName(), basepath );\r
161   else\r
162     strcpy( basepath, g_FuncTable.m_pfnGetGamePath() );\r
163 \r
164   const gchar *filename = g_FuncTable.m_pfnFileDialog( (void *)g_pRadiantWnd, FALSE, "Save Camera File", basepath, "camera");\r
165 \r
166   if( filename ) {\r
167     char fullpathtofile[PATH_MAX + 8];\r
168 \r
169     Q_realpath(filename, fullpathtofile, PATH_MAX);\r
170 \r
171                 // File dialog from windows (and maybe the gtk one from radiant) doesn't handle default extensions properly.\r
172                 // Add extension and check again if file exists\r
173                 if( strcmp( fullpathtofile + (strlen(fullpathtofile) - 7), ".camera" ) ) {\r
174                         strcat( fullpathtofile, ".camera" );\r
175 \r
176                         if( FileExists( fullpathtofile ) ) {\r
177                                 if ( g_FuncTable.m_pfnMessageBox( (GtkWidget *)g_pRadiantWnd, "File already exists.\nOverwrite?", "Save Camera File", MB_YESNO, NULL ) == IDNO ) {\r
178                                         return;\r
179                                 }\r
180                         }\r
181                 }\r
182 \r
183           // see if this camera file was already loaded\r
184     CCamera *checkCam = firstCam;\r
185     while( checkCam ) {\r
186       if( checkCam == GetCurrentCam() ) {\r
187         checkCam = checkCam->GetNext();\r
188                                 if( !checkCam ) // we only have one camera file opened so no need to check further\r
189                                         break;\r
190       } else if( !strcmp( fullpathtofile, checkCam->GetFileName() ) ) {\r
191         char error[PATH_MAX+64];\r
192         sprintf( error, "Camera file \'%s\' is currently loaded by GtkRadiant.\nPlease select a different filename.", fullpathtofile );\r
193                 g_FuncTable.m_pfnMessageBox( (GtkWidget *)g_pRadiantWnd, error, "Save error", MB_OK, NULL );\r
194         return;\r
195       }\r
196       checkCam = checkCam->GetNext();\r
197     }\r
198 \r
199     // FIXME: check for existing directory\r
200 \r
201     GetCurrentCam()->GetCam()->save( fullpathtofile );\r
202                 GetCurrentCam()->SetFileName( fullpathtofile, true );\r
203                 RefreshCamListCombo();\r
204   }\r
205 }\r
206 \r
207 void DoUnloadCamera() {\r
208   if( !GetCurrentCam() )\r
209     return;\r
210 \r
211         if( !GetCurrentCam()->HasBeenSaved() ) {\r
212                 char buf[PATH_MAX+64];\r
213                 sprintf( buf, "Do you want to save the changes for camera '%s'?", GetCurrentCam()->GetCam()->getName() );\r
214                 if ( g_FuncTable.m_pfnMessageBox( (GtkWidget *)g_pRadiantWnd, buf, "Warning", MB_YESNO, NULL ) == IDYES ) {\r
215                         DoSaveCamera();\r
216                 }\r
217         } else if( GetCurrentCam()->HasBeenSaved() == 2 ) {\r
218                 char buf[PATH_MAX+64];\r
219                 sprintf( buf, "Do you want to save the changes made to camera file '%s'?", GetCurrentCam()->GetFileName() );\r
220                 if( g_FuncTable.m_pfnMessageBox( (GtkWidget *)g_pRadiantWnd, buf, "Warning", MB_YESNO, NULL ) == IDYES ) {\r
221                         DoSaveCamera();\r
222                 }\r
223         }\r
224 \r
225   if( g_pCurrentEditCam ) {\r
226     DoStopEdit();\r
227     g_pCurrentEditCam = NULL;\r
228   }\r
229 \r
230         FreeCam( GetCurrentCam() );\r
231         SetCurrentCam( NULL );\r
232         RefreshCamListCombo();\r
233 }\r
234 \r
235 CCamera *g_pCurrentEditCam = NULL;\r
236 \r
237 void DoStartEdit( CCamera *cam ) {\r
238   if( g_pCurrentEditCam ) {\r
239     DoStopEdit();\r
240     g_pCurrentEditCam = NULL;\r
241   }\r
242 \r
243   if( cam ) {\r
244     g_bEditOn = true;\r
245 \r
246     if( !Listener )\r
247       Listener = new CListener;\r
248 \r
249     cam->GetCam()->startEdit( g_iActiveTarget < 0 ? true : false );\r
250 \r
251     g_pCurrentEditCam = cam;\r
252 \r
253     g_FuncTable.m_pfnSysUpdateWindows( W_XY_OVERLAY | W_CAMERA );\r
254   }\r
255 }\r
256 \r
257 void DoStopEdit( void ) {\r
258   g_bEditOn = false;\r
259 \r
260   if( Listener ) {\r
261       delete Listener;\r
262       Listener = NULL;\r
263   }\r
264 \r
265   if( g_pCurrentEditCam ) {\r
266     // stop editing on the current cam\r
267     g_pCurrentEditCam->GetCam()->stopEdit();\r
268     g_pCurrentEditCam = NULL;\r
269 \r
270     g_FuncTable.m_pfnSysUpdateWindows( W_XY_OVERLAY | W_CAMERA );\r
271   }\r
272 }\r