2 * Copyright (C) 2004 Tilman Sauerbeck (tilman at code-monkey de)
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #include <Esmart/Esmart_Container.h>
22 #include <evas/rb_evas.h>
23 #include <evas/rb_evas_object.h>
25 #include "../rb_esmart.h"
32 static void c_mark (RbContainer *e)
34 c_evas_object_mark (&e->real);
36 rb_gc_mark (e->elements);
39 static void c_free (RbContainer *e)
41 c_evas_object_free (&e->real, false);
46 static VALUE c_alloc (VALUE klass)
48 RbContainer *cont = NULL;
50 return Data_Make_Struct (klass, RbContainer, c_mark,
54 static VALUE c_init (VALUE self, VALUE evas)
56 CHECK_CLASS (evas, cEvas);
57 GET_OBJ (evas, RbEvas, e);
58 GET_OBJ (self, RbContainer, cont);
60 cont->real.real = esmart_container_new (e->real);
62 rb_call_super (1, &evas);
64 cont->elements = rb_ary_new ();
69 static VALUE c_append_element (VALUE self, VALUE element)
71 GET_OBJ (self, RbContainer, e);
73 CHECK_CLASS (element, cEvasObject);
74 GET_OBJ (element, RbEvasObject, o);
76 esmart_container_element_append (e->real.real, o->real);
77 rb_ary_push (e->elements, element);
82 static VALUE c_prepend_element (VALUE self, VALUE element)
84 GET_OBJ (self, RbContainer, e);
86 CHECK_CLASS (element, cEvasObject);
87 GET_OBJ (element, RbEvasObject, o);
89 esmart_container_element_prepend (e->real.real, o->real);
90 rb_ary_unshift (e->elements, element);
95 static VALUE c_remove_element (VALUE self, VALUE element)
97 GET_OBJ (self, RbContainer, e);
99 CHECK_CLASS (element, cEvasObject);
100 GET_OBJ (element, RbEvasObject, o);
102 esmart_container_element_remove (e->real.real, o->real);
103 rb_ary_delete (e->elements, element);
108 static VALUE c_elements_get (VALUE self)
112 GET_OBJ (self, RbContainer, e);
114 ary = rb_ary_dup (e->elements);
120 static VALUE c_elements_length_get (VALUE self)
124 GET_OBJ (self, RbContainer, e);
126 l = esmart_container_elements_length_get (e->real.real);
128 return rb_float_new (l);
131 static VALUE c_elements_orig_length_get (VALUE self)
135 GET_OBJ (self, RbContainer, e);
137 l = esmart_container_elements_orig_length_get (e->real.real);
139 return rb_float_new (l);
142 static VALUE c_direction_get (VALUE self)
144 GET_OBJ (self, RbContainer, e);
146 return INT2FIX (esmart_container_direction_get (e->real.real));
149 static VALUE c_direction_set (VALUE self, VALUE val)
151 GET_OBJ (self, RbContainer, e);
153 Check_Type (val, T_FIXNUM);
155 esmart_container_direction_set (e->real.real, FIX2INT (val));
160 static VALUE c_spacing_get (VALUE self)
162 GET_OBJ (self, RbContainer, e);
164 return INT2FIX (esmart_container_spacing_get (e->real.real));
167 static VALUE c_spacing_set (VALUE self, VALUE val)
169 GET_OBJ (self, RbContainer, e);
171 Check_Type (val, T_FIXNUM);
173 esmart_container_spacing_set (e->real.real, FIX2INT (val));
178 static VALUE c_fill_policy_get (VALUE self)
180 GET_OBJ (self, RbContainer, e);
182 return INT2FIX (esmart_container_fill_policy_get (e->real.real));
185 static VALUE c_fill_policy_set (VALUE self, VALUE val)
187 GET_OBJ (self, RbContainer, e);
189 Check_Type (val, T_FIXNUM);
191 esmart_container_fill_policy_set (e->real.real, FIX2INT (val));
196 static VALUE c_alignment_get (VALUE self)
198 GET_OBJ (self, RbContainer, e);
200 return INT2FIX (esmart_container_alignment_get (e->real.real));
203 static VALUE c_alignment_set (VALUE self, VALUE val)
205 GET_OBJ (self, RbContainer, e);
207 Check_Type (val, T_FIXNUM);
209 esmart_container_alignment_set (e->real.real, FIX2INT (val));
215 static VALUE c_get_padding (VALUE self)
217 double l = 0, r = 0, t = 0, b = 0;
219 GET_OBJ (self, RbContainer, e);
221 esmart_container_padding_get (e->real.real, &l, &r, &t, &b);
223 return rb_ary_new3 (4, rb_float_new (l), rb_float_new (r),
224 rb_float_new (t), rb_float_new (b));
227 static VALUE c_set_padding (VALUE self, VALUE l, VALUE r,
230 GET_OBJ (self, RbContainer, e);
232 Check_Type (l, T_FLOAT);
233 Check_Type (r, T_FLOAT);
234 Check_Type (t, T_FLOAT);
235 Check_Type (b, T_FLOAT);
237 esmart_container_padding_set (e->real.real, NUM2DBL (l), NUM2DBL (r),
238 NUM2DBL (t), NUM2DBL (b));
243 static VALUE c_scroll (VALUE self, VALUE val)
245 GET_OBJ (self, RbContainer, e);
247 Check_Type (val, T_FIXNUM);
249 esmart_container_scroll (e->real.real, FIX2INT (val));
254 static VALUE c_scroll_percent_get (VALUE self)
258 GET_OBJ (self, RbContainer, e);
260 val = esmart_container_scroll_percent_get (e->real.real);
262 return rb_float_new (val);
265 static VALUE c_scroll_percent_set (VALUE self, VALUE val)
267 GET_OBJ (self, RbContainer, e);
269 Check_Type (val, T_FLOAT);
271 esmart_container_scroll_percent_set (e->real.real, NUM2DBL (val));
276 void Init_esmart_container (void)
280 rb_require ("esmart");
282 c = rb_define_class_under (mEsmart, "Container", cEvasObject);
284 rb_define_alloc_func (c, c_alloc);
285 rb_define_method (c, "initialize", c_init, 1);
286 rb_define_method (c, "direction", c_direction_get, 0);
287 rb_define_method (c, "direction=", c_direction_set, 1);
288 rb_define_method (c, "spacing", c_spacing_get, 0);
289 rb_define_method (c, "spacing=", c_spacing_set, 1);
290 rb_define_method (c, "fill_policy", c_fill_policy_get, 0);
291 rb_define_method (c, "fill_policy=", c_fill_policy_set, 1);
292 rb_define_method (c, "alignment", c_alignment_get, 0);
293 rb_define_method (c, "alignment=", c_alignment_set, 1);
294 rb_define_method (c, "get_padding", c_get_padding, 0);
295 rb_define_method (c, "set_padding", c_set_padding, 4);
296 rb_define_method (c, "append_element", c_append_element, 1);
297 rb_define_method (c, "prepend_element", c_prepend_element, 1);
298 rb_define_method (c, "remove_element", c_remove_element, 1);
299 rb_define_method (c, "elements", c_elements_get, 0);
300 rb_define_method (c, "elements_length", c_elements_length_get, 0);
301 rb_define_method (c, "elements_orig_length",
302 c_elements_orig_length_get, 0);
303 rb_define_method (c, "scroll", c_scroll, 1);
304 rb_define_method (c, "scroll_percent", c_scroll_percent_get, 0);
305 rb_define_method (c, "scroll_percent=", c_scroll_percent_set, 1);
307 rb_define_const (c, "HORIZONTAL",
308 INT2FIX (CONTAINER_DIRECTION_HORIZONTAL));
309 rb_define_const (c, "VERTICAL",
310 INT2FIX (CONTAINER_DIRECTION_VERTICAL));
312 rb_define_const (c, "NONE",
313 INT2FIX (CONTAINER_FILL_POLICY_NONE));
314 rb_define_const (c, "KEEP_ASPECT",
315 INT2FIX (CONTAINER_FILL_POLICY_KEEP_ASPECT));
316 rb_define_const (c, "FILL_X",
317 INT2FIX (CONTAINER_FILL_POLICY_FILL_X));
318 rb_define_const (c, "FILL_Y",
319 INT2FIX (CONTAINER_FILL_POLICY_FILL_Y));
320 rb_define_const (c, "HOMOGENOUS",
321 INT2FIX (CONTAINER_FILL_POLICY_HOMOGENOUS));
323 rb_define_const (c, "CENTER",
324 INT2FIX (CONTAINER_ALIGN_CENTER));
325 rb_define_const (c, "LEFT",
326 INT2FIX (CONTAINER_ALIGN_LEFT));
327 rb_define_const (c, "RIGHT",
328 INT2FIX (CONTAINER_ALIGN_RIGHT));
329 rb_define_const (c, "BOTTOM",
330 INT2FIX (CONTAINER_ALIGN_BOTTOM));
331 rb_define_const (c, "TOP",
332 INT2FIX (CONTAINER_ALIGN_TOP));