]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - contrib/bkgrnd2d/dialog.cpp
Merge branch 'msys2thread' into 'master'
[xonotic/netradiant.git] / contrib / bkgrnd2d / dialog.cpp
index 43fe77173d07a39ff6035bfc2b248586f0452ce4..01a1b985b9b3e091bbcce460f1b22671cdfe12ae 100644 (file)
-/*\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
-// 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 ui::Window pDialogWnd{ui::null};
+static GtkWidget *pNotebook;
+static GtkTooltips *pTooltips;
+
+class CBackgroundDialogPage
+{
+private:
+GtkWidget *m_pWidget;
+GtkWidget *m_pTabLabel;
+ui::Label 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;
+               m_pFileLabel.text(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 ) );
+       m_pPosLabel.text(s);
+}
+
+CBackgroundDialogPage::CBackgroundDialogPage( VIEWTYPE vt ){
+       GtkWidget *w;
+
+       m_vt = vt;
+
+       m_bValidFile = false;
+
+       switch ( m_vt )
+       {
+       case XY:
+               m_pTabLabel = ui::Label( "X/Y" );
+               m_pImage = &backgroundXY;
+               break;
+       case XZ:
+               m_pTabLabel = ui::Label( "X/Z" );
+               m_pImage = &backgroundXZ;
+               break;
+       case YZ:
+               m_pTabLabel = ui::Label( "Y/Z" );
+               m_pImage = &backgroundYZ;
+               break;
+       }
+// A vbox to hold everything
+       m_pWidget = ui::VBox( FALSE,0 );
+// Frame for file row
+       auto frame = ui::Frame( "File" );
+       m_pWidget.pack_start(frame, FALSE, FALSE, 2 );
+
+// hbox for first row
+       auto hbox = ui::HBox( FALSE,5 );
+       gtk_container_set_border_width( GTK_CONTAINER( hbox ),4 );
+       frame.add(hbox);
+
+// label to display filename
+       m_pFileLabel  = ui::Label( NO_FILE_MSG );
+       gtk_label_set_selectable( GTK_LABEL( m_pFileLabel ),TRUE );
+//TODO set min size ? done with spaces right now
+       hbox.pack_start(m_pFileLabel, TRUE, TRUE, 5 );
+
+       m_pFileLabel.show();
+
+       w = ui::Button( "Browse..." );
+       w.connect( "clicked", G_CALLBACK( browse_callback ), ( gpointer ) this );
+       hbox.pack_start(w, FALSE, FALSE, 5 );
+       gtk_tooltips_set_tip( pTooltips, w, "Select a file", NULL );
+       w.show();
+
+       w = ui::Button( "Reload" );
+       w.connect( "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 );
+       hbox.pack_start(w, FALSE, FALSE, 5 );
+       w.show();
+
+       hbox.show();
+       frame.show();
+
+// second row (rendering options)
+       frame = ui::Frame( "Rendering" );
+       m_pWidget.pack_start(frame, FALSE, FALSE, 2 );
+
+       hbox = ui::HBox( FALSE,5 );
+       gtk_container_set_border_width( GTK_CONTAINER( hbox ),4 );
+       frame.add(hbox);
+
+       w = ui::Label( "Vertex alpha:" );
+       hbox.pack_start(w, FALSE, FALSE, 5 );
+       w.show();
+
+       w = ui::HScale( 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 );
+       w.connect( "value-changed", G_CALLBACK( alpha_adjust_callback ), ( gpointer ) this );
+       hbox.pack_start(w, TRUE, TRUE, 5 );
+       gtk_tooltips_set_tip( pTooltips, w, "Set image transparancy", NULL );
+       w.show();
+
+       hbox.show();
+       frame.show();
+// Third row (size and position)
+       frame = ui::Frame( "Size/Position (undefined)" );
+       m_pPosLabel = gtk_frame_get_label_widget( GTK_FRAME( frame ) );
+       m_pWidget.pack_start( frame, FALSE, FALSE, 2 );
+
+       hbox = ui::HBox( FALSE,5 );
+       frame.add(hbox);
+       gtk_container_set_border_width( GTK_CONTAINER( hbox ),4 );
+
+       w = ui::Button( "from selection" );
+       hbox.pack_start(w, TRUE, FALSE, 5 );
+       w.connect( "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 );
+       w.show();
+
+       if ( m_vt == XY ) {
+               w = ui::Button( "from map mins/maxs" );
+               hbox.pack_start(w, TRUE, FALSE, 2 );
+               w.connect( "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 );
+               w.show();
+       }
+
+       hbox.show();
+       frame.show();
+
+       m_pWidget.show();
+}
+
+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",
+                                                                                         g_pMainWidget,
+                                                                                         (GtkDialogFlags)( GTK_DIALOG_DESTROY_WITH_PARENT ),
+                                                 // TODO dialog with no buttons
+                                                 //                                                                              GTK_STOCK_CLOSE,
+                                                 //                                                                              GTK_RESPONSE_CLOSE,
+                                                                                         NULL );
+       pDialogWnd.connect( "delete_event", G_CALLBACK( close_callback ), NULL );
+       pDialogWnd.connect( "response", G_CALLBACK( response_callback ), NULL );
+//  pDialogWnd.connect( "expose_event", G_CALLBACK( 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 );
+
+       pNotebook.show();
+
+       gtk_widget_realize( pDialogWnd );
+}
+
+void ShowBackgroundDialog(){
+       gtk_window_present( pDialogWnd );
+}
+
+void ShowBackgroundDialogPG( int page ){
+       gtk_notebook_set_current_page( GTK_NOTEBOOK( pNotebook ),page );
+       ShowBackgroundDialog();
+}