summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno Dilly <bdilly@profusion.mobi>2016-11-04 14:17:23 -0200
committerBruno Dilly <bdilly@profusion.mobi>2016-11-04 18:01:57 -0200
commit96995032ea8783bc7c2878eb3df1618a8bad5205 (patch)
treede4d7985ab70dff60d5c7b622672789448cbaac0
parent24f4d1400491f51301a9055fea041108b3a3fb83 (diff)
downloadefl-96995032ea8783bc7c2878eb3df1618a8bad5205.tar.gz
examples/edje: add example of entry - editable text
Not trivial to be done imo, so it deserves an example.
-rw-r--r--src/examples/edje/.gitignore1
-rw-r--r--src/examples/edje/Makefile.am3
-rw-r--r--src/examples/edje/edje-entry.c117
-rw-r--r--src/examples/edje/entry.edc149
4 files changed, 270 insertions, 0 deletions
diff --git a/src/examples/edje/.gitignore b/src/examples/edje/.gitignore
index ab3c677cc2..5b5f5f0cd7 100644
--- a/src/examples/edje/.gitignore
+++ b/src/examples/edje/.gitignore
@@ -10,6 +10,7 @@
/edje-color-class
/edje-drag
/edje-edit-part-box
+/edje-entry
/edje-multisense
/edje-perspective
/edje-signals-messages
diff --git a/src/examples/edje/Makefile.am b/src/examples/edje/Makefile.am
index 59feb80750..7dff1e3c86 100644
--- a/src/examples/edje/Makefile.am
+++ b/src/examples/edje/Makefile.am
@@ -35,6 +35,7 @@ embryo_set_state_anim.edc \
embryo_set_text.edc \
embryo_timer.edc \
embryo_tween_anim.edc \
+entry.edc \
external_elm_anchorblock.edc \
external_elm_button.edc \
external_elm_check.edc \
@@ -138,6 +139,7 @@ edje-codegen-example.c \
edje-color-class.c \
edje-drag.c \
edje-edit-part-box.c \
+edje-entry.c \
edje-multisense.c \
edje-perspective.c \
edje-signals-messages.c \
@@ -210,6 +212,7 @@ edje-codegen-example \
edje-color-class \
edje-drag\
edje-edit-part-box \
+edje-entry \
edje-perspective \
edje-signals-messages \
edje-swallow \
diff --git a/src/examples/edje/edje-entry.c b/src/examples/edje/edje-entry.c
new file mode 100644
index 0000000000..274e331574
--- /dev/null
+++ b/src/examples/edje/edje-entry.c
@@ -0,0 +1,117 @@
+/**
+ * Edje example for a entry (editable text)
+ *
+ * @verbatim
+ * edje_cc entry.edc && gcc -o edje-entry edje-entry.c `pkg-config --libs --cflags evas ecore ecore-evas edje`
+ * @endverbatim
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#else
+# define EINA_UNUSED
+#endif
+
+#ifndef PACKAGE_DATA_DIR
+#define PACKAGE_DATA_DIR "."
+#endif
+
+#include <Ecore.h>
+#include <Ecore_Evas.h>
+#include <Edje.h>
+
+#define WIDTH (300)
+#define HEIGHT (300)
+
+#define KEY_BG_OBJ "bg_obj"
+#define KEY_EDJE_OBJ "edje_obj"
+
+#define GROUPNAME_MAIN "example/main"
+#define PARTNAME_TEXT "example/text"
+
+static void
+_on_delete(Ecore_Evas *ee EINA_UNUSED)
+{
+ ecore_main_loop_quit();
+}
+
+/* here just to keep our example's window size and background image's
+ * size in synchrony */
+static void
+_on_canvas_resize(Ecore_Evas *ee)
+{
+ Evas_Object *bg, *edj;
+ int w, h;
+
+ ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
+ bg = ecore_evas_data_get(ee, KEY_BG_OBJ);
+ evas_object_resize(bg, w, h);
+ edj = ecore_evas_data_get(ee, KEY_EDJE_OBJ);
+ evas_object_resize(edj, w, h);
+}
+
+static void
+_setup_evas_object(Ecore_Evas *ee, Evas_Object *obj, const char *key)
+{
+ evas_object_move(obj, 0, 0);
+ evas_object_resize(obj, WIDTH, HEIGHT);
+ evas_object_show(obj);
+ ecore_evas_data_set(ee, key, obj);
+}
+
+int
+main(int argc EINA_UNUSED, char *argv[] EINA_UNUSED)
+{
+ const char *edje_file = PACKAGE_DATA_DIR"/entry.edj";
+ Evas_Object *bg, *edje_obj;
+ Ecore_Evas *ee;
+ Evas *evas;
+
+ if (!ecore_evas_init())
+ return EXIT_FAILURE;
+
+ if (!edje_init())
+ goto shutdown_ecore_evas;
+
+ ee = ecore_evas_new(NULL, 0, 0, WIDTH, HEIGHT, NULL);
+ if (!ee) goto shutdown_edje;
+
+ ecore_evas_callback_delete_request_set(ee, _on_delete);
+ ecore_evas_callback_resize_set(ee, _on_canvas_resize);
+ ecore_evas_title_set(ee, "Edje Entry");
+
+ evas = ecore_evas_get(ee);
+
+ bg = evas_object_rectangle_add(evas);
+ evas_object_color_set(bg, 210, 210, 210, 255);
+ _setup_evas_object(ee, bg, KEY_BG_OBJ);
+
+ edje_obj = edje_object_add(evas);
+
+ edje_object_file_set(edje_obj, edje_file, GROUPNAME_MAIN);
+ _setup_evas_object(ee, edje_obj, KEY_EDJE_OBJ);
+
+ /* important to focus it or it won't receive key down strokes */
+ evas_object_focus_set(edje_obj, EINA_TRUE);
+
+ edje_object_part_text_set(edje_obj, PARTNAME_TEXT, "Type here : ");
+ edje_object_part_text_cursor_end_set(edje_obj, PARTNAME_TEXT,
+ EDJE_CURSOR_MAIN);
+
+ ecore_evas_show(ee);
+
+ ecore_main_loop_begin();
+
+ ecore_evas_free(ee);
+ ecore_evas_shutdown();
+ edje_shutdown();
+
+ return EXIT_SUCCESS;
+
+ shutdown_edje:
+ edje_shutdown();
+ shutdown_ecore_evas:
+ ecore_evas_shutdown();
+
+ return EXIT_FAILURE;
+}
diff --git a/src/examples/edje/entry.edc b/src/examples/edje/entry.edc
new file mode 100644
index 0000000000..f47e73ed95
--- /dev/null
+++ b/src/examples/edje/entry.edc
@@ -0,0 +1,149 @@
+collections {
+
+ styles {
+ style {
+ name: "entry_style";
+ // This style wraps lines at word boundaries.
+ // Check Evas textblock's documentation to see all the options
+ base: "font="sans" font_size=10 color=#000 wrap="word" left_margin=2 right_margin=2";
+ }
+ }
+
+ group {
+ name: "example/main";
+ min: 12 50;
+
+ parts {
+ part {
+ name: "background";
+ type: RECT;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ // 3 pixels of margin on left and top
+ rel1.offset: 3 3;
+ // 3 pixels of margin on right and bottom... -1 (default) -3 = -4
+ // Look at documentation about EDC parts positioning
+ rel2.offset: -4 -4;
+ }
+ }
+
+ part {
+ name: "example/text";
+ type: TEXTBLOCK;
+ scale: 1;
+ // It's mandatory to set entry_mode as editable.
+ entry_mode: EDITABLE;
+ select_mode: DEFAULT;
+ cursor_mode: UNDER;
+ mouse_events: 1;
+ // It causes a textblock that is editable to allow multiple lines
+ // for editing.
+ multiline: 1;
+ // Set groups used to be used as selection effect and
+ // cursor.
+ source: "example/selection";
+ source4: "example/cursor";
+ description {
+ state: "default" 0.0;
+ min: 12 50;
+ // Position text relative to background, with a small margin
+ rel1 {
+ to: "background";
+ offset: 2 2;
+ }
+ rel2 {
+ to: "background";
+ offset: -3 -3;
+ }
+ text {
+ style: "entry_style";
+ min: 0 1;
+ align: 0.0 0.0;
+ }
+ }
+ }
+ }
+
+ programs {
+ program {
+ name: "focus";
+ signal: "load";
+ source: "";
+ action: FOCUS_SET;
+ target: "example/text";
+ }
+ }
+ }
+
+ group {
+ name: "example/selection";
+
+ parts {
+ part {
+ name: "selection";
+ type: RECT;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ color: 180 180 180 255;
+ }
+ }
+ }
+ }
+
+ group {
+ name: "example/cursor";
+ min: 1 0;
+
+ parts {
+ part {
+ name: "cursor";
+ type: RECT;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ min: 2 12;
+ color: 0 0 0 255;
+ }
+ description {
+ state: "hidden" 0.0;
+ inherit: "default" 0.0;
+ color: 0 0 0 0;
+ }
+ }
+ }
+
+ // These programs are used to blink the cursor. They're
+ // started by the "load" signal, emitted when the EDJ file is loaded.
+ // It's a infinite loop between "default" and "hidden" states of
+ // the "cursor" part.
+ programs {
+ program {
+ name: "cursor_hide";
+ signal: "load";
+ source: "";
+ action: STATE_SET "hidden" 0.0;
+ target: "cursor";
+ transition: SINUSOIDAL 0.2;
+ after: "cursor_hide_timer";
+ }
+ program {
+ name: "cursor_hide_timer";
+ in: 0.2 0.0;
+ after: "cursor_show";
+ }
+ program {
+ name: "cursor_show";
+ action: STATE_SET "default" 0.0;
+ target: "cursor";
+ after: "cursor_show_timer";
+ }
+ program {
+ name: "cursor_show_timer";
+ in: 0.5 0.0;
+ after: "cursor_hide";
+ }
+ }
+ }
+}