+ hbox = gtk_hbox_new( FALSE, 5 );
+ gtk_widget_show( hbox );
+ gtk_box_pack_end( GTK_BOX( mainvbox ), hbox, FALSE, TRUE, 0 );
+
+ button = gtk_button_new_with_label( _( "OK" ) );
+ gtk_widget_show( button );
+ gtk_box_pack_end( GTK_BOX( hbox ), button, FALSE, FALSE, 0 );
+ gtk_widget_set_usize( button, 60, -2 );
+ AddModalButton( button, IDOK );
+
+ button = gtk_button_new_with_label( _( "Cancel" ) );
+ gtk_widget_show( button );
+ gtk_box_pack_end( GTK_BOX( hbox ), button, FALSE, FALSE, 0 );
+ gtk_widget_set_usize( button, 60, -2 );
+ AddModalButton( button, IDCANCEL );
+
+ button = gtk_button_new_with_label( _( "Clean" ) );
+ gtk_widget_show( button );
+ gtk_signal_connect( GTK_OBJECT( button ), "clicked", GTK_SIGNAL_FUNC( OnButtonClean ), this );
+ gtk_box_pack_start( GTK_BOX( hbox ), button, FALSE, FALSE, 0 );
+ gtk_widget_set_usize( button, 60, -2 );
+
+ hbox = gtk_hbox_new( FALSE, 5 );
+ gtk_box_pack_start( GTK_BOX( mainvbox ), hbox, TRUE, TRUE, 0 );
+ gtk_widget_show( hbox );
+
+ sc_win = gtk_scrolled_window_new( NULL, NULL );
+ gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( sc_win ), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC );
+ gtk_box_pack_start( GTK_BOX( hbox ), sc_win, FALSE, FALSE, 0 );
+ gtk_widget_show( sc_win );
+
+ // prefs pages notebook
+ notebook = gtk_notebook_new();
+ // hide the notebook tabs since its not supposed to look like a notebook
+ gtk_notebook_set_show_tabs( GTK_NOTEBOOK( notebook ), FALSE );
+ gtk_box_pack_start( GTK_BOX( hbox ), notebook, TRUE, TRUE, 0 );
+ gtk_widget_show( notebook );
+
+ gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW( sc_win ), GTK_SHADOW_IN );
+
+ {
+ GtkTreeStore* store = gtk_tree_store_new( 2, G_TYPE_STRING, G_TYPE_POINTER );
+
+ GtkWidget* view = gtk_tree_view_new_with_model( GTK_TREE_MODEL( store ) );
+ gtk_tree_view_set_headers_visible( GTK_TREE_VIEW( view ), FALSE );
+
+ {
+ GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
+ GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes( _( "Preferences" ), renderer, "text", 0, NULL );
+ gtk_tree_view_append_column( GTK_TREE_VIEW( view ), column );
+ }
+
+ {
+ GtkTreeSelection* selection = gtk_tree_view_get_selection( GTK_TREE_VIEW( view ) );
+ g_signal_connect( G_OBJECT( selection ), "changed", G_CALLBACK( treeSelection ), this );
+ }
+
+ gtk_widget_show( view );
+
+ gtk_container_add( GTK_CONTAINER( sc_win ), view );
+
+ {
+ /********************************************************************/
+ /* Add preference tree options */
+ /********************************************************************/
+ {
+ GtkTreeIter group;
+ gtk_tree_store_append( store, &group, NULL );
+ gtk_tree_store_set( store, &group, 0, _( "Globals" ), 1, PTAB_FRONT, -1 );
+ {
+ GtkTreeIter tab;
+ gtk_tree_store_append( store, &tab, &group );
+ gtk_tree_store_set( store, &tab, 0, _( "Game settings" ), 1, (gpointer)PTAB_GAME_SETTINGS, -1 );
+ }
+ }
+
+ {
+ GtkTreeIter group;
+ gtk_tree_store_append( store, &group, NULL );
+ gtk_tree_store_set( store, &group, 0, _( "Display" ), 1, PTAB_FRONT, -1 );
+ {
+ GtkTreeIter tab;
+ gtk_tree_store_append( store, &tab, &group );
+ gtk_tree_store_set( store, &tab, 0, _( "2D Display/Rendering" ), 1, (gpointer)PTAB_2D, -1 );
+ }
+ {
+ GtkTreeIter tab;
+ gtk_tree_store_append( store, &tab, &group );
+ gtk_tree_store_set( store, &tab, 0, _( "3D View" ), 1, (gpointer)PTAB_CAMERA, -1 );
+ }
+ {
+ GtkTreeIter tab;
+ gtk_tree_store_append( store, &tab, &group );
+ gtk_tree_store_set( store, &tab, 0, _( "Texture Settings" ), 1, (gpointer)PTAB_TEXTURE, -1 );
+ }
+ }
+
+ {
+ GtkTreeIter group;
+ gtk_tree_store_append( store, &group, NULL );
+ gtk_tree_store_set( store, &group, 0, _( "Interface" ), 1, PTAB_FRONT, -1 );
+ {
+ GtkTreeIter tab;
+ gtk_tree_store_append( store, &tab, &group );
+ gtk_tree_store_set( store, &tab, 0, _( "Layout" ), 1, (gpointer)PTAB_LAYOUT, -1 );
+ }
+ {
+ GtkTreeIter tab;
+ gtk_tree_store_append( store, &tab, &group );
+ gtk_tree_store_set( store, &tab, 0, _( "Mouse" ), 1, (gpointer)PTAB_MOUSE, -1 );
+ }
+ {
+ GtkTreeIter tab;
+ gtk_tree_store_append( store, &tab, &group );
+ gtk_tree_store_set( store, &tab, 0, _( "Editing" ), 1, (gpointer)PTAB_EDITING, -1 );
+ }
+ }
+
+ {
+ GtkTreeIter group;
+ gtk_tree_store_append( store, &group, NULL );
+ gtk_tree_store_set( store, &group, 0, _( "Other" ), 1, PTAB_FRONT, -1 );
+ {
+ GtkTreeIter tab;
+ gtk_tree_store_append( store, &tab, &group );
+ gtk_tree_store_set( store, &tab, 0, _( "Startup/Auto save" ), 1, (gpointer)PTAB_STARTUP, -1 );
+ }
+ {
+ GtkTreeIter tab;
+ gtk_tree_store_append( store, &tab, &group );
+ gtk_tree_store_set( store, &tab, 0, _( "Paths" ), 1, (gpointer)PTAB_PATHS, -1 );
+ }
+ {
+ GtkTreeIter tab;
+ gtk_tree_store_append( store, &tab, &group );
+ gtk_tree_store_set( store, &tab, 0, _( "Brush" ), 1, (gpointer)PTAB_BRUSH, -1 );
+ }
+ {
+ GtkTreeIter tab;
+ gtk_tree_store_append( store, &tab, &group );
+ gtk_tree_store_set( store, &tab, 0, _( "Misc" ), 1, (gpointer)PTAB_MISC, -1 );
+ }
+ if ( !g_qeglobals.bBSPFrontendPlugin ) {
+ GtkTreeIter tab;
+ gtk_tree_store_append( store, &tab, &group );
+ gtk_tree_store_set( store, &tab, 0, _( "BSP Monitoring" ), 1, (gpointer)PTAB_BSPMONITOR, -1 );
+ }
+ }
+ }
+
+ gtk_tree_view_expand_all( GTK_TREE_VIEW( view ) );
+
+ g_object_unref( G_OBJECT( store ) );
+ }
+
+ /**********************************************************************/
+ /* build the prefs pages */
+ /**********************************************************************/
+
+ // Front page...
+ // todo : add something interesting here
+ // NOTE TTimo: tip of the day? or a logo?
+ preflabel = gtk_label_new( _( "Front Page" ) );
+ gtk_widget_show( preflabel );
+ pageframe = gtk_frame_new( NULL );
+ gtk_container_set_border_width( GTK_CONTAINER( pageframe ), 5 );
+ gtk_widget_show( pageframe );
+ vbox = gtk_vbox_new( FALSE, 5 );
+ gtk_widget_show( vbox );
+ gtk_widget_set_usize( GTK_WIDGET( vbox ), 350, -2 );
+ gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
+ gtk_container_add( GTK_CONTAINER( pageframe ), vbox );
+
+ gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), pageframe, preflabel );
+
+ /******** global preferences group ****************************/
+ preflabel = gtk_label_new( _( "Globals" ) );
+ gtk_widget_show( preflabel );
+
+ pageframe = mGamesDialog.GetGlobalFrame();
+ gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), pageframe, preflabel );
+
+ /******** 2D prefs group (xy views/rendering options) *********/
+ preflabel = gtk_label_new( _( "2D Display" ) );
+ gtk_widget_show( preflabel );
+ pageframe = gtk_frame_new( _( "2D Display" ) );
+ gtk_container_set_border_width( GTK_CONTAINER( pageframe ), 5 );
+ gtk_widget_show( pageframe );
+ vbox = gtk_vbox_new( FALSE, 5 );
+ gtk_widget_show( vbox );
+ gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
+ gtk_container_add( GTK_CONTAINER( pageframe ), vbox );
+
+ // OpenGL Display Lists
+ check = gtk_check_button_new_with_label( _( "OpenGL Display Lists" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bDisplayLists, DLG_CHECK_BOOL );
+
+ // Antialiased points & lines
+ // Fishman - Add antialiazed points and lines support. 09/03/00
+ check = gtk_check_button_new_with_label( _( "OpenGL antialiased points and lines" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bAntialiasedPointsAndLines, DLG_CHECK_BOOL );
+
+ // Solid selection boxes
+ check = gtk_check_button_new_with_label( _( "Solid selection boxes" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bNoStipple, DLG_CHECK_BOOL );
+
+ // Display size info
+ check = gtk_check_button_new_with_label( _( "Display size info" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bSizePaint, DLG_CHECK_BOOL );
+
+ // Alternate vertex/edge handles
+ // Gef: Kyro GL_POINT work around 25-aug-2001
+ check = gtk_check_button_new_with_label( _( "Alternate vertex/edge handles" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bGlPtWorkaround, DLG_CHECK_BOOL );
+
+ g_list_free( combo_list );
+
+#ifdef ATIHACK_812
+ // ATI bugs
+ check = gtk_check_button_new_with_label( _( "ATI and Intel cards w/ buggy drivers (disappearing polygons)" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bGlATIHack, DLG_CHECK_BOOL );
+#endif
+
+#ifdef NVIDIA_AERO_HACK
+ check = gtk_check_button_new_with_label( _( "NVIDIA/Aero bug - disable Windows composition" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bGlNvidiaAeroHack, DLG_CHECK_BOOL );
+#endif
+
+ // Add the page to the notebook
+ gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), pageframe, preflabel );
+
+ /******** 3D Camera view group *********/
+ preflabel = gtk_label_new( _( "3D View" ) );
+ gtk_widget_show( preflabel );
+ pageframe = gtk_frame_new( _( "3D View" ) );
+ gtk_container_set_border_width( GTK_CONTAINER( pageframe ), 5 );
+ gtk_widget_show( pageframe );
+ vbox = gtk_vbox_new( FALSE, 5 );
+ gtk_widget_show( vbox );
+ gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
+ gtk_container_add( GTK_CONTAINER( pageframe ), vbox );
+
+ // Directional velocity (Movement Velocity)
+ // label container
+ hbox2 = gtk_hbox_new( FALSE, 0 );
+ gtk_widget_show( hbox2 );
+ gtk_box_pack_start( GTK_BOX( vbox ), hbox2, FALSE, FALSE, 0 );
+
+ // label
+ label = gtk_label_new( _( "Movement Velocity" ) );
+ gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
+ gtk_widget_show( label );
+ gtk_box_pack_start( GTK_BOX( hbox2 ), label, FALSE, FALSE, 0 );
+
+ // adjustment
+ adj = gtk_adjustment_new( 100, 50, 300, 1, 10, 10 );
+ AddDialogData( adj, &m_nMoveSpeed, DLG_ADJ_INT );
+
+ // scale
+ scale = gtk_hscale_new( GTK_ADJUSTMENT( adj ) );
+ gtk_widget_show( scale );
+ gtk_box_pack_start( GTK_BOX( vbox ), scale, FALSE, TRUE, 2 );
+
+ gtk_scale_set_draw_value( GTK_SCALE( scale ), TRUE );
+
+ // Angular velocity (Rotational Velocity)
+ // label container
+ hbox2 = gtk_hbox_new( FALSE, 0 );
+ gtk_widget_show( hbox2 );
+ gtk_box_pack_start( GTK_BOX( vbox ), hbox2, FALSE, FALSE, 0 );
+
+ // label
+ label = gtk_label_new( _( "Rotational Velocity" ) );
+ gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
+ gtk_widget_show( label );
+ gtk_box_pack_start( GTK_BOX( hbox2 ), label, FALSE, FALSE, 0 );
+
+ // adjustment
+ adj = gtk_adjustment_new( 3, 1, 180, 1, 10, 10 ); // value, low, high, step, page_step, page_size
+ AddDialogData( adj, &m_nAngleSpeed, DLG_ADJ_INT );
+
+ // scale
+ scale = gtk_hscale_new( GTK_ADJUSTMENT( adj ) );
+ gtk_widget_show( scale );
+ gtk_box_pack_start( GTK_BOX( vbox ), scale, FALSE, TRUE, 2 );
+ gtk_scale_set_draw_value( GTK_SCALE( scale ), TRUE );
+
+ // Text under the velocity sliders
+ // container
+ hbox2 = gtk_hbox_new( FALSE, 0 );
+ gtk_widget_show( hbox2 );
+ gtk_box_pack_start( GTK_BOX( vbox ), hbox2, FALSE, FALSE, 0 );
+
+ // label
+ label = gtk_label_new( _( "slow" ) );
+ gtk_widget_show( label );
+ gtk_box_pack_start( GTK_BOX( hbox2 ), label, FALSE, FALSE, 0 );
+
+ // label
+ label = gtk_label_new( _( "fast" ) );
+ gtk_widget_show( label );
+ gtk_box_pack_end( GTK_BOX( hbox2 ), label, FALSE, FALSE, 0 );
+
+ // Allow drag to select multiple faces/brushes
+ // container
+ table = gtk_table_new( 2, 1, FALSE );
+ gtk_widget_show( table );
+ gtk_box_pack_start( GTK_BOX( vbox ), table, FALSE, TRUE, 0 );
+ gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
+ gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
+
+ label = gtk_label_new( _( "Use paint-select in camera view:" ) );
+ gtk_widget_show( label );
+ gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
+ gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+
+ combo_list = NULL;
+ combo_list = g_list_append( combo_list, (void *)_( "No" ) );
+ combo_list = g_list_append( combo_list, (void *)_( "Yes" ) );
+ combo_list = g_list_append( combo_list, (void *)_( "Yes (Classic Key Setup)" ) );
+
+ combo = gtk_combo_new();
+ gtk_combo_set_popdown_strings( GTK_COMBO( combo ), combo_list );
+ gtk_widget_show( combo );
+ gtk_table_attach( GTK_TABLE( table ), combo, 1, 2, 0, 1,
+ (GtkAttachOptions) ( GTK_FILL ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+ gtk_entry_set_editable( GTK_ENTRY( GTK_COMBO( combo )->entry ), FALSE );
+ AddDialogData( combo, &m_nCamDragMultiSelect, DLG_COMBO_INT );
+
+ // Freelook in Camera view
+ check = gtk_check_button_new_with_label( _( "Freelook in Camera view" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ gtk_label_set_justify( GTK_LABEL( GTK_BIN( check )->child ), GTK_JUSTIFY_LEFT );
+ AddDialogData( check, &m_bCamFreeLook, DLG_CHECK_BOOL );
+
+ // Freelook in Camera view w/ forward & back strafing instead of up and down looking
+ check = gtk_check_button_new_with_label( _( "Freelook strafes Forward and Back" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ gtk_label_set_justify( GTK_LABEL( GTK_BIN( check )->child ), GTK_JUSTIFY_LEFT );
+ AddDialogData( check, &m_bCamFreeLookStrafe, DLG_CHECK_BOOL );
+
+ // Invert mouse in freelook
+ check = gtk_check_button_new_with_label( _( "Invert mouse in freelook" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ gtk_label_set_justify( GTK_LABEL( GTK_BIN( check )->child ), GTK_JUSTIFY_LEFT );
+ AddDialogData( check, &m_bCamInverseMouse, DLG_CHECK_BOOL );
+
+ // Discrete movement
+ check = gtk_check_button_new_with_label( _( "Discrete movement" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ gtk_label_set_justify( GTK_LABEL( GTK_BIN( check )->child ), GTK_JUSTIFY_LEFT );
+ AddDialogData( check, &m_bCamDiscrete, DLG_CHECK_BOOL );
+
+ // Update XY views on camera move
+ check = gtk_check_button_new_with_label( _( "Update XY views on camera move" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ gtk_label_set_justify( GTK_LABEL( GTK_BIN( check )->child ), GTK_JUSTIFY_LEFT );
+ AddDialogData( check, &m_bCamXYUpdate, DLG_CHECK_BOOL );
+
+ // Add the page to the notebook
+ gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), pageframe, preflabel );
+
+ /******** Texture group *********/
+ preflabel = gtk_label_new( _( "Textures" ) );
+ gtk_widget_show( preflabel );
+ pageframe = gtk_frame_new( _( "Textures" ) );
+ gtk_container_set_border_width( GTK_CONTAINER( pageframe ), 5 );
+ gtk_widget_show( pageframe );
+ vbox = gtk_vbox_new( FALSE, 6 );
+ gtk_widget_show( vbox );
+ gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
+ gtk_container_add( GTK_CONTAINER( pageframe ), vbox );
+
+ // Texture quality slider
+ // label
+ label = gtk_label_new( _( "Texture quality" ) );
+ gtk_widget_show( label );
+ gtk_box_pack_start( GTK_BOX( vbox ), label, FALSE, FALSE, 0 );
+ gtk_misc_set_alignment( GTK_MISC( label ), 0, 0.5 );
+ gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
+
+ // adjustment
+ adj = gtk_adjustment_new( 0, 0, 4, 1, 1, 1 );
+ AddDialogData( adj, &m_nLatchedTextureQuality, DLG_ADJ_INT );
+
+ // scale
+ scale = gtk_hscale_new( GTK_ADJUSTMENT( adj ) );
+ gtk_widget_show( scale );
+ gtk_box_pack_start( GTK_BOX( vbox ), scale, FALSE, FALSE, 0 );
+ gtk_scale_set_draw_value( GTK_SCALE( scale ), FALSE );
+
+ // text under the texture slider
+ hbox2 = gtk_hbox_new( FALSE, 0 );
+ gtk_widget_show( hbox2 );
+ gtk_box_pack_start( GTK_BOX( vbox ), hbox2, FALSE, FALSE, 0 );
+ label = gtk_label_new( _( "low" ) );
+ gtk_widget_show( label );
+ gtk_box_pack_start( GTK_BOX( hbox2 ), label, FALSE, FALSE, 0 );
+ label = gtk_label_new( _( "high" ) );
+ gtk_widget_show( label );
+ gtk_box_pack_end( GTK_BOX( hbox2 ), label, FALSE, FALSE, 0 );
+
+ // texture subsets
+ check = gtk_check_button_new_with_label( _( "Texture subsets" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bTextureWindow, DLG_CHECK_BOOL );
+
+ // texture scrollbar
+ check = gtk_check_button_new_with_label( _( "Texture scrollbar" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bTextureScrollbar, DLG_CHECK_BOOL );
+
+ // texture increment matches grid
+ check = gtk_check_button_new_with_label( _( "Tex increment matches grid" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bSnapTToGrid, DLG_CHECK_BOOL );
+
+ // RIANT
+ // Texture compression choice label
+ // container
+ table = gtk_table_new( 2, 1, FALSE );
+ gtk_widget_show( table );
+ gtk_box_pack_start( GTK_BOX( vbox ), table, FALSE, TRUE, 0 );
+ gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
+ gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
+
+ label = gtk_label_new( _( "Texture Compression (if available):" ) );
+ gtk_widget_show( label );
+ gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
+ gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+ gtk_misc_set_alignment( GTK_MISC( label ), 0, 0.5 );
+
+ // Texture compression choice label
+ combo_list = NULL;
+ // NONE will always be in pos 0
+ combo_list = g_list_append( combo_list, (void *)_( "None" ) );
+
+ // if OpenGL compression is enabled it will always be
+ // in pos 1
+ if ( g_qeglobals.m_bOpenGLCompressionSupported ) {
+ combo_list = g_list_append( combo_list, (void *)_( "OpenGL ARB" ) );
+ }
+
+ // If S3 is enabled offer all 3 valid compression schemes in RGBA
+ if ( g_qeglobals.m_bS3CompressionSupported ) {
+ combo_list = g_list_append( combo_list, (void *)_( "S3TC DXT1" ) );
+ combo_list = g_list_append( combo_list, (void *)_( "S3TC DXT3" ) );
+ combo_list = g_list_append( combo_list, (void *)_( "S3TC DXT5" ) );
+ }
+
+ combo = gtk_combo_new();
+ gtk_combo_set_popdown_strings( GTK_COMBO( combo ), combo_list );
+ gtk_widget_show( combo );
+ gtk_table_attach( GTK_TABLE( table ), combo, 1, 2, 0, 1,
+ (GtkAttachOptions) ( GTK_FILL ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+ gtk_entry_set_editable( GTK_ENTRY( GTK_COMBO( combo )->entry ), FALSE );
+ AddDialogData( combo, &m_nTextureCompressionFormat, DLG_COMBO_INT );
+ g_list_free( combo_list );
+
+ // container
+ table = gtk_table_new( 2, 1, FALSE );
+ gtk_widget_show( table );
+ gtk_box_pack_start( GTK_BOX( vbox ), table, FALSE, TRUE, 0 );
+ gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
+ gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
+
+ // Startup shaders
+ // label
+ label = gtk_label_new( _( "Startup Shaders:" ) );
+ gtk_widget_show( label );
+ gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
+ gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+ gtk_misc_set_alignment( GTK_MISC( label ), 0, 0.5 );
+
+ // combo list
+ combo_list = NULL;
+ combo_list = g_list_append( combo_list, (void *)_( "None" ) );
+ if ( g_pGameDescription->mGameFile == "jk2.game" || g_pGameDescription->mGameFile == "ja.game" ) {
+ combo_list = g_list_append( combo_list, (void *)_( "System" ) );
+ }
+ else if ( g_pGameDescription->mGameFile == "sof2.game" ) {
+ combo_list = g_list_append( combo_list, (void *)( "Tools" ) );
+ }
+ else{
+ combo_list = g_list_append( combo_list, (void *)_( "Common" ) );
+ }
+ combo_list = g_list_append( combo_list, (void *)_( "All" ) );
+ combo = gtk_combo_new();
+ gtk_combo_set_popdown_strings( GTK_COMBO( combo ), combo_list );
+ gtk_widget_show( combo );
+ gtk_table_attach( GTK_TABLE( table ), combo, 1, 2, 0, 1,
+ (GtkAttachOptions) ( GTK_FILL ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+ gtk_entry_set_editable( GTK_ENTRY( GTK_COMBO( combo )->entry ), FALSE );
+ AddDialogData( combo, &m_nLatchedShader, DLG_COMBO_INT );
+ g_list_free( combo_list );
+
+ // Add the page to the notebook
+ gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), pageframe, preflabel );
+
+ /******** Layout group *********/
+ preflabel = gtk_label_new( _( "Layout" ) );
+ gtk_widget_show( preflabel );
+ pageframe = gtk_frame_new( _( "Layout" ) );
+ gtk_container_set_border_width( GTK_CONTAINER( pageframe ), 5 );
+ gtk_widget_show( pageframe );
+ vbox = gtk_vbox_new( FALSE, 5 );
+ gtk_widget_show( vbox );
+ gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
+ gtk_container_add( GTK_CONTAINER( pageframe ), vbox );
+
+ // View types
+ // table
+ table = gtk_table_new( 2, 4, FALSE );
+ gtk_widget_show( table );
+ gtk_box_pack_start( GTK_BOX( vbox ), table, FALSE, TRUE, 0 );
+ gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
+ gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
+
+ // view type 1
+ pixmap = new_pixmap( g_pParentWnd->m_pWidget, "window1.bmp" );
+ gtk_widget_show( pixmap );
+ gtk_table_attach( GTK_TABLE( table ), pixmap, 0, 1, 0, 1,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+
+ // view type 2
+ pixmap = new_pixmap( g_pParentWnd->m_pWidget, "window2.bmp" );
+ gtk_widget_show( pixmap );
+ gtk_table_attach( GTK_TABLE( table ), pixmap, 1, 2, 0, 1,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+
+ // view type 3
+ pixmap = new_pixmap( g_pParentWnd->m_pWidget, "window3.bmp" );
+ gtk_widget_show( pixmap );
+ gtk_table_attach( GTK_TABLE( table ), pixmap, 2, 3, 0, 1,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+
+ // view type 4
+ pixmap = new_pixmap( g_pParentWnd->m_pWidget, "window4.bmp" );
+ gtk_widget_show( pixmap );
+ gtk_table_attach( GTK_TABLE( table ), pixmap, 3, 4, 0, 1,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+
+ // view type 1 selector
+ radio = gtk_radio_button_new( NULL );
+ gtk_widget_show( radio );
+ gtk_table_attach( GTK_TABLE( table ), radio, 0, 1, 1, 2,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+
+ // view type 2 selector
+ radio = gtk_radio_button_new_from_widget( GTK_RADIO_BUTTON( radio ) );
+ gtk_widget_show( radio );
+ gtk_table_attach( GTK_TABLE( table ), radio, 1, 2, 1, 2,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+
+ // view type 3 selector
+ radio = gtk_radio_button_new_from_widget( GTK_RADIO_BUTTON( radio ) );
+ gtk_widget_show( radio );
+ gtk_table_attach( GTK_TABLE( table ), radio, 2, 3, 1, 2,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+
+ // view type 4 selector
+ radio = gtk_radio_button_new_from_widget( GTK_RADIO_BUTTON( radio ) );
+ gtk_widget_show( radio );
+ gtk_table_attach( GTK_TABLE( table ), radio, 3, 4, 1, 2,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+ AddDialogData( radio, &m_nLatchedView, DLG_RADIO_INT );
+
+ // Floating Z window
+ check = gtk_check_button_new_with_label( _( "Floating Z Window" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bLatchedFloatingZ, DLG_CHECK_BOOL );
+
+ // show menu tear-off seperators
+ check = gtk_check_button_new_with_label( _( "Detachable Menus" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bLatchedDetachableMenus, DLG_CHECK_BOOL );
+
+ if ( !g_pGameDescription->mNoPatch ) {
+ // show patch toolbar
+ check = gtk_check_button_new_with_label( _( "Patch Toolbar" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ g_object_set_data( G_OBJECT( dialog ), "check_patchtoolbar", check ); // Allow to be disabled for Q1/Q2
+ AddDialogData( check, &m_bLatchedPatchToolbar, DLG_CHECK_BOOL );
+ }
+
+ // use wide toolbar
+ check = gtk_check_button_new_with_label( _( "Wide Toolbar" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bLatchedWideToolbar, DLG_CHECK_BOOL );
+
+ // use plugin toolbar
+ check = gtk_check_button_new_with_label( _( "Plugin Toolbar" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bLatchedPluginToolbar, DLG_CHECK_BOOL );
+
+#ifdef _WIN32
+ // win32 file dialog
+ check = gtk_check_button_new_with_label( _( "Use win32 file dialog (hacky)" ) );
+ gtk_widget_show( check );
+ // gtk_container_add (GTK_CONTAINER (vbox), check);
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bNativeGUI, DLG_CHECK_BOOL );
+
+ // position on primary monitor
+ check = gtk_check_button_new_with_label( _( "Start on Primary Monitor" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ g_object_set_data( G_OBJECT( dialog ), "check_startonprimary", check );
+ gtk_signal_connect( GTK_OBJECT( check ), "clicked", GTK_SIGNAL_FUNC( UpdateSensitivity ), this );
+ AddDialogData( check, &m_bStartOnPrimMon, DLG_CHECK_BOOL );
+#endif
+
+ // Add the page to the notebook
+ gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), pageframe, preflabel );
+
+ /******** Mouse group *********/
+ preflabel = gtk_label_new( _( "Mouse" ) );
+ gtk_widget_show( preflabel );
+ pageframe = gtk_frame_new( _( "Mouse" ) );
+ gtk_container_set_border_width( GTK_CONTAINER( pageframe ), 5 );
+ gtk_widget_show( pageframe );
+ vbox = gtk_vbox_new( FALSE, 5 );
+ gtk_widget_show( vbox );
+ gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
+ gtk_container_add( GTK_CONTAINER( pageframe ), vbox );
+
+ // Buttons
+ // container
+ hbox2 = gtk_hbox_new( FALSE, 5 );
+ gtk_widget_show( hbox2 );
+ gtk_box_pack_start( GTK_BOX( vbox ), hbox2, FALSE, FALSE, 0 );
+
+ // 2 button radio
+ radio = gtk_radio_button_new_with_label( NULL, _( "2 button" ) );
+ gtk_widget_show( radio );
+ gtk_box_pack_start( GTK_BOX( hbox2 ), radio, FALSE, FALSE, 0 );
+
+ // 3 button radio
+ radio = gtk_radio_button_new_with_label_from_widget( GTK_RADIO_BUTTON( radio ), _( "3 button" ) );
+ gtk_widget_show( radio );
+ gtk_box_pack_start( GTK_BOX( hbox2 ), radio, FALSE, FALSE, 0 );
+ AddDialogData( radio, &m_nMouse, DLG_RADIO_INT );
+
+ // right click to drop entity
+ check = gtk_check_button_new_with_label( _( "Right click to drop entities" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bRightClick, DLG_CHECK_BOOL );
+
+ // Mouse chaser (and this does what?)
+ check = gtk_check_button_new_with_label( _( "Mouse chaser" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bChaseMouse, DLG_CHECK_BOOL );
+
+ // Alt + multi-drag
+ check = gtk_check_button_new_with_label( _( "ALT + multi-drag" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bALTEdge, DLG_CHECK_BOOL );
+
+ // Mouse wheel increments
+ // container
+ hbox2 = gtk_hbox_new( FALSE, 5 );
+ gtk_widget_show( hbox2 );
+ gtk_box_pack_start( GTK_BOX( vbox ), hbox2, FALSE, FALSE, 0 );
+
+ // label
+ label = gtk_label_new( _( "Wheel Mouse inc:" ) );
+ gtk_widget_show( label );
+ gtk_box_pack_start( GTK_BOX( hbox2 ), label, FALSE, FALSE, 0 );
+
+ // entry
+ entry = gtk_entry_new();
+ gtk_widget_show( entry );
+ gtk_widget_set_usize( entry, 40, -2 );
+ gtk_box_pack_start( GTK_BOX( hbox2 ), entry, FALSE, FALSE, 0 );
+ AddDialogData( entry, &m_nWheelInc, DLG_ENTRY_INT );
+
+ // Add the page to the notebook
+ gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), pageframe, preflabel );
+
+ /******** Editing group *********/
+ preflabel = gtk_label_new( _( "Editing" ) );
+ gtk_widget_show( preflabel );
+ pageframe = gtk_frame_new( _( "Editing" ) );
+ gtk_container_set_border_width( GTK_CONTAINER( pageframe ), 5 );
+ gtk_widget_show( pageframe );
+ vbox = gtk_vbox_new( FALSE, 5 );
+ gtk_widget_show( vbox );
+ gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
+ gtk_container_add( GTK_CONTAINER( pageframe ), vbox );
+
+ // Vertex editing splits faces
+ check = gtk_check_button_new_with_label( _( "Vertex editing splits face" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bVertexSplit, DLG_CHECK_BOOL );
+
+ // Fix target/targetname collisions
+ check = gtk_check_button_new_with_label( _( "Fix target/targetname collisions" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bDoTargetFix, DLG_CHECK_BOOL );
+
+ // Clipper tool uses caulk
+ check = gtk_check_button_new_with_label( _( "Clipper tool uses caulk" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bClipCaulk, DLG_CHECK_BOOL );
+
+ // Don't clamp plane points
+ check = gtk_check_button_new_with_label( _( "Don't clamp plane points" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bNoClamp, DLG_CHECK_BOOL );
+
+ // Snap to grid
+ check = gtk_check_button_new_with_label( _( "Snap to grid" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bSnap, DLG_CHECK_BOOL );
+
+ // Select patch by bounding box
+ check = gtk_check_button_new_with_label( _( "Select patches by bounding box" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bPatchBBoxSelect, DLG_CHECK_BOOL );
+
+ // Rotation increment
+ // container
+ table = gtk_table_new( 2, 3, FALSE );
+ gtk_widget_show( table );
+ gtk_box_pack_start( GTK_BOX( vbox ), table, FALSE, TRUE, 0 );
+ gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
+ gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
+
+ // label
+ label = gtk_label_new( _( "Rotation increment:" ) );
+ gtk_widget_show( label );
+ gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+
+ // entry
+ entry = gtk_entry_new();
+ gtk_widget_show( entry );
+ gtk_widget_set_usize( entry, 60, -2 );
+ gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 0, 1,
+ (GtkAttachOptions) ( GTK_FILL ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+ AddDialogData( entry, &m_nRotation, DLG_ENTRY_INT );
+
+ // Undo levels
+ // label
+ label = gtk_label_new( _( "Undo Levels:" ) );
+ gtk_widget_show( label );
+ gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 1, 2,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+
+ // spinner (allows undo levels to be set to zero)
+ spin = gtk_spin_button_new( GTK_ADJUSTMENT( gtk_adjustment_new( 1, 0, 64, 1, 10, 10 ) ), 1, 0 );
+ gtk_widget_show( spin );
+ gtk_table_attach( GTK_TABLE( table ), spin, 1, 2, 1, 2,
+ (GtkAttachOptions) ( GTK_FILL ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+ gtk_widget_set_usize( spin, 60, -2 );
+ AddDialogData( spin, &m_nUndoLevels, DLG_SPIN_INT );
+
+ // Patch subdivisions
+ // label
+ label = gtk_label_new( _( "Patch subdivisions:" ) );
+ gtk_widget_show( label );
+ gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 2, 3,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+
+ // entry (spinner perhaps? [2-16])
+ entry = gtk_entry_new();
+ gtk_widget_show( entry );
+ gtk_widget_set_usize( entry, 60, -2 );
+ gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 2, 3,
+ (GtkAttachOptions) ( GTK_FILL ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+ AddDialogData( entry, &m_nSubdivisions, DLG_ENTRY_INT );
+
+ // Add the page to the notebook
+ gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), pageframe, preflabel );
+
+ /******** Save/Load group *********/
+ preflabel = gtk_label_new( _( "Startup/Auto save" ) );
+ gtk_widget_show( preflabel );
+ pageframe = gtk_frame_new( _( "Startup/Auto save" ) );
+ gtk_container_set_border_width( GTK_CONTAINER( pageframe ), 5 );
+ gtk_widget_show( pageframe );
+ vbox = gtk_vbox_new( FALSE, 5 );
+ gtk_widget_show( vbox );
+ gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
+ gtk_container_add( GTK_CONTAINER( pageframe ), vbox );
+
+ // Snapshots
+ check = gtk_check_button_new_with_label( _( "Snapshots" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bSnapShots, DLG_CHECK_BOOL );
+
+ // load last project on open
+ check = gtk_check_button_new_with_label( _( "Load last project on open" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bLoadLast, DLG_CHECK_BOOL );
+
+ // load last map on open
+ check = gtk_check_button_new_with_label( _( "Load last map on open" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bLoadLastMap, DLG_CHECK_BOOL );
+
+ // Auto save..
+ // container
+ hbox2 = gtk_hbox_new( FALSE, 5 );
+ gtk_widget_show( hbox2 );
+ gtk_box_pack_start( GTK_BOX( vbox ), hbox2, FALSE, FALSE, 0 );
+ gtk_container_set_border_width( GTK_CONTAINER( hbox2 ), 0 );
+
+ // label
+ check = gtk_check_button_new_with_label( _( "Auto save every" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( hbox2 ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bAutoSave, DLG_CHECK_BOOL );
+
+ // spinner
+ spin = gtk_spin_button_new( GTK_ADJUSTMENT( gtk_adjustment_new( 1, 1, 60, 1, 10, 10 ) ), 1, 0 );
+ gtk_widget_show( spin );
+ gtk_box_pack_start( GTK_BOX( hbox2 ), spin, FALSE, FALSE, 0 );
+ gtk_widget_set_usize( spin, 60, -2 );
+ AddDialogData( spin, &m_nAutoSave, DLG_SPIN_INT );
+
+ // label
+ label = gtk_label_new( _( "minutes" ) );
+ gtk_widget_show( label );
+ gtk_box_pack_start( GTK_BOX( hbox2 ), label, FALSE, FALSE, 0 );
+
+ // Add the page to the notebook
+ gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), pageframe, preflabel );
+
+ /******** Paths group *********/
+ preflabel = gtk_label_new( _( "Paths" ) );
+ gtk_widget_show( preflabel );
+ pageframe = gtk_frame_new( _( "Paths" ) );
+ gtk_container_set_border_width( GTK_CONTAINER( pageframe ), 5 );
+ gtk_widget_show( pageframe );
+ vbox = gtk_vbox_new( FALSE, 5 );
+ gtk_widget_show( vbox );
+ gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
+ gtk_container_add( GTK_CONTAINER( pageframe ), vbox );
+
+ // prefab path
+ // table
+ table = gtk_table_new( 3, 3, FALSE );
+ gtk_widget_show( table );
+ gtk_box_pack_start( GTK_BOX( vbox ), table, FALSE, TRUE, 0 );
+ gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
+ gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
+
+ // label
+ label = gtk_label_new( _( "Prefab path:" ) );
+ gtk_widget_show( label );
+ gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+ gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
+
+ // path entry
+ entry = gtk_entry_new();
+ gtk_widget_show( entry );
+ gtk_widget_set_usize( GTK_WIDGET( entry ), 240, -2 );
+ gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 0, 1,
+ (GtkAttachOptions) ( GTK_FILL ),
+ (GtkAttachOptions) ( 0 ), 1, 0 );
+ AddDialogData( entry, &m_strPrefabPath, DLG_ENTRY_TEXT );
+
+#if 0
+ // browse button
+ button = gtk_button_new_with_label( "..." );
+ gtk_widget_show( button );
+ gtk_signal_connect( GTK_OBJECT( button ), "clicked", GTK_SIGNAL_FUNC( OnBtnBrowseprefab ), this );
+ gtk_table_attach( GTK_TABLE( table ), button, 2, 3, 0, 1,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+#endif
+
+ // User ini path
+ // label
+ label = gtk_label_new( _( "User INI path:" ) );
+ gtk_widget_show( label );
+ gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 1, 2,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+ gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
+
+ // user ini path entry
+ entry = gtk_entry_new();
+ gtk_widget_show( entry );
+ gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 1, 2,
+ (GtkAttachOptions) ( GTK_FILL ),
+ (GtkAttachOptions) ( 0 ), 1, 0 );
+ AddDialogData( entry, &m_strUserPath, DLG_ENTRY_TEXT );
+
+ // user ini browse button
+ button = gtk_button_new_with_label( "..." );
+ gtk_widget_show( button );
+ gtk_signal_connect( GTK_OBJECT( button ), "clicked", GTK_SIGNAL_FUNC( OnBtnBrowseuserini ), this );
+ gtk_table_attach( GTK_TABLE( table ), button, 2, 3, 1, 2,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+
+ // Add the page to the notebook
+ gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), pageframe, preflabel );
+
+ /******** Brush group ********/
+ preflabel = gtk_label_new( _( "Brush" ) );
+ gtk_widget_show( preflabel );
+ pageframe = gtk_frame_new( _( "Brush" ) );
+ gtk_container_set_border_width( GTK_CONTAINER( pageframe ), 5 );
+ gtk_widget_show( pageframe );
+ vbox = gtk_vbox_new( FALSE, 5 );
+ gtk_widget_show( vbox );
+ gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
+ gtk_container_add( GTK_CONTAINER( pageframe ), vbox );
+
+ // default texture scale
+ // table
+ table = gtk_table_new( 2, 1, FALSE ); // I believe that the 2 and 1 are switched here, and this is
+ // intentional to be consistent with other calls to gtk_table_new()
+ // [that are probably also switched].
+ gtk_widget_show( table );
+ gtk_box_pack_start( GTK_BOX( vbox ), table, FALSE, TRUE, 0 );
+ gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
+ gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
+
+ // label
+ label = gtk_label_new( _( "Default texture scale:" ) );
+ gtk_widget_show( label );
+ gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
+ gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+
+ // scale entry
+ entry = gtk_entry_new();
+ gtk_widget_show( entry );
+ gtk_widget_set_usize( GTK_WIDGET( entry ), 60, -2 );
+ gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 0, 1,
+ (GtkAttachOptions) ( GTK_FILL ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+ AddDialogData( entry, &m_fDefTextureScale, DLG_ENTRY_FLOAT );
+
+ // Add the page to the notebook
+ gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), pageframe, preflabel );
+
+ /******** Misc group *********/
+ preflabel = gtk_label_new( _( "Misc" ) );
+ gtk_widget_show( preflabel );
+ pageframe = gtk_frame_new( _( "Misc" ) );
+ gtk_container_set_border_width( GTK_CONTAINER( pageframe ), 5 );
+ gtk_widget_show( pageframe );
+ vbox = gtk_vbox_new( FALSE, 5 );
+ gtk_widget_show( vbox );
+ gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
+ gtk_container_add( GTK_CONTAINER( pageframe ), vbox );
+
+ // Light drawing
+ check = gtk_check_button_new_with_label( _( "Light drawing" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &m_bNewLightDraw, DLG_CHECK_BOOL );
+
+ // Light radiuses
+ // container
+ table = gtk_table_new( 2, 1, FALSE );
+ gtk_widget_show( table );
+ gtk_box_pack_start( GTK_BOX( vbox ), table, FALSE, TRUE, 0 );
+ gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
+ gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
+
+ label = gtk_label_new( _( "Light radiuses:" ) );
+ gtk_widget_show( label );
+ gtk_label_set_justify( GTK_LABEL( label ), GTK_JUSTIFY_LEFT );
+ gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+
+ combo_list = NULL;
+ combo_list = g_list_append( combo_list, (void *)_( "Disabled" ) );
+ combo_list = g_list_append( combo_list, (void *)_( "True Q3Map2 Style" ) );
+ combo_list = g_list_append( combo_list, (void *)_( "Classic Style" ) );
+
+ combo = gtk_combo_new();
+ gtk_combo_set_popdown_strings( GTK_COMBO( combo ), combo_list );
+ gtk_widget_show( combo );
+ gtk_table_attach( GTK_TABLE( table ), combo, 1, 2, 0, 1,
+ (GtkAttachOptions) ( GTK_FILL ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+ gtk_entry_set_editable( GTK_ENTRY( GTK_COMBO( combo )->entry ), FALSE );
+ AddDialogData( combo, &m_nLightRadiuses, DLG_COMBO_INT );
+
+#ifdef _WIN32
+ check = gtk_check_button_new_with_label( _( "Use win32 file associations to open text files instead of builtin editor" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ AddDialogData( check, &g_PrefsDlg.m_bUseWin32Editor, DLG_CHECK_BOOL );
+#else
+ // use custom shader editor
+ check = gtk_check_button_new_with_label( _( "Use Custom Shader Editor" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ gtk_signal_connect( GTK_OBJECT( check ), "clicked", GTK_SIGNAL_FUNC( UpdateEditorSensitivity ), this );
+ g_object_set_data( G_OBJECT( dialog ), "check_customeditor", check );
+ AddDialogData( check, &g_PrefsDlg.m_bUseCustomEditor, DLG_CHECK_BOOL );
+
+ // custom shader editor executable
+ // table
+ table = gtk_table_new( 3, 1, FALSE );
+ gtk_widget_show( table );
+ gtk_box_pack_start( GTK_BOX( vbox ), table, FALSE, TRUE, 0 );
+ gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
+ gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
+
+ // label
+ label = gtk_label_new( _( "Custom Editor Command" ) );
+ gtk_widget_show( label );
+ gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+ gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 );
+ g_object_set_data( G_OBJECT( dialog ), "label_customeditor", label );
+ gtk_widget_set_sensitive( label, g_PrefsDlg.m_bUseCustomEditor );
+
+ // custom editor command entry
+ entry = gtk_entry_new();
+ gtk_widget_show( entry );
+ gtk_widget_set_usize( GTK_WIDGET( entry ), 240, -2 );
+ gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 0, 1,
+ (GtkAttachOptions) ( GTK_FILL ),
+ (GtkAttachOptions) ( 0 ), 1, 0 );
+ AddDialogData( entry, &m_strEditorCommand, DLG_ENTRY_TEXT );
+ gtk_widget_set_sensitive( entry, g_PrefsDlg.m_bUseCustomEditor );
+ g_object_set_data( G_OBJECT( dialog ), "entry_customeditor", entry );
+
+ // browse button
+ button = gtk_button_new_with_label( _( "..." ) );
+ gtk_widget_show( button );
+ gtk_signal_connect( GTK_OBJECT( button ), "clicked", GTK_SIGNAL_FUNC( OnBtnBrowseEditor ), this );
+ gtk_table_attach( GTK_TABLE( table ), button, 2, 3, 0, 1,
+ (GtkAttachOptions) ( 0 ),
+ (GtkAttachOptions) ( 0 ), 0, 0 );
+ g_object_set_data( G_OBJECT( dialog ), "button_customeditor", button );
+ gtk_widget_set_sensitive( button, g_PrefsDlg.m_bUseCustomEditor );
+#endif
+
+ // Add the page to the notebook
+ gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), pageframe, preflabel );
+
+ /******** BSP Monitoring group *********/
+ // this is never displayed if the plugin isn't available
+ preflabel = gtk_label_new( _( "BSP Monitoring" ) );
+ gtk_widget_show( preflabel );
+ pageframe = gtk_frame_new( _( "BSP Monitoring" ) );
+ gtk_container_set_border_width( GTK_CONTAINER( pageframe ), 5 );
+ gtk_widget_show( pageframe );
+ vbox = gtk_vbox_new( FALSE, 5 );
+ gtk_widget_show( vbox );
+ gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
+ gtk_container_add( GTK_CONTAINER( pageframe ), vbox );
+
+ // Enable BSP process monitoring
+ check = gtk_check_button_new_with_label( _( "Enable BSP process monitoring" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ g_object_set_data( G_OBJECT( dialog ), "check_monitorbsp", check );
+ gtk_signal_connect( GTK_OBJECT( check ), "clicked", GTK_SIGNAL_FUNC( UpdateSensitivity ), this );
+ AddDialogData( check, &g_PrefsDlg.m_bWatchBSP, DLG_CHECK_BOOL );
+
+ // Stop on leak
+ check = gtk_check_button_new_with_label( _( "Stop compilation on leak" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ g_object_set_data( G_OBJECT( dialog ), "check_leakstop", check );
+ AddDialogData( check, &g_PrefsDlg.m_bLeakStop, DLG_CHECK_BOOL );
+
+ // engine after compile
+ check = gtk_check_button_new_with_label( _( "Run engine after compile" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ g_object_set_data( G_OBJECT( dialog ), "check_runengine", check );
+ gtk_signal_connect( GTK_OBJECT( check ), "clicked", GTK_SIGNAL_FUNC( UpdateSensitivity ), this );
+ AddDialogData( check, &g_PrefsDlg.m_bRunQuake, DLG_CHECK_BOOL );
+
+ // sleep mode when running engine
+ check = gtk_check_button_new_with_label( _( "Activate sleep mode when running the engine" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ g_object_set_data( G_OBJECT( dialog ), "check_sleep", check );
+ AddDialogData( check, &g_PrefsDlg.m_bDoSleep, DLG_CHECK_BOOL );
+
+ // use q3map2's texture projection
+ check = gtk_check_button_new_with_label( _( "Texturing compatible with q3map2" ) );
+ gtk_widget_show( check );
+ gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
+ g_object_set_data( G_OBJECT( dialog ), "check_q3map2", check );
+ AddDialogData( check, &g_PrefsDlg.m_bQ3Map2Texturing, DLG_CHECK_BOOL );
+
+ // Add the page to the notebook
+ gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), pageframe, preflabel );
+
+ gtk_notebook_set_page( GTK_NOTEBOOK( notebook ), PTAB_FRONT );
+
+ return;
+}
+
+// end new prefs dialog
+
+void PrefsDlg::LoadTexdefPref( texdef_t* pTexdef, const char* pName ){
+ char buffer[256];
+
+ memset( pTexdef, 0, sizeof( texdef_t ) );
+
+ sprintf( buffer, "%s%s", pName, TD_SCALE1_KEY );
+ mLocalPrefs.GetPref( buffer, &pTexdef->scale[0], 0.5f );
+
+ sprintf( buffer, "%s%s", pName, TD_SCALE2_KEY );
+ mLocalPrefs.GetPref( buffer, &pTexdef->scale[1], 0.5f );
+
+ sprintf( buffer, "%s%s", pName, TD_SHIFT1_KEY );
+ mLocalPrefs.GetPref( buffer, &pTexdef->shift[0], 8.f );
+
+ sprintf( buffer, "%s%s", pName, TD_SHIFT2_KEY );
+ mLocalPrefs.GetPref( buffer, &pTexdef->shift[1], 8.f );
+
+ sprintf( buffer, "%s%s", pName, TD_ROTATE_KEY );
+ mLocalPrefs.GetPref( buffer, &pTexdef->rotate, 45 );
+}
+
+void PrefsDlg::UpdateTextureCompression(){
+ // if OpenGL is not ready yet, don't do anything
+ if ( !g_qeglobals.m_bOpenGLReady ) {
+ Sys_Printf( "OpenGL not ready - postpone texture compression capability check\n" );
+ return;
+ }
+
+ if ( g_qeglobals.bTextureCompressionSupported ) {
+ if ( m_nTextureCompressionFormat >= 2 && !g_qeglobals.m_bS3CompressionSupported ) {
+ Sys_Printf( "Inconsistant pref setting for texture compression (%d), rolling back\n", m_nTextureCompressionFormat );
+ m_nTextureCompressionFormat = 1; // if this is not supported either, see below
+ }
+ if ( m_nTextureCompressionFormat == 1 && !g_qeglobals.m_bOpenGLCompressionSupported ) {
+ Sys_Printf( "Inconsistant pref setting for texture compression (GL_COMPRESSED_RGBA), rolling back\n" );
+ m_nTextureCompressionFormat = 0;
+ }
+ switch ( m_nTextureCompressionFormat )
+ {
+ case ( 0 ):
+ {
+ g_qeglobals.texture_components = GL_RGBA;
+ Sys_Printf( "texture compression disabled by preferences settings\n" );
+ break;
+ }
+ case ( 1 ):
+ {
+ g_qeglobals.texture_components = GL_COMPRESSED_RGBA;
+ Sys_Printf( "OpenGL texture compression enabled\n" );
+ break;
+ }
+ case ( 2 ):
+ {
+ g_qeglobals.texture_components = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
+ Sys_Printf( "S3TC DXT1 texture compression enabled\n" );
+ break;
+ }
+ case ( 3 ):
+ {
+ g_qeglobals.texture_components = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
+ Sys_Printf( "S3TC DXT3 texture compression enabled\n" );
+ break;
+ }
+ case ( 4 ):
+ {
+ g_qeglobals.texture_components = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
+ Sys_Printf( "S3TC DXT5 texture compression enabled\n" );
+ break;
+ }
+ }
+ }
+ else
+ {
+ Sys_Printf( "texture compression is not supported by your current graphic card/drivers\n" );
+ g_qeglobals.texture_components = GL_RGBA;
+ m_nTextureCompressionFormat = 0;
+ }
+}
+
+#ifdef ATIHACK_812
+void PrefsDlg::UpdateATIHack() {
+ // if OpenGL is not ready yet, don't do anything
+ if ( !g_qeglobals.m_bOpenGLReady ) {
+ Sys_Printf( "OpenGL not ready - postpone ATI bug workaround setup\n" );
+ return;
+ }
+
+ if ( m_bGlATIHack ) {
+ qglCullFace = &qglCullFace_ATIHack;
+ qglDisable = &qglDisable_ATIHack;
+ qglEnable = &qglEnable_ATIHack;
+ qglPolygonMode = &qglPolygonMode_ATIHack;
+ Sys_Printf( "ATI bug workaround enabled\n" );
+ }
+ else {
+ qglCullFace = qglCullFace_real;
+ qglDisable = qglDisable_real;
+ qglEnable = qglEnable_real;
+ qglPolygonMode = qglPolygonMode_real;
+ Sys_Printf( "ATI bug workaround disabled\n" );
+ }
+}
+#endif
+
+#ifdef NVIDIA_AERO_HACK
+void PrefsDlg::UpdateNvidiaAeroHack() {
+ if ( m_bGlNvidiaAeroHack && m_bGlNvidiaAeroHackPrevState == 1 ) {
+ return;
+ }
+ if ( ( !m_bGlNvidiaAeroHack ) && m_bGlNvidiaAeroHackPrevState == 0 ) {
+ return;
+ }
+ if ( ( !m_bGlNvidiaAeroHack ) && m_bGlNvidiaAeroHackPrevState < 0 ) {
+ // The hack state is uninitialized, meaning that this is the first call
+ // to this function. I prefer not to explicitly enable composition because
+ // the user may have set the application to disable it, and I don't want to
+ // override that. Leave the state of composition as-is if the hack checkbox
+ // isn't checked.
+ m_bGlNvidiaAeroHackPrevState = 0;
+ return;
+ }
+ HMODULE lib = LoadLibrary( "dwmapi.dll" );
+ if ( lib ) {
+ void ( WINAPI *qDwmEnableComposition )( bool bEnable ) =
+ ( void (WINAPI *) ( bool bEnable ) )GetProcAddress( lib, "DwmEnableComposition" );
+ if ( qDwmEnableComposition ) {
+ if ( m_bGlNvidiaAeroHack ) {
+ Sys_Printf( "Disabling Windows composition\n" );
+ qDwmEnableComposition( 0 );
+ m_bGlNvidiaAeroHackPrevState = 1;
+ }
+ else {
+ Sys_Printf( "Enabling Windows composition\n" );
+ qDwmEnableComposition( 1 );
+ m_bGlNvidiaAeroHackPrevState = 0;
+ }
+ }
+ FreeLibrary( lib );
+ }
+}
+#endif
+
+// TTimo: m_strEnginePath has a special status, if not found in registry we need to
+// initiliaze it for sure. It is not totally failsafe but we can use the same
+// code than in q3map, expecting to find some "quake" above us. If not, we prompt
+// for the engine executable path
+void PrefsDlg::LoadPrefs(){
+ int i;
+
+ // first things first, load prefs from global prefs
+ mGamesDialog.LoadPrefs();
+
+ // if we already have a document loaded, we will free and reload from file
+ if ( mLocalPrefs.InUse() ) {
+ mLocalPrefs.Clear();
+ }
+
+ // load local.pref file
+ mLocalPrefs.ReadXMLFile( m_inipath->str );
+
+ mLocalPrefs.GetPref( PATCHSHOWBOUNDS_KEY, &g_bPatchShowBounds, FALSE );
+ mLocalPrefs.GetPref( MOUSE_KEY, &m_nMouse, MOUSE_DEF );
+ m_nMouseButtons = m_nMouse ? 3 : 2;