Edje basics example 2

In this example we will show how to load an image and move it across the window.

To load the image to our program, it needs to be declared in the .edc using the images block:

     images{
        image: "bubble.png" COMP;
     }

Note:
COMP means that we are using a lossless compression

Then to be able to use it in our window we must declare a part for this image:

            part{
                   name: "part_image";
                   type: IMAGE;
                   description{
                       image{
                normal: "bubble.png";
                       }
                   }
        }

Now we move to our .c file, you will notice this define:

#define WALK 10

This means how fast we want to move the image across the screen

To load our edje file we will use this command, we do just like the last example (Basic example):

  if(!edje_object_file_set(edje_obj, edje_file_path, "image_group"))
  {
    int err = edje_object_load_error_get(edje_obj);
    const char *errmsg = edje_load_error_str(err);
    fprintf(stderr, "Could not load the edje file - reason:%s\n", errmsg);
    goto eina_prefix_free;
  }



  evas_object_move(edje_obj, 50, 50);
  evas_object_resize(edje_obj, 64, 64);
  evas_object_show(edje_obj);

If we want to move our image, we need to add a callback to be able to do this, so we define:

  evas_object_event_callback_add(bg, EVAS_CALLBACK_KEY_DOWN, _on_key_down, edje_obj);

To get the position of the image we use this:

  evas_object_geometry_get(edje_obj, &x, &y, NULL, NULL);

Now we use the if's to check in what direction the user wants to move the image then we move it:

  if(strcmp(ev->keyname,"Escape") == 0)
  {
    ecore_main_loop_quit();
  }
  else if(strcmp(ev->keyname, "Down") == 0)
  {
    y+=WALK;
  }
  else if(strcmp(ev->keyname, "Up") == 0)
  {
    y-=WALK;
  }
  else if(strcmp(ev->keyname, "Right") == 0)
  {
    x+=WALK;
  }
  else if(strcmp(ev->keyname, "Left") == 0)
  {
    x-=WALK;
  }
  else
  {
     fprintf(stdout, "Key %s not supported.\nCommands:%s", ev->keyname, commands);
     return;
  }

  evas_object_move(edje_obj, x, y);

The example's window should look like this picture:

basic2final.png

The complete .edc file:

collections {
   group {
      name: "image_group";
      max: 500 500;
      min: 50 50;

     images{
        image: "bubble.png" COMP;
     }

    parts{
            part{
                   name: "part_image";
                   type: IMAGE;
                   description{
                       image{
                normal: "bubble.png";
                       }
                   }
        }
    }

   }
}

And the source code:

#ifdef HAVE_CONFIG_H
# include "config.h"
#else
# define __UNUSED__
#endif

#include <stdio.h>

#include <Eina.h>
#include <Ecore.h>
#include <Ecore_Evas.h>
#include <Edje.h>

#define WIDTH  (700)
#define HEIGHT (700)

#define WALK 10

static const char commands[] = "commands are:\nEsc - Exit\nUp - move image up\nDown - move image down\n"\
    "Right - move image to right\nLeft - move image to left\n";

static void
_on_key_down(void *data,
          Evas *evas __UNUSED__,
          Evas_Object *o __UNUSED__,
          void *einfo)
{
  Evas_Event_Key_Down *ev;
  Evas_Object *edje_obj;
  int x,y;

  ev = (Evas_Event_Key_Down *)einfo;
  edje_obj = (Evas_Object *)data;

  evas_object_geometry_get(edje_obj, &x, &y, NULL, NULL);

  if(strcmp(ev->keyname,"Escape") == 0)
  {
    ecore_main_loop_quit();
  }
  else if(strcmp(ev->keyname, "Down") == 0)
  {
    y+=WALK;
  }
  else if(strcmp(ev->keyname, "Up") == 0)
  {
    y-=WALK;
  }
  else if(strcmp(ev->keyname, "Right") == 0)
  {
    x+=WALK;
  }
  else if(strcmp(ev->keyname, "Left") == 0)
  {
    x-=WALK;
  }
  else
  {
     fprintf(stdout, "Key %s not supported.\nCommands:%s", ev->keyname, commands);
     return;
  }

  evas_object_move(edje_obj, x, y);
}

static void
_on_delete(Ecore_Evas *ee __UNUSED__)
{
   ecore_main_loop_quit();
}

int
main(int argc __UNUSED__, char **argv)
{
  const char *edje_file = "basic2.edj";
  char edje_file_path[PATH_MAX];
  Eina_Prefix *pfx;
  Ecore_Evas *ee;
  Evas *evas;
  Evas_Object *bg;
  Evas_Object *edje_obj;

  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;

  ee = ecore_evas_new(NULL, 0, 0, WIDTH, HEIGHT, NULL);

  if(!ee)
    goto eina_prefix_free;

  ecore_evas_callback_delete_request_set(ee, _on_delete);
  ecore_evas_title_set(ee, "Edje show image");

  evas = ecore_evas_get(ee);

  bg = evas_object_rectangle_add(evas);
  evas_object_color_set(bg, 255, 255, 255, 255); //White
  evas_object_move(bg, 0, 0); //orign
  evas_object_resize(bg, WIDTH, HEIGHT); //cover the window
  evas_object_show(bg);

  ecore_evas_object_associate(ee, bg, ECORE_EVAS_OBJECT_ASSOCIATE_BASE);
  evas_object_focus_set(bg, EINA_TRUE);


  edje_obj = edje_object_add(evas);

  snprintf(edje_file_path, sizeof(edje_file_path),
            "%s/examples/%s", eina_prefix_data_get(pfx), edje_file);

  if(!edje_object_file_set(edje_obj, edje_file_path, "image_group"))
  {
    int err = edje_object_load_error_get(edje_obj);
    const char *errmsg = edje_load_error_str(err);
    fprintf(stderr, "Could not load the edje file - reason:%s\n", errmsg);
    goto eina_prefix_free;
  }



  evas_object_move(edje_obj, 50, 50);
  evas_object_resize(edje_obj, 64, 64);
  evas_object_show(edje_obj);

  evas_object_event_callback_add(bg, EVAS_CALLBACK_KEY_DOWN, _on_key_down, edje_obj);

  ecore_evas_show(ee);

  fprintf(stdout, "%s", commands);

  ecore_main_loop_begin();

  eina_prefix_free(pfx);
  ecore_evas_free(ee);
  edje_shutdown();
  ecore_evas_shutdown();

  return EXIT_SUCCESS;

eina_prefix_free:
  eina_prefix_free(pfx);

shutdown_edje:
  edje_shutdown();

shutdown_ecore_evas:
  ecore_evas_shutdown();

  return EXIT_FAILURE;
}

To compile use this command:

 * gcc -o edje-basic2 edje-basic2.c -DPACKAGE_BIN_DIR=\"/Where/enlightenment/is/installed/bin\"
 * -DPACKAGE_LIB_DIR=\"/Where/enlightenment/is/installed/lib\"
 * -DPACKAGE_DATA_DIR=\"/Where/enlightenment/is/installed/share\"
 * `pkg-config --cflags --libs evas ecore ecore-evas edje`
 *
 * edje_cc -id /path/to/the/image basic2.edc
 *