use bitflags::bitflags;
bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct FieldFlags: u32 {
const READ_ONLY = 1 << 0;
const REQUIRED = 1 << 1;
const NO_EXPORT = 1 << 2;
}
}
bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct TextFieldFlags: u32 {
const READ_ONLY = 1 << 0;
const REQUIRED = 1 << 1;
const NO_EXPORT = 1 << 2;
const MULTILINE = 1 << 12;
const PASSWORD = 1 << 13;
const FILE_SELECT = 1 << 20;
const DO_NOT_SPELL_CHECK = 1 << 22;
const DO_NOT_SCROLL = 1 << 23;
const COMB = 1 << 24;
const RICH_TEXT = 1 << 25;
}
}
bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ButtonFieldFlags: u32 {
const READ_ONLY = 1 << 0;
const REQUIRED = 1 << 1;
const NO_EXPORT = 1 << 2;
const NO_TOGGLE_TO_OFF = 1 << 14;
const RADIO = 1 << 15;
const PUSHBUTTON = 1 << 16;
const RADIOS_IN_UNISON = 1 << 25;
}
}
bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ChoiceFieldFlags: u32 {
const READ_ONLY = 1 << 0;
const REQUIRED = 1 << 1;
const NO_EXPORT = 1 << 2;
const COMBO = 1 << 17;
const EDIT = 1 << 18;
const SORT = 1 << 19;
const MULTI_SELECT = 1 << 21;
const DO_NOT_SPELL_CHECK = 1 << 22;
const COMMIT_ON_SEL_CHANGE = 1 << 26;
}
}
impl Default for FieldFlags {
fn default() -> Self {
Self::empty()
}
}
impl Default for TextFieldFlags {
fn default() -> Self {
Self::empty()
}
}
impl Default for ButtonFieldFlags {
fn default() -> Self {
Self::empty()
}
}
impl Default for ChoiceFieldFlags {
fn default() -> Self {
Self::empty()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum TextAlignment {
#[default]
Left,
Center,
Right,
}
impl TextAlignment {
pub fn q_value(&self) -> i64 {
match self {
Self::Left => 0,
Self::Center => 1,
Self::Right => 2,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_field_flags_bits() {
assert_eq!(FieldFlags::READ_ONLY.bits(), 1);
assert_eq!(FieldFlags::REQUIRED.bits(), 2);
assert_eq!(FieldFlags::NO_EXPORT.bits(), 4);
}
#[test]
fn test_text_field_flags_bits() {
assert_eq!(TextFieldFlags::MULTILINE.bits(), 1 << 12);
assert_eq!(TextFieldFlags::PASSWORD.bits(), 1 << 13);
assert_eq!(TextFieldFlags::COMB.bits(), 1 << 24);
}
#[test]
fn test_button_field_flags_bits() {
assert_eq!(ButtonFieldFlags::RADIO.bits(), 1 << 15);
assert_eq!(ButtonFieldFlags::PUSHBUTTON.bits(), 1 << 16);
assert_eq!(ButtonFieldFlags::NO_TOGGLE_TO_OFF.bits(), 1 << 14);
}
#[test]
fn test_choice_field_flags_bits() {
assert_eq!(ChoiceFieldFlags::COMBO.bits(), 1 << 17);
assert_eq!(ChoiceFieldFlags::EDIT.bits(), 1 << 18);
assert_eq!(ChoiceFieldFlags::MULTI_SELECT.bits(), 1 << 21);
}
#[test]
fn test_combined_flags() {
let flags = TextFieldFlags::REQUIRED | TextFieldFlags::MULTILINE;
assert!(flags.contains(TextFieldFlags::REQUIRED));
assert!(flags.contains(TextFieldFlags::MULTILINE));
assert!(!flags.contains(TextFieldFlags::PASSWORD));
}
#[test]
fn test_text_alignment_q_value() {
assert_eq!(TextAlignment::Left.q_value(), 0);
assert_eq!(TextAlignment::Center.q_value(), 1);
assert_eq!(TextAlignment::Right.q_value(), 2);
}
#[test]
fn test_default_flags() {
assert_eq!(FieldFlags::default(), FieldFlags::empty());
assert_eq!(TextFieldFlags::default(), TextFieldFlags::empty());
assert_eq!(ButtonFieldFlags::default(), ButtonFieldFlags::empty());
assert_eq!(ChoiceFieldFlags::default(), ChoiceFieldFlags::empty());
}
}