uniui_layout_linear_layout 0.0.10

Label widget for uniui_* crate family.
Documentation
use crate::ItemsAlignment;

use uniui_gui::{
	implz::qt5::Qt5OptionalNative,
	AlignmentHorizontal,
	AlignmentVertical,
	Color,
	NativeWidget,
	Orientation,
	Widget,
	WidgetGenerator,
	Wrap,
};

use std::ffi::c_void;

extern "C" {
	static UniUiLayoutLinearLayoutOrientationHorizontal: i32;
	static UniUiLayoutLinearLayoutOrientationVertical: i32;


	fn uniui_layout_linear_layout_create(orientation: i32) -> *mut c_void;
	fn uniui_layout_linear_layout_add_widget(
		layout: *mut c_void,
		widget: *mut c_void,
	);
	fn uniui_layout_linear_layout_create_widget_with_layout(
		layout: *mut c_void
	) -> *mut c_void;
	fn uniui_layout_linear_layout_set_widget_background(
		widget: *mut c_void,
		red: u8,
		green: u8,
		blue: u8,
	);
}

pub struct Qt5LinearLayout {
	native: Qt5OptionalNative,
}

impl Qt5LinearLayout {
	pub fn new() -> Qt5LinearLayout {
		return Qt5LinearLayout {
			native: Qt5OptionalNative::new(),
		};
	}

	pub fn set_background(
		&mut self,
		color: &Color,
	) {
		if let Some(p) = self.native.as_mut() {
			unsafe {
				uniui_layout_linear_layout_set_widget_background(
					p,
					color.red,
					color.green,
					color.blue,
				);
			};
		}
	}

	pub fn to_native(
		&mut self,
		widget_generator: &mut dyn WidgetGenerator,
		childs: &mut Vec<Box<dyn Widget>>,
		orientation: &Orientation,
		wrap: &Wrap,
		alignment_horizontal: &AlignmentHorizontal,
		alignment_vertical: &AlignmentVertical,
		alignment: &ItemsAlignment,
	) -> Result<NativeWidget, ()> {
		let native_layout = unsafe {
			let orientation = Qt5LinearLayout::convert_orientation(orientation);
			uniui_layout_linear_layout_create(orientation)
		};

		for c in childs.iter_mut() {
			match c.to_native(widget_generator) {
				Ok(native_widget) => unsafe {
					uniui_layout_linear_layout_add_widget(native_layout, native_widget);
				},
				Err(e) => log::error!("child's to_native err:{:?}", e),
			}
		}

		let native_widget = unsafe {
			uniui_layout_linear_layout_create_widget_with_layout(native_layout)
		};

		unsafe {
			self.native.replace(native_widget);
		};

		self.update_wrap(wrap);
		self.update_alignment_horizontal(alignment_horizontal);
		self.update_alignment_vertical(alignment_vertical);
		self.update_alignment(alignment);

		return Ok(native_widget);
	}

	pub fn update_alignment(
		&mut self,
		_alignment: &ItemsAlignment,
	) {
		log::error!("ItemsAlignment not implemented for Qt5. Yet.");
	}

	pub fn update_wrap(
		&mut self,
		_wrap: &Wrap,
	) {
		log::error!("Wrap not implemented for Qt5. Yet.");
	}

	pub fn update_alignment_horizontal(
		&mut self,
		_alignment_horizontal: &AlignmentHorizontal,
	) {
		log::error!("Alignment_horizontal not implemented for Qt5. Yet.");
	}

	pub fn update_alignment_vertical(
		&mut self,
		_alignment_vertical: &AlignmentVertical,
	) {
		log::error!("Alignment_vertical not implemented for Qt5. Yet.");
	}

	unsafe fn convert_orientation(o: &Orientation) -> i32 {
		return match o {
			Orientation::Horizontal => UniUiLayoutLinearLayoutOrientationHorizontal,
			Orientation::Vertical => UniUiLayoutLinearLayoutOrientationVertical,
		};
	}
}