271 if(!gtk_widget_get_mapped(GTK_WIDGET(
view)) || !gtk_tree_row_reference_valid(
row)
272 || gtk_tree_row_reference_get_model(
row) != gtk_tree_view_get_model(
view))
277 GtkTreePath *path = gtk_tree_row_reference_get_path(
row);
279 gtk_tree_view_get_background_area(
view, path, NULL, &cell);
280 gtk_tree_path_free(path);
281 if(cell.height < 1)
return FALSE;
283 GdkRectangle visible;
284 gtk_tree_view_get_visible_rect(
view, &visible);
287 gtk_tree_view_convert_bin_window_to_tree_coords(
view, 0, cell.y, &unused, &tree_y);
288 if(tree_y < visible.y || tree_y + cell.height > visible.y + visible.height)
return FALSE;
292 gtk_tree_view_convert_bin_window_to_widget_coords(
view, 0, cell.y, &unused, &widget_y);
293 *area = (GdkRectangle){ .x = 0,
295 .width = gtk_widget_get_allocated_width(GTK_WIDGET(
view)),
296 .height = cell.height };
297 return area->width > 0;
946 GList *expanded = NULL;
950 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
_g.view));
951 GtkTreeModel *
model = NULL;
953 if(gtk_tree_selection_get_selected(selection, &
model, &cursor))
955 GtkTreePath *path = gtk_tree_model_get_path(
model, &cursor);
957 gtk_tree_path_free(path);
960 gtk_tree_store_clear(
_g.store);
961 g_hash_table_remove_all(
_g.names);
971 for(GList *item =
_sources; item; item = g_list_next(item))
979 g_hash_table_insert(
_g.names, ui->
top_panel, g_strdup(_(
"Menu bar")));
1001 for(GList *item = windows; item; item = g_list_next(item))
1004 g_hash_table_insert(
_g.names,
window, g_strdup(gtk_window_get_title(GTK_WINDOW(
window))));
1007 g_list_free(windows);
1012 for(GList *item = expanded; item; item = g_list_next(item))
1015 if(!
_find_row((
const char *)item->data, &iter))
continue;
1017 GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(
_g.store), &iter);
1018 gtk_tree_view_expand_row(GTK_TREE_VIEW(
_g.view), path,
FALSE);
1019 gtk_tree_path_free(path);
1021 g_list_free_full(expanded, g_free);
1030 GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(
_g.store), &iter);
1031 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(
_g.view), path);
1032 gtk_tree_selection_select_iter(selection, &iter);
1033 gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(
_g.view), path, NULL,
FALSE, 0., 0.);
1034 gtk_tree_path_free(path);
1278 gtk_window_present(GTK_WINDOW(
_g.window));
1282 _g.names = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_free);
1283 _g.pages = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
1284 _g.selected = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
1287 _g.window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1288 gtk_window_set_title(GTK_WINDOW(
_g.window), _(
"Documentation screenshots"));
1289 gtk_window_set_default_size(GTK_WINDOW(
_g.window), 1100, 760);
1291 g_signal_connect(
_g.window,
"destroy", G_CALLBACK(
_on_destroy), NULL);
1293 GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
1294 gtk_container_set_border_width(GTK_CONTAINER(vbox), 8);
1295 gtk_container_add(GTK_CONTAINER(
_g.window), vbox);
1298 GtkWidget *bar = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
1299 gtk_box_pack_start(GTK_BOX(vbox), bar,
FALSE,
FALSE, 0);
1300 gtk_box_pack_start(GTK_BOX(bar), gtk_label_new(_(
"Documentation root")),
FALSE,
FALSE, 0);
1302 _g.folder = gtk_file_chooser_button_new(_(
"Documentation root"), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
1305 gchar *
tooltip = g_strdup_printf(_(
"Widget-to-page map: %s at the root of this folder, "
1306 "reloaded whenever the folder changes."),
1308 gtk_widget_set_tooltip_text(
_g.folder,
tooltip);
1310 const char *pictures = g_get_user_special_dir(G_USER_DIRECTORY_PICTURES);
1314 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(
_g.folder), destination);
1317 g_signal_connect(
_g.folder,
"file-set", G_CALLBACK(
_populate), NULL);
1318 gtk_box_pack_start(GTK_BOX(bar),
_g.folder,
TRUE,
TRUE, 0);
1320 GtkWidget *refresh = gtk_button_new_with_label(_(
"Refresh"));
1321 g_signal_connect(refresh,
"clicked", G_CALLBACK(
_populate), NULL);
1322 gtk_box_pack_start(GTK_BOX(bar), refresh,
FALSE,
FALSE, 0);
1327 _g.store = gtk_tree_store_new(
COL_COUNT, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_OBJECT,
1328 GTK_TYPE_TREE_ROW_REFERENCE, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN);
1329 _g.view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(
_g.store));
1330 g_object_unref(
_g.store);
1331 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(
_g.view),
TRUE);
1334 GtkTreeViewColumn *widgets = gtk_tree_view_column_new();
1335 gtk_tree_view_column_set_title(widgets, _(
"Widget"));
1336 gtk_tree_view_column_set_expand(widgets,
TRUE);
1337 GtkCellRenderer *toggle = gtk_cell_renderer_toggle_new();
1338 g_signal_connect(toggle,
"toggled", G_CALLBACK(
_on_toggled), NULL);
1339 gtk_tree_view_column_pack_start(widgets, toggle,
FALSE);
1340 gtk_tree_view_column_add_attribute(widgets, toggle,
"active",
COL_CHECKED);
1341 gtk_tree_view_column_add_attribute(widgets, toggle,
"visible",
COL_CAPTURABLE);
1348 gtk_tree_view_column_add_attribute(widgets, toggle,
"activatable",
COL_CAPTURABLE);
1350 GtkCellRenderer *text = gtk_cell_renderer_text_new();
1351 gtk_tree_view_column_pack_start(widgets, text,
TRUE);
1352 gtk_tree_view_column_add_attribute(widgets, text,
"text",
COL_LABEL);
1353 gtk_tree_view_column_add_attribute(widgets, text,
"sensitive",
COL_ENABLED);
1354 gtk_tree_view_append_column(GTK_TREE_VIEW(
_g.view), widgets);
1356 GtkCellRenderer *page = gtk_cell_renderer_text_new();
1357 GtkTreeViewColumn *
pages = gtk_tree_view_column_new_with_attributes(_(
"Documentation page"), page,
"text",
1359 gtk_tree_view_append_column(GTK_TREE_VIEW(
_g.view),
pages);
1361 g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(
_g.view)),
"changed",
1364 GtkWidget *scroll = gtk_scrolled_window_new(NULL, NULL);
1365 gtk_container_add(GTK_CONTAINER(scroll),
_g.view);
1369 _g.preview = gtk_image_new();
1370 _g.geometry = gtk_label_new(
"");
1371 GtkWidget *preview_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
1372 gtk_box_pack_start(GTK_BOX(preview_box),
_g.preview,
TRUE,
FALSE, 0);
1373 gtk_box_pack_start(GTK_BOX(preview_box),
_g.geometry,
FALSE,
FALSE, 0);
1375 GtkWidget *preview_frame = gtk_frame_new(_(
"Preview"));
1376 gtk_container_set_border_width(GTK_CONTAINER(preview_box), 6);
1377 gtk_container_add(GTK_CONTAINER(preview_frame), preview_box);
1380 GtkWidget *panes = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
1381 gtk_paned_pack1(GTK_PANED(panes), scroll,
TRUE,
FALSE);
1382 gtk_paned_pack2(GTK_PANED(panes), preview_frame,
FALSE,
FALSE);
1383 gtk_box_pack_start(GTK_BOX(vbox), panes,
TRUE,
TRUE, 0);
1385 GtkWidget *actions = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
1386 gtk_box_pack_start(GTK_BOX(vbox), actions,
FALSE,
FALSE, 0);
1388 GtkWidget *select_mapped = gtk_button_new_with_label(_(
"Select mapped"));
1389 gtk_widget_set_tooltip_text(select_mapped, _(
"check every displayed row the map names"));
1390 g_signal_connect(select_mapped,
"clicked", G_CALLBACK(
_on_select), GINT_TO_POINTER(2));
1391 gtk_box_pack_start(GTK_BOX(actions), select_mapped,
FALSE,
FALSE, 0);
1393 GtkWidget *select_all = gtk_button_new_with_label(_(
"Select all"));
1394 gtk_widget_set_tooltip_text(select_all, _(
"only affects the rows already unfolded"));
1395 g_signal_connect(select_all,
"clicked", G_CALLBACK(
_on_select), GINT_TO_POINTER(
TRUE));
1396 gtk_box_pack_start(GTK_BOX(actions), select_all,
FALSE,
FALSE, 0);
1398 GtkWidget *select_none = gtk_button_new_with_label(_(
"Select none"));
1399 g_signal_connect(select_none,
"clicked", G_CALLBACK(
_on_select), GINT_TO_POINTER(
FALSE));
1400 gtk_box_pack_start(GTK_BOX(actions), select_none,
FALSE,
FALSE, 0);
1402 GtkWidget *capture = gtk_button_new_with_label(_(
"Capture"));
1403 g_signal_connect(capture,
"clicked", G_CALLBACK(
_on_capture), NULL);
1404 gtk_box_pack_end(GTK_BOX(actions), capture,
FALSE,
FALSE, 0);
1406 _g.status = gtk_label_new(NULL);
1407 gtk_label_set_line_wrap(GTK_LABEL(
_g.status),
TRUE);
1408 gtk_widget_set_halign(
_g.status, GTK_ALIGN_START);
1409 gtk_box_pack_start(GTK_BOX(vbox),
_g.status,
FALSE,
FALSE, 0);
1411 gtk_widget_show_all(
_g.window);