use crate::{c_api, NcAlign, NcPlaneFlag, NcPlaneOptions, NcResizeCb};
use std::{
fmt,
ptr::{null, null_mut},
};
#[derive(Clone)]
pub struct NcPlaneOptionsBuilder {
pub(crate) y: i32,
pub(crate) x: i32,
pub(crate) rows: u32,
pub(crate) cols: u32,
pub(crate) resizecb: Option<NcResizeCb>,
pub(crate) flags: u64,
pub(crate) margin_b: u32,
pub(crate) margin_r: u32,
}
impl From<NcPlaneOptionsBuilder> for NcPlaneOptions {
fn from(builder: NcPlaneOptionsBuilder) -> NcPlaneOptions {
builder.build()
}
}
impl From<&NcPlaneOptionsBuilder> for NcPlaneOptions {
fn from(builder: &NcPlaneOptionsBuilder) -> Self {
builder.clone().build()
}
}
impl From<&mut NcPlaneOptionsBuilder> for NcPlaneOptions {
fn from(builder: &mut NcPlaneOptionsBuilder) -> Self {
builder.clone().build()
}
}
impl From<NcPlaneOptions> for NcPlaneOptionsBuilder {
fn from(options: NcPlaneOptions) -> NcPlaneOptionsBuilder {
Self::from_options(&options)
}
}
impl From<&NcPlaneOptions> for NcPlaneOptionsBuilder {
fn from(options: &NcPlaneOptions) -> Self {
Self::from_options(options)
}
}
impl From<&mut NcPlaneOptions> for NcPlaneOptionsBuilder {
fn from(options: &mut NcPlaneOptions) -> Self {
Self::from_options(options)
}
}
impl Default for NcPlaneOptionsBuilder {
fn default() -> Self {
Self {
y: 0,
x: 0,
rows: 0,
cols: 0,
resizecb: None,
flags: NcPlaneFlag::Marginalized.into(),
margin_b: 0,
margin_r: 0,
}
}
}
impl fmt::Debug for NcPlaneOptionsBuilder {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let resizecb_str =
if self.resizecb.is_some() { String::from("Some") } else { String::from("None") };
f.debug_struct("NcPlaneOptionsBuilder")
.field("y", &self.y)
.field("x", &self.x)
.field("rows", &self.rows)
.field("cols", &self.cols)
.field("resizecb", &resizecb_str)
.field("flags", &self.flags)
.field("margin_b", &self.margin_b)
.field("margin_r", &self.margin_r)
.finish()
}
}
impl NcPlaneOptionsBuilder {
pub fn from_options(options: &NcPlaneOptions) -> Self {
let mut builder = Self::default();
if options.is_veraligned() {
builder = builder.valign(options.y);
} else {
builder = builder.y(options.y);
}
if options.is_horaligned() {
builder = builder.halign(options.x);
} else {
builder = builder.x(options.x);
}
if options.is_marginalized() {
builder = builder.margins(options.margin_b, options.margin_r);
} else {
builder = builder.rows_cols(options.rows, options.cols);
}
if options.is_fixed() {
builder = builder.fixed(true);
}
if options.resizecb.is_some() {
builder = builder.resizecb(c_api::ncresizecb_to_rust(options.resizecb));
}
if options.is_autogrow() {
builder = builder.autogrow(true);
}
if options.is_vscroll() {
builder = builder.vscroll(true);
}
builder
}
pub fn build(self) -> NcPlaneOptions {
NcPlaneOptions {
y: self.y,
x: self.x,
rows: self.rows,
cols: self.cols,
userptr: null_mut(), name: null(), resizecb: c_api::ncresizecb_to_c(self.resizecb),
flags: self.flags,
margin_b: self.margin_b,
margin_r: self.margin_r,
}
}
}
impl NcPlaneOptionsBuilder {
pub fn y(mut self, y: i32) -> Self {
self.y = y;
self.flags &= !NcPlaneFlag::VerAligned;
self
}
pub fn x(mut self, x: i32) -> Self {
self.x = x;
self.flags &= !NcPlaneFlag::HorAligned;
self
}
pub fn yx(mut self, y: i32, x: i32) -> Self {
self.y = y;
self.x = x;
self.flags &= !NcPlaneFlag::VerAligned;
self.flags &= !NcPlaneFlag::HorAligned;
self
}
pub fn valign(mut self, valign: impl Into<NcAlign>) -> Self {
self.y = valign.into().into();
self.flags |= NcPlaneFlag::VerAligned;
self
}
pub fn halign(mut self, halign: impl Into<NcAlign>) -> Self {
self.y = halign.into().into();
self.flags |= NcPlaneFlag::HorAligned;
self
}
pub fn align(mut self, halign: impl Into<NcAlign>) -> Self {
self.y = halign.into().into();
self.flags |= NcPlaneFlag::VerAligned;
self
}
pub fn rows(mut self, rows: u32) -> Self {
self.rows = rows;
self.flags &= !NcPlaneFlag::Marginalized;
self
}
pub fn cols(mut self, cols: u32) -> Self {
self.cols = cols;
self.flags &= !NcPlaneFlag::Marginalized;
self
}
pub fn rows_cols(mut self, rows: u32, cols: u32) -> Self {
self.rows = rows;
self.cols = cols;
self.flags &= !NcPlaneFlag::Marginalized;
self
}
pub fn margins(mut self, bottom: u32, right: u32) -> Self {
self.margin_b = bottom;
self.margin_r = right;
self.flags |= NcPlaneFlag::Marginalized;
self
}
pub fn fixed(mut self, fixed: bool) -> Self {
if fixed {
self.flags |= NcPlaneFlag::Fixed;
} else {
self.flags &= !NcPlaneFlag::Fixed;
}
self
}
pub fn vscroll(mut self, vscroll: bool) -> Self {
if vscroll {
self.flags |= NcPlaneFlag::VScroll;
} else {
self.flags &= !NcPlaneFlag::VScroll;
}
self
}
pub fn autogrow(mut self, autogrow: bool) -> Self {
if autogrow {
self.flags |= NcPlaneFlag::AutoGrow;
} else {
self.flags &= !NcPlaneFlag::AutoGrow;
}
self
}
pub fn resizecb(mut self, callback: Option<NcResizeCb>) -> Self {
self.resizecb = callback;
self
}
}