static void deposit_dialog(DepositArgs *args, GwyContainer *data, GwyDataField *dfield, gint id) { GtkWidget *dialog, *table, *hbox, *label, *pivot; DepositControls controls; gint response; GwyPixmapLayer *layer; gint row, newid; GwyDataField *rfield; controls.args = args; dialog = gtk_dialog_new_with_buttons(_("Deposit spherical particles"), NULL, 0, NULL); gtk_dialog_add_action_widget(GTK_DIALOG(dialog), gwy_stock_like_button_new(_("_Start"), 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_has_separator(GTK_DIALOG(dialog), FALSE); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); 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_duplicate_by_prefix(data, "/0/data/", "/0/base/palette", "/0/base/range-type", "/0/base/", NULL); gwy_container_set_object_by_name(controls.mydata, "/0/data", gwy_data_field_duplicate(dfield)); controls.old_dfield = gwy_data_field_duplicate(dfield); 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(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); row = 0; gtk_table_attach(GTK_TABLE(table), gwy_label_new_header(_("Deposition parameters:")), 0, 3, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0); row++; table_attach_threshold(table, &row, _("_Size"), &controls.size, args->size, &controls); pivot = gwy_table_hscale_get_scale(controls.size); controls.value_size = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(controls.value_size), 1.0, 0.5); gtk_table_attach(GTK_TABLE(table), controls.value_size, 2, 3, row, row+1, GTK_FILL, 0, 0, 0); g_signal_connect_swapped(controls.size, "value-changed", G_CALLBACK(update_threshold_size), &controls); gwy_widget_sync_sensitivity(pivot, controls.value_size); controls.format_size = gwy_data_field_get_value_format_z(dfield, GWY_SI_UNIT_FORMAT_VFMARKUP, NULL); label = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_label_set_markup(GTK_LABEL(label), controls.format_size->units); gtk_table_attach(GTK_TABLE(table), label, 3, 4, row, row+1, GTK_FILL, 0, 0, 0); gwy_widget_sync_sensitivity(pivot, label); gtk_table_set_row_spacing(GTK_TABLE(table), row, 8); row++; /* table_attach_threshold(table, &row, _("_Distribution width"), &controls.width, args->width, &controls); pivot = gwy_table_hscale_get_scale(controls.width); controls.value_width = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(controls.value_width), 1.0, 0.5); gtk_table_attach(GTK_TABLE(table), controls.value_width, 2, 3, row, row+1, GTK_FILL, 0, 0, 0); g_signal_connect_swapped(controls.width, "value-changed", G_CALLBACK(update_threshold_width), &controls); gwy_widget_sync_sensitivity(pivot, controls.value_width); controls.format_width = gwy_data_field_get_value_format_z(dfield, GWY_SI_UNIT_FORMAT_VFMARKUP, NULL); label = gtk_label_new(NULL); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_label_set_markup(GTK_LABEL(label), controls.format_width->units); gtk_table_attach(GTK_TABLE(table), label, 3, 4, row, row+1, GTK_FILL, 0, 0, 0); gwy_widget_sync_sensitivity(pivot, label); gtk_table_set_row_spacing(GTK_TABLE(table), row, 8); row++; */ table_attach_threshold(table, &row, _("_Coverage:"), &controls.coverage, args->coverage, &controls); table_attach_threshold(table, &row, _("_Revise after settle"), &controls.revise, args->revise, &controls); gtk_table_set_row_spacing(GTK_TABLE(table), row-1, 8); deposit_invalidate(&controls); update_threshold_size(&controls); //update_threshold_width(&controls); /* finished initializing, allow instant updates */ controls.in_init = FALSE; /* show initial preview if instant updates are on */ gtk_widget_show_all(dialog); do { response = gtk_dialog_run(GTK_DIALOG(dialog)); switch (response) { case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: deposit_dialog_update_values(&controls, args); gtk_widget_destroy(dialog); case GTK_RESPONSE_NONE: g_object_unref(controls.mydata); gwy_si_unit_value_format_free(controls.format_size); //gwy_si_unit_value_format_free(controls.format_width); return; break; case GTK_RESPONSE_OK: break; case RESPONSE_RESET: *args = deposit_defaults; deposit_dialog_update_controls(&controls, args); controls.in_init = TRUE; preview(&controls, args); controls.in_init = FALSE; break; case RESPONSE_PREVIEW: deposit_dialog_update_values(&controls, args); preview(&controls, args); break; default: g_assert_not_reached(); break; } } while (response != GTK_RESPONSE_OK); deposit_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); gwy_si_unit_value_format_free(controls.format_size); //gwy_si_unit_value_format_free(controls.format_width); if (args->computed) { rfield = gwy_container_get_object_by_name(controls.mydata, "/0/data"); newid = gwy_app_data_browser_add_data_field(rfield, data, TRUE); gwy_app_sync_data_items(data, data, id, newid, FALSE, GWY_DATA_ITEM_GRADIENT, GWY_DATA_ITEM_MASK_COLOR, GWY_DATA_ITEM_REAL_SQUARE, GWY_DATA_ITEM_SELECTIONS, 0); gwy_app_set_data_field_title(data, newid, _("Particles")); g_object_unref(controls.mydata); } }
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); }