/* PrtView plugin for GtkRadiant Copyright (C) 2001 Geoffrey Dewan, Loki software and qeradiant.com This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ // LoadPortalFileDialog.cpp : implementation file // #include "LoadPortalFileDialog.h" #include #include #include "stream/stringstream.h" #include "convert.h" #include "gtkutil/pointer.h" #include "qerplugin.h" #include "prtview.h" #include "portals.h" static void dialog_button_callback( ui::Widget widget, gpointer data ){ int *loop, *ret; auto parent = widget.window(); loop = (int*)g_object_get_data( G_OBJECT( parent ), "loop" ); ret = (int*)g_object_get_data( G_OBJECT( parent ), "ret" ); *loop = 0; *ret = gpointer_to_int( data ); } static gint dialog_delete_callback( ui::Widget widget, GdkEvent* event, gpointer data ){ widget.hide(); int *loop = (int *) g_object_get_data(G_OBJECT(widget), "loop"); *loop = 0; return TRUE; } static void change_clicked( GtkWidget *widget, gpointer data ){ GtkWidget* file_sel; char* filename = NULL; file_sel = gtk_file_chooser_dialog_new ( "Locate portal (.prt) file", nullptr, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, nullptr); gtk_file_chooser_set_filename( GTK_FILE_CHOOSER(file_sel), portals.fn ); if (gtk_dialog_run (GTK_DIALOG (file_sel)) == GTK_RESPONSE_ACCEPT) { filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (file_sel)); } ui::Widget(file_sel).destroy(); if ( filename != NULL ) { strcpy( portals.fn, filename ); gtk_entry_set_text( GTK_ENTRY( data ), filename ); g_free( filename ); } } int DoLoadPortalFileDialog(){ int loop = 1, ret = IDCANCEL; auto dlg = ui::Window( ui::window_type::TOP ); gtk_window_set_title( dlg, "Load .prt" ); dlg.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), NULL ); dlg.connect( "destroy", G_CALLBACK( gtk_widget_destroy ), NULL ); g_object_set_data( G_OBJECT( dlg ), "loop", &loop ); g_object_set_data( G_OBJECT( dlg ), "ret", &ret ); auto vbox = ui::VBox( FALSE, 5 ); vbox.show(); dlg.add(vbox); gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 ); auto entry = ui::Entry(ui::New); entry.show(); gtk_editable_set_editable( GTK_EDITABLE( entry ), FALSE ); vbox.pack_start( entry, FALSE, FALSE, 0 ); auto hbox = ui::HBox( FALSE, 5 ); hbox.show(); vbox.pack_start( hbox, FALSE, FALSE, 0 ); auto check3d = ui::CheckButton( "Show 3D" ); check3d.show(); hbox.pack_start( check3d, FALSE, FALSE, 0 ); auto check2d = ui::CheckButton( "Show 2D" ); check2d.show(); hbox.pack_start( check2d, FALSE, FALSE, 0 ); auto button = ui::Button( "Change" ); button.show(); hbox.pack_end(button, FALSE, FALSE, 0); button.connect( "clicked", G_CALLBACK( change_clicked ), entry ); button.dimensions(60, -1); hbox = ui::HBox( FALSE, 5 ); hbox.show(); vbox.pack_start( hbox, FALSE, FALSE, 0 ); button = ui::Button( "Cancel" ); button.show(); hbox.pack_end(button, FALSE, FALSE, 0); button.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( IDCANCEL ) ); button.dimensions(60, -1); button = ui::Button( "OK" ); button.show(); hbox.pack_end(button, FALSE, FALSE, 0); button.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( IDOK ) ); button.dimensions(60, -1); strcpy( portals.fn, GlobalRadiant().getMapName() ); char* fn = strrchr( portals.fn, '.' ); if ( fn != NULL ) { strcpy( fn, ".prt" ); } StringOutputStream value( 256 ); value << portals.fn; gtk_entry_set_text( GTK_ENTRY( entry ), value.c_str() ); gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( check2d ), portals.show_2d ); gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( check3d ), portals.show_3d ); gtk_grab_add( dlg ); dlg.show(); while ( loop ) gtk_main_iteration(); if ( ret == IDOK ) { portals.Purge(); portals.show_3d = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( check3d ) ) ? true : false; portals.show_2d = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( check2d ) ) ? true : false; } gtk_grab_remove( dlg ); dlg.destroy(); return ret; }