use libc::c_float;
use traits::Wrappable;
use graphics::FloatRect;
use sfml_types::Vector2f;
use csfml_graphics_sys as ffi;
pub struct View {
dropable: bool,
view: *mut ffi::sfView
}
impl View {
pub fn new() -> Option<View> {
let view = unsafe { ffi::sfView_create() };
if view.is_null() {
None
} else {
Some(View {
dropable: true,
view: view
})
}
}
pub fn new_init(center: &Vector2f, size: &Vector2f) -> Option<View> {
let view = unsafe { ffi::sfView_create() };
if view.is_null() {
None
} else {
unsafe {
ffi::sfView_setCenter(view, *center);
ffi::sfView_setSize(view, *size);
}
Some(View {
dropable: true,
view: view
})
}
}
pub fn clone_opt(&self) -> Option<View> {
let view = unsafe { ffi::sfView_copy(self.view) };
if view.is_null() {
None
} else {
Some(View {
dropable: true,
view: view
})
}
}
pub fn new_from_rect(rectangle: &FloatRect) -> Option<View> {
let view = unsafe { ffi::sfView_createFromRect(*rectangle) };
if view.is_null() {
None
} else {
Some(View {
dropable: true,
view: view
})
}
}
pub fn set_rotation(&mut self, angle: f32) {
unsafe {
ffi::sfView_setRotation(self.view, angle as c_float)
}
}
pub fn get_rotation(&self) -> f32 {
unsafe {
ffi::sfView_getRotation(self.view) as f32
}
}
pub fn rotate(&mut self, angle: f32) {
unsafe {
ffi::sfView_rotate(self.view, angle as c_float)
}
}
pub fn zoom(&mut self, factor: f32) {
unsafe {
ffi::sfView_zoom(self.view, factor as c_float)
}
}
pub fn set_center(&mut self, center: &Vector2f) {
unsafe {
ffi::sfView_setCenter(self.view, *center)
}
}
pub fn set_center2f(&mut self, center_x: f32, center_y: f32) {
unsafe {
ffi::sfView_setCenter(self.view, Vector2f::new(center_x, center_y))
}
}
pub fn set_size(&mut self, size: &Vector2f) {
unsafe {
ffi::sfView_setSize(self.view, *size)
}
}
pub fn set_size2f(&mut self, size_x: f32, size_y: f32) {
unsafe {
ffi::sfView_setSize(self.view, Vector2f::new(size_x, size_y))
}
}
pub fn move_(&mut self, offset: &Vector2f) {
unsafe {
ffi::sfView_move(self.view, *offset)
}
}
pub fn move2f(&mut self, offset_x: f32, offset_y: f32) {
unsafe {
ffi::sfView_move(self.view, Vector2f::new(offset_x, offset_y))
}
}
pub fn get_center(&self) -> Vector2f {
unsafe {
ffi::sfView_getCenter(self.view)
}
}
pub fn get_size(&self) -> Vector2f {
unsafe {
ffi::sfView_getSize(self.view)
}
}
pub fn set_viewport(&mut self, viewport: &FloatRect) {
unsafe {
ffi::sfView_setViewport(self.view, *viewport)
}
}
pub fn reset(&mut self, rectangle: &FloatRect) {
unsafe {
ffi::sfView_reset(self.view, *rectangle)
}
}
pub fn get_viewport(&self) -> FloatRect {
unsafe {
ffi::sfView_getViewport(self.view)
}
}
}
impl Clone for View {
fn clone(&self) -> View {
let view = unsafe { ffi::sfView_copy(self.view) };
if view.is_null() {
panic!("Not enough memory to clone View")
} else {
View {
dropable: true,
view: view
}
}
}
}
impl Wrappable<*mut ffi::sfView> for View {
fn wrap(view: *mut ffi::sfView) -> View {
View {
dropable: false,
view: view
}
}
fn unwrap(&self) -> *mut ffi::sfView {
self.view
}
}
impl Drop for View {
fn drop(&mut self) {
if self.dropable {
unsafe {
ffi::sfView_destroy(self.view)
}
}
}
}