static gboolean poly_level_dialog(PolyLevelArgs *args, GwyContainer *data, GwyDataField *dfield, GwyDataField *mfield, gint id) { enum { RESPONSE_RESET = 1 }; static const GwyEnum types[] = { { N_("Independent degrees"), TRUE, }, { N_("Limited total degree"), FALSE, }, }; GtkWidget *dialog, *table, *label, *hbox; GwyPixmapLayer *layer; PolyLevelControls controls; gint response; gint row; controls.args = args; controls.in_update = TRUE; controls.data = create_preview_data(data, dfield, mfield, id); dialog = gtk_dialog_new_with_buttons(_("Remove Polynomial Background"), NULL, 0, _("_Reset"), RESPONSE_RESET, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 0); table = gtk_table_new(2, 2, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 2); gtk_table_set_col_spacings(GTK_TABLE(table), 12); gtk_container_set_border_width(GTK_CONTAINER(table), 4); gtk_box_pack_start(GTK_BOX(hbox), table, FALSE, FALSE, 0); row = 0; controls.leveled_view = gwy_data_view_new(controls.data); layer = gwy_layer_basic_new(); gwy_pixmap_layer_set_data_key(layer, "/0/data"); gwy_layer_basic_set_gradient_key(GWY_LAYER_BASIC(layer), "/0/base/palette"); gwy_data_view_set_data_prefix(GWY_DATA_VIEW(controls.leveled_view), "/0/data"); gwy_data_view_set_base_layer(GWY_DATA_VIEW(controls.leveled_view), layer); gtk_table_attach(GTK_TABLE(table), controls.leveled_view, 0, 1, row, row+1, 0, 0, 0, 0); controls.bg_view = gwy_data_view_new(controls.data); layer = gwy_layer_basic_new(); gwy_pixmap_layer_set_data_key(layer, "/1/data"); gwy_layer_basic_set_gradient_key(GWY_LAYER_BASIC(layer), "/1/base/palette"); gwy_data_view_set_data_prefix(GWY_DATA_VIEW(controls.bg_view), "/1/data"); gwy_data_view_set_base_layer(GWY_DATA_VIEW(controls.bg_view), layer); gtk_table_attach(GTK_TABLE(table), controls.bg_view, 1, 2, row, row+1, 0, 0, 0, 0); g_object_unref(controls.data); row++; label = gtk_label_new(_("Leveled data")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); label = gtk_label_new(_("Background")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); row++; table = gtk_table_new(7 + (mfield ? 4 : 0), 4, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 2); gtk_table_set_col_spacings(GTK_TABLE(table), 6); gtk_container_set_border_width(GTK_CONTAINER(table), 4); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table, TRUE, TRUE, 0); row = 0; controls.type_group = gwy_radio_buttons_create(types, G_N_ELEMENTS(types), G_CALLBACK(poly_level_type_changed), &controls, args->independent); gtk_table_attach(GTK_TABLE(table), GTK_WIDGET(controls.type_group->data), 0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); row++; controls.col_degree = gtk_adjustment_new(args->col_degree, 0, MAX_DEGREE, 1, 1, 0); gwy_table_attach_hscale(table, row++, _("_Horizontal polynom degree:"), NULL, controls.col_degree, 0); g_signal_connect(controls.col_degree, "value-changed", G_CALLBACK(poly_level_degree_changed), &controls); controls.row_degree = gtk_adjustment_new(args->row_degree, 0, MAX_DEGREE, 1, 1, 0); gwy_table_attach_hscale(table, row++, _("_Vertical polynom degree:"), NULL, controls.row_degree, 0); g_signal_connect(controls.row_degree, "value-changed", G_CALLBACK(poly_level_degree_changed), &controls); controls.same_degree = gtk_check_button_new_with_mnemonic(_("_Same degrees")); gtk_table_attach(GTK_TABLE(table), controls.same_degree, 0, 4, row, row+1, GTK_FILL, 0, 0, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.same_degree), args->same_degree); g_signal_connect(controls.same_degree, "toggled", G_CALLBACK(poly_level_same_degree_changed), &controls); gtk_table_set_row_spacing(GTK_TABLE(table), row, 8); row++; gtk_table_attach(GTK_TABLE(table), GTK_WIDGET(controls.type_group->next->data), 0, 4, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); row++; controls.max_degree = gtk_adjustment_new(args->max_degree, 0, MAX_DEGREE, 1, 1, 0); gwy_table_attach_hscale(table, row, _("_Maximum polynom degree:"), NULL, controls.max_degree, 0); g_signal_connect(controls.max_degree, "value-changed", G_CALLBACK(poly_level_max_degree_changed), &controls); gtk_table_set_row_spacing(GTK_TABLE(table), row, 8); row++; controls.do_extract = gtk_check_button_new_with_mnemonic(_("E_xtract background")); gtk_table_attach(GTK_TABLE(table), controls.do_extract, 0, 4, row, row+1, GTK_FILL, 0, 0, 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(controls.do_extract), args->do_extract); gtk_table_set_row_spacing(GTK_TABLE(table), row, 8); row++; if (mfield) { label = gwy_label_new_header(_("Masking Mode")); gtk_table_attach(GTK_TABLE(table), label, 0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); row++; controls.masking_group = gwy_radio_buttons_create(gwy_masking_type_get_enum(), -1, G_CALLBACK(poly_level_masking_changed), &controls, args->masking); row = gwy_radio_buttons_attach_to_table(controls.masking_group, GTK_TABLE(table), 3, row); } else controls.masking_group = NULL; controls.in_update = FALSE; gtk_widget_set_sensitive(controls.same_degree, args->independent); gwy_table_hscale_set_sensitive(controls.row_degree, args->independent); gwy_table_hscale_set_sensitive(controls.col_degree, args->independent); gwy_table_hscale_set_sensitive(controls.max_degree, !args->independent); poly_level_update_preview(&controls, args); gtk_widget_show_all(dialog); do { response = gtk_dialog_run(GTK_DIALOG(dialog)); switch (response) { case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: poly_level_update_values(&controls, args); gtk_widget_destroy(dialog); case GTK_RESPONSE_NONE: return FALSE; break; case GTK_RESPONSE_OK: break; case RESPONSE_RESET: *args = poly_level_defaults; poly_level_dialog_update(&controls, args); break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); poly_level_update_values(&controls, args); gtk_widget_destroy(dialog); return TRUE; }
static gboolean 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 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; }