]> git.xonotic.org Git - xonotic/netradiant.git/blob - contrib/prtview/LoadPortalFileDialog.cpp
f3d4df8d06a0104867dd8d1b259e9d9b168a1016
[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 "LoadPortalFileDialog.h"
24
25 #include <gtk/gtk.h>
26 #include <gtkutil/pointer.h>
27 #include "stream/stringstream.h"
28 #include "convert.h"
29 #include "gtkutil/pointer.h"
30
31 #include "qerplugin.h"
32
33 #include "prtview.h"
34 #include "portals.h"
35
36 static void dialog_button_callback( GtkWidget *widget, gpointer data ){
37         GtkWidget *parent;
38         int *loop, *ret;
39
40         parent = gtk_widget_get_toplevel( widget );
41         loop = (int*)g_object_get_data( G_OBJECT( parent ), "loop" );
42         ret = (int*)g_object_get_data( G_OBJECT( parent ), "ret" );
43
44         *loop = 0;
45         *ret = gpointer_to_int( data );
46 }
47
48 static gint dialog_delete_callback( GtkWidget *widget, GdkEvent* event, gpointer data ){
49         int *loop;
50
51         gtk_widget_hide( widget );
52         loop = (int*)g_object_get_data( G_OBJECT( widget ), "loop" );
53         *loop = 0;
54
55         return TRUE;
56 }
57
58 static void file_sel_callback( GtkWidget *widget, gpointer data ){
59         GtkWidget *parent;
60         int *loop;
61         char **filename;
62
63         parent = gtk_widget_get_toplevel( widget );
64         loop = (int*)g_object_get_data( G_OBJECT( parent ), "loop" );
65         filename = (char**)g_object_get_data( G_OBJECT( parent ), "filename" );
66
67         *loop = 0;
68         if ( gpointer_to_int( data ) == IDOK ) {
69                 *filename = g_strdup( gtk_file_selection_get_filename( GTK_FILE_SELECTION( parent ) ) );
70         }
71 }
72
73 static void change_clicked( GtkWidget *widget, gpointer data ){
74         GtkWidget* file_sel;
75         char* filename = NULL;
76         int loop = 1;
77
78         file_sel = gtk_file_selection_new( "Locate portal (.prt) file" );
79         gtk_signal_connect( GTK_OBJECT( GTK_FILE_SELECTION( file_sel )->ok_button ), "clicked",
80                                                 GTK_SIGNAL_FUNC( file_sel_callback ), GINT_TO_POINTER( IDOK ) );
81         gtk_signal_connect( GTK_OBJECT( GTK_FILE_SELECTION( file_sel )->cancel_button ), "clicked",
82                                                 GTK_SIGNAL_FUNC( file_sel_callback ), GINT_TO_POINTER( IDCANCEL ) );
83         gtk_signal_connect( GTK_OBJECT( file_sel ), "delete_event",
84                                                 GTK_SIGNAL_FUNC( dialog_delete_callback ), NULL );
85         gtk_file_selection_hide_fileop_buttons( GTK_FILE_SELECTION( file_sel ) );
86
87         g_object_set_data( G_OBJECT( file_sel ), "loop", &loop );
88         g_object_set_data( G_OBJECT( file_sel ), "filename", &filename );
89         gtk_file_selection_set_filename( GTK_FILE_SELECTION( file_sel ), portals.fn );
90
91         gtk_grab_add( file_sel );
92         gtk_widget_show( file_sel );
93
94         while ( loop )
95                 gtk_main_iteration();
96
97         gtk_grab_remove( file_sel );
98         gtk_widget_destroy( file_sel );
99
100         if ( filename != NULL ) {
101                 strcpy( portals.fn, filename );
102                 gtk_entry_set_text( GTK_ENTRY( data ), filename );
103                 g_free( filename );
104         }
105 }
106
107 int DoLoadPortalFileDialog(){
108         GtkWidget *dlg, *vbox, *hbox, *button, *entry, *check2d, *check3d;
109         int loop = 1, ret = IDCANCEL;
110
111         dlg = gtk_window_new( GTK_WINDOW_TOPLEVEL );
112         gtk_window_set_title( GTK_WINDOW( dlg ), "Load .prt" );
113         gtk_signal_connect( GTK_OBJECT( dlg ), "delete_event",
114                                                 GTK_SIGNAL_FUNC( dialog_delete_callback ), NULL );
115         gtk_signal_connect( GTK_OBJECT( dlg ), "destroy",
116                                                 GTK_SIGNAL_FUNC( gtk_widget_destroy ), NULL );
117         g_object_set_data( G_OBJECT( dlg ), "loop", &loop );
118         g_object_set_data( G_OBJECT( dlg ), "ret", &ret );
119
120         vbox = gtk_vbox_new( FALSE, 5 );
121         gtk_widget_show( vbox );
122         gtk_container_add( GTK_CONTAINER( dlg ), vbox );
123         gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
124
125         entry = gtk_entry_new();
126         gtk_widget_show( entry );
127         gtk_entry_set_editable( GTK_ENTRY( entry ), FALSE );
128         gtk_box_pack_start( GTK_BOX( vbox ), entry, FALSE, FALSE, 0 );
129
130         hbox = gtk_hbox_new( FALSE, 5 );
131         gtk_widget_show( hbox );
132         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
133
134         check3d = gtk_check_button_new_with_label( "Show 3D" );
135         gtk_widget_show( check3d );
136         gtk_box_pack_start( GTK_BOX( hbox ), check3d, FALSE, FALSE, 0 );
137
138         check2d = gtk_check_button_new_with_label( "Show 2D" );
139         gtk_widget_show( check2d );
140         gtk_box_pack_start( GTK_BOX( hbox ), check2d, FALSE, FALSE, 0 );
141
142         button = gtk_button_new_with_label( "Change" );
143         gtk_widget_show( button );
144         gtk_box_pack_end( GTK_BOX( hbox ), button, FALSE, FALSE, 0 );
145         gtk_signal_connect( GTK_OBJECT( button ), "clicked", GTK_SIGNAL_FUNC( change_clicked ), entry );
146         gtk_widget_set_usize( button, 60, -2 );
147
148         hbox = gtk_hbox_new( FALSE, 5 );
149         gtk_widget_show( hbox );
150         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
151
152         button = gtk_button_new_with_label( "Cancel" );
153         gtk_widget_show( button );
154         gtk_box_pack_end( GTK_BOX( hbox ), button, FALSE, FALSE, 0 );
155         gtk_signal_connect( GTK_OBJECT( button ), "clicked",
156                                                 GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( IDCANCEL ) );
157         gtk_widget_set_usize( button, 60, -2 );
158
159         button = gtk_button_new_with_label( "OK" );
160         gtk_widget_show( button );
161         gtk_box_pack_end( GTK_BOX( hbox ), button, FALSE, FALSE, 0 );
162         gtk_signal_connect( GTK_OBJECT( button ), "clicked",
163                                                 GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( IDOK ) );
164         gtk_widget_set_usize( button, 60, -2 );
165
166         strcpy( portals.fn, GlobalRadiant().getMapName() );
167         char* fn = strrchr( portals.fn, '.' );
168         if ( fn != NULL ) {
169                 strcpy( fn, ".prt" );
170         }
171
172         StringOutputStream value( 256 );
173         value << portals.fn;
174         gtk_entry_set_text( GTK_ENTRY( entry ), value.c_str() );
175         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( check2d ), portals.show_2d );
176         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( check3d ), portals.show_3d );
177
178         gtk_grab_add( dlg );
179         gtk_widget_show( dlg );
180
181         while ( loop )
182                 gtk_main_iteration();
183
184         if ( ret == IDOK ) {
185                 portals.Purge();
186
187                 portals.show_3d = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( check3d ) ) ? true : false;
188                 portals.show_2d = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( check2d ) ) ? true : false;
189         }
190
191         gtk_grab_remove( dlg );
192         gtk_widget_destroy( dlg );
193
194         return ret;
195 }