pebble_rust/pebble/
layer.rs

1/*
2 * This file is part of pebble-rust.
3 * Copyright (c) 2019 RoccoDev
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19use crate::pebble::internal::{types, functions::interface};
20use crate::pebble::types::{GRect, Bitmap, GCompOp};
21
22pub struct Layer {
23    internal: *mut types::Layer
24}
25
26pub struct TextLayer {
27    internal: *mut types::TextLayer,
28    inner: *mut types::Layer
29}
30
31pub struct BitmapLayer {
32    internal: *mut types::BitmapLayer,
33    inner: *mut types::Layer
34}
35
36pub trait ILayer {
37    fn get_bounds(&self) -> GRect;
38    fn get_frame(&self) -> GRect;
39    fn add_child(&self, layer: &ILayer);
40    fn mark_dirty(&self);
41    fn get_internal(&self) -> *mut types::Layer;
42}
43
44impl ILayer for Layer {
45    fn get_bounds(&self) -> GRect {
46        interface::layer_get_bounds(self.internal)
47    }
48
49    fn get_frame(&self) -> GRect {
50        interface::layer_get_frame(self.internal)
51    }
52
53    fn add_child(&self, layer: &ILayer) {
54        interface::layer_add_child(self.internal, layer.get_internal())
55    }
56
57    fn mark_dirty(&self) {
58        interface::layer_mark_dirty(self.internal);
59    }
60
61    fn get_internal(&self) -> *mut types::Layer {
62        self.internal
63    }
64}
65
66impl Layer {
67    pub fn new(bounds: GRect) -> Layer {
68        Layer {
69            internal: interface::layer_create(bounds)
70        }
71    }
72
73    pub fn from_raw(ptr: *mut types::Layer) -> Layer {
74        Layer {
75            internal: ptr
76        }
77    }
78}
79
80impl ILayer for TextLayer {
81    fn get_bounds(&self) -> GRect {
82        interface::layer_get_bounds(self.inner)
83    }
84
85    fn get_frame(&self) -> GRect {
86        interface::layer_get_frame(self.inner)
87    }
88
89    fn add_child(&self, layer: &ILayer) {
90        interface::layer_add_child(self.inner, layer.get_internal());
91    }
92
93    fn mark_dirty(&self) {
94        interface::layer_mark_dirty(self.inner);
95    }
96
97    fn get_internal(&self) -> *mut types::Layer {
98        self.inner
99    }
100}
101
102impl TextLayer {
103    pub fn new(bounds: GRect) -> TextLayer {
104        let internal = interface::text_layer_create(bounds);
105        let inner = interface::text_layer_get_layer(internal);
106
107        TextLayer {
108            internal, inner
109        }
110    }
111
112    pub fn set_text(&self, text: &str) {
113        interface::text_layer_set_text(self.internal, text);
114    }
115}
116
117impl ILayer for BitmapLayer {
118    fn get_bounds(&self) -> GRect {
119        interface::layer_get_bounds(self.inner)
120    }
121
122    fn get_frame(&self) -> GRect {
123        interface::layer_get_frame(self.inner)
124    }
125
126    fn add_child(&self, layer: &ILayer) {
127        interface::layer_add_child(self.inner, layer.get_internal())
128    }
129
130    fn mark_dirty(&self) {
131        interface::layer_mark_dirty(self.inner)
132    }
133
134    fn get_internal(&self) -> *mut types::Layer {
135        self.inner
136    }
137}
138
139impl BitmapLayer {
140    pub fn new(bounds: GRect) -> BitmapLayer {
141        let internal = interface::bitmap_layer_create(bounds);
142        let inner = interface::bitmap_layer_get_layer(internal);
143
144        BitmapLayer {
145            internal, inner
146        }
147    }
148
149    pub fn set_bitmap(&self, bitmap: &Bitmap) {
150        interface::bitmap_layer_set_bitmap(self.internal, bitmap.internal);
151    }
152
153    pub fn set_compositing_mode(&self, mode: GCompOp) {
154        interface::bitmap_layer_set_compositing_mode(self.internal, mode);
155    }
156}