]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - plugins/surface_quake2/surfacedialog.cpp
transfer from internal tree r5311 branches/1.4-gpl
[xonotic/netradiant.git] / plugins / surface_quake2 / surfacedialog.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 // Surface Dialog Module\r
24 //\r
25 \r
26 //\r
27 // Nurail: Implemented to Module from the main Radiant Surface Dialog code\r
28 //\r
29 \r
30 \r
31 #include <gtk/gtk.h>\r
32 #include <gdk/gdkkeysyms.h>\r
33 \r
34 #include "surfdlg_plugin.h"\r
35 \r
36 \r
37 \r
38 #ifdef _DEBUG\r
39 //#define DBG_SI 1\r
40 #endif\r
41 \r
42 #include "gtkr_vector.h"\r
43 \r
44 std::vector<texdef_to_face_t> g_texdef_face_vector;\r
45 \r
46 inline texdef_to_face_t* get_texdef_face_list()\r
47 {\r
48   return &(*g_texdef_face_vector.begin());\r
49 }\r
50 \r
51 inline unsigned int texdef_face_list_empty()\r
52 {\r
53   return g_texdef_face_vector.empty();\r
54 }\r
55 \r
56 inline unsigned int texdef_face_list_size()\r
57 {\r
58   return g_texdef_face_vector.size();\r
59 }\r
60 \r
61 // For different faces having different values\r
62 bool is_HShift_conflicting;\r
63 bool is_VShift_conflicting;\r
64 bool is_HScale_conflicting;\r
65 bool is_VScale_conflicting;\r
66 bool is_Rotate_conflicting;\r
67 bool is_TextureName_conflicting;\r
68 \r
69 void ShowDlg();\r
70 void HideDlg();\r
71 void SetTexMods();\r
72 void GetTexMods(bool b_SetUndoPoint = FALSE);\r
73 void BuildDialog();\r
74 void FitAll();\r
75 void InitDefaultIncrement(texdef_t *);\r
76 void DoSnapTToGrid(float hscale, float vscale);\r
77 // called to perform a fitting from the outside (shortcut key)\r
78 void SurfaceDialogFitAll();\r
79 \r
80 // Quake2 Flags Functions\r
81 void SetFlagButtons_Quake2(texdef_to_face_t *texdef_face_list,  bool b_isListEmpty);\r
82 void SetChangeInFlags_Face_Quake2 (texdef_to_face_t *texdef_face_list);\r
83 GtkWidget* Create_Quake2FlagsDialog (GtkWidget* surfacedialog_widget);\r
84 \r
85 \r
86 // Dialog Data\r
87 int m_nHeight;\r
88 int m_nWidth;\r
89 \r
90 // 0 is invalid, otherwise it's the Id of the last 'do' we are responsible for\r
91 int m_nUndoId;\r
92 \r
93 \r
94 texturewin_t *texturewin;\r
95 texdef_t *l_pIncrement;\r
96 texdef_t texdef_offset;\r
97 texdef_t texdef_SI_values;\r
98 \r
99 // For Texture Entry, activate only on entry change\r
100 char old_texture_entry[128];\r
101 \r
102 // the texdef to switch back to when the OnCancel is called\r
103 texdef_t        g_old_texdef;\r
104 \r
105 // when TRUE, this thing means the surface inspector is currently being displayed\r
106 bool  g_surfwin = FALSE;\r
107 // turn on/off processing of the "changed" "value_changed" messages\r
108 // (need to turn off when we are feeding data in)\r
109 bool g_bListenChanged = true;\r
110 // turn on/off listening of the update messages\r
111 bool g_bListenUpdate = true;\r
112 \r
113 GtkWidget* create_SurfaceInspector (void);\r
114 GtkWidget *SurfaceInspector = NULL;\r
115 \r
116 GtkWidget *m_pWidget;\r
117 GtkWidget *GetWidget () { return SurfaceInspector; }\r
118 GtkWidget *Get_SI_Module_Widget () { return SurfaceInspector; }\r
119 void SetWidget(GtkWidget *new_widget) { m_pWidget = new_widget; }\r
120 GtkWidget *GetDlgWidget (const char* name)\r
121   { return GTK_WIDGET (g_object_get_data (G_OBJECT (SurfaceInspector), name)); }\r
122 \r
123 // Spins for FitTexture\r
124 GtkWidget *spin_width;\r
125 GtkWidget *spin_height;\r
126 \r
127 \r
128 GtkWidget *texture_combo;\r
129 GtkWidget *texture_combo_entry;\r
130 \r
131 GtkWidget *match_grid_button;\r
132 GtkWidget *lock_valuechange_togglebutton;\r
133 \r
134 GtkObject *hshift_value_spinbutton_adj;\r
135 GtkWidget *hshift_value_spinbutton;\r
136 GtkObject *vshift_value_spinbutton_adj;\r
137 GtkWidget *vshift_value_spinbutton;\r
138 GtkObject *hscale_value_spinbutton_adj;\r
139 GtkWidget *hscale_value_spinbutton;\r
140 GtkObject *vscale_value_spinbutton_adj;\r
141 GtkWidget *vscale_value_spinbutton;\r
142 GtkObject *rotate_value_spinbutton_adj;\r
143 GtkWidget *rotate_value_spinbutton;\r
144 \r
145 GtkObject *hshift_offset_spinbutton_adj;\r
146 GtkWidget *hshift_offset_spinbutton;\r
147 GtkObject *vshift_offset_spinbutton_adj;\r
148 GtkWidget *vshift_offset_spinbutton;\r
149 GtkObject *hscale_offset_spinbutton_adj;\r
150 GtkWidget *hscale_offset_spinbutton;\r
151 GtkObject *vscale_offset_spinbutton_adj;\r
152 GtkWidget *vscale_offset_spinbutton;\r
153 GtkObject *rotate_offset_spinbutton_adj;\r
154 GtkWidget *rotate_offset_spinbutton;\r
155 \r
156 GtkObject *hshift_step_spinbutton_adj;\r
157 GtkWidget *hshift_step_spinbutton;\r
158 GtkObject *vshift_step_spinbutton_adj;\r
159 GtkWidget *vshift_step_spinbutton;\r
160 GtkObject *hscale_step_spinbutton_adj;\r
161 GtkWidget *hscale_step_spinbutton;\r
162 GtkObject *vscale_step_spinbutton_adj;\r
163 GtkWidget *vscale_step_spinbutton;\r
164 GtkObject *rotate_step_spinbutton_adj;\r
165 GtkWidget *rotate_step_spinbutton;\r
166 \r
167 GtkObject *fit_width_spinbutton_adj;\r
168 GtkWidget *fit_width_spinbutton;\r
169 GtkObject *fit_height_spinbutton_adj;\r
170 GtkWidget *fit_height_spinbutton;\r
171 GtkWidget *fit_button;\r
172 GtkWidget *axial_button;\r
173 \r
174 GtkWidget *done_button;\r
175 GtkWidget *apply_button;\r
176 GtkWidget *cancel_button;\r
177 \r
178 // Callbacks\r
179 gboolean on_texture_combo_entry_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data);\r
180 void on_texture_combo_entry_activate (GtkEntry *entry, gpointer user_data);\r
181 \r
182 static void on_match_grid_button_clicked (GtkButton *button, gpointer user_data);\r
183 static void on_lock_valuechange_togglebutton_toggled (GtkToggleButton *togglebutton, gpointer user_data);\r
184 \r
185 static void on_hshift_value_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
186 static void on_vshift_value_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
187 static void on_hscale_value_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
188 static void on_vscale_value_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
189 static void on_rotate_value_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
190 \r
191 static void on_hshift_offset_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
192 static void on_vshift_offset_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
193 static void on_hscale_offset_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
194 static void on_vscale_offset_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
195 static void on_rotate_offset_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
196 \r
197 static void on_hshift_step_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
198 static void on_vshift_step_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
199 static void on_hscale_step_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
200 static void on_vscale_step_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
201 static void on_rotate_step_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
202 \r
203 static void on_fit_width_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
204 static void on_fit_height_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data);\r
205 static void on_fit_button_clicked (GtkButton *button, gpointer user_data);\r
206 static void on_axial_button_clicked (GtkButton *button, gpointer user_data);\r
207 \r
208 static void on_done_button_clicked (GtkButton *button, gpointer user_data);\r
209 static void on_apply_button_clicked (GtkButton *button, gpointer user_data);\r
210 static void on_cancel_button_clicked (GtkButton *button, gpointer user_data);\r
211 \r
212 \r
213 /*\r
214 ===================================================\r
215 \r
216   SURFACE INSPECTOR\r
217 \r
218 ===================================================\r
219 */\r
220 \r
221 \r
222 void IsFaceConflicting()\r
223 {\r
224   texdef_t* tmp_texdef;\r
225   texdef_to_face_t* temp_texdef_face_list;\r
226   char buf[12];\r
227   char texture_name[128];\r
228 \r
229   if (texdef_face_list_empty())\r
230   {\r
231     gtk_entry_set_text( GTK_ENTRY (hshift_value_spinbutton), "");\r
232     gtk_entry_set_text( GTK_ENTRY (vshift_value_spinbutton), "");\r
233     gtk_entry_set_text( GTK_ENTRY (hscale_value_spinbutton), "");\r
234     gtk_entry_set_text( GTK_ENTRY (vscale_value_spinbutton), "");\r
235     gtk_entry_set_text( GTK_ENTRY (rotate_value_spinbutton), "");\r
236     gtk_entry_set_text( GTK_ENTRY (texture_combo_entry), "");\r
237     return;\r
238   }\r
239 \r
240   g_bListenChanged = FALSE;\r
241 \r
242   tmp_texdef = &get_texdef_face_list()->texdef;\r
243 \r
244   strcpy(texture_name, tmp_texdef->GetName() );\r
245 \r
246   texdef_SI_values.shift[0] = tmp_texdef->shift[0];\r
247   texdef_SI_values.shift[1] = tmp_texdef->shift[1];\r
248   texdef_SI_values.scale[0] = tmp_texdef->scale[0];\r
249   texdef_SI_values.scale[1] = tmp_texdef->scale[1];\r
250   texdef_SI_values.rotate = tmp_texdef->rotate;\r
251   texdef_SI_values.SetName( texture_name );\r
252 \r
253   is_HShift_conflicting = FALSE;\r
254   is_VShift_conflicting = FALSE;\r
255   is_HScale_conflicting = FALSE;\r
256   is_VScale_conflicting = FALSE;\r
257   is_Rotate_conflicting = FALSE;\r
258   is_TextureName_conflicting = FALSE;\r
259 \r
260   if (texdef_face_list_size() > 1)\r
261   {\r
262     temp_texdef_face_list = get_texdef_face_list()->next;\r
263 \r
264     for (temp_texdef_face_list; temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
265     {\r
266       tmp_texdef = &temp_texdef_face_list->texdef;\r
267       if ( texdef_SI_values.shift[0] != tmp_texdef->shift[0] )\r
268         is_HShift_conflicting = TRUE;\r
269 \r
270       if ( texdef_SI_values.shift[1] != tmp_texdef->shift[1] )\r
271         is_VShift_conflicting = TRUE;\r
272 \r
273       if ( texdef_SI_values.scale[0] != tmp_texdef->scale[0] )\r
274         is_HScale_conflicting = TRUE;\r
275 \r
276       if ( texdef_SI_values.scale[1] != tmp_texdef->scale[1] )\r
277         is_VScale_conflicting = TRUE;\r
278 \r
279       if ( texdef_SI_values.rotate != tmp_texdef->rotate )\r
280         is_Rotate_conflicting = TRUE;\r
281 \r
282       if ( strcmp( texture_name, tmp_texdef->GetName() ) )\r
283         is_TextureName_conflicting = TRUE;\r
284     }\r
285   }\r
286 \r
287   if(is_HShift_conflicting)\r
288     gtk_entry_set_text( GTK_ENTRY (hshift_value_spinbutton), "");\r
289   else\r
290     gtk_spin_button_set_value( GTK_SPIN_BUTTON(hshift_value_spinbutton) , texdef_SI_values.shift[0] );\r
291 \r
292   if(is_VShift_conflicting)\r
293     gtk_entry_set_text( GTK_ENTRY (vshift_value_spinbutton), "");\r
294   else\r
295     gtk_spin_button_set_value( GTK_SPIN_BUTTON(vshift_value_spinbutton) , texdef_SI_values.shift[1] );\r
296 \r
297   if(is_HScale_conflicting)\r
298     gtk_entry_set_text( GTK_ENTRY (hscale_value_spinbutton), "");\r
299   else\r
300     gtk_spin_button_set_value( GTK_SPIN_BUTTON(hscale_value_spinbutton) , texdef_SI_values.scale[0] );\r
301 \r
302   if(is_VScale_conflicting)\r
303     gtk_entry_set_text( GTK_ENTRY (vscale_value_spinbutton), "");\r
304   else\r
305     gtk_spin_button_set_value( GTK_SPIN_BUTTON(vscale_value_spinbutton) , texdef_SI_values.scale[1] );\r
306 \r
307   if(is_Rotate_conflicting)\r
308     gtk_entry_set_text( GTK_ENTRY (rotate_value_spinbutton), "");\r
309   else\r
310     gtk_spin_button_set_value( GTK_SPIN_BUTTON(rotate_value_spinbutton) , texdef_SI_values.rotate );\r
311 \r
312   g_bListenChanged = TRUE;\r
313 }\r
314 \r
315 #define MAX_NUM_LIST_ITEMS 15\r
316 static void PopulateTextureComboList()\r
317 {\r
318   texdef_t* tmp_texdef;\r
319   texdef_to_face_t* temp_texdef_face_list;\r
320   char blank[1];\r
321   GList *items = NULL;\r
322   GList *tmp_item;\r
323   int num_of_list_items = 0;\r
324 \r
325   blank[0] = 0;\r
326   \r
327   if (texdef_face_list_empty())\r
328   {\r
329     items = g_list_append (items, (gpointer) blank);\r
330     // For Texture Entry, activate only on entry change\r
331     strcpy (old_texture_entry, blank);\r
332   }\r
333   else if ( !is_TextureName_conflicting )\r
334   {\r
335     temp_texdef_face_list = get_texdef_face_list(); \r
336     tmp_texdef = (texdef_t *) &get_texdef_face_list()->texdef;\r
337     items = g_list_append( items, (gpointer) tmp_texdef->GetName() );\r
338     // For Texture Entry, activate only on entry change\r
339     strcpy (old_texture_entry, tmp_texdef->GetName());\r
340   }\r
341   else\r
342   {\r
343     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
344     {\r
345       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
346       // Need to do a string compare, hence the custom search\r
347       if (!( g_list_find_custom (items, tmp_texdef->GetName(), (GCompareFunc) strcmp ) ))\r
348       {\r
349         items = g_list_append( items, (gpointer) tmp_texdef->GetName() );\r
350         num_of_list_items++;\r
351       }\r
352       // Make sure the combo list isn't too long\r
353       if (num_of_list_items >= MAX_NUM_LIST_ITEMS)\r
354         break;\r
355     }\r
356     // If this isn't added last (to the top of the list), g_list_find freaks.\r
357     items = g_list_prepend (items, (gpointer) blank);\r
358     // For Texture Entry, activate only on entry change\r
359     strcpy (old_texture_entry, blank);\r
360   }\r
361   \r
362   gtk_combo_set_popdown_strings (GTK_COMBO (texture_combo), items);\r
363   g_list_free(items);\r
364 \r
365 }\r
366 \r
367 static void ZeroOffsetValues()\r
368 {\r
369   texdef_offset.shift[0] = 0.0;\r
370   texdef_offset.shift[1] = 0.0;\r
371   texdef_offset.scale[0] = 0.0;\r
372   texdef_offset.scale[1] = 0.0;\r
373   texdef_offset.rotate = 0.0;\r
374 }\r
375 \r
376 static void GetTexdefInfo_from_Radiant()\r
377 {\r
378   g_texdef_face_vector.clear();\r
379 \r
380   unsigned int count = GetSelectedFaceCountfromBrushes();\r
381   if(count == 0)\r
382     count = GetSelectedFaceCount();\r
383     \r
384   g_texdef_face_vector.resize(count);\r
385 \r
386   if (!texdef_face_list_empty())\r
387   {\r
388     texdef_to_face_t* p = get_texdef_face_list();\r
389     GetSelFacesTexdef( get_texdef_face_list() );\r
390   }\r
391   \r
392   IsFaceConflicting();\r
393   PopulateTextureComboList(); \r
394   ZeroOffsetValues();\r
395   if ( texdef_face_list_empty() )\r
396     SetFlagButtons_Quake2( get_texdef_face_list() , TRUE);\r
397   else\r
398     SetFlagButtons_Quake2( get_texdef_face_list() , FALSE);\r
399 }\r
400 \r
401 static gint delete_event_callback(GtkWidget *widget, GdkEvent* event, gpointer data)\r
402 {\r
403   HideDlg();\r
404   return TRUE;\r
405 }\r
406 \r
407 // make the shift increments match the grid settings\r
408 // the objective being that the shift+arrows shortcuts move the texture by the corresponding grid size\r
409 // this depends on a scale value if you have selected a particular texture on which you want it to work:\r
410 // we move the textures in pixels, not world units. (i.e. increment values are in pixel)\r
411 // depending on the texture scale it doesn't take the same amount of pixels to move of g_qeglobals.d_gridsize\r
412 // increment * scale = gridsize\r
413 // hscale and vscale are optional parameters, if they are zero they will be set to the default scale\r
414 // NOTE: the default scale depends if you are using BP mode or regular.\r
415 // For regular it's 0.5f (128 pixels cover 64 world units), for BP it's simply 1.0f\r
416 // see fenris #2810\r
417 void DoSnapTToGrid(float hscale, float vscale)\r
418 {\r
419   l_pIncrement = Get_SI_Inc();\r
420 \r
421   if (hscale == 0.0f)\r
422   {\r
423     hscale = 0.5f;\r
424   }\r
425   if (vscale == 0.0f)\r
426   {\r
427      vscale = 0.5f;\r
428   }\r
429 #ifdef _DEBUG\r
430   Sys_Printf ("DoSnapTToGrid: hscale %g vscale %g\n", hscale, vscale);\r
431 #endif\r
432   l_pIncrement->shift[0] = GridSize() / hscale;\r
433   l_pIncrement->shift[1] = GridSize() / vscale;\r
434   // now some update work\r
435   // FIXME: doesn't look good here, seems to be called several times\r
436   SetTexMods();\r
437 }\r
438 \r
439 void UpdateSurfaceDialog()\r
440 {\r
441   if (!g_bListenUpdate)\r
442     return;\r
443     \r
444   if (!SurfaceInspector)\r
445     return;\r
446 \r
447   // avoid long delays on slow computers\r
448   while (gtk_events_pending ())\r
449     gtk_main_iteration ();\r
450     \r
451   if (g_surfwin)\r
452   {\r
453 #ifdef DBG_SI\r
454     Sys_Printf("UpdateSurfaceDialog\n");\r
455 #endif\r
456     GetTexdefInfo_from_Radiant();\r
457     SetTexMods();\r
458   }\r
459 \r
460 }\r
461 \r
462 // DoSurface will always try to show the surface inspector\r
463 // or update it because something new has been selected\r
464 void DoSurface (void)\r
465 {\r
466 #ifdef DBG_SI\r
467   Sys_Printf("DoSurface\n");\r
468 #endif\r
469   if (!SurfaceInspector)\r
470     create_SurfaceInspector ();\r
471   \r
472   ShowDlg();\r
473   SetTexMods ();\r
474 }\r
475 \r
476 void ToggleSurface()\r
477 {\r
478 #ifdef DBG_SI\r
479   Sys_Printf("ToggleSurface Module\n");\r
480 #endif\r
481   if (!g_surfwin)\r
482     DoSurface ();\r
483   else\r
484     on_cancel_button_clicked(NULL, NULL);\r
485 }\r
486 \r
487 // NOTE: will raise and show the Surface inspector and exec fit for patches and brushes\r
488 void SurfaceDlgFitAll()\r
489 {\r
490   DoSurface();\r
491   FitAll();\r
492 }\r
493 \r
494 // =============================================================================\r
495 // SurfaceDialog class\r
496 \r
497 void ShowDlg()\r
498 {\r
499 \r
500   if(!SurfaceInspector)\r
501     create_SurfaceInspector();\r
502   else\r
503     gtk_widget_show (SurfaceInspector);\r
504 \r
505   GetTexdefInfo_from_Radiant();\r
506   GetTexMods(TRUE); // Set Initial Undo Point\r
507   g_surfwin = TRUE;\r
508 }\r
509 \r
510 void HideDlg()\r
511 {\r
512   g_surfwin = FALSE;\r
513   gtk_widget_hide (SurfaceInspector);\r
514 }\r
515 \r
516 \r
517 // set default values for increments (shift scale and rot)\r
518 // this is called by the prefs code if can't find the values\r
519 void InitDefaultIncrement(texdef_t *tex)\r
520 {\r
521   tex->SetName("foo");\r
522   tex->shift[0] = 8;\r
523   tex->shift[1] = 8;\r
524   tex->scale[0] = 0.25;\r
525   tex->scale[1] = 0.25;\r
526   tex->rotate = 10;\r
527 }\r
528 \r
529 void BuildDialog ()\r
530 {\r
531    if ( !SurfaceInspector )\r
532     create_SurfaceInspector();\r
533 }\r
534 \r
535 /*\r
536 ==============\r
537 SetTexMods\r
538 \r
539 Set the fields to the current texdef (i.e. map/texdef -> dialog widgets)\r
540 ===============\r
541 */\r
542 \r
543 void SetTexMods()\r
544 {\r
545   texdef_t *pt;\r
546   GtkSpinButton *spin;\r
547   GtkAdjustment *adjust;\r
548 \r
549   texturewin = Texturewin ();\r
550   l_pIncrement = Get_SI_Inc();\r
551 \r
552 #ifdef DBG_SI\r
553   Sys_Printf("SurfaceDlg SetTexMods\n");\r
554 #endif\r
555 \r
556   if (!g_surfwin)\r
557     return;\r
558     \r
559   pt = &texturewin->texdef;\r
560 \r
561   g_bListenChanged = false;\r
562 \r
563   if(strncmp(pt->GetName(), "textures/", 9) != 0)\r
564     texdef_offset.SetName(SHADER_NOT_FOUND);\r
565 \r
566  \r
567   spin = GTK_SPIN_BUTTON (hshift_offset_spinbutton);\r
568   gtk_spin_button_set_value (spin, texdef_offset.shift[0]);\r
569   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
570   adjust->step_increment = l_pIncrement->shift[0];\r
571   gtk_spin_button_set_value (GTK_SPIN_BUTTON(hshift_step_spinbutton), l_pIncrement->shift[0]);\r
572   \r
573   spin = GTK_SPIN_BUTTON (hshift_value_spinbutton);\r
574   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
575   adjust->step_increment = l_pIncrement->shift[0];\r
576   \r
577 \r
578   spin = GTK_SPIN_BUTTON (vshift_offset_spinbutton);\r
579   gtk_spin_button_set_value (spin, texdef_offset.shift[1]);\r
580   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
581   adjust->step_increment = l_pIncrement->shift[1];\r
582   gtk_spin_button_set_value (GTK_SPIN_BUTTON(vshift_step_spinbutton), l_pIncrement->shift[1]);\r
583   \r
584   spin = GTK_SPIN_BUTTON (vshift_value_spinbutton);\r
585   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
586   adjust->step_increment = l_pIncrement->shift[1];\r
587 \r
588 \r
589   spin = GTK_SPIN_BUTTON (hscale_offset_spinbutton);\r
590   gtk_spin_button_set_value (spin, texdef_offset.scale[0]);\r
591   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
592   adjust->step_increment = l_pIncrement->scale[0];\r
593   gtk_spin_button_set_value (GTK_SPIN_BUTTON(hscale_step_spinbutton), l_pIncrement->scale[0]);\r
594 \r
595   spin = GTK_SPIN_BUTTON (hscale_value_spinbutton);\r
596   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
597   adjust->step_increment = l_pIncrement->scale[0];\r
598 \r
599   \r
600   spin = GTK_SPIN_BUTTON (vscale_offset_spinbutton);\r
601   gtk_spin_button_set_value (spin, texdef_offset.scale[1]);\r
602   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
603   adjust->step_increment = l_pIncrement->scale[1];\r
604   gtk_spin_button_set_value (GTK_SPIN_BUTTON(vscale_step_spinbutton), l_pIncrement->scale[1]);\r
605   \r
606   spin = GTK_SPIN_BUTTON (vscale_value_spinbutton);\r
607   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
608   adjust->step_increment = l_pIncrement->scale[1];\r
609   \r
610 \r
611   spin = GTK_SPIN_BUTTON (rotate_offset_spinbutton);\r
612   gtk_spin_button_set_value (spin, texdef_offset.rotate);\r
613   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
614   adjust->step_increment = l_pIncrement->rotate;\r
615   gtk_spin_button_set_value (GTK_SPIN_BUTTON(rotate_step_spinbutton), l_pIncrement->rotate);\r
616   \r
617   spin = GTK_SPIN_BUTTON (rotate_value_spinbutton);\r
618   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin));\r
619   adjust->step_increment = l_pIncrement->rotate;\r
620 \r
621 \r
622   g_bListenChanged = true;\r
623 \r
624   // store the current texdef as our escape route if user hits OnCancel\r
625   g_old_texdef = texturewin->texdef;\r
626 }\r
627 \r
628 /*\r
629 ==============\r
630 GetTexMods\r
631 \r
632 Shows any changes to the main Radiant windows\r
633 ===============\r
634 */\r
635 void GetTexMods(bool b_SetUndoPoint)\r
636 {\r
637 \r
638 #ifdef DBG_SI\r
639   Sys_Printf("SurfaceDlg GetTexMods\n");\r
640 #endif\r
641 \r
642   if ( !texdef_face_list_empty() )\r
643   {\r
644     g_bListenUpdate=FALSE;\r
645     SetChangeInFlags_Face_Quake2 ( get_texdef_face_list() );\r
646     SetTexdef_FaceList( get_texdef_face_list(), b_SetUndoPoint );\r
647     g_bListenUpdate=TRUE;\r
648 \r
649     if (b_SetUndoPoint)\r
650       m_nUndoId = Undo_GetUndoId();\r
651   }\r
652 }\r
653 \r
654 void FitAll()\r
655 {\r
656   on_fit_button_clicked(NULL, NULL);\r
657 }\r
658 \r
659 \r
660 ////////////////////////////////////////////////////////////////////\r
661 //\r
662 //  GUI Section\r
663 //\r
664 ////////////////////////////////////////////////////////////////////\r
665 \r
666 GtkWidget* create_SurfaceInspector (void)\r
667 {\r
668   \r
669   GtkWidget *label;\r
670   GtkWidget *hseparator;\r
671   GtkWidget *eventbox;\r
672 \r
673   GtkWidget *viewport8;\r
674   GtkWidget *viewport9;\r
675   GtkWidget *viewport2;\r
676   GtkWidget *viewport7;\r
677   GtkWidget *viewport5;\r
678   GtkWidget *viewport6;\r
679   GtkWidget *viewport10;\r
680 \r
681   GtkWidget *table1;\r
682   GtkWidget *table4;\r
683   GtkWidget *table5;\r
684   GtkWidget *table7;\r
685 \r
686   GtkWidget *alignment1;\r
687   GtkWidget *alignment2;\r
688   GtkWidget *alignment3;\r
689 \r
690   GtkWidget *vbox7;\r
691 \r
692   GtkWidget *hbox1;\r
693   GtkWidget *hbox2;\r
694   GtkWidget *hbox3;\r
695   GtkWidget *hbox4;\r
696 \r
697   GtkWidget *image1;\r
698   GtkWidget *image2;\r
699   GtkWidget *image3;\r
700 \r
701   GtkWidget *hbuttonbox1;\r
702 \r
703   SurfaceInspector = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
704   gtk_container_set_border_width (GTK_CONTAINER (SurfaceInspector), 4);\r
705   gtk_window_set_title (GTK_WINDOW (SurfaceInspector), "Surface Inspector");\r
706   \r
707   SetWinPos_from_Prefs(SurfaceInspector);\r
708 \r
709   viewport8 = gtk_viewport_new (NULL, NULL);\r
710   gtk_widget_show (viewport8);\r
711   gtk_container_add (GTK_CONTAINER (SurfaceInspector), viewport8);\r
712   gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport8), GTK_SHADOW_NONE);\r
713 \r
714   vbox7 = gtk_vbox_new (FALSE, 0);\r
715   gtk_widget_show (vbox7);\r
716   gtk_container_add (GTK_CONTAINER (viewport8), vbox7);\r
717 \r
718   viewport9 = gtk_viewport_new (NULL, NULL);\r
719   gtk_widget_show (viewport9);\r
720   gtk_box_pack_start (GTK_BOX (vbox7), viewport9, FALSE, FALSE, 0);\r
721   gtk_container_set_border_width (GTK_CONTAINER (viewport9), 2);\r
722   gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport9), GTK_SHADOW_ETCHED_IN);\r
723 \r
724   hbox1 = gtk_hbox_new (FALSE, 0);\r
725   gtk_widget_show (hbox1);\r
726   gtk_container_add (GTK_CONTAINER (viewport9), hbox1);\r
727   gtk_container_set_border_width (GTK_CONTAINER (hbox1), 4);\r
728 \r
729   label = gtk_label_new ("Texture: ");\r
730   gtk_widget_show (label);\r
731   gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);\r
732   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
733 \r
734   texture_combo = gtk_combo_new ();\r
735   g_object_set_data (G_OBJECT (GTK_COMBO (texture_combo)->popwin),\r
736                      "KeepMeAround", texture_combo);\r
737   gtk_combo_disable_activate ( (GtkCombo*) texture_combo);                   \r
738   gtk_widget_show (texture_combo);\r
739   gtk_box_pack_start (GTK_BOX (hbox1), texture_combo, TRUE, TRUE, 0);\r
740 \r
741   texture_combo_entry = GTK_COMBO (texture_combo)->entry;\r
742   gtk_widget_show (texture_combo_entry);\r
743   gtk_entry_set_max_length (GTK_ENTRY (texture_combo_entry), 128);\r
744 \r
745   viewport2 = gtk_viewport_new (NULL, NULL);\r
746   gtk_widget_show (viewport2);\r
747   gtk_box_pack_start (GTK_BOX (vbox7), viewport2, FALSE, TRUE, 0);\r
748   gtk_container_set_border_width (GTK_CONTAINER (viewport2), 2);\r
749   gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport2), GTK_SHADOW_ETCHED_IN);\r
750 \r
751   table1 = gtk_table_new (13, 4, FALSE);\r
752   gtk_widget_show (table1);\r
753   gtk_container_add (GTK_CONTAINER (viewport2), table1);\r
754 \r
755   hseparator = gtk_hseparator_new ();\r
756   gtk_widget_show (hseparator);\r
757   gtk_table_attach (GTK_TABLE (table1), hseparator, 1, 2, 1, 2,\r
758                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
759                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
760 \r
761   hseparator = gtk_hseparator_new ();\r
762   gtk_widget_show (hseparator);\r
763   gtk_table_attach (GTK_TABLE (table1), hseparator, 2, 3, 1, 2,\r
764                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
765                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
766 \r
767   hseparator = gtk_hseparator_new ();\r
768   gtk_widget_show (hseparator);\r
769   gtk_table_attach (GTK_TABLE (table1), hseparator, 3, 4, 1, 2,\r
770                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
771                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
772 \r
773   hseparator = gtk_hseparator_new ();\r
774   gtk_widget_show (hseparator);\r
775   gtk_table_attach (GTK_TABLE (table1), hseparator, 1, 2, 3, 4,\r
776                     (GtkAttachOptions) (GTK_FILL),\r
777                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
778 \r
779   hseparator = gtk_hseparator_new ();\r
780   gtk_widget_show (hseparator);\r
781   gtk_table_attach (GTK_TABLE (table1), hseparator, 2, 3, 3, 4,\r
782                     (GtkAttachOptions) (GTK_FILL),\r
783                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
784 \r
785   hseparator = gtk_hseparator_new ();\r
786   gtk_widget_show (hseparator);\r
787   gtk_table_attach (GTK_TABLE (table1), hseparator, 3, 4, 3, 4,\r
788                     (GtkAttachOptions) (GTK_FILL),\r
789                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
790 \r
791   hseparator = gtk_hseparator_new ();\r
792   gtk_widget_show (hseparator);\r
793   gtk_table_attach (GTK_TABLE (table1), hseparator, 1, 2, 5, 6,\r
794                     (GtkAttachOptions) (GTK_FILL),\r
795                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
796 \r
797   hseparator = gtk_hseparator_new ();\r
798   gtk_widget_show (hseparator);\r
799   gtk_table_attach (GTK_TABLE (table1), hseparator, 2, 3, 5, 6,\r
800                     (GtkAttachOptions) (GTK_FILL),\r
801                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
802 \r
803   hseparator = gtk_hseparator_new ();\r
804   gtk_widget_show (hseparator);\r
805   gtk_table_attach (GTK_TABLE (table1), hseparator, 3, 4, 5, 6,\r
806                     (GtkAttachOptions) (GTK_FILL),\r
807                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
808 \r
809   hseparator = gtk_hseparator_new ();\r
810   gtk_widget_show (hseparator);\r
811   gtk_table_attach (GTK_TABLE (table1), hseparator, 1, 2, 7, 8,\r
812                     (GtkAttachOptions) (GTK_FILL),\r
813                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
814 \r
815   hseparator = gtk_hseparator_new ();\r
816   gtk_widget_show (hseparator);\r
817   gtk_table_attach (GTK_TABLE (table1), hseparator, 2, 3, 7, 8,\r
818                     (GtkAttachOptions) (GTK_FILL),\r
819                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
820 \r
821   hseparator = gtk_hseparator_new ();\r
822   gtk_widget_show (hseparator);\r
823   gtk_table_attach (GTK_TABLE (table1), hseparator, 3, 4, 7, 8,\r
824                     (GtkAttachOptions) (GTK_FILL),\r
825                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
826 \r
827   hseparator = gtk_hseparator_new ();\r
828   gtk_widget_show (hseparator);\r
829   gtk_table_attach (GTK_TABLE (table1), hseparator, 1, 2, 9, 10,\r
830                     (GtkAttachOptions) (GTK_FILL),\r
831                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
832 \r
833   hseparator = gtk_hseparator_new ();\r
834   gtk_widget_show (hseparator);\r
835   gtk_table_attach (GTK_TABLE (table1), hseparator, 2, 3, 9, 10,\r
836                     (GtkAttachOptions) (GTK_FILL),\r
837                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
838 \r
839   hseparator = gtk_hseparator_new ();\r
840   gtk_widget_show (hseparator);\r
841   gtk_table_attach (GTK_TABLE (table1), hseparator, 3, 4, 9, 10,\r
842                     (GtkAttachOptions) (GTK_FILL),\r
843                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
844 \r
845   hseparator = gtk_hseparator_new ();\r
846   gtk_widget_show (hseparator);\r
847   gtk_table_attach (GTK_TABLE (table1), hseparator, 1, 2, 11, 12,\r
848                     (GtkAttachOptions) (GTK_FILL),\r
849                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
850 \r
851   hseparator = gtk_hseparator_new ();\r
852   gtk_widget_show (hseparator);\r
853   gtk_table_attach (GTK_TABLE (table1), hseparator, 2, 3, 11, 12,\r
854                     (GtkAttachOptions) (GTK_FILL),\r
855                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
856 \r
857   hseparator = gtk_hseparator_new ();\r
858   gtk_widget_show (hseparator);\r
859   gtk_table_attach (GTK_TABLE (table1), hseparator, 3, 4, 11, 12,\r
860                     (GtkAttachOptions) (GTK_FILL),\r
861                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
862 \r
863   label = gtk_label_new ("Offset");\r
864   gtk_widget_show (label);\r
865   gtk_table_attach (GTK_TABLE (table1), label, 2, 3, 0, 1,\r
866                     (GtkAttachOptions) (GTK_FILL),\r
867                     (GtkAttachOptions) (0), 0, 0);\r
868 \r
869   label = gtk_label_new ("Step");\r
870   gtk_widget_show (label);\r
871   gtk_table_attach (GTK_TABLE (table1), label, 3, 4, 0, 1,\r
872                     (GtkAttachOptions) (GTK_FILL),\r
873                     (GtkAttachOptions) (0), 0, 0);\r
874 \r
875   eventbox = gtk_event_box_new ();\r
876   gtk_widget_show (eventbox);\r
877   gtk_table_attach (GTK_TABLE (table1), eventbox, 3, 4, 12, 13,\r
878                     (GtkAttachOptions) (GTK_FILL),\r
879                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
880 \r
881   match_grid_button = gtk_button_new_with_mnemonic ("Match Grid");\r
882   gtk_widget_show (match_grid_button);\r
883   gtk_container_add (GTK_CONTAINER (eventbox), match_grid_button);\r
884 \r
885   label = gtk_label_new ("Value");\r
886   gtk_widget_show (label);\r
887   gtk_table_attach (GTK_TABLE (table1), label, 1, 2, 0, 1,\r
888                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
889                     (GtkAttachOptions) (0), 0, 0);\r
890   gtk_misc_set_alignment (GTK_MISC (label), 0.5, 1);\r
891 \r
892   hseparator = gtk_hseparator_new ();\r
893   gtk_widget_show (hseparator);\r
894   gtk_table_attach (GTK_TABLE (table1), hseparator, 0, 1, 3, 4,\r
895                     (GtkAttachOptions) (GTK_SHRINK | GTK_FILL),\r
896                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
897 \r
898   hseparator = gtk_hseparator_new ();\r
899   gtk_widget_show (hseparator);\r
900   gtk_table_attach (GTK_TABLE (table1), hseparator, 0, 1, 5, 6,\r
901                     (GtkAttachOptions) (GTK_FILL),\r
902                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
903 \r
904   hseparator = gtk_hseparator_new ();\r
905   gtk_widget_show (hseparator);\r
906   gtk_table_attach (GTK_TABLE (table1), hseparator, 0, 1, 7, 8,\r
907                     (GtkAttachOptions) (GTK_FILL),\r
908                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
909 \r
910   hseparator = gtk_hseparator_new ();\r
911   gtk_widget_show (hseparator);\r
912   gtk_table_attach (GTK_TABLE (table1), hseparator, 0, 1, 9, 10,\r
913                     (GtkAttachOptions) (GTK_FILL),\r
914                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
915 \r
916   hseparator = gtk_hseparator_new ();\r
917   gtk_widget_show (hseparator);\r
918   gtk_table_attach (GTK_TABLE (table1), hseparator, 0, 1, 11, 12,\r
919                     (GtkAttachOptions) (GTK_FILL),\r
920                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
921 \r
922   eventbox = gtk_event_box_new ();\r
923   gtk_widget_show (eventbox);\r
924   gtk_table_attach (GTK_TABLE (table1), eventbox, 0, 1, 4, 5,\r
925                     (GtkAttachOptions) (GTK_FILL),\r
926                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
927 \r
928   label = gtk_label_new ("V Shift: ");\r
929   gtk_widget_show (label);\r
930   gtk_container_add (GTK_CONTAINER (eventbox), label);\r
931   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
932   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
933 \r
934   eventbox = gtk_event_box_new ();\r
935   gtk_widget_show (eventbox);\r
936   gtk_table_attach (GTK_TABLE (table1), eventbox, 0, 1, 6, 7,\r
937                     (GtkAttachOptions) (GTK_FILL),\r
938                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
939 \r
940   label = gtk_label_new (" H Scale: ");\r
941   gtk_widget_show (label);\r
942   gtk_container_add (GTK_CONTAINER (eventbox), label);\r
943   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
944   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
945 \r
946   eventbox = gtk_event_box_new ();\r
947   gtk_widget_show (eventbox);\r
948   gtk_table_attach (GTK_TABLE (table1), eventbox, 0, 1, 8, 9,\r
949                     (GtkAttachOptions) (GTK_FILL),\r
950                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
951 \r
952   label = gtk_label_new ("V Scale: ");\r
953   gtk_widget_show (label);\r
954   gtk_container_add (GTK_CONTAINER (eventbox), label);\r
955   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
956   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
957 \r
958   eventbox = gtk_event_box_new ();\r
959   gtk_widget_show (eventbox);\r
960   gtk_table_attach (GTK_TABLE (table1), eventbox, 0, 1, 10, 11,\r
961                     (GtkAttachOptions) (GTK_FILL),\r
962                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
963 \r
964   label = gtk_label_new ("Rotate: ");\r
965   gtk_widget_show (label);\r
966   gtk_container_add (GTK_CONTAINER (eventbox), label);\r
967   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
968   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
969 \r
970   eventbox = gtk_event_box_new ();\r
971   gtk_widget_show (eventbox);\r
972   gtk_table_attach (GTK_TABLE (table1), eventbox, 0, 1, 2, 3,\r
973                     (GtkAttachOptions) (GTK_FILL),\r
974                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
975 \r
976   label = gtk_label_new ("H Shift: ");\r
977   gtk_widget_show (label);\r
978   gtk_container_add (GTK_CONTAINER (eventbox), label);\r
979   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
980   gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);\r
981 \r
982   hseparator = gtk_hseparator_new ();\r
983   gtk_widget_show (hseparator);\r
984   gtk_table_attach (GTK_TABLE (table1), hseparator, 0, 1, 1, 2,\r
985                     (GtkAttachOptions) (GTK_FILL),\r
986                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
987 \r
988   eventbox = gtk_event_box_new ();\r
989   gtk_widget_show (eventbox);\r
990   gtk_table_attach (GTK_TABLE (table1), eventbox, 1, 2, 12, 13,\r
991                     (GtkAttachOptions) (GTK_FILL),\r
992                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
993 \r
994   lock_valuechange_togglebutton = gtk_toggle_button_new_with_mnemonic ("UNLOCK");\r
995   gtk_widget_show (lock_valuechange_togglebutton);\r
996   gtk_container_add (GTK_CONTAINER (eventbox), lock_valuechange_togglebutton);\r
997 \r
998   // Value Spins\r
999   hshift_value_spinbutton_adj = gtk_adjustment_new (0.0, -8192.0, 8192.0, 2.0, 8.0, 8.0);\r
1000   hshift_value_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (hshift_value_spinbutton_adj), 1, 2);\r
1001   gtk_widget_show (hshift_value_spinbutton);\r
1002   gtk_table_attach (GTK_TABLE (table1), hshift_value_spinbutton, 1, 2, 2, 3,\r
1003                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1004                     (GtkAttachOptions) (0), 0, 0);\r
1005   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (hshift_value_spinbutton), GTK_UPDATE_IF_VALID);\r
1006   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (hshift_value_spinbutton), TRUE);\r
1007   gtk_widget_set_sensitive( GTK_WIDGET( hshift_value_spinbutton ), FALSE );\r
1008 \r
1009   vshift_value_spinbutton_adj = gtk_adjustment_new (0.0, -8192.0, 8192.0, 2.0, 8.0, 8.0);\r
1010   vshift_value_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (vshift_value_spinbutton_adj), 1, 2);\r
1011   gtk_widget_show (vshift_value_spinbutton);\r
1012   gtk_table_attach (GTK_TABLE (table1), vshift_value_spinbutton, 1, 2, 4, 5,\r
1013                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1014                     (GtkAttachOptions) (0), 0, 0);\r
1015   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (vshift_value_spinbutton), GTK_UPDATE_IF_VALID);\r
1016   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (vshift_value_spinbutton), TRUE);\r
1017   gtk_widget_set_sensitive( GTK_WIDGET( vshift_value_spinbutton ), FALSE );\r
1018 \r
1019   hscale_value_spinbutton_adj = gtk_adjustment_new (0.0, -1024.0, 1024.0, 1.0, 4.0, 4.0);\r
1020   hscale_value_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (hscale_value_spinbutton_adj), 1, 4);\r
1021   gtk_widget_show (hscale_value_spinbutton);\r
1022   gtk_table_attach (GTK_TABLE (table1), hscale_value_spinbutton, 1, 2, 6, 7,\r
1023                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1024                     (GtkAttachOptions) (0), 0, 0);\r
1025   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (hscale_value_spinbutton), GTK_UPDATE_IF_VALID);\r
1026   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (hscale_value_spinbutton), TRUE);\r
1027   gtk_widget_set_sensitive( GTK_WIDGET( hscale_value_spinbutton ), FALSE );\r
1028 \r
1029   vscale_value_spinbutton_adj = gtk_adjustment_new (0.0, -1024.0, 1024.0, 1.0, 4.0, 4.0);\r
1030   vscale_value_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (vscale_value_spinbutton_adj), 1, 4);\r
1031   gtk_widget_show (vscale_value_spinbutton);\r
1032   gtk_table_attach (GTK_TABLE (table1), vscale_value_spinbutton, 1, 2, 8, 9,\r
1033                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1034                     (GtkAttachOptions) (0), 0, 0);\r
1035   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (vscale_value_spinbutton), GTK_UPDATE_IF_VALID);\r
1036   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (vscale_value_spinbutton), TRUE);\r
1037   gtk_widget_set_sensitive( GTK_WIDGET( vscale_value_spinbutton ), FALSE );\r
1038   \r
1039   rotate_value_spinbutton_adj = gtk_adjustment_new (0.0, -360.0, 360.0, 1.0, 10.0, 10.0);\r
1040   rotate_value_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (rotate_value_spinbutton_adj), 1, 0);\r
1041   gtk_widget_show (rotate_value_spinbutton);\r
1042   gtk_table_attach (GTK_TABLE (table1), rotate_value_spinbutton, 1, 2, 10, 11,\r
1043                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1044                     (GtkAttachOptions) (0), 0, 0);\r
1045   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (rotate_value_spinbutton), GTK_UPDATE_IF_VALID);\r
1046   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (rotate_value_spinbutton), TRUE);\r
1047   gtk_widget_set_sensitive( GTK_WIDGET( rotate_value_spinbutton ), FALSE );\r
1048 \r
1049   // Offset Spins                  \r
1050   hshift_offset_spinbutton_adj = gtk_adjustment_new (0.0, -8192.0, 8192.0, 2.0, 8.0, 8.0);\r
1051   hshift_offset_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (hshift_offset_spinbutton_adj), 0, 2);\r
1052   gtk_widget_show (hshift_offset_spinbutton);\r
1053   gtk_table_attach (GTK_TABLE (table1), hshift_offset_spinbutton, 2, 3, 2, 3,\r
1054                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1055                     (GtkAttachOptions) (0), 4, 0);\r
1056   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (hshift_offset_spinbutton), TRUE);\r
1057   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (hshift_offset_spinbutton), GTK_UPDATE_IF_VALID);\r
1058   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (hshift_offset_spinbutton), TRUE);\r
1059 \r
1060   vshift_offset_spinbutton_adj = gtk_adjustment_new (0.0, -8192.0, 8192.0, 2.0, 8.0, 8.0);\r
1061   vshift_offset_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (vshift_offset_spinbutton_adj), 0, 2);\r
1062   gtk_widget_show (vshift_offset_spinbutton);\r
1063   gtk_table_attach (GTK_TABLE (table1), vshift_offset_spinbutton, 2, 3, 4, 5,\r
1064                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1065                     (GtkAttachOptions) (0), 4, 0);\r
1066   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (vshift_offset_spinbutton), TRUE);\r
1067   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (vshift_offset_spinbutton), GTK_UPDATE_IF_VALID);\r
1068   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (vshift_offset_spinbutton), TRUE);\r
1069 \r
1070   hscale_offset_spinbutton_adj = gtk_adjustment_new (0.0, -1024.0, 1024.0, 1.0, 4.0, 4.0);\r
1071   hscale_offset_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (hscale_offset_spinbutton_adj), 0, 4);\r
1072   gtk_widget_show (hscale_offset_spinbutton);\r
1073   gtk_table_attach (GTK_TABLE (table1), hscale_offset_spinbutton, 2, 3, 6, 7,\r
1074                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1075                     (GtkAttachOptions) (0), 4, 0);\r
1076   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (hscale_offset_spinbutton), TRUE);\r
1077   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (hscale_offset_spinbutton), GTK_UPDATE_IF_VALID);\r
1078   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (hscale_offset_spinbutton), TRUE);\r
1079 \r
1080   vscale_offset_spinbutton_adj = gtk_adjustment_new (0.0, -1024.0, 1024.0, 1.0, 4.0, 4.0);\r
1081   vscale_offset_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (vscale_offset_spinbutton_adj), 0, 4);\r
1082   gtk_widget_show (vscale_offset_spinbutton);\r
1083   gtk_table_attach (GTK_TABLE (table1), vscale_offset_spinbutton, 2, 3, 8, 9,\r
1084                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1085                     (GtkAttachOptions) (0), 4, 0);\r
1086   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (vscale_offset_spinbutton), TRUE);\r
1087   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (vscale_offset_spinbutton), GTK_UPDATE_IF_VALID);\r
1088   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (vscale_offset_spinbutton), TRUE);\r
1089 \r
1090   rotate_offset_spinbutton_adj = gtk_adjustment_new (0.0, -360.0, 360.0, 1.0, 10.0, 10.0);\r
1091   rotate_offset_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (rotate_offset_spinbutton_adj), 0, 2);\r
1092   gtk_widget_show (rotate_offset_spinbutton);\r
1093   gtk_table_attach (GTK_TABLE (table1), rotate_offset_spinbutton, 2, 3, 10, 11,\r
1094                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1095                     (GtkAttachOptions) (0), 4, 0);\r
1096   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (rotate_offset_spinbutton), TRUE);\r
1097   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (rotate_offset_spinbutton), GTK_UPDATE_IF_VALID);\r
1098   gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (rotate_offset_spinbutton), TRUE);\r
1099 \r
1100     // Step Spins\r
1101   hshift_step_spinbutton_adj = gtk_adjustment_new (0.0, -8192.0, 8192.0, 2.0, 8.0, 8.0);\r
1102   hshift_step_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (hshift_step_spinbutton_adj), 1, 2);\r
1103   gtk_widget_show (hshift_step_spinbutton);\r
1104   gtk_table_attach (GTK_TABLE (table1), hshift_step_spinbutton, 3, 4, 2, 3,\r
1105                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1106                     (GtkAttachOptions) (0), 0, 0);\r
1107   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (hshift_step_spinbutton), GTK_UPDATE_IF_VALID);\r
1108 \r
1109   vshift_step_spinbutton_adj = gtk_adjustment_new (0.0, -8192.0, 8192.0, 2.0, 8.0, 8.0);\r
1110   vshift_step_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (vshift_step_spinbutton_adj), 1, 2);\r
1111   gtk_widget_show (vshift_step_spinbutton);\r
1112   gtk_table_attach (GTK_TABLE (table1), vshift_step_spinbutton, 3, 4, 4, 5,\r
1113                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1114                     (GtkAttachOptions) (0), 0, 0);\r
1115   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (vshift_step_spinbutton), GTK_UPDATE_IF_VALID);\r
1116 \r
1117   hscale_step_spinbutton_adj = gtk_adjustment_new (0.0, -1024.0, 1024.0, 1.0, 4.0, 4.0);\r
1118   hscale_step_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (hscale_step_spinbutton_adj), 1, 4);\r
1119   gtk_widget_show (hscale_step_spinbutton);\r
1120   gtk_table_attach (GTK_TABLE (table1), hscale_step_spinbutton, 3, 4, 6, 7,\r
1121                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1122                     (GtkAttachOptions) (0), 0, 0);\r
1123   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (hscale_step_spinbutton), GTK_UPDATE_IF_VALID);\r
1124 \r
1125   vscale_step_spinbutton_adj = gtk_adjustment_new (0.0, -1024.0, 1024.0, 1.0, 4.0, 4.0);\r
1126   vscale_step_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (vscale_step_spinbutton_adj), 1, 4);\r
1127   gtk_widget_show (vscale_step_spinbutton);\r
1128   gtk_table_attach (GTK_TABLE (table1), vscale_step_spinbutton, 3, 4, 8, 9,\r
1129                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1130                     (GtkAttachOptions) (0), 0, 0);\r
1131   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (vscale_step_spinbutton), GTK_UPDATE_IF_VALID);\r
1132 \r
1133   rotate_step_spinbutton_adj = gtk_adjustment_new (0.0, -360.0, 360.0, 1.0, 10.0, 10.0);\r
1134   rotate_step_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (rotate_step_spinbutton_adj), 1, 2);\r
1135   gtk_widget_show (rotate_step_spinbutton);\r
1136   gtk_table_attach (GTK_TABLE (table1), rotate_step_spinbutton, 3, 4, 10, 11,\r
1137                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1138                     (GtkAttachOptions) (0), 0, 0);\r
1139   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (rotate_step_spinbutton), GTK_UPDATE_IF_VALID);\r
1140 \r
1141   eventbox = gtk_event_box_new ();\r
1142   gtk_widget_show (eventbox);\r
1143   gtk_table_attach (GTK_TABLE (table1), eventbox, 2, 3, 12, 13,\r
1144                     (GtkAttachOptions) (0),\r
1145                     (GtkAttachOptions) (0), 0, 0);\r
1146 \r
1147   eventbox = gtk_event_box_new ();\r
1148   gtk_widget_show (eventbox);\r
1149   gtk_table_attach (GTK_TABLE (table1), eventbox, 0, 1, 12, 13,\r
1150                     (GtkAttachOptions) (0),\r
1151                     (GtkAttachOptions) (0), 0, 0);\r
1152 \r
1153   eventbox = gtk_event_box_new ();\r
1154   gtk_widget_show (eventbox);\r
1155   gtk_table_attach (GTK_TABLE (table1), eventbox, 0, 1, 0, 1,\r
1156                     (GtkAttachOptions) (0),\r
1157                     (GtkAttachOptions) (0), 0, 0);\r
1158 \r
1159   viewport7 = gtk_viewport_new (NULL, NULL);\r
1160   gtk_widget_show (viewport7);\r
1161   gtk_box_pack_start (GTK_BOX (vbox7), viewport7, FALSE, TRUE, 0);\r
1162   gtk_container_set_border_width (GTK_CONTAINER (viewport7), 2);\r
1163   gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport7), GTK_SHADOW_ETCHED_IN);\r
1164 \r
1165   table4 = gtk_table_new (4, 7, FALSE);\r
1166   gtk_widget_show (table4);\r
1167   gtk_container_add (GTK_CONTAINER (viewport7), table4);\r
1168 \r
1169   viewport5 = gtk_viewport_new (NULL, NULL);\r
1170   gtk_widget_show (viewport5);\r
1171   gtk_table_attach (GTK_TABLE (table4), viewport5, 1, 7, 0, 4,\r
1172                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1173                     (GtkAttachOptions) (0), 0, 0);\r
1174   gtk_container_set_border_width (GTK_CONTAINER (viewport5), 6);\r
1175   gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport5), GTK_SHADOW_ETCHED_OUT);\r
1176 \r
1177   table5 = gtk_table_new (2, 3, FALSE);\r
1178   gtk_widget_show (table5);\r
1179   gtk_container_add (GTK_CONTAINER (viewport5), table5);\r
1180   gtk_container_set_border_width (GTK_CONTAINER (table5), 5);\r
1181   gtk_table_set_col_spacings (GTK_TABLE (table5), 2);\r
1182 \r
1183   label = gtk_label_new ("Height");\r
1184   gtk_widget_show (label);\r
1185   gtk_table_attach (GTK_TABLE (table5), label, 2, 3, 0, 1,\r
1186                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1187                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1188   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
1189   gtk_misc_set_alignment (GTK_MISC (label), 0.5, 1);\r
1190 \r
1191   label = gtk_label_new ("Width");\r
1192   gtk_widget_show (label);\r
1193   gtk_table_attach (GTK_TABLE (table5), label, 1, 2, 0, 1,\r
1194                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1195                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1196   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
1197   gtk_misc_set_alignment (GTK_MISC (label), 0.5, 1);\r
1198 \r
1199   fit_width_spinbutton_adj = gtk_adjustment_new (1, 1, 32, 1, 10, 10);\r
1200   fit_width_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (fit_width_spinbutton_adj), 1, 0);\r
1201   gtk_widget_show (fit_width_spinbutton);\r
1202   gtk_table_attach (GTK_TABLE (table5), fit_width_spinbutton, 1, 2, 1, 2,\r
1203                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1204                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1205   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (fit_width_spinbutton), TRUE);\r
1206   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (fit_width_spinbutton), GTK_UPDATE_IF_VALID);\r
1207 \r
1208   fit_height_spinbutton_adj = gtk_adjustment_new (1, 1, 32, 1, 10, 10);\r
1209   fit_height_spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (fit_height_spinbutton_adj), 1, 0);\r
1210   gtk_widget_show (fit_height_spinbutton);\r
1211   gtk_table_attach (GTK_TABLE (table5), fit_height_spinbutton, 2, 3, 1, 2,\r
1212                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1213                     (GtkAttachOptions) (GTK_FILL), 3, 0);\r
1214   gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (fit_height_spinbutton), TRUE);\r
1215   gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (fit_height_spinbutton), GTK_UPDATE_IF_VALID);\r
1216 \r
1217   eventbox = gtk_event_box_new ();\r
1218   gtk_widget_show (eventbox);\r
1219   gtk_table_attach (GTK_TABLE (table5), eventbox, 0, 1, 0, 1,\r
1220                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1221                     (GtkAttachOptions) (GTK_FILL), 0, 0);\r
1222 \r
1223   eventbox = gtk_event_box_new ();\r
1224   gtk_widget_show (eventbox);\r
1225   gtk_table_attach (GTK_TABLE (table5), eventbox, 0, 1, 1, 2,\r
1226                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1227                     (GtkAttachOptions) (GTK_FILL), 4, 0);\r
1228 \r
1229   fit_button = gtk_button_new_with_mnemonic ("    Fit    ");\r
1230   gtk_widget_show (fit_button);\r
1231   gtk_container_add (GTK_CONTAINER (eventbox), fit_button);\r
1232 \r
1233   viewport6 = gtk_viewport_new (NULL, NULL);\r
1234   gtk_widget_show (viewport6);\r
1235   gtk_table_attach (GTK_TABLE (table4), viewport6, 0, 1, 0, 4,\r
1236                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1237                     (GtkAttachOptions) (0), 0, 0);\r
1238   gtk_container_set_border_width (GTK_CONTAINER (viewport6), 4);\r
1239   gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport6), GTK_SHADOW_NONE);\r
1240 \r
1241   table7 = gtk_table_new (2, 1, FALSE);\r
1242   gtk_widget_show (table7);\r
1243   gtk_container_add (GTK_CONTAINER (viewport6), table7);\r
1244 \r
1245   eventbox = gtk_event_box_new ();\r
1246   gtk_widget_show (eventbox);\r
1247   gtk_table_attach (GTK_TABLE (table7), eventbox, 0, 1, 0, 2,\r
1248                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),\r
1249                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);\r
1250 \r
1251   axial_button = gtk_button_new_with_mnemonic ("Axial");\r
1252   gtk_widget_show (axial_button);\r
1253   gtk_container_add (GTK_CONTAINER (eventbox), axial_button);\r
1254   gtk_widget_set_size_request (axial_button, 56, 29);\r
1255   gtk_container_set_border_width (GTK_CONTAINER (axial_button), 4);\r
1256 \r
1257   // Fit in Flags sub-dialog\r
1258   Create_Quake2FlagsDialog(vbox7);\r
1259 \r
1260   viewport10 = gtk_viewport_new (NULL, NULL);\r
1261   gtk_widget_show (viewport10);\r
1262   gtk_box_pack_start (GTK_BOX (vbox7), viewport10, FALSE, TRUE, 0);\r
1263   gtk_container_set_border_width (GTK_CONTAINER (viewport10), 2);\r
1264   gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport10), GTK_SHADOW_ETCHED_IN);\r
1265 \r
1266   hbuttonbox1 = gtk_hbutton_box_new ();\r
1267   gtk_widget_show (hbuttonbox1);\r
1268   gtk_container_add (GTK_CONTAINER (viewport10), hbuttonbox1);\r
1269   gtk_container_set_border_width (GTK_CONTAINER (hbuttonbox1), 4);\r
1270   gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox1), GTK_BUTTONBOX_SPREAD);\r
1271 \r
1272   done_button = gtk_button_new ();\r
1273   gtk_widget_show (done_button);\r
1274   gtk_container_add (GTK_CONTAINER (hbuttonbox1), done_button);\r
1275   GTK_WIDGET_SET_FLAGS (done_button, GTK_CAN_DEFAULT);\r
1276 \r
1277   alignment1 = gtk_alignment_new (0.5, 0.5, 0, 0);\r
1278   gtk_widget_show (alignment1);\r
1279   gtk_container_add (GTK_CONTAINER (done_button), alignment1);\r
1280 \r
1281   hbox2 = gtk_hbox_new (FALSE, 2);\r
1282   gtk_widget_show (hbox2);\r
1283   gtk_container_add (GTK_CONTAINER (alignment1), hbox2);\r
1284 \r
1285   image1 = gtk_image_new_from_stock ("gtk-yes", GTK_ICON_SIZE_BUTTON);\r
1286   gtk_widget_show (image1);\r
1287   gtk_box_pack_start (GTK_BOX (hbox2), image1, FALSE, FALSE, 0);\r
1288 \r
1289   label = gtk_label_new_with_mnemonic ("Done");\r
1290   gtk_widget_show (label);\r
1291   gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, FALSE, 0);\r
1292   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
1293 \r
1294   apply_button = gtk_button_new ();\r
1295   gtk_widget_show (apply_button);\r
1296   gtk_container_add (GTK_CONTAINER (hbuttonbox1), apply_button);\r
1297   GTK_WIDGET_SET_FLAGS (apply_button, GTK_CAN_DEFAULT);\r
1298 \r
1299   alignment3 = gtk_alignment_new (0.5, 0.5, 0, 0);\r
1300   gtk_widget_show (alignment3);\r
1301   gtk_container_add (GTK_CONTAINER (apply_button), alignment3);\r
1302 \r
1303   hbox4 = gtk_hbox_new (FALSE, 2);\r
1304   gtk_widget_show (hbox4);\r
1305   gtk_container_add (GTK_CONTAINER (alignment3), hbox4);\r
1306 \r
1307   image3 = gtk_image_new_from_stock ("gtk-apply", GTK_ICON_SIZE_BUTTON);\r
1308   gtk_widget_show (image3);\r
1309   gtk_box_pack_start (GTK_BOX (hbox4), image3, FALSE, FALSE, 0);\r
1310 \r
1311   label = gtk_label_new_with_mnemonic ("Apply");\r
1312   gtk_widget_show (label);\r
1313   gtk_box_pack_start (GTK_BOX (hbox4), label, FALSE, FALSE, 0);\r
1314   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
1315 \r
1316   cancel_button = gtk_button_new ();\r
1317   gtk_widget_show (cancel_button);\r
1318   gtk_container_add (GTK_CONTAINER (hbuttonbox1), cancel_button);\r
1319   GTK_WIDGET_SET_FLAGS (cancel_button, GTK_CAN_DEFAULT);\r
1320 \r
1321   alignment2 = gtk_alignment_new (0.5, 0.5, 0, 0);\r
1322   gtk_widget_show (alignment2);\r
1323   gtk_container_add (GTK_CONTAINER (cancel_button), alignment2);\r
1324 \r
1325   hbox3 = gtk_hbox_new (FALSE, 2);\r
1326   gtk_widget_show (hbox3);\r
1327   gtk_container_add (GTK_CONTAINER (alignment2), hbox3);\r
1328 \r
1329   image2 = gtk_image_new_from_stock ("gtk-no", GTK_ICON_SIZE_BUTTON);\r
1330   gtk_widget_show (image2);\r
1331   gtk_box_pack_start (GTK_BOX (hbox3), image2, FALSE, FALSE, 0);\r
1332 \r
1333   label = gtk_label_new_with_mnemonic ("Cancel");\r
1334   gtk_widget_show (label);\r
1335   gtk_box_pack_start (GTK_BOX (hbox3), label, FALSE, FALSE, 0);\r
1336   gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);\r
1337 \r
1338 \r
1339   g_signal_connect ( (gpointer) SurfaceInspector, \r
1340                       "delete_event", \r
1341                       G_CALLBACK (delete_event_callback), \r
1342                       NULL );\r
1343   g_signal_connect ((gpointer) SurfaceInspector, "destroy",\r
1344                     G_CALLBACK (gtk_widget_destroy),\r
1345                     NULL);\r
1346   \r
1347   g_signal_connect ((gpointer) texture_combo_entry, "key_press_event",\r
1348                     G_CALLBACK (on_texture_combo_entry_key_press_event),\r
1349                     NULL);\r
1350   g_signal_connect ((gpointer) texture_combo_entry, "activate",\r
1351                     G_CALLBACK (on_texture_combo_entry_activate),\r
1352                     NULL);\r
1353                     \r
1354   \r
1355   g_signal_connect ((gpointer) hshift_offset_spinbutton, "value_changed",\r
1356                     G_CALLBACK (on_hshift_offset_spinbutton_value_changed),\r
1357                     NULL);\r
1358   g_signal_connect ((gpointer) vshift_offset_spinbutton, "value_changed",\r
1359                     G_CALLBACK (on_vshift_offset_spinbutton_value_changed),\r
1360                     NULL);\r
1361   g_signal_connect ((gpointer) hscale_offset_spinbutton, "value_changed",\r
1362                     G_CALLBACK (on_hscale_offset_spinbutton_value_changed),\r
1363                     NULL);\r
1364   g_signal_connect ((gpointer) vscale_offset_spinbutton, "value_changed",\r
1365                     G_CALLBACK (on_vscale_offset_spinbutton_value_changed),\r
1366                     NULL);\r
1367   g_signal_connect ((gpointer) rotate_offset_spinbutton, "value_changed",\r
1368                     G_CALLBACK (on_rotate_offset_spinbutton_value_changed),\r
1369                     NULL);\r
1370   \r
1371   g_signal_connect ((gpointer) hshift_value_spinbutton, "value_changed",\r
1372                     G_CALLBACK (on_hshift_value_spinbutton_value_changed),\r
1373                     NULL);\r
1374   g_signal_connect ((gpointer) vshift_value_spinbutton, "value_changed",\r
1375                     G_CALLBACK (on_vshift_value_spinbutton_value_changed),\r
1376                     NULL);\r
1377   g_signal_connect ((gpointer) hscale_value_spinbutton, "value_changed",\r
1378                     G_CALLBACK (on_hscale_value_spinbutton_value_changed),\r
1379                     NULL);\r
1380   g_signal_connect ((gpointer) vscale_value_spinbutton, "value_changed",\r
1381                     G_CALLBACK (on_vscale_value_spinbutton_value_changed),\r
1382                     NULL);\r
1383   g_signal_connect ((gpointer) rotate_value_spinbutton, "value_changed",\r
1384                     G_CALLBACK (on_rotate_value_spinbutton_value_changed),\r
1385                     NULL);\r
1386   \r
1387   g_signal_connect ((gpointer) hshift_step_spinbutton, "value_changed",\r
1388                     G_CALLBACK (on_hshift_step_spinbutton_value_changed),\r
1389                     NULL);\r
1390   g_signal_connect ((gpointer) vshift_step_spinbutton, "value_changed",\r
1391                     G_CALLBACK (on_vshift_step_spinbutton_value_changed),\r
1392                     NULL);\r
1393   g_signal_connect ((gpointer) hscale_step_spinbutton, "value_changed",\r
1394                     G_CALLBACK (on_hscale_step_spinbutton_value_changed),\r
1395                     NULL);\r
1396   g_signal_connect ((gpointer) vscale_step_spinbutton, "value_changed",\r
1397                     G_CALLBACK (on_vscale_step_spinbutton_value_changed),\r
1398                     NULL);\r
1399   g_signal_connect ((gpointer) rotate_step_spinbutton, "value_changed",\r
1400                     G_CALLBACK (on_rotate_step_spinbutton_value_changed),\r
1401                     NULL);\r
1402   \r
1403   g_signal_connect ((gpointer) match_grid_button, "clicked",\r
1404                     G_CALLBACK (on_match_grid_button_clicked),\r
1405                     NULL);\r
1406   g_signal_connect ((gpointer) lock_valuechange_togglebutton, "toggled",\r
1407                     G_CALLBACK (on_lock_valuechange_togglebutton_toggled),\r
1408                     NULL);\r
1409   \r
1410   g_signal_connect ((gpointer) fit_width_spinbutton, "value_changed",\r
1411                     G_CALLBACK (on_fit_width_spinbutton_value_changed),\r
1412                     NULL);\r
1413   g_signal_connect ((gpointer) fit_height_spinbutton, "value_changed",\r
1414                     G_CALLBACK (on_fit_height_spinbutton_value_changed),\r
1415                     NULL);\r
1416   g_signal_connect ((gpointer) fit_button, "clicked",\r
1417                     G_CALLBACK (on_fit_button_clicked),\r
1418                     NULL);\r
1419   \r
1420   g_signal_connect ((gpointer) axial_button, "clicked",\r
1421                     G_CALLBACK (on_axial_button_clicked),\r
1422                     NULL);\r
1423   \r
1424   g_signal_connect ((gpointer) done_button, "clicked",\r
1425                     G_CALLBACK (on_done_button_clicked),\r
1426                     NULL);\r
1427   g_signal_connect ((gpointer) apply_button, "clicked",\r
1428                     G_CALLBACK (on_apply_button_clicked),\r
1429                     NULL);\r
1430   g_signal_connect ((gpointer) cancel_button, "clicked",\r
1431                     G_CALLBACK (on_cancel_button_clicked),\r
1432                     NULL);\r
1433   \r
1434   \r
1435   return SurfaceInspector;\r
1436 }\r
1437 \r
1438 \r
1439 // Texture Combo\r
1440 gboolean on_texture_combo_entry_key_press_event (GtkWidget *widget, GdkEventKey *event,\r
1441                                                  gpointer user_data)\r
1442 {\r
1443   // Have Tab activate selection as well as Return\r
1444   if (event->keyval == GDK_Tab)\r
1445     g_signal_emit_by_name ( texture_combo_entry, "activate" );\r
1446 \r
1447   return FALSE;\r
1448 }\r
1449 \r
1450 void on_texture_combo_entry_activate (GtkEntry *entry, gpointer user_data)\r
1451 {\r
1452   texdef_t* tmp_texdef;\r
1453   texdef_t* tmp_orig_texdef;\r
1454   texdef_to_face_t* temp_texdef_face_list;\r
1455   char text[128] = { 0 };\r
1456   \r
1457   if (!texdef_face_list_empty() && g_bListenChanged)\r
1458   {\r
1459     // activate only on entry change\r
1460     strcpy( text, gtk_entry_get_text(entry));\r
1461     if ( strcmp( old_texture_entry, text ))\r
1462     {\r
1463       // Check for spaces in shader name\r
1464       if (text[0] <= ' ' || strchr(text, ' '))\r
1465         Sys_FPrintf(SYS_WRN, "WARNING: spaces in shader names are not allowed, ignoring '%s'\n", text);\r
1466       else\r
1467       {  \r
1468         for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1469         {\r
1470           tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1471           tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1472           strcpy( old_texture_entry, text );\r
1473           tmp_texdef->SetName( text );\r
1474         }\r
1475         GetTexMods();\r
1476       }\r
1477     }\r
1478   }\r
1479 }\r
1480 \r
1481 // Offset Spins\r
1482 static void on_hshift_offset_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1483 {\r
1484   texdef_t* tmp_texdef;\r
1485   texdef_t* tmp_orig_texdef;\r
1486   texdef_to_face_t* temp_texdef_face_list;\r
1487   \r
1488   texdef_offset.shift[0] = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(hshift_offset_spinbutton) );\r
1489   \r
1490   if (!texdef_face_list_empty() && g_bListenChanged)\r
1491   {\r
1492     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1493     {\r
1494       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1495       tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1496       if (is_HShift_conflicting)\r
1497         tmp_texdef->shift[0] = tmp_orig_texdef->shift[0] + texdef_offset.shift[0];\r
1498       else\r
1499         tmp_texdef->shift[0] = texdef_SI_values.shift[0] + texdef_offset.shift[0];\r
1500     }\r
1501     GetTexMods();\r
1502   }\r
1503 }\r
1504 \r
1505 static void on_vshift_offset_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1506 {\r
1507   texdef_t* tmp_texdef;\r
1508   texdef_t* tmp_orig_texdef;\r
1509   texdef_to_face_t* temp_texdef_face_list;\r
1510   \r
1511   texdef_offset.shift[1] = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(vshift_offset_spinbutton) );\r
1512   \r
1513   if (!texdef_face_list_empty() && g_bListenChanged)\r
1514   {\r
1515     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1516     {\r
1517       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1518       tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1519       if (is_VShift_conflicting)\r
1520         tmp_texdef->shift[1] = tmp_orig_texdef->shift[1] + texdef_offset.shift[1];\r
1521       else\r
1522         tmp_texdef->shift[1] = texdef_SI_values.shift[1] + texdef_offset.shift[1];\r
1523     }\r
1524     GetTexMods();\r
1525   }\r
1526   \r
1527 }\r
1528 \r
1529 static void on_hscale_offset_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1530 {\r
1531   texdef_t* tmp_texdef;\r
1532   texdef_t* tmp_orig_texdef;\r
1533   texdef_to_face_t* temp_texdef_face_list;\r
1534   \r
1535   texdef_offset.scale[0] = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(hscale_offset_spinbutton) );\r
1536   \r
1537   if (!texdef_face_list_empty() && g_bListenChanged)\r
1538   {\r
1539     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1540     {\r
1541       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1542       tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1543       if (is_HScale_conflicting)\r
1544         tmp_texdef->scale[0] = tmp_orig_texdef->scale[0] + texdef_offset.scale[0];\r
1545       else\r
1546         tmp_texdef->scale[0] = texdef_SI_values.scale[0] + texdef_offset.scale[0];\r
1547     }\r
1548     GetTexMods();\r
1549   }\r
1550   \r
1551   \r
1552 }\r
1553 \r
1554 static void on_vscale_offset_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1555 {\r
1556   texdef_t* tmp_texdef;\r
1557   texdef_t* tmp_orig_texdef;\r
1558   texdef_to_face_t* temp_texdef_face_list;\r
1559   \r
1560   texdef_offset.scale[1] = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(vscale_offset_spinbutton) );\r
1561   \r
1562   if (!texdef_face_list_empty() && g_bListenChanged)\r
1563   {\r
1564     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1565     {\r
1566       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1567       tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1568       if (is_VScale_conflicting)\r
1569         tmp_texdef->scale[1] = tmp_orig_texdef->scale[1] + texdef_offset.scale[1];\r
1570       else\r
1571         tmp_texdef->scale[1] = texdef_SI_values.scale[1] + texdef_offset.scale[1];\r
1572     }\r
1573     GetTexMods();\r
1574   }\r
1575   \r
1576 }\r
1577 \r
1578 static void on_rotate_offset_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1579 {\r
1580   texdef_t* tmp_texdef;\r
1581   texdef_t* tmp_orig_texdef;\r
1582   texdef_to_face_t* temp_texdef_face_list;\r
1583   \r
1584   texdef_offset.rotate = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(rotate_offset_spinbutton) );\r
1585   \r
1586   if (!texdef_face_list_empty() && g_bListenChanged)\r
1587   {\r
1588     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1589     {\r
1590       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1591       tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1592       if (is_Rotate_conflicting)\r
1593         tmp_texdef->rotate = tmp_orig_texdef->rotate + texdef_offset.rotate;\r
1594       else\r
1595         tmp_texdef->rotate = texdef_SI_values.rotate + texdef_offset.rotate;\r
1596     }\r
1597     GetTexMods();\r
1598   }\r
1599  \r
1600 }\r
1601 \r
1602 \r
1603 // Match Grid\r
1604 static void on_match_grid_button_clicked (GtkButton *button, gpointer user_data)\r
1605 {\r
1606   float hscale, vscale;\r
1607 \r
1608   if( !strcmp(gtk_entry_get_text (GTK_ENTRY (hscale_value_spinbutton)), "") )\r
1609     hscale = 0.0;\r
1610   else\r
1611     hscale = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(hscale_value_spinbutton) );\r
1612 \r
1613   if( !strcmp( gtk_entry_get_text (GTK_ENTRY (vscale_value_spinbutton)), "") )\r
1614     vscale = 0.0;\r
1615   else\r
1616     vscale = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(vscale_value_spinbutton) );\r
1617   DoSnapTToGrid (hscale, vscale);\r
1618 }\r
1619 \r
1620 \r
1621 // Lock out changes to Value\r
1622 static void on_lock_valuechange_togglebutton_toggled (GtkToggleButton *togglebutton, gpointer user_data)\r
1623 {\r
1624   bool is_Locked;\r
1625 \r
1626   is_Locked = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lock_valuechange_togglebutton));\r
1627 \r
1628   gtk_widget_set_sensitive( GTK_WIDGET( hscale_value_spinbutton ), is_Locked );\r
1629   gtk_widget_set_sensitive( GTK_WIDGET( vscale_value_spinbutton ), is_Locked );\r
1630   gtk_widget_set_sensitive( GTK_WIDGET( hshift_value_spinbutton ), is_Locked );\r
1631   gtk_widget_set_sensitive( GTK_WIDGET( vshift_value_spinbutton ), is_Locked );\r
1632   gtk_widget_set_sensitive( GTK_WIDGET( rotate_value_spinbutton ), is_Locked );\r
1633 }\r
1634 \r
1635 \r
1636 // Value Spins\r
1637 static void on_hshift_value_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1638 {\r
1639   texdef_t* tmp_texdef;\r
1640   texdef_t* tmp_orig_texdef;\r
1641   texdef_to_face_t* temp_texdef_face_list;\r
1642 \r
1643   texdef_SI_values.shift[0] = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(hshift_value_spinbutton) );\r
1644 \r
1645   if (!texdef_face_list_empty() && g_bListenChanged)\r
1646   {\r
1647     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1648     {\r
1649       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1650       tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1651       tmp_texdef->shift[0] = texdef_SI_values.shift[0] + texdef_offset.shift[0];\r
1652       is_HShift_conflicting = FALSE;\r
1653     }\r
1654     GetTexMods();\r
1655   }\r
1656 }\r
1657 \r
1658 static void on_vshift_value_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1659 {\r
1660   texdef_t* tmp_texdef;\r
1661   texdef_t* tmp_orig_texdef;\r
1662   texdef_to_face_t* temp_texdef_face_list;\r
1663   \r
1664   texdef_SI_values.shift[1]  = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(vshift_value_spinbutton) );\r
1665   \r
1666   if (!texdef_face_list_empty() && g_bListenChanged)\r
1667   {\r
1668     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1669     {\r
1670       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1671       tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1672       tmp_texdef->shift[1] = texdef_SI_values.shift[1] + texdef_offset.shift[1];\r
1673       is_VShift_conflicting = FALSE;\r
1674     }\r
1675     GetTexMods();\r
1676   }\r
1677 }\r
1678 \r
1679 static void on_hscale_value_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1680 {\r
1681   texdef_t* tmp_texdef;\r
1682   texdef_t* tmp_orig_texdef;\r
1683   texdef_to_face_t* temp_texdef_face_list;\r
1684   \r
1685   texdef_SI_values.scale[0] = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(hscale_value_spinbutton) );\r
1686   \r
1687   if (!texdef_face_list_empty() && g_bListenChanged)\r
1688   {\r
1689     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1690     {\r
1691       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1692       tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1693       tmp_texdef->scale[0] = texdef_SI_values.scale[0] + texdef_offset.scale[0];\r
1694       is_HScale_conflicting = FALSE;\r
1695     }\r
1696     GetTexMods();\r
1697   }\r
1698 }\r
1699 \r
1700 static void on_vscale_value_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1701 {\r
1702   texdef_t* tmp_texdef;\r
1703   texdef_t* tmp_orig_texdef;\r
1704   texdef_to_face_t* temp_texdef_face_list;\r
1705   \r
1706   texdef_SI_values.scale[1] = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(vscale_value_spinbutton) );\r
1707   \r
1708   if (!texdef_face_list_empty() && g_bListenChanged)\r
1709   {\r
1710     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1711     {\r
1712       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1713       tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1714       tmp_texdef->scale[1] = texdef_SI_values.scale[1] + texdef_offset.scale[1];\r
1715       is_VScale_conflicting = FALSE;\r
1716     }\r
1717     GetTexMods();\r
1718   }\r
1719 }\r
1720 \r
1721 static void on_rotate_value_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1722 {\r
1723   texdef_t* tmp_texdef;\r
1724   texdef_t* tmp_orig_texdef;\r
1725   texdef_to_face_t* temp_texdef_face_list;\r
1726   \r
1727   texdef_SI_values.rotate = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(rotate_value_spinbutton) );\r
1728   \r
1729   if (!texdef_face_list_empty() && g_bListenChanged)\r
1730   {\r
1731     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1732     {\r
1733       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1734       tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;\r
1735       tmp_texdef->rotate = texdef_SI_values.rotate + texdef_offset.rotate;\r
1736       is_Rotate_conflicting = FALSE;\r
1737     }\r
1738     GetTexMods();\r
1739   }\r
1740 }\r
1741 \r
1742 \r
1743 // Step Spins\r
1744 static void on_hshift_step_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1745 {\r
1746   gfloat val;\r
1747   GtkAdjustment * adjust;\r
1748 \r
1749   if (!g_bListenChanged)\r
1750     return;\r
1751 \r
1752   l_pIncrement = Get_SI_Inc();\r
1753 \r
1754 #ifdef DBG_SI\r
1755   Sys_Printf("OnIncrementChanged HShift\n");\r
1756 #endif\r
1757 \r
1758   val = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(hshift_step_spinbutton) ) ;\r
1759   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON ( hshift_offset_spinbutton ));\r
1760   adjust->step_increment = val;\r
1761   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON ( hshift_value_spinbutton ));\r
1762   adjust->step_increment = val;\r
1763   l_pIncrement->shift[0] = val;\r
1764 }\r
1765 \r
1766 static void on_vshift_step_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1767 {\r
1768   gfloat val;\r
1769   GtkAdjustment * adjust;\r
1770 \r
1771   if (!g_bListenChanged)\r
1772     return;\r
1773 \r
1774   l_pIncrement = Get_SI_Inc();\r
1775 \r
1776 #ifdef DBG_SI\r
1777   Sys_Printf("OnIncrementChanged VShift\n");\r
1778 #endif\r
1779 \r
1780   val = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(vshift_step_spinbutton) ) ;\r
1781   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON ( vshift_offset_spinbutton ));\r
1782   adjust->step_increment = val;\r
1783   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON ( vshift_value_spinbutton ));\r
1784   adjust->step_increment = val;\r
1785   l_pIncrement->shift[1] = val;\r
1786 }\r
1787 \r
1788 static void on_hscale_step_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1789 {\r
1790   gfloat val;\r
1791   GtkAdjustment * adjust;\r
1792 \r
1793   if (!g_bListenChanged)\r
1794     return;\r
1795 \r
1796   l_pIncrement = Get_SI_Inc();\r
1797 \r
1798 #ifdef DBG_SI\r
1799   Sys_Printf("OnIncrementChanged HShift\n");\r
1800 #endif\r
1801 \r
1802   val = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(hscale_step_spinbutton) ) ;\r
1803   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON ( hscale_offset_spinbutton ));\r
1804   adjust->step_increment = val;\r
1805   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON ( hscale_value_spinbutton ));\r
1806   adjust->step_increment = val;\r
1807   l_pIncrement->scale[0] = val;\r
1808 }\r
1809 \r
1810 static void on_vscale_step_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1811 {\r
1812   gfloat val;\r
1813   GtkAdjustment * adjust;\r
1814 \r
1815   if (!g_bListenChanged)\r
1816     return;\r
1817 \r
1818   l_pIncrement = Get_SI_Inc();\r
1819 \r
1820 #ifdef DBG_SI\r
1821   Sys_Printf("OnIncrementChanged HShift\n");\r
1822 #endif\r
1823 \r
1824   val = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(vscale_step_spinbutton) ) ;\r
1825   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON ( vscale_offset_spinbutton ));\r
1826   adjust->step_increment = val;\r
1827   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON ( vscale_value_spinbutton ));\r
1828   adjust->step_increment = val;\r
1829   l_pIncrement->scale[1] = val;\r
1830 }\r
1831 \r
1832 static void on_rotate_step_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1833 {\r
1834   gfloat val;\r
1835   GtkAdjustment * adjust;\r
1836 \r
1837   if (!g_bListenChanged)\r
1838     return;\r
1839 \r
1840   l_pIncrement = Get_SI_Inc();\r
1841 \r
1842 #ifdef DBG_SI\r
1843   Sys_Printf("OnIncrementChanged HShift\n");\r
1844 #endif\r
1845 \r
1846   val = gtk_spin_button_get_value ( GTK_SPIN_BUTTON(rotate_step_spinbutton) ) ;\r
1847   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON ( rotate_offset_spinbutton ));\r
1848   adjust->step_increment = val;\r
1849   adjust = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON ( rotate_value_spinbutton ));\r
1850   adjust->step_increment = val;\r
1851   l_pIncrement->rotate = val;\r
1852 }\r
1853 \r
1854 \r
1855 // Fit Texture\r
1856 static void on_fit_width_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1857 {\r
1858   m_nWidth = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(fit_width_spinbutton) );\r
1859 }\r
1860 \r
1861 static void on_fit_height_spinbutton_value_changed (GtkSpinButton *spinbutton, gpointer user_data)\r
1862 {\r
1863   m_nHeight = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON(fit_height_spinbutton) );\r
1864 }\r
1865 \r
1866 static void on_fit_button_clicked (GtkButton *button, gpointer user_data)\r
1867 {\r
1868   FaceList_FitTexture(get_texdef_face_list(), m_nHeight, m_nWidth);\r
1869   Sys_UpdateWindows(W_ALL);\r
1870 }\r
1871 \r
1872 \r
1873 // Axial Button\r
1874 static void on_axial_button_clicked (GtkButton *button, gpointer user_data)\r
1875 {\r
1876   texdef_t* tmp_texdef;\r
1877   texdef_t* tmp_orig_texdef;\r
1878   texdef_to_face_t* temp_texdef_face_list;\r
1879 \r
1880   if (!texdef_face_list_empty() && g_bListenChanged)\r
1881   {\r
1882     for (temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next)\r
1883     {\r
1884       tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;\r
1885       tmp_texdef->shift[0] = 0.0;\r
1886       tmp_texdef->shift[1] = 0.0;\r
1887       tmp_texdef->scale[0] = 0.5;\r
1888       tmp_texdef->scale[1] = 0.5;\r
1889       tmp_texdef->rotate = 0.0;\r
1890     }\r
1891   }\r
1892 \r
1893   SetTexdef_FaceList( get_texdef_face_list(), FALSE, TRUE );\r
1894   Sys_UpdateWindows(W_ALL);\r
1895 }\r
1896 \r
1897 \r
1898 // Action Buttons\r
1899 static void on_done_button_clicked (GtkButton *button, gpointer user_data)\r
1900 {\r
1901   if ( !texdef_face_list_empty() )\r
1902     GetTexMods(TRUE);\r
1903   HideDlg();\r
1904   Sys_UpdateWindows(W_ALL);\r
1905 }\r
1906 \r
1907 static void on_apply_button_clicked (GtkButton *button, gpointer user_data)\r
1908 {\r
1909   if (!g_bListenChanged)\r
1910     return;\r
1911 \r
1912   if ( !texdef_face_list_empty() )\r
1913   {\r
1914     GetTexMods (TRUE);\r
1915     Sys_UpdateWindows(W_CAMERA);\r
1916     GetTexdefInfo_from_Radiant();\r
1917     SetTexMods();\r
1918   }\r
1919 }\r
1920 \r
1921 static void on_cancel_button_clicked (GtkButton *button, gpointer user_data)\r
1922 {\r
1923   texturewin = Texturewin ();\r
1924   texturewin->texdef = g_old_texdef;\r
1925   // cancel the last do if we own it\r
1926   if ( (m_nUndoId == Undo_GetUndoId()) && ( m_nUndoId != 0 ))\r
1927   {\r
1928 #ifdef DBG_SI\r
1929     Sys_Printf("OnCancel calling Undo_Undo\n");\r
1930 #endif\r
1931     g_bListenUpdate = false;\r
1932     Undo_Undo(TRUE);\r
1933     g_bListenUpdate = true;\r
1934     m_nUndoId = 0;\r
1935   }\r
1936   HideDlg();\r
1937 }\r
1938 \r
1939 \r