-/*\r
-Copyright (C) 2003 Reed Mideke.\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
-// bkgrnd2d Plugin dialog\r
-//\r
-// Code by reyalP aka Reed Mideke\r
-//\r
-// Based on various other plugins\r
-//\r
-\r
-#include <gtk/gtk.h>\r
-\r
-#include "bkgrnd2d.h"\r
-#include "dialog.h"\r
-\r
-// spaces to make label nice and big\r
-#define NO_FILE_MSG " (no file loaded) "\r
-\r
-static GtkWidget *pDialogWnd;\r
-static GtkWidget *pNotebook;\r
-static GtkTooltips *pTooltips;\r
-\r
-class CBackgroundDialogPage\r
-{\r
-private:\r
- GtkWidget *m_pWidget;\r
- GtkWidget *m_pTabLabel;\r
- GtkWidget *m_pFileLabel;\r
- GtkWidget *m_pPosLabel;\r
- VIEWTYPE m_vt;\r
- bool m_bValidFile;\r
-\r
-public:\r
- CBackgroundImage *m_pImage;\r
- CBackgroundDialogPage( VIEWTYPE vt );\r
- void Append(GtkWidget *notebook);\r
- void Browse();\r
- void Reload();\r
- void SetPosLabel();\r
-// ~BackgroundDialogPage();\r
-};\r
-\r
-\r
-// dialog page callbacks\r
-static void browse_callback( GtkWidget *widget, gpointer data )\r
-{\r
- ((CBackgroundDialogPage *)data)->Browse();\r
-}\r
-\r
-static void reload_callback( GtkWidget *widget, gpointer data )\r
-{\r
- ((CBackgroundDialogPage *)data)->Reload();\r
-}\r
-\r
-static void size_sel_callback( GtkWidget *widget, gpointer data )\r
-{\r
- CBackgroundDialogPage *pPage = (CBackgroundDialogPage *)data;\r
- if (pPage->m_pImage->SetExtentsSel())\r
- pPage->SetPosLabel();\r
-}\r
-\r
-static void size_mm_callback( GtkWidget *widget, gpointer data )\r
-{\r
- CBackgroundDialogPage *pPage = (CBackgroundDialogPage *)data;\r
- if(pPage->m_pImage->SetExtentsMM())\r
- pPage->SetPosLabel();\r
-}\r
-\r
-static void alpha_adjust_callback( GtkWidget *widget, gpointer data )\r
-{\r
- CBackgroundDialogPage *pPage = (CBackgroundDialogPage *)data;\r
- pPage->m_pImage->m_alpha = (float)gtk_range_get_value (GTK_RANGE(widget));\r
- g_FuncTable.m_pfnSysUpdateWindows(W_XY);\r
-}\r
-\r
-void CBackgroundDialogPage::Reload()\r
-{\r
- if(m_bValidFile)\r
- m_pImage->Load(gtk_label_get_text(GTK_LABEL(m_pFileLabel)));\r
-}\r
-\r
-void CBackgroundDialogPage::Browse()\r
-{\r
- char browsedir[PATH_MAX];\r
- const char *ct;\r
- const char *newfile;\r
- char *t;\r
- \r
- //TODO GetMapName saves the map. eeep!\r
- //also with no map, returns unnamed.map, otherwise returns full path\r
-// Syn_Printf(MSG_PREFIX "GetMapName() %s\n",\r
-// g_FuncTable.m_pfnGetMapName());\r
- \r
- ct = g_FuncTable.m_pfnReadProjectKey("basepath");\r
- // TODO shouldn't need this stuff\r
- if(!ct || !strlen(ct)) {\r
- Syn_Printf(MSG_PREFIX "basepath = NULL or empty\n");\r
- return;\r
- }\r
- Syn_Printf(MSG_PREFIX "basepath: %s\n",ct);\r
- if(strlen(ct) >= PATH_MAX) {\r
- Syn_Printf(MSG_PREFIX "base game dir too long\n");\r
- return;\r
- }\r
-\r
- strcpy(browsedir,ct);\r
- // make sure we have a trailing / \r
- if(browsedir[strlen(browsedir) - 1] != '/')\r
- strcat(browsedir,"/");\r
-\r
- //if we dont have a file yet, don't try to use it for default dir\r
- if(m_bValidFile) {\r
- // filename should always be a nice clean unix style relative path\r
- ct = gtk_label_get_text(GTK_LABEL(m_pFileLabel));\r
- strcat(browsedir,ct);\r
- Syn_Printf(MSG_PREFIX "full path: %s\n",browsedir);\r
-\r
- // lop off the file part\r
- t = browsedir + strlen(browsedir) - 1;\r
- while (t != browsedir && *t != '/') \r
- t--;\r
- *t = 0;\r
- }\r
- Syn_Printf(MSG_PREFIX "browse directory %s\n",browsedir);\r
- \r
-//does NOT need freeing contrary to include/qerplugin.h comments\r
-//TODO bug/patch for comments\r
-//TODO patern gets fucked up sometimes if empty\r
-//http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=915\r
- newfile = g_FuncTable.m_pfnFileDialog(pDialogWnd,TRUE,\r
- "Load Background Image",browsedir,FILETYPE_KEY);\r
- if(!newfile) {\r
- Syn_Printf(MSG_PREFIX "newfile = NULL\n");\r
- return;\r
- }\r
- Syn_Printf(MSG_PREFIX "newfile: %s\n",newfile);\r
- newfile = g_FileSystemTable.m_pfnExtractRelativePath(newfile);\r
-\r
- if(!newfile) {\r
- Syn_Printf(MSG_PREFIX "newfile = NULL\n");\r
- return;\r
- }\r
- Syn_Printf(MSG_PREFIX "newfile: %s\n",newfile);\r
-\r
- if(m_pImage->Load(newfile)) {\r
- m_bValidFile = true;\r
- gtk_label_set_text(GTK_LABEL(m_pFileLabel),newfile);\r
- }\r
-}\r
-\r
-void CBackgroundDialogPage::SetPosLabel()\r
-{\r
- char s[64];\r
- // TODO no snprintf ?\r
- sprintf(s, "Size/Position (%d,%d) (%d,%d)",(int)(m_pImage->m_xmin),\r
- (int)(m_pImage->m_ymin),(int)(m_pImage->m_xmax),(int)(m_pImage->m_ymax));\r
- gtk_label_set_text(GTK_LABEL(m_pPosLabel),s);\r
-}\r
-\r
-CBackgroundDialogPage::CBackgroundDialogPage(VIEWTYPE vt )\r
-{\r
- GtkWidget *frame;\r
- GtkWidget *hbox;\r
- GtkWidget *w;\r
-\r
- m_vt = vt;\r
-\r
- m_bValidFile = false;\r
-\r
- switch(m_vt)\r
- {\r
- case XY:\r
- m_pTabLabel = gtk_label_new("X/Y");\r
- m_pImage = &backgroundXY;\r
- break;\r
- case XZ:\r
- m_pTabLabel = gtk_label_new("X/Z");\r
- m_pImage = &backgroundXZ;\r
- break;\r
- case YZ:\r
- m_pTabLabel = gtk_label_new("Y/Z");\r
- m_pImage = &backgroundYZ;\r
- break;\r
- }\r
-// A vbox to hold everything\r
- m_pWidget = gtk_vbox_new(FALSE,0); \r
-// Frame for file row\r
- frame = gtk_frame_new("File");\r
- gtk_box_pack_start (GTK_BOX (m_pWidget),frame, FALSE, FALSE, 2);\r
-\r
-// hbox for first row\r
- hbox = gtk_hbox_new(FALSE,5);\r
- gtk_container_set_border_width(GTK_CONTAINER (hbox),4);\r
- gtk_container_add (GTK_CONTAINER (frame), hbox);\r
-\r
-// label to display filename\r
- m_pFileLabel = gtk_label_new(NO_FILE_MSG);\r
- gtk_label_set_selectable(GTK_LABEL(m_pFileLabel),TRUE);\r
-//TODO set min size ? done with spaces right now\r
- gtk_box_pack_start (GTK_BOX (hbox),m_pFileLabel, TRUE, TRUE, 5);\r
-\r
- gtk_widget_show (m_pFileLabel);\r
-\r
- w = gtk_button_new_with_label ("Browse...");\r
- g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (browse_callback),\r
- (gpointer)this);\r
- gtk_box_pack_start (GTK_BOX (hbox),w, FALSE, FALSE, 5);\r
- gtk_tooltips_set_tip (pTooltips, w, "Select a file", NULL);\r
- gtk_widget_show (w);\r
- \r
- w = gtk_button_new_with_label ("Reload");\r
- g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (reload_callback),\r
- (gpointer)this);\r
- // TODO disable until we have file\r
- // gtk_widget_set_sensitive(w,FALSE);\r
- gtk_tooltips_set_tip (pTooltips, w, "Reload current file", NULL);\r
- gtk_box_pack_start (GTK_BOX (hbox),w, FALSE, FALSE, 5);\r
- gtk_widget_show (w);\r
-\r
- gtk_widget_show (hbox);\r
- gtk_widget_show (frame);\r
-\r
-// second row (rendering options)\r
- frame = gtk_frame_new("Rendering");\r
- gtk_box_pack_start (GTK_BOX (m_pWidget),frame, FALSE, FALSE, 2);\r
-\r
- hbox = gtk_hbox_new(FALSE,5);\r
- gtk_container_set_border_width(GTK_CONTAINER (hbox),4);\r
- gtk_container_add (GTK_CONTAINER (frame), hbox);\r
-\r
- w = gtk_label_new("Vertex alpha:");\r
- gtk_box_pack_start (GTK_BOX (hbox),w, FALSE, FALSE, 5);\r
- gtk_widget_show (w);\r
-\r
- w = gtk_hscale_new_with_range(0.0,1.0,0.01);\r
- gtk_range_set_value(GTK_RANGE(w),0.5);\r
- gtk_scale_set_value_pos(GTK_SCALE(w),GTK_POS_LEFT);\r
- g_signal_connect (G_OBJECT (w), "value-changed",\r
- G_CALLBACK (alpha_adjust_callback), (gpointer)this);\r
- gtk_box_pack_start (GTK_BOX (hbox),w, TRUE, TRUE, 5);\r
- gtk_tooltips_set_tip (pTooltips, w, "Set image transparancy", NULL);\r
- gtk_widget_show (w);\r
-\r
- gtk_widget_show (hbox);\r
- gtk_widget_show (frame);\r
-// Third row (size and position)\r
- frame = gtk_frame_new("Size/Position (undefined)");\r
- m_pPosLabel = gtk_frame_get_label_widget (GTK_FRAME(frame));\r
- gtk_box_pack_start ( GTK_BOX (m_pWidget), frame, FALSE, FALSE, 2);\r
-\r
- hbox = gtk_hbox_new(FALSE,5);\r
- gtk_container_add (GTK_CONTAINER (frame), hbox);\r
- gtk_container_set_border_width(GTK_CONTAINER (hbox),4);\r
-\r
- w = gtk_button_new_with_label ("from selection");\r
- gtk_box_pack_start (GTK_BOX (hbox),w, TRUE, FALSE, 5);\r
- g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (size_sel_callback),\r
- (gpointer)this);\r
- gtk_tooltips_set_tip (pTooltips, w, "Set the size of the image to the bounding rectangle of all selected brushes and entities", NULL);\r
- gtk_widget_show (w);\r
-\r
- if(m_vt == XY) {\r
- w = gtk_button_new_with_label ("from map mins/maxs");\r
- gtk_box_pack_start ( GTK_BOX (hbox),w, TRUE, FALSE, 2);\r
- g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (size_mm_callback),\r
- (gpointer)this);\r
- gtk_tooltips_set_tip (pTooltips, w, "Set the size of the image using the mapcoordsmins and mapcoordsmaxs keys of the worldspawn entity", NULL);\r
- gtk_widget_show (w);\r
- }\r
-\r
- gtk_widget_show (hbox);\r
- gtk_widget_show (frame);\r
-\r
- gtk_widget_show ( m_pWidget );\r
-}\r
-\r
-void CBackgroundDialogPage::Append(GtkWidget *notebook)\r
-{\r
- gtk_notebook_append_page( GTK_NOTEBOOK(notebook), m_pWidget, m_pTabLabel);\r
-}\r
-\r
-// dialog global callbacks\r
-/*\r
-static gint expose_callback( GtkWidget *widget, gpointer data )\r
-{\r
- return FALSE;\r
-}\r
-*/\r
-\r
-static void response_callback( GtkWidget *widget, gint response, gpointer data )\r
-{\r
- if( response == GTK_RESPONSE_CLOSE )\r
- gtk_widget_hide( pDialogWnd );\r
-}\r
-\r
-static gint close_callback( GtkWidget *widget, gpointer data )\r
-{\r
- gtk_widget_hide( pDialogWnd );\r
- return TRUE;\r
-}\r
-\r
-void InitBackgroundDialog()\r
-{\r
- CBackgroundDialogPage *pPage;\r
-\r
- pDialogWnd = gtk_dialog_new_with_buttons ("Background Images",\r
- GTK_WINDOW(g_pMainWidget),\r
- (GtkDialogFlags)(GTK_DIALOG_DESTROY_WITH_PARENT),\r
- // TODO dialog with no buttons\r
- // GTK_STOCK_CLOSE,\r
- // GTK_RESPONSE_CLOSE,\r
- NULL);\r
- gtk_signal_connect( GTK_OBJECT (pDialogWnd), "delete_event",\r
- GTK_SIGNAL_FUNC( close_callback ), NULL );\r
- gtk_signal_connect( GTK_OBJECT (pDialogWnd), "response",\r
- GTK_SIGNAL_FUNC( response_callback ), NULL );\r
-// gtk_signal_connect( GTK_OBJECT (pDialogWnd), "expose_event", GTK_SIGNAL_FUNC( ci_expose ), NULL );\r
-\r
- pTooltips = gtk_tooltips_new();\r
-\r
- pNotebook = gtk_notebook_new();\r
- pPage = new CBackgroundDialogPage(XY);\r
- pPage->Append(pNotebook);\r
- pPage = new CBackgroundDialogPage(XZ);\r
- pPage->Append(pNotebook);\r
- pPage = new CBackgroundDialogPage(YZ);\r
- pPage->Append(pNotebook);\r
-\r
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG(pDialogWnd)->vbox), pNotebook, TRUE, TRUE, 0);\r
-\r
- gtk_widget_show ( pNotebook );\r
- \r
- gtk_widget_realize( pDialogWnd );\r
-}\r
-\r
-void ShowBackgroundDialog()\r
-{\r
- gtk_window_present( GTK_WINDOW(pDialogWnd) );\r
-}\r
-\r
-void ShowBackgroundDialogPG(int page)\r
-{\r
- gtk_notebook_set_current_page(GTK_NOTEBOOK(pNotebook),page);\r
- ShowBackgroundDialog();\r
-}\r
-\r
+/*
+Copyright (C) 2003 Reed Mideke.
+
+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
+*/
+
+//
+// bkgrnd2d Plugin dialog
+//
+// Code by reyalP aka Reed Mideke
+//
+// Based on various other plugins
+//
+
+#include <gtk/gtk.h>
+
+#include "bkgrnd2d.h"
+#include "dialog.h"
+
+// spaces to make label nice and big
+#define NO_FILE_MSG " (no file loaded) "
+
+static GtkWidget *pDialogWnd;
+static GtkWidget *pNotebook;
+static GtkTooltips *pTooltips;
+
+class CBackgroundDialogPage
+{
+private:
+ GtkWidget *m_pWidget;
+ GtkWidget *m_pTabLabel;
+ GtkWidget *m_pFileLabel;
+ GtkWidget *m_pPosLabel;
+ VIEWTYPE m_vt;
+ bool m_bValidFile;
+
+public:
+ CBackgroundImage *m_pImage;
+ CBackgroundDialogPage( VIEWTYPE vt );
+ void Append(GtkWidget *notebook);
+ void Browse();
+ void Reload();
+ void SetPosLabel();
+// ~BackgroundDialogPage();
+};
+
+
+// dialog page callbacks
+static void browse_callback( GtkWidget *widget, gpointer data )
+{
+ ((CBackgroundDialogPage *)data)->Browse();
+}
+
+static void reload_callback( GtkWidget *widget, gpointer data )
+{
+ ((CBackgroundDialogPage *)data)->Reload();
+}
+
+static void size_sel_callback( GtkWidget *widget, gpointer data )
+{
+ CBackgroundDialogPage *pPage = (CBackgroundDialogPage *)data;
+ if (pPage->m_pImage->SetExtentsSel())
+ pPage->SetPosLabel();
+}
+
+static void size_mm_callback( GtkWidget *widget, gpointer data )
+{
+ CBackgroundDialogPage *pPage = (CBackgroundDialogPage *)data;
+ if(pPage->m_pImage->SetExtentsMM())
+ pPage->SetPosLabel();
+}
+
+static void alpha_adjust_callback( GtkWidget *widget, gpointer data )
+{
+ CBackgroundDialogPage *pPage = (CBackgroundDialogPage *)data;
+ pPage->m_pImage->m_alpha = (float)gtk_range_get_value (GTK_RANGE(widget));
+ g_FuncTable.m_pfnSysUpdateWindows(W_XY);
+}
+
+void CBackgroundDialogPage::Reload()
+{
+ if(m_bValidFile)
+ m_pImage->Load(gtk_label_get_text(GTK_LABEL(m_pFileLabel)));
+}
+
+void CBackgroundDialogPage::Browse()
+{
+ char browsedir[PATH_MAX];
+ const char *ct;
+ const char *newfile;
+ char *t;
+
+ //TODO GetMapName saves the map. eeep!
+ //also with no map, returns unnamed.map, otherwise returns full path
+// Syn_Printf(MSG_PREFIX "GetMapName() %s\n",
+// g_FuncTable.m_pfnGetMapName());
+
+ ct = g_FuncTable.m_pfnReadProjectKey("basepath");
+ // TODO shouldn't need this stuff
+ if(!ct || !strlen(ct)) {
+ Syn_Printf(MSG_PREFIX "basepath = NULL or empty\n");
+ return;
+ }
+ Syn_Printf(MSG_PREFIX "basepath: %s\n",ct);
+ if(strlen(ct) >= PATH_MAX) {
+ Syn_Printf(MSG_PREFIX "base game dir too long\n");
+ return;
+ }
+
+ strcpy(browsedir,ct);
+ // make sure we have a trailing /
+ if(browsedir[strlen(browsedir) - 1] != '/')
+ strcat(browsedir,"/");
+
+ //if we dont have a file yet, don't try to use it for default dir
+ if(m_bValidFile) {
+ // filename should always be a nice clean unix style relative path
+ ct = gtk_label_get_text(GTK_LABEL(m_pFileLabel));
+ strcat(browsedir,ct);
+ Syn_Printf(MSG_PREFIX "full path: %s\n",browsedir);
+
+ // lop off the file part
+ t = browsedir + strlen(browsedir) - 1;
+ while (t != browsedir && *t != '/')
+ t--;
+ *t = 0;
+ }
+ Syn_Printf(MSG_PREFIX "browse directory %s\n",browsedir);
+
+//does NOT need freeing contrary to include/qerplugin.h comments
+//TODO bug/patch for comments
+//TODO patern gets fucked up sometimes if empty
+//http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=915
+ newfile = g_FuncTable.m_pfnFileDialog(pDialogWnd,TRUE,
+ "Load Background Image",browsedir,FILETYPE_KEY);
+ if(!newfile) {
+ Syn_Printf(MSG_PREFIX "newfile = NULL\n");
+ return;
+ }
+ Syn_Printf(MSG_PREFIX "newfile: %s\n",newfile);
+ newfile = g_FileSystemTable.m_pfnExtractRelativePath(newfile);
+
+ if(!newfile) {
+ Syn_Printf(MSG_PREFIX "newfile = NULL\n");
+ return;
+ }
+ Syn_Printf(MSG_PREFIX "newfile: %s\n",newfile);
+
+ if(m_pImage->Load(newfile)) {
+ m_bValidFile = true;
+ gtk_label_set_text(GTK_LABEL(m_pFileLabel),newfile);
+ }
+}
+
+void CBackgroundDialogPage::SetPosLabel()
+{
+ char s[64];
+ // TODO no snprintf ?
+ sprintf(s, "Size/Position (%d,%d) (%d,%d)",(int)(m_pImage->m_xmin),
+ (int)(m_pImage->m_ymin),(int)(m_pImage->m_xmax),(int)(m_pImage->m_ymax));
+ gtk_label_set_text(GTK_LABEL(m_pPosLabel),s);
+}
+
+CBackgroundDialogPage::CBackgroundDialogPage(VIEWTYPE vt )
+{
+ GtkWidget *frame;
+ GtkWidget *hbox;
+ GtkWidget *w;
+
+ m_vt = vt;
+
+ m_bValidFile = false;
+
+ switch(m_vt)
+ {
+ case XY:
+ m_pTabLabel = gtk_label_new("X/Y");
+ m_pImage = &backgroundXY;
+ break;
+ case XZ:
+ m_pTabLabel = gtk_label_new("X/Z");
+ m_pImage = &backgroundXZ;
+ break;
+ case YZ:
+ m_pTabLabel = gtk_label_new("Y/Z");
+ m_pImage = &backgroundYZ;
+ break;
+ }
+// A vbox to hold everything
+ m_pWidget = gtk_vbox_new(FALSE,0);
+// Frame for file row
+ frame = gtk_frame_new("File");
+ gtk_box_pack_start (GTK_BOX (m_pWidget),frame, FALSE, FALSE, 2);
+
+// hbox for first row
+ hbox = gtk_hbox_new(FALSE,5);
+ gtk_container_set_border_width(GTK_CONTAINER (hbox),4);
+ gtk_container_add (GTK_CONTAINER (frame), hbox);
+
+// label to display filename
+ m_pFileLabel = gtk_label_new(NO_FILE_MSG);
+ gtk_label_set_selectable(GTK_LABEL(m_pFileLabel),TRUE);
+//TODO set min size ? done with spaces right now
+ gtk_box_pack_start (GTK_BOX (hbox),m_pFileLabel, TRUE, TRUE, 5);
+
+ gtk_widget_show (m_pFileLabel);
+
+ w = gtk_button_new_with_label ("Browse...");
+ g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (browse_callback),
+ (gpointer)this);
+ gtk_box_pack_start (GTK_BOX (hbox),w, FALSE, FALSE, 5);
+ gtk_tooltips_set_tip (pTooltips, w, "Select a file", NULL);
+ gtk_widget_show (w);
+
+ w = gtk_button_new_with_label ("Reload");
+ g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (reload_callback),
+ (gpointer)this);
+ // TODO disable until we have file
+ // gtk_widget_set_sensitive(w,FALSE);
+ gtk_tooltips_set_tip (pTooltips, w, "Reload current file", NULL);
+ gtk_box_pack_start (GTK_BOX (hbox),w, FALSE, FALSE, 5);
+ gtk_widget_show (w);
+
+ gtk_widget_show (hbox);
+ gtk_widget_show (frame);
+
+// second row (rendering options)
+ frame = gtk_frame_new("Rendering");
+ gtk_box_pack_start (GTK_BOX (m_pWidget),frame, FALSE, FALSE, 2);
+
+ hbox = gtk_hbox_new(FALSE,5);
+ gtk_container_set_border_width(GTK_CONTAINER (hbox),4);
+ gtk_container_add (GTK_CONTAINER (frame), hbox);
+
+ w = gtk_label_new("Vertex alpha:");
+ gtk_box_pack_start (GTK_BOX (hbox),w, FALSE, FALSE, 5);
+ gtk_widget_show (w);
+
+ w = gtk_hscale_new_with_range(0.0,1.0,0.01);
+ gtk_range_set_value(GTK_RANGE(w),0.5);
+ gtk_scale_set_value_pos(GTK_SCALE(w),GTK_POS_LEFT);
+ g_signal_connect (G_OBJECT (w), "value-changed",
+ G_CALLBACK (alpha_adjust_callback), (gpointer)this);
+ gtk_box_pack_start (GTK_BOX (hbox),w, TRUE, TRUE, 5);
+ gtk_tooltips_set_tip (pTooltips, w, "Set image transparancy", NULL);
+ gtk_widget_show (w);
+
+ gtk_widget_show (hbox);
+ gtk_widget_show (frame);
+// Third row (size and position)
+ frame = gtk_frame_new("Size/Position (undefined)");
+ m_pPosLabel = gtk_frame_get_label_widget (GTK_FRAME(frame));
+ gtk_box_pack_start ( GTK_BOX (m_pWidget), frame, FALSE, FALSE, 2);
+
+ hbox = gtk_hbox_new(FALSE,5);
+ gtk_container_add (GTK_CONTAINER (frame), hbox);
+ gtk_container_set_border_width(GTK_CONTAINER (hbox),4);
+
+ w = gtk_button_new_with_label ("from selection");
+ gtk_box_pack_start (GTK_BOX (hbox),w, TRUE, FALSE, 5);
+ g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (size_sel_callback),
+ (gpointer)this);
+ gtk_tooltips_set_tip (pTooltips, w, "Set the size of the image to the bounding rectangle of all selected brushes and entities", NULL);
+ gtk_widget_show (w);
+
+ if(m_vt == XY) {
+ w = gtk_button_new_with_label ("from map mins/maxs");
+ gtk_box_pack_start ( GTK_BOX (hbox),w, TRUE, FALSE, 2);
+ g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (size_mm_callback),
+ (gpointer)this);
+ gtk_tooltips_set_tip (pTooltips, w, "Set the size of the image using the mapcoordsmins and mapcoordsmaxs keys of the worldspawn entity", NULL);
+ gtk_widget_show (w);
+ }
+
+ gtk_widget_show (hbox);
+ gtk_widget_show (frame);
+
+ gtk_widget_show ( m_pWidget );
+}
+
+void CBackgroundDialogPage::Append(GtkWidget *notebook)
+{
+ gtk_notebook_append_page( GTK_NOTEBOOK(notebook), m_pWidget, m_pTabLabel);
+}
+
+// dialog global callbacks
+/*
+static gint expose_callback( GtkWidget *widget, gpointer data )
+{
+ return FALSE;
+}
+*/
+
+static void response_callback( GtkWidget *widget, gint response, gpointer data )
+{
+ if( response == GTK_RESPONSE_CLOSE )
+ gtk_widget_hide( pDialogWnd );
+}
+
+static gint close_callback( GtkWidget *widget, gpointer data )
+{
+ gtk_widget_hide( pDialogWnd );
+ return TRUE;
+}
+
+void InitBackgroundDialog()
+{
+ CBackgroundDialogPage *pPage;
+
+ pDialogWnd = gtk_dialog_new_with_buttons ("Background Images",
+ GTK_WINDOW(g_pMainWidget),
+ (GtkDialogFlags)(GTK_DIALOG_DESTROY_WITH_PARENT),
+ // TODO dialog with no buttons
+ // GTK_STOCK_CLOSE,
+ // GTK_RESPONSE_CLOSE,
+ NULL);
+ gtk_signal_connect( GTK_OBJECT (pDialogWnd), "delete_event",
+ GTK_SIGNAL_FUNC( close_callback ), NULL );
+ gtk_signal_connect( GTK_OBJECT (pDialogWnd), "response",
+ GTK_SIGNAL_FUNC( response_callback ), NULL );
+// gtk_signal_connect( GTK_OBJECT (pDialogWnd), "expose_event", GTK_SIGNAL_FUNC( ci_expose ), NULL );
+
+ pTooltips = gtk_tooltips_new();
+
+ pNotebook = gtk_notebook_new();
+ pPage = new CBackgroundDialogPage(XY);
+ pPage->Append(pNotebook);
+ pPage = new CBackgroundDialogPage(XZ);
+ pPage->Append(pNotebook);
+ pPage = new CBackgroundDialogPage(YZ);
+ pPage->Append(pNotebook);
+
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG(pDialogWnd)->vbox), pNotebook, TRUE, TRUE, 0);
+
+ gtk_widget_show ( pNotebook );
+
+ gtk_widget_realize( pDialogWnd );
+}
+
+void ShowBackgroundDialog()
+{
+ gtk_window_present( GTK_WINDOW(pDialogWnd) );
+}
+
+void ShowBackgroundDialogPG(int page)
+{
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(pNotebook),page);
+ ShowBackgroundDialog();
+}
+