export global BatchModel {
in-out property <bool> preview_visible: false;
in property <bool> preview_confirming: false;
in property <int> preview_offer_count: 0;
in property <[int]> preview_offer_ids: [];
in property <bool> preview_batch_running: false;
in property <int> preview_design_index: 0;
in property <int> preview_design_total: 0;
// Remaining-time text ("about 6 min left" / "estimating..." / ""), from
// `gui::progress_eta::batch_eta_label`.
in property <string> preview_eta: "";
in property <int> preview_local_active: 0;
in property <int> preview_local_lane_total: 0;
// The title of the picture a remote dispatcher started most recently (or a pause
// notice while the remote is being waited out). `preview_remote_active` is whether
// any remote dispatcher is running, and `preview_remote_in_flight` how many pictures
// are on the remote right now -- up to `AppSettings::remote_batch_lanes`.
in property <string> preview_remote_title: "";
in property <bool> preview_remote_active: false;
in property <int> preview_remote_in_flight: 0;
in property <bool> preview_done: false;
in property <string> preview_summary: "";
// The confirm step offers to REGENERATE designs that may already have previews
// (Library menu, filter panel) rather than to fill in missing ones.
in property <bool> preview_offer_regenerate: false;
// The regenerate confirm step's scope choice (`gui::batch::regenerate_all`): the
// ids behind "Missing or outdated only", their count (-1 while the scan runs), the
// two pill labels, and whether that pill is the chosen one (the default).
in property <[int]> preview_offer_missing_ids: [];
in property <int> preview_offer_missing_count: -1;
in property <string> preview_offer_missing_label: "";
in property <string> preview_offer_all_label: "";
in-out property <bool> preview_offer_missing_only: true;
// The confirm step was opened by an import: it then also offers fast solid previews
// and a "remember my choice" box. `preview_import_choice` mirrors
// `AppSettings::import_preview_choice` (0 ask, 1 full, 2 solid, 3 skip).
in property <bool> preview_offer_from_import: false;
in-out property <bool> preview_remember_choice: false;
in-out property <int> preview_import_choice: 0;
callback preview_cancel();
callback preview_close();
callback preview_dismiss_offer();
callback preview_generate_confirmed();
callback preview_generate_solid_confirmed();
in-out property <bool> tilt_visible: false;
in property <bool> tilt_confirming: false;
in property <int> tilt_offer_count: 0;
in property <[int]> tilt_offer_ids: [];
in property <bool> tilt_batch_running: false;
in property <int> tilt_design_index: 0;
in property <int> tilt_design_total: 0;
// Same remaining-time text as `preview_eta`.
in property <string> tilt_eta: "";
in property <int> tilt_local_active: 0;
in property <int> tilt_local_lane_total: 0;
// Same three remote fields as the preview batch's, counting designs.
in property <string> tilt_remote_title: "";
in property <bool> tilt_remote_active: false;
in property <int> tilt_remote_in_flight: 0;
in property <bool> tilt_done: false;
in property <string> tilt_summary: "";
// Same as `preview_offer_regenerate`, for the tilt confirm step.
in property <bool> tilt_offer_regenerate: false;
// Same scope choice as `preview_offer_missing_*`, for the tilt confirm step.
in property <[int]> tilt_offer_missing_ids: [];
in property <int> tilt_offer_missing_count: -1;
in property <string> tilt_offer_missing_label: "";
in property <string> tilt_offer_all_label: "";
in-out property <bool> tilt_offer_missing_only: true;
// The dialog is showing the Edit tab's single-design sweep ("Tilt Curves" on the
// command bar) rather than a catalogue batch: one bar driven by
// `tilt_single_fraction`, `tilt_single_stage` above it, and Cancel goes to
// `tilt_single_cancel`.
in property <bool> tilt_single: false;
in property <float> tilt_single_fraction: 0.0;
in property <string> tilt_single_stage: "";
callback tilt_single_cancel();
callback tilt_cancel();
callback tilt_close();
callback tilt_dismiss_offer();
callback tilt_generate_confirmed();
}