]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - contrib/brushexport/callbacks.cpp
Merge branch 'fix-fast' into 'master'
[xonotic/netradiant.git] / contrib / brushexport / callbacks.cpp
1 #include <glib.h>
2 #include <gtk/gtk.h>
3 #include <set>
4
5 #include "qerplugin.h"
6 #include "debugging/debugging.h"
7 #include "support.h"
8 #include "export.h"
9
10 // stuff from interface.cpp
11 void DestroyWindow();
12
13
14 namespace callbacks {
15
16     void OnDestroy(ui::Widget w, gpointer data)
17     {
18         DestroyWindow();
19     }
20
21     void OnExportClicked(ui::Button button, gpointer user_data)
22     {
23         auto window = ui::Window::from(lookup_widget(button, "w_plugplug2"));
24         ASSERT_TRUE(window);
25         const char *cpath = GlobalRadiant().m_pfnFileDialog(window, false, "Save as Obj", 0, 0, false, false, true);
26         if (!cpath) {
27             return;
28         }
29
30         std::string path(cpath);
31
32         // get ignore list from ui
33         std::set<std::string> ignore;
34
35         auto view = ui::TreeView::from(lookup_widget(button, "t_materialist"));
36         ui::ListStore list = ui::ListStore::from(gtk_tree_view_get_model(view));
37
38         GtkTreeIter iter;
39         gboolean valid = gtk_tree_model_get_iter_first(list, &iter);
40         while (valid) {
41             gchar *data;
42             gtk_tree_model_get(list, &iter, 0, &data, -1);
43             globalOutputStream() << data << "\n";
44             ignore.insert(std::string(data));
45             g_free(data);
46             valid = gtk_tree_model_iter_next(list, &iter);
47         }
48
49         for (std::set<std::string>::iterator it(ignore.begin()); it != ignore.end(); ++it) {
50             globalOutputStream() << it->c_str() << "\n";
51         }
52
53         // collapse mode
54         collapsemode mode = COLLAPSE_NONE;
55
56         auto radio = lookup_widget(button, "r_collapse");
57         ASSERT_TRUE(radio);
58
59         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio))) {
60             mode = COLLAPSE_ALL;
61         } else {
62             radio = lookup_widget(button, "r_collapsebymaterial");
63             ASSERT_TRUE(radio);
64             if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio))) {
65                 mode = COLLAPSE_BY_MATERIAL;
66             } else {
67                 radio = lookup_widget(button, "r_nocollapse");
68                 ASSERT_TRUE(radio);
69                 ASSERT_TRUE(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio)));
70                 mode = COLLAPSE_NONE;
71             }
72         }
73
74         // export materials?
75         auto toggle = lookup_widget(button, "t_exportmaterials");
76         ASSERT_TRUE(toggle);
77
78         bool exportmat = FALSE;
79
80         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle))) {
81             exportmat = TRUE;
82         }
83
84         // limit material names?
85         toggle = lookup_widget(button, "t_limitmatnames");
86         ASSERT_TRUE(toggle);
87
88         bool limitMatNames = FALSE;
89
90         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle)) && exportmat) {
91             limitMatNames = TRUE;
92         }
93
94         // create objects instead of groups?
95         toggle = lookup_widget(button, "t_objects");
96         ASSERT_TRUE(toggle);
97
98         bool objects = FALSE;
99
100         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle)) && exportmat) {
101             objects = TRUE;
102         }
103
104         // export
105         ExportSelection(ignore, mode, exportmat, path, limitMatNames, objects);
106     }
107
108     void OnAddMaterial(ui::Button button, gpointer user_data)
109     {
110         auto edit = ui::Entry::from(lookup_widget(button, "ed_materialname"));
111         ASSERT_TRUE(edit);
112
113         const gchar *name = gtk_entry_get_text(edit);
114         if (g_utf8_strlen(name, -1) > 0) {
115             ui::ListStore list = ui::ListStore::from(
116                     gtk_tree_view_get_model(ui::TreeView::from(lookup_widget(button, "t_materialist"))));
117             list.append(0, name);
118             gtk_entry_set_text(edit, "");
119         }
120     }
121
122     void OnRemoveMaterial(ui::Button button, gpointer user_data)
123     {
124         ui::TreeView view = ui::TreeView::from(lookup_widget(button, "t_materialist"));
125         ui::ListStore list = ui::ListStore::from(gtk_tree_view_get_model(view));
126         auto sel = ui::TreeSelection::from(gtk_tree_view_get_selection(view));
127
128         GtkTreeIter iter;
129         if (gtk_tree_selection_get_selected(sel, 0, &iter)) {
130             gtk_list_store_remove(list, &iter);
131         }
132     }
133
134     void OnExportMatClicked(ui::Button button, gpointer user_data)
135     {
136         ui::Widget toggleLimit = lookup_widget(button, "t_limitmatnames");
137         ui::Widget toggleObject = lookup_widget(button, "t_objects");
138
139         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) {
140             gtk_widget_set_sensitive(toggleLimit, TRUE);
141             gtk_widget_set_sensitive(toggleObject, TRUE);
142         } else {
143             gtk_widget_set_sensitive(toggleLimit, FALSE);
144             gtk_widget_set_sensitive(toggleObject, FALSE);
145         }
146     }
147
148 } // callbacks