2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
5 This file is part of GtkRadiant.
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23 // Surface Dialog Module
27 // Nurail: Implemented to Module from the main Radiant Surface Dialog code
32 #include <gdk/gdkkeysyms.h>
34 #include "surfdlg_plugin.h"
42 #include "gtkr_vector.h"
44 vector<texdef_to_face_t> g_texdef_face_vector;
46 inline texdef_to_face_t* get_texdef_face_list(){
47 return &( *g_texdef_face_vector.begin() );
50 inline unsigned int texdef_face_list_empty(){
51 return g_texdef_face_vector.empty();
54 inline unsigned int texdef_face_list_size(){
55 return g_texdef_face_vector.size();
58 // For different faces having different values
59 bool is_HShift_conflicting;
60 bool is_VShift_conflicting;
61 bool is_HScale_conflicting;
62 bool is_VScale_conflicting;
63 bool is_Rotate_conflicting;
64 bool is_TextureName_conflicting;
69 void GetTexMods( bool b_SetUndoPoint = FALSE );
72 void InitDefaultIncrement( texdef_t * );
73 void DoSnapTToGrid( float hscale, float vscale );
74 // called to perform a fitting from the outside (shortcut key)
75 void SurfaceDialogFitAll();
77 // Quake2 Flags Functions
78 void SetFlagButtons_Quake2( texdef_to_face_t *texdef_face_list, bool b_isListEmpty );
79 void SetChangeInFlags_Face_Quake2( texdef_to_face_t *texdef_face_list );
80 GtkWidget* Create_Quake2FlagsDialog( GtkWidget* surfacedialog_widget );
87 // 0 is invalid, otherwise it's the Id of the last 'do' we are responsible for
91 texturewin_t *texturewin;
92 texdef_t *l_pIncrement;
93 texdef_t texdef_offset;
94 texdef_t texdef_SI_values;
96 // For Texture Entry, activate only on entry change
97 char old_texture_entry[128];
99 // the texdef to switch back to when the OnCancel is called
100 texdef_t g_old_texdef;
102 // when TRUE, this thing means the surface inspector is currently being displayed
103 bool g_surfwin = FALSE;
104 // turn on/off processing of the "changed" "value_changed" messages
105 // (need to turn off when we are feeding data in)
106 bool g_bListenChanged = true;
107 // turn on/off listening of the update messages
108 bool g_bListenUpdate = true;
110 GtkWidget* create_SurfaceInspector( void );
111 GtkWidget *SurfaceInspector = NULL;
113 GtkWidget *m_pWidget;
114 GtkWidget *GetWidget() { return SurfaceInspector; }
115 GtkWidget *Get_SI_Module_Widget() { return SurfaceInspector; }
116 void SetWidget( GtkWidget *new_widget ) { m_pWidget = new_widget; }
117 GtkWidget *GetDlgWidget( const char* name )
118 { return GTK_WIDGET( g_object_get_data( G_OBJECT( SurfaceInspector ), name ) ); }
120 // Spins for FitTexture
121 GtkWidget *spin_width;
122 GtkWidget *spin_height;
125 GtkWidget *texture_combo;
126 GtkWidget *texture_combo_entry;
128 GtkWidget *match_grid_button;
129 GtkWidget *lock_valuechange_togglebutton;
131 GtkObject *hshift_value_spinbutton_adj;
132 GtkWidget *hshift_value_spinbutton;
133 GtkObject *vshift_value_spinbutton_adj;
134 GtkWidget *vshift_value_spinbutton;
135 GtkObject *hscale_value_spinbutton_adj;
136 GtkWidget *hscale_value_spinbutton;
137 GtkObject *vscale_value_spinbutton_adj;
138 GtkWidget *vscale_value_spinbutton;
139 GtkObject *rotate_value_spinbutton_adj;
140 GtkWidget *rotate_value_spinbutton;
142 GtkObject *hshift_offset_spinbutton_adj;
143 GtkWidget *hshift_offset_spinbutton;
144 GtkObject *vshift_offset_spinbutton_adj;
145 GtkWidget *vshift_offset_spinbutton;
146 GtkObject *hscale_offset_spinbutton_adj;
147 GtkWidget *hscale_offset_spinbutton;
148 GtkObject *vscale_offset_spinbutton_adj;
149 GtkWidget *vscale_offset_spinbutton;
150 GtkObject *rotate_offset_spinbutton_adj;
151 GtkWidget *rotate_offset_spinbutton;
153 GtkObject *hshift_step_spinbutton_adj;
154 GtkWidget *hshift_step_spinbutton;
155 GtkObject *vshift_step_spinbutton_adj;
156 GtkWidget *vshift_step_spinbutton;
157 GtkObject *hscale_step_spinbutton_adj;
158 GtkWidget *hscale_step_spinbutton;
159 GtkObject *vscale_step_spinbutton_adj;
160 GtkWidget *vscale_step_spinbutton;
161 GtkObject *rotate_step_spinbutton_adj;
162 GtkWidget *rotate_step_spinbutton;
164 GtkObject *fit_width_spinbutton_adj;
165 GtkWidget *fit_width_spinbutton;
166 GtkObject *fit_height_spinbutton_adj;
167 GtkWidget *fit_height_spinbutton;
168 GtkWidget *fit_button;
169 GtkWidget *axial_button;
171 GtkWidget *done_button;
172 GtkWidget *apply_button;
173 GtkWidget *cancel_button;
176 gboolean on_texture_combo_entry_key_press_event( GtkWidget *widget, GdkEventKey *event, gpointer user_data );
177 void on_texture_combo_entry_activate( GtkEntry *entry, gpointer user_data );
179 static void on_match_grid_button_clicked( GtkButton *button, gpointer user_data );
180 static void on_lock_valuechange_togglebutton_toggled( GtkToggleButton *togglebutton, gpointer user_data );
182 static void on_hshift_value_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data );
183 static void on_vshift_value_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data );
184 static void on_hscale_value_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data );
185 static void on_vscale_value_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data );
186 static void on_rotate_value_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data );
188 static void on_hshift_offset_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data );
189 static void on_vshift_offset_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data );
190 static void on_hscale_offset_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data );
191 static void on_vscale_offset_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data );
192 static void on_rotate_offset_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data );
194 static void on_hshift_step_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data );
195 static void on_vshift_step_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data );
196 static void on_hscale_step_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data );
197 static void on_vscale_step_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data );
198 static void on_rotate_step_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data );
200 static void on_fit_width_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data );
201 static void on_fit_height_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data );
202 static void on_fit_button_clicked( GtkButton *button, gpointer user_data );
203 static void on_axial_button_clicked( GtkButton *button, gpointer user_data );
205 static void on_done_button_clicked( GtkButton *button, gpointer user_data );
206 static void on_apply_button_clicked( GtkButton *button, gpointer user_data );
207 static void on_cancel_button_clicked( GtkButton *button, gpointer user_data );
211 ===================================================
215 ===================================================
219 void IsFaceConflicting(){
220 texdef_t* tmp_texdef;
221 texdef_to_face_t* temp_texdef_face_list;
223 char texture_name[128];
225 if ( texdef_face_list_empty() ) {
226 gtk_entry_set_text( GTK_ENTRY( hshift_value_spinbutton ), "" );
227 gtk_entry_set_text( GTK_ENTRY( vshift_value_spinbutton ), "" );
228 gtk_entry_set_text( GTK_ENTRY( hscale_value_spinbutton ), "" );
229 gtk_entry_set_text( GTK_ENTRY( vscale_value_spinbutton ), "" );
230 gtk_entry_set_text( GTK_ENTRY( rotate_value_spinbutton ), "" );
231 gtk_entry_set_text( GTK_ENTRY( texture_combo_entry ), "" );
235 g_bListenChanged = FALSE;
237 tmp_texdef = &get_texdef_face_list()->texdef;
239 strcpy( texture_name, tmp_texdef->GetName() );
241 texdef_SI_values.shift[0] = tmp_texdef->shift[0];
242 texdef_SI_values.shift[1] = tmp_texdef->shift[1];
243 texdef_SI_values.scale[0] = tmp_texdef->scale[0];
244 texdef_SI_values.scale[1] = tmp_texdef->scale[1];
245 texdef_SI_values.rotate = tmp_texdef->rotate;
246 texdef_SI_values.SetName( texture_name );
248 is_HShift_conflicting = FALSE;
249 is_VShift_conflicting = FALSE;
250 is_HScale_conflicting = FALSE;
251 is_VScale_conflicting = FALSE;
252 is_Rotate_conflicting = FALSE;
253 is_TextureName_conflicting = FALSE;
255 if ( texdef_face_list_size() > 1 ) {
256 temp_texdef_face_list = get_texdef_face_list()->next;
258 for (; temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next )
260 tmp_texdef = &temp_texdef_face_list->texdef;
261 if ( texdef_SI_values.shift[0] != tmp_texdef->shift[0] ) {
262 is_HShift_conflicting = TRUE;
265 if ( texdef_SI_values.shift[1] != tmp_texdef->shift[1] ) {
266 is_VShift_conflicting = TRUE;
269 if ( texdef_SI_values.scale[0] != tmp_texdef->scale[0] ) {
270 is_HScale_conflicting = TRUE;
273 if ( texdef_SI_values.scale[1] != tmp_texdef->scale[1] ) {
274 is_VScale_conflicting = TRUE;
277 if ( texdef_SI_values.rotate != tmp_texdef->rotate ) {
278 is_Rotate_conflicting = TRUE;
281 if ( strcmp( texture_name, tmp_texdef->GetName() ) ) {
282 is_TextureName_conflicting = TRUE;
287 if ( is_HShift_conflicting ) {
288 gtk_entry_set_text( GTK_ENTRY( hshift_value_spinbutton ), "" );
291 gtk_spin_button_set_value( GTK_SPIN_BUTTON( hshift_value_spinbutton ), texdef_SI_values.shift[0] );
294 if ( is_VShift_conflicting ) {
295 gtk_entry_set_text( GTK_ENTRY( vshift_value_spinbutton ), "" );
298 gtk_spin_button_set_value( GTK_SPIN_BUTTON( vshift_value_spinbutton ), texdef_SI_values.shift[1] );
301 if ( is_HScale_conflicting ) {
302 gtk_entry_set_text( GTK_ENTRY( hscale_value_spinbutton ), "" );
305 gtk_spin_button_set_value( GTK_SPIN_BUTTON( hscale_value_spinbutton ), texdef_SI_values.scale[0] );
308 if ( is_VScale_conflicting ) {
309 gtk_entry_set_text( GTK_ENTRY( vscale_value_spinbutton ), "" );
312 gtk_spin_button_set_value( GTK_SPIN_BUTTON( vscale_value_spinbutton ), texdef_SI_values.scale[1] );
315 if ( is_Rotate_conflicting ) {
316 gtk_entry_set_text( GTK_ENTRY( rotate_value_spinbutton ), "" );
319 gtk_spin_button_set_value( GTK_SPIN_BUTTON( rotate_value_spinbutton ), texdef_SI_values.rotate );
322 g_bListenChanged = TRUE;
325 #define MAX_NUM_LIST_ITEMS 15
326 static void PopulateTextureComboList(){
327 texdef_t* tmp_texdef;
328 texdef_to_face_t* temp_texdef_face_list;
332 int num_of_list_items = 0;
336 if ( texdef_face_list_empty() ) {
337 items = g_list_append( items, (gpointer) blank );
338 // For Texture Entry, activate only on entry change
339 strcpy( old_texture_entry, blank );
341 else if ( !is_TextureName_conflicting ) {
342 temp_texdef_face_list = get_texdef_face_list();
343 tmp_texdef = (texdef_t *) &get_texdef_face_list()->texdef;
344 items = g_list_append( items, (gpointer) tmp_texdef->GetName() );
345 // For Texture Entry, activate only on entry change
346 strcpy( old_texture_entry, tmp_texdef->GetName() );
350 for ( temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next )
352 tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;
353 // Need to do a string compare, hence the custom search
354 if ( !( g_list_find_custom( items, tmp_texdef->GetName(), (GCompareFunc) strcmp ) ) ) {
355 items = g_list_append( items, (gpointer) tmp_texdef->GetName() );
358 // Make sure the combo list isn't too long
359 if ( num_of_list_items >= MAX_NUM_LIST_ITEMS ) {
363 // If this isn't added last (to the top of the list), g_list_find freaks.
364 items = g_list_prepend( items, (gpointer) blank );
365 // For Texture Entry, activate only on entry change
366 strcpy( old_texture_entry, blank );
369 gtk_combo_set_popdown_strings( GTK_COMBO( texture_combo ), items );
370 g_list_free( items );
374 static void ZeroOffsetValues(){
375 texdef_offset.shift[0] = 0.0;
376 texdef_offset.shift[1] = 0.0;
377 texdef_offset.scale[0] = 0.0;
378 texdef_offset.scale[1] = 0.0;
379 texdef_offset.rotate = 0.0;
382 static void GetTexdefInfo_from_Radiant(){
383 g_texdef_face_vector.clear();
385 unsigned int count = GetSelectedFaceCountfromBrushes();
387 count = GetSelectedFaceCount();
390 g_texdef_face_vector.resize( count );
392 if ( !texdef_face_list_empty() ) {
393 // texdef_to_face_t* p = get_texdef_face_list();
394 GetSelFacesTexdef( get_texdef_face_list() );
398 PopulateTextureComboList();
400 if ( texdef_face_list_empty() ) {
401 SetFlagButtons_Quake2( get_texdef_face_list(), TRUE );
404 SetFlagButtons_Quake2( get_texdef_face_list(), FALSE );
408 static gint delete_event_callback( GtkWidget *widget, GdkEvent* event, gpointer data ){
413 // make the shift increments match the grid settings
414 // the objective being that the shift+arrows shortcuts move the texture by the corresponding grid size
415 // this depends on a scale value if you have selected a particular texture on which you want it to work:
416 // we move the textures in pixels, not world units. (i.e. increment values are in pixel)
417 // depending on the texture scale it doesn't take the same amount of pixels to move of g_qeglobals.d_gridsize
418 // increment * scale = gridsize
419 // hscale and vscale are optional parameters, if they are zero they will be set to the default scale
420 // NOTE: the default scale depends if you are using BP mode or regular.
421 // For regular it's 0.5f (128 pixels cover 64 world units), for BP it's simply 1.0f
423 void DoSnapTToGrid( float hscale, float vscale ){
424 l_pIncrement = Get_SI_Inc();
426 if ( hscale == 0.0f ) {
429 if ( vscale == 0.0f ) {
433 Sys_Printf( "DoSnapTToGrid: hscale %g vscale %g\n", hscale, vscale );
435 l_pIncrement->shift[0] = GridSize() / hscale;
436 l_pIncrement->shift[1] = GridSize() / vscale;
437 // now some update work
438 // FIXME: doesn't look good here, seems to be called several times
442 void UpdateSurfaceDialog(){
443 if ( !g_bListenUpdate ) {
447 if ( !SurfaceInspector ) {
451 // avoid long delays on slow computers
452 while ( gtk_events_pending() )
453 gtk_main_iteration();
457 Sys_Printf( "UpdateSurfaceDialog\n" );
459 GetTexdefInfo_from_Radiant();
465 // DoSurface will always try to show the surface inspector
466 // or update it because something new has been selected
467 void DoSurface( void ){
469 Sys_Printf( "DoSurface\n" );
471 if ( !SurfaceInspector ) {
472 create_SurfaceInspector();
479 void ToggleSurface(){
481 Sys_Printf( "ToggleSurface Module\n" );
487 on_cancel_button_clicked( NULL, NULL );
491 // NOTE: will raise and show the Surface inspector and exec fit for patches and brushes
492 void SurfaceDlgFitAll(){
497 // =============================================================================
498 // SurfaceDialog class
502 if ( !SurfaceInspector ) {
503 create_SurfaceInspector();
506 gtk_widget_show( SurfaceInspector );
509 GetTexdefInfo_from_Radiant();
510 GetTexMods( TRUE ); // Set Initial Undo Point
516 gtk_widget_hide( SurfaceInspector );
520 // set default values for increments (shift scale and rot)
521 // this is called by the prefs code if can't find the values
522 void InitDefaultIncrement( texdef_t *tex ){
523 tex->SetName( "foo" );
526 tex->scale[0] = 0.25;
527 tex->scale[1] = 0.25;
532 if ( !SurfaceInspector ) {
533 create_SurfaceInspector();
541 Set the fields to the current texdef (i.e. map/texdef -> dialog widgets)
548 GtkAdjustment *adjust;
550 texturewin = Texturewin();
551 l_pIncrement = Get_SI_Inc();
554 Sys_Printf( "SurfaceDlg SetTexMods\n" );
561 pt = &texturewin->texdef;
563 g_bListenChanged = false;
565 if ( strncmp( pt->GetName(), "textures/", 9 ) != 0 ) {
566 texdef_offset.SetName( SHADER_NOT_FOUND );
570 spin = GTK_SPIN_BUTTON( hshift_offset_spinbutton );
571 gtk_spin_button_set_value( spin, texdef_offset.shift[0] );
572 adjust = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( spin ) );
573 adjust->step_increment = l_pIncrement->shift[0];
574 gtk_spin_button_set_value( GTK_SPIN_BUTTON( hshift_step_spinbutton ), l_pIncrement->shift[0] );
576 spin = GTK_SPIN_BUTTON( hshift_value_spinbutton );
577 adjust = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( spin ) );
578 adjust->step_increment = l_pIncrement->shift[0];
581 spin = GTK_SPIN_BUTTON( vshift_offset_spinbutton );
582 gtk_spin_button_set_value( spin, texdef_offset.shift[1] );
583 adjust = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( spin ) );
584 adjust->step_increment = l_pIncrement->shift[1];
585 gtk_spin_button_set_value( GTK_SPIN_BUTTON( vshift_step_spinbutton ), l_pIncrement->shift[1] );
587 spin = GTK_SPIN_BUTTON( vshift_value_spinbutton );
588 adjust = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( spin ) );
589 adjust->step_increment = l_pIncrement->shift[1];
592 spin = GTK_SPIN_BUTTON( hscale_offset_spinbutton );
593 gtk_spin_button_set_value( spin, texdef_offset.scale[0] );
594 adjust = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( spin ) );
595 adjust->step_increment = l_pIncrement->scale[0];
596 gtk_spin_button_set_value( GTK_SPIN_BUTTON( hscale_step_spinbutton ), l_pIncrement->scale[0] );
598 spin = GTK_SPIN_BUTTON( hscale_value_spinbutton );
599 adjust = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( spin ) );
600 adjust->step_increment = l_pIncrement->scale[0];
603 spin = GTK_SPIN_BUTTON( vscale_offset_spinbutton );
604 gtk_spin_button_set_value( spin, texdef_offset.scale[1] );
605 adjust = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( spin ) );
606 adjust->step_increment = l_pIncrement->scale[1];
607 gtk_spin_button_set_value( GTK_SPIN_BUTTON( vscale_step_spinbutton ), l_pIncrement->scale[1] );
609 spin = GTK_SPIN_BUTTON( vscale_value_spinbutton );
610 adjust = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( spin ) );
611 adjust->step_increment = l_pIncrement->scale[1];
614 spin = GTK_SPIN_BUTTON( rotate_offset_spinbutton );
615 gtk_spin_button_set_value( spin, texdef_offset.rotate );
616 adjust = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( spin ) );
617 adjust->step_increment = l_pIncrement->rotate;
618 gtk_spin_button_set_value( GTK_SPIN_BUTTON( rotate_step_spinbutton ), l_pIncrement->rotate );
620 spin = GTK_SPIN_BUTTON( rotate_value_spinbutton );
621 adjust = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( spin ) );
622 adjust->step_increment = l_pIncrement->rotate;
625 g_bListenChanged = true;
627 // store the current texdef as our escape route if user hits OnCancel
628 g_old_texdef = texturewin->texdef;
635 Shows any changes to the main Radiant windows
638 void GetTexMods( bool b_SetUndoPoint ){
641 Sys_Printf( "SurfaceDlg GetTexMods\n" );
644 if ( !texdef_face_list_empty() ) {
645 g_bListenUpdate = FALSE;
646 SetChangeInFlags_Face_Quake2( get_texdef_face_list() );
647 SetTexdef_FaceList( get_texdef_face_list(), b_SetUndoPoint, false );
648 g_bListenUpdate = TRUE;
650 if ( b_SetUndoPoint ) {
651 m_nUndoId = Undo_GetUndoId();
657 on_fit_button_clicked( NULL, NULL );
661 ////////////////////////////////////////////////////////////////////
665 ////////////////////////////////////////////////////////////////////
667 GtkWidget* create_SurfaceInspector( void ){
670 GtkWidget *hseparator;
673 GtkWidget *viewport8;
674 GtkWidget *viewport9;
675 GtkWidget *viewport2;
676 GtkWidget *viewport7;
677 GtkWidget *viewport5;
678 GtkWidget *viewport6;
679 GtkWidget *viewport10;
686 GtkWidget *alignment1;
687 GtkWidget *alignment2;
688 GtkWidget *alignment3;
701 GtkWidget *hbuttonbox1;
703 SurfaceInspector = gtk_window_new( GTK_WINDOW_TOPLEVEL );
704 gtk_container_set_border_width( GTK_CONTAINER( SurfaceInspector ), 4 );
705 gtk_window_set_title( GTK_WINDOW( SurfaceInspector ), "Surface Inspector" );
707 SetWinPos_from_Prefs( SurfaceInspector );
709 viewport8 = gtk_viewport_new( NULL, NULL );
710 gtk_widget_show( viewport8 );
711 gtk_container_add( GTK_CONTAINER( SurfaceInspector ), viewport8 );
712 gtk_viewport_set_shadow_type( GTK_VIEWPORT( viewport8 ), GTK_SHADOW_NONE );
714 vbox7 = gtk_vbox_new( FALSE, 0 );
715 gtk_widget_show( vbox7 );
716 gtk_container_add( GTK_CONTAINER( viewport8 ), vbox7 );
718 viewport9 = gtk_viewport_new( NULL, NULL );
719 gtk_widget_show( viewport9 );
720 gtk_box_pack_start( GTK_BOX( vbox7 ), viewport9, FALSE, FALSE, 0 );
721 gtk_container_set_border_width( GTK_CONTAINER( viewport9 ), 2 );
722 gtk_viewport_set_shadow_type( GTK_VIEWPORT( viewport9 ), GTK_SHADOW_ETCHED_IN );
724 hbox1 = gtk_hbox_new( FALSE, 0 );
725 gtk_widget_show( hbox1 );
726 gtk_container_add( GTK_CONTAINER( viewport9 ), hbox1 );
727 gtk_container_set_border_width( GTK_CONTAINER( hbox1 ), 4 );
729 label = gtk_label_new( "Texture: " );
730 gtk_widget_show( label );
731 gtk_box_pack_start( GTK_BOX( hbox1 ), label, FALSE, FALSE, 0 );
732 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
734 texture_combo = gtk_combo_new();
735 g_object_set_data( G_OBJECT( GTK_COMBO( texture_combo )->popwin ),
736 "KeepMeAround", texture_combo );
737 gtk_combo_disable_activate( (GtkCombo*) texture_combo );
738 gtk_widget_show( texture_combo );
739 gtk_box_pack_start( GTK_BOX( hbox1 ), texture_combo, TRUE, TRUE, 0 );
741 texture_combo_entry = GTK_COMBO( texture_combo )->entry;
742 gtk_widget_show( texture_combo_entry );
743 gtk_entry_set_max_length( GTK_ENTRY( texture_combo_entry ), 128 );
745 viewport2 = gtk_viewport_new( NULL, NULL );
746 gtk_widget_show( viewport2 );
747 gtk_box_pack_start( GTK_BOX( vbox7 ), viewport2, FALSE, TRUE, 0 );
748 gtk_container_set_border_width( GTK_CONTAINER( viewport2 ), 2 );
749 gtk_viewport_set_shadow_type( GTK_VIEWPORT( viewport2 ), GTK_SHADOW_ETCHED_IN );
751 table1 = gtk_table_new( 13, 4, FALSE );
752 gtk_widget_show( table1 );
753 gtk_container_add( GTK_CONTAINER( viewport2 ), table1 );
755 hseparator = gtk_hseparator_new();
756 gtk_widget_show( hseparator );
757 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 1, 2, 1, 2,
758 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
759 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
761 hseparator = gtk_hseparator_new();
762 gtk_widget_show( hseparator );
763 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 2, 3, 1, 2,
764 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
765 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
767 hseparator = gtk_hseparator_new();
768 gtk_widget_show( hseparator );
769 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 3, 4, 1, 2,
770 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
771 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
773 hseparator = gtk_hseparator_new();
774 gtk_widget_show( hseparator );
775 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 1, 2, 3, 4,
776 (GtkAttachOptions) ( GTK_FILL ),
777 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
779 hseparator = gtk_hseparator_new();
780 gtk_widget_show( hseparator );
781 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 2, 3, 3, 4,
782 (GtkAttachOptions) ( GTK_FILL ),
783 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
785 hseparator = gtk_hseparator_new();
786 gtk_widget_show( hseparator );
787 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 3, 4, 3, 4,
788 (GtkAttachOptions) ( GTK_FILL ),
789 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
791 hseparator = gtk_hseparator_new();
792 gtk_widget_show( hseparator );
793 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 1, 2, 5, 6,
794 (GtkAttachOptions) ( GTK_FILL ),
795 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
797 hseparator = gtk_hseparator_new();
798 gtk_widget_show( hseparator );
799 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 2, 3, 5, 6,
800 (GtkAttachOptions) ( GTK_FILL ),
801 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
803 hseparator = gtk_hseparator_new();
804 gtk_widget_show( hseparator );
805 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 3, 4, 5, 6,
806 (GtkAttachOptions) ( GTK_FILL ),
807 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
809 hseparator = gtk_hseparator_new();
810 gtk_widget_show( hseparator );
811 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 1, 2, 7, 8,
812 (GtkAttachOptions) ( GTK_FILL ),
813 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
815 hseparator = gtk_hseparator_new();
816 gtk_widget_show( hseparator );
817 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 2, 3, 7, 8,
818 (GtkAttachOptions) ( GTK_FILL ),
819 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
821 hseparator = gtk_hseparator_new();
822 gtk_widget_show( hseparator );
823 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 3, 4, 7, 8,
824 (GtkAttachOptions) ( GTK_FILL ),
825 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
827 hseparator = gtk_hseparator_new();
828 gtk_widget_show( hseparator );
829 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 1, 2, 9, 10,
830 (GtkAttachOptions) ( GTK_FILL ),
831 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
833 hseparator = gtk_hseparator_new();
834 gtk_widget_show( hseparator );
835 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 2, 3, 9, 10,
836 (GtkAttachOptions) ( GTK_FILL ),
837 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
839 hseparator = gtk_hseparator_new();
840 gtk_widget_show( hseparator );
841 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 3, 4, 9, 10,
842 (GtkAttachOptions) ( GTK_FILL ),
843 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
845 hseparator = gtk_hseparator_new();
846 gtk_widget_show( hseparator );
847 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 1, 2, 11, 12,
848 (GtkAttachOptions) ( GTK_FILL ),
849 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
851 hseparator = gtk_hseparator_new();
852 gtk_widget_show( hseparator );
853 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 2, 3, 11, 12,
854 (GtkAttachOptions) ( GTK_FILL ),
855 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
857 hseparator = gtk_hseparator_new();
858 gtk_widget_show( hseparator );
859 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 3, 4, 11, 12,
860 (GtkAttachOptions) ( GTK_FILL ),
861 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
863 label = gtk_label_new( "Offset" );
864 gtk_widget_show( label );
865 gtk_table_attach( GTK_TABLE( table1 ), label, 2, 3, 0, 1,
866 (GtkAttachOptions) ( GTK_FILL ),
867 (GtkAttachOptions) ( 0 ), 0, 0 );
869 label = gtk_label_new( "Step" );
870 gtk_widget_show( label );
871 gtk_table_attach( GTK_TABLE( table1 ), label, 3, 4, 0, 1,
872 (GtkAttachOptions) ( GTK_FILL ),
873 (GtkAttachOptions) ( 0 ), 0, 0 );
875 eventbox = gtk_event_box_new();
876 gtk_widget_show( eventbox );
877 gtk_table_attach( GTK_TABLE( table1 ), eventbox, 3, 4, 12, 13,
878 (GtkAttachOptions) ( GTK_FILL ),
879 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
881 match_grid_button = gtk_button_new_with_mnemonic( "Match Grid" );
882 gtk_widget_show( match_grid_button );
883 gtk_container_add( GTK_CONTAINER( eventbox ), match_grid_button );
885 label = gtk_label_new( "Value" );
886 gtk_widget_show( label );
887 gtk_table_attach( GTK_TABLE( table1 ), label, 1, 2, 0, 1,
888 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
889 (GtkAttachOptions) ( 0 ), 0, 0 );
890 gtk_misc_set_alignment( GTK_MISC( label ), 0.5, 1 );
892 hseparator = gtk_hseparator_new();
893 gtk_widget_show( hseparator );
894 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 0, 1, 3, 4,
895 (GtkAttachOptions) ( GTK_SHRINK | GTK_FILL ),
896 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
898 hseparator = gtk_hseparator_new();
899 gtk_widget_show( hseparator );
900 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 0, 1, 5, 6,
901 (GtkAttachOptions) ( GTK_FILL ),
902 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
904 hseparator = gtk_hseparator_new();
905 gtk_widget_show( hseparator );
906 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 0, 1, 7, 8,
907 (GtkAttachOptions) ( GTK_FILL ),
908 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
910 hseparator = gtk_hseparator_new();
911 gtk_widget_show( hseparator );
912 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 0, 1, 9, 10,
913 (GtkAttachOptions) ( GTK_FILL ),
914 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
916 hseparator = gtk_hseparator_new();
917 gtk_widget_show( hseparator );
918 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 0, 1, 11, 12,
919 (GtkAttachOptions) ( GTK_FILL ),
920 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
922 eventbox = gtk_event_box_new();
923 gtk_widget_show( eventbox );
924 gtk_table_attach( GTK_TABLE( table1 ), eventbox, 0, 1, 4, 5,
925 (GtkAttachOptions) ( GTK_FILL ),
926 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
928 label = gtk_label_new( "V Shift: " );
929 gtk_widget_show( label );
930 gtk_container_add( GTK_CONTAINER( eventbox ), label );
931 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
932 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
934 eventbox = gtk_event_box_new();
935 gtk_widget_show( eventbox );
936 gtk_table_attach( GTK_TABLE( table1 ), eventbox, 0, 1, 6, 7,
937 (GtkAttachOptions) ( GTK_FILL ),
938 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
940 label = gtk_label_new( " H Scale: " );
941 gtk_widget_show( label );
942 gtk_container_add( GTK_CONTAINER( eventbox ), label );
943 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
944 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
946 eventbox = gtk_event_box_new();
947 gtk_widget_show( eventbox );
948 gtk_table_attach( GTK_TABLE( table1 ), eventbox, 0, 1, 8, 9,
949 (GtkAttachOptions) ( GTK_FILL ),
950 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
952 label = gtk_label_new( "V Scale: " );
953 gtk_widget_show( label );
954 gtk_container_add( GTK_CONTAINER( eventbox ), label );
955 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
956 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
958 eventbox = gtk_event_box_new();
959 gtk_widget_show( eventbox );
960 gtk_table_attach( GTK_TABLE( table1 ), eventbox, 0, 1, 10, 11,
961 (GtkAttachOptions) ( GTK_FILL ),
962 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
964 label = gtk_label_new( "Rotate: " );
965 gtk_widget_show( label );
966 gtk_container_add( GTK_CONTAINER( eventbox ), label );
967 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
968 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
970 eventbox = gtk_event_box_new();
971 gtk_widget_show( eventbox );
972 gtk_table_attach( GTK_TABLE( table1 ), eventbox, 0, 1, 2, 3,
973 (GtkAttachOptions) ( GTK_FILL ),
974 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
976 label = gtk_label_new( "H Shift: " );
977 gtk_widget_show( label );
978 gtk_container_add( GTK_CONTAINER( eventbox ), label );
979 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
980 gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
982 hseparator = gtk_hseparator_new();
983 gtk_widget_show( hseparator );
984 gtk_table_attach( GTK_TABLE( table1 ), hseparator, 0, 1, 1, 2,
985 (GtkAttachOptions) ( GTK_FILL ),
986 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
988 eventbox = gtk_event_box_new();
989 gtk_widget_show( eventbox );
990 gtk_table_attach( GTK_TABLE( table1 ), eventbox, 1, 2, 12, 13,
991 (GtkAttachOptions) ( GTK_FILL ),
992 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
994 lock_valuechange_togglebutton = gtk_toggle_button_new_with_mnemonic( "UNLOCK" );
995 gtk_widget_show( lock_valuechange_togglebutton );
996 gtk_container_add( GTK_CONTAINER( eventbox ), lock_valuechange_togglebutton );
999 hshift_value_spinbutton_adj = gtk_adjustment_new( 0.0, -8192.0, 8192.0, 2.0, 8.0, 8.0 );
1000 hshift_value_spinbutton = gtk_spin_button_new( GTK_ADJUSTMENT( hshift_value_spinbutton_adj ), 1, 2 );
1001 gtk_widget_show( hshift_value_spinbutton );
1002 gtk_table_attach( GTK_TABLE( table1 ), hshift_value_spinbutton, 1, 2, 2, 3,
1003 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1004 (GtkAttachOptions) ( 0 ), 0, 0 );
1005 gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON( hshift_value_spinbutton ), GTK_UPDATE_IF_VALID );
1006 gtk_spin_button_set_wrap( GTK_SPIN_BUTTON( hshift_value_spinbutton ), TRUE );
1007 gtk_widget_set_sensitive( GTK_WIDGET( hshift_value_spinbutton ), FALSE );
1009 vshift_value_spinbutton_adj = gtk_adjustment_new( 0.0, -8192.0, 8192.0, 2.0, 8.0, 8.0 );
1010 vshift_value_spinbutton = gtk_spin_button_new( GTK_ADJUSTMENT( vshift_value_spinbutton_adj ), 1, 2 );
1011 gtk_widget_show( vshift_value_spinbutton );
1012 gtk_table_attach( GTK_TABLE( table1 ), vshift_value_spinbutton, 1, 2, 4, 5,
1013 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1014 (GtkAttachOptions) ( 0 ), 0, 0 );
1015 gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON( vshift_value_spinbutton ), GTK_UPDATE_IF_VALID );
1016 gtk_spin_button_set_wrap( GTK_SPIN_BUTTON( vshift_value_spinbutton ), TRUE );
1017 gtk_widget_set_sensitive( GTK_WIDGET( vshift_value_spinbutton ), FALSE );
1019 hscale_value_spinbutton_adj = gtk_adjustment_new( 0.0, -1024.0, 1024.0, 1.0, 4.0, 4.0 );
1020 hscale_value_spinbutton = gtk_spin_button_new( GTK_ADJUSTMENT( hscale_value_spinbutton_adj ), 1, 4 );
1021 gtk_widget_show( hscale_value_spinbutton );
1022 gtk_table_attach( GTK_TABLE( table1 ), hscale_value_spinbutton, 1, 2, 6, 7,
1023 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1024 (GtkAttachOptions) ( 0 ), 0, 0 );
1025 gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON( hscale_value_spinbutton ), GTK_UPDATE_IF_VALID );
1026 gtk_spin_button_set_wrap( GTK_SPIN_BUTTON( hscale_value_spinbutton ), TRUE );
1027 gtk_widget_set_sensitive( GTK_WIDGET( hscale_value_spinbutton ), FALSE );
1029 vscale_value_spinbutton_adj = gtk_adjustment_new( 0.0, -1024.0, 1024.0, 1.0, 4.0, 4.0 );
1030 vscale_value_spinbutton = gtk_spin_button_new( GTK_ADJUSTMENT( vscale_value_spinbutton_adj ), 1, 4 );
1031 gtk_widget_show( vscale_value_spinbutton );
1032 gtk_table_attach( GTK_TABLE( table1 ), vscale_value_spinbutton, 1, 2, 8, 9,
1033 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1034 (GtkAttachOptions) ( 0 ), 0, 0 );
1035 gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON( vscale_value_spinbutton ), GTK_UPDATE_IF_VALID );
1036 gtk_spin_button_set_wrap( GTK_SPIN_BUTTON( vscale_value_spinbutton ), TRUE );
1037 gtk_widget_set_sensitive( GTK_WIDGET( vscale_value_spinbutton ), FALSE );
1039 rotate_value_spinbutton_adj = gtk_adjustment_new( 0.0, -360.0, 360.0, 1.0, 10.0, 10.0 );
1040 rotate_value_spinbutton = gtk_spin_button_new( GTK_ADJUSTMENT( rotate_value_spinbutton_adj ), 1, 0 );
1041 gtk_widget_show( rotate_value_spinbutton );
1042 gtk_table_attach( GTK_TABLE( table1 ), rotate_value_spinbutton, 1, 2, 10, 11,
1043 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1044 (GtkAttachOptions) ( 0 ), 0, 0 );
1045 gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON( rotate_value_spinbutton ), GTK_UPDATE_IF_VALID );
1046 gtk_spin_button_set_wrap( GTK_SPIN_BUTTON( rotate_value_spinbutton ), TRUE );
1047 gtk_widget_set_sensitive( GTK_WIDGET( rotate_value_spinbutton ), FALSE );
1050 hshift_offset_spinbutton_adj = gtk_adjustment_new( 0.0, -8192.0, 8192.0, 2.0, 8.0, 8.0 );
1051 hshift_offset_spinbutton = gtk_spin_button_new( GTK_ADJUSTMENT( hshift_offset_spinbutton_adj ), 0, 2 );
1052 gtk_widget_show( hshift_offset_spinbutton );
1053 gtk_table_attach( GTK_TABLE( table1 ), hshift_offset_spinbutton, 2, 3, 2, 3,
1054 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1055 (GtkAttachOptions) ( 0 ), 4, 0 );
1056 gtk_spin_button_set_numeric( GTK_SPIN_BUTTON( hshift_offset_spinbutton ), TRUE );
1057 gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON( hshift_offset_spinbutton ), GTK_UPDATE_IF_VALID );
1058 gtk_spin_button_set_wrap( GTK_SPIN_BUTTON( hshift_offset_spinbutton ), TRUE );
1060 vshift_offset_spinbutton_adj = gtk_adjustment_new( 0.0, -8192.0, 8192.0, 2.0, 8.0, 8.0 );
1061 vshift_offset_spinbutton = gtk_spin_button_new( GTK_ADJUSTMENT( vshift_offset_spinbutton_adj ), 0, 2 );
1062 gtk_widget_show( vshift_offset_spinbutton );
1063 gtk_table_attach( GTK_TABLE( table1 ), vshift_offset_spinbutton, 2, 3, 4, 5,
1064 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1065 (GtkAttachOptions) ( 0 ), 4, 0 );
1066 gtk_spin_button_set_numeric( GTK_SPIN_BUTTON( vshift_offset_spinbutton ), TRUE );
1067 gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON( vshift_offset_spinbutton ), GTK_UPDATE_IF_VALID );
1068 gtk_spin_button_set_wrap( GTK_SPIN_BUTTON( vshift_offset_spinbutton ), TRUE );
1070 hscale_offset_spinbutton_adj = gtk_adjustment_new( 0.0, -1024.0, 1024.0, 1.0, 4.0, 4.0 );
1071 hscale_offset_spinbutton = gtk_spin_button_new( GTK_ADJUSTMENT( hscale_offset_spinbutton_adj ), 0, 4 );
1072 gtk_widget_show( hscale_offset_spinbutton );
1073 gtk_table_attach( GTK_TABLE( table1 ), hscale_offset_spinbutton, 2, 3, 6, 7,
1074 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1075 (GtkAttachOptions) ( 0 ), 4, 0 );
1076 gtk_spin_button_set_numeric( GTK_SPIN_BUTTON( hscale_offset_spinbutton ), TRUE );
1077 gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON( hscale_offset_spinbutton ), GTK_UPDATE_IF_VALID );
1078 gtk_spin_button_set_wrap( GTK_SPIN_BUTTON( hscale_offset_spinbutton ), TRUE );
1080 vscale_offset_spinbutton_adj = gtk_adjustment_new( 0.0, -1024.0, 1024.0, 1.0, 4.0, 4.0 );
1081 vscale_offset_spinbutton = gtk_spin_button_new( GTK_ADJUSTMENT( vscale_offset_spinbutton_adj ), 0, 4 );
1082 gtk_widget_show( vscale_offset_spinbutton );
1083 gtk_table_attach( GTK_TABLE( table1 ), vscale_offset_spinbutton, 2, 3, 8, 9,
1084 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1085 (GtkAttachOptions) ( 0 ), 4, 0 );
1086 gtk_spin_button_set_numeric( GTK_SPIN_BUTTON( vscale_offset_spinbutton ), TRUE );
1087 gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON( vscale_offset_spinbutton ), GTK_UPDATE_IF_VALID );
1088 gtk_spin_button_set_wrap( GTK_SPIN_BUTTON( vscale_offset_spinbutton ), TRUE );
1090 rotate_offset_spinbutton_adj = gtk_adjustment_new( 0.0, -360.0, 360.0, 1.0, 10.0, 10.0 );
1091 rotate_offset_spinbutton = gtk_spin_button_new( GTK_ADJUSTMENT( rotate_offset_spinbutton_adj ), 0, 2 );
1092 gtk_widget_show( rotate_offset_spinbutton );
1093 gtk_table_attach( GTK_TABLE( table1 ), rotate_offset_spinbutton, 2, 3, 10, 11,
1094 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1095 (GtkAttachOptions) ( 0 ), 4, 0 );
1096 gtk_spin_button_set_numeric( GTK_SPIN_BUTTON( rotate_offset_spinbutton ), TRUE );
1097 gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON( rotate_offset_spinbutton ), GTK_UPDATE_IF_VALID );
1098 gtk_spin_button_set_wrap( GTK_SPIN_BUTTON( rotate_offset_spinbutton ), TRUE );
1101 hshift_step_spinbutton_adj = gtk_adjustment_new( 0.0, -8192.0, 8192.0, 2.0, 8.0, 8.0 );
1102 hshift_step_spinbutton = gtk_spin_button_new( GTK_ADJUSTMENT( hshift_step_spinbutton_adj ), 1, 2 );
1103 gtk_widget_show( hshift_step_spinbutton );
1104 gtk_table_attach( GTK_TABLE( table1 ), hshift_step_spinbutton, 3, 4, 2, 3,
1105 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1106 (GtkAttachOptions) ( 0 ), 0, 0 );
1107 gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON( hshift_step_spinbutton ), GTK_UPDATE_IF_VALID );
1109 vshift_step_spinbutton_adj = gtk_adjustment_new( 0.0, -8192.0, 8192.0, 2.0, 8.0, 8.0 );
1110 vshift_step_spinbutton = gtk_spin_button_new( GTK_ADJUSTMENT( vshift_step_spinbutton_adj ), 1, 2 );
1111 gtk_widget_show( vshift_step_spinbutton );
1112 gtk_table_attach( GTK_TABLE( table1 ), vshift_step_spinbutton, 3, 4, 4, 5,
1113 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1114 (GtkAttachOptions) ( 0 ), 0, 0 );
1115 gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON( vshift_step_spinbutton ), GTK_UPDATE_IF_VALID );
1117 hscale_step_spinbutton_adj = gtk_adjustment_new( 0.0, -1024.0, 1024.0, 1.0, 4.0, 4.0 );
1118 hscale_step_spinbutton = gtk_spin_button_new( GTK_ADJUSTMENT( hscale_step_spinbutton_adj ), 1, 4 );
1119 gtk_widget_show( hscale_step_spinbutton );
1120 gtk_table_attach( GTK_TABLE( table1 ), hscale_step_spinbutton, 3, 4, 6, 7,
1121 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1122 (GtkAttachOptions) ( 0 ), 0, 0 );
1123 gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON( hscale_step_spinbutton ), GTK_UPDATE_IF_VALID );
1125 vscale_step_spinbutton_adj = gtk_adjustment_new( 0.0, -1024.0, 1024.0, 1.0, 4.0, 4.0 );
1126 vscale_step_spinbutton = gtk_spin_button_new( GTK_ADJUSTMENT( vscale_step_spinbutton_adj ), 1, 4 );
1127 gtk_widget_show( vscale_step_spinbutton );
1128 gtk_table_attach( GTK_TABLE( table1 ), vscale_step_spinbutton, 3, 4, 8, 9,
1129 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1130 (GtkAttachOptions) ( 0 ), 0, 0 );
1131 gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON( vscale_step_spinbutton ), GTK_UPDATE_IF_VALID );
1133 rotate_step_spinbutton_adj = gtk_adjustment_new( 0.0, -360.0, 360.0, 1.0, 10.0, 10.0 );
1134 rotate_step_spinbutton = gtk_spin_button_new( GTK_ADJUSTMENT( rotate_step_spinbutton_adj ), 1, 2 );
1135 gtk_widget_show( rotate_step_spinbutton );
1136 gtk_table_attach( GTK_TABLE( table1 ), rotate_step_spinbutton, 3, 4, 10, 11,
1137 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1138 (GtkAttachOptions) ( 0 ), 0, 0 );
1139 gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON( rotate_step_spinbutton ), GTK_UPDATE_IF_VALID );
1141 eventbox = gtk_event_box_new();
1142 gtk_widget_show( eventbox );
1143 gtk_table_attach( GTK_TABLE( table1 ), eventbox, 2, 3, 12, 13,
1144 (GtkAttachOptions) ( 0 ),
1145 (GtkAttachOptions) ( 0 ), 0, 0 );
1147 eventbox = gtk_event_box_new();
1148 gtk_widget_show( eventbox );
1149 gtk_table_attach( GTK_TABLE( table1 ), eventbox, 0, 1, 12, 13,
1150 (GtkAttachOptions) ( 0 ),
1151 (GtkAttachOptions) ( 0 ), 0, 0 );
1153 eventbox = gtk_event_box_new();
1154 gtk_widget_show( eventbox );
1155 gtk_table_attach( GTK_TABLE( table1 ), eventbox, 0, 1, 0, 1,
1156 (GtkAttachOptions) ( 0 ),
1157 (GtkAttachOptions) ( 0 ), 0, 0 );
1159 viewport7 = gtk_viewport_new( NULL, NULL );
1160 gtk_widget_show( viewport7 );
1161 gtk_box_pack_start( GTK_BOX( vbox7 ), viewport7, FALSE, TRUE, 0 );
1162 gtk_container_set_border_width( GTK_CONTAINER( viewport7 ), 2 );
1163 gtk_viewport_set_shadow_type( GTK_VIEWPORT( viewport7 ), GTK_SHADOW_ETCHED_IN );
1165 table4 = gtk_table_new( 4, 7, FALSE );
1166 gtk_widget_show( table4 );
1167 gtk_container_add( GTK_CONTAINER( viewport7 ), table4 );
1169 viewport5 = gtk_viewport_new( NULL, NULL );
1170 gtk_widget_show( viewport5 );
1171 gtk_table_attach( GTK_TABLE( table4 ), viewport5, 1, 7, 0, 4,
1172 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1173 (GtkAttachOptions) ( 0 ), 0, 0 );
1174 gtk_container_set_border_width( GTK_CONTAINER( viewport5 ), 6 );
1175 gtk_viewport_set_shadow_type( GTK_VIEWPORT( viewport5 ), GTK_SHADOW_ETCHED_OUT );
1177 table5 = gtk_table_new( 2, 3, FALSE );
1178 gtk_widget_show( table5 );
1179 gtk_container_add( GTK_CONTAINER( viewport5 ), table5 );
1180 gtk_container_set_border_width( GTK_CONTAINER( table5 ), 5 );
1181 gtk_table_set_col_spacings( GTK_TABLE( table5 ), 2 );
1183 label = gtk_label_new( "Height" );
1184 gtk_widget_show( label );
1185 gtk_table_attach( GTK_TABLE( table5 ), label, 2, 3, 0, 1,
1186 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1187 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1188 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
1189 gtk_misc_set_alignment( GTK_MISC( label ), 0.5, 1 );
1191 label = gtk_label_new( "Width" );
1192 gtk_widget_show( label );
1193 gtk_table_attach( GTK_TABLE( table5 ), label, 1, 2, 0, 1,
1194 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1195 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1196 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
1197 gtk_misc_set_alignment( GTK_MISC( label ), 0.5, 1 );
1199 fit_width_spinbutton_adj = gtk_adjustment_new( 1, 1, 32, 1, 10, 10 );
1200 fit_width_spinbutton = gtk_spin_button_new( GTK_ADJUSTMENT( fit_width_spinbutton_adj ), 1, 0 );
1201 gtk_widget_show( fit_width_spinbutton );
1202 gtk_table_attach( GTK_TABLE( table5 ), fit_width_spinbutton, 1, 2, 1, 2,
1203 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1204 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1205 gtk_spin_button_set_numeric( GTK_SPIN_BUTTON( fit_width_spinbutton ), TRUE );
1206 gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON( fit_width_spinbutton ), GTK_UPDATE_IF_VALID );
1208 fit_height_spinbutton_adj = gtk_adjustment_new( 1, 1, 32, 1, 10, 10 );
1209 fit_height_spinbutton = gtk_spin_button_new( GTK_ADJUSTMENT( fit_height_spinbutton_adj ), 1, 0 );
1210 gtk_widget_show( fit_height_spinbutton );
1211 gtk_table_attach( GTK_TABLE( table5 ), fit_height_spinbutton, 2, 3, 1, 2,
1212 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1213 (GtkAttachOptions) ( GTK_FILL ), 3, 0 );
1214 gtk_spin_button_set_numeric( GTK_SPIN_BUTTON( fit_height_spinbutton ), TRUE );
1215 gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON( fit_height_spinbutton ), GTK_UPDATE_IF_VALID );
1217 eventbox = gtk_event_box_new();
1218 gtk_widget_show( eventbox );
1219 gtk_table_attach( GTK_TABLE( table5 ), eventbox, 0, 1, 0, 1,
1220 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1221 (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
1223 eventbox = gtk_event_box_new();
1224 gtk_widget_show( eventbox );
1225 gtk_table_attach( GTK_TABLE( table5 ), eventbox, 0, 1, 1, 2,
1226 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1227 (GtkAttachOptions) ( GTK_FILL ), 4, 0 );
1229 fit_button = gtk_button_new_with_mnemonic( " Fit " );
1230 gtk_widget_show( fit_button );
1231 gtk_container_add( GTK_CONTAINER( eventbox ), fit_button );
1233 viewport6 = gtk_viewport_new( NULL, NULL );
1234 gtk_widget_show( viewport6 );
1235 gtk_table_attach( GTK_TABLE( table4 ), viewport6, 0, 1, 0, 4,
1236 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1237 (GtkAttachOptions) ( 0 ), 0, 0 );
1238 gtk_container_set_border_width( GTK_CONTAINER( viewport6 ), 4 );
1239 gtk_viewport_set_shadow_type( GTK_VIEWPORT( viewport6 ), GTK_SHADOW_NONE );
1241 table7 = gtk_table_new( 2, 1, FALSE );
1242 gtk_widget_show( table7 );
1243 gtk_container_add( GTK_CONTAINER( viewport6 ), table7 );
1245 eventbox = gtk_event_box_new();
1246 gtk_widget_show( eventbox );
1247 gtk_table_attach( GTK_TABLE( table7 ), eventbox, 0, 1, 0, 2,
1248 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
1249 (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
1251 axial_button = gtk_button_new_with_mnemonic( "Axial" );
1252 gtk_widget_show( axial_button );
1253 gtk_container_add( GTK_CONTAINER( eventbox ), axial_button );
1254 gtk_widget_set_size_request( axial_button, 56, 29 );
1255 gtk_container_set_border_width( GTK_CONTAINER( axial_button ), 4 );
1257 // Fit in Flags sub-dialog
1258 Create_Quake2FlagsDialog( vbox7 );
1260 viewport10 = gtk_viewport_new( NULL, NULL );
1261 gtk_widget_show( viewport10 );
1262 gtk_box_pack_start( GTK_BOX( vbox7 ), viewport10, FALSE, TRUE, 0 );
1263 gtk_container_set_border_width( GTK_CONTAINER( viewport10 ), 2 );
1264 gtk_viewport_set_shadow_type( GTK_VIEWPORT( viewport10 ), GTK_SHADOW_ETCHED_IN );
1266 hbuttonbox1 = gtk_hbutton_box_new();
1267 gtk_widget_show( hbuttonbox1 );
1268 gtk_container_add( GTK_CONTAINER( viewport10 ), hbuttonbox1 );
1269 gtk_container_set_border_width( GTK_CONTAINER( hbuttonbox1 ), 4 );
1270 gtk_button_box_set_layout( GTK_BUTTON_BOX( hbuttonbox1 ), GTK_BUTTONBOX_SPREAD );
1272 done_button = gtk_button_new();
1273 gtk_widget_show( done_button );
1274 gtk_container_add( GTK_CONTAINER( hbuttonbox1 ), done_button );
1275 GTK_WIDGET_SET_FLAGS( done_button, GTK_CAN_DEFAULT );
1277 alignment1 = gtk_alignment_new( 0.5, 0.5, 0, 0 );
1278 gtk_widget_show( alignment1 );
1279 gtk_container_add( GTK_CONTAINER( done_button ), alignment1 );
1281 hbox2 = gtk_hbox_new( FALSE, 2 );
1282 gtk_widget_show( hbox2 );
1283 gtk_container_add( GTK_CONTAINER( alignment1 ), hbox2 );
1285 image1 = gtk_image_new_from_stock( "gtk-yes", GTK_ICON_SIZE_BUTTON );
1286 gtk_widget_show( image1 );
1287 gtk_box_pack_start( GTK_BOX( hbox2 ), image1, FALSE, FALSE, 0 );
1289 label = gtk_label_new_with_mnemonic( "Done" );
1290 gtk_widget_show( label );
1291 gtk_box_pack_start( GTK_BOX( hbox2 ), label, FALSE, FALSE, 0 );
1292 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
1294 apply_button = gtk_button_new();
1295 gtk_widget_show( apply_button );
1296 gtk_container_add( GTK_CONTAINER( hbuttonbox1 ), apply_button );
1297 GTK_WIDGET_SET_FLAGS( apply_button, GTK_CAN_DEFAULT );
1299 alignment3 = gtk_alignment_new( 0.5, 0.5, 0, 0 );
1300 gtk_widget_show( alignment3 );
1301 gtk_container_add( GTK_CONTAINER( apply_button ), alignment3 );
1303 hbox4 = gtk_hbox_new( FALSE, 2 );
1304 gtk_widget_show( hbox4 );
1305 gtk_container_add( GTK_CONTAINER( alignment3 ), hbox4 );
1307 image3 = gtk_image_new_from_stock( "gtk-apply", GTK_ICON_SIZE_BUTTON );
1308 gtk_widget_show( image3 );
1309 gtk_box_pack_start( GTK_BOX( hbox4 ), image3, FALSE, FALSE, 0 );
1311 label = gtk_label_new_with_mnemonic( "Apply" );
1312 gtk_widget_show( label );
1313 gtk_box_pack_start( GTK_BOX( hbox4 ), label, FALSE, FALSE, 0 );
1314 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
1316 cancel_button = gtk_button_new();
1317 gtk_widget_show( cancel_button );
1318 gtk_container_add( GTK_CONTAINER( hbuttonbox1 ), cancel_button );
1319 GTK_WIDGET_SET_FLAGS( cancel_button, GTK_CAN_DEFAULT );
1321 alignment2 = gtk_alignment_new( 0.5, 0.5, 0, 0 );
1322 gtk_widget_show( alignment2 );
1323 gtk_container_add( GTK_CONTAINER( cancel_button ), alignment2 );
1325 hbox3 = gtk_hbox_new( FALSE, 2 );
1326 gtk_widget_show( hbox3 );
1327 gtk_container_add( GTK_CONTAINER( alignment2 ), hbox3 );
1329 image2 = gtk_image_new_from_stock( "gtk-no", GTK_ICON_SIZE_BUTTON );
1330 gtk_widget_show( image2 );
1331 gtk_box_pack_start( GTK_BOX( hbox3 ), image2, FALSE, FALSE, 0 );
1333 label = gtk_label_new_with_mnemonic( "Cancel" );
1334 gtk_widget_show( label );
1335 gtk_box_pack_start( GTK_BOX( hbox3 ), label, FALSE, FALSE, 0 );
1336 gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
1339 g_signal_connect( (gpointer) SurfaceInspector,
1341 G_CALLBACK( delete_event_callback ),
1343 g_signal_connect( (gpointer) SurfaceInspector, "destroy",
1344 G_CALLBACK( gtk_widget_destroy ),
1347 g_signal_connect( (gpointer) texture_combo_entry, "key_press_event",
1348 G_CALLBACK( on_texture_combo_entry_key_press_event ),
1350 g_signal_connect( (gpointer) texture_combo_entry, "activate",
1351 G_CALLBACK( on_texture_combo_entry_activate ),
1355 g_signal_connect( (gpointer) hshift_offset_spinbutton, "value_changed",
1356 G_CALLBACK( on_hshift_offset_spinbutton_value_changed ),
1358 g_signal_connect( (gpointer) vshift_offset_spinbutton, "value_changed",
1359 G_CALLBACK( on_vshift_offset_spinbutton_value_changed ),
1361 g_signal_connect( (gpointer) hscale_offset_spinbutton, "value_changed",
1362 G_CALLBACK( on_hscale_offset_spinbutton_value_changed ),
1364 g_signal_connect( (gpointer) vscale_offset_spinbutton, "value_changed",
1365 G_CALLBACK( on_vscale_offset_spinbutton_value_changed ),
1367 g_signal_connect( (gpointer) rotate_offset_spinbutton, "value_changed",
1368 G_CALLBACK( on_rotate_offset_spinbutton_value_changed ),
1371 g_signal_connect( (gpointer) hshift_value_spinbutton, "value_changed",
1372 G_CALLBACK( on_hshift_value_spinbutton_value_changed ),
1374 g_signal_connect( (gpointer) vshift_value_spinbutton, "value_changed",
1375 G_CALLBACK( on_vshift_value_spinbutton_value_changed ),
1377 g_signal_connect( (gpointer) hscale_value_spinbutton, "value_changed",
1378 G_CALLBACK( on_hscale_value_spinbutton_value_changed ),
1380 g_signal_connect( (gpointer) vscale_value_spinbutton, "value_changed",
1381 G_CALLBACK( on_vscale_value_spinbutton_value_changed ),
1383 g_signal_connect( (gpointer) rotate_value_spinbutton, "value_changed",
1384 G_CALLBACK( on_rotate_value_spinbutton_value_changed ),
1387 g_signal_connect( (gpointer) hshift_step_spinbutton, "value_changed",
1388 G_CALLBACK( on_hshift_step_spinbutton_value_changed ),
1390 g_signal_connect( (gpointer) vshift_step_spinbutton, "value_changed",
1391 G_CALLBACK( on_vshift_step_spinbutton_value_changed ),
1393 g_signal_connect( (gpointer) hscale_step_spinbutton, "value_changed",
1394 G_CALLBACK( on_hscale_step_spinbutton_value_changed ),
1396 g_signal_connect( (gpointer) vscale_step_spinbutton, "value_changed",
1397 G_CALLBACK( on_vscale_step_spinbutton_value_changed ),
1399 g_signal_connect( (gpointer) rotate_step_spinbutton, "value_changed",
1400 G_CALLBACK( on_rotate_step_spinbutton_value_changed ),
1403 g_signal_connect( (gpointer) match_grid_button, "clicked",
1404 G_CALLBACK( on_match_grid_button_clicked ),
1406 g_signal_connect( (gpointer) lock_valuechange_togglebutton, "toggled",
1407 G_CALLBACK( on_lock_valuechange_togglebutton_toggled ),
1410 g_signal_connect( (gpointer) fit_width_spinbutton, "value_changed",
1411 G_CALLBACK( on_fit_width_spinbutton_value_changed ),
1413 g_signal_connect( (gpointer) fit_height_spinbutton, "value_changed",
1414 G_CALLBACK( on_fit_height_spinbutton_value_changed ),
1416 g_signal_connect( (gpointer) fit_button, "clicked",
1417 G_CALLBACK( on_fit_button_clicked ),
1420 g_signal_connect( (gpointer) axial_button, "clicked",
1421 G_CALLBACK( on_axial_button_clicked ),
1424 g_signal_connect( (gpointer) done_button, "clicked",
1425 G_CALLBACK( on_done_button_clicked ),
1427 g_signal_connect( (gpointer) apply_button, "clicked",
1428 G_CALLBACK( on_apply_button_clicked ),
1430 g_signal_connect( (gpointer) cancel_button, "clicked",
1431 G_CALLBACK( on_cancel_button_clicked ),
1435 return SurfaceInspector;
1440 gboolean on_texture_combo_entry_key_press_event( GtkWidget *widget, GdkEventKey *event,
1441 gpointer user_data ){
1442 // Have Tab activate selection as well as Return
1443 if ( event->keyval == GDK_Tab ) {
1444 g_signal_emit_by_name( texture_combo_entry, "activate" );
1450 void on_texture_combo_entry_activate( GtkEntry *entry, gpointer user_data ){
1451 texdef_t* tmp_texdef;
1452 texdef_t* tmp_orig_texdef;
1453 texdef_to_face_t* temp_texdef_face_list;
1454 char text[128] = { 0 };
1456 if ( !texdef_face_list_empty() && g_bListenChanged ) {
1457 // activate only on entry change
1458 strcpy( text, gtk_entry_get_text( entry ) );
1459 if ( strcmp( old_texture_entry, text ) ) {
1460 // Check for spaces in shader name
1461 if ( text[0] <= ' ' || strchr( text, ' ' ) ) {
1462 Sys_FPrintf( SYS_WRN, "WARNING: spaces in shader names are not allowed, ignoring '%s'\n", text );
1466 for ( temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next )
1468 tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;
1469 tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;
1470 strcpy( old_texture_entry, text );
1471 tmp_texdef->SetName( text );
1480 static void on_hshift_offset_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data ){
1481 texdef_t* tmp_texdef;
1482 texdef_t* tmp_orig_texdef;
1483 texdef_to_face_t* temp_texdef_face_list;
1485 texdef_offset.shift[0] = gtk_spin_button_get_value( GTK_SPIN_BUTTON( hshift_offset_spinbutton ) );
1487 if ( !texdef_face_list_empty() && g_bListenChanged ) {
1488 for ( temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next )
1490 tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;
1491 tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;
1492 if ( is_HShift_conflicting ) {
1493 tmp_texdef->shift[0] = tmp_orig_texdef->shift[0] + texdef_offset.shift[0];
1496 tmp_texdef->shift[0] = texdef_SI_values.shift[0] + texdef_offset.shift[0];
1503 static void on_vshift_offset_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data ){
1504 texdef_t* tmp_texdef;
1505 texdef_t* tmp_orig_texdef;
1506 texdef_to_face_t* temp_texdef_face_list;
1508 texdef_offset.shift[1] = gtk_spin_button_get_value( GTK_SPIN_BUTTON( vshift_offset_spinbutton ) );
1510 if ( !texdef_face_list_empty() && g_bListenChanged ) {
1511 for ( temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next )
1513 tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;
1514 tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;
1515 if ( is_VShift_conflicting ) {
1516 tmp_texdef->shift[1] = tmp_orig_texdef->shift[1] + texdef_offset.shift[1];
1519 tmp_texdef->shift[1] = texdef_SI_values.shift[1] + texdef_offset.shift[1];
1527 static void on_hscale_offset_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data ){
1528 texdef_t* tmp_texdef;
1529 texdef_t* tmp_orig_texdef;
1530 texdef_to_face_t* temp_texdef_face_list;
1532 texdef_offset.scale[0] = gtk_spin_button_get_value( GTK_SPIN_BUTTON( hscale_offset_spinbutton ) );
1534 if ( !texdef_face_list_empty() && g_bListenChanged ) {
1535 for ( temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next )
1537 tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;
1538 tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;
1539 if ( is_HScale_conflicting ) {
1540 tmp_texdef->scale[0] = tmp_orig_texdef->scale[0] + texdef_offset.scale[0];
1543 tmp_texdef->scale[0] = texdef_SI_values.scale[0] + texdef_offset.scale[0];
1552 static void on_vscale_offset_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data ){
1553 texdef_t* tmp_texdef;
1554 texdef_t* tmp_orig_texdef;
1555 texdef_to_face_t* temp_texdef_face_list;
1557 texdef_offset.scale[1] = gtk_spin_button_get_value( GTK_SPIN_BUTTON( vscale_offset_spinbutton ) );
1559 if ( !texdef_face_list_empty() && g_bListenChanged ) {
1560 for ( temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next )
1562 tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;
1563 tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;
1564 if ( is_VScale_conflicting ) {
1565 tmp_texdef->scale[1] = tmp_orig_texdef->scale[1] + texdef_offset.scale[1];
1568 tmp_texdef->scale[1] = texdef_SI_values.scale[1] + texdef_offset.scale[1];
1576 static void on_rotate_offset_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data ){
1577 texdef_t* tmp_texdef;
1578 texdef_t* tmp_orig_texdef;
1579 texdef_to_face_t* temp_texdef_face_list;
1581 texdef_offset.rotate = gtk_spin_button_get_value( GTK_SPIN_BUTTON( rotate_offset_spinbutton ) );
1583 if ( !texdef_face_list_empty() && g_bListenChanged ) {
1584 for ( temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next )
1586 tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;
1587 tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;
1588 if ( is_Rotate_conflicting ) {
1589 tmp_texdef->rotate = tmp_orig_texdef->rotate + texdef_offset.rotate;
1592 tmp_texdef->rotate = texdef_SI_values.rotate + texdef_offset.rotate;
1602 static void on_match_grid_button_clicked( GtkButton *button, gpointer user_data ){
1603 float hscale, vscale;
1605 if ( !strcmp( gtk_entry_get_text( GTK_ENTRY( hscale_value_spinbutton ) ), "" ) ) {
1609 hscale = gtk_spin_button_get_value( GTK_SPIN_BUTTON( hscale_value_spinbutton ) );
1612 if ( !strcmp( gtk_entry_get_text( GTK_ENTRY( vscale_value_spinbutton ) ), "" ) ) {
1616 vscale = gtk_spin_button_get_value( GTK_SPIN_BUTTON( vscale_value_spinbutton ) );
1618 DoSnapTToGrid( hscale, vscale );
1622 // Lock out changes to Value
1623 static void on_lock_valuechange_togglebutton_toggled( GtkToggleButton *togglebutton, gpointer user_data ){
1626 is_Locked = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( lock_valuechange_togglebutton ) );
1628 gtk_widget_set_sensitive( GTK_WIDGET( hscale_value_spinbutton ), is_Locked );
1629 gtk_widget_set_sensitive( GTK_WIDGET( vscale_value_spinbutton ), is_Locked );
1630 gtk_widget_set_sensitive( GTK_WIDGET( hshift_value_spinbutton ), is_Locked );
1631 gtk_widget_set_sensitive( GTK_WIDGET( vshift_value_spinbutton ), is_Locked );
1632 gtk_widget_set_sensitive( GTK_WIDGET( rotate_value_spinbutton ), is_Locked );
1637 static void on_hshift_value_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data ){
1638 texdef_t* tmp_texdef;
1639 texdef_t* tmp_orig_texdef;
1640 texdef_to_face_t* temp_texdef_face_list;
1642 texdef_SI_values.shift[0] = gtk_spin_button_get_value( GTK_SPIN_BUTTON( hshift_value_spinbutton ) );
1644 if ( !texdef_face_list_empty() && g_bListenChanged ) {
1645 for ( temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next )
1647 tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;
1648 tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;
1649 tmp_texdef->shift[0] = texdef_SI_values.shift[0] + texdef_offset.shift[0];
1650 is_HShift_conflicting = FALSE;
1656 static void on_vshift_value_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data ){
1657 texdef_t* tmp_texdef;
1658 texdef_t* tmp_orig_texdef;
1659 texdef_to_face_t* temp_texdef_face_list;
1661 texdef_SI_values.shift[1] = gtk_spin_button_get_value( GTK_SPIN_BUTTON( vshift_value_spinbutton ) );
1663 if ( !texdef_face_list_empty() && g_bListenChanged ) {
1664 for ( temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next )
1666 tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;
1667 tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;
1668 tmp_texdef->shift[1] = texdef_SI_values.shift[1] + texdef_offset.shift[1];
1669 is_VShift_conflicting = FALSE;
1675 static void on_hscale_value_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data ){
1676 texdef_t* tmp_texdef;
1677 texdef_t* tmp_orig_texdef;
1678 texdef_to_face_t* temp_texdef_face_list;
1680 texdef_SI_values.scale[0] = gtk_spin_button_get_value( GTK_SPIN_BUTTON( hscale_value_spinbutton ) );
1682 if ( !texdef_face_list_empty() && g_bListenChanged ) {
1683 for ( temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next )
1685 tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;
1686 tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;
1687 tmp_texdef->scale[0] = texdef_SI_values.scale[0] + texdef_offset.scale[0];
1688 is_HScale_conflicting = FALSE;
1694 static void on_vscale_value_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data ){
1695 texdef_t* tmp_texdef;
1696 texdef_t* tmp_orig_texdef;
1697 texdef_to_face_t* temp_texdef_face_list;
1699 texdef_SI_values.scale[1] = gtk_spin_button_get_value( GTK_SPIN_BUTTON( vscale_value_spinbutton ) );
1701 if ( !texdef_face_list_empty() && g_bListenChanged ) {
1702 for ( temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next )
1704 tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;
1705 tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;
1706 tmp_texdef->scale[1] = texdef_SI_values.scale[1] + texdef_offset.scale[1];
1707 is_VScale_conflicting = FALSE;
1713 static void on_rotate_value_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data ){
1714 texdef_t* tmp_texdef;
1715 texdef_t* tmp_orig_texdef;
1716 texdef_to_face_t* temp_texdef_face_list;
1718 texdef_SI_values.rotate = gtk_spin_button_get_value( GTK_SPIN_BUTTON( rotate_value_spinbutton ) );
1720 if ( !texdef_face_list_empty() && g_bListenChanged ) {
1721 for ( temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next )
1723 tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;
1724 tmp_orig_texdef = (texdef_t *) &temp_texdef_face_list->orig_texdef;
1725 tmp_texdef->rotate = texdef_SI_values.rotate + texdef_offset.rotate;
1726 is_Rotate_conflicting = FALSE;
1734 static void on_hshift_step_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data ){
1736 GtkAdjustment * adjust;
1738 if ( !g_bListenChanged ) {
1742 l_pIncrement = Get_SI_Inc();
1745 Sys_Printf( "OnIncrementChanged HShift\n" );
1748 val = gtk_spin_button_get_value( GTK_SPIN_BUTTON( hshift_step_spinbutton ) ) ;
1749 adjust = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( hshift_offset_spinbutton ) );
1750 adjust->step_increment = val;
1751 adjust = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( hshift_value_spinbutton ) );
1752 adjust->step_increment = val;
1753 l_pIncrement->shift[0] = val;
1756 static void on_vshift_step_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data ){
1758 GtkAdjustment * adjust;
1760 if ( !g_bListenChanged ) {
1764 l_pIncrement = Get_SI_Inc();
1767 Sys_Printf( "OnIncrementChanged VShift\n" );
1770 val = gtk_spin_button_get_value( GTK_SPIN_BUTTON( vshift_step_spinbutton ) ) ;
1771 adjust = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( vshift_offset_spinbutton ) );
1772 adjust->step_increment = val;
1773 adjust = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( vshift_value_spinbutton ) );
1774 adjust->step_increment = val;
1775 l_pIncrement->shift[1] = val;
1778 static void on_hscale_step_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data ){
1780 GtkAdjustment * adjust;
1782 if ( !g_bListenChanged ) {
1786 l_pIncrement = Get_SI_Inc();
1789 Sys_Printf( "OnIncrementChanged HShift\n" );
1792 val = gtk_spin_button_get_value( GTK_SPIN_BUTTON( hscale_step_spinbutton ) ) ;
1793 adjust = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( hscale_offset_spinbutton ) );
1794 adjust->step_increment = val;
1795 adjust = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( hscale_value_spinbutton ) );
1796 adjust->step_increment = val;
1797 l_pIncrement->scale[0] = val;
1800 static void on_vscale_step_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data ){
1802 GtkAdjustment * adjust;
1804 if ( !g_bListenChanged ) {
1808 l_pIncrement = Get_SI_Inc();
1811 Sys_Printf( "OnIncrementChanged HShift\n" );
1814 val = gtk_spin_button_get_value( GTK_SPIN_BUTTON( vscale_step_spinbutton ) ) ;
1815 adjust = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( vscale_offset_spinbutton ) );
1816 adjust->step_increment = val;
1817 adjust = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( vscale_value_spinbutton ) );
1818 adjust->step_increment = val;
1819 l_pIncrement->scale[1] = val;
1822 static void on_rotate_step_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data ){
1824 GtkAdjustment * adjust;
1826 if ( !g_bListenChanged ) {
1830 l_pIncrement = Get_SI_Inc();
1833 Sys_Printf( "OnIncrementChanged HShift\n" );
1836 val = gtk_spin_button_get_value( GTK_SPIN_BUTTON( rotate_step_spinbutton ) ) ;
1837 adjust = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( rotate_offset_spinbutton ) );
1838 adjust->step_increment = val;
1839 adjust = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( rotate_value_spinbutton ) );
1840 adjust->step_increment = val;
1841 l_pIncrement->rotate = val;
1846 static void on_fit_width_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data ){
1847 m_nWidth = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON( fit_width_spinbutton ) );
1850 static void on_fit_height_spinbutton_value_changed( GtkSpinButton *spinbutton, gpointer user_data ){
1851 m_nHeight = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON( fit_height_spinbutton ) );
1854 static void on_fit_button_clicked( GtkButton *button, gpointer user_data ){
1855 FaceList_FitTexture( get_texdef_face_list(), m_nHeight, m_nWidth );
1856 Sys_UpdateWindows( W_ALL );
1861 static void on_axial_button_clicked( GtkButton *button, gpointer user_data ){
1862 texdef_t* tmp_texdef;
1863 // texdef_t* tmp_orig_texdef;
1864 texdef_to_face_t* temp_texdef_face_list;
1866 if ( !texdef_face_list_empty() && g_bListenChanged ) {
1867 for ( temp_texdef_face_list = get_texdef_face_list(); temp_texdef_face_list; temp_texdef_face_list = temp_texdef_face_list->next )
1869 tmp_texdef = (texdef_t *) &temp_texdef_face_list->texdef;
1870 tmp_texdef->shift[0] = 0.0;
1871 tmp_texdef->shift[1] = 0.0;
1872 tmp_texdef->scale[0] = 0.5;
1873 tmp_texdef->scale[1] = 0.5;
1874 tmp_texdef->rotate = 0.0;
1878 SetTexdef_FaceList( get_texdef_face_list(), FALSE, TRUE );
1879 Sys_UpdateWindows( W_ALL );
1884 static void on_done_button_clicked( GtkButton *button, gpointer user_data ){
1885 if ( !texdef_face_list_empty() ) {
1889 Sys_UpdateWindows( W_ALL );
1892 static void on_apply_button_clicked( GtkButton *button, gpointer user_data ){
1893 if ( !g_bListenChanged ) {
1897 if ( !texdef_face_list_empty() ) {
1899 Sys_UpdateWindows( W_CAMERA );
1900 GetTexdefInfo_from_Radiant();
1905 static void on_cancel_button_clicked( GtkButton *button, gpointer user_data ){
1906 texturewin = Texturewin();
1907 texturewin->texdef = g_old_texdef;
1908 // cancel the last do if we own it
1909 if ( ( m_nUndoId == Undo_GetUndoId() ) && ( m_nUndoId != 0 ) ) {
1911 Sys_Printf( "OnCancel calling Undo_Undo\n" );
1913 g_bListenUpdate = false;
1915 g_bListenUpdate = true;