static gboolean xydenoise_dialog(XYdenoiseArgs *args) { GtkWidget *dialog, *table, *chooser; gint row, response; gboolean ok = FALSE; dialog = gtk_dialog_new_with_buttons(_("XY Denoising"), 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(9, 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; /* Correlate with */ chooser = gwy_data_chooser_new_channels(); g_object_set_data(G_OBJECT(chooser), "dialog", dialog); gwy_data_chooser_set_filter(GWY_DATA_CHOOSER(chooser), xydenoise_data_filter, &args->op1, NULL); g_signal_connect(chooser, "changed", G_CALLBACK(xydenoise_data_cb), &args->op2); xydenoise_data_cb(GWY_DATA_CHOOSER(chooser), &args->op2); gwy_table_attach_hscale(table, row, _("Second direction:"), NULL, GTK_OBJECT(chooser), GWY_HSCALE_WIDGET); gtk_table_set_row_spacing(GTK_TABLE(table), row, 8); 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: 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 entropy_dialog(EntropyArgs *args, GwyDataField *dfield, GwyDataField *mfield) { GtkWidget *dialog, *table, *label, *hbox; GwyGraphModel *gmodel; EntropyControls controls; gint response; gint row; controls.args = args; controls.dfield = dfield; controls.mfield = mfield; dialog = gtk_dialog_new_with_buttons(_("Entropy"), NULL, 0, NULL); gtk_dialog_add_action_widget(GTK_DIALOG(dialog), gwy_stock_like_button_new(_("_Update"), GTK_STOCK_EXECUTE), RESPONSE_PREVIEW); gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_OK, GTK_RESPONSE_OK); 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; hbox = gtk_hbox_new(FALSE, 12); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, TRUE, TRUE, 0); table = gtk_table_new(8 + 4*(!!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(hbox), table, FALSE, FALSE, 0); row = 0; controls.mode = gwy_radio_buttons_createl(G_CALLBACK(mode_changed), &controls, args->mode, _("Value distribution"), ENTROPY_VALUES, _("Slope derivative distribution"), ENTROPY_SLOPES, _("Slope angle distribution"), ENTROPY_ANGLES, NULL); row = gwy_radio_buttons_attach_to_table(controls.mode, GTK_TABLE(table), 3, row); if (mfield) { gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8); 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 = gwy_radio_buttons_create(gwy_masking_type_get_enum(), -1, G_CALLBACK(masking_changed), &controls, args->masking); row = gwy_radio_buttons_attach_to_table(controls.masking, GTK_TABLE(table), 3, row); } else controls.masking = NULL; gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8); controls.fit_plane = gtk_check_button_new_with_mnemonic(_("Use local plane _fitting")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.fit_plane), args->fit_plane); gtk_table_attach(GTK_TABLE(table), controls.fit_plane, 0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); g_signal_connect_swapped(controls.fit_plane, "toggled", G_CALLBACK(fit_plane_changed), &controls); row++; controls.kernel_size = gtk_adjustment_new(args->kernel_size, 2, 16, 1, 4, 0); gwy_table_attach_hscale(table, row, _("_Plane size:"), "px", controls.kernel_size, 0); g_signal_connect_swapped(controls.kernel_size, "value-changed", G_CALLBACK(kernel_size_changed), &controls); row++; gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8); controls.zoom_in = gtk_check_button_new_with_mnemonic(_("_Zoom graph around estimate")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.zoom_in), args->zoom_in); gtk_table_attach(GTK_TABLE(table), controls.zoom_in, 0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); g_signal_connect_swapped(controls.zoom_in, "toggled", G_CALLBACK(zoom_in_changed), &controls); row++; label = gtk_label_new(_("Entropy:")); 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, 0, 0); label = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 2, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); controls.entropy = label; row++; label = gtk_label_new(_("Entropy deficit:")); 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, 0, 0); label = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 2, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); controls.entropydef = label; row++; update_sensitivity(&controls); gmodel = gwy_graph_model_new(); controls.graph = gwy_graph_new(gmodel); g_object_unref(gmodel); gtk_widget_set_size_request(controls.graph, 400, 320); gtk_box_pack_start(GTK_BOX(hbox), controls.graph, TRUE, TRUE, 0); 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_PREVIEW: preview(&controls); break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); gtk_widget_destroy(dialog); return TRUE; }
static gint extr_path_dialogue(ExtrPathArgs *args, GwySelection *selection) { GtkDialog *dialogue; GtkTable *table; GtkWidget *check, *label; ExtrPathControls controls; gint response, row, npts = 0; gchar buf[16]; gwy_clear(&controls, 1); controls.args = args; controls.selection = selection; if (selection) npts = gwy_selection_get_data(selection, NULL); dialogue = GTK_DIALOG(gtk_dialog_new_with_buttons(_("Extract " "Path Selection"), NULL, 0, NULL)); gtk_dialog_add_button(dialogue, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); gtk_dialog_add_button(dialogue, GTK_STOCK_OK, GTK_RESPONSE_OK); gtk_dialog_set_default_response(dialogue, GTK_RESPONSE_OK); gwy_help_add_to_proc_dialog(GTK_DIALOG(dialogue), GWY_HELP_DEFAULT); table = GTK_TABLE(gtk_table_new(5, 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(GTK_DIALOG(dialogue)->vbox), GTK_WIDGET(table), FALSE, FALSE, 4); row = 0; if (selection) { label = gtk_label_new(_("Number of path points:")); gtk_table_attach(table, label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0); g_snprintf(buf, sizeof(buf), "%d", npts); label = gtk_label_new(buf); gtk_table_attach(table, label, 1, 3, row, row+1, GTK_FILL, 0, 0, 0); } else { label = gtk_label_new(_("There is no path selection.")); gtk_table_attach(table, label, 0, 4, row, row+1, GTK_FILL, 0, 0, 0); } row++; gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8); check = create_output_checkbutton(_("X position"), &args->x, &controls); gtk_table_attach(table, check, 0, 4, row, row+1, GTK_FILL, 0, 0, 0); row++; check = create_output_checkbutton(_("Y position"), &args->y, &controls); gtk_table_attach(table, check, 0, 4, row, row+1, GTK_FILL, 0, 0, 0); row++; check = create_output_checkbutton(_("X tangent"), &args->vx, &controls); gtk_table_attach(table, check, 0, 4, row, row+1, GTK_FILL, 0, 0, 0); row++; check = create_output_checkbutton(_("Y tangent"), &args->vy, &controls); gtk_table_attach(table, check, 0, 4, row, row+1, GTK_FILL, 0, 0, 0); row++; gtk_dialog_set_response_sensitive(dialogue, GTK_RESPONSE_OK, npts > 1); gtk_widget_show_all(GTK_WIDGET(dialogue)); do { response = gtk_dialog_run(dialogue); switch (response) { case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: gtk_widget_destroy(GTK_WIDGET(dialogue)); case GTK_RESPONSE_NONE: return FALSE; case GTK_RESPONSE_OK: break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); gtk_widget_destroy(GTK_WIDGET(dialogue)); return response == GTK_RESPONSE_OK; }
static gboolean cnew_dialog(CNewArgs *args, GwyDataField *dfield) { GtkWidget *dialog, *table, *spin, *label; GwySIUnit *unit; gint row; CNewControls controls; gint response; controls.args = args; controls.in_update = TRUE; dialog = gtk_dialog_new_with_buttons(_("Simple Calibration Data"), 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(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); /*x from*/ row = 0; label = gtk_label_new_with_mnemonic(_("_X from:")); 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.xrange_from = gtk_adjustment_new(args->xrange_from/pow10(args->xyexponent), -10000, 10000, 1, 10, 0); spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.xrange_from), 1, 2); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE); gtk_table_attach(GTK_TABLE(table), spin, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); unit = gwy_data_field_get_si_unit_xy(dfield); controls.xyexponent = gwy_combo_box_metric_unit_new(G_CALLBACK(xyexponent_changed_cb), &controls, -15, 6, unit, args->xyexponent); gtk_table_attach(GTK_TABLE(table), controls.xyexponent, 2, 3, row, row+2, GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0, 0); controls.xyunits = gtk_button_new_with_label(gwy_sgettext("verb|Change")); g_object_set_data(G_OBJECT(controls.xyunits), "id", (gpointer)"xy"); gtk_table_attach(GTK_TABLE(table), controls.xyunits, 3, 4, row, row+2, GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0, 0); row++; label = gtk_label_new_with_mnemonic(_("_X to:")); 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.xrange_to = gtk_adjustment_new(args->xrange_to/pow10(args->xyexponent), -10000, 10000, 1, 10, 0); spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.xrange_to), 1, 2); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE); gtk_table_attach(GTK_TABLE(table), spin, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); row++; label = gtk_label_new_with_mnemonic(_("_Y from:")); 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.yrange_from = gtk_adjustment_new(args->yrange_from/pow10(args->xyexponent), -10000, 10000, 1, 10, 0); spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.yrange_from), 1, 2); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE); gtk_table_attach(GTK_TABLE(table), spin, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); row++; label = gtk_label_new_with_mnemonic(_("_Y to:")); 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.yrange_to = gtk_adjustment_new(args->yrange_to/pow10(args->xyexponent), -10000, 10000, 1, 10, 0); spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.yrange_to), 1, 2); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE); gtk_table_attach(GTK_TABLE(table), spin, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); row++; label = gtk_label_new_with_mnemonic(_("_Z from:")); 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.zrange_from = gtk_adjustment_new(args->zrange_from/pow10(args->zexponent), -10000, 10000, 1, 10, 0); spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.zrange_from), 1, 2); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE); gtk_table_attach(GTK_TABLE(table), spin, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); unit = gwy_data_field_get_si_unit_z(dfield); controls.zexponent = gwy_combo_box_metric_unit_new(G_CALLBACK(zexponent_changed_cb), &controls, -15, 6, unit, args->zexponent); gtk_table_attach(GTK_TABLE(table), controls.zexponent, 2, 3, row, row+2, GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0, 0); controls.zunits = gtk_button_new_with_label(gwy_sgettext("verb|Change")); g_object_set_data(G_OBJECT(controls.zunits), "id", (gpointer)"z"); gtk_table_attach(GTK_TABLE(table), controls.zunits, 3, 4, row, row+2, GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0, 0); row++; label = gtk_label_new_with_mnemonic(_("_Z to:")); 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.zrange_to = gtk_adjustment_new(args->zrange_to/pow10(args->zexponent), -10000, 10000, 1, 10, 0); spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.zrange_to), 1, 2); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE); gtk_table_attach(GTK_TABLE(table), spin, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); row++; label = gtk_label_new_with_mnemonic(_("_X uncertainty:")); 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.xunc = gtk_adjustment_new(args->xunc/pow10(args->xyuexponent), -10000, 10000, 1, 10, 0); spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.xunc), 1, 2); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE); gtk_table_attach(GTK_TABLE(table), spin, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); unit = gwy_data_field_get_si_unit_xy(dfield); controls.xyuexponent = gwy_combo_box_metric_unit_new(G_CALLBACK(xyuexponent_changed_cb), &controls, -15, 6, unit, args->xyuexponent); gtk_table_attach(GTK_TABLE(table), controls.xyuexponent, 2, 3, row, row+2, GTK_EXPAND | GTK_FILL , 0, 0, 0); row++; label = gtk_label_new_with_mnemonic(_("_Y uncertainty:")); 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.yunc = gtk_adjustment_new(args->yunc/pow10(args->xyuexponent), -10000, 10000, 1, 10, 0); spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.yunc), 1, 2); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE); gtk_table_attach(GTK_TABLE(table), spin, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); row++; label = gtk_label_new_with_mnemonic(_("_Z uncertainty:")); 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.zunc = gtk_adjustment_new(args->zunc/pow10(args->zuexponent), -10000, 10000, 1, 10, 0); spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.zunc), 1, 2); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE); gtk_table_attach(GTK_TABLE(table), spin, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); unit = gwy_data_field_get_si_unit_z(dfield); controls.zuexponent = gwy_combo_box_metric_unit_new(G_CALLBACK(zuexponent_changed_cb), &controls, -15, 6, unit, args->zuexponent); gtk_table_attach(GTK_TABLE(table), controls.zuexponent, 2, 3, row, row+1, GTK_EXPAND | GTK_FILL , 0, 0, 0); row++; label = gtk_label_new_with_mnemonic(_("_X correction factor:")); 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.xmult = gtk_adjustment_new(args->xmult, 0, 1000, 1, 10, 0); spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.xmult), 1, 2); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE); gtk_table_attach(GTK_TABLE(table), spin, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); row++; label = gtk_label_new_with_mnemonic(_("_Y correction factor:")); 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.ymult = gtk_adjustment_new(args->ymult, 0, 1000, 1, 10, 0); spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.ymult), 1, 2); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE); gtk_table_attach(GTK_TABLE(table), spin, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); row++; label = gtk_label_new_with_mnemonic(_("_Z correction factor:")); 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.zmult = gtk_adjustment_new(args->zmult, 0, 1000, 1, 10, 0); spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.zmult), 1, 2); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(spin), TRUE); gtk_table_attach(GTK_TABLE(table), spin, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); row++; label = gtk_label_new_with_mnemonic(_("Calibration name:")); 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.name = GTK_ENTRY(gtk_entry_new()); gtk_entry_set_text(controls.name, args->name); gtk_table_attach(GTK_TABLE(table), GTK_WIDGET(controls.name), 1, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); g_signal_connect(controls.xrange_from, "value-changed", G_CALLBACK(xfrom_changed_cb), &controls); g_signal_connect(controls.xrange_to, "value-changed", G_CALLBACK(xto_changed_cb), &controls); g_signal_connect(controls.yrange_from, "value-changed", G_CALLBACK(yfrom_changed_cb), &controls); g_signal_connect(controls.yrange_to, "value-changed", G_CALLBACK(yto_changed_cb), &controls); g_signal_connect(controls.zrange_from, "value-changed", G_CALLBACK(zfrom_changed_cb), &controls); g_signal_connect(controls.zrange_to, "value-changed", G_CALLBACK(zto_changed_cb), &controls); g_signal_connect(controls.xunc, "value-changed", G_CALLBACK(xunc_changed_cb), &controls); g_signal_connect(controls.yunc, "value-changed", G_CALLBACK(yunc_changed_cb), &controls); g_signal_connect(controls.zunc, "value-changed", G_CALLBACK(zunc_changed_cb), &controls); g_signal_connect(controls.xmult, "value-changed", G_CALLBACK(xmult_changed_cb), &controls); g_signal_connect(controls.ymult, "value-changed", G_CALLBACK(ymult_changed_cb), &controls); g_signal_connect(controls.zmult, "value-changed", G_CALLBACK(zmult_changed_cb), &controls); g_signal_connect(controls.xyunits, "clicked", G_CALLBACK(units_change_cb), &controls); g_signal_connect(controls.zunits, "clicked", G_CALLBACK(units_change_cb), &controls); controls.in_update = 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: gtk_widget_destroy(dialog); case GTK_RESPONSE_NONE: return FALSE; break; case GTK_RESPONSE_OK: /*check whether this resource already exists*/ args->name = g_strdup(gtk_entry_get_text(controls.name)); if (gwy_inventory_get_item(gwy_calibrations(), args->name)) response = ask_for_overwrite(GTK_WINDOW(dialog), args); else args->duplicate = DUPLICATE_NONE; break; case RESPONSE_RESET: *args = cnew_defaults; cnew_dialog_update(&controls, args); break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); gtk_widget_destroy(dialog); return TRUE; }
static gboolean level_grains_dialog(LevelGrainsArgs *args) { GtkWidget *dialog, *table, *label; LevelGrainsControls controls; gint response, row; controls.args = args; dialog = gtk_dialog_new_with_buttons(_("Level Grains"), 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(2 + G_N_ELEMENTS(level_grains_bases), 1, 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; label = gtk_label_new(_("Quantity to level:")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0); row++; controls.base = construct_bases_radio(args->base, G_CALLBACK(base_changed), &controls); row = gwy_radio_buttons_attach_to_table(controls.base, GTK_TABLE(table), 1, row); gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8); controls.do_extract = gtk_check_button_new_with_mnemonic(_("E_xtract background")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.do_extract), args->do_extract); gtk_table_attach(GTK_TABLE(table), controls.do_extract, 0, 1, row, row+1, GTK_FILL, 0, 0, 0); g_signal_connect_swapped(controls.do_extract, "toggled", G_CALLBACK(do_extract_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; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); 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 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 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 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 void gedge_dialog(GEdgeArgs *args, GwyContainer *data, GwyDataField *dfield, gint id, GQuark mquark) { GtkWidget *dialog, *table, *hbox; GEdgeControls controls; GwyPixmapLayer *layer; gint row; gint response; gboolean temp; controls.in_init = TRUE; controls.args = args; dialog = gtk_dialog_new_with_buttons(_("Mark Grains by Edge Detection"), NULL, 0, NULL); gtk_dialog_add_action_widget(GTK_DIALOG(dialog), gwy_stock_like_button_new(_("_Update"), GTK_STOCK_EXECUTE), RESPONSE_PREVIEW); gtk_dialog_add_button(GTK_DIALOG(dialog), _("_Reset"), RESPONSE_RESET); gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_OK, GTK_RESPONSE_OK); 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; 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", dfield); gwy_app_sync_data_items(data, controls.mydata, id, 0, FALSE, GWY_DATA_ITEM_PALETTE, GWY_DATA_ITEM_MASK_COLOR, GWY_DATA_ITEM_RANGE, GWY_DATA_ITEM_REAL_SQUARE, 0); controls.view = gwy_data_view_new(controls.mydata); layer = gwy_layer_basic_new(); g_object_set(layer, "data-key", "/0/data", "gradient-key", "/0/base/palette", "range-type-key", "/0/base/range-type", "min-max-key", "/0/base", NULL); gwy_data_view_set_data_prefix(GWY_DATA_VIEW(controls.view), "/0/data"); gwy_data_view_set_base_layer(GWY_DATA_VIEW(controls.view), layer); gwy_set_data_preview_size(GWY_DATA_VIEW(controls.view), PREVIEW_SIZE); gtk_box_pack_start(GTK_BOX(hbox), controls.view, FALSE, FALSE, 4); 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(hbox), table, TRUE, TRUE, 4); row = 0; gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Threshold")), 0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); row++; table_attach_threshold(table, &row, _("_Laplacian:"), &controls.threshold_laplasian, args->threshold_laplasian, &controls); gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8); gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Options")), 0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); 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); row++; controls.update = gtk_check_button_new_with_mnemonic(_("I_nstant updates")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.update), args->update); gtk_table_attach(GTK_TABLE(table), controls.update, 0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); g_signal_connect_swapped(controls.update, "toggled", G_CALLBACK(update_change_cb), &controls); gedge_invalidate(&controls); /* finished initializing, allow instant updates */ controls.in_init = FALSE; /* show initial preview if instant updates are on */ if (args->update) { gtk_dialog_set_response_sensitive(GTK_DIALOG(controls.dialog), RESPONSE_PREVIEW, FALSE); 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: gedge_dialog_update_values(&controls, args); gtk_widget_destroy(dialog); case GTK_RESPONSE_NONE: g_object_unref(controls.mydata); gedge_save_args(gwy_app_settings_get(), args); return; break; case GTK_RESPONSE_OK: break; case RESPONSE_RESET: temp = args->update; *args = gedge_defaults; args->update = temp; gedge_dialog_update_controls(&controls, args); controls.in_init = TRUE; preview(&controls, args); controls.in_init = FALSE; break; case RESPONSE_PREVIEW: gedge_dialog_update_values(&controls, args); preview(&controls, args); break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); gedge_dialog_update_values(&controls, args); gwy_app_sync_data_items(controls.mydata, data, 0, id, FALSE, GWY_DATA_ITEM_MASK_COLOR, 0); gtk_widget_destroy(dialog); gedge_save_args(gwy_app_settings_get(), args); gwy_app_channel_log_add_proc(data, id, id); g_object_unref(controls.mydata); run_noninteractive(args, data, dfield, mquark); }
static void grain_stat(GwyContainer *data, GwyRunType run) { GtkWidget *dialog, *table, *hbox, *button; GwyDataField *dfield, *mfield; GwySIUnit *siunit, *siunit2; GwySIValueFormat *vf, *vf2; gint xres, yres, ngrains; gdouble total_area, area, size, vol_0, vol_min, vol_laplace, bound_len, v; gdouble *values = NULL; gint *grains; GString *str, *str2; GPtrArray *report; const guchar *title; gchar *key, *value; gint row, id; guint i, maxlen; g_return_if_fail(run & STAT_RUN_MODES); gwy_app_data_browser_get_current(GWY_APP_DATA_FIELD, &dfield, GWY_APP_MASK_FIELD, &mfield, GWY_APP_DATA_FIELD_ID, &id, 0); g_return_if_fail(dfield); g_return_if_fail(mfield); report = g_ptr_array_sized_new(20); if (gwy_container_gis_string_by_name(data, "/filename", &title)) { g_ptr_array_add(report, _("File:")); g_ptr_array_add(report, g_strdup(title)); } key = g_strdup_printf("/%d/data/title", id); if (gwy_container_gis_string_by_name(data, key, &title)) { g_ptr_array_add(report, _("Data channel:")); g_ptr_array_add(report, g_strdup(title)); } g_free(key); /* Make empty line in the report */ g_ptr_array_add(report, NULL); g_ptr_array_add(report, NULL); xres = gwy_data_field_get_xres(mfield); yres = gwy_data_field_get_yres(mfield); total_area = gwy_data_field_get_xreal(dfield) *gwy_data_field_get_yreal(dfield); grains = g_new0(gint, xres*yres); ngrains = gwy_data_field_number_grains(mfield, grains); area = grains_get_total_value(dfield, ngrains, grains, &values, GWY_GRAIN_VALUE_PROJECTED_AREA); size = grains_get_total_value(dfield, ngrains, grains, &values, GWY_GRAIN_VALUE_EQUIV_SQUARE_SIDE); vol_0 = grains_get_total_value(dfield, ngrains, grains, &values, GWY_GRAIN_VALUE_VOLUME_0); vol_min = grains_get_total_value(dfield, ngrains, grains, &values, GWY_GRAIN_VALUE_VOLUME_MIN); vol_laplace = grains_get_total_value(dfield, ngrains, grains, &values, GWY_GRAIN_VALUE_VOLUME_LAPLACE); bound_len = grains_get_total_value(dfield, ngrains, grains, &values, GWY_GRAIN_VALUE_FLAT_BOUNDARY_LENGTH); g_free(values); g_free(grains); dialog = gtk_dialog_new_with_buttons(_("Grain Statistics"), NULL, 0, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT); table = gtk_table_new(10, 2, FALSE); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), table); gtk_container_set_border_width(GTK_CONTAINER(table), 4); row = 0; str = g_string_new(NULL); str2 = g_string_new(NULL); g_string_printf(str, "%d", ngrains); add_report_row(GTK_TABLE(table), &row, _("Number of grains:"), str->str, str->str, report); siunit = gwy_data_field_get_si_unit_xy(dfield); siunit2 = gwy_si_unit_power(siunit, 2, NULL); v = area; vf = gwy_si_unit_get_format_with_digits(siunit2, GWY_SI_UNIT_FORMAT_VFMARKUP, v, 3, NULL); vf2 = gwy_si_unit_get_format_with_digits(siunit2, GWY_SI_UNIT_FORMAT_PLAIN, v, 3, NULL); g_string_printf(str, "%.*f %s", vf->precision, v/vf->magnitude, vf->units); g_string_printf(str2, "%.*f %s", vf2->precision, v/vf2->magnitude, vf2->units); add_report_row(GTK_TABLE(table), &row, _("Total projected area (abs.):"), str->str, str2->str, report); g_string_printf(str, "%.2f %%", 100.0*area/total_area); add_report_row(GTK_TABLE(table), &row, _("Total projected area (rel.):"), str->str, str->str, report); v = area/ngrains; gwy_si_unit_get_format_with_digits(siunit2, GWY_SI_UNIT_FORMAT_VFMARKUP, v, 3, vf); gwy_si_unit_get_format_with_digits(siunit2, GWY_SI_UNIT_FORMAT_PLAIN, v, 3, vf2); g_string_printf(str, "%.*f %s", vf->precision, v/vf->magnitude, vf->units); g_string_printf(str2, "%.*f %s", vf2->precision, v/vf2->magnitude, vf2->units); add_report_row(GTK_TABLE(table), &row, _("Mean grain area:"), str->str, str2->str, report); v = size/ngrains; gwy_si_unit_get_format_with_digits(siunit, GWY_SI_UNIT_FORMAT_VFMARKUP, v, 3, vf); gwy_si_unit_get_format_with_digits(siunit, GWY_SI_UNIT_FORMAT_PLAIN, v, 3, vf2); g_string_printf(str, "%.*f %s", vf->precision, v/vf->magnitude, vf->units); g_string_printf(str2, "%.*f %s", vf2->precision, v/vf2->magnitude, vf2->units); add_report_row(GTK_TABLE(table), &row, _("Mean grain size:"), str->str, str2->str, report); siunit = gwy_data_field_get_si_unit_z(dfield); gwy_si_unit_multiply(siunit2, siunit, siunit2); v = vol_0; gwy_si_unit_get_format_with_digits(siunit2, GWY_SI_UNIT_FORMAT_VFMARKUP, v, 3, vf); gwy_si_unit_get_format_with_digits(siunit2, GWY_SI_UNIT_FORMAT_PLAIN, v, 3, vf2); g_string_printf(str, "%.*f %s", vf->precision, v/vf->magnitude, vf->units); g_string_printf(str2, "%.*f %s", vf2->precision, v/vf2->magnitude, vf2->units); add_report_row(GTK_TABLE(table), &row, _("Total grain volume (zero):"), str->str, str2->str, report); v = vol_min; gwy_si_unit_get_format_with_digits(siunit2, GWY_SI_UNIT_FORMAT_VFMARKUP, v, 3, vf); gwy_si_unit_get_format_with_digits(siunit2, GWY_SI_UNIT_FORMAT_PLAIN, v, 3, vf2); g_string_printf(str, "%.*f %s", vf->precision, v/vf->magnitude, vf->units); g_string_printf(str2, "%.*f %s", vf2->precision, v/vf2->magnitude, vf2->units); add_report_row(GTK_TABLE(table), &row, _("Total grain volume (minimum):"), str->str, str2->str, report); v = vol_laplace; gwy_si_unit_get_format_with_digits(siunit2, GWY_SI_UNIT_FORMAT_VFMARKUP, v, 3, vf); gwy_si_unit_get_format_with_digits(siunit2, GWY_SI_UNIT_FORMAT_PLAIN, v, 3, vf2); g_string_printf(str, "%.*f %s", vf->precision, v/vf->magnitude, vf->units); g_string_printf(str2, "%.*f %s", vf2->precision, v/vf2->magnitude, vf2->units); add_report_row(GTK_TABLE(table), &row, _("Total grain volume (laplacian):"), str->str, str2->str, report); v = bound_len; gwy_si_unit_get_format_with_digits(siunit, GWY_SI_UNIT_FORMAT_VFMARKUP, v, 3, vf); gwy_si_unit_get_format_with_digits(siunit, GWY_SI_UNIT_FORMAT_PLAIN, v, 3, vf2); g_string_printf(str, "%.*f %s", vf->precision, v/vf->magnitude, vf->units); g_string_printf(str2, "%.*f %s", vf2->precision, v/vf2->magnitude, vf2->units); add_report_row(GTK_TABLE(table), &row, _("Total projected boundary length:"), str->str, str2->str, report); gwy_si_unit_value_format_free(vf2); gwy_si_unit_value_format_free(vf); g_object_unref(siunit2); maxlen = 0; for (i = 0; i < report->len/2; i++) { key = (gchar*)g_ptr_array_index(report, 2*i); if (key) maxlen = MAX(strlen(key), maxlen); } g_string_truncate(str, 0); g_string_append(str, _("Grain Statistics")); g_string_append(str, "\n\n"); for (i = 0; i < report->len/2; i++) { key = (gchar*)g_ptr_array_index(report, 2*i); if (key) { value = (gchar*)g_ptr_array_index(report, 2*i + 1); g_string_append_printf(str, "%-*s %s\n", maxlen+1, key, value); g_free(value); } else g_string_append_c(str, '\n'); } g_ptr_array_free(report, TRUE); g_object_set_data(G_OBJECT(dialog), "report", str->str); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 0); button = grain_stats_add_aux_button(hbox, GTK_STOCK_SAVE, _("Save table to a file")); g_signal_connect_swapped(button, "clicked", G_CALLBACK(grain_stat_save), dialog); button = grain_stats_add_aux_button(hbox, GTK_STOCK_COPY, _("Copy table to clipboard")); g_signal_connect_swapped(button, "clicked", G_CALLBACK(grain_stat_copy), dialog); gtk_widget_show_all(dialog); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); g_string_free(str2, TRUE); g_string_free(str, 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 curvature_dialog(CurvatureArgs *args, GwyContainer *data, GwyDataField *dfield, GwyDataField *mfield, gint id) { enum { RESPONSE_RESET = 1 }; GtkWidget *dialog, *table, *label, *hbox, *vbox, *treeview, *button, *hbox2; GwyDataChooser *chooser; GtkTreeSelection *selection; GtkTreeViewColumn *column; GtkCellRenderer *renderer; GwyPixmapLayer *player; GwyVectorLayer *vlayer; CurvatureControls controls; gint response; gint row; controls.args = args; controls.unit = gwy_data_field_get_si_unit_xy(dfield); gwy_clear(controls.params, PARAM_NPARAMS); controls.gmodel = gwy_graph_model_new(); init_graph_model_units(controls.gmodel, dfield); dialog = gtk_dialog_new_with_buttons(_("Curvature"), 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); controls.dialog = dialog; 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, 0); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); controls.data = gwy_container_new(); gwy_container_set_object_by_name(controls.data, "/0/data", dfield); if (mfield) gwy_container_set_object_by_name(controls.data, "/0/mask", mfield); gwy_app_sync_data_items(data, controls.data, id, 0, FALSE, GWY_DATA_ITEM_PALETTE, GWY_DATA_ITEM_MASK_COLOR, GWY_DATA_ITEM_RANGE, GWY_DATA_ITEM_REAL_SQUARE, 0); controls.view = gwy_data_view_new(controls.data); player = gwy_layer_basic_new(); g_object_set(player, "data-key", "/0/data", "gradient-key", "/0/base/palette", "range-type-key", "/0/base/range-type", "min-max-key", "/0/base", NULL); gwy_data_view_set_data_prefix(GWY_DATA_VIEW(controls.view), "/0/data"); gwy_data_view_set_base_layer(GWY_DATA_VIEW(controls.view), player); gwy_set_data_preview_size(GWY_DATA_VIEW(controls.view), PREVIEW_SIZE); vlayer = g_object_new(g_type_from_name("GwyLayerLine"), NULL); gwy_vector_layer_set_selection_key(vlayer, "/0/select/line"); gwy_vector_layer_set_editable(vlayer, FALSE); gwy_data_view_set_top_layer(GWY_DATA_VIEW(controls.view), GWY_VECTOR_LAYER(vlayer)); controls.selection = gwy_vector_layer_ensure_selection(vlayer); g_object_set(controls.selection, "max-objects", 2, NULL); gtk_box_pack_start(GTK_BOX(vbox), controls.view, FALSE, FALSE, 4); table = gtk_table_new(5 + (mfield ? 4 : 0), 4, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 2); gtk_table_set_col_spacings(GTK_TABLE(table), 6); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); row = 0; label = gwy_label_new_header(_("Output Type")); 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++; controls.set_selection = gtk_check_button_new_with_mnemonic(_("_Set selection")); gtk_table_attach(GTK_TABLE(table), controls.set_selection, 0, 4, row, row+1, GTK_FILL, 0, 0, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.set_selection), args->set_selection); g_signal_connect(controls.set_selection, "toggled", G_CALLBACK(curvature_set_selection_changed), &controls); row++; controls.plot_graph = gtk_check_button_new_with_mnemonic(_("_Plot graph")); gtk_table_attach(GTK_TABLE(table), controls.plot_graph, 0, 4, row, row+1, GTK_FILL, 0, 0, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.plot_graph), args->plot_graph); g_signal_connect(controls.plot_graph, "toggled", G_CALLBACK(curvature_plot_graph_changed), &controls); row++; gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8); controls.target_hbox = hbox2 = gtk_hbox_new(FALSE, 6); gtk_widget_set_sensitive(controls.target_hbox, args->plot_graph); 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++; if (mfield) { gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8); 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(curvature_masking_changed), &controls, args->masking); row = gwy_radio_buttons_attach_to_table(controls.masking_group, GTK_TABLE(table), 3, row); gtk_table_set_row_spacing(GTK_TABLE(table), row, 8); } else controls.masking_group = NULL; controls.warning = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(controls.warning), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), controls.warning, 0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); controls.graph = gwy_graph_new(controls.gmodel); gtk_widget_set_size_request(controls.graph, 320, 260); g_object_unref(controls.gmodel); gtk_box_pack_start(GTK_BOX(vbox), controls.graph, TRUE, TRUE, 4); controls.paramstore = gwy_null_store_new(PARAM_NPARAMS); treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(controls.paramstore)); g_object_unref(controls.paramstore); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); gtk_box_pack_start(GTK_BOX(vbox), treeview, FALSE, FALSE, 4); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); gtk_tree_selection_set_mode(selection, GTK_SELECTION_NONE); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Parameter"), renderer, NULL); gtk_tree_view_column_set_cell_data_func(column, renderer, render_name, param_names, NULL); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Symbol"), renderer, NULL); gtk_tree_view_column_set_cell_data_func(column, renderer, render_symbol, param_symbols, NULL); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); renderer = gtk_cell_renderer_text_new(); g_object_set(renderer, "xalign", 1.0, NULL); column = gtk_tree_view_column_new_with_attributes(_("Value"), renderer, NULL); gtk_tree_view_column_set_cell_data_func(column, renderer, render_value, &controls, NULL); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); button = curvature_add_aux_button(hbox, GTK_STOCK_SAVE, _("Save table to a file")); g_signal_connect_swapped(button, "clicked", G_CALLBACK(curvature_save), &controls); button = curvature_add_aux_button(hbox, GTK_STOCK_COPY, _("Copy table to clipboard")); g_signal_connect_swapped(button, "clicked", G_CALLBACK(curvature_copy), &controls); curvature_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: gtk_widget_destroy(dialog); case GTK_RESPONSE_NONE: return FALSE; break; case GTK_RESPONSE_OK: break; case RESPONSE_RESET: *args = curvature_defaults; curvature_dialog_update(&controls, args); break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); gtk_widget_destroy(dialog); return TRUE; }
static gboolean immerse_dialog(ImmerseArgs *args) { ImmerseControls controls; GwyContainer *data; GtkDialog *dialog; GtkWidget *table, *chooser, *hbox, *alignment, *label, *button, *vbox; GtkTooltips *tooltips; GdkDisplay *display; GwyDataField *dfield; gint response, row, id; gboolean ok; memset(&controls, 0, sizeof(ImmerseControls)); controls.args = args; tooltips = gwy_app_get_tooltips(); controls.dialog = gtk_dialog_new_with_buttons(_("Immerse Detail"), NULL, 0, NULL); dialog = GTK_DIALOG(controls.dialog); button = gtk_dialog_add_button(dialog, _("_Locate"), RESPONSE_ESTIMATE); gtk_tooltips_set_tip(tooltips, button, _("Locate detail by full image correlation search"), NULL); button = gtk_dialog_add_button(dialog, _("_Improve"), RESPONSE_REFINE); gtk_tooltips_set_tip(tooltips, button, _("Improve detail position by " "correlation search in neighborhood"), NULL); gtk_dialog_add_button(dialog, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); gtk_dialog_add_button(dialog, GTK_STOCK_OK, GTK_RESPONSE_OK); gtk_dialog_set_default_response(dialog, GTK_RESPONSE_OK); gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT); hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(dialog->vbox), hbox, FALSE, FALSE, 4); /* Preview */ data = gwy_app_data_browser_get(args->image.datano); id = args->image.id; dfield = gwy_container_get_object(data, gwy_app_get_data_key_for_id(id)); controls.vf = gwy_data_field_get_value_format_xy(dfield, GWY_SI_UNIT_FORMAT_VFMARKUP, NULL); 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_MASK_COLOR, GWY_DATA_ITEM_RANGE, 0); gwy_container_set_boolean_by_name(controls.mydata, "/0/data/realsquare", TRUE); controls.view = create_preview(controls.mydata, 0, PREVIEW_SIZE, FALSE); alignment = GTK_WIDGET(gtk_alignment_new(0.5, 0, 0, 0)); gtk_container_add(GTK_CONTAINER(alignment), controls.view); gtk_box_pack_start(GTK_BOX(hbox), alignment, FALSE, FALSE, 4); g_signal_connect_after(controls.view, "expose-event", G_CALLBACK(immerse_view_expose), &controls); g_signal_connect(controls.view, "button-press-event", G_CALLBACK(immerse_view_button_press), &controls); g_signal_connect(controls.view, "button-release-event", G_CALLBACK(immerse_view_button_release), &controls); g_signal_connect(controls.view, "motion-notify-event", G_CALLBACK(immerse_view_motion_notify), &controls); vbox = gtk_vbox_new(FALSE, 8); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 4); /* Parameters table */ table = gtk_table_new(8, 4, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 2); gtk_table_set_col_spacings(GTK_TABLE(table), 6); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 4); row = 0; /* Detail to immerse */ chooser = gwy_data_chooser_new_channels(); gwy_data_chooser_set_active_id(GWY_DATA_CHOOSER(chooser), &args->detail); gwy_data_chooser_set_filter(GWY_DATA_CHOOSER(chooser), immerse_data_filter, &args->image, NULL); gwy_data_chooser_get_active_id(GWY_DATA_CHOOSER(chooser), &args->detail); g_signal_connect(chooser, "changed", G_CALLBACK(immerse_detail_cb), &controls); gwy_table_attach_hscale(table, row, _("_Detail image:"), NULL, GTK_OBJECT(chooser), GWY_HSCALE_WIDGET_NO_EXPAND); row++; /* Detail position */ label = gtk_label_new(_("Position:")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0); controls.pos = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(controls.pos), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), controls.pos, 1, 3, row, row+1, GTK_FILL, 0, 0, 0); gtk_table_set_row_spacing(GTK_TABLE(table), row, 8); row++; /* Sampling */ label = gtk_label_new(_("Result Sampling")); 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); row++; controls.sampling = gwy_radio_buttons_createl(G_CALLBACK(immerse_sampling_changed), &controls, args->sampling, _("_Upsample large image"), GWY_IMMERSE_SAMPLING_UP, _("_Downsample detail"), GWY_IMMERSE_SAMPLING_DOWN, NULL); row = gwy_radio_buttons_attach_to_table(controls.sampling, GTK_TABLE(table), 4, row); gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8); /* Leveling */ label = gtk_label_new(_("Detail Leveling")); 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); row++; controls.leveling = gwy_radio_buttons_createl(G_CALLBACK(immerse_leveling_changed), &controls, args->leveling, gwy_sgettext("levelling|_None"), GWY_IMMERSE_LEVEL_NONE, _("_Mean value"), GWY_IMMERSE_LEVEL_MEAN, NULL); row = gwy_radio_buttons_attach_to_table(controls.leveling, GTK_TABLE(table), 4, row); gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8); /* Draw frame */ controls.draw_frame = gtk_check_button_new_with_mnemonic(_("Show _frame")); gtk_table_attach(GTK_TABLE(table), controls.draw_frame, 0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.draw_frame), args->draw_frame); g_signal_connect(controls.draw_frame, "toggled", G_CALLBACK(immerse_frame_toggled), &controls); gtk_widget_show_all(controls.dialog); display = gtk_widget_get_display(controls.dialog); controls.near_cursor = gdk_cursor_new_for_display(display, GDK_FLEUR); controls.move_cursor = gdk_cursor_new_for_display(display, GDK_CROSS); immerse_detail_cb(GWY_DATA_CHOOSER(chooser), &controls); ok = FALSE; do { response = gtk_dialog_run(dialog); switch (response) { case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: case GTK_RESPONSE_NONE: immerse_controls_destroy(&controls); immerse_save_args(gwy_app_settings_get(), args); return FALSE; break; case RESPONSE_ESTIMATE: case RESPONSE_REFINE: immerse_search(&controls, response); break; case GTK_RESPONSE_OK: ok = TRUE; break; default: g_assert_not_reached(); break; } } while (!ok); immerse_controls_destroy(&controls); immerse_save_args(gwy_app_settings_get(), args); return TRUE; }
static gboolean grain_cross_dialog(GrainCrossArgs *args, GwyDataField *dfield) { GrainCrossControls controls; GtkWidget *dialog, *hbox2, *label; GwyDataChooser *chooser; GtkTable *table; GwyGraphModel *gmodel; gint response; controls.args = args; controls.dfield = dfield; dialog = gtk_dialog_new_with_buttons(_("Grain Correlations"), NULL, 0, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); controls.dialog = GTK_DIALOG(dialog); gtk_dialog_set_default_response(controls.dialog, GTK_RESPONSE_OK); gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT); gtk_window_set_default_size(GTK_WINDOW(dialog), 720, 480); table = GTK_TABLE(gtk_table_new(3, 3, 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(controls.dialog->vbox), GTK_WIDGET(table), TRUE, TRUE, 0); gmodel = create_corr_graph(args, dfield); controls.graph = gwy_graph_new(gmodel); gtk_widget_set_size_request(controls.graph, 320, -1); g_object_unref(gmodel); gtk_table_attach(GTK_TABLE(table), controls.graph, 0, 1, 0, 3, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); controls.abscissa = attach_axis_list(table, _("_Abscissa"), 1, args->abscissa, args->abscissa_expanded, &controls); controls.ordinate = attach_axis_list(table, _("O_rdinate"), 2, args->ordinate, args->ordinate_expanded, &controls); hbox2 = gtk_hbox_new(FALSE, 6); gtk_table_attach(GTK_TABLE(table), hbox2, 1, 3, 2, 3, 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, TRUE, TRUE, 0); g_signal_connect_swapped(controls.target_graph, "changed", G_CALLBACK(target_graph_changed), &controls); axis_quantity_changed(&controls); gtk_widget_show_all(dialog); do { response = gtk_dialog_run(controls.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; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); gtk_widget_destroy(dialog); return TRUE; }
static void presentation_attach(GwyContainer *data, GwyRunType run) { GtkWidget *dialog, *table, *label, *chooser; GwyAppDataId target; gint row, response; g_return_if_fail(run & PRESENTATION_ATTACH_RUN_MODES); gwy_app_data_browser_get_current(GWY_APP_CONTAINER_ID, &target.datano, GWY_APP_DATA_FIELD_ID, &target.id, 0); gwy_app_data_id_verify_channel(&attach_source_id); dialog = gtk_dialog_new_with_buttons(_("Attach Presentation"), 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(1, 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(GTK_DIALOG(dialog)->vbox), table, TRUE, TRUE, 4); row = 0; label = gtk_label_new_with_mnemonic(_("_Data to attach:")); 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); chooser = gwy_data_chooser_new_channels(); gwy_data_chooser_set_filter(GWY_DATA_CHOOSER(chooser), &presentation_attach_filter, &target, NULL); gwy_data_chooser_set_active_id(GWY_DATA_CHOOSER(chooser), &attach_source_id); gtk_table_attach(GTK_TABLE(table), chooser, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); gtk_label_set_mnemonic_widget(GTK_LABEL(label), chooser); gtk_table_set_row_spacing(GTK_TABLE(table), row, 8); 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; break; case GTK_RESPONSE_OK: gwy_data_chooser_get_active_id(GWY_DATA_CHOOSER(chooser), &attach_source_id); /* The data must be always compatible at least with itself */ g_assert(attach_source_id.datano); presentation_attach_do(&attach_source_id, &target); gwy_app_channel_log_add_proc(data, target.id, target.id); break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); gtk_widget_destroy(dialog); }
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 gfilter_dialog(GFilterArgs *args, GwyContainer *data, GwyDataField *dfield, GwyDataField *mfield, gint id, GQuark mquark) { GtkWidget *dialog, *table, *vbox, *hbox, *scwin, *hbox2, *label; GtkTreeView *treeview; GtkTreeSelection *selection; GFilterControls controls; gint response, row, i; GwySIUnit *siunit; GwyPixmapLayer *layer; controls.args = args; controls.mask = mfield; controls.in_init = TRUE; controls.computed = FALSE; siunit = gwy_si_unit_new(NULL); for (i = 0; i < NQUANTITIES; i++) { controls.vf[i] = gwy_si_unit_get_format_with_digits(siunit, GWY_SI_UNIT_FORMAT_VFMARKUP, 1.0, 4, NULL); } g_object_unref(siunit); dialog = gtk_dialog_new_with_buttons(_("Filter Grains"), NULL, 0, NULL); gtk_dialog_add_action_widget(GTK_DIALOG(dialog), gwy_stock_like_button_new(_("_Update"), GTK_STOCK_EXECUTE), RESPONSE_PREVIEW); gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_OK, GTK_RESPONSE_OK); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), RESPONSE_PREVIEW, !args->update); gwy_help_add_to_proc_dialog(GTK_DIALOG(dialog), GWY_HELP_DEFAULT); controls.dialog = dialog; hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, TRUE, TRUE, 4); vbox = gtk_vbox_new(FALSE, 4); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 4); controls.mydata = gwy_container_new(); gwy_container_set_object_by_name(controls.mydata, "/0/data", dfield); mfield = gwy_data_field_duplicate(mfield); gwy_container_set_object_by_name(controls.mydata, "/0/mask", mfield); g_object_unref(mfield); gwy_app_sync_data_items(data, controls.mydata, id, 0, FALSE, GWY_DATA_ITEM_PALETTE, GWY_DATA_ITEM_MASK_COLOR, GWY_DATA_ITEM_RANGE, GWY_DATA_ITEM_REAL_SQUARE, 0); controls.view = gwy_data_view_new(controls.mydata); layer = gwy_layer_basic_new(); g_object_set(layer, "data-key", "/0/data", "gradient-key", "/0/base/palette", "range-type-key", "/0/base/range-type", "min-max-key", "/0/base", NULL); gwy_data_view_set_data_prefix(GWY_DATA_VIEW(controls.view), "/0/data"); gwy_data_view_set_base_layer(GWY_DATA_VIEW(controls.view), layer); layer = gwy_layer_mask_new(); gwy_pixmap_layer_set_data_key(layer, "/0/mask"); gwy_layer_mask_set_color_key(GWY_LAYER_MASK(layer), "/0/mask"); gwy_data_view_set_alpha_layer(GWY_DATA_VIEW(controls.view), layer); gwy_set_data_preview_size(GWY_DATA_VIEW(controls.view), PREVIEW_SIZE); gtk_box_pack_start(GTK_BOX(vbox), controls.view, FALSE, FALSE, 0); controls.update = gtk_check_button_new_with_mnemonic(_("I_nstant updates")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.update), args->update); gtk_box_pack_start(GTK_BOX(vbox), controls.update, FALSE, FALSE, 0); g_signal_connect_swapped(controls.update, "toggled", G_CALLBACK(update_changed), &controls); hbox2 = gtk_hbox_new(FALSE, 6); gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0); label = gtk_label_new_with_mnemonic(_("_Mask color:")); gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); 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))); gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.color_button); gtk_box_pack_start(GTK_BOX(hbox2), controls.color_button, FALSE, FALSE, 0); g_signal_connect(controls.color_button, "clicked", G_CALLBACK(mask_color_changed), &controls); table = gtk_table_new(10, 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, 4); controls.table = table; row = 0; scwin = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_table_attach(GTK_TABLE(table), scwin, 0, 4, row, row+1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); controls.values = gwy_grain_value_tree_view_new(FALSE, "name", "symbol_markup", NULL); treeview = GTK_TREE_VIEW(controls.values); gtk_widget_set_size_request(scwin, -1, 120); gtk_tree_view_set_headers_visible(treeview, FALSE); selection = gtk_tree_view_get_selection(treeview); gtk_tree_selection_set_mode(selection, GTK_SELECTION_BROWSE); gwy_grain_value_tree_view_set_same_units(treeview, args->units_equal); gwy_grain_value_tree_view_set_expanded_groups(treeview, args->expanded); gtk_container_add(GTK_CONTAINER(scwin), controls.values); row++; hbox2 = gtk_hbox_new(FALSE, 0); for (i = 0; i < NQUANTITIES; i++) { gchar buf[2]; buf[0] = 'A' + i; buf[1] = '\0'; controls.set_as[i] = gtk_button_new_with_label(buf); gtk_box_pack_start(GTK_BOX(hbox2), controls.set_as[i], FALSE, FALSE, 0); g_object_set_data(G_OBJECT(controls.set_as[i]), "id", GUINT_TO_POINTER(i)); g_signal_connect_swapped(controls.set_as[i], "clicked", G_CALLBACK(set_as_clicked), &controls); } gwy_table_attach_hscale(table, row++, _("Set selected as:"), NULL, GTK_OBJECT(hbox2), GWY_HSCALE_WIDGET_NO_EXPAND); controls.logical_op = gwy_enum_combo_box_newl(G_CALLBACK(logical_op_changed), &controls, args->logical, "A", GRAIN_LOGICAL_A, "A ∧ B", GRAIN_LOGICAL_A_AND_B, "A ∨ B", GRAIN_LOGICAL_A_OR_B, "A ∧ B ∧ C", GRAIN_LOGICAL_A_AND_B_AND_C, "A ∨ B ∨ C", GRAIN_LOGICAL_A_OR_B_OR_C, "(A ∧ B) ∨ C", GRAIN_LOGICAL_A_AND_B_OR_C, "(A ∨ B) ∧ C", GRAIN_LOGICAL_A_OR_B_AND_C, NULL); gwy_table_attach_hscale(table, row++, _("Keep grains satisfying:"), NULL, GTK_OBJECT(controls.logical_op), GWY_HSCALE_WIDGET); for (i = 0; i < NQUANTITIES; i++) { gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8); controls.header[i] = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(controls.header[i]), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), controls.header[i], 0, 4, row, row+1, GTK_FILL, 0, 0, 0); row++; /* The values are set properly later. */ controls.lower_label[i] = gtk_label_new(_("Lower threshold:")); gtk_misc_set_alignment(GTK_MISC(controls.lower_label[i]), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), controls.lower_label[i], 0, 1, row, row+1, GTK_FILL, 0, 0, 0); controls.lower[i] = gtk_adjustment_new(0.0, 0.0, 0.0, 1.0, 10.0, 0.0); g_object_set_data(G_OBJECT(controls.lower[i]), "id", GUINT_TO_POINTER(i)); g_signal_connect_swapped(controls.lower[i], "value-changed", G_CALLBACK(threshold_changed), &controls); controls.lower_scale[i] = gtk_hscale_new(GTK_ADJUSTMENT(controls.lower[i])); gtk_scale_set_draw_value(GTK_SCALE(controls.lower_scale[i]), FALSE); gtk_widget_set_size_request(controls.lower_scale[i], GWY_HSCALE_WIDTH, -1); gtk_table_attach(GTK_TABLE(table), controls.lower_scale[i], 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); controls.lower_entry[i] = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(controls.lower_entry[i]), 8); gtk_table_attach(GTK_TABLE(table), controls.lower_entry[i], 2, 3, row, row+1, GTK_FILL, 0, 0, 0); gwy_widget_set_activate_on_unfocus(controls.lower_entry[i], TRUE); g_object_set_data(G_OBJECT(controls.lower_entry[i]), "id", GUINT_TO_POINTER(i)); g_signal_connect_swapped(controls.lower_entry[i], "activate", G_CALLBACK(threshold_activated), &controls); controls.lower_units[i] = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(controls.lower_units[i]), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), controls.lower_units[i], 3, 4, row, row+1, GTK_FILL, 0, 0, 0); row++; controls.upper_label[i] = gtk_label_new(_("Upper threshold:")); gtk_misc_set_alignment(GTK_MISC(controls.upper_label[i]), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), controls.upper_label[i], 0, 1, row, row+1, GTK_FILL, 0, 0, 0); controls.upper[i] = gtk_adjustment_new(0.0, 0.0, 0.0, 1.0, 10.0, 0.0); g_object_set_data(G_OBJECT(controls.upper[i]), "id", GUINT_TO_POINTER(i | IS_UPPER)); g_signal_connect_swapped(controls.upper[i], "value-changed", G_CALLBACK(threshold_changed), &controls); controls.upper_scale[i] = gtk_hscale_new(GTK_ADJUSTMENT(controls.upper[i])); gtk_scale_set_draw_value(GTK_SCALE(controls.upper_scale[i]), FALSE); gtk_widget_set_size_request(controls.upper_scale[i], GWY_HSCALE_WIDTH, -1); gtk_table_attach(GTK_TABLE(table), controls.upper_scale[i], 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); controls.upper_entry[i] = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(controls.upper_entry[i]), 8); gtk_table_attach(GTK_TABLE(table), controls.upper_entry[i], 2, 3, row, row+1, GTK_FILL, 0, 0, 0); gwy_widget_set_activate_on_unfocus(controls.upper_entry[i], TRUE); g_object_set_data(G_OBJECT(controls.upper_entry[i]), "id", GUINT_TO_POINTER(i | IS_UPPER)); g_signal_connect_swapped(controls.upper_entry[i], "activate", G_CALLBACK(threshold_activated), &controls); controls.upper_units[i] = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(controls.upper_units[i]), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), controls.upper_units[i], 3, 4, row, row+1, GTK_FILL, 0, 0, 0); row++; } for (i = 0; i < NQUANTITIES; i++) { GwyInventory *inventory; GwyGrainValue *gvalue; inventory = gwy_grain_values(); gvalue = gwy_inventory_get_item(inventory, args->ranges[i].quantity); set_up_quantity(&controls, gvalue, i); } logical_op_changed(GTK_COMBO_BOX(controls.logical_op), &controls); /* finished initializing, allow instant updates */ controls.in_init = FALSE; gfilter_invalidate(&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: args->expanded = gwy_grain_value_tree_view_get_expanded_groups (GTK_TREE_VIEW(controls.values)); for (i = 0; i < NQUANTITIES; i++) gwy_si_unit_value_format_free(controls.vf[i]); gtk_widget_destroy(dialog); case GTK_RESPONSE_NONE: g_object_unref(controls.mydata); gfilter_save_args(gwy_app_settings_get(), args); return; break; case GTK_RESPONSE_OK: break; case RESPONSE_PREVIEW: preview(&controls); break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); for (i = 0; i < NQUANTITIES; i++) gwy_si_unit_value_format_free(controls.vf[i]); args->expanded = gwy_grain_value_tree_view_get_expanded_groups (GTK_TREE_VIEW(controls.values)); gwy_app_sync_data_items(controls.mydata, data, 0, id, FALSE, GWY_DATA_ITEM_MASK_COLOR, 0); gtk_widget_destroy(dialog); gfilter_save_args(gwy_app_settings_get(), args); if (controls.computed) { mfield = gwy_container_get_object_by_name(controls.mydata, "/0/mask"); gwy_app_undo_qcheckpointv(data, 1, &mquark); gwy_container_set_object(data, mquark, mfield); g_object_unref(controls.mydata); } else { g_object_unref(controls.mydata); run_noninteractive(args, data, controls.mask, mquark); } gwy_app_channel_log_add_proc(data, id, id); }
static gboolean noise_synth_dialog(NoiseSynthArgs *args, GwyDimensionArgs *dimsargs, GwyContainer *data, GwyDataField *dfield_template, gint id) { GtkWidget *dialog, *table, *vbox, *hbox, *notebook, *label; NoiseSynthControls controls; GwyDataField *dfield; GwyPixmapLayer *layer; gboolean finished; gint response; gint row; gwy_clear(&controls, 1); controls.in_init = TRUE; controls.args = args; dialog = gtk_dialog_new_with_buttons(_("Random Noise"), 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); controls.dialog = dialog; hbox = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 4); vbox = gtk_vbox_new(FALSE, 4); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 4); controls.mydata = gwy_container_new(); dfield = gwy_data_field_new(PREVIEW_SIZE, PREVIEW_SIZE, dimsargs->measure*PREVIEW_SIZE, dimsargs->measure*PREVIEW_SIZE, TRUE); gwy_container_set_object_by_name(controls.mydata, "/0/data", dfield); controls.noise = gwy_data_field_new_alike(dfield, FALSE); if (dfield_template) { gwy_app_sync_data_items(data, controls.mydata, id, 0, FALSE, GWY_DATA_ITEM_PALETTE, 0); controls.surface = gwy_synth_surface_for_preview(dfield_template, PREVIEW_SIZE); controls.zscale = gwy_data_field_get_rms(dfield_template); } controls.view = gwy_data_view_new(controls.mydata); layer = gwy_layer_basic_new(); g_object_set(layer, "data-key", "/0/data", "gradient-key", "/0/base/palette", NULL); gwy_data_view_set_base_layer(GWY_DATA_VIEW(controls.view), layer); gtk_box_pack_start(GTK_BOX(vbox), controls.view, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), gwy_synth_instant_updates_new(&controls, &controls.update_now, &controls.update, &args->update), FALSE, FALSE, 0); g_signal_connect_swapped(controls.update_now, "clicked", G_CALLBACK(preview), &controls); gtk_box_pack_start(GTK_BOX(vbox), gwy_synth_random_seed_new(&controls, &controls.seed, &args->seed), FALSE, FALSE, 0); controls.randomize = gwy_synth_randomize_new(&args->randomize); gtk_box_pack_start(GTK_BOX(vbox), controls.randomize, FALSE, FALSE, 0); notebook = gtk_notebook_new(); gtk_box_pack_start(GTK_BOX(hbox), notebook, TRUE, TRUE, 4); g_signal_connect_swapped(notebook, "switch-page", G_CALLBACK(page_switched), &controls); controls.dims = gwy_dimensions_new(dimsargs, dfield_template); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), gwy_dimensions_get_widget(controls.dims), gtk_label_new(_("Dimensions"))); if (controls.dims->add) g_signal_connect_swapped(controls.dims->add, "toggled", G_CALLBACK(noise_synth_invalidate), &controls); table = gtk_table_new(6 + (dfield_template ? 1 : 0), 4, FALSE); controls.table = GTK_TABLE(table); gtk_table_set_row_spacings(controls.table, 2); gtk_table_set_col_spacings(controls.table, 6); gtk_container_set_border_width(GTK_CONTAINER(table), 4); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table, gtk_label_new(_("Generator"))); row = 0; controls.distribution = distribution_selector_new(&controls); gwy_table_attach_hscale(table, row, _("_Distribution:"), NULL, GTK_OBJECT(controls.distribution), GWY_HSCALE_WIDGET); row++; label = gtk_label_new(_("Direction:")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0); row++; controls.direction = gwy_radio_buttons_createl(G_CALLBACK(direction_type_changed), &controls, args->direction, _("S_ymmetrical"), NOISE_DIRECTION_BOTH, _("One-sided _positive"), NOISE_DIRECTION_UP, _("One-sided _negative"), NOISE_DIRECTION_DOWN, NULL); row = gwy_radio_buttons_attach_to_table(controls.direction, GTK_TABLE(table), 3, row); gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8); row = gwy_synth_attach_height(&controls, row, &controls.sigma, &args->sigma, _("_RMS:"), NULL, &controls.sigma_units); if (dfield_template) { controls.sigma_init = gtk_button_new_with_mnemonic(_("_Like Current Channel")); g_signal_connect_swapped(controls.sigma_init, "clicked", G_CALLBACK(sigma_init_clicked), &controls); gtk_table_attach(GTK_TABLE(table), controls.sigma_init, 1, 3, row, row+1, GTK_FILL, 0, 0, 0); row++; } gtk_widget_show_all(dialog); controls.in_init = FALSE; /* Must be done when widgets are shown, see GtkNotebook docs */ gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), args->active_page); update_values(&controls); noise_synth_invalidate(&controls); finished = FALSE; while (!finished) { response = gtk_dialog_run(GTK_DIALOG(dialog)); switch (response) { case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: case GTK_RESPONSE_OK: gtk_widget_destroy(dialog); case GTK_RESPONSE_NONE: finished = TRUE; break; case RESPONSE_RESET: { gboolean temp = args->update; gint temp2 = args->active_page; *args = noise_synth_defaults; args->active_page = temp2; args->update = temp; } controls.in_init = TRUE; update_controls(&controls, args); controls.in_init = FALSE; if (args->update) preview(&controls); break; default: g_assert_not_reached(); break; } } if (controls.sid) { g_source_remove(controls.sid); controls.sid = 0; } g_object_unref(controls.mydata); gwy_object_unref(controls.surface); gwy_object_unref(controls.noise); gwy_dimensions_free(controls.dims); return response == GTK_RESPONSE_OK; }
static void tip_blind_dialog(TipBlindArgs *args) { GtkWidget *dialog, *table, *hbox, *vbox, *label; GwyContainer *data; GwyGraphModel *gmodel; GwyGraphArea *area; TipBlindControls controls; GwyPixmapLayer *layer; GwyDataField *dfield; GQuark quark; GwySIUnit *unit; gint response, row; dialog = gtk_dialog_new_with_buttons(_("Blind Tip Estimation"), NULL, 0, _("Run _Partial"), RESPONSE_ESTIMATE, _("Run _Full"), RESPONSE_REFINE, _("_Reset Tip"), 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.args = args; controls.in_update = TRUE; controls.good_tip = FALSE; controls.dialog = dialog; gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_OK, controls.good_tip); hbox = gtk_hbox_new(FALSE, 4); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 4); controls.vxres = 240; controls.vyres = 240; controls.oldnstripes = args->nstripes; /* set initial tip properties */ data = gwy_app_data_browser_get(args->source.datano); quark = gwy_app_get_data_key_for_id(args->source.id); dfield = GWY_DATA_FIELD(gwy_container_get_object(data, quark)); controls.tip = gwy_data_field_new_alike(dfield, TRUE); gwy_data_field_resample(controls.tip, args->xres, args->yres, GWY_INTERPOLATION_NONE); gwy_data_field_clear(controls.tip); /* set up data of rescaled image of the tip */ controls.vtip = gwy_container_new(); gwy_app_sync_data_items(data, controls.vtip, args->source.id, 0, FALSE, GWY_DATA_ITEM_PALETTE, 0); dfield = gwy_data_field_new_alike(controls.tip, TRUE); gwy_data_field_resample(dfield, controls.vxres, controls.vyres, GWY_INTERPOLATION_ROUND); gwy_container_set_object_by_name(controls.vtip, "/0/data", dfield); g_object_unref(dfield); /* set up rescaled image of the tip */ vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 4); controls.view = gwy_data_view_new(controls.vtip); 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_base_layer(GWY_DATA_VIEW(controls.view), layer); /* set up tip estimation controls */ gtk_box_pack_start(GTK_BOX(vbox), controls.view, FALSE, FALSE, 0); gmodel = gwy_graph_model_new(); controls.graph = gwy_graph_new(gmodel); g_object_unref(gmodel); gwy_axis_set_visible(gwy_graph_get_axis(GWY_GRAPH(controls.graph), GTK_POS_LEFT), FALSE); gwy_axis_set_visible(gwy_graph_get_axis(GWY_GRAPH(controls.graph), GTK_POS_BOTTOM), FALSE); area = GWY_GRAPH_AREA(gwy_graph_get_area(GWY_GRAPH(controls.graph))); gtk_widget_set_no_show_all(gwy_graph_area_get_label(area), TRUE); g_signal_connect_after(gwy_graph_area_get_label(area), "map", G_CALLBACK(gtk_widget_hide), NULL); gtk_box_pack_start(GTK_BOX(vbox), controls.graph, TRUE, TRUE, 0); table = gtk_table_new(13, 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, FALSE, FALSE, 4); row = 0; controls.data = gwy_data_chooser_new_channels(); gwy_data_chooser_set_filter(GWY_DATA_CHOOSER(controls.data), tip_blind_source_filter, &args->orig, NULL); gwy_data_chooser_set_active_id(GWY_DATA_CHOOSER(controls.data), &args->source); g_signal_connect(controls.data, "changed", G_CALLBACK(data_changed), &args->source); gwy_table_attach_hscale(table, row, _("Related _data:"), NULL, GTK_OBJECT(controls.data), GWY_HSCALE_WIDGET); gtk_table_set_row_spacing(GTK_TABLE(table), row, 8); row++; label = gtk_label_new(_("Estimated Tip Size")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 4, row, row+1, GTK_FILL, 0, 0, 0); row++; controls.xres = gtk_adjustment_new(args->xres, MIN_RES, MAX_RES, 1, 10, 0); gwy_table_attach_hscale(table, row, _("_Width:"), "px", controls.xres, 0); g_object_set_data(G_OBJECT(controls.xres), "controls", &controls); g_signal_connect(controls.xres, "value-changed", G_CALLBACK(width_changed), &controls); row++; controls.yres = gtk_adjustment_new(args->yres, MIN_RES, MAX_RES, 1, 10, 0); gwy_table_attach_hscale(table, row, _("_Height:"), "px", controls.yres, 0); g_object_set_data(G_OBJECT(controls.yres), "controls", &controls); g_signal_connect(controls.yres, "value-changed", G_CALLBACK(height_changed), &controls); row++; controls.same_resolution = gtk_check_button_new_with_mnemonic(_("_Same resolution")); gtk_table_attach(GTK_TABLE(table), controls.same_resolution, 0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.same_resolution), args->same_resolution); g_signal_connect(controls.same_resolution, "toggled", G_CALLBACK(same_resolution_changed), &controls); gtk_table_set_row_spacing(GTK_TABLE(table), row, 8); row++; gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Options")), 0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); row++; controls.threshold = gtk_adjustment_new(1.0, 0.01, 1000.0, 0.01, 1.0, 0.0); controls.threshold_spin = gtk_spin_button_new(GTK_ADJUSTMENT(controls.threshold), 0.1, 2); gtk_table_attach(GTK_TABLE(table), controls.threshold_spin, 2, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); label = gtk_label_new_with_mnemonic(_("Noise suppression t_hreshold:")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_label_set_mnemonic_widget(GTK_LABEL(label), controls.threshold_spin); gtk_table_attach(GTK_TABLE(table), label, 0, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); unit = gwy_data_field_get_si_unit_z(dfield); controls.threshold_unit = gwy_combo_box_metric_unit_new(G_CALLBACK(thresh_changed), &controls, -12, -3, unit, -9); gtk_table_attach(GTK_TABLE(table), controls.threshold_unit, 3, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); g_signal_connect(controls.threshold, "value-changed", G_CALLBACK(thresh_changed), &controls); sci_entry_set_value(GTK_ADJUSTMENT(controls.threshold), GTK_COMBO_BOX(controls.threshold_unit), args->thresh); row++; controls.boundaries = gtk_check_button_new_with_mnemonic(_("Use _boundaries")); gtk_table_attach(GTK_TABLE(table), controls.boundaries, 0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.boundaries), args->use_boundaries); g_signal_connect(controls.boundaries, "toggled", G_CALLBACK(bound_changed), args); gtk_table_set_row_spacing(GTK_TABLE(table), row, 8); row++; gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Stripes")), 0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); row++; controls.nstripes = gtk_adjustment_new(args->nstripes, MIN_STRIPES, MAX_STRIPES, 1, 10, 0); gwy_table_attach_hscale(table, row, _("_Split to stripes:"), NULL, controls.nstripes, GWY_HSCALE_CHECK); controls.split_to_stripes = gwy_table_hscale_get_check(controls.nstripes); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.split_to_stripes), !args->split_to_stripes); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.split_to_stripes), args->split_to_stripes); g_signal_connect(controls.split_to_stripes, "toggled", G_CALLBACK(split_to_stripes_changed), &controls); g_signal_connect(controls.nstripes, "value-changed", G_CALLBACK(nstripes_changed), &controls); row++; controls.stripeno = gtk_adjustment_new(1, 1, args->nstripes, 1, 10, 0); gwy_table_attach_hscale(table, row, _("_Preview stripe:"), NULL, controls.stripeno, GWY_HSCALE_DEFAULT); g_signal_connect(controls.stripeno, "value-changed", G_CALLBACK(stripeno_changed), &controls); row++; controls.plot_size_graph = gtk_check_button_new_with_mnemonic(_("Plot size _graph")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.plot_size_graph), args->plot_size_graph); gtk_table_attach(GTK_TABLE(table), controls.plot_size_graph, 0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); g_signal_connect(controls.plot_size_graph, "toggled", G_CALLBACK(plot_size_graph_changed), &controls); row++; controls.create_images = gtk_check_button_new_with_mnemonic(_("Create tip i_mages")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.create_images), args->create_images); gtk_table_attach(GTK_TABLE(table), controls.create_images, 0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); g_signal_connect(controls.create_images, "toggled", G_CALLBACK(create_images_changed), &controls); row++; controls.tipdone = FALSE; controls.in_update = FALSE; split_to_stripes_changed(GTK_TOGGLE_BUTTON(controls.split_to_stripes), &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: gtk_widget_destroy(dialog); case GTK_RESPONSE_NONE: tip_blind_dialog_abandon(&controls); tip_blind_save_args(gwy_app_settings_get(), args); return; break; case GTK_RESPONSE_OK: tip_blind_save_args(gwy_app_settings_get(), args); tip_blind_do(&controls, args); break; case RESPONSE_RESET: reset(&controls, args); break; case RESPONSE_ESTIMATE: tip_blind_run(&controls, args, FALSE); break; case RESPONSE_REFINE: tip_blind_run(&controls, args, TRUE); break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); gtk_widget_destroy(dialog); tip_blind_dialog_abandon(&controls); return; }
static gboolean median_dialog(MedianBgArgs *args) { enum { RESPONSE_RESET = 1 }; GtkWidget *dialog, *table, *spin; MedianBgControls controls; gint response, row; gdouble q; dialog = gtk_dialog_new_with_buttons(_("Median Level"), 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(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, FALSE, FALSE, 4); row = 0; controls.in_update = TRUE; q = args->pixelsize/args->valform->magnitude; gwy_debug("q = %f", q); controls.radius = gtk_adjustment_new(q*args->size, q, 16384*q, q, 10*q, 0); spin = gwy_table_attach_hscale(table, row, _("Real _radius:"), args->valform->units, controls.radius, GWY_HSCALE_SQRT); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), args->valform->precision); g_object_set_data(G_OBJECT(controls.radius), "controls", &controls); g_signal_connect(controls.radius, "value-changed", G_CALLBACK(radius_changed_cb), args); row++; controls.size = gtk_adjustment_new(args->size, 1, 16384, 1, 10, 0); spin = gwy_table_attach_hscale(table, row, _("_Pixel radius:"), "px", controls.size, GWY_HSCALE_SQRT); g_object_set_data(G_OBJECT(controls.size), "controls", &controls); g_signal_connect(controls.size, "value-changed", G_CALLBACK(size_changed_cb), args); 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); g_signal_connect(controls.do_extract, "toggled", G_CALLBACK(do_extract_changed_cb), args); row++; controls.in_update = 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: gtk_widget_destroy(dialog); case GTK_RESPONSE_NONE: return FALSE; break; case GTK_RESPONSE_OK: break; case RESPONSE_RESET: args->size = median_defaults.size; args->do_extract = median_defaults.do_extract; median_dialog_update(&controls, args); break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); gtk_widget_destroy(dialog); return TRUE; }
static gboolean level_dialog(LevelArgs *args, const gchar *title) { enum { RESPONSE_RESET = 1 }; GtkWidget *dialog, *label, *table; gint row, response; LevelControls controls; controls.args = args; dialog = gtk_dialog_new_with_buttons(title, 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(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_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), table); row = 0; 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 = gwy_radio_buttons_create(gwy_masking_type_get_enum(), -1, G_CALLBACK(masking_changed), &controls, args->masking); row = gwy_radio_buttons_attach_to_table(controls.masking, GTK_TABLE(table), 3, 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 = level_defaults; gwy_radio_buttons_set_current(controls.masking, args->masking); 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; }