transfer from internal tree r5311 branches/1.4-gpl
[xonotic/netradiant.git] / radiant / bp_dlg.cpp
1 /*\r
2 Copyright (C) 1999-2007 id Software, Inc. and contributors.\r
3 For a list of contributors, see the accompanying CONTRIBUTORS file.\r
4 \r
5 This file is part of GtkRadiant.\r
6 \r
7 GtkRadiant is free software; you can redistribute it and/or modify\r
8 it under the terms of the GNU General Public License as published by\r
9 the Free Software Foundation; either version 2 of the License, or\r
10 (at your option) any later version.\r
11 \r
12 GtkRadiant is distributed in the hope that it will be useful,\r
13 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
15 GNU General Public License for more details.\r
16 \r
17 You should have received a copy of the GNU General Public License\r
18 along with GtkRadiant; if not, write to the Free Software\r
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\r
20 */\r
21 \r
22 //-----------------------------------------------------------------------------\r
23 //\r
24 // DESCRIPTION\r
25 //\r
26 // custom Gtk dialog for brush primitives load/save\r
27 \r
28 #include "stdafx.h"\r
29 \r
30 void BP_dialog_button_callback (GtkWidget *widget, gpointer data)\r
31 {\r
32   GtkWidget *parent;\r
33   int *loop, *ret;\r
34 \r
35   parent = gtk_widget_get_toplevel (widget);\r
36   loop = (int*)g_object_get_data (G_OBJECT (parent), "loop");\r
37   ret = (int*)g_object_get_data (G_OBJECT (parent), "ret");\r
38 \r
39   *loop = 0;\r
40   *ret = (int)data;\r
41 }\r
42 \r
43 gint BP_dialog_delete_callback (GtkWidget *widget, GdkEvent* event, gpointer data)\r
44 {\r
45   int *loop;\r
46 \r
47   gtk_widget_hide (widget);\r
48   loop = (int*)g_object_get_data (G_OBJECT (widget), "loop");\r
49   *loop = 0;\r
50 \r
51   return TRUE;\r
52 }\r
53 \r
54 // ret: 0 = abort, 1 = load and convert, 2 = changed project settings, load and don't convert\r
55 // the user might decide to switch the BP mode in project settings\r
56 // status: 0 = loading regular, got conflict 1 = loading BP, got conflict\r
57 // int WINAPI gtk_MessageBox (GtkWidget *parent, const char* lpText, const char* lpCaption, guint32 uType)\r
58 int BP_MessageBox (int status)\r
59 {\r
60   GtkWidget *window, *w, *vbox, *hbox;\r
61   GtkAccelGroup *accel;\r
62   int ret, loop = 1;\r
63 \r
64   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
65   gtk_signal_connect (GTK_OBJECT (window), "delete_event",\r
66                       GTK_SIGNAL_FUNC (BP_dialog_delete_callback), NULL);\r
67   gtk_signal_connect (GTK_OBJECT (window), "destroy",\r
68                       GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
69 \r
70   gtk_window_set_title (GTK_WINDOW (window), "Current map format is incompatible");\r
71 \r
72   gtk_container_border_width (GTK_CONTAINER (window), 10);\r
73   g_object_set_data (G_OBJECT (window), "loop", &loop);\r
74   g_object_set_data (G_OBJECT (window), "ret", &ret);\r
75   gtk_widget_realize (window);\r
76 \r
77   gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (g_pParentWnd->m_pWidget));\r
78 \r
79   accel = gtk_accel_group_new ();\r
80   gtk_window_add_accel_group (GTK_WINDOW (window), accel);\r
81 \r
82   vbox = gtk_vbox_new (FALSE, 10);\r
83   gtk_container_add (GTK_CONTAINER (window), vbox);\r
84   gtk_widget_show (vbox);\r
85 \r
86   if (status == 0)\r
87   {\r
88     w = gtk_label_new ("This map was saved using brush primitives format\n"\r
89       "and your project settings use the standard format.\n"\r
90       "Do you want to convert the map, change default format or abort?\n"\r
91       "NOTE: due to limitations of the standard format, "\r
92       "some texture alignments may be lost after conversion.");\r
93   }\r
94   else\r
95   {\r
96     w = gtk_label_new ("This map was saved using standard format\n"\r
97       "and your project settings use the new \"brush primitives\" format.\n"\r
98       "Do you want to convert the map, change default format or abort?\n"\r
99       "NOTE: Next versions of Radiant will allow mixing the two formats"\r
100       "in the same maps for a smooth transition.");\r
101   }\r
102   gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);\r
103   gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);\r
104   gtk_widget_show (w);\r
105 \r
106   w = gtk_hseparator_new ();\r
107   gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);\r
108   gtk_widget_show (w);\r
109 \r
110   hbox = gtk_hbox_new (FALSE, 10);\r
111   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);\r
112   gtk_widget_show (hbox);\r
113   \r
114   w = gtk_button_new_with_label ("Convert");\r
115   gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);\r
116   gtk_signal_connect (GTK_OBJECT (w), "clicked",\r
117     GTK_SIGNAL_FUNC (BP_dialog_button_callback), GINT_TO_POINTER (1));\r
118   GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);\r
119   gtk_widget_grab_default (w);\r
120   gtk_widget_show (w);\r
121   \r
122   w = gtk_button_new_with_label ("Change default");\r
123   gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);\r
124   gtk_signal_connect (GTK_OBJECT (w), "clicked",\r
125     GTK_SIGNAL_FUNC (BP_dialog_button_callback), GINT_TO_POINTER (2));\r
126   gtk_widget_show (w);\r
127   \r
128   w = gtk_button_new_with_label ("Abort load");\r
129   gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);\r
130   gtk_signal_connect (GTK_OBJECT (w), "clicked",\r
131     GTK_SIGNAL_FUNC (BP_dialog_button_callback), GINT_TO_POINTER (0));\r
132   gtk_widget_show (w);\r
133   ret = 0; // abort\r
134   \r
135   gtk_widget_show (window);\r
136   gtk_grab_add (window);\r
137 \r
138   while (loop)\r
139     gtk_main_iteration ();\r
140 \r
141   if (ret == 2)\r
142   {\r
143     // change project settings\r
144     if (status == 0)\r
145       g_qeglobals.m_bBrushPrimitMode = TRUE;\r
146     else\r
147       g_qeglobals.m_bBrushPrimitMode = FALSE;\r
148     SetKeyValue(g_qeglobals.d_project_entity, "brush_primit", (g_qeglobals.m_bBrushPrimitMode ? "1" : "0" ));\r
149   }\r
150 \r
151   gtk_grab_remove (window);\r
152   gtk_widget_destroy (window);\r
153 \r
154   return ret;\r
155 }\r