aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/others/mimesh/g3dviewer-0.2.99.4/src/gui_log.c
diff options
context:
space:
mode:
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.c248
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
34enum _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
46static GtkTreeStore *gui_log_create_model(void);
47static gboolean gui_log_create_columns(GtkWidget *treeview,
48 GtkTreeModel *model, G3DViewer *viewer);
49static GtkTreeIter *gui_log_parent_iter_for_level(GtkTreeModel *model,
50 gint32 level, GtkTreeIter *parentiter);
51static gboolean gui_log_remove_children(GtkTreeStore *treestore,
52 GtkTreeIter *iter_parent);
53
54gboolean 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
76void gui_log_clean(G3DViewer *viewer)
77{
78 gui_log_remove_children(viewer->info.logtreestore, NULL);
79}
80
81void gui_log_cleanup(G3DViewer *viewer)
82{
83 gui_log_clean(viewer);
84}
85
86void 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
148static 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
165static 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
199static 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
229static 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