/** * gwy_set_data_preview_size: * @data_view: A data view used for module preview. * @max_size: Maximum allowed @data_view size (width and height). * * Sets up data view zoom to not exceed specified size. * * Before calling this function, data keys have be set, data fields and layers * have to be present and physically square mode set in the container. * Sizing of both pixel-wise square and physically square displays is performed * correctly. * * Since: 2.7 **/ void gwy_set_data_preview_size(GwyDataView *data_view, gint max_size) { GwyContainer *container; GwyDataField *data_field; GwyPixmapLayer *layer; gdouble zoomval, scale, xreal, yreal; gboolean realsquare; gint xres, yres; const gchar *prefix; gchar *key; g_return_if_fail(GWY_IS_DATA_VIEW(data_view)); g_return_if_fail(max_size >= 2); container = gwy_data_view_get_data(data_view); g_return_if_fail(GWY_IS_CONTAINER(container)); layer = gwy_data_view_get_base_layer(data_view); g_return_if_fail(GWY_IS_PIXMAP_LAYER(layer)); prefix = gwy_pixmap_layer_get_data_key(layer); g_return_if_fail(prefix); data_field = gwy_container_get_object_by_name(container, prefix); g_return_if_fail(GWY_IS_DATA_FIELD(data_field)); prefix = gwy_data_view_get_data_prefix(data_view); g_return_if_fail(prefix); key = g_strconcat(prefix, "/realsquare", NULL); realsquare = FALSE; gwy_container_gis_boolean_by_name(container, key, &realsquare); g_free(key); xres = gwy_data_field_get_xres(data_field); yres = gwy_data_field_get_yres(data_field); if (!realsquare) zoomval = max_size/(gdouble)MAX(xres, yres); else { xreal = gwy_data_field_get_xreal(data_field); yreal = gwy_data_field_get_yreal(data_field); scale = MAX(xres/xreal, yres/yreal); zoomval = max_size/(scale*MAX(xreal, yreal)); } gwy_data_view_set_zoom(data_view, zoomval); }
static gboolean wshed_dialog(WshedArgs *args, GwyContainer *data) { GtkWidget *dialog, *table, *label, *spin, *hbox; WshedControls controls; enum { RESPONSE_RESET = 1, RESPONSE_PREVIEW = 2 }; gint response; gdouble zoomval; GtkObject *layer; GwyDataField *dfield; gint row; dialog = gtk_dialog_new_with_buttons(_("Mark Grains by Watershed"), NULL, 0, _("_Update Preview"), RESPONSE_PREVIEW, _("_Reset"), RESPONSE_RESET, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE); controls.dialog = dialog; hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), GTK_WIDGET(hbox), FALSE, FALSE, 4); controls.mydata = GWY_CONTAINER(gwy_serializable_duplicate(G_OBJECT(data))); controls.view = gwy_data_view_new(controls.mydata); layer = gwy_layer_basic_new(); gwy_data_view_set_base_layer(GWY_DATA_VIEW(controls.view), GWY_PIXMAP_LAYER(layer)); dfield = GWY_DATA_FIELD(gwy_container_get_object_by_name(controls.mydata, "/0/data")); if (gwy_data_field_get_xres(dfield) >= gwy_data_field_get_yres(dfield)) zoomval = PREVIEW_SIZE/(gdouble)gwy_data_field_get_xres(dfield); else zoomval = PREVIEW_SIZE/(gdouble)gwy_data_field_get_yres(dfield); gwy_data_view_set_zoom(GWY_DATA_VIEW(controls.view), zoomval); gtk_box_pack_start(GTK_BOX(hbox), controls.view, FALSE, FALSE, 4); table = gtk_table_new(9, 4, FALSE); gtk_box_pack_start(GTK_BOX(hbox), table, TRUE, TRUE, 4); row = 0; label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(label), _("<b>Grain Location</b>")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 2, 2); row++; controls.locate_steps = gtk_adjustment_new(args->locate_steps, 1.0, 100.0, 1, 5, 0); gwy_table_attach_hscale(table, row, _("_Number of steps:"), "", controls.locate_steps, 0); g_signal_connect(controls.locate_steps, "value_changed", G_CALLBACK(wshed_invalidate), &controls); row++; controls.locate_dropsize = gtk_adjustment_new(args->locate_dropsize, 0.01, 100.0, 0.1, 5, 0); spin = gwy_table_attach_hscale(table, row, _("_Drop size:"), "%", controls.locate_dropsize, 0); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 2); g_signal_connect(controls.locate_dropsize, "value_changed", G_CALLBACK(wshed_invalidate), &controls); row++; controls.locate_thresh = gtk_adjustment_new(args->locate_thresh, 0.0, 100.0, 1, 5, 0); gwy_table_attach_hscale(table, row, _("_Threshold:"), "px<sup>2</sup>", controls.locate_thresh, 0); g_signal_connect(controls.locate_thresh, "value_changed", G_CALLBACK(wshed_invalidate), &controls); gtk_table_set_row_spacing(GTK_TABLE(table), row, 8); row++; label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(label), _("<b>Segmentation</b>")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 2, 2); row++; controls.wshed_steps = gtk_adjustment_new(args->wshed_steps, 1.0, 1000.0, 1, 5, 0); gwy_table_attach_hscale(table, row, _("Num_ber of steps:"), "", controls.wshed_steps, 0); g_signal_connect(controls.wshed_steps, "value_changed", G_CALLBACK(wshed_invalidate), &controls); row++; controls.wshed_dropsize = gtk_adjustment_new(args->wshed_dropsize, 0.01, 100.0, 0.1, 5, 0); spin = gwy_table_attach_hscale(table, row, _("Dr_op size:"), "%", controls.wshed_dropsize, 0); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 2); g_signal_connect(controls.wshed_dropsize, "value_changed", G_CALLBACK(wshed_invalidate), &controls); gtk_table_set_row_spacing(GTK_TABLE(table), row, 8); row++; label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(label), _("<b>Options</b>")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 2, 2); row++; controls.inverted = gtk_check_button_new_with_mnemonic(_("_Invert height")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.inverted), args->inverted); gtk_table_attach(GTK_TABLE(table), controls.inverted, 0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 2, 2); g_signal_connect(controls.inverted, "toggled", G_CALLBACK(wshed_invalidate), &controls); row++; controls.color_button = gwy_color_button_new(); gwy_color_button_set_use_alpha(GWY_COLOR_BUTTON(controls.color_button), TRUE); load_mask_color(controls.color_button, gwy_data_view_get_data(GWY_DATA_VIEW(controls.view))); gwy_table_attach_hscale(table, row++, _("_Mask color:"), NULL, GTK_OBJECT(controls.color_button), GWY_HSCALE_WIDGET_NO_EXPAND); g_signal_connect(controls.color_button, "clicked", G_CALLBACK(mask_color_change_cb), &controls); controls.computed = FALSE; gtk_widget_show_all(dialog); do { response = gtk_dialog_run(GTK_DIALOG(dialog)); switch (response) { case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: wshed_dialog_update_values(&controls, args); gtk_widget_destroy(dialog); case GTK_RESPONSE_NONE: g_object_unref(controls.mydata); return FALSE; break; case GTK_RESPONSE_OK: break; case RESPONSE_RESET: *args = wshed_defaults; wshed_dialog_update_controls(&controls, args); break; case RESPONSE_PREVIEW: wshed_dialog_update_values(&controls, args); preview(&controls, args); break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); save_mask_color(controls.color_button, data); wshed_dialog_update_values(&controls, args); gtk_widget_destroy(dialog); wshed_ok(&controls, args, data); g_object_unref(controls.mydata); return controls.computed; }
static guint select_which_data(GPtrArray *rhkfile) { RHKControls controls; RHKPage *rhkpage; GtkWidget *dialog, *label, *vbox, *hbox, *align; GwyDataField *dfield; GwyEnum *choices; GwyPixmapLayer *layer; GSList *radio, *rl; guint i, b = (guint)-1; const gchar *s; if (!rhkfile->len) return b; if (rhkfile->len == 1) return 0; controls.file = rhkfile; choices = g_new(GwyEnum, rhkfile->len + 1); for (i = 0; i < rhkfile->len; i++) { rhkpage = g_ptr_array_index(rhkfile, i); choices[i].value = i; s = rhkpage->strings[RHK_STRING_LABEL]; if (s && *s) choices[i].name = g_strdup_printf(_("Page %u (%s)"), rhkpage->pageno, s); else choices[i].name = g_strdup_printf(_("Page %u"), rhkpage->pageno); } rhkpage = g_ptr_array_index(rhkfile, 0); dialog = gtk_dialog_new_with_buttons(_("Select Data"), NULL, 0, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); hbox = gtk_hbox_new(FALSE, 20); gtk_container_set_border_width(GTK_CONTAINER(hbox), 6); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, TRUE, TRUE, 0); align = gtk_alignment_new(0.0, 0.0, 0.0, 0.0); gtk_box_pack_start(GTK_BOX(hbox), align, TRUE, TRUE, 0); vbox = gtk_vbox_new(TRUE, 0); gtk_container_add(GTK_CONTAINER(align), vbox); label = gtk_label_new(_("Data to load:")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); radio = gwy_radio_buttons_create(choices, rhkfile->len, "data", G_CALLBACK(selection_changed), &controls, 0); for (i = 0, rl = radio; rl; i++, rl = g_slist_next(rl)) gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(rl->data), TRUE, TRUE, 0); /* preview */ align = gtk_alignment_new(1.0, 0.0, 0.0, 0.0); gtk_box_pack_start(GTK_BOX(hbox), align, TRUE, TRUE, 0); controls.data = GWY_CONTAINER(gwy_container_new()); dfield = rhk_sm3_page_to_data_field(rhkpage); gwy_container_set_object_by_name(controls.data, "/0/data", (GObject*)dfield); g_object_unref(dfield); controls.data_view = gwy_data_view_new(controls.data); g_object_unref(controls.data); gwy_data_view_set_zoom(GWY_DATA_VIEW(controls.data_view), 120.0/MAX(rhkpage->x_size, rhkpage->y_size)); layer = GWY_PIXMAP_LAYER(gwy_layer_basic_new()); gwy_data_view_set_base_layer(GWY_DATA_VIEW(controls.data_view), layer); gtk_container_add(GTK_CONTAINER(align), controls.data_view); gtk_widget_show_all(dialog); gtk_window_present(GTK_WINDOW(dialog)); switch (gtk_dialog_run(GTK_DIALOG(dialog))) { case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: gtk_widget_destroy(dialog); case GTK_RESPONSE_NONE: break; case GTK_RESPONSE_OK: b = GPOINTER_TO_UINT(gwy_radio_buttons_get_current(radio, "data")); gtk_widget_destroy(dialog); break; default: g_assert_not_reached(); break; } for (i = 0; i < rhkfile->len; i++) g_free((gpointer)choices[i].name); g_free(choices); return b; }