use std::fmt;
use cxx::UniquePtr;
use crate::bridge::layers::{self, SymbolAnchorType};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum SymbolAnchor {
Center,
Left,
Right,
Top,
Bottom,
TopLeft,
TopRight,
BottomLeft,
BottomRight,
}
impl From<SymbolAnchor> for SymbolAnchorType {
fn from(value: SymbolAnchor) -> Self {
match value {
SymbolAnchor::Center => Self::Center,
SymbolAnchor::Left => Self::Left,
SymbolAnchor::Right => Self::Right,
SymbolAnchor::Top => Self::Top,
SymbolAnchor::Bottom => Self::Bottom,
SymbolAnchor::TopLeft => Self::TopLeft,
SymbolAnchor::TopRight => Self::TopRight,
SymbolAnchor::BottomLeft => Self::BottomLeft,
SymbolAnchor::BottomRight => Self::BottomRight,
}
}
}
pub struct SymbolLayer {
layer_id: String,
layer: UniquePtr<layers::SymbolLayer>,
}
impl fmt::Debug for SymbolLayer {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("SymbolLayer")
.field("layer_id", &self.layer_id)
.field("Pointer", &self.layer.as_ptr())
.finish()
}
}
impl SymbolLayer {
pub fn new(layer_id: &str, source_id: impl AsRef<str>) -> Self {
Self {
layer_id: layer_id.to_owned(),
layer: layers::create_symbol_layer(layer_id, source_id.as_ref()),
}
}
pub(crate) fn from_ffi_parts(layer_id: String, layer: UniquePtr<layers::SymbolLayer>) -> Self {
Self { layer_id, layer }
}
pub(crate) fn layer_id(&self) -> &str {
&self.layer_id
}
pub fn set_icon_image(&mut self, image_id: impl AsRef<str>) {
layers::setIconImage(&self.layer, image_id.as_ref());
}
pub fn set_icon_anchor(&mut self, anchor: SymbolAnchor) {
layers::setIconAnchor(&self.layer, anchor.into());
}
pub(crate) fn into_inner(self) -> UniquePtr<layers::SymbolLayer> {
self.layer
}
}