diff options
Diffstat (limited to 'src/others/mimesh/g3dviewer-0.2.99.4/src/gui_log.c')
-rw-r--r-- | src/others/mimesh/g3dviewer-0.2.99.4/src/gui_log.c | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/src/others/mimesh/g3dviewer-0.2.99.4/src/gui_log.c b/src/others/mimesh/g3dviewer-0.2.99.4/src/gui_log.c new file mode 100644 index 0000000..0914b30 --- /dev/null +++ b/src/others/mimesh/g3dviewer-0.2.99.4/src/gui_log.c | |||
@@ -0,0 +1,248 @@ | |||
1 | /* $Id:$ */ | ||
2 | |||
3 | /* | ||
4 | G3DViewer - 3D object viewer | ||
5 | |||
6 | Copyright (C) 2005, 2006 Markus Dahms <mad@automagically.de> | ||
7 | |||
8 | This program is free software; you can redistribute it and/or modify | ||
9 | it under the terms of the GNU General Public License as published by | ||
10 | the Free Software Foundation; either version 2 of the License, or | ||
11 | (at your option) any later version. | ||
12 | |||
13 | This program is distributed in the hope that it will be useful, | ||
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | GNU General Public License for more details. | ||
17 | |||
18 | You should have received a copy of the GNU General Public License | ||
19 | along with this program; if not, write to the Free Software | ||
20 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
21 | */ | ||
22 | |||
23 | #ifdef HAVE_CONFIG_H | ||
24 | # include <config.h> | ||
25 | #endif | ||
26 | |||
27 | #include <stdlib.h> | ||
28 | #include <string.h> | ||
29 | |||
30 | #include <gtk/gtk.h> | ||
31 | |||
32 | #include "main.h" | ||
33 | |||
34 | enum _columns | ||
35 | { | ||
36 | COL_LOGLEVEL, | ||
37 | COL_ICON, | ||
38 | COL_MESSAGE, | ||
39 | COL_SET_BG, | ||
40 | COL_BGCOLOR, | ||
41 | COL_SET_FAMILY, | ||
42 | COL_FAMILY, | ||
43 | N_COLUMNS | ||
44 | }; | ||
45 | |||
46 | static GtkTreeStore *gui_log_create_model(void); | ||
47 | static gboolean gui_log_create_columns(GtkWidget *treeview, | ||
48 | GtkTreeModel *model, G3DViewer *viewer); | ||
49 | static GtkTreeIter *gui_log_parent_iter_for_level(GtkTreeModel *model, | ||
50 | gint32 level, GtkTreeIter *parentiter); | ||
51 | static gboolean gui_log_remove_children(GtkTreeStore *treestore, | ||
52 | GtkTreeIter *iter_parent); | ||
53 | |||
54 | gboolean gui_log_initialize(G3DViewer *viewer, GtkWidget *treeview) | ||
55 | { | ||
56 | GtkTreeStore *treestore; | ||
57 | GtkTreeSelection *select; | ||
58 | |||
59 | treestore = gui_log_create_model(); | ||
60 | gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), | ||
61 | GTK_TREE_MODEL(treestore)); | ||
62 | viewer->info.logtreestore = treestore; | ||
63 | |||
64 | if(gui_log_create_columns(treeview, GTK_TREE_MODEL(treestore), | ||
65 | viewer) == FALSE) | ||
66 | { | ||
67 | return FALSE; | ||
68 | } | ||
69 | |||
70 | select = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); | ||
71 | gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE); | ||
72 | |||
73 | return TRUE; | ||
74 | } | ||
75 | |||
76 | void gui_log_clean(G3DViewer *viewer) | ||
77 | { | ||
78 | gui_log_remove_children(viewer->info.logtreestore, NULL); | ||
79 | } | ||
80 | |||
81 | void gui_log_cleanup(G3DViewer *viewer) | ||
82 | { | ||
83 | gui_log_clean(viewer); | ||
84 | } | ||
85 | |||
86 | void gui_log_handler(const gchar *log_domain, GLogLevelFlags log_level, | ||
87 | const gchar *message, gpointer user_data) | ||
88 | { | ||
89 | G3DViewer *viewer; | ||
90 | GtkTreeIter iter, *parentiter; | ||
91 | gchar *stock_id, *stripped_msg; | ||
92 | gint32 level; | ||
93 | gchar *family = "Sans Serif"; | ||
94 | gchar *bgcolor = "#FFFFFF"; | ||
95 | |||
96 | viewer = (G3DViewer *)user_data; | ||
97 | |||
98 | switch(log_level) | ||
99 | { | ||
100 | case G_LOG_LEVEL_DEBUG: | ||
101 | stock_id = "gtk-dialog-question"; | ||
102 | family = "Monospace"; | ||
103 | break; | ||
104 | case G_LOG_LEVEL_INFO: | ||
105 | stock_id = "gtk-dialog-info"; | ||
106 | break; | ||
107 | case G_LOG_LEVEL_MESSAGE: | ||
108 | stock_id = "gtk-info"; | ||
109 | break; | ||
110 | case G_LOG_LEVEL_WARNING: | ||
111 | stock_id = "gtk-dialog-warning"; | ||
112 | bgcolor = "#FF8080"; | ||
113 | break; | ||
114 | default: | ||
115 | stock_id = "gtk-about"; | ||
116 | break; | ||
117 | } | ||
118 | |||
119 | stripped_msg = (gchar *)message; | ||
120 | while(*stripped_msg == ' ') stripped_msg ++; | ||
121 | |||
122 | level = stripped_msg - message; | ||
123 | parentiter = gui_log_parent_iter_for_level( | ||
124 | GTK_TREE_MODEL(viewer->info.logtreestore), level, NULL); | ||
125 | |||
126 | gtk_tree_store_append(viewer->info.logtreestore, &iter, parentiter); | ||
127 | gtk_tree_store_set(viewer->info.logtreestore, &iter, | ||
128 | COL_LOGLEVEL, log_level, | ||
129 | COL_ICON, stock_id, | ||
130 | COL_MESSAGE, g_strdup(stripped_msg), | ||
131 | COL_SET_FAMILY, TRUE, | ||
132 | COL_FAMILY, family, | ||
133 | COL_SET_BG, TRUE, | ||
134 | COL_BGCOLOR, bgcolor, | ||
135 | -1); | ||
136 | |||
137 | if(parentiter) g_free(parentiter); | ||
138 | |||
139 | #if 0 | ||
140 | g_print("[%s] %s\n", log_domain, message); | ||
141 | #endif | ||
142 | } | ||
143 | |||
144 | /* | ||
145 | * private stuff | ||
146 | */ | ||
147 | |||
148 | static GtkTreeStore *gui_log_create_model(void) | ||
149 | { | ||
150 | GtkTreeStore *treestore; | ||
151 | |||
152 | treestore = gtk_tree_store_new(N_COLUMNS, | ||
153 | G_TYPE_INT, /* LOGLEVEL */ | ||
154 | G_TYPE_STRING, /* ICON */ | ||
155 | G_TYPE_STRING, /* MESSAGE */ | ||
156 | G_TYPE_BOOLEAN, /* SET BACKGROUND */ | ||
157 | G_TYPE_STRING, /* BACKGROUND COLOR */ | ||
158 | G_TYPE_BOOLEAN, /* SET FAMILY */ | ||
159 | G_TYPE_STRING /* FAMILY */ | ||
160 | ); | ||
161 | |||
162 | return treestore; | ||
163 | } | ||
164 | |||
165 | static gboolean gui_log_create_columns(GtkWidget *treeview, | ||
166 | GtkTreeModel *model, G3DViewer *viewer) | ||
167 | { | ||
168 | GtkCellRenderer *renderer; | ||
169 | GtkTreeViewColumn *column; | ||
170 | |||
171 | column = gtk_tree_view_column_new(); | ||
172 | |||
173 | /* icon */ | ||
174 | renderer = gtk_cell_renderer_pixbuf_new(); | ||
175 | gtk_tree_view_column_pack_start(column, renderer, FALSE); | ||
176 | gtk_tree_view_column_set_attributes(column, renderer, | ||
177 | "stock-id", COL_ICON, | ||
178 | NULL); | ||
179 | |||
180 | /* message */ | ||
181 | renderer = gtk_cell_renderer_text_new(); | ||
182 | gtk_tree_view_column_pack_start(column, renderer, TRUE); | ||
183 | gtk_tree_view_column_set_attributes(column, renderer, | ||
184 | "text", COL_MESSAGE, | ||
185 | "background-set", COL_SET_BG, | ||
186 | "background", COL_BGCOLOR, | ||
187 | "family-set", COL_SET_FAMILY, | ||
188 | "family", COL_FAMILY, | ||
189 | NULL); | ||
190 | |||
191 | gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); | ||
192 | gtk_tree_view_set_expander_column(GTK_TREE_VIEW(treeview), column); | ||
193 | |||
194 | gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); | ||
195 | |||
196 | return TRUE; | ||
197 | } | ||
198 | |||
199 | static GtkTreeIter *gui_log_parent_iter_for_level(GtkTreeModel *model, | ||
200 | gint32 level, GtkTreeIter *parentiter) | ||
201 | { | ||
202 | GtkTreeIter *iter, *iter2; | ||
203 | |||
204 | if(level == 0) return NULL; | ||
205 | |||
206 | if(gtk_tree_model_iter_n_children(model, parentiter) == 0) | ||
207 | return NULL; | ||
208 | |||
209 | iter = g_new0(GtkTreeIter, 1); | ||
210 | |||
211 | if(gtk_tree_model_iter_nth_child(model, iter, parentiter, | ||
212 | gtk_tree_model_iter_n_children(model, parentiter) - 1) == FALSE) | ||
213 | { | ||
214 | g_free(iter); | ||
215 | return NULL; | ||
216 | } | ||
217 | |||
218 | if(level == 1) | ||
219 | { | ||
220 | return iter; | ||
221 | } | ||
222 | |||
223 | iter2 = gui_log_parent_iter_for_level(model, level - 1, iter); | ||
224 | g_free(iter); | ||
225 | |||
226 | return iter2; | ||
227 | } | ||
228 | |||
229 | static gboolean gui_log_remove_children(GtkTreeStore *treestore, | ||
230 | GtkTreeIter *iter_parent) | ||
231 | { | ||
232 | GtkTreeIter iter_child; | ||
233 | gint n, i; | ||
234 | |||
235 | n = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(treestore), | ||
236 | iter_parent); | ||
237 | gtk_tree_model_iter_children(GTK_TREE_MODEL(treestore), | ||
238 | &iter_child, iter_parent); | ||
239 | |||
240 | for(i = 0; i < n; i ++) | ||
241 | { | ||
242 | gui_log_remove_children(treestore, &iter_child); | ||
243 | gtk_tree_store_remove(treestore, &iter_child); | ||
244 | } | ||
245 | |||
246 | return TRUE; | ||
247 | } | ||
248 | |||