-/*\r
-Copyright (C) 1999-2007 id Software, Inc. and contributors.\r
-For a list of contributors, see the accompanying CONTRIBUTORS file.\r
-\r
-This file is part of GtkRadiant.\r
-\r
-GtkRadiant is free software; you can redistribute it and/or modify\r
-it under the terms of the GNU General Public License as published by\r
-the Free Software Foundation; either version 2 of the License, or\r
-(at your option) any later version.\r
-\r
-GtkRadiant is distributed in the hope that it will be useful,\r
-but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
-GNU General Public License for more details.\r
-\r
-You should have received a copy of the GNU General Public License\r
-along with GtkRadiant; if not, write to the Free Software\r
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
-*/\r
-\r
-//\r
-// Base dialog class, provides a way to run modal dialogs and\r
-// set/get the widget values in member variables.\r
-//\r
-// Leonardo Zide (leo@lokigames.com)\r
-//\r
-\r
-#include "stdafx.h"\r
-#include <gtk/gtk.h>\r
-#include <stdlib.h>\r
-#include <stdio.h>\r
-\r
-typedef struct\r
-{\r
- GtkObject *object;\r
- void *buffer;\r
- DLG_DATA_TYPE type;\r
-} DLG_DATA;\r
-\r
-// =============================================================================\r
-// Dialog class\r
-\r
-Dialog::Dialog ()\r
-{\r
- m_pDataList = (GSList*)NULL;\r
- m_nReturn = IDCANCEL;\r
- m_bNeedBuild = true;\r
- m_nLoop = 0;\r
-}\r
-\r
-Dialog::~Dialog ()\r
-{\r
- while (m_pDataList)\r
- {\r
- free (m_pDataList->data);\r
- m_pDataList = g_slist_remove (m_pDataList, m_pDataList->data);\r
- }\r
-\r
- if (m_pWidget != NULL)\r
- gtk_widget_destroy (m_pWidget);\r
-}\r
-\r
-// i suspect that this is redundant - gtk manages to remember the data stored in its widgets across a hide/show\r
-void Dialog::ShowDlg ()\r
-{\r
- Create ();\r
- UpdateData (FALSE);\r
- gtk_widget_show (m_pWidget);\r
-}\r
-\r
-void Dialog::HideDlg ()\r
-{\r
- UpdateData (TRUE);\r
- gtk_widget_hide (m_pWidget);\r
-}\r
-\r
-static gint delete_event_callback(GtkWidget *widget, GdkEvent* event, gpointer data)\r
-{\r
- reinterpret_cast<Dialog*>(data)->HideDlg();\r
- reinterpret_cast<Dialog*>(data)->EndModal(IDCANCEL);\r
- return TRUE;\r
-}\r
-\r
-void Dialog::Create ()\r
-{\r
- if (m_bNeedBuild)\r
- {\r
- m_pWidget = gtk_window_new (GTK_WINDOW_TOPLEVEL);\r
- gtk_signal_connect (GTK_OBJECT (m_pWidget), "delete_event",\r
- GTK_SIGNAL_FUNC (delete_event_callback), this);\r
- gtk_signal_connect (GTK_OBJECT (m_pWidget), "destroy",\r
- GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);\r
- g_object_set_data (G_OBJECT (m_pWidget), "loop", &m_nLoop);\r
- g_object_set_data (G_OBJECT (m_pWidget), "ret", &m_nReturn);\r
-\r
- BuildDialog ();\r
- m_bNeedBuild = false;\r
- }\r
-}\r
-\r
-void Dialog::Destroy ()\r
-{\r
- if (m_pWidget != NULL)\r
- {\r
- gtk_widget_destroy (m_pWidget);\r
- m_pWidget = NULL;\r
- }\r
-}\r
-\r
-void Dialog::AddDialogData (GtkObject *object, void *buf, DLG_DATA_TYPE type)\r
-{\r
- DLG_DATA *data;\r
-\r
- data = (DLG_DATA*)qmalloc (sizeof(DLG_DATA));\r
- data->object = object;\r
- data->buffer = buf;\r
- data->type = type;\r
-\r
- m_pDataList = g_slist_append (m_pDataList, data);\r
-}\r
-\r
-void Dialog::AddModalButton (GtkWidget *widget, int ret)\r
-{\r
- gtk_signal_connect (GTK_OBJECT (widget), "clicked",\r
- GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (ret));\r
-}\r
-\r
-void Dialog::UpdateData (bool retrieve)\r
- {\r
- DLG_DATA *data;\r
- GSList *lst;\r
- char buf[32];\r
- \r
- if (retrieve)\r
- {\r
- for (lst = m_pDataList; lst != NULL; lst = g_slist_next (lst))\r
- {\r
- data = (DLG_DATA*)lst->data;\r
- \r
- switch (data->type)\r
- {\r
- case DLG_CHECK_BOOL:\r
- *(bool*)data->buffer = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->object));\r
- break;\r
- case DLG_RADIO_INT:\r
- {\r
- GSList *radio = gtk_radio_button_group (GTK_RADIO_BUTTON (data->object));\r
- *(int*)data->buffer = g_slist_length (radio) - 1;\r
- for (; radio; radio = g_slist_next (radio))\r
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio->data)))\r
- break;\r
- else\r
- (*(int*)data->buffer)--;\r
- } break;\r
- case DLG_ENTRY_TEXT:\r
- {\r
- const char *txt;\r
- Str* str;\r
- str = (Str*)data->buffer;\r
- txt = gtk_entry_get_text (GTK_ENTRY (data->object));\r
- *str = txt;\r
- } break;\r
- case DLG_ENTRY_FLOAT:\r
- *(float*)data->buffer = atof (gtk_entry_get_text (GTK_ENTRY (data->object)));\r
- break;\r
- case DLG_ENTRY_INT:\r
- *(int*)data->buffer = atoi (gtk_entry_get_text (GTK_ENTRY (data->object)));\r
- break;\r
- case DLG_SPIN_FLOAT:\r
- *(float*)data->buffer = gtk_spin_button_get_value_as_float (GTK_SPIN_BUTTON (data->object));\r
- break;\r
- case DLG_SPIN_INT:\r
- *(int*)data->buffer = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (data->object));\r
- break;\r
- case DLG_ADJ_INT:\r
- *(int*)data->buffer = (int) GTK_ADJUSTMENT (data->object)->value;\r
- break;\r
- case DLG_COMBO_INT:\r
- {\r
- GList *lst = GTK_LIST (GTK_COMBO (data->object)->list)->children;\r
- char *label;\r
- const char *entry;\r
- int i;\r
- \r
- *(int*)data->buffer = -1;\r
- entry = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (data->object)->entry));\r
- \r
- for (i = 0; lst != NULL; lst = g_list_next (lst))\r
- {\r
- gtk_label_get (GTK_LABEL (GTK_BIN (lst->data)->child), &label);\r
- \r
- if (strcmp (label, entry) == 0)\r
- {\r
- *(int*)data->buffer = i;\r
- break;\r
- }\r
- i++;\r
- }\r
- } break;\r
- }\r
- }\r
- }\r
- else\r
- {\r
- for (lst = m_pDataList; lst != NULL; lst = g_slist_next (lst))\r
- {\r
- data = (DLG_DATA*)lst->data;\r
-\r
- switch (data->type)\r
- {\r
- case DLG_CHECK_BOOL:\r
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (data->object), *(bool*)data->buffer);\r
- break;\r
- case DLG_RADIO_INT:\r
- {\r
- GSList *radio = gtk_radio_button_group (GTK_RADIO_BUTTON (data->object));\r
- gpointer btn = g_slist_nth_data (radio, g_slist_length (radio) - (*(int*)data->buffer) - 1);\r
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (btn), TRUE);\r
- } break;\r
- case DLG_ENTRY_TEXT:\r
- {\r
- Str* str;\r
- str = (Str*)data->buffer;\r
- const char *txt = str->GetBuffer ();\r
- gtk_entry_set_text (GTK_ENTRY (data->object), txt);\r
- } break;\r
- case DLG_ENTRY_FLOAT:\r
- sprintf (buf, "%g", (*(float*)data->buffer));\r
- gtk_entry_set_text (GTK_ENTRY (data->object), buf);\r
- break;\r
- case DLG_ENTRY_INT:\r
- sprintf (buf, "%d", (*(int*)data->buffer));\r
- gtk_entry_set_text (GTK_ENTRY (data->object), buf);\r
- break;\r
- case DLG_SPIN_FLOAT:\r
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (data->object), (*(float*)data->buffer));\r
- break;\r
- case DLG_SPIN_INT:\r
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (data->object), (*(int*)data->buffer));\r
- break;\r
- case DLG_ADJ_INT:\r
- gtk_adjustment_set_value (GTK_ADJUSTMENT (data->object), (*(int*)data->buffer));\r
- break;\r
- case DLG_COMBO_INT:\r
- {\r
- GList *lst = GTK_LIST (GTK_COMBO (data->object)->list)->children;\r
- char *entry = "";\r
- \r
- if (*(int*)data->buffer != -1)\r
- {\r
- lst = g_list_nth (lst, *(int*)data->buffer);\r
- if (lst != NULL)\r
- gtk_label_get (GTK_LABEL (GTK_BIN (lst->data)->child), &entry);\r
- }\r
- \r
- gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (data->object)->entry), entry);\r
- } break;\r
- }\r
- }\r
- }\r
-}\r
-\r
-void Dialog::EndModal (int code)\r
-{\r
- m_nLoop = 0;\r
- m_nReturn = code;\r
-}\r
-\r
-int Dialog::DoModal ()\r
-{\r
- Create ();\r
- UpdateData (FALSE);\r
-\r
- PreModal();\r
-\r
- gtk_grab_add (m_pWidget);\r
- gtk_widget_show (m_pWidget);\r
-\r
- m_nLoop = 1;\r
- while (m_nLoop)\r
- gtk_main_iteration ();\r
-\r
- if (m_pWidget != NULL)\r
- {\r
- UpdateData (TRUE);\r
-\r
- gtk_grab_remove (m_pWidget);\r
- gtk_widget_hide (m_pWidget);\r
- }\r
- PostModal (m_nReturn);\r
-\r
- return m_nReturn;\r
-}\r
-\r
+/*
+Copyright (C) 1999-2007 id Software, Inc. and contributors.
+For a list of contributors, see the accompanying CONTRIBUTORS file.
+
+This file is part of GtkRadiant.
+
+GtkRadiant is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+GtkRadiant 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GtkRadiant; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+//
+// Base dialog class, provides a way to run modal dialogs and
+// set/get the widget values in member variables.
+//
+// Leonardo Zide (leo@lokigames.com)
+//
+
+#include "stdafx.h"
+#include <gtk/gtk.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+typedef struct
+{
+ GtkObject *object;
+ void *buffer;
+ DLG_DATA_TYPE type;
+} DLG_DATA;
+
+// =============================================================================
+// Dialog class
+
+Dialog::Dialog ()
+{
+ m_pDataList = (GSList*)NULL;
+ m_nReturn = IDCANCEL;
+ m_bNeedBuild = true;
+ m_nLoop = 0;
+}
+
+Dialog::~Dialog ()
+{
+ while (m_pDataList)
+ {
+ free (m_pDataList->data);
+ m_pDataList = g_slist_remove (m_pDataList, m_pDataList->data);
+ }
+
+ if (m_pWidget != NULL)
+ gtk_widget_destroy (m_pWidget);
+}
+
+// i suspect that this is redundant - gtk manages to remember the data stored in its widgets across a hide/show
+void Dialog::ShowDlg ()
+{
+ Create ();
+ UpdateData (FALSE);
+ gtk_widget_show (m_pWidget);
+}
+
+void Dialog::HideDlg ()
+{
+ UpdateData (TRUE);
+ gtk_widget_hide (m_pWidget);
+}
+
+static gint delete_event_callback(GtkWidget *widget, GdkEvent* event, gpointer data)
+{
+ reinterpret_cast<Dialog*>(data)->HideDlg();
+ reinterpret_cast<Dialog*>(data)->EndModal(IDCANCEL);
+ return TRUE;
+}
+
+void Dialog::Create ()
+{
+ if (m_bNeedBuild)
+ {
+ m_pWidget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_signal_connect (GTK_OBJECT (m_pWidget), "delete_event",
+ GTK_SIGNAL_FUNC (delete_event_callback), this);
+ gtk_signal_connect (GTK_OBJECT (m_pWidget), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ g_object_set_data (G_OBJECT (m_pWidget), "loop", &m_nLoop);
+ g_object_set_data (G_OBJECT (m_pWidget), "ret", &m_nReturn);
+
+ BuildDialog ();
+ m_bNeedBuild = false;
+ }
+}
+
+void Dialog::Destroy ()
+{
+ if (m_pWidget != NULL)
+ {
+ gtk_widget_destroy (m_pWidget);
+ m_pWidget = NULL;
+ }
+}
+
+void Dialog::AddDialogData (GtkObject *object, void *buf, DLG_DATA_TYPE type)
+{
+ DLG_DATA *data;
+
+ data = (DLG_DATA*)qmalloc (sizeof(DLG_DATA));
+ data->object = object;
+ data->buffer = buf;
+ data->type = type;
+
+ m_pDataList = g_slist_append (m_pDataList, data);
+}
+
+void Dialog::AddModalButton (GtkWidget *widget, int ret)
+{
+ gtk_signal_connect (GTK_OBJECT (widget), "clicked",
+ GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (ret));
+}
+
+void Dialog::UpdateData (bool retrieve)
+ {
+ DLG_DATA *data;
+ GSList *lst;
+ char buf[32];
+
+ if (retrieve)
+ {
+ for (lst = m_pDataList; lst != NULL; lst = g_slist_next (lst))
+ {
+ data = (DLG_DATA*)lst->data;
+
+ switch (data->type)
+ {
+ case DLG_CHECK_BOOL:
+ *(bool*)data->buffer = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->object));
+ break;
+ case DLG_RADIO_INT:
+ {
+ GSList *radio = gtk_radio_button_group (GTK_RADIO_BUTTON (data->object));
+ *(int*)data->buffer = g_slist_length (radio) - 1;
+ for (; radio; radio = g_slist_next (radio))
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio->data)))
+ break;
+ else
+ (*(int*)data->buffer)--;
+ } break;
+ case DLG_ENTRY_TEXT:
+ {
+ const char *txt;
+ Str* str;
+ str = (Str*)data->buffer;
+ txt = gtk_entry_get_text (GTK_ENTRY (data->object));
+ *str = txt;
+ } break;
+ case DLG_ENTRY_FLOAT:
+ *(float*)data->buffer = atof (gtk_entry_get_text (GTK_ENTRY (data->object)));
+ break;
+ case DLG_ENTRY_INT:
+ *(int*)data->buffer = atoi (gtk_entry_get_text (GTK_ENTRY (data->object)));
+ break;
+ case DLG_SPIN_FLOAT:
+ *(float*)data->buffer = gtk_spin_button_get_value_as_float (GTK_SPIN_BUTTON (data->object));
+ break;
+ case DLG_SPIN_INT:
+ *(int*)data->buffer = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (data->object));
+ break;
+ case DLG_ADJ_INT:
+ *(int*)data->buffer = (int) GTK_ADJUSTMENT (data->object)->value;
+ break;
+ case DLG_COMBO_INT:
+ {
+ GList *lst = GTK_LIST (GTK_COMBO (data->object)->list)->children;
+ char *label;
+ const char *entry;
+ int i;
+
+ *(int*)data->buffer = -1;
+ entry = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (data->object)->entry));
+
+ for (i = 0; lst != NULL; lst = g_list_next (lst))
+ {
+ gtk_label_get (GTK_LABEL (GTK_BIN (lst->data)->child), &label);
+
+ if (strcmp (label, entry) == 0)
+ {
+ *(int*)data->buffer = i;
+ break;
+ }
+ i++;
+ }
+ } break;
+ }
+ }
+ }
+ else
+ {
+ for (lst = m_pDataList; lst != NULL; lst = g_slist_next (lst))
+ {
+ data = (DLG_DATA*)lst->data;
+
+ switch (data->type)
+ {
+ case DLG_CHECK_BOOL:
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (data->object), *(bool*)data->buffer);
+ break;
+ case DLG_RADIO_INT:
+ {
+ GSList *radio = gtk_radio_button_group (GTK_RADIO_BUTTON (data->object));
+ gpointer btn = g_slist_nth_data (radio, g_slist_length (radio) - (*(int*)data->buffer) - 1);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (btn), TRUE);
+ } break;
+ case DLG_ENTRY_TEXT:
+ {
+ Str* str;
+ str = (Str*)data->buffer;
+ const char *txt = str->GetBuffer ();
+ gtk_entry_set_text (GTK_ENTRY (data->object), txt);
+ } break;
+ case DLG_ENTRY_FLOAT:
+ sprintf (buf, "%g", (*(float*)data->buffer));
+ gtk_entry_set_text (GTK_ENTRY (data->object), buf);
+ break;
+ case DLG_ENTRY_INT:
+ sprintf (buf, "%d", (*(int*)data->buffer));
+ gtk_entry_set_text (GTK_ENTRY (data->object), buf);
+ break;
+ case DLG_SPIN_FLOAT:
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (data->object), (*(float*)data->buffer));
+ break;
+ case DLG_SPIN_INT:
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (data->object), (*(int*)data->buffer));
+ break;
+ case DLG_ADJ_INT:
+ gtk_adjustment_set_value (GTK_ADJUSTMENT (data->object), (*(int*)data->buffer));
+ break;
+ case DLG_COMBO_INT:
+ {
+ GList *lst = GTK_LIST (GTK_COMBO (data->object)->list)->children;
+ char *entry = "";
+
+ if (*(int*)data->buffer != -1)
+ {
+ lst = g_list_nth (lst, *(int*)data->buffer);
+ if (lst != NULL)
+ gtk_label_get (GTK_LABEL (GTK_BIN (lst->data)->child), &entry);
+ }
+
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (data->object)->entry), entry);
+ } break;
+ }
+ }
+ }
+}
+
+void Dialog::EndModal (int code)
+{
+ m_nLoop = 0;
+ m_nReturn = code;
+}
+
+int Dialog::DoModal ()
+{
+ Create ();
+ UpdateData (FALSE);
+
+ PreModal();
+
+ gtk_grab_add (m_pWidget);
+ gtk_widget_show (m_pWidget);
+
+ m_nLoop = 1;
+ while (m_nLoop)
+ gtk_main_iteration ();
+
+ if (m_pWidget != NULL)
+ {
+ UpdateData (TRUE);
+
+ gtk_grab_remove (m_pWidget);
+ gtk_widget_hide (m_pWidget);
+ }
+ PostModal (m_nReturn);
+
+ return m_nReturn;
+}
+