/** * gwy_enum_combo_box_newl: * @callback: A callback called when a new choice is selected (may be %NULL). * @cbdata: User data passed to the callback. * @active: The enum value to show as currently selected. If it isn't equal to * any @entries value, the first item is selected. * @...: First item label, first item value, second item label, second item * value, etc. Terminated with %NULL. * * Creates a combo box with choices from a list of label/value pairs. * * The string values passed as label texts must exist through the whole * lifetime of the widget. * * Returns: A newly created combo box as #GtkWidget. * * Since: 2.5 **/ GtkWidget* gwy_enum_combo_box_newl(GCallback callback, gpointer cbdata, gint active, ...) { GtkWidget *widget; GwyEnum *entries; gint i, nentries; va_list ap; va_start(ap, active); nentries = 0; while (va_arg(ap, const gchar*)) { (void)va_arg(ap, gint); nentries++; } va_end(ap); entries = g_new(GwyEnum, nentries); va_start(ap, active); for (i = 0; i < nentries; i++) { entries[i].name = va_arg(ap, const gchar*); entries[i].value = va_arg(ap, gint); } va_end(ap); widget = gwy_enum_combo_box_new(entries, nentries, callback, cbdata, active, FALSE); g_signal_connect_swapped(widget, "destroy", G_CALLBACK(g_free), entries); return widget; }
/** * gwy_combo_box_metric_unit_new: * @callback: A callback called when a menu item is activated (or %NULL for * @cbdata: User data passed to the callback. * @from: The exponent of 10 the menu should start at (a multiple of 3, will * be rounded downward if isn't). * @to: The exponent of 10 the menu should end at (a multiple of 3, will be * rounded upward if isn't). * @unit: The unit to be prefixed. * @active: The power of 10 to show as currently selected (a multiple of 3). * * Creates an enum combo box with SI power of 10 multiplies. * * The integer value is the power of 10. * * Returns: The newly created combo box as #GtkWidget. **/ GtkWidget* gwy_combo_box_metric_unit_new(GCallback callback, gpointer cbdata, gint from, gint to, GwySIUnit *unit, gint active) { GtkWidget *combo; GwyEnum *entries; gint n; g_return_val_if_fail(GWY_IS_SI_UNIT(unit), NULL); if (!enum_quark) enum_quark = g_quark_from_static_string ("gwy-metric-unit-combo-box-enum"); entries = gwy_combo_box_metric_unit_make_enum(from, to, unit, &n); combo = gwy_enum_combo_box_new(entries, n, callback, cbdata, active, FALSE); g_object_set_qdata(G_OBJECT(combo), enum_quark, entries); g_signal_connect(combo, "destroy", G_CALLBACK(gwy_enum_combo_box_set_model), NULL); return combo; }
static GtkWidget* create_preset_menu(GCallback callback, gpointer cbdata, gint current) { static GwyEnum *entries = NULL; static gint nentries = 0; if (!entries) { const GwyTipModelPreset *func; gint i; nentries = gwy_tip_model_get_npresets(); entries = g_new(GwyEnum, nentries); for (i = 0; i < nentries; i++) { entries[i].value = i; func = gwy_tip_model_get_preset(i); entries[i].name = gwy_tip_model_get_preset_tip_name(func); } } /* XXX: presets currently not translatable? */ return gwy_enum_combo_box_new(entries, nentries, callback, cbdata, current, FALSE); }
static GtkWidget* distribution_selector_new(NoiseSynthControls *controls) { GtkWidget *combo; GwyEnum *model; guint n, i; n = G_N_ELEMENTS(generators); model = g_new(GwyEnum, n); for (i = 0; i < n; i++) { model[i].value = generators[i].distribution; model[i].name = generators[i].name; } combo = gwy_enum_combo_box_new(model, n, G_CALLBACK(distribution_type_selected), controls, controls->args->distribution, TRUE); g_object_weak_ref(G_OBJECT(combo), (GWeakNotify)g_free, model); return combo; }
static gboolean scale_dialog(ScaleArgs *args) { GtkWidget *dialog, *table, *spin; ScaleControls controls; enum { RESPONSE_RESET = 1 }; gint response; dialog = gtk_dialog_new_with_buttons(_("Scale"), 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(4, 5, 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); controls.ratio = gtk_adjustment_new(args->ratio, 2.0/MIN(args->xres, args->yres), 4096.0/MAX(args->xres, args->yres), 0.01, 0.2, 0); spin = gwy_table_attach_hscale(table, 0, _("Scale by _ratio:"), NULL, controls.ratio, GWY_HSCALE_LOG); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), 3); g_object_set_data(G_OBJECT(controls.ratio), "controls", &controls); g_signal_connect(controls.ratio, "value-changed", G_CALLBACK(scale_changed_cb), args); controls.proportional = gtk_check_button_new_with_mnemonic(_("_proportional")); gtk_table_attach_defaults(GTK_TABLE(table), controls.proportional, 3, 4, 0, 1); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.proportional), args->proportional); g_object_set_data(G_OBJECT(controls.proportional), "controls", &controls); g_signal_connect(controls.proportional, "toggled", G_CALLBACK(proportional_changed_cb), args); controls.xres = gtk_adjustment_new(args->ratio*args->xres, 2, 4096, 1, 10, 0); spin = gwy_table_attach_hscale(table, 1, _("New _width:"), "px", controls.xres, GWY_HSCALE_LOG); g_object_set_data(G_OBJECT(controls.xres), "controls", &controls); g_signal_connect(controls.xres, "value-changed", G_CALLBACK(width_changed_cb), args); controls.yres = gtk_adjustment_new(args->ratio*args->yres, 2, 4096, 1, 10, 0); spin = gwy_table_attach_hscale(table, 2, _("New _height:"), "px", controls.yres, GWY_HSCALE_LOG); g_object_set_data(G_OBJECT(controls.yres), "controls", &controls); g_signal_connect(controls.yres, "value-changed", G_CALLBACK(height_changed_cb), args); 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_hscale(table, 3, _("_Interpolation type:"), NULL, GTK_OBJECT(controls.interp), GWY_HSCALE_WIDGET); controls.in_update = FALSE; scale_dialog_update(&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: args->ratio = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls.ratio)); gtk_widget_destroy(dialog); case GTK_RESPONSE_NONE: return FALSE; break; case GTK_RESPONSE_OK: break; case RESPONSE_RESET: args->ratio = scale_defaults.ratio; args->xres = args->org_xres; args->yres = args->org_yres; args->proportional = scale_defaults.proportional; args->aspectratio = scale_defaults.aspectratio; args->interp = scale_defaults.interp; scale_dialog_update(&controls, args); break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); args->ratio = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls.ratio)); gtk_widget_destroy(dialog); return TRUE; }
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 cwt_dialog(CWTArgs *args) { GtkWidget *dialog, *table; CWTControls controls; enum { RESPONSE_RESET = 1 }; gint response; dialog = gtk_dialog_new_with_buttons(_("2D CWT"), 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(4, 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); controls.scale = gtk_adjustment_new(args->scale, 0.0, 1000.0, 1, 10, 0); gwy_table_attach_spinbutton(table, 1, _("_Scale:"), _("pixels"), controls.scale); controls.preserve = gtk_check_button_new_with_mnemonic(_("_Preserve size (don't " "resize to power of 2)")); gtk_table_attach(GTK_TABLE(table), controls.preserve, 0, 3, 0, 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.preserve), args->preserve); g_signal_connect(controls.preserve, "toggled", G_CALLBACK(preserve_changed_cb), args); 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, 2, _("_Interpolation type:"), "", controls.interp); controls.wavelet = gwy_enum_combo_box_new(gwy_2d_cwt_wavelet_type_get_enum(), -1, G_CALLBACK(gwy_enum_combo_box_update_int), &args->wavelet, args->wavelet, TRUE); gwy_table_attach_row(table, 3, _("_Wavelet type:"), "", controls.wavelet); gtk_widget_show_all(dialog); do { response = gtk_dialog_run(GTK_DIALOG(dialog)); switch (response) { case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: args->scale = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls.scale)); gtk_widget_destroy(dialog); case GTK_RESPONSE_NONE: return FALSE; break; case GTK_RESPONSE_OK: break; case RESPONSE_RESET: *args = cwt_defaults; cwt_dialog_update(&controls, args); break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); args->scale = gtk_adjustment_get_value(GTK_ADJUSTMENT(controls.scale)); gtk_widget_destroy(dialog); return TRUE; }
static gboolean dwt_anisotropy_dialog(DWTAnisotropyArgs *args) { enum { RESPONSE_RESET = 1 }; GtkWidget *dialog, *table; DWTAnisotropyControls controls; gint response; dialog = gtk_dialog_new_with_buttons(_("2D DWT Anisotropy"), NULL, 0, _("_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); gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT); table = gtk_table_new(2, 5, 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); 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, 1, _("_Interpolation type:"), "", controls.interp); 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, 2, _("_Wavelet type:"), "", controls.wavelet); controls.ratio = gtk_adjustment_new(args->ratio, 0.0001, 10.0, 1, 0.1, 0); gwy_table_attach_spinbutton(table, 3, _("X/Y ratio threshold:"), NULL, controls.ratio); g_signal_connect(controls.ratio, "value-changed", G_CALLBACK(ratio_changed_cb), args); controls.lowlimit = gtk_adjustment_new(args->lowlimit, 1, 20, 1, 1, 0); gwy_table_attach_spinbutton(table, 4, _("Low level exclude limit:"), NULL, controls.lowlimit); g_signal_connect(controls.lowlimit, "value-changed", G_CALLBACK(lowlimit_changed_cb), 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: gtk_widget_destroy(dialog); case GTK_RESPONSE_NONE: return FALSE; break; case GTK_RESPONSE_OK: break; case RESPONSE_RESET: *args = dwt_anisotropy_defaults; dwt_anisotropy_dialog_update(&controls, args); break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); gtk_widget_destroy(dialog); return TRUE; }
static gboolean rotate_dialog(RotateArgs *args, GwyContainer *data) { GtkWidget *dialog, *table, *hbox; GwyPixmapLayer *layer; RotateControls controls; enum { RESPONSE_RESET = 1 }; gint response; controls.args = args; dialog = gtk_dialog_new_with_buttons(_("Rotate"), NULL, 0, _("_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); gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT); hbox = gtk_hbox_new(FALSE, 8); gtk_container_set_border_width(GTK_CONTAINER(hbox), 4); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 4); table = gtk_table_new(3, 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(hbox), table, TRUE, TRUE, 0); controls.angle = gtk_adjustment_new(args->angle*180.0/G_PI, -360, 360, 0.1, 30, 0); gwy_table_attach_hscale(table, 0, _("Rotate by _angle:"), _("deg"), controls.angle, 0); g_signal_connect(controls.angle, "value-changed", G_CALLBACK(angle_changed_cb), &controls); controls.interp = gwy_enum_combo_box_new(gwy_interpolation_type_get_enum(), -1, G_CALLBACK(interp_changed_cb), &controls, args->interp, TRUE); gwy_table_attach_hscale(table, 1, _("_Interpolation type:"), NULL, GTK_OBJECT(controls.interp), GWY_HSCALE_WIDGET_NO_EXPAND); controls.expand = gtk_check_button_new_with_mnemonic(_("E_xpand result to fit " "complete data")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.expand), args->expand); gtk_table_attach(GTK_TABLE(table), controls.expand, 0, 4, 2, 3, GTK_EXPAND | GTK_FILL, 0, 0, 0); g_signal_connect(controls.expand, "toggled", G_CALLBACK(expand_changed_cb), &controls); controls.data = create_preview_data(data); controls.data_view = gwy_data_view_new(controls.data); g_object_unref(controls.data); layer = gwy_layer_basic_new(); gwy_pixmap_layer_set_data_key(layer, "/0/show"); gwy_layer_basic_set_gradient_key(GWY_LAYER_BASIC(layer), "/0/base/palette"); gwy_data_view_set_base_layer(GWY_DATA_VIEW(controls.data_view), layer); gtk_box_pack_start(GTK_BOX(hbox), controls.data_view, FALSE, FALSE, 8); rotate_dialog_update(&controls, args); rotate_preview_draw(&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: gtk_widget_destroy(dialog); case GTK_RESPONSE_NONE: return FALSE; break; case GTK_RESPONSE_OK: break; case RESPONSE_RESET: *args = rotate_defaults; rotate_dialog_update(&controls, args); break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); gtk_widget_destroy(dialog); return TRUE; }
static void facets_dialog(FacetsArgs *args, GwyContainer *data, GwyContainer *fdata, GwyDataField *dfield, GwyDataField *mfield, gint id, GQuark mquark) { GtkWidget *dialog, *table, *hbox, *hbox2, *vbox, *label, *scale, *button; GtkWidget *spin; FacetsControls controls; gint response; GwySelection *selection; gint row; gwy_clear(&controls, 1); controls.args = args; dialog = gtk_dialog_new_with_buttons(_("Mark Facets"), NULL, GTK_DIALOG_DESTROY_WITH_PARENT, gwy_sgettext("verb|_Mark"), 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); gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT); controls.dialog = dialog; /* Shallow-copy stuff to temporary container */ controls.fdata = fdata; controls.mydata = gwy_container_new(); gwy_container_set_object_by_name(controls.mydata, "/0/data", dfield); gwy_app_sync_data_items(data, controls.mydata, id, 0, FALSE, GWY_DATA_ITEM_PALETTE, GWY_DATA_ITEM_RANGE, GWY_DATA_ITEM_MASK_COLOR, GWY_DATA_ITEM_REAL_SQUARE, 0); hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 4); controls.view = create_preview(controls.mydata, 0, PREVIEW_SIZE, TRUE); gtk_box_pack_start(GTK_BOX(hbox), controls.view, FALSE, FALSE, 4); selection = create_vector_layer(GWY_DATA_VIEW(controls.view), 0, "Point", TRUE); g_signal_connect(selection, "changed", G_CALLBACK(preview_selection_updated), &controls); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); hbox2 = gtk_hbox_new(FALSE, 4); gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0); /* Slope view */ controls.fview = create_preview(controls.fdata, 0, FDATA_RES, TRUE); gtk_box_pack_start(GTK_BOX(hbox2), controls.fview, FALSE, FALSE, 0); selection = create_vector_layer(GWY_DATA_VIEW(controls.fview), 0, "Point", TRUE); g_signal_connect(selection, "changed", G_CALLBACK(facet_view_selection_updated), &controls); /* Info table */ table = gtk_table_new(7, 2, 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(hbox2), table, TRUE, TRUE, 4); row = 0; /* TRANSLATORS: The direction or line orthogonal to something. */ label = gwy_label_new_header(_("Normal")); gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1, GTK_FILL, 0, 0, 0); row++; controls.theta_label = add_angle_label(table, _("θ:"), &row); controls.phi_label = add_angle_label(table, _("φ:"), &row); button = gtk_button_new_with_mnemonic(_("_Find Maximum")); gtk_table_attach(GTK_TABLE(table), button, 0, 2, row, row+1, GTK_FILL, 0, 0, 0); g_signal_connect_swapped(button, "clicked", G_CALLBACK(facet_view_reset_maximum), &controls); gtk_table_set_row_spacing(GTK_TABLE(table), row, 8); row++; label = gwy_label_new_header(_("Mean Normal")); gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1, GTK_FILL, 0, 0, 0); row++; controls.mtheta_label = add_angle_label(table, _("θ:"), &row); controls.mphi_label = add_angle_label(table, _("φ:"), &row); gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8); label = gtk_label_new_with_mnemonic(_("Facet plane size:")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1, GTK_FILL, 0, 0, 0); row++; controls.kernel_size = gtk_adjustment_new(args->kernel_size, 0.0, MAX_PLANE_SIZE, 1.0, 1.0, 0); spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.kernel_size), 0.0, 0); gtk_label_set_mnemonic_widget(GTK_LABEL(label), spin); gtk_table_attach(GTK_TABLE(table), spin, 0, 1, row, row+1, 0, 0, 0, 0); g_signal_connect(controls.kernel_size, "value-changed", G_CALLBACK(facet_view_recompute), &controls); row++; table = gtk_table_new(4 + 2*(!!mfield), 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(vbox), table, TRUE, TRUE, 4); row = 0; controls.tolerance = gtk_adjustment_new(args->tolerance*180.0/G_PI, 0.0, 15.0, 0.01, 0.1, 0); scale = gwy_table_attach_hscale(table, row++, _("_Tolerance:"), _("deg"), controls.tolerance, 0); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(scale), 3); g_signal_connect(controls.tolerance, "value-changed", G_CALLBACK(facets_tolerance_changed), &controls); if (mfield) { gwy_container_set_object_by_name(controls.fdata, "/1/mask", mfield); controls.combine = gtk_check_button_new_with_mnemonic(_("Com_bine with " "existing mask")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.combine), args->combine); gtk_table_attach(GTK_TABLE(table), controls.combine, 0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); g_signal_connect(controls.combine, "toggled", G_CALLBACK(combine_changed), &controls); row++; controls.combine_type = gwy_enum_combo_box_new(gwy_merge_type_get_enum(), -1, G_CALLBACK(combine_type_changed), &controls, args->combine_type, TRUE); gwy_table_attach_hscale(table, row, _("Operation:"), NULL, GTK_OBJECT(controls.combine_type), GWY_HSCALE_WIDGET); gtk_table_set_row_spacing(GTK_TABLE(table), row, 8); row++; } controls.color_button = create_mask_color_button(controls.mydata, dialog, 0); gwy_table_attach_hscale(table, row, _("_Mask color:"), NULL, GTK_OBJECT(controls.color_button), GWY_HSCALE_WIDGET_NO_EXPAND); row++; if (!gwy_si_unit_equal(gwy_data_field_get_si_unit_xy(dfield), gwy_data_field_get_si_unit_z(dfield))) { gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8); label = gtk_label_new(_("Warning: Lateral and value units differ. " "Angles are not physically meaningful.")); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); row++; } gtk_widget_show_all(dialog); facet_view_select_angle(&controls, args->theta0, args->phi0); 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: g_object_unref(controls.mydata); facets_save_args(gwy_app_settings_get(), args); return; break; case GTK_RESPONSE_OK: break; case RESPONSE_RESET: args->tolerance = facets_defaults.tolerance; args->kernel_size = facets_defaults.kernel_size; facets_dialog_update_controls(&controls, args); break; case RESPONSE_PREVIEW: preview(&controls, args); update_average_angle(&controls, args); break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); gwy_app_sync_data_items(controls.mydata, data, 0, id, FALSE, GWY_DATA_ITEM_MASK_COLOR, 0); gtk_widget_destroy(dialog); g_object_unref(controls.mydata); run_noninteractive(args, data, fdata, dfield, mfield, mquark); facets_save_args(gwy_app_settings_get(), args); gwy_app_channel_log_add_proc(data, id, id); }
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 merge_dialog(MergeArgs *args) { MergeControls controls; GtkWidget *dialog, *table, *combo, *check; GwyDataChooser *chooser; gint response, row; gboolean ok; gwy_clear(&controls, 1); controls.args = args; dialog = gtk_dialog_new_with_buttons(_("Merge Data"), NULL, 0, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); controls.dialog = dialog; 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(6, 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; /* Merge with */ controls.op2 = gwy_data_chooser_new_channels(); chooser = GWY_DATA_CHOOSER(controls.op2); g_object_set_data(G_OBJECT(chooser), "dialog", dialog); gwy_data_chooser_set_active_id(chooser, &args->op2); gwy_data_chooser_set_filter(chooser, merge_data_filter, args, NULL); gwy_data_chooser_get_active_id(chooser, &args->op2); g_signal_connect_swapped(chooser, "changed", G_CALLBACK(merge_data_changed), &controls); merge_data_changed(&controls, chooser); gwy_table_attach_hscale(table, row, _("_Merge with:"), NULL, GTK_OBJECT(chooser), GWY_HSCALE_WIDGET); row++; /* Parameters */ combo = gwy_enum_combo_box_new(directions, G_N_ELEMENTS(directions), G_CALLBACK(merge_direction_changed), &controls, args->direction, TRUE); gwy_table_attach_hscale(table, row, _("_Put second operand:"), NULL, GTK_OBJECT(combo), GWY_HSCALE_WIDGET); row++; combo = gwy_enum_combo_box_new(modes, G_N_ELEMENTS(modes), G_CALLBACK(merge_mode_changed), &controls, args->mode, TRUE); gwy_table_attach_hscale(table, row, _("_Align second operand:"), NULL, GTK_OBJECT(combo), GWY_HSCALE_WIDGET); row++; combo = gwy_enum_combo_box_new(boundaries, G_N_ELEMENTS(boundaries), G_CALLBACK(merge_boundary_changed), &controls, args->boundary, TRUE); controls.boundary = combo; gwy_table_attach_hscale(table, row, _("_Boundary treatment:"), NULL, GTK_OBJECT(combo), GWY_HSCALE_WIDGET); row++; check = gtk_check_button_new_with_mnemonic(_("Crop result to _avoid " "outside pixels")); controls.crop_to_rectangle = check; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), args->crop_to_rectangle); gtk_table_attach(GTK_TABLE(table), check, 0, 3, row, row+1, GTK_FILL, 0, 0, 0); g_signal_connect_swapped(check, "toggled", G_CALLBACK(crop_to_rectangle_changed), &controls); row++; check = gtk_check_button_new_with_mnemonic(_("Add _mask of outside pixels")); controls.create_mask = check; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), args->create_mask); gtk_table_attach(GTK_TABLE(table), check, 0, 3, row, row+1, GTK_FILL, 0, 0, 0); g_signal_connect_swapped(check, "toggled", G_CALLBACK(create_mask_changed), &controls); row++; update_sensitivity(&controls); gtk_widget_show_all(dialog); do { response = gtk_dialog_run(GTK_DIALOG(dialog)); switch (response) { case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: case GTK_RESPONSE_NONE: gtk_widget_destroy(dialog); return FALSE; break; case GTK_RESPONSE_OK: ok = TRUE; break; default: g_assert_not_reached(); break; } } while (!ok); gtk_widget_destroy(dialog); return TRUE; }
static gboolean unrotate_dialog(UnrotateArgs *args, GwyContainer *data, GwyDataField *dfield, gint id, gdouble *correction, GwyPlaneSymmetry guess) { enum { RESPONSE_RESET = 1 }; GtkWidget *dialog, *table, *label, *hbox; GwyPixmapLayer *layer; UnrotateControls controls; const gchar *s; gint response; gint row; controls.correction = correction; controls.guess = guess; controls.args = args; dialog = gtk_dialog_new_with_buttons(_("Correct Rotation"), NULL, 0, _("_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); gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT); hbox = gtk_hbox_new(FALSE, 8); gtk_container_set_border_width(GTK_CONTAINER(hbox), 4); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 4); table = gtk_table_new(4, 3, 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(hbox), table, FALSE, FALSE, 0); row = 0; gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Structure")), 0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); row++; label = gtk_label_new(_("Detected:")); 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, 0, 0, 0); s = gwy_sgettext(gwy_enum_to_string(guess, gwy_plane_symmetry_get_enum(), -1)); label = gtk_label_new(_(s)); 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, 0, 0, 0); row++; controls.symmetry = gwy_enum_combo_box_new(gwy_plane_symmetry_get_enum(), -1, G_CALLBACK(unrotate_symmetry_cb), &controls, args->symmetry, TRUE); gwy_table_attach_row(table, row, _("_Assume:"), NULL, controls.symmetry); row++; label = gtk_label_new(_("Correction:")); 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, 0, 0, 0); controls.corrlabel = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(controls.corrlabel), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), controls.corrlabel, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); gtk_table_set_row_spacing(GTK_TABLE(table), row, 8); row++; controls.interp = gwy_enum_combo_box_new(gwy_interpolation_type_get_enum(), -1, G_CALLBACK(unrotate_interp_cb), &controls, args->interp, TRUE); gwy_table_attach_row(table, row, _("_Interpolation type:"), "", controls.interp); controls.data = create_preview_data(data, dfield, id); controls.data_view = gwy_data_view_new(controls.data); g_object_unref(controls.data); layer = gwy_layer_basic_new(); gwy_pixmap_layer_set_data_key(layer, "/0/show"); gwy_layer_basic_set_gradient_key(GWY_LAYER_BASIC(layer), "/0/base/palette"); gwy_data_view_set_data_prefix(GWY_DATA_VIEW(controls.data_view), "/0/data"); gwy_data_view_set_base_layer(GWY_DATA_VIEW(controls.data_view), layer); gtk_box_pack_start(GTK_BOX(hbox), controls.data_view, FALSE, FALSE, 8); unrotate_dialog_update(&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: gtk_widget_destroy(dialog); case GTK_RESPONSE_NONE: return FALSE; break; case GTK_RESPONSE_OK: break; case RESPONSE_RESET: *args = unrotate_defaults; unrotate_dialog_update(&controls, args); break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); gtk_widget_destroy(dialog); return TRUE; }
static gboolean psdflp_dialog(PSDFLPArgs *args) { GtkWidget *dialog, *table; PSDFLPControls controls; gint response, row; controls.args = args; dialog = gtk_dialog_new_with_buttons(_("Log-Phi PSDF"), NULL, 0, _("_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); gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT); 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.window = gwy_enum_combo_box_new(gwy_windowing_type_get_enum(), -1, G_CALLBACK(gwy_enum_combo_box_update_int), &args->window, args->window, TRUE); gwy_table_attach_row(table, row, _("_Windowing type:"), NULL, controls.window); g_signal_connect_swapped(controls.window, "changed", G_CALLBACK(windowing_changed), &controls); row++; controls.sigma = gtk_adjustment_new(args->sigma, 0.0, 40.0, 0.01, 1.0, 0); gwy_table_attach_hscale(table, row, _("Gaussian _smoothing:"), "px", controls.sigma, GWY_HSCALE_SQRT); g_signal_connect_swapped(controls.sigma, "value-changed", G_CALLBACK(sigma_changed), &controls); 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 = psdflp_defaults; psdflp_dialog_update(&controls, args); break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); 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; }