2 * $Id: rb_edje.c 330 2005-04-28 15:38:47Z tilman $
4 * Copyright (C) 2004 Tilman Sauerbeck (tilman at code-monkey de)
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 #include <evas/rb_evas.h>
25 #include <evas/rb_evas_object.h>
29 #include "rb_edje_main.h"
33 static VALUE cMsg, eEdjeError;
35 static void c_mark (RbEdje *e)
37 c_evas_object_mark (&e->real);
39 if (!NIL_P (e->parts))
40 rb_gc_mark (e->parts);
42 if (!NIL_P (e->callbacks))
43 rb_gc_mark (e->callbacks);
45 if (!NIL_P (e->on_text_changed_cb))
46 rb_gc_mark (e->on_text_changed_cb);
49 static void c_free (RbEdje *e)
51 c_evas_object_free (&e->real, false);
59 * Edje::Edje.new(evas) => edje
61 * Creates an Edje::Edje object.
63 static VALUE c_new (VALUE klass, VALUE evas)
68 CHECK_CLASS (evas, cEvas);
69 GET_OBJ (evas, RbEvas, e);
73 self = Data_Make_Struct (klass, RbEdje, c_mark, c_free, edje);
75 edje->real.real = edje_object_add (e->real);
77 edje->callbacks = Qnil;
78 edje->on_text_changed_cb = Qnil;
81 rb_obj_call_init (self, 1, argv);
90 * Freezes <i>edje</i>.
92 static VALUE c_freeze (VALUE self)
94 GET_OBJ (self, RbEdje, e);
96 edje_object_freeze (e->real.real);
107 static VALUE c_thaw (VALUE self)
109 GET_OBJ (self, RbEdje, e);
111 edje_object_thaw (e->real.real);
118 * edje.load(eet, group) => nil
120 * Loads <i>eet</i> into <i>edje</i>. <i>group</i> is the
121 * name of the group to be displayed.
123 static VALUE c_load (VALUE self, VALUE eet, VALUE group)
125 GET_OBJ (self, RbEdje, e);
127 Check_Type (eet, T_STRING);
128 Check_Type (group, T_STRING);
130 if (!edje_object_file_set (e->real.real, StringValuePtr (eet),
131 StringValuePtr (group)))
132 rb_raise (rb_eException, "Cannot load eet");
139 * edje.get_size_min => array
141 * Returns an array that contains the minimum size
144 static VALUE c_get_size_min (VALUE self)
148 GET_OBJ (self, RbEdje, e);
150 edje_object_size_min_get (e->real.real, &w, &h);
152 return rb_ary_new3 (2, INT2FIX (w), INT2FIX (h));
157 * edje.get_size_max => array
159 * Returns an array that contains the maximum size
162 static VALUE c_get_size_max (VALUE self)
166 GET_OBJ (self, RbEdje, e);
168 edje_object_size_max_get (e->real.real, &w, &h);
170 return rb_ary_new3 (2, INT2FIX (w), INT2FIX (h));
175 * edje.part_exists?(part) => true or false
177 * Returns true if <i>edje</i> has a part called <i>part</i>,
178 * else returns false.
180 static VALUE c_part_exists_get (VALUE self, VALUE name)
184 GET_OBJ (self, RbEdje, e);
186 Check_Type (name, T_STRING);
188 r = edje_object_part_exists (e->real.real, StringValuePtr (name));
190 return r ? Qtrue : Qfalse;
195 * edje.part(part_name) => part
197 * Returns the <code>Edje::Part</code> object that corresponds to
198 * <i>part_name</i>. If there's no part with that name in <i>edje</i>,
199 * an exception is raised.
201 static VALUE c_part_get (VALUE self, VALUE name)
204 const char *cname = StringValuePtr (name);
206 GET_OBJ (self, RbEdje, e);
208 if (!edje_object_part_exists (e->real.real, cname)) {
209 rb_raise (rb_eException, "Unknown part name - %s", cname);
213 if (NIL_P (e->parts))
214 e->parts = rb_hash_new ();
216 if (NIL_P (part = rb_hash_aref (e->parts, name))) {
217 part = TO_PART (self, name);
218 rb_hash_aset (e->parts, name, part);
224 static void on_text_changed (void *data, Evas_Object *eo,
225 const char *part_name)
227 VALUE self = (VALUE) data, part, name;
229 GET_OBJ (self, RbEdje, e);
231 name = rb_str_new2 (part_name);
233 if (NIL_P (e->parts))
234 e->parts = rb_hash_new ();
236 if (NIL_P (part = rb_hash_aref (e->parts, name))) {
237 part = TO_PART (self, name);
238 rb_hash_aset (e->parts, name, part);
241 rb_funcall (e->on_text_changed_cb,
242 rb_intern ("call"), 1, part);
247 * edje.on_text_changed { |part_obj| block }
249 * Registers a callback that will get called when the text
250 * of any part is changed in <i>edje</i>.
251 * The block is passed the <code>Edje::Part</code> object
252 * of which the text changed.
254 static VALUE c_on_text_changed (VALUE self)
256 GET_OBJ (self, RbEdje, e);
258 if (!rb_block_given_p ())
261 e->on_text_changed_cb = rb_block_proc ();
263 edje_object_text_change_cb_set (e->real.real, on_text_changed,
271 * edje.emit_signal(signal, source) => nil
273 * Emits a signal to <i>edje</i>.
275 * edje.emit_signal("signal_foo", "part_bar") #=> nil
277 static VALUE c_emit_signal (VALUE self, VALUE signal, VALUE source)
279 GET_OBJ (self, RbEdje, e);
281 Check_Type (signal, T_STRING);
282 Check_Type (source, T_STRING);
284 edje_object_signal_emit (e->real.real, StringValuePtr (signal),
285 StringValuePtr (source));
290 static void on_signal (void *data, Evas_Object *o,
291 const char *signal, const char *src)
293 rb_funcall ((VALUE) data, rb_intern ("call"), 2,
294 rb_str_new2 (signal), rb_str_new2 (src));
299 * edje.on_signal(signal [, source]) { |signal, source| block } => nil
301 * Registers a callback that will get called when <i>signal</i>
302 * is emitted by <i>source</i>.
303 * If source is nil, "*" will be used instead.
304 * The block is passed two strings, signal and source, which identify
307 static VALUE c_on_signal (int argc, VALUE *argv, VALUE self)
309 VALUE signal, src, cb;
312 GET_OBJ (self, RbEdje, e);
314 rb_scan_args (argc, argv, "11", &signal, &src);
316 Check_Type (signal, T_STRING);
319 Check_Type (src, T_STRING);
320 ssrc = StringValuePtr (src);
323 if (!rb_block_given_p ())
326 cb = rb_block_proc ();
328 if (NIL_P (e->callbacks))
329 e->callbacks = rb_ary_new ();
331 rb_ary_push (e->callbacks, cb);
333 edje_object_signal_callback_add (e->real.real,
334 StringValuePtr (signal),
335 ssrc, on_signal, (void *) cb);
342 * edje.play? => true or false
344 * Returns true if <i>edje</i> is in play mode, else returns false.
346 static VALUE c_play_get (VALUE self)
348 GET_OBJ (self, RbEdje, e);
350 return edje_object_play_get (e->real.real) ? Qtrue : Qfalse;
355 * edje.play(true or false)
357 * Sets <i>edje</i> to play resp. pause mode.
359 static VALUE c_play_set (VALUE self, VALUE val)
361 GET_OBJ (self, RbEdje, e);
365 edje_object_play_set (e->real.real, val == Qtrue);
372 * edje.animation? => true or false
374 * Returns the animation state of <i>edje</i>.
376 static VALUE c_animation_get (VALUE self)
378 GET_OBJ (self, RbEdje, e);
380 return edje_object_animation_get (e->real.real) ? Qtrue : Qfalse;
385 * edje.animation(true or false)
387 * Sets the animation state of <i>edje</i>.
389 static VALUE c_animation_set (VALUE self, VALUE val)
391 GET_OBJ (self, RbEdje, e);
395 edje_object_animation_set (e->real.real, val == Qtrue);
400 static VALUE c_data_get (VALUE self, VALUE key)
404 GET_OBJ (self, RbEdje, e);
406 Check_Type (key, T_STRING);
408 s = edje_object_data_get (e->real.real, StringValuePtr (key));
410 return s ? rb_str_new2 (s) : Qnil;
413 static VALUE c_send_message (VALUE self, VALUE msg)
415 Edje_Message_String s;
417 Edje_Message_Float f;
418 Edje_Message_Type type;
422 GET_OBJ (self, RbEdje, e);
424 CHECK_CLASS (msg, cMsg);
426 v = rb_iv_get (msg, "@value");
429 rb_raise (eEdjeError, "value must not be nil");
433 if (!NIL_P (tmp = rb_check_string_type (v))) {
434 type = EDJE_MESSAGE_STRING;
435 s.str = StringValuePtr (tmp);
437 } else if (rb_obj_is_kind_of (v, rb_cFixnum)) {
438 type = EDJE_MESSAGE_INT;
441 } else if (rb_obj_is_kind_of (v, rb_cFloat)) {
442 type = EDJE_MESSAGE_FLOAT;
445 /* } else if (!NIL_P (tmp = rb_check_array_type (v))) { */
447 rb_raise (eEdjeError, "unsupported value");
450 edje_object_message_send (e->real.real, type,
451 NUM2INT (rb_iv_get (msg, "@id")), data);
456 static VALUE c_msg_init (int argc, VALUE *argv, VALUE self)
460 rb_scan_args (argc, argv, "01", &val);
462 rb_iv_set (self, "@id", UINT2NUM (0));
463 rb_iv_set (self, "@value", val);
468 void Init_Edje (void)
470 cEdje = rb_define_class_under (mEdje, "Edje", cEvasObject);
472 rb_define_singleton_method (cEdje, "new", c_new, 1);
473 rb_define_method (cEdje, "freeze", c_freeze, 0);
474 rb_define_method (cEdje, "thaw", c_thaw, 0);
475 rb_define_method (cEdje, "load", c_load, 2);
476 rb_define_method (cEdje, "get_size_min", c_get_size_min, 0);
477 rb_define_method (cEdje, "get_size_max", c_get_size_max, 0);
478 rb_define_method (cEdje, "part_exists?", c_part_exists_get, 1);
479 rb_define_method (cEdje, "part", c_part_get, 1);
480 rb_define_method (cEdje, "on_text_changed", c_on_text_changed, 0);
481 rb_define_method (cEdje, "emit_signal", c_emit_signal, 2);
482 rb_define_method (cEdje, "on_signal", c_on_signal, -1);
483 rb_define_method (cEdje, "play?", c_play_get, 0);
484 rb_define_method (cEdje, "play=", c_play_set, 1);
485 rb_define_method (cEdje, "animation?", c_animation_get, 0);
486 rb_define_method (cEdje, "animation=", c_animation_set, 1);
487 rb_define_method (cEdje, "data", c_data_get, 1);
488 rb_define_method (cEdje, "send_message", c_send_message, 1);
490 cMsg = rb_define_class_under (mEdje, "Message", rb_cObject);
492 rb_define_method (cMsg, "initialize", c_msg_init, -1);
494 rb_define_attr (cMsg, "id", 1, 1);
495 rb_define_attr (cMsg, "value", 1, 1);
497 eEdjeError = rb_define_class_under (mEdje, "EdjeError",