aboutsummaryrefslogtreecommitdiffstats
path: root/trace-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'trace-view.c')
-rw-r--r--trace-view.c95
1 files changed, 92 insertions, 3 deletions
diff --git a/trace-view.c b/trace-view.c
index 6dd72ee..f9083f4 100644
--- a/trace-view.c
+++ b/trace-view.c
@@ -207,6 +207,96 @@ trace_view_load(GtkWidget *view, struct tracecmd_input *handle,
207 g_object_unref(model); /* destroy model automatically with view */ 207 g_object_unref(model); /* destroy model automatically with view */
208} 208}
209 209
210/**
211 * trace_view_get_selected_row - return the selected row
212 * @treeview: The tree view
213 *
214 * Returns the selected row number (or -1 if none is selected)
215 */
216gint trace_view_get_selected_row(GtkWidget *treeview)
217{
218 GtkTreeView *tree = GTK_TREE_VIEW(treeview);
219 GtkTreeSelection *selection;
220 GtkTreeModel *model;
221 GtkTreePath *path;
222 gchar *spath;
223 GList *glist;
224 gint row;
225
226 model = gtk_tree_view_get_model(tree);
227 if (!model)
228 return -1;
229
230 selection = gtk_tree_view_get_selection(tree);
231 glist = gtk_tree_selection_get_selected_rows(selection, &model);
232 if (!glist)
233 return -1;
234
235 /* Only one row may be selected */
236 path = glist->data;
237 spath = gtk_tree_path_to_string(path);
238 row = atoi(spath);
239 g_free(spath);
240
241 gtk_tree_path_free(path);
242 g_list_free(glist);
243
244 return row;
245}
246
247void trace_view_make_selection_visible(GtkWidget *treeview)
248{
249 GtkTreeView *tree = GTK_TREE_VIEW(treeview);
250 GtkTreePath *path;
251 gchar *spath;
252 GString *gstr;
253 gint row;
254
255 row = trace_view_get_selected_row(treeview);
256 if (row < 0)
257 return;
258
259 gstr = g_string_new("");
260 g_string_printf(gstr, "%d", row);
261 spath = g_string_free(gstr, FALSE);
262
263 path = gtk_tree_path_new_from_string(spath);
264 g_free(spath);
265
266 gtk_tree_view_scroll_to_cell(tree, path, NULL, TRUE, 0.5, 0.0);
267
268 gtk_tree_path_free(path);
269}
270
271void trace_view_update_task_filter(GtkWidget *treeview, struct filter_task *filter)
272{
273 GtkTreeView *tree = GTK_TREE_VIEW(treeview);
274 GtkTreeModel *model;
275 guint64 time;
276 gint row;
277
278 model = gtk_tree_view_get_model(tree);
279 if (!model)
280 return;
281
282 /* Keep track of the currently selected row */
283 row = trace_view_get_selected_row(treeview);
284 if (row >= 0)
285 time = trace_view_store_get_time_from_row(TRACE_VIEW_STORE(model), row);
286
287 g_object_ref(model);
288 gtk_tree_view_set_model(tree, NULL);
289
290 trace_view_store_filter_tasks(TRACE_VIEW_STORE(model), filter);
291
292 gtk_tree_view_set_model(tree, model);
293 g_object_unref(model);
294
295 /* Keep selection near previous selection */
296 if (row >= 0)
297 trace_view_select(treeview, time);
298}
299
210void trace_view_select(GtkWidget *treeview, guint64 time) 300void trace_view_select(GtkWidget *treeview, guint64 time)
211{ 301{
212 GtkTreeView *tree = GTK_TREE_VIEW(treeview); 302 GtkTreeView *tree = GTK_TREE_VIEW(treeview);
@@ -251,9 +341,8 @@ void trace_view_select(GtkWidget *treeview, guint64 time)
251 341
252 selection = gtk_tree_view_get_selection(tree); 342 selection = gtk_tree_view_get_selection(tree);
253 gtk_tree_selection_select_path(selection, path); 343 gtk_tree_selection_select_path(selection, path);
344 gtk_tree_path_free(path);
254 345
255 /* finally, make it visible */ 346 /* finally, make it visible */
256 gtk_tree_view_scroll_to_cell(tree, path, NULL, TRUE, 0.5, 0.0); 347 trace_view_make_selection_visible(treeview);
257
258 gtk_tree_path_free(path);
259} 348}