static void poly_level_type_changed(GtkToggleButton *button, PolyLevelControls *controls) { PolyLevelArgs *args; if (!gtk_toggle_button_get_active(button)) return; args = controls->args; args->independent = gwy_radio_buttons_get_current(controls->type_group); gtk_widget_set_sensitive(controls->same_degree, args->independent); gwy_table_hscale_set_sensitive(controls->row_degree, args->independent); gwy_table_hscale_set_sensitive(controls->col_degree, args->independent); gwy_table_hscale_set_sensitive(controls->max_degree, !args->independent); poly_level_update_preview(controls, args); }
static void maskcor_operation_changed(GtkWidget *combo, MaskcorControls *controls) { controls->args->result = gwy_enum_combo_box_get_active(GTK_COMBO_BOX(combo)); gwy_table_hscale_set_sensitive(controls->threshold, controls->args->result != GWY_MASKCOR_SCORE); }
static void split_to_stripes_changed(GtkToggleButton *toggle, TipBlindControls *controls) { gboolean sens = gtk_toggle_button_get_active(toggle); controls->args->split_to_stripes = sens; gwy_table_hscale_set_sensitive(controls->stripeno, sens); gtk_widget_set_sensitive(controls->create_images, sens); gtk_widget_set_sensitive(controls->plot_size_graph, sens); tip_update(controls); }
static void tip_model_dialog_update_controls(TipModelControls *controls, TipModelArgs *args) { gboolean all_sensitive = FALSE, contact_sensitive = FALSE; gwy_enum_combo_box_set_active(GTK_COMBO_BOX(controls->type), args->type); gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->nsides), args->nsides); gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->angle), args->angle); gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->theta), args->theta); sci_entry_set_value(GTK_ADJUSTMENT(controls->radius), GTK_COMBO_BOX(controls->radius_unit), args->radius); switch (args->type) { case GWY_TIP_PYRAMIDE: all_sensitive = TRUE; case GWY_TIP_CONTACT: case GWY_TIP_NONCONTACT: contact_sensitive = TRUE; break; case GWY_TIP_DELTA: break; default: g_return_if_reached(); break; } gwy_table_hscale_set_sensitive(controls->angle, all_sensitive); gwy_table_hscale_set_sensitive(controls->theta, contact_sensitive); gwy_table_hscale_set_sensitive(controls->nsides, all_sensitive); gtk_widget_set_sensitive(controls->radius_spin, contact_sensitive); gtk_widget_set_sensitive(controls->radius_unit, contact_sensitive); gtk_widget_set_sensitive(controls->radius_label, contact_sensitive); }
static void update_sensitivity(EntropyControls *controls) { GwyDataField *dfield = controls->dfield; gboolean is_slope = (controls->args->mode != ENTROPY_VALUES); if (!gwy_si_unit_equal(gwy_data_field_get_si_unit_xy(dfield), gwy_data_field_get_si_unit_z(dfield))) { GtkWidget *button = gwy_radio_buttons_find(controls->mode, ENTROPY_ANGLES); gtk_widget_set_sensitive(button, FALSE); } gtk_widget_set_sensitive(controls->fit_plane, is_slope); gwy_table_hscale_set_sensitive(controls->kernel_size, is_slope && controls->args->fit_plane); }
static void scale_dialog_update(ScaleControls *controls, ScaleArgs *args) { args->aspectratio = (gdouble)args->yres/args->org_yres *(gdouble)args->org_xres/args->xres; gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->xres), ROUND(args->xres)); gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->yres), ROUND(args->yres)); gtk_adjustment_set_value(GTK_ADJUSTMENT(controls->ratio), args->ratio); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls->proportional), args->proportional); /* deactivate Ratio */ gwy_table_hscale_set_sensitive(controls->ratio,args->proportional); gwy_enum_combo_box_set_active(GTK_COMBO_BOX(controls->interp), args->interp); }
static void prof_dialog(ProfArgs *args, GwyContainer *data, GwyDataField *dfield, gint id) { GtkWidget *hbox, *hbox2, *vbox, *label; GwyDataChooser *chooser; GtkTable *table; GtkDialog *dialog; GwyGraph *graph; GwyGraphArea *area; ProfControls controls; gint response; gint row; controls.args = args; controls.psdffield = prof_psdf(dfield, args); controls.modfield = prof_sqrt(controls.psdffield); controls.hx = gwy_data_field_get_xmeasure(dfield)/(2*G_PI); controls.hy = gwy_data_field_get_xmeasure(dfield)/(2*G_PI); controls.dialog = gtk_dialog_new_with_buttons(_("Radial PSDF Section"), NULL, 0, GTK_STOCK_CLEAR, RESPONSE_CLEAR, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); dialog = GTK_DIALOG(controls.dialog); gtk_dialog_set_default_response(dialog, GTK_RESPONSE_OK); gtk_dialog_set_response_sensitive(dialog, GTK_RESPONSE_OK, FALSE); gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT); hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 4); controls.mydata = gwy_container_new(); gwy_container_set_object_by_name(controls.mydata, "/0/data", controls.modfield); g_object_unref(controls.modfield); gwy_container_set_string_by_name(controls.mydata, "/0/base/palette", g_strdup("DFit")); gwy_container_set_enum_by_name(controls.mydata, "/0/base/range-type", GWY_LAYER_BASIC_RANGE_AUTO); gwy_app_sync_data_items(data, controls.mydata, id, 0, FALSE, GWY_DATA_ITEM_REAL_SQUARE, 0); controls.view = create_preview(controls.mydata, 0, PREVIEW_SIZE, FALSE); controls.selection = create_vector_layer(GWY_DATA_VIEW(controls.view), 0, "Point", TRUE); gwy_selection_set_max_objects(controls.selection, NLINES); g_object_set(gwy_data_view_get_top_layer(GWY_DATA_VIEW(controls.view)), "draw-as-vector", TRUE, NULL); g_signal_connect_swapped(controls.selection, "changed", G_CALLBACK(prof_selection_changed), &controls); gtk_box_pack_start(GTK_BOX(hbox), controls.view, FALSE, FALSE, 4); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 4); controls.gmodel = gwy_graph_model_new(); g_object_set(controls.gmodel, "title", _("PSDF Section"), "axis-label-bottom", "k", "axis-label-left", "W", NULL); init_graph_model_units(controls.gmodel, controls.psdffield); controls.line = gwy_data_line_new(1, 1.0, FALSE); controls.graph = gwy_graph_new(controls.gmodel); graph = GWY_GRAPH(controls.graph); gtk_widget_set_size_request(controls.graph, GRAPH_WIDTH, -1); gwy_graph_set_axis_visible(graph, GTK_POS_LEFT, FALSE); gwy_graph_set_axis_visible(graph, GTK_POS_RIGHT, FALSE); gwy_graph_set_axis_visible(graph, GTK_POS_TOP, FALSE); gwy_graph_set_axis_visible(graph, GTK_POS_BOTTOM, FALSE); gwy_graph_enable_user_input(graph, FALSE); area = GWY_GRAPH_AREA(gwy_graph_get_area(graph)); gwy_graph_area_enable_user_input(area, FALSE); gtk_box_pack_start(GTK_BOX(vbox), controls.graph, TRUE, TRUE, 0); table = GTK_TABLE(gtk_table_new(4, 4, FALSE)); gtk_table_set_row_spacings(table, 2); gtk_table_set_col_spacings(table, 6); gtk_container_set_border_width(GTK_CONTAINER(table), 4); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(table), FALSE, FALSE, 0); row = 0; controls.resolution = gtk_adjustment_new(controls.args->resolution, MIN_RESOLUTION, MAX_RESOLUTION, 1, 10, 0); gwy_table_attach_hscale(GTK_WIDGET(table), row, _("_Fix res.:"), NULL, controls.resolution, GWY_HSCALE_CHECK | GWY_HSCALE_SQRT); g_signal_connect_swapped(controls.resolution, "value-changed", G_CALLBACK(prof_resolution_changed), &controls); controls.fixres = gwy_table_hscale_get_check(controls.resolution); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.fixres), controls.args->fixres); g_signal_connect_swapped(controls.fixres, "toggled", G_CALLBACK(prof_fixres_changed), &controls); gwy_table_hscale_set_sensitive(controls.resolution, controls.args->fixres); row++; controls.separate = gtk_check_button_new_with_mnemonic(_("_Separate curves")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.separate), args->separate); gtk_table_attach(table, controls.separate, 0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); g_signal_connect_swapped(controls.separate, "toggled", G_CALLBACK(prof_separate_changed), &controls); row++; hbox2 = gtk_hbox_new(FALSE, 6); gtk_table_attach(table, hbox2, 0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); label = gtk_label_new_with_mnemonic(_("_Interpolation type:")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); controls.interpolation = gwy_enum_combo_box_new(gwy_interpolation_type_get_enum(), -1, G_CALLBACK(prof_interpolation_changed), &controls, controls.args->interpolation, TRUE); gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.interpolation); gtk_box_pack_end(GTK_BOX(hbox2), controls.interpolation, FALSE, FALSE, 0); row++; controls.target_hbox = hbox2 = gtk_hbox_new(FALSE, 6); gtk_widget_set_sensitive(hbox2, !args->separate); gtk_table_attach(GTK_TABLE(table), hbox2, 0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); label = gtk_label_new_with_mnemonic(_("Target _graph:")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); controls.target_graph = gwy_data_chooser_new_graphs(); chooser = GWY_DATA_CHOOSER(controls.target_graph); gwy_data_chooser_set_none(chooser, _("New graph")); gwy_data_chooser_set_active(chooser, NULL, -1); gwy_data_chooser_set_filter(chooser, filter_target_graphs, &controls, NULL); gwy_data_chooser_set_active_id(chooser, &args->target_graph); gwy_data_chooser_get_active_id(chooser, &args->target_graph); gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.target_graph); gtk_box_pack_end(GTK_BOX(hbox2), controls.target_graph, FALSE, FALSE, 0); g_signal_connect_swapped(controls.target_graph, "changed", G_CALLBACK(target_graph_changed), &controls); row++; gtk_widget_show_all(controls.dialog); do { response = gtk_dialog_run(dialog); switch (response) { case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: gtk_widget_destroy(controls.dialog); case GTK_RESPONSE_NONE: goto finalize; break; case GTK_RESPONSE_OK: break; case RESPONSE_CLEAR: gwy_selection_clear(controls.selection); break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); gtk_widget_destroy(controls.dialog); prof_execute(&controls, data); finalize: g_object_unref(controls.psdffield); g_object_unref(controls.mydata); g_object_unref(controls.gmodel); g_object_unref(controls.line); }
static gboolean dwt_dialog(DWTArgs *args, gint size, gint newsize) { enum { RESPONSE_RESET = 1 }; GtkWidget *dialog, *table, *label; DWTControls controls; gint row, response; gchar *s; dialog = gtk_dialog_new_with_buttons(_("2D DWT"), NULL, 0, _("_Reset"), RESPONSE_RESET, 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); table = gtk_table_new(2, 4, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 2); gtk_table_set_col_spacings(GTK_TABLE(table), 6); gtk_container_set_border_width(GTK_CONTAINER(table), 4); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table, FALSE, FALSE, 4); row = 0; controls.wavelet = gwy_enum_combo_box_new(gwy_dwt_type_get_enum(), -1, G_CALLBACK(gwy_enum_combo_box_update_int), &args->wavelet, args->wavelet, TRUE); gwy_table_attach_row(table, row, _("_Wavelet type:"), NULL, controls.wavelet); row++; if (size != newsize) { gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8); s = g_strdup_printf(_("Size %d is not a power of 2,\n" "data will be resampled to %d×%d for DWT."), size, newsize, newsize); label = gtk_label_new(s); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); g_free(s); row++; } controls.interp = gwy_enum_combo_box_new(gwy_interpolation_type_get_enum(), -1, G_CALLBACK(gwy_enum_combo_box_update_int), &args->interp, args->interp, TRUE); gwy_table_attach_row(table, row, _("_Interpolation type:"), NULL, controls.interp); gwy_table_hscale_set_sensitive(GTK_OBJECT(controls.interp), size != newsize); row++; gtk_widget_show_all(dialog); do { response = gtk_dialog_run(GTK_DIALOG(dialog)); switch (response) { case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: gtk_widget_destroy(dialog); case GTK_RESPONSE_NONE: return FALSE; break; case GTK_RESPONSE_OK: break; case RESPONSE_RESET: *args = dwt_defaults; dwt_dialog_update(&controls, args); break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); gtk_widget_destroy(dialog); return TRUE; }
static gboolean poly_level_dialog(PolyLevelArgs *args, GwyContainer *data, GwyDataField *dfield, GwyDataField *mfield, gint id) { enum { RESPONSE_RESET = 1 }; static const GwyEnum types[] = { { N_("Independent degrees"), TRUE, }, { N_("Limited total degree"), FALSE, }, }; GtkWidget *dialog, *table, *label, *hbox; GwyPixmapLayer *layer; PolyLevelControls controls; gint response; gint row; controls.args = args; controls.in_update = TRUE; controls.data = create_preview_data(data, dfield, mfield, id); dialog = gtk_dialog_new_with_buttons(_("Remove Polynomial Background"), NULL, 0, _("_Reset"), RESPONSE_RESET, 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, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 0); table = gtk_table_new(2, 2, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 2); gtk_table_set_col_spacings(GTK_TABLE(table), 12); gtk_container_set_border_width(GTK_CONTAINER(table), 4); gtk_box_pack_start(GTK_BOX(hbox), table, FALSE, FALSE, 0); row = 0; controls.leveled_view = gwy_data_view_new(controls.data); layer = gwy_layer_basic_new(); gwy_pixmap_layer_set_data_key(layer, "/0/data"); gwy_layer_basic_set_gradient_key(GWY_LAYER_BASIC(layer), "/0/base/palette"); gwy_data_view_set_data_prefix(GWY_DATA_VIEW(controls.leveled_view), "/0/data"); gwy_data_view_set_base_layer(GWY_DATA_VIEW(controls.leveled_view), layer); gtk_table_attach(GTK_TABLE(table), controls.leveled_view, 0, 1, row, row+1, 0, 0, 0, 0); controls.bg_view = gwy_data_view_new(controls.data); layer = gwy_layer_basic_new(); gwy_pixmap_layer_set_data_key(layer, "/1/data"); gwy_layer_basic_set_gradient_key(GWY_LAYER_BASIC(layer), "/1/base/palette"); gwy_data_view_set_data_prefix(GWY_DATA_VIEW(controls.bg_view), "/1/data"); gwy_data_view_set_base_layer(GWY_DATA_VIEW(controls.bg_view), layer); gtk_table_attach(GTK_TABLE(table), controls.bg_view, 1, 2, row, row+1, 0, 0, 0, 0); g_object_unref(controls.data); row++; label = gtk_label_new(_("Leveled data")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); label = gtk_label_new(_("Background")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); row++; table = gtk_table_new(7 + (mfield ? 4 : 0), 4, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 2); gtk_table_set_col_spacings(GTK_TABLE(table), 6); gtk_container_set_border_width(GTK_CONTAINER(table), 4); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table, TRUE, TRUE, 0); row = 0; controls.type_group = gwy_radio_buttons_create(types, G_N_ELEMENTS(types), G_CALLBACK(poly_level_type_changed), &controls, args->independent); gtk_table_attach(GTK_TABLE(table), GTK_WIDGET(controls.type_group->data), 0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); row++; controls.col_degree = gtk_adjustment_new(args->col_degree, 0, MAX_DEGREE, 1, 1, 0); gwy_table_attach_hscale(table, row++, _("_Horizontal polynom degree:"), NULL, controls.col_degree, 0); g_signal_connect(controls.col_degree, "value-changed", G_CALLBACK(poly_level_degree_changed), &controls); controls.row_degree = gtk_adjustment_new(args->row_degree, 0, MAX_DEGREE, 1, 1, 0); gwy_table_attach_hscale(table, row++, _("_Vertical polynom degree:"), NULL, controls.row_degree, 0); g_signal_connect(controls.row_degree, "value-changed", G_CALLBACK(poly_level_degree_changed), &controls); controls.same_degree = gtk_check_button_new_with_mnemonic(_("_Same degrees")); gtk_table_attach(GTK_TABLE(table), controls.same_degree, 0, 4, row, row+1, GTK_FILL, 0, 0, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.same_degree), args->same_degree); g_signal_connect(controls.same_degree, "toggled", G_CALLBACK(poly_level_same_degree_changed), &controls); gtk_table_set_row_spacing(GTK_TABLE(table), row, 8); row++; gtk_table_attach(GTK_TABLE(table), GTK_WIDGET(controls.type_group->next->data), 0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); row++; controls.max_degree = gtk_adjustment_new(args->max_degree, 0, MAX_DEGREE, 1, 1, 0); gwy_table_attach_hscale(table, row, _("_Maximum polynom degree:"), NULL, controls.max_degree, 0); g_signal_connect(controls.max_degree, "value-changed", G_CALLBACK(poly_level_max_degree_changed), &controls); gtk_table_set_row_spacing(GTK_TABLE(table), row, 8); row++; controls.do_extract = gtk_check_button_new_with_mnemonic(_("E_xtract background")); gtk_table_attach(GTK_TABLE(table), controls.do_extract, 0, 4, row, row+1, GTK_FILL, 0, 0, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.do_extract), args->do_extract); gtk_table_set_row_spacing(GTK_TABLE(table), row, 8); row++; if (mfield) { label = gwy_label_new_header(_("Masking Mode")); gtk_table_attach(GTK_TABLE(table), label, 0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); row++; controls.masking_group = gwy_radio_buttons_create(gwy_masking_type_get_enum(), -1, G_CALLBACK(poly_level_masking_changed), &controls, args->masking); row = gwy_radio_buttons_attach_to_table(controls.masking_group, GTK_TABLE(table), 3, row); } else controls.masking_group = NULL; controls.in_update = FALSE; gtk_widget_set_sensitive(controls.same_degree, args->independent); gwy_table_hscale_set_sensitive(controls.row_degree, args->independent); gwy_table_hscale_set_sensitive(controls.col_degree, args->independent); gwy_table_hscale_set_sensitive(controls.max_degree, !args->independent); poly_level_update_preview(&controls, args); gtk_widget_show_all(dialog); do { response = gtk_dialog_run(GTK_DIALOG(dialog)); switch (response) { case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: poly_level_update_values(&controls, args); gtk_widget_destroy(dialog); case GTK_RESPONSE_NONE: return FALSE; break; case GTK_RESPONSE_OK: break; case RESPONSE_RESET: *args = poly_level_defaults; poly_level_dialog_update(&controls, args); break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); poly_level_update_values(&controls, args); gtk_widget_destroy(dialog); return TRUE; }
static gboolean maskcor_dialog(MaskcorArgs *args) { MaskcorControls controls; GtkWidget *dialog, *table, *chooser, *spin, *combo, *method; GtkObject *adj; gint row, response; gboolean ok; controls.args = args; dialog = gtk_dialog_new_with_buttons(_("Mask by Correlation"), NULL, 0, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT); table = gtk_table_new(5, 4, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 2); gtk_table_set_col_spacings(GTK_TABLE(table), 6); gtk_container_set_border_width(GTK_CONTAINER(table), 4); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table, TRUE, TRUE, 4); row = 0; /* Kernel */ chooser = gwy_data_chooser_new_channels(); g_object_set_data(G_OBJECT(chooser), "dialog", dialog); gwy_data_chooser_set_active(GWY_DATA_CHOOSER(chooser), NULL, -1); gwy_data_chooser_set_filter(GWY_DATA_CHOOSER(chooser), maskcor_kernel_filter, &args->data, NULL); gwy_data_chooser_set_active_id(GWY_DATA_CHOOSER(chooser), &args->kernel); gwy_data_chooser_get_active_id(GWY_DATA_CHOOSER(chooser), &args->kernel); g_signal_connect(chooser, "changed", G_CALLBACK(maskcor_kernel_changed), &args->kernel); gwy_table_attach_hscale(table, row, _("Correlation _kernel:"), NULL, GTK_OBJECT(chooser), GWY_HSCALE_WIDGET); row++; /* Result */ combo = gwy_enum_combo_box_newl(G_CALLBACK(maskcor_operation_changed), &controls, args->result, _("Objects marked"), GWY_MASKCOR_OBJECTS, _("Correlation maxima"), GWY_MASKCOR_MAXIMA, _("Correlation score"), GWY_MASKCOR_SCORE, NULL); gwy_table_attach_row(table, row, _("Output _type:"), NULL, combo); row++; /* Parameters */ method = gwy_enum_combo_box_new(gwy_correlation_type_get_enum(), -1, G_CALLBACK(gwy_enum_combo_box_update_int), &args->method, args->method, TRUE); gwy_table_attach_row(table, row, _("Correlation _method:"), NULL, method); row++; adj = gtk_adjustment_new(args->threshold, -1.0, 1.0, 0.01, 0.1, 0); controls.threshold = adj; spin = gwy_table_attach_hscale(table, row, _("T_hreshold:"), NULL, adj, 0); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3); gwy_table_hscale_set_sensitive(adj, args->result != GWY_MASKCOR_SCORE); g_signal_connect(adj, "value-changed", G_CALLBACK(maskcor_threshold_changed), &args->threshold); row++; gtk_widget_show_all(dialog); do { response = gtk_dialog_run(GTK_DIALOG(dialog)); switch (response) { case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: gtk_widget_destroy(dialog); case GTK_RESPONSE_NONE: return FALSE; break; case GTK_RESPONSE_OK: gtk_widget_destroy(dialog); ok = TRUE; break; default: g_assert_not_reached(); break; } } while (!ok); return ok; }