edje_codegen: Adding a basic example
authorbarbieri <barbieri>
Tue, 4 Sep 2012 21:43:26 +0000 (21:43 +0000)
committerbarbieri <barbieri@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Tue, 4 Sep 2012 21:43:26 +0000 (21:43 +0000)
Patch by: Flavio Ceolin <flavio.ceolin@profusion.mobi>

git-svn-id: http://svn.enlightenment.org/svn/e/trunk/edje@76148 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

configure.ac
src/examples/Makefile.am
src/examples/codegen.edc [new file with mode: 0644]
src/examples/edje-codegen-example.c [new file with mode: 0644]
src/lib/Edje.h

index 565a180..a196b52 100644 (file)
@@ -97,6 +97,7 @@ AC_ARG_ENABLE([amalgamation],
 AM_CONDITIONAL([EDJE_AMALGAMATION], [test "x${do_amalgamation}" = "xyes"])
 
 EFL_WITH_BIN([edje], [edje-cc], [edje_cc])
+EFL_WITH_BIN([edje], [edje-codegen], [edje_codegen])
 
 EFL_ENABLE_BIN([edje-cc])
 EFL_ENABLE_BIN([edje-decc])
index b83189e..a4ba23a 100644 (file)
@@ -5,6 +5,9 @@ EDJE_CC_FLAGS_VERBOSE_0 =
 EDJE_CC_FLAGS_VERBOSE_1 = -v
 EDJE_CC_FLAGS = $(EDJE_CC_FLAGS_$(V)) -id $(srcdir) -fd $(srcdir)
 
+EDJE_CODEGEN = @edje_codegen@
+EDJE_CODEGEN_FLAGS = --prefix=codegen_example
+
 examplesdir = $(datadir)/$(PACKAGE)/examples
 
 if ENABLE_MULTISENSE
@@ -21,6 +24,7 @@ EDCS = \
        text.edc \
        table.edc \
        box.edc \
+       codegen.edc \
        drag.edc \
        edje_example.edc \
        embryo_custom_state.edc \
@@ -60,6 +64,7 @@ files_DATA = \
        test.png \
        Vera.ttf \
         duck.wav \
+       edje-codegen-example.c \
        edje_example.c \
        edje-basic.c \
        edje-swallow.c \
@@ -92,6 +97,13 @@ AM_CPPFLAGS = \
 -DPACKAGE_DATA_DIR=\"$(pkgdatadir)\" \
 @EDJE_CFLAGS@
 
+codegen_example_generated.c codegen_example_generated.h: codegen.edj
+       $(EDJE_CODEGEN) $(EDJE_CODEGEN_FLAGS) codegen.edj example_group $(builddir)/codegen_example_generated.c $(builddir)/codegen_example_generated.h
+
+edje_codegen_example_SOURCES = \
+       codegen_example_generated.c \
+       edje-codegen-example.c
+
 files_DATA += $(EDJS)
 
 examples_PROGRAMS = \
@@ -99,6 +111,7 @@ examples_PROGRAMS = \
        edje-basic \
        edje-box \
        edje-box2 \
+       edje-codegen-example \
        edje-color-class \
        edje-drag\
        edje-perspective \
@@ -118,4 +131,4 @@ LDADD = $(top_builddir)/src/lib/libedje.la @EDJE_LIBS@
 endif
 
 clean-local:
-       rm -f *.edj
+       rm -f *.edj codegen_example_generated.*
diff --git a/src/examples/codegen.edc b/src/examples/codegen.edc
new file mode 100644 (file)
index 0000000..788a900
--- /dev/null
@@ -0,0 +1,73 @@
+collections {
+   group {
+      name: "sel_group";
+      parts {
+         part {
+            name: "rect";
+            type: RECT;
+            description {
+               state: "default" 0.0;
+               color: 0 255 0 255; /* green */
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 1.0;
+            }
+         }
+      }
+   }
+   group {
+      name: "example_group";
+      max: 500 500;
+      min: 50 50;
+
+      styles {
+         style {
+            name: "textblock_style";
+            base: "font=Sans font_size=22 color=#600 wrap=word";
+            tag:  "br" "\n";
+            tag:  "hilight" "+ font_weight=Bold";
+            tag:  "b" "+ font_weight=Bold";
+            tag:  "tab" "\t";
+         }
+      }
+      parts {
+         part {
+            name: "part_one";
+            type: TEXT;
+            api: "part_one";
+            description {
+               min: 50 50;
+               state: "default" 0.0;
+               color: 0 0 255 255; /* blue */
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 1.0 0.3;
+               text {
+                  font: "arial";
+                  size: 22;
+                  min: 1 1;
+               }
+            }
+         }
+         part {
+            name: "part_two";
+            type: SWALLOW;
+            api: "part_two" "The swallow";
+            description {
+               min: 50 50;
+               state: "default" 0.0;
+               rel1.relative: 0.0 0.6;
+               rel2.relative: 1.0 1.0;
+            }
+         }
+      }
+
+      programs {
+         program {
+            name: "part_below.hovered";
+            signal: "mouse,move";
+            source: "part_one";
+            action: SIGNAL_EMIT "mouse,over" "part_below";
+            api: "part_below_over" "mouse over";
+         }
+      }
+   }
+}
diff --git a/src/examples/edje-codegen-example.c b/src/examples/edje-codegen-example.c
new file mode 100644 (file)
index 0000000..8ce06e6
--- /dev/null
@@ -0,0 +1,144 @@
+/**
+ * @since 1.8.0
+ * Simple Edje example illustrating the edje_codegen usage.
+ *
+ * edje_codegen is a tool that generates code to acessing the parts and programs
+ * with the keyword "api" of a specified group. This tool make easier working
+ * with edje avoiding common errors caused by typos when acessing the parts
+ * and/or programs.
+ *
+ * To use the edje_codegen:
+ * edje_codegen --prefix <myapp_myobj> <input.edj> <a_group> <source.c> <header.h>
+ *
+ * In case of this example:
+ * edje_codegen --prefix=codegen_example codegen.edj group_example \
+       codegen_example_generated.c codegen_example_generated.h
+ *
+ * @verbatim
+ * edje_cc codegen.edc && edje_codegen --prefix=codegen_example codegen.edj \
+ * example_group codegen_example_generated.c codegen_example_generated.h
+ * gcc -c codegen_example_generated.c `pkg-config --libs --cflags ecore-evas edje`
+ * gcc -o edje-codegen-example codegen_example_generated.o \
+ * edje-codegen-example.c `pkg-config --libs --cflags ecore-evas edje`
+ * @endverbatim
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#else
+# define __UNUSED__
+#endif
+
+#include "codegen_example_generated.h"
+
+#include <Ecore.h>
+#include <Ecore_Evas.h>
+#include <Edje.h>
+
+#define WIDTH  (300)
+#define HEIGHT (300)
+
+static void
+_on_delete(Ecore_Evas *ee)
+{
+   ecore_main_loop_quit();
+}
+
+static void
+_on_mouse_over(void *data, Evas_Object *obj, const char *emission,
+              const char *source)
+{
+    static int i = 0;
+
+    printf("Mouse over, source: %s - emission: %s\n",
+          source, emission);
+    if (i++ == 5)
+      {
+        Evas_Object *rect = codegen_example_part_two_get(obj);
+        evas_object_color_set(rect, 0, 255, 0, 255);
+        codegen_example_part_below_over_callback_del_full(obj,_on_mouse_over,
+                                                          NULL);
+      }
+}
+
+int
+main(int argc, char *argv[])
+{
+   char         edje_file_path[PATH_MAX];
+   const char  *edje_file = "codegen.edj";
+   Ecore_Evas  *ee;
+   Evas        *evas;
+   Evas_Object *bg;
+   Evas_Object *edje_obj;
+   Evas_Object *red_rect;
+   Eina_Prefix *pfx;
+
+   if (!ecore_evas_init())
+     return EXIT_FAILURE;
+
+   if (!edje_init())
+     goto shutdown_ecore_evas;
+
+   pfx = eina_prefix_new(argv[0], main,
+                         "EDJE_EXAMPLES",
+                         "edje/examples",
+                         edje_file,
+                         PACKAGE_BIN_DIR,
+                         PACKAGE_LIB_DIR,
+                         PACKAGE_DATA_DIR,
+                         PACKAGE_DATA_DIR);
+   if (!pfx)
+     goto shutdown_edje;
+
+   /* this will give you a window with an Evas canvas under the first
+    * engine available */
+   ee = ecore_evas_new(NULL, 0, 0, WIDTH, HEIGHT, NULL);
+   if (!ee)
+     goto free_prefix;
+
+   ecore_evas_callback_delete_request_set(ee, _on_delete);
+   ecore_evas_title_set(ee, "Edje text Example");
+
+   evas = ecore_evas_get(ee);
+
+   bg = evas_object_rectangle_add(evas);
+   evas_object_color_set(bg, 255, 255, 255, 255); /* white bg */
+   evas_object_move(bg, 0, 0); /* at canvas' origin */
+   evas_object_resize(bg, WIDTH, HEIGHT); /* covers full canvas */
+   evas_object_show(bg);
+   ecore_evas_object_associate(ee, bg, ECORE_EVAS_OBJECT_ASSOCIATE_BASE);
+
+   edje_obj = edje_object_add(evas);
+   edje_object_file_set(edje_obj, edje_file, "example_group");
+   evas_object_move(edje_obj, 20, 20);
+   evas_object_resize(edje_obj, WIDTH - 40, HEIGHT - 40);
+   evas_object_show(edje_obj);
+
+   codegen_example_part_one_set(edje_obj, "CODEGEN_EXAMPLE");
+   codegen_example_part_below_over_callback_add(edje_obj, _on_mouse_over, NULL);
+
+   red_rect = evas_object_rectangle_add(evas);
+   evas_object_color_set(red_rect, 255, 0, 0, 255); /* white bg */
+   codegen_example_part_two_set(edje_obj, red_rect);
+   evas_object_show(red_rect);
+
+   ecore_evas_show(ee);
+
+   ecore_main_loop_begin();
+
+   eina_prefix_free(pfx);
+   ecore_evas_free(ee);
+   ecore_evas_shutdown();
+   edje_shutdown();
+
+   return EXIT_SUCCESS;
+
+ free_prefix:
+   eina_prefix_free(pfx);
+ shutdown_edje:
+   edje_shutdown();
+ shutdown_ecore_evas:
+   ecore_evas_shutdown();
+
+   return EXIT_FAILURE;
+}
index 59ddfe6..e770e34 100644 (file)
@@ -93,6 +93,7 @@ You may use different tools to edit and view the generated ".edj"
 files, for instance:
 
   - edje_player (provided by Edje)
+  - edje_codegen (provided by Edje) @since 1.8.0
   - editje (http://trac.enlightenment.org/e/wiki/Editje)
   - edje_viewer (http://trac.enlightenment.org/e/wiki/Edje_Viewer)