]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/findtexturedialog.cpp
Merge commit '1644eeece07040927ced5628e3922774576c64c9' into master-merge
[xonotic/netradiant.git] / radiant / findtexturedialog.cpp
index 5fd58f7c426a7a1f0a001e3fdee569497918f3e6..fcb78edd0d8e3bf7ea34553b0d174124c58a3e1d 100644 (file)
 
 #include "findtexturedialog.h"
 
+#include <gtk/gtk.h>
+
 #include "debugging/debugging.h"
 
 #include "ishaders.h"
 
-#include <gtk/gtkhbox.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtkvbox.h>
-#include <gtk/gtkframe.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtktable.h>
-#include <gtk/gtkbutton.h>
-#include <gtk/gtktogglebutton.h>
-#include <gtk/gtkcheckbutton.h>
-#include <gtk/gtkmenuitem.h>
-#include <gtk/gtkarrow.h>
-
 #include "gtkutil/window.h"
 #include "stream/stringstream.h"
 
 class FindTextureDialog : public Dialog
 {
 public:
+WindowPositionTracker m_position_tracker;
 static void setReplaceStr( const char* name );
 static void setFindStr( const char* name );
 static bool isOpen();
 static void show();
-typedef FreeCaller<&FindTextureDialog::show> ShowCaller;
+typedef FreeCaller<void(), &FindTextureDialog::show> ShowCaller;
 static void updateTextures( const char* name );
 
 FindTextureDialog();
 virtual ~FindTextureDialog();
-GtkWindow* BuildDialog();
+ui::Window BuildDialog();
 
-void constructWindow( GtkWindow* parent ){
+void constructWindow( ui::Window parent ){
        m_parent = parent;
        Create();
 }
@@ -95,33 +86,33 @@ void FindTextureDialog_apply(){
        FindReplaceTextures( find.c_str(), replace.c_str(), g_FindTextureDialog.m_bSelectedOnly );
 }
 
-static void OnApply( GtkWidget* widget, gpointer data ){
+static void OnApply( ui::Widget widget, gpointer data ){
        g_FindTextureDialog.exportData();
        FindTextureDialog_apply();
 }
 
-static void OnFind( GtkWidget* widget, gpointer data ){
+static void OnFind( ui::Widget widget, gpointer data ){
        g_FindTextureDialog.exportData();
        FindTextureDialog_apply();
 }
 
-static void OnOK( GtkWidget* widget, gpointer data ){
+static void OnOK( ui::Widget widget, gpointer data ){
        g_FindTextureDialog.exportData();
        FindTextureDialog_apply();
        g_FindTextureDialog.HideDlg();
 }
 
-static void OnClose( GtkWidget* widget, gpointer data ){
+static void OnClose( ui::Widget widget, gpointer data ){
        g_FindTextureDialog.HideDlg();
 }
 
 
-static gint find_focus_in( GtkWidget* widget, GdkEventFocus *event, gpointer data ){
+static gint find_focus_in( ui::Widget widget, GdkEventFocus *event, gpointer data ){
        g_bFindActive = true;
        return FALSE;
 }
 
-static gint replace_focus_in( GtkWidget* widget, GdkEventFocus *event, gpointer data ){
+static gint replace_focus_in( ui::Widget widget, GdkEventFocus *event, gpointer data ){
        g_bFindActive = false;
        return FALSE;
 }
@@ -132,88 +123,86 @@ static gint replace_focus_in( GtkWidget* widget, GdkEventFocus *event, gpointer
 
 FindTextureDialog::FindTextureDialog(){
        m_bSelectedOnly = FALSE;
+       m_position_tracker.setPosition( WindowPosition( -1, -1, 0, 0 ) );
 }
 
 FindTextureDialog::~FindTextureDialog(){
 }
 
-GtkWindow* FindTextureDialog::BuildDialog(){
-       GtkWidget* vbox, *hbox, *table, *label;
-       GtkWidget* button, *check, *entry;
+ui::Window FindTextureDialog::BuildDialog(){
+    ui::Widget label{ui::null};
+       ui::Widget button{ui::null};
+       ui::Entry entry{ui::null};
+
+       auto dlg = ui::Window(create_floating_window( "Find / Replace Texture(s)", m_parent ));
 
-       GtkWindow* dlg = create_floating_window( "Find / Replace Texture(s)", m_parent );
+       m_position_tracker.connect( dlg );
 
-       hbox = gtk_hbox_new( FALSE, 5 );
-       gtk_widget_show( hbox );
-       gtk_container_add( GTK_CONTAINER( dlg ), GTK_WIDGET( hbox ) );
+       auto hbox = ui::HBox( FALSE, 5 );
+       hbox.show();
+       dlg.add(hbox);
        gtk_container_set_border_width( GTK_CONTAINER( hbox ), 5 );
 
-       vbox = gtk_vbox_new( FALSE, 5 );
-       gtk_widget_show( vbox );
-       gtk_box_pack_start( GTK_BOX( hbox ), GTK_WIDGET( vbox ), TRUE, TRUE, 0 );
-
-       table = gtk_table_new( 2, 2, FALSE );
-       gtk_widget_show( table );
-       gtk_box_pack_start( GTK_BOX( vbox ), GTK_WIDGET( table ), TRUE, TRUE, 0 );
-       gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
-       gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
-
-       label = gtk_label_new( "Find:" );
-       gtk_widget_show( label );
-       gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 0, 1,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
+       auto vbox = ui::VBox( FALSE, 5 );
+       vbox.show();
+       hbox.pack_start( vbox, TRUE, TRUE, 0 );
+
+    auto table = ui::Table(2, 2, FALSE);
+       table.show();
+       vbox.pack_start( table, TRUE, TRUE, 0 );
+    gtk_table_set_row_spacings(table, 5);
+    gtk_table_set_col_spacings(table, 5);
+
+       label = ui::Label( "Find:" );
+       label.show();
+    table.attach(label, {0, 1, 0, 1}, {GTK_FILL, 0});
        gtk_misc_set_alignment( GTK_MISC( label ), 0, 0.5 );
 
-       label = gtk_label_new( "Replace:" );
-       gtk_widget_show( label );
-       gtk_table_attach( GTK_TABLE( table ), label, 0, 1, 1, 2,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
+       label = ui::Label( "Replace:*" );
+       gtk_widget_set_tooltip_text( label, "Empty = search mode" );
+       label.show();
+    table.attach(label, {0, 1, 1, 2}, {GTK_FILL, 0});
        gtk_misc_set_alignment( GTK_MISC( label ), 0, 0.5 );
 
-       entry = gtk_entry_new();
-       gtk_widget_show( entry );
-       gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 0, 1,
-                                         (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       g_signal_connect( G_OBJECT( entry ), "focus_in_event",
+       entry = ui::Entry(ui::New);
+       entry.show();
+    table.attach(entry, {1, 2, 0, 1}, {GTK_EXPAND | GTK_FILL, 0});
+       entry.connect( "focus_in_event",
                                          G_CALLBACK( find_focus_in ), 0 );
-       AddDialogData( *GTK_ENTRY( entry ), m_strFind );
-       GlobalTextureEntryCompletion::instance().connect( GTK_ENTRY( entry ) );
-
-       entry = gtk_entry_new();
-       gtk_widget_show( entry );
-       gtk_table_attach( GTK_TABLE( table ), entry, 1, 2, 1, 2,
-                                         (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       g_signal_connect( G_OBJECT( entry ), "focus_in_event",
+       AddDialogData( entry, m_strFind );
+       GlobalTextureEntryCompletion::instance().connect( entry );
+
+       entry = ui::Entry(ui::New);
+       gtk_widget_set_tooltip_text( entry, "Empty = search mode" );
+       entry.show();
+    table.attach(entry, {1, 2, 1, 2}, {GTK_EXPAND | GTK_FILL, 0});
+       entry.connect( "focus_in_event",
                                          G_CALLBACK( replace_focus_in ), 0 );
-       AddDialogData( *GTK_ENTRY( entry ), m_strReplace );
-       GlobalTextureEntryCompletion::instance().connect( GTK_ENTRY( entry ) );
-
-       check = gtk_check_button_new_with_label( "Within selected brushes only" );
-       gtk_widget_show( check );
-       gtk_box_pack_start( GTK_BOX( vbox ), check, TRUE, TRUE, 0 );
-       AddDialogData( *GTK_TOGGLE_BUTTON( check ), m_bSelectedOnly );
-
-       vbox = gtk_vbox_new( FALSE, 5 );
-       gtk_widget_show( vbox );
-       gtk_box_pack_start( GTK_BOX( hbox ), GTK_WIDGET( vbox ), FALSE, FALSE, 0 );
-
-       button = gtk_button_new_with_label( "Apply" );
-       gtk_widget_show( button );
-       gtk_box_pack_start( GTK_BOX( vbox ), button, FALSE, FALSE, 0 );
-       g_signal_connect( G_OBJECT( button ), "clicked",
+       AddDialogData( entry, m_strReplace );
+       GlobalTextureEntryCompletion::instance().connect( entry );
+
+       auto check = ui::CheckButton( "Within selected brushes only" );
+       check.show();
+       vbox.pack_start( check, TRUE, TRUE, 0 );
+       AddDialogData( check, m_bSelectedOnly );
+
+       vbox = ui::VBox( FALSE, 5 );
+       vbox.show();
+       hbox.pack_start( vbox, FALSE, FALSE, 0 );
+
+       button = ui::Button( "Apply" );
+       button.show();
+       vbox.pack_start( button, FALSE, FALSE, 0 );
+       button.connect( "clicked",
                                          G_CALLBACK( OnApply ), 0 );
-       gtk_widget_set_usize( button, 60, -2 );
+       button.dimensions(60, -1);
 
-       button = gtk_button_new_with_label( "Close" );
-       gtk_widget_show( button );
-       gtk_box_pack_start( GTK_BOX( vbox ), button, FALSE, FALSE, 0 );
-       g_signal_connect( G_OBJECT( button ), "clicked",
+       button = ui::Button( "Close" );
+       button.show();
+       vbox.pack_start( button, FALSE, FALSE, 0 );
+       button.connect( "clicked",
                                          G_CALLBACK( OnClose ), 0 );
-       gtk_widget_set_usize( button, 60, -2 );
+       button.dimensions(60, -1);
 
        return dlg;
 }
@@ -231,7 +220,7 @@ void FindTextureDialog::updateTextures( const char* name ){
 }
 
 bool FindTextureDialog::isOpen(){
-       return GTK_WIDGET_VISIBLE( g_FindTextureDialog.GetWidget() ) == TRUE;
+       return g_FindTextureDialog.GetWidget().visible();
 }
 
 void FindTextureDialog::setFindStr( const char* name ){
@@ -247,11 +236,14 @@ void FindTextureDialog::setReplaceStr( const char* name ){
 }
 
 void FindTextureDialog::show(){
+       // workaround for strange gtk behaviour - modifying the contents of a window while it is not visible causes the window position to change without sending a configure_event
+       g_FindTextureDialog.m_position_tracker.sync( g_FindTextureDialog.GetWidget() );
        g_FindTextureDialog.ShowDlg();
+       gtk_window_present( g_FindTextureDialog.GetWidget() );
 }
 
 
-void FindTextureDialog_constructWindow( GtkWindow* main_window ){
+void FindTextureDialog_constructWindow( ui::Window main_window ){
        g_FindTextureDialog.constructWindow( main_window );
 }
 
@@ -267,8 +259,11 @@ void FindTextureDialog_selectTexture( const char* name ){
        g_FindTextureDialog.updateTextures( name );
 }
 
+#include "preferencesystem.h"
+
 void FindTextureDialog_Construct(){
        GlobalCommands_insert( "FindReplaceTextures", FindTextureDialog::ShowCaller() );
+       GlobalPreferenceSystem().registerPreference( "FindReplacehWnd",  make_property_string<WindowPositionTracker_String>( g_FindTextureDialog.m_position_tracker ) );
 }
 
 void FindTextureDialog_Destroy(){