#include #include #include #include #include "qerplugin.h" #include "debugging/debugging.h" #include "os/path.h" #include "support.h" #include "export.h" // stuff from interface.cpp void DestroyWindow(); //! TODO hide window on close namespace callbacks { void OnDestroy( GtkWidget* w, gpointer data ){ DestroyWindow(); } static std::string s_export_path; void OnExportClicked( GtkButton* button, gpointer choose_path ){ GtkWidget* window = lookup_widget( GTK_WIDGET( button ), "w_plugplug2" ); ASSERT_NOTNULL( window ); if( choose_path ){ const char* cpath = GlobalRadiant().m_pfnFileDialog( window, false, "Save as Obj", 0, 0, false, false, true ); if ( !cpath ) { return; } s_export_path = cpath; // enable button to reexport with the selected name GtkWidget* b_export = lookup_widget( GTK_WIDGET( button ), "b_export" ); ASSERT_NOTNULL( b_export ); gtk_widget_set_sensitive( b_export, TRUE ); // add tooltip std::string tip( "ReExport to " ); tip.append( s_export_path ); gtk_widget_set_tooltip_text( b_export, tip.c_str() ); } else if( s_export_path.empty() ){ return; } // get ignore list from ui StringSetWithLambda ignore ( []( const std::string& lhs, const std::string& rhs )->bool{ return string_less_nocase( lhs.c_str(), rhs.c_str() ); } ); GtkTreeView* view = GTK_TREE_VIEW( lookup_widget( GTK_WIDGET( button ), "t_materialist" ) ); GtkListStore* list = GTK_LIST_STORE( gtk_tree_view_get_model( view ) ); GtkTreeIter iter; gboolean valid = gtk_tree_model_get_iter_first( GTK_TREE_MODEL( list ), &iter ); while ( valid ) { gchar* data; gtk_tree_model_get( GTK_TREE_MODEL( list ), &iter, 0, &data, -1 ); #ifdef _DEBUG globalOutputStream() << data << "\n"; #endif ignore.insert( std::string( data ) ); g_free( data ); valid = gtk_tree_model_iter_next( GTK_TREE_MODEL( list ), &iter ); } #ifdef _DEBUG for ( const std::string& str : ignore ) globalOutputStream() << str.c_str() << "\n"; #endif // collapse mode collapsemode mode = COLLAPSE_NONE; GtkWidget* radio = lookup_widget( GTK_WIDGET( button ), "r_collapse" ); ASSERT_NOTNULL( radio ); if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( radio ) ) ) { mode = COLLAPSE_ALL; } else { radio = lookup_widget( GTK_WIDGET( button ), "r_collapsebymaterial" ); ASSERT_NOTNULL( radio ); if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( radio ) ) ) { mode = COLLAPSE_BY_MATERIAL; } else { radio = lookup_widget( GTK_WIDGET( button ), "r_nocollapse" ); ASSERT_NOTNULL( radio ); ASSERT_NOTNULL( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( radio ) ) ); mode = COLLAPSE_NONE; } } GtkWidget* toggle; // export materials? ASSERT_NOTNULL( ( toggle = lookup_widget( GTK_WIDGET( button ), "t_exportmaterials" ) ) ); const bool exportmat = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( toggle ) ); // limit material names? ASSERT_NOTNULL( ( toggle = lookup_widget( GTK_WIDGET( button ), "t_limitmatnames" ) ) ); const bool limitMatNames = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( toggle ) ); // create objects instead of groups? ASSERT_NOTNULL( ( toggle = lookup_widget( GTK_WIDGET( button ), "t_objects" ) ) ); const bool objects = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( toggle ) ); ASSERT_NOTNULL( ( toggle = lookup_widget( GTK_WIDGET( button ), "t_weld" ) ) ); const bool weld = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( toggle ) ); // export ExportSelection( ignore, mode, exportmat, s_export_path, limitMatNames, objects, weld ); } void OnAddMaterial( GtkButton* button, gpointer user_data ){ GtkEntry* edit = GTK_ENTRY( lookup_widget( GTK_WIDGET( button ), "ed_materialname" ) ); ASSERT_NOTNULL( edit ); const gchar* name = path_get_filename_start( gtk_entry_get_text( edit ) ); if ( g_utf8_strlen( name, -1 ) > 0 ) { GtkListStore* list = GTK_LIST_STORE( gtk_tree_view_get_model( GTK_TREE_VIEW( lookup_widget( GTK_WIDGET( button ), "t_materialist" ) ) ) ); GtkTreeIter iter; gtk_list_store_append( list, &iter ); gtk_list_store_set( list, &iter, 0, name, -1 ); gtk_entry_set_text( edit, "" ); } } void OnRemoveMaterial( GtkButton* button, gpointer user_data ){ GtkTreeView* view = GTK_TREE_VIEW( lookup_widget( GTK_WIDGET( button ), "t_materialist" ) ); GtkListStore* list = GTK_LIST_STORE( gtk_tree_view_get_model( view ) ); GtkTreeSelection* sel = gtk_tree_view_get_selection( view ); GtkTreeIter iter; if ( gtk_tree_selection_get_selected( sel, 0, &iter ) ) { gtk_list_store_remove( list, &iter ); } } gboolean OnRemoveMaterialKb( GtkWidget* widget, GdkEventKey* event, gpointer user_data ){ if( event->keyval == GDK_Delete ) OnRemoveMaterial( reinterpret_cast( widget ), NULL ); return FALSE; } } // callbacks