pub struct ChoiceState {
pub options: Vec<ChoiceOption>,
pub selected: BTreeSet<usize>,
pub caret_index: Option<usize>,
pub anchor: Option<usize>,
pub top_visible: usize,
pub popup_open: bool,
pub hovered: Option<usize>,
pub config: ChoiceConfig,
pub edit_text: String,
pub edit: Option<Box<TextEdit>>,
}Expand description
A combo box or list box’s interaction state.
use pdfrum_form::field::{ChoiceConfig, ChoiceOption, ChoiceState, choice};
let rows = ["Apple", "Banana"]
.map(|l| ChoiceOption { label: l.to_string(), value: l.to_string() })
.to_vec();
let mut state = ChoiceState::new(rows, ChoiceConfig::default());
choice::select_only(&mut state, 1);
assert_eq!(state.focused_text(), "Banana");
assert!(!state.popup_open, "nothing a file says opens a dropdown");Fields§
§options: Vec<ChoiceOption>The rows.
selected: BTreeSet<usize>Which rows are selected.
caret_index: Option<usize>The row last acted upon.
Not a description of the selection: a multi-select list box reports this row’s text as its focused text, and a call that selects nothing — deselecting an already-deselected row — still moves it. That is the asserted behaviour, however odd it reads.
anchor: Option<usize>The pivot a shift-click ranges from. Successive shift-clicks all pivot on the same row, so this is not updated by one.
top_visible: usizeThe first row currently visible.
popup_open: boolWhether a combo box’s dropdown is open.
Meaningless on a list box, which has no second window to open, and never set on one.
Open is a session fact and not a document one: nothing a file can
say opens a dropdown, and the only thing that does is a click on the
drop button, a Return, or a Space on a gated combo. What it
changes is where a click lands — a point below the widget is inside
the list rather than a miss — and what a host is told to draw
(crate::popup::PopupView).
hovered: Option<usize>The row the pointer is over while the dropdown is open.
Hovering a row selects it. Kept beside the selection rather than folded into it, so that closing the list without clicking leaves the stored selection alone.
config: ChoiceConfigHow the field is configured.
edit_text: StringWhat an editable combo box has in its text box.
Kept as a string beside the control rather than only inside it, so a combo that has never been typed into still answers its text without a layout — and so the control itself can be dropped and rebuilt when the font or the plate changes.
edit: Option<Box<TextEdit>>The editable combo’s live edit control, once one has been typed into.
None until the first character: a non-editable combo never has one,
and an editable one that has only been clicked does not need one. It
is boxed because it is much larger than the rest of this record and
absent in the common case.
Implementations§
Source§impl ChoiceState
impl ChoiceState
Sourcepub fn new(
options: impl IntoIterator<Item = ChoiceOption>,
config: ChoiceConfig,
) -> ChoiceState
pub fn new( options: impl IntoIterator<Item = ChoiceOption>, config: ChoiceConfig, ) -> ChoiceState
A choice field with the given rows and configuration.
Nothing is selected and nothing has been acted upon yet, so the field reports no focused text at all.
use pdfrum_form::{ChoiceConfig, ChoiceState};
let state = ChoiceState::new(Vec::new(), ChoiceConfig::default());
assert!(state.selected.is_empty());
assert_eq!(state.caret_index, None);
assert_eq!(state.focused_text(), "");Sourcepub fn focused_text(&self) -> String
pub fn focused_text(&self) -> String
The text this field reports as its focused text.
The row last acted upon for a choice field, which for a single-select field is the same thing as “the selected row” and for a multi-select one deliberately is not.
use pdfrum_form::field::{ChoiceConfig, ChoiceOption, ChoiceState};
let rows = ["Apple", "Banana", "Cherry", "Date"]
.map(|l| ChoiceOption { label: l.to_string(), value: l.to_string() })
.to_vec();
let mut state = ChoiceState::new(rows, ChoiceConfig::default());
state.selected.insert(0);
state.selected.insert(2);
// With nothing acted upon, the first selected row answers.
assert_eq!(state.focused_text(), "Apple");
// Acting on a row moves it — even to a row that is not selected.
state.caret_index = Some(3);
assert_eq!(state.focused_text(), "Date");Trait Implementations§
Source§impl Clone for ChoiceState
impl Clone for ChoiceState
Source§impl Debug for ChoiceState
impl Debug for ChoiceState
Source§impl Default for ChoiceState
impl Default for ChoiceState
Source§impl PartialEq for ChoiceState
impl PartialEq for ChoiceState
impl StructuralPartialEq for ChoiceState
Auto Trait Implementations§
impl Freeze for ChoiceState
impl RefUnwindSafe for ChoiceState
impl Send for ChoiceState
impl Sync for ChoiceState
impl Unpin for ChoiceState
impl UnsafeUnpin for ChoiceState
impl UnwindSafe for ChoiceState
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.