]> git.xonotic.org Git - xonotic/netradiant.git/blob - contrib/prtview/LoadPortalFileDialog.cpp
Radiant:
[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_window_set_transient_for( GTK_WINDOW( file_sel ), GTK_WINDOW( g_pRadiantWnd ) );
80         gtk_window_set_position( GTK_WINDOW( file_sel ),GTK_WIN_POS_CENTER_ON_PARENT );
81         gtk_window_set_modal( GTK_WINDOW( file_sel ), TRUE );
82         gtk_signal_connect( GTK_OBJECT( GTK_FILE_SELECTION( file_sel )->ok_button ), "clicked",
83                                                 GTK_SIGNAL_FUNC( file_sel_callback ), GINT_TO_POINTER( IDOK ) );
84         gtk_signal_connect( GTK_OBJECT( GTK_FILE_SELECTION( file_sel )->cancel_button ), "clicked",
85                                                 GTK_SIGNAL_FUNC( file_sel_callback ), GINT_TO_POINTER( IDCANCEL ) );
86         gtk_signal_connect( GTK_OBJECT( file_sel ), "delete_event",
87                                                 GTK_SIGNAL_FUNC( dialog_delete_callback ), NULL );
88         gtk_file_selection_hide_fileop_buttons( GTK_FILE_SELECTION( file_sel ) );
89
90         g_object_set_data( G_OBJECT( file_sel ), "loop", &loop );
91         g_object_set_data( G_OBJECT( file_sel ), "filename", &filename );
92         gtk_file_selection_set_filename( GTK_FILE_SELECTION( file_sel ), portals.fn );
93
94         gtk_grab_add( file_sel );
95         gtk_widget_show( file_sel );
96
97         while ( loop )
98                 gtk_main_iteration();
99
100         gtk_grab_remove( file_sel );
101         gtk_widget_destroy( file_sel );
102
103         if ( filename != NULL ) {
104                 strcpy( portals.fn, filename );
105                 gtk_entry_set_text( GTK_ENTRY( data ), filename );
106                 g_free( filename );
107         }
108 }
109
110 int DoLoadPortalFileDialog(){
111         GtkWidget *dlg, *vbox, *hbox, *button, *entry, *check2d, *check3d;
112         int loop = 1, ret = IDCANCEL;
113
114         dlg = gtk_window_new( GTK_WINDOW_TOPLEVEL );
115         gtk_window_set_transient_for( GTK_WINDOW( dlg ), GTK_WINDOW( g_pRadiantWnd ) );
116         gtk_window_set_position( GTK_WINDOW( dlg ),GTK_WIN_POS_CENTER_ON_PARENT );
117         gtk_window_set_modal( GTK_WINDOW( dlg ), TRUE );
118         gtk_window_set_title( GTK_WINDOW( dlg ), "Load .prt" );
119         gtk_signal_connect( GTK_OBJECT( dlg ), "delete_event",
120                                                 GTK_SIGNAL_FUNC( dialog_delete_callback ), NULL );
121         gtk_signal_connect( GTK_OBJECT( dlg ), "destroy",
122                                                 GTK_SIGNAL_FUNC( gtk_widget_destroy ), NULL );
123         g_object_set_data( G_OBJECT( dlg ), "loop", &loop );
124         g_object_set_data( G_OBJECT( dlg ), "ret", &ret );
125
126         vbox = gtk_vbox_new( FALSE, 5 );
127         gtk_widget_show( vbox );
128         gtk_container_add( GTK_CONTAINER( dlg ), vbox );
129         gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
130
131         entry = gtk_entry_new();
132         gtk_widget_show( entry );
133         gtk_entry_set_editable( GTK_ENTRY( entry ), FALSE );
134         gtk_box_pack_start( GTK_BOX( vbox ), entry, FALSE, FALSE, 0 );
135
136         hbox = gtk_hbox_new( FALSE, 5 );
137         gtk_widget_show( hbox );
138         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
139
140         check3d = gtk_check_button_new_with_label( "Show 3D" );
141         gtk_widget_show( check3d );
142         gtk_box_pack_start( GTK_BOX( hbox ), check3d, FALSE, FALSE, 0 );
143
144         check2d = gtk_check_button_new_with_label( "Show 2D" );
145         gtk_widget_show( check2d );
146         gtk_box_pack_start( GTK_BOX( hbox ), check2d, FALSE, FALSE, 0 );
147
148         button = gtk_button_new_with_label( "Change" );
149         gtk_widget_show( button );
150         gtk_box_pack_end( GTK_BOX( hbox ), button, FALSE, FALSE, 0 );
151         gtk_signal_connect( GTK_OBJECT( button ), "clicked", GTK_SIGNAL_FUNC( change_clicked ), entry );
152         gtk_widget_set_usize( button, 60, -2 );
153
154         hbox = gtk_hbox_new( FALSE, 5 );
155         gtk_widget_show( hbox );
156         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
157
158         button = gtk_button_new_with_label( "Cancel" );
159         gtk_widget_show( button );
160         gtk_box_pack_end( GTK_BOX( hbox ), button, FALSE, FALSE, 0 );
161         gtk_signal_connect( GTK_OBJECT( button ), "clicked",
162                                                 GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( IDCANCEL ) );
163         gtk_widget_set_usize( button, 60, -2 );
164
165         button = gtk_button_new_with_label( "OK" );
166         gtk_widget_show( button );
167         gtk_box_pack_end( GTK_BOX( hbox ), button, FALSE, FALSE, 0 );
168         gtk_signal_connect( GTK_OBJECT( button ), "clicked",
169                                                 GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( IDOK ) );
170         gtk_widget_set_usize( button, 60, -2 );
171
172         strcpy( portals.fn, GlobalRadiant().getMapName() );
173         char* fn = strrchr( portals.fn, '.' );
174         if ( fn != NULL ) {
175                 strcpy( fn, ".prt" );
176         }
177
178         StringOutputStream value( 256 );
179         value << portals.fn;
180         gtk_entry_set_text( GTK_ENTRY( entry ), value.c_str() );
181         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( check2d ), portals.show_2d );
182         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( check3d ), portals.show_3d );
183
184         gtk_grab_add( dlg );
185         gtk_widget_show( dlg );
186
187         while ( loop )
188                 gtk_main_iteration();
189
190         if ( ret == IDOK ) {
191                 portals.Purge();
192
193                 portals.show_3d = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( check3d ) ) ? true : false;
194                 portals.show_2d = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( check2d ) ) ? true : false;
195         }
196
197         gtk_grab_remove( dlg );
198         gtk_widget_destroy( dlg );
199
200         return ret;
201 }