aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2010-01-05 15:36:53 -0500
committerSteven Rostedt <rostedt@goodmis.org>2010-01-05 15:36:53 -0500
commitf7f4f93a3a11cec95d28d544613631b07f95d33e (patch)
tree2d8d77bc1e977c8bb7a421f97792f71eb2b040a0
parenteb9d0ab2e896a8b4fe7a8bd1b83366c127796790 (diff)
trace-view: Add check boxes to event filter dialog
The event dialog now implements check boxes that are used to select and unselect the events. Although the event filter dialog is still not hooked to anything, and does not affect the list yet. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--trace-filter.c148
1 files changed, 143 insertions, 5 deletions
diff --git a/trace-filter.c b/trace-filter.c
index db05679..f9c384f 100644
--- a/trace-filter.c
+++ b/trace-filter.c
@@ -35,6 +35,8 @@ struct dialog_helper {
35 35
36enum { 36enum {
37 COL_EVENT, 37 COL_EVENT,
38 COL_ACTIVE,
39 COL_ACTIVE_START,
38 NUM_EVENT_COLS, 40 NUM_EVENT_COLS,
39}; 41};
40 42
@@ -56,11 +58,14 @@ create_tree_event_model(GtkWidget *tree_view)
56 58
57 pevent = tracecmd_get_pevent(trace_view->handle); 59 pevent = tracecmd_get_pevent(trace_view->handle);
58 60
59 treestore = gtk_tree_store_new(NUM_EVENT_COLS, G_TYPE_STRING); 61 treestore = gtk_tree_store_new(NUM_EVENT_COLS, G_TYPE_STRING,
62 G_TYPE_BOOLEAN, G_TYPE_BOOLEAN);
60 63
61 gtk_tree_store_append(treestore, &iter_all, NULL); 64 gtk_tree_store_append(treestore, &iter_all, NULL);
62 gtk_tree_store_set(treestore, &iter_all, 65 gtk_tree_store_set(treestore, &iter_all,
63 COL_EVENT, "All", 66 COL_EVENT, "All",
67 COL_ACTIVE, TRUE,
68 COL_ACTIVE_START, FALSE,
64 -1); 69 -1);
65 70
66 events = pevent_list_events(pevent, EVENT_SORT_SYSTEM); 71 events = pevent_list_events(pevent, EVENT_SORT_SYSTEM);
@@ -73,6 +78,7 @@ create_tree_event_model(GtkWidget *tree_view)
73 gtk_tree_store_append(treestore, &iter_sys, &iter_all); 78 gtk_tree_store_append(treestore, &iter_sys, &iter_all);
74 gtk_tree_store_set(treestore, &iter_sys, 79 gtk_tree_store_set(treestore, &iter_sys,
75 COL_EVENT, event->system, 80 COL_EVENT, event->system,
81 COL_ACTIVE, TRUE,
76 -1); 82 -1);
77 last_system = event->system; 83 last_system = event->system;
78 } 84 }
@@ -80,6 +86,7 @@ create_tree_event_model(GtkWidget *tree_view)
80 gtk_tree_store_append(treestore, &iter_events, &iter_sys); 86 gtk_tree_store_append(treestore, &iter_events, &iter_sys);
81 gtk_tree_store_set(treestore, &iter_events, 87 gtk_tree_store_set(treestore, &iter_events,
82 COL_EVENT, event->name, 88 COL_EVENT, event->name,
89 COL_ACTIVE, FALSE,
83 -1); 90 -1);
84 91
85 } 92 }
@@ -87,10 +94,134 @@ create_tree_event_model(GtkWidget *tree_view)
87 return GTK_TREE_MODEL(treestore); 94 return GTK_TREE_MODEL(treestore);
88} 95}
89 96
97static void update_active_events(GtkTreeModel *model, GtkTreeIter *parent,
98 gboolean active)
99{
100 GtkTreeIter event;
101
102 if (!gtk_tree_model_iter_children(model, &event, parent))
103 return;
104
105 for (;;) {
106 gtk_tree_store_set(GTK_TREE_STORE(model), &event,
107 COL_ACTIVE, active,
108 -1);
109
110 if (!gtk_tree_model_iter_next(model, &event))
111 break;
112 }
113}
114
115static void update_active_systems(GtkTreeModel *model, GtkTreeIter *parent,
116 gboolean active)
117{
118 GtkTreeIter sys;
119
120 if (!gtk_tree_model_iter_children(model, &sys, parent))
121 return;
122
123 for (;;) {
124 gtk_tree_store_set(GTK_TREE_STORE(model), &sys,
125 COL_ACTIVE, active,
126 -1);
127
128 update_active_events(model, &sys, active);
129
130 if (!gtk_tree_model_iter_next(model, &sys))
131 break;
132 }
133}
134
135static void event_cursor_changed(GtkTreeView *treeview, gpointer data)
136{
137 GtkTreeModel *model;
138 GtkTreePath *path;
139 GtkTreeIter iter, parent, grandparent;
140 gboolean active, start;
141 gint depth;
142
143 model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
144 if (!model)
145 return;
146
147 gtk_tree_view_get_cursor(treeview, &path, NULL);
148 if (!path)
149 return;
150
151 if (!gtk_tree_model_get_iter(model, &iter, path))
152 goto free;
153
154 depth = gtk_tree_path_get_depth(path);
155
156 if (depth == 1) {
157 /*
158 * The first time we start up, the cursor will
159 * select the "All Events" row, and call
160 * this routine. But we don't want to do anything.
161 * Check and activate.
162 */
163 gtk_tree_model_get(model, &iter,
164 COL_ACTIVE_START, &start,
165 -1);
166 if (!start) {
167 gtk_tree_store_set(GTK_TREE_STORE(model), &iter,
168 COL_ACTIVE_START, TRUE,
169 -1);
170 goto free;
171 }
172 }
173
174 gtk_tree_model_get(model, &iter,
175 COL_ACTIVE, &active,
176 -1);
177
178 active = active ? FALSE : TRUE;
179
180 gtk_tree_store_set(GTK_TREE_STORE(model), &iter,
181 COL_ACTIVE, active,
182 -1);
183
184 if (depth == 1) {
185
186 if (active)
187 /* Set all rows */
188 update_active_systems(model, &iter, TRUE);
189
190 } else if (depth == 2) {
191 if (active) {
192 /* set this system */
193 update_active_events(model, &iter, TRUE);
194 } else {
195 /* disable the all events toggle */
196 gtk_tree_model_iter_parent(model, &parent, &iter);
197 gtk_tree_store_set(GTK_TREE_STORE(model), &parent,
198 COL_ACTIVE, FALSE,
199 -1);
200 }
201
202 } else {
203 if (!active) {
204 /* disable system and all events toggles */
205 gtk_tree_model_iter_parent(model, &parent, &iter);
206 gtk_tree_store_set(GTK_TREE_STORE(model), &parent,
207 COL_ACTIVE, FALSE,
208 -1);
209 gtk_tree_model_iter_parent(model, &grandparent, &parent);
210 gtk_tree_store_set(GTK_TREE_STORE(model), &grandparent,
211 COL_ACTIVE, FALSE,
212 -1);
213 }
214 }
215
216 free:
217 gtk_tree_path_free(path);
218}
219
90static GtkWidget *create_event_list_view(GtkWidget *tree_view) 220static GtkWidget *create_event_list_view(GtkWidget *tree_view)
91{ 221{
92 GtkTreeViewColumn *col; 222 GtkTreeViewColumn *col;
93 GtkCellRenderer *renderer; 223 GtkCellRenderer *renderer;
224 GtkCellRenderer *togrend;
94 GtkWidget *view; 225 GtkWidget *view;
95 GtkTreeModel *model; 226 GtkTreeModel *model;
96 227
@@ -106,7 +237,11 @@ static GtkWidget *create_event_list_view(GtkWidget *tree_view)
106 237
107 renderer = gtk_cell_renderer_text_new(); 238 renderer = gtk_cell_renderer_text_new();
108 239
109 gtk_tree_view_column_pack_start(col, renderer, TRUE); 240 togrend = gtk_cell_renderer_toggle_new();
241
242 gtk_tree_view_column_pack_start(col, togrend, FALSE);
243 gtk_tree_view_column_pack_start(col, renderer, FALSE);
244 gtk_tree_view_column_add_attribute(col, togrend, "active", COL_ACTIVE);
110 245
111 gtk_tree_view_column_add_attribute(col, renderer, "text", COL_EVENT); 246 gtk_tree_view_column_add_attribute(col, renderer, "text", COL_EVENT);
112 247
@@ -117,14 +252,17 @@ static GtkWidget *create_event_list_view(GtkWidget *tree_view)
117 g_object_unref(model); 252 g_object_unref(model);
118 253
119 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), 254 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)),
120 GTK_SELECTION_MULTIPLE); 255 GTK_SELECTION_NONE);
121 256
122 gtk_tree_view_expand_all(GTK_TREE_VIEW(view)); 257 gtk_tree_view_expand_all(GTK_TREE_VIEW(view));
123 258
259 g_signal_connect_swapped (view, "cursor-changed",
260 G_CALLBACK (event_cursor_changed),
261 (gpointer) view);
262
124 return view; 263 return view;
125} 264}
126 265
127
128/* Callback for the clicked signal of the Events filter button */ 266/* Callback for the clicked signal of the Events filter button */
129static void 267static void
130event_dialog_response (gpointer data, gint response_id) 268event_dialog_response (gpointer data, gint response_id)