diff options
author | Steven Rostedt <srostedt@redhat.com> | 2010-01-05 15:36:53 -0500 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2010-01-05 15:36:53 -0500 |
commit | f7f4f93a3a11cec95d28d544613631b07f95d33e (patch) | |
tree | 2d8d77bc1e977c8bb7a421f97792f71eb2b040a0 | |
parent | eb9d0ab2e896a8b4fe7a8bd1b83366c127796790 (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.c | 148 |
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 | ||
36 | enum { | 36 | enum { |
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 | ||
97 | static 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 | |||
115 | static 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 | |||
135 | static 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 | |||
90 | static GtkWidget *create_event_list_view(GtkWidget *tree_view) | 220 | static 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 */ |
129 | static void | 267 | static void |
130 | event_dialog_response (gpointer data, gint response_id) | 268 | event_dialog_response (gpointer data, gint response_id) |