]> git.xonotic.org Git - xonotic/netradiant.git/blob - contrib/prtview/LoadPortalFileDialog.cpp
uncrustify! now the code is only ugly on the *inside*
[xonotic/netradiant.git] / contrib / prtview / LoadPortalFileDialog.cpp
1 /*
2    PrtView plugin for GtkRadiant
3    Copyright (C) 2001 Geoffrey Dewan, Loki software and qeradiant.com
4
5    This library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    This library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with this library; if not, write to the Free Software
17    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  */
19
20 // LoadPortalFileDialog.cpp : implementation file
21 //
22
23 #include "stdafx.h"
24
25 #ifdef _DEBUG
26 #define new DEBUG_NEW
27 #undef THIS_FILE
28 //static char THIS_FILE[] = __FILE__;
29 #endif
30
31 static void dialog_button_callback( GtkWidget *widget, gpointer data ){
32         GtkWidget *parent;
33         int *loop, *ret;
34
35         parent = gtk_widget_get_toplevel( widget );
36         loop = (int*)g_object_get_data( G_OBJECT( parent ), "loop" );
37         ret = (int*)g_object_get_data( G_OBJECT( parent ), "ret" );
38
39         *loop = 0;
40         *ret = (int)data;
41 }
42
43 static gint dialog_delete_callback( GtkWidget *widget, GdkEvent* event, gpointer data ){
44         int *loop;
45
46         gtk_widget_hide( widget );
47         loop = (int*)g_object_get_data( G_OBJECT( widget ), "loop" );
48         *loop = 0;
49
50         return TRUE;
51 }
52
53 static void file_sel_callback( GtkWidget *widget, gpointer data ){
54         GtkWidget *parent;
55         int *loop;
56         char **filename;
57
58         parent = gtk_widget_get_toplevel( widget );
59         loop = (int*)g_object_get_data( G_OBJECT( parent ), "loop" );
60         filename = (char**)g_object_get_data( G_OBJECT( parent ), "filename" );
61
62         *loop = 0;
63         if ( (int)data == IDOK ) {
64                 *filename = g_strdup( gtk_file_selection_get_filename( GTK_FILE_SELECTION( parent ) ) );
65         }
66 }
67
68 static void change_clicked( GtkWidget *widget, gpointer data ){
69         GtkWidget* file_sel;
70         char* filename = NULL;
71         int loop = 1;
72
73         file_sel = gtk_file_selection_new( "Locate portal (.prt) file" );
74         gtk_signal_connect( GTK_OBJECT( GTK_FILE_SELECTION( file_sel )->ok_button ), "clicked",
75                                                 GTK_SIGNAL_FUNC( file_sel_callback ), GINT_TO_POINTER( IDOK ) );
76         gtk_signal_connect( GTK_OBJECT( GTK_FILE_SELECTION( file_sel )->cancel_button ), "clicked",
77                                                 GTK_SIGNAL_FUNC( file_sel_callback ), GINT_TO_POINTER( IDCANCEL ) );
78         gtk_signal_connect( GTK_OBJECT( file_sel ), "delete_event",
79                                                 GTK_SIGNAL_FUNC( dialog_delete_callback ), NULL );
80         gtk_file_selection_hide_fileop_buttons( GTK_FILE_SELECTION( file_sel ) );
81
82         g_object_set_data( G_OBJECT( file_sel ), "loop", &loop );
83         g_object_set_data( G_OBJECT( file_sel ), "filename", &filename );
84         gtk_file_selection_set_filename( GTK_FILE_SELECTION( file_sel ), portals.fn );
85
86         gtk_grab_add( file_sel );
87         gtk_widget_show( file_sel );
88
89         while ( loop )
90                 gtk_main_iteration();
91
92         gtk_grab_remove( file_sel );
93         gtk_widget_destroy( file_sel );
94
95         if ( filename != NULL ) {
96                 strcpy( portals.fn, filename );
97                 gtk_entry_set_text( GTK_ENTRY( data ), filename );
98                 g_free( filename );
99         }
100 }
101
102 int DoLoadPortalFileDialog(){
103         GtkWidget *dlg, *vbox, *hbox, *button, *entry, *check2d, *check3d;
104         int loop = 1, ret = IDCANCEL;
105
106         dlg = gtk_window_new( GTK_WINDOW_TOPLEVEL );
107         gtk_window_set_title( GTK_WINDOW( dlg ), "Load .prt" );
108         gtk_signal_connect( GTK_OBJECT( dlg ), "delete_event",
109                                                 GTK_SIGNAL_FUNC( dialog_delete_callback ), NULL );
110         gtk_signal_connect( GTK_OBJECT( dlg ), "destroy",
111                                                 GTK_SIGNAL_FUNC( gtk_widget_destroy ), NULL );
112         g_object_set_data( G_OBJECT( dlg ), "loop", &loop );
113         g_object_set_data( G_OBJECT( dlg ), "ret", &ret );
114
115         vbox = gtk_vbox_new( FALSE, 5 );
116         gtk_widget_show( vbox );
117         gtk_container_add( GTK_CONTAINER( dlg ), vbox );
118         gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
119
120         entry = gtk_entry_new();
121         gtk_widget_show( entry );
122         gtk_entry_set_editable( GTK_ENTRY( entry ), FALSE );
123         gtk_box_pack_start( GTK_BOX( vbox ), entry, FALSE, FALSE, 0 );
124
125         hbox = gtk_hbox_new( FALSE, 5 );
126         gtk_widget_show( hbox );
127         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
128
129         check3d = gtk_check_button_new_with_label( "Show 3D" );
130         gtk_widget_show( check3d );
131         gtk_box_pack_start( GTK_BOX( hbox ), check3d, FALSE, FALSE, 0 );
132
133         check2d = gtk_check_button_new_with_label( "Show 2D" );
134         gtk_widget_show( check2d );
135         gtk_box_pack_start( GTK_BOX( hbox ), check2d, FALSE, FALSE, 0 );
136
137         button = gtk_button_new_with_label( "Change" );
138         gtk_widget_show( button );
139         gtk_box_pack_end( GTK_BOX( hbox ), button, FALSE, FALSE, 0 );
140         gtk_signal_connect( GTK_OBJECT( button ), "clicked", GTK_SIGNAL_FUNC( change_clicked ), entry );
141         gtk_widget_set_usize( button, 60, -2 );
142
143         hbox = gtk_hbox_new( FALSE, 5 );
144         gtk_widget_show( hbox );
145         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
146
147         button = gtk_button_new_with_label( "Cancel" );
148         gtk_widget_show( button );
149         gtk_box_pack_end( GTK_BOX( hbox ), button, FALSE, FALSE, 0 );
150         gtk_signal_connect( GTK_OBJECT( button ), "clicked",
151                                                 GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( IDCANCEL ) );
152         gtk_widget_set_usize( button, 60, -2 );
153
154         button = gtk_button_new_with_label( "OK" );
155         gtk_widget_show( button );
156         gtk_box_pack_end( GTK_BOX( hbox ), button, FALSE, FALSE, 0 );
157         gtk_signal_connect( GTK_OBJECT( button ), "clicked",
158                                                 GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( IDOK ) );
159         gtk_widget_set_usize( button, 60, -2 );
160
161         char *fn = g_FuncTable.m_pfnGetMapName();
162         strcpy( portals.fn, fn );
163         fn = strrchr( portals.fn, '.' );
164         if ( fn != NULL ) {
165                 *fn = '\0';
166                 strcat( portals.fn, ".prt" );
167         }
168
169         gtk_entry_set_text( GTK_ENTRY( entry ), portals.fn );
170         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( check2d ), portals.show_2d );
171         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( check3d ), portals.show_3d );
172
173         gtk_grab_add( dlg );
174         gtk_widget_show( dlg );
175
176         while ( loop )
177                 gtk_main_iteration();
178
179         if ( ret == IDOK ) {
180                 portals.Purge();
181
182                 portals.show_3d = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( check3d ) ) ? true : false;
183                 portals.show_2d = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( check2d ) ) ? true : false;
184         }
185
186         gtk_grab_remove( dlg );
187         gtk_widget_destroy( dlg );
188
189         return ret;
190 }