diff options
Diffstat (limited to 'trace-view.c')
-rw-r--r-- | trace-view.c | 95 |
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 | */ | ||
216 | gint 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 | |||
247 | void 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 | |||
271 | void 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 | |||
210 | void trace_view_select(GtkWidget *treeview, guint64 time) | 300 | void 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 | } |