ok
[xonotic/netradiant.git] / contrib / bkgrnd2d / plugin.cpp
1 /*\r
2 Copyright (C) 2003 Reed Mideke.\r
3 \r
4 This file is part of GtkRadiant.\r
5 \r
6 GtkRadiant is free software; you can redistribute it and/or modify\r
7 it under the terms of the GNU General Public License as published by\r
8 the Free Software Foundation; either version 2 of the License, or\r
9 (at your option) any later version.\r
10 \r
11 GtkRadiant is distributed in the hope that it will be useful,\r
12 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14 GNU General Public License for more details.\r
15 \r
16 You should have received a copy of the GNU General Public License\r
17 along with GtkRadiant; if not, write to the Free Software\r
18 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\r
19 */\r
20 \r
21 //\r
22 // 2d background Plugin\r
23 //\r
24 // Code by reyalP aka Reed Mideke\r
25 //\r
26 // Based on \r
27 //\r
28 \r
29 /*\r
30     Overview\r
31     ========\r
32         This little plugin allows you to display an image in the background of the\r
33         gtkradiant XY window.\r
34 \r
35     Version History\r
36     ===============\r
37 \r
38     v0.1\r
39       - Initial version.\r
40         v0.2\r
41           - three views, dialog box, toolbar\r
42     v0.25\r
43       - tooltips, follow gtkradiant coding conventions\r
44 \r
45     Why ?\r
46     -----\r
47       http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=88\r
48 \r
49 \r
50     How ?\r
51     -----\r
52      - textures 'n widgets 'n stuff.\r
53 */\r
54 \r
55 //#include "plugin.h"\r
56 //TODO we just poke the objects directly\r
57 #include "bkgrnd2d.h"\r
58 #include "dialog.h"\r
59 \r
60 #define CMD_SEP "-" \r
61 #define CMD_CONFIG "Configure..."\r
62 #define CMD_ABOUT "About..."\r
63 // =============================================================================\r
64 // Globals\r
65 \r
66 // function tables\r
67 _QERFuncTable_1 g_FuncTable;\r
68 _QERQglTable g_QglTable;\r
69 _QERFileSystemTable g_FileSystemTable;\r
70 _QEREntityTable g_EntityTable;\r
71 _QERAppDataTable g_DataTable;\r
72 \r
73 // for the file load dialog\r
74 void *g_pMainWidget;\r
75 \r
76 // =============================================================================\r
77 // plugin implementation\r
78 \r
79 static const char *PLUGIN_NAME = "2d window background plugin";\r
80 \r
81 //backwards for some reason\r
82 static const char *PLUGIN_COMMANDS = CMD_ABOUT ";" \r
83                                      CMD_SEP ";"\r
84                                                                                          CMD_CONFIG\r
85                                      ;\r
86 \r
87 static const char *PLUGIN_ABOUT = "2d window background v0.25\n\n"\r
88                                   "By reyalP (hellsownpuppy@yahoo.com)";\r
89 \r
90 \r
91 \r
92 \r
93 void DoBkgrndToggleXY();\r
94 void DoBkgrndToggleXZ();\r
95 void DoBkgrndToggleYZ();\r
96 \r
97 #define NUM_TOOLBAR_BUTTONS 4\r
98 struct toolbar_button_info_s\r
99 {\r
100         char *image;\r
101         char *text;\r
102         char *tip;\r
103         void (*func)();\r
104         IToolbarButton::EType type;\r
105 };\r
106 \r
107 struct toolbar_button_info_s toolbar_buttons[NUM_TOOLBAR_BUTTONS] = \r
108 {\r
109         {\r
110                 "bkgrnd2d_xy_toggle.bmp",\r
111                 "xy background",\r
112     "Toggle xy background image",\r
113                 DoBkgrndToggleXY,\r
114                 IToolbarButton::eToggleButton\r
115         },\r
116         {\r
117                 "bkgrnd2d_xz_toggle.bmp",\r
118                 "xz background",\r
119     "Toggle xz background image",\r
120                 DoBkgrndToggleXZ,\r
121                 IToolbarButton::eToggleButton\r
122         },\r
123         {\r
124                 "bkgrnd2d_yz_toggle.bmp",\r
125                 "yz background",\r
126     "Toggle yz background image",\r
127                 DoBkgrndToggleYZ,\r
128                 IToolbarButton::eToggleButton\r
129         },\r
130         {\r
131                 "bkgrnd2d_conf.bmp",\r
132                 "Configure",\r
133     "Configure background images",\r
134                 ShowBackgroundDialog,\r
135                 IToolbarButton::eButton\r
136         },\r
137 };\r
138 \r
139 class Bkgrnd2dButton : public IToolbarButton\r
140 {\r
141 public:\r
142   const toolbar_button_info_s *bi;\r
143   virtual const char* getImage() const\r
144   {\r
145     return bi->image;\r
146   }\r
147   virtual const char* getText() const\r
148   {\r
149     return bi->text;\r
150   }\r
151   virtual const char* getTooltip() const\r
152   {\r
153     return bi->tip;\r
154   }\r
155   virtual void activate() const\r
156   {\r
157     bi->func();\r
158     return ;\r
159   }\r
160   virtual EType getType() const\r
161   {\r
162     return bi->type;\r
163   }\r
164 };\r
165 \r
166 Bkgrnd2dButton g_bkgrnd2dbuttons[NUM_TOOLBAR_BUTTONS];\r
167 \r
168 unsigned int ToolbarButtonCount()\r
169 {\r
170   return NUM_TOOLBAR_BUTTONS;\r
171 }\r
172 \r
173 const IToolbarButton* GetToolbarButton(unsigned int index)\r
174 {\r
175   g_bkgrnd2dbuttons[index].bi = &toolbar_buttons[index];\r
176   return &g_bkgrnd2dbuttons[index];\r
177 }\r
178 \r
179 extern "C" const char* QERPlug_Init (void *hApp, void* pMainWidget)\r
180 {\r
181   g_pMainWidget = pMainWidget;\r
182 \r
183   InitBackgroundDialog();\r
184   render.Register();\r
185 \r
186 //TODO is it right ? is it wrong ? it works\r
187 //TODO figure out supported image types\r
188   GetFileTypeRegistry()->addType(FILETYPE_KEY, filetype_t("all files", "*.*"));\r
189   GetFileTypeRegistry()->addType(FILETYPE_KEY, filetype_t("jpeg files", "*.jpg"));\r
190   GetFileTypeRegistry()->addType(FILETYPE_KEY, filetype_t("targa files", "*.tga"));\r
191   return (char *) PLUGIN_NAME;\r
192 }\r
193 \r
194 extern "C" const char* QERPlug_GetName ()\r
195 {\r
196   return (char *) PLUGIN_NAME;\r
197 }\r
198 \r
199 extern "C" const char* QERPlug_GetCommandList ()\r
200 {\r
201   return (char *) PLUGIN_COMMANDS;\r
202 }\r
203 \r
204 extern "C" void QERPlug_Dispatch (const char *p, vec3_t vMin, vec3_t vMax, bool bSingleBrush)\r
205 {\r
206   Sys_Printf (MSG_PREFIX "Command \"%s\"\n",p); \r
207   if(!strcmp(p, CMD_ABOUT)) {\r
208         g_FuncTable.m_pfnMessageBox(NULL, PLUGIN_ABOUT, "About", MB_OK, NULL);\r
209   } \r
210   else if(!strcmp(p,CMD_CONFIG)) {\r
211         ShowBackgroundDialog();\r
212   }\r
213 }\r
214 \r
215 //TODO these three suck\r
216 void DoBkgrndToggleXY()\r
217 {\r
218   Sys_Printf (MSG_PREFIX "DoBkgrndToggleXY\n"); \r
219   // always toggle, since the buttons do\r
220   backgroundXY.m_bActive = (backgroundXY.m_bActive) ? false:true;\r
221   // if we don't have image or extents, and we activated,\r
222   // bring up the dialog with the corresponding page\r
223   // would be better to hide or grey out button, but we can't\r
224   if(backgroundXY.m_bActive && !backgroundXY.Valid())\r
225           ShowBackgroundDialogPG(0);\r
226   else\r
227           g_FuncTable.m_pfnSysUpdateWindows(W_XY);\r
228 }\r
229 \r
230 void DoBkgrndToggleXZ()\r
231 {\r
232   Sys_Printf (MSG_PREFIX "DoBkgrndToggleXZ\n"); \r
233   backgroundXZ.m_bActive = (backgroundXZ.m_bActive) ? false:true;\r
234   if(backgroundXZ.m_bActive && !backgroundXZ.Valid())\r
235           ShowBackgroundDialogPG(1);\r
236   else\r
237           g_FuncTable.m_pfnSysUpdateWindows(W_XY);\r
238 }\r
239 \r
240 void DoBkgrndToggleYZ()\r
241 {\r
242   Sys_Printf (MSG_PREFIX "DoBkgrndToggleYZ\n"); \r
243   backgroundYZ.m_bActive = (backgroundYZ.m_bActive) ? false:true;\r
244   if(backgroundYZ.m_bActive && !backgroundYZ.Valid())\r
245           ShowBackgroundDialogPG(2);\r
246   else\r
247           g_FuncTable.m_pfnSysUpdateWindows(W_XY);\r
248 }\r
249 \r
250 // =============================================================================\r
251 // SYNAPSE\r
252 \r
253 CSynapseServer* g_pSynapseServer = NULL;\r
254 CSynapseClientBkgrnd2d g_SynapseClient;\r
255     \r
256 extern "C" CSynapseClient* SYNAPSE_DLL_EXPORT Synapse_EnumerateInterfaces (const char *version, CSynapseServer *pServer)\r
257 {\r
258   if (strcmp(version, SYNAPSE_VERSION))\r
259   {\r
260     Syn_Printf("ERROR: synapse API version mismatch: should be '" SYNAPSE_VERSION "', got '%s'\n", version);\r
261     return NULL;\r
262   }\r
263   g_pSynapseServer = pServer;\r
264   g_pSynapseServer->IncRef();\r
265   Set_Syn_Printf(g_pSynapseServer->Get_Syn_Printf());\r
266 \r
267   g_SynapseClient.AddAPI(TOOLBAR_MAJOR, BKGRND2D_MINOR, sizeof(_QERPlugToolbarTable));\r
268   g_SynapseClient.AddAPI(PLUGIN_MAJOR, BKGRND2D_MINOR, sizeof( _QERPluginTable ) );\r
269 \r
270   g_SynapseClient.AddAPI( RADIANT_MAJOR, NULL, sizeof( g_FuncTable ), SYN_REQUIRE, &g_FuncTable );\r
271   g_SynapseClient.AddAPI( QGL_MAJOR, NULL, sizeof( g_QglTable ), SYN_REQUIRE, &g_QglTable );\r
272 // TODO is this the right way to ask for 'whichever VFS we have loaded' ? Seems to work\r
273 // for misc filename functions\r
274   g_SynapseClient.AddAPI( VFS_MAJOR, "*", sizeof( g_FileSystemTable ), SYN_REQUIRE, &g_FileSystemTable );\r
275 // get worldspawn\r
276   g_SynapseClient.AddAPI( ENTITY_MAJOR, NULL, sizeof( g_EntityTable ), SYN_REQUIRE, &g_EntityTable );\r
277 // selected brushes\r
278   g_SynapseClient.AddAPI( DATA_MAJOR, NULL, sizeof( g_DataTable ), SYN_REQUIRE, &g_DataTable );\r
279 \r
280   return &g_SynapseClient;\r
281 }\r
282 \r
283 bool CSynapseClientBkgrnd2d::RequestAPI(APIDescriptor_t *pAPI)\r
284 {\r
285   if (!strcmp(pAPI->major_name, PLUGIN_MAJOR))\r
286   {\r
287     _QERPluginTable* pTable= static_cast<_QERPluginTable*>(pAPI->mpTable);\r
288 \r
289     pTable->m_pfnQERPlug_Init = QERPlug_Init;\r
290     pTable->m_pfnQERPlug_GetName = QERPlug_GetName;\r
291     pTable->m_pfnQERPlug_GetCommandList = QERPlug_GetCommandList;\r
292     pTable->m_pfnQERPlug_Dispatch = QERPlug_Dispatch;\r
293     return true;\r
294   }\r
295   if (!strcmp(pAPI->major_name, TOOLBAR_MAJOR))\r
296   {\r
297     _QERPlugToolbarTable* pTable= static_cast<_QERPlugToolbarTable*>(pAPI->mpTable);\r
298 \r
299     pTable->m_pfnToolbarButtonCount = &ToolbarButtonCount;\r
300     pTable->m_pfnGetToolbarButton = &GetToolbarButton;\r
301     return true;\r
302   }\r
303 \r
304   Syn_Printf("ERROR: RequestAPI( '%s' ) not found in '%s'\n", pAPI->major_name, GetInfo());\r
305   return false;\r
306 }\r
307 \r
308 #include "version.h"\r
309 \r
310 const char* CSynapseClientBkgrnd2d::GetInfo()\r
311 {\r
312   return "2d Background plugin built " __DATE__ " " RADIANT_VERSION;\r
313 }\r
314 \r
315 const char* CSynapseClientBkgrnd2d::GetName()\r
316 {\r
317   return "bkgrnd2d";\r
318 }\r
319 \r