X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fnetradiant.git;a=blobdiff_plain;f=radiant%2Ffindtexturedialog.cpp;h=2a6c028199d2402385aa5148d1e58f25dce70c7d;hp=2dc4eea09745250ebf3106f24bdb0f4ebd906feb;hb=9dfae1c9b270ee369c6362903a9205b30751b95f;hpb=c974ae628c05911cb62c0f4f5b31f0e00f7391af diff --git a/radiant/findtexturedialog.cpp b/radiant/findtexturedialog.cpp index 2dc4eea0..2a6c0281 100644 --- a/radiant/findtexturedialog.cpp +++ b/radiant/findtexturedialog.cpp @@ -1,23 +1,23 @@ /* -Copyright (C) 1999-2007 id Software, Inc. and contributors. -For a list of contributors, see the accompanying CONTRIBUTORS file. + Copyright (C) 1999-2006 Id Software, Inc. and contributors. + For a list of contributors, see the accompanying CONTRIBUTORS file. -This file is part of GtkRadiant. + 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 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. + 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 -*/ + 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 + */ // // Find/Replace textures dialogs @@ -25,266 +25,260 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA // Leonardo Zide (leo@lokigames.com) // -#include "stdafx.h" #include "findtexturedialog.h" -#include -FindTextureDialog g_TexFindDlg; -FindTextureDialog& g_dlgFind = g_TexFindDlg; +#include + +#include "debugging/debugging.h" + +#include "ishaders.h" + +#include "gtkutil/window.h" +#include "stream/stringstream.h" + +#include "commands.h" +#include "dialog.h" +#include "select.h" +#include "textureentry.h" + + +class FindTextureDialog : public Dialog { +public: + static void setReplaceStr(const char *name); + + static void setFindStr(const char *name); + + static bool isOpen(); + + static void show(); + + typedef FreeCaller ShowCaller; + + static void updateTextures(const char *name); + + FindTextureDialog(); + + virtual ~FindTextureDialog(); + + ui::Window BuildDialog(); + + void constructWindow(ui::Window parent) + { + m_parent = parent; + Create(); + } + + void destroyWindow() + { + Destroy(); + } + + + bool m_bSelectedOnly; + CopiedString m_strFind; + CopiedString m_strReplace; +}; + +FindTextureDialog g_FindTextureDialog; static bool g_bFindActive = true; -static void OnApply(GtkWidget *widget, gpointer data) -{ - g_dlgFind.UpdateData(TRUE); - FindReplaceTextures(g_dlgFind.m_strFind, g_dlgFind.m_strReplace, - g_dlgFind.m_bSelectedOnly, g_dlgFind.m_bForce, FALSE); -} +namespace { + void FindTextureDialog_apply() + { + StringOutputStream find(256); + StringOutputStream replace(256); -static void OnFind(GtkWidget *widget, gpointer data) -{ - g_dlgFind.UpdateData(TRUE); - FindReplaceTextures(g_dlgFind.m_strFind, g_dlgFind.m_strReplace, - g_dlgFind.m_bSelectedOnly, FALSE, TRUE); + find << "textures/" << g_FindTextureDialog.m_strFind.c_str(); + replace << "textures/" << g_FindTextureDialog.m_strReplace.c_str(); + FindReplaceTextures(find.c_str(), replace.c_str(), g_FindTextureDialog.m_bSelectedOnly); + } + + static void OnApply(ui::Widget widget, gpointer data) + { + g_FindTextureDialog.exportData(); + FindTextureDialog_apply(); + } + + static void OnFind(ui::Widget widget, gpointer data) + { + g_FindTextureDialog.exportData(); + FindTextureDialog_apply(); + } + + static void OnOK(ui::Widget widget, gpointer data) + { + g_FindTextureDialog.exportData(); + FindTextureDialog_apply(); + g_FindTextureDialog.HideDlg(); + } + + static void OnClose(ui::Widget widget, gpointer data) + { + g_FindTextureDialog.HideDlg(); + } + + + static gint find_focus_in(ui::Widget widget, GdkEventFocus *event, gpointer data) + { + g_bFindActive = true; + return FALSE; + } + + static gint replace_focus_in(ui::Widget widget, GdkEventFocus *event, gpointer data) + { + g_bFindActive = false; + return FALSE; + } } -static void OnOK(GtkWidget *widget, gpointer data) +// ============================================================================= +// FindTextureDialog class + +FindTextureDialog::FindTextureDialog() { - g_dlgFind.UpdateData(TRUE); - FindReplaceTextures(g_dlgFind.m_strFind, g_dlgFind.m_strReplace, - g_dlgFind.m_bSelectedOnly, g_dlgFind.m_bForce, FALSE); - g_dlgFind.HideDlg (); + m_bSelectedOnly = FALSE; } -static void OnClose(GtkWidget *widget, gpointer data) +FindTextureDialog::~FindTextureDialog() { - g_dlgFind.HideDlg (); } -static void popup_selected (GtkWidget *widget, gpointer data) +ui::Window FindTextureDialog::BuildDialog() { - gchar *str; - - gtk_label_get (GTK_LABEL (GTK_BIN (widget)->child), &str); - gtk_entry_set_text (GTK_ENTRY (data), str); + 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)); + + auto hbox = ui::HBox(FALSE, 5); + hbox.show(); + dlg.add(hbox); + gtk_container_set_border_width(GTK_CONTAINER(hbox), 5); + + 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 = ui::Label("Replace:"); + label.show(); + table.attach(label, {0, 1, 1, 2}, {GTK_FILL, 0}); + gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); + + 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(entry, m_strFind); + GlobalTextureEntryCompletion::instance().connect(entry); + + entry = ui::Entry(ui::New); + 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(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); + button.dimensions(60, -1); + + button = ui::Button("Close"); + button.show(); + vbox.pack_start(button, FALSE, FALSE, 0); + button.connect("clicked", + G_CALLBACK(OnClose), 0); + button.dimensions(60, -1); + + return dlg; } -static void find_clicked (GtkWidget *widget, gpointer data) +void FindTextureDialog::updateTextures(const char *name) { - GtkWidget *menu, *item; - menu = gtk_menu_new (); - - for (int i = 0; i < QERApp_GetActiveShaderCount (); i++) - { - IShader *pShader = QERApp_ActiveShader_ForIndex (i); - - item = gtk_menu_item_new_with_label (pShader->getName ()); - gtk_signal_connect (GTK_OBJECT (item), "activate", GTK_SIGNAL_FUNC (popup_selected), data); - gtk_widget_show (item); - gtk_menu_append (GTK_MENU (menu), item); - } - - gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME); + if (isOpen()) { + if (g_bFindActive) { + setFindStr(name + 9); + } else { + setReplaceStr(name + 9); + } + } } -static gint find_focus_in (GtkWidget *widget, GdkEventFocus *event, gpointer data) +bool FindTextureDialog::isOpen() { - g_bFindActive = true; - return FALSE; + return g_FindTextureDialog.GetWidget().visible(); } -static gint replace_focus_in (GtkWidget *widget, GdkEventFocus *event, gpointer data) +void FindTextureDialog::setFindStr(const char *name) { - g_bFindActive = false; - return FALSE; + g_FindTextureDialog.exportData(); + g_FindTextureDialog.m_strFind = name; + g_FindTextureDialog.importData(); } -// ============================================================================= -// FindTextureDialog class - -FindTextureDialog::FindTextureDialog () +void FindTextureDialog::setReplaceStr(const char *name) { - m_bSelectedOnly = FALSE; - m_strFind = ""; - m_strReplace = ""; - m_bForce = FALSE; - m_bLive = TRUE; + g_FindTextureDialog.exportData(); + g_FindTextureDialog.m_strReplace = name; + g_FindTextureDialog.importData(); } -FindTextureDialog::~FindTextureDialog () +void FindTextureDialog::show() { + g_FindTextureDialog.ShowDlg(); } -void FindTextureDialog::BuildDialog () + +void FindTextureDialog_constructWindow(ui::Window main_window) { - GtkWidget *dlg, *vbox, *hbox, *table, *label; - GtkWidget *button, *check, *entry, *arrow; - - dlg = m_pWidget; - gtk_window_set_title (GTK_WINDOW (dlg), "Find / Replace Texture(s)"); - gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (g_pParentWnd->m_pWidget)); - - hbox = gtk_hbox_new (FALSE, 5); - gtk_widget_show (hbox); - gtk_container_add (GTK_CONTAINER (dlg), 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), vbox, TRUE, TRUE, 0); - - table = gtk_table_new (2, 3, FALSE); - gtk_widget_show (table); - gtk_box_pack_start (GTK_BOX (vbox), 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); - 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); - 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); - gtk_signal_connect (GTK_OBJECT (entry), "focus_in_event", - GTK_SIGNAL_FUNC (find_focus_in), NULL); - AddDialogData (entry, &m_strFind, DLG_ENTRY_TEXT); - - button = gtk_button_new (); - gtk_widget_show (button); - gtk_table_attach (GTK_TABLE (table), button, 2, 3, 0, 1, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (GTK_FILL), 0, 0); - gtk_signal_connect (GTK_OBJECT (button), "clicked", - GTK_SIGNAL_FUNC (find_clicked), entry); - - arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_OUT); - gtk_widget_show (arrow); - gtk_container_add (GTK_CONTAINER (button), arrow); - - 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); - gtk_signal_connect (GTK_OBJECT (entry), "focus_in_event", - GTK_SIGNAL_FUNC (replace_focus_in), NULL); - AddDialogData (entry, &m_strReplace, DLG_ENTRY_TEXT); - - button = gtk_button_new (); - gtk_widget_show (button); - gtk_table_attach (GTK_TABLE (table), button, 2, 3, 1, 2, - (GtkAttachOptions) (GTK_FILL), - (GtkAttachOptions) (GTK_FILL), 0, 0); - gtk_signal_connect (GTK_OBJECT (button), "clicked", - GTK_SIGNAL_FUNC (find_clicked), entry); - - arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_OUT); - gtk_widget_show (arrow); - gtk_container_add (GTK_CONTAINER (button), arrow); - - check = gtk_check_button_new_with_label ("Use selected brushes only"); - gtk_widget_show (check); - gtk_box_pack_start (GTK_BOX (vbox), check, TRUE, TRUE, 0); - AddDialogData (check, &m_bSelectedOnly, DLG_CHECK_BOOL); - - check = gtk_check_button_new_with_label ("Replace everywhere (selected/active), don't test against Find"); - gtk_widget_show (check); - gtk_box_pack_start (GTK_BOX (vbox), check, TRUE, TRUE, 0); - AddDialogData (check, &m_bForce, DLG_CHECK_BOOL); - - check = gtk_check_button_new_with_label ("Live updates from Texture/Camera windows"); - gtk_widget_show (check); - gtk_box_pack_start (GTK_BOX (vbox), check, TRUE, TRUE, 0); - AddDialogData (check, &m_bLive, DLG_CHECK_BOOL); - - vbox = gtk_vbox_new (FALSE, 5); - gtk_widget_show (vbox); - gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0); - - button = gtk_button_new_with_label( _("Find") ); - gtk_widget_show( button ); - gtk_box_pack_start( GTK_BOX( vbox ), button, FALSE, FALSE, 0 ); - gtk_signal_connect( GTK_OBJECT( button ), "clicked", - GTK_SIGNAL_FUNC( OnFind ), NULL ); - gtk_widget_set_usize( button, 60, -2 ); - - button = gtk_button_new_with_label (_("OK")); - gtk_widget_show (button); - gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); - gtk_signal_connect (GTK_OBJECT (button), "clicked", - GTK_SIGNAL_FUNC (OnOK), NULL); - gtk_widget_set_usize (button, 60, -2); - - button = gtk_button_new_with_label (_("Apply")); - gtk_widget_show (button); - gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); - gtk_signal_connect (GTK_OBJECT (button), "clicked", - GTK_SIGNAL_FUNC (OnApply), NULL); - gtk_widget_set_usize (button, 60, -2); - - button = gtk_button_new_with_label (_("Close")); - gtk_widget_show (button); - gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); - gtk_signal_connect (GTK_OBJECT (button), "clicked", - GTK_SIGNAL_FUNC (OnClose), NULL); - gtk_widget_set_usize (button, 60, -2); - - gtk_widget_show (dlg); + g_FindTextureDialog.constructWindow(main_window); } -void FindTextureDialog::updateTextures(const char *p) +void FindTextureDialog_destroyWindow() { - if (isOpen()) - { - if (g_bFindActive) - { - setFindStr(p); - } - else - { - setReplaceStr(p); - } - } + g_FindTextureDialog.destroyWindow(); } -bool FindTextureDialog::isOpen() +bool FindTextureDialog_isOpen() { - return (g_dlgFind.m_pWidget == NULL || GTK_WIDGET_VISIBLE (g_dlgFind.m_pWidget) == FALSE) ? false : true; + return g_FindTextureDialog.isOpen(); } -void FindTextureDialog::setFindStr(const char * p) +void FindTextureDialog_selectTexture(const char *name) { - g_dlgFind.UpdateData(TRUE); - if (g_dlgFind.m_bLive) - { - g_dlgFind.m_strFind = p; - g_dlgFind.UpdateData(FALSE); - } + g_FindTextureDialog.updateTextures(name); } -void FindTextureDialog::setReplaceStr(const char * p) +void FindTextureDialog_Construct() { - g_dlgFind.UpdateData(TRUE); - if (g_dlgFind.m_bLive) - { - g_dlgFind.m_strReplace = p; - g_dlgFind.UpdateData(FALSE); - } + GlobalCommands_insert("FindReplaceTextures", FindTextureDialog::ShowCaller()); } -void FindTextureDialog::show() +void FindTextureDialog_Destroy() { - g_dlgFind.ShowDlg (); }