netradiant-custom/contrib/brushexport/callbacks.cpp
Garux 0f6e20a334 * brushexport plugin: "Weld vertices" option (welds inside group or object, thus result depends on collapse option)
rephrase, shorten code
disable debug prints about exclusions in release
print error to console with nothing selected
more picky conditions in ExportData::GetShaderNameFromShaderPath slash search
2020-01-03 22:18:52 +03:00

151 lines
4.8 KiB
C++

#include <glib.h>
#include <gtk/gtk.h>
#include <set>
#include "qerplugin.h"
#include "debugging/debugging.h"
#include "support.h"
#include "export.h"
// stuff from interface.cpp
void DestroyWindow();
//! TODO add tooltip for ignore: shader name after last slash, case sensitive // or make insensitive
//! TODO console print on success
//! TODO make togglebuttons inactive on !exportmat
//! TODO add ignore mat on ENTER, del on del
//! TODO add entry with path to save to (to resave faster)
//! TODO tooltip for weld //inside groups
//! TODO ignore case in mat name comparison materials_comparator
namespace callbacks {
void OnDestroy( GtkWidget* w, gpointer data ){
DestroyWindow();
}
void OnExportClicked( GtkButton* button, gpointer user_data ){
GtkWidget* window = lookup_widget( GTK_WIDGET( button ), "w_plugplug2" );
ASSERT_NOTNULL( window );
const char* cpath = GlobalRadiant().m_pfnFileDialog( window, false, "Save as Obj", 0, 0, false, false, true );
if ( !cpath ) {
return;
}
std::string path( cpath );
// get ignore list from ui
std::set<std::string> ignore;
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;
}
}
// export materials?
GtkWidget* toggle = lookup_widget( GTK_WIDGET( button ), "t_exportmaterials" );
ASSERT_NOTNULL( toggle );
const bool exportmat = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( toggle ) );
// limit material names?
toggle = lookup_widget( GTK_WIDGET( button ), "t_limitmatnames" );
ASSERT_NOTNULL( toggle );
const bool limitMatNames = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( toggle ) ) && exportmat;
// create objects instead of groups?
toggle = lookup_widget( GTK_WIDGET( button ), "t_objects" );
ASSERT_NOTNULL( toggle );
const bool objects = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( toggle ) ) && exportmat;
toggle = lookup_widget( GTK_WIDGET( button ), "t_weld" );
ASSERT_NOTNULL( toggle );
const bool weld = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( toggle ) );
// export
ExportSelection( ignore, mode, exportmat, 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 = 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 );
}
}
void OnExportMatClicked( GtkButton* button, gpointer user_data ){
GtkWidget* toggleLimit = lookup_widget( GTK_WIDGET( button ), "t_limitmatnames" );
GtkWidget* toggleObject = lookup_widget( GTK_WIDGET( button ), "t_objects" );
if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( button ) ) ) {
gtk_widget_set_sensitive( GTK_WIDGET( toggleLimit ), TRUE );
gtk_widget_set_sensitive( GTK_WIDGET( toggleObject ), TRUE );
}
else {
gtk_widget_set_sensitive( GTK_WIDGET( toggleLimit ), FALSE );
gtk_widget_set_sensitive( GTK_WIDGET( toggleObject ), FALSE );
}
}
} // callbacks