diff options
-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) |