On Thu, 7 May 2009 11:46:19 +0400 "Sergey P. Semernin"
<[email protected]> said:

ooh nice! checked - looks ok. in svn it goes! awesome!

> Hello, All!
> 
> This patch will add dialogs for directory background and overlay selection
> when it's viewed in EFM2. All directory's look and feel information stored
> in ".directory.desktop" file in X-attributes. GUI to select/change/clear
> background or overlay information available by "Set background..." and
> "Set overlay..." commands in "View mode" submenu of directory's popup menu.
> These menu items available when .directory.desktop exists and user can write
> to it, or user can make .directory.desktop file in directory.
> 
> Also, a several corrections were made:
>     1. avoid read old data from .desktop file when saving in efreet_desktop;
>     2. added efreet_desktop_x_field_* functions to serve X-attributes;
>     3. added container object type check to e_icon;
>     4. under_obj and over_obj moved to e_icon in e_fwin to serve both .edj
>        and regular images.
> 
>  e/src/bin/e_fm.c                |  250 +++++++++++++++++++++++++++++++++++++
> +-- e/src/bin/e_icon.c              |   19 +++
>  e/src/modules/fileman/e_fwin.c  |   41 +++++-
>  efreet/src/lib/efreet_desktop.c |   47 +++++++
>  efreet/src/lib/efreet_desktop.h |    4
>  5 files changed, 341 insertions(+), 20 deletions(-)
> 
> Index: e/src/bin/e_fm.c
> ===================================================================
> --- e/src/bin/e_fm.c  (revision 40530)
> +++ e/src/bin/e_fm.c  (working copy)
> @@ -78,6 +78,7 @@
>     Ecore_Job        *refresh_job;
>     E_Menu           *menu;
>     E_Entry_Dialog   *entry_dialog;
> +   E_Dialog         *image_dialog;
>     unsigned char     iconlist_changed : 1;
>     unsigned char     order_file : 1;
>     unsigned char     typebuf_visible : 1;
> @@ -307,12 +308,17 @@
>  static void _e_fm2_icon_menu(E_Fm2_Icon *ic, Evas_Object *obj,
> unsigned int timestamp);
>  static void _e_fm2_icon_menu_post_cb(void *data, E_Menu *m);
>  static void _e_fm2_icon_menu_item_cb(void *data, E_Menu *m, E_Menu_Item *mi);
> +static void _e_fm2_icon_view_menu_pre(void *data, E_Menu *m, E_Menu_Item
> *mi); static void _e_fm2_toggle_inherit_dir_props(void *data, E_Menu *m,
> E_Menu_Item *mi);
>  static void _e_fm2_view_menu_pre(void *data, E_Menu *m, E_Menu_Item *mi);
>  static void _e_fm2_view_menu_grid_icons_cb(void *data, E_Menu *m,
> E_Menu_Item *mi);
>  static void _e_fm2_view_menu_custom_icons_cb(void *data, E_Menu *m,
> E_Menu_Item *mi);
>  static void _e_fm2_view_menu_list_cb(void *data, E_Menu *m, E_Menu_Item *mi);
>  static void _e_fm2_view_menu_use_default_cb(void *data, E_Menu *m,
> E_Menu_Item *mi);
> +static void _e_fm2_view_menu_set_background_cb(void *data, E_Menu *m,
> E_Menu_Item *mi);
> +static void _e_fm2_view_menu_set_overlay_cb(void *data, E_Menu *m,
> E_Menu_Item *mi);
> +static void _e_fm2_view_image_sel(E_Fm2_Smart_Data *sd, const char
> *title, void (*ok_cb) (void *data, E_Dialog *dia), void (*clear_cb)
> (void *data, E_Dialog *dia));
> +static void _e_fm2_view_image_sel_close(void *data, E_Dialog *dia);
>  static void _e_fm2_refresh(void *data, E_Menu *m, E_Menu_Item *mi);
>  static void _e_fm2_toggle_hidden_files(void *data, E_Menu *m, E_Menu_Item
> *mi); static void _e_fm2_toggle_ordering(void *data, E_Menu *m, E_Menu_Item
> *mi); @@ -7368,6 +7374,11 @@
>       e_object_del(E_OBJECT(sd->entry_dialog));
>       sd->entry_dialog = NULL;
>       }
> +   if (sd->image_dialog)
> +     {
> +        e_object_del(E_OBJECT(sd->image_dialog));
> +        sd->image_dialog = NULL;
> +     }
>     if (sd->scroll_job) ecore_job_del(sd->scroll_job);
>     if (sd->resize_job) ecore_job_del(sd->resize_job);
>     if (sd->refresh_job) ecore_job_del(sd->refresh_job);
> @@ -7724,7 +7735,7 @@
>            mi = e_menu_item_new(mn);
>            e_menu_item_label_set(mi, _("View Mode"));
>            e_util_menu_item_theme_icon_set(mi, "preferences-appearance");
> -          e_menu_item_submenu_pre_callback_set(mi, _e_fm2_view_menu_pre,
> sd);
> +          e_menu_item_submenu_pre_callback_set(mi,
> _e_fm2_icon_view_menu_pre, sd); }
>       if (!(sd->icon_menu.flags & E_FM2_MENU_NO_REFRESH))
>         {
> @@ -8146,20 +8157,11 @@
>  }
> 
>  static void
> -_e_fm2_view_menu_pre(void *data, E_Menu *m, E_Menu_Item *mi)
> +_e_fm2_view_menu_common(E_Menu *subm, E_Fm2_Smart_Data *sd)
>  {
> -   E_Menu *subm;
> -   E_Fm2_Smart_Data *sd;
> -   E_Fm2_Config *cfg;
> +   E_Menu_Item *mi;
>     char view_mode;
> 
> -   sd = data;
> -   cfg = e_fm2_config_get(sd->obj);
> -
> -   subm = e_menu_new();
> -   e_object_data_set(E_OBJECT(subm), sd);
> -   e_menu_item_submenu_set(mi, subm);
> -
>     view_mode = _e_fm2_view_mode_get(sd);
> 
>     mi = e_menu_item_new(subm);
> @@ -8210,8 +8212,57 @@
>     e_menu_item_label_set(mi, buf);
>     e_menu_item_submenu_pre_callback_set(mi,
> _e_fm2_view_menu_icon_size_pre, sd);
>  }
> +
> +static void
> +_e_fm2_icon_view_menu_pre(void *data, E_Menu *m, E_Menu_Item *mi)
> +{
> +   E_Menu *subm;
> +   E_Fm2_Smart_Data *sd;
> 
> +   sd = data;
> +
> +   subm = e_menu_new();
> +   e_object_data_set(E_OBJECT(subm), sd);
> +   e_menu_item_submenu_set(mi, subm);
> +
> +   _e_fm2_view_menu_common(subm, sd);
> +}
> +
>  static void
> +_e_fm2_view_menu_pre(void *data, E_Menu *m, E_Menu_Item *mi)
> +{
> +   E_Menu *subm;
> +   E_Fm2_Smart_Data *sd;
> +   char buf[PATH_MAX];
> +   int access_ok;
> +   sd = data;
> +
> +   subm = e_menu_new();
> +   e_object_data_set(E_OBJECT(subm), sd);
> +   e_menu_item_submenu_set(mi, subm);
> +
> +   _e_fm2_view_menu_common(subm, sd);
> +
> +   snprintf(buf, sizeof(buf), "%s/.directory.desktop", sd->realpath);
> +   access_ok = ecore_file_exists(buf) ? ecore_file_can_write(buf)
> +                                      : ecore_file_can_write(sd->realpath);
> +   if (access_ok)
> +     {
> +        mi = e_menu_item_new(subm);
> +        e_menu_item_separator_set(mi, 1);
> +
> +        mi = e_menu_item_new(subm);
> +        e_menu_item_label_set(mi, _("Set background..."));
> +        e_util_menu_item_theme_icon_set(mi, "preferences-desktop-wallpaper");
> +        e_menu_item_callback_set(mi, _e_fm2_view_menu_set_background_cb, sd);
> +
> +        mi = e_menu_item_new(subm);
> +        e_menu_item_label_set(mi, _("Set overlay..."));
> +        e_menu_item_callback_set(mi, _e_fm2_view_menu_set_overlay_cb, sd);
> +     }
> +}
> +
> +static void
>  _e_fm2_view_menu_grid_icons_cb(void *data, E_Menu *m, E_Menu_Item *mi)
>  {
>     E_Fm2_Smart_Data *sd = data;
> @@ -8279,6 +8330,181 @@
>  }
> 
>  static void
> +_e_fm2_view_image_sel(E_Fm2_Smart_Data *sd, const char *title,
> +                      void (*ok_cb) (void *data, E_Dialog *dia),
> +                      void (*clear_cb) (void *data, E_Dialog *dia))
> +{
> +   E_Manager *man;
> +   E_Container *con;
> +   E_Dialog *dia;
> +   Evas_Object *o;
> +   Evas_Coord w, h;
> +
> +   man = e_manager_current_get();
> +   if (!man) return;
> +   con = e_container_current_get(man);
> +   if (!con) return;
> +
> +   dia = e_dialog_new(con, "E", "_fm2_view_image_select_dialog");
> +   if (!dia) return;
> +   e_dialog_title_set(dia, title);
> +
> +   o = e_widget_fsel_add(dia->win->evas, "/", sd->realpath, NULL,
> NULL, NULL, sd, NULL, sd, 1);
> +   evas_object_show(o);
> +   e_widget_min_size_get(o, &w, &h);
> +   e_dialog_content_set(dia, o, w, h);
> +   dia->data = o;
> +
> +   e_dialog_button_add(dia, _("OK"), NULL, ok_cb, sd);
> +   e_dialog_button_add(dia, _("Clear"), NULL, clear_cb, sd);
> +   e_dialog_button_add(dia, _("Cancel"), NULL,
> _e_fm2_view_image_sel_close, sd);
> +   e_dialog_resizable_set(dia, 1);
> +   e_win_centered_set(dia->win, 1);
> +   e_dialog_show(dia);
> +
> +   sd->image_dialog = dia;
> +}
> +
> +static void
> +_e_fm2_view_image_sel_close(void *data, E_Dialog *dia)
> +{
> +   E_Fm2_Smart_Data *sd;
> +
> +   sd = data;
> +   e_object_del(E_OBJECT(dia));
> +   sd->image_dialog = NULL;
> +}
> +
> +static void
> +_custom_file_key_set(E_Fm2_Smart_Data *sd, const char *key, const char
> *value) +{
> +   Efreet_Desktop *ef;
> +   char buf[PATH_MAX];
> +   int len;
> +
> +   snprintf(buf, sizeof(buf), "%s/.directory.desktop", sd->realpath);
> +   ef = efreet_desktop_new(buf);
> +   if (!ef)
> +     {
> +        ef = efreet_desktop_empty_new(buf);
> +        if (!ef) return;
> +        ef->type = EFREET_DESKTOP_TYPE_DIRECTORY;
> +        ef->name = strdup("Directory look and feel");
> +     }
> +
> +   len = strlen(sd->realpath);
> +   if (!strncmp(value, sd->realpath, len))
> +      efreet_desktop_x_field_set(ef, key, value + len + 1);
> +   else
> +      efreet_desktop_x_field_set(ef, key, value);
> +
> +   efreet_desktop_save(ef);
> +   efreet_desktop_free(ef);
> +}
> +
> +static void
> +_custom_file_key_del(E_Fm2_Smart_Data *sd, const char *key)
> +{
> +   Efreet_Desktop *ef;
> +   char buf[PATH_MAX];
> +
> +   snprintf(buf, sizeof(buf), "%s/.directory.desktop", sd->realpath);
> +   ef = efreet_desktop_new(buf);
> +   if (!ef) return;
> +
> +   if (efreet_desktop_x_field_del(ef, key))
> +      efreet_desktop_save(ef);
> +
> +   efreet_desktop_free(ef);
> +}
> +
> +static void
> +_set_background_cb(void *data, E_Dialog *dia)
> +{
> +  E_Fm2_Smart_Data *sd;
> +  const char *file;
> +
> +  sd = data;
> +  if (!sd) return;
> +
> +  file = e_widget_fsel_selection_path_get(dia->data);
> +
> +  if (file)
> +     _custom_file_key_set(sd, "X-Enlightenment-Directory-Wallpaper", file);
> +
> +  _e_fm2_view_image_sel_close(data, dia);
> +  evas_object_smart_callback_call(sd->obj, "dir_changed", NULL);
> +}
> +
> +static void
> +_clear_background_cb(void *data, E_Dialog *dia)
> +{
> +   E_Fm2_Smart_Data *sd;
> +
> +   sd = data;
> +   if (!sd) return;
> +
> +   _e_fm2_view_image_sel_close(data, dia);
> +
> +   _custom_file_key_del(sd, "X-Enlightenment-Directory-Wallpaper");
> +   evas_object_smart_callback_call(sd->obj, "dir_changed", NULL);
> +}
> +
> +static void
> +_e_fm2_view_menu_set_background_cb(void *data, E_Menu *m, E_Menu_Item *mi)
> +{
> +   E_Fm2_Smart_Data *sd;
> +
> +   sd = data;
> +   if (sd->image_dialog) return;
> +
> +   _e_fm2_view_image_sel(sd, _("Set background..."),
> _set_background_cb, _clear_background_cb);
> +}
> +
> +static void
> +_set_overlay_cb(void *data, E_Dialog *dia)
> +{
> +  E_Fm2_Smart_Data *sd;
> +  const char *file;
> +
> +  sd = data;
> +  if (!sd) return;
> +
> +  file = e_widget_fsel_selection_path_get(dia->data);
> +
> +  if (file)
> +     _custom_file_key_set(sd, "X-Enlightenment-Directory-Overlay", file);
> +
> +  _e_fm2_view_image_sel_close(data, dia);
> +  evas_object_smart_callback_call(sd->obj, "dir_changed", NULL);
> +}
> +
> +static void
> +_clear_overlay_cb(void *data, E_Dialog *dia)
> +{
> +   E_Fm2_Smart_Data *sd;
> +
> +   sd = data;
> +   if (!sd) return;
> +
> +   _e_fm2_view_image_sel_close(data, dia);
> +
> +   _custom_file_key_del(sd, "X-Enlightenment-Directory-Overlay");
> +   evas_object_smart_callback_call(sd->obj, "dir_changed", NULL);
> +}
> +
> +static void
> +_e_fm2_view_menu_set_overlay_cb(void *data, E_Menu *m, E_Menu_Item *mi)
> +{
> +   E_Fm2_Smart_Data *sd;
> +
> +   sd = data;
> +   if (sd->image_dialog) return;
> +
> +   _e_fm2_view_image_sel(sd, _("Set overlay..."), _set_overlay_cb,
> _clear_overlay_cb);
> +}
> +
> +static void
>  _e_fm2_refresh(void *data, E_Menu *m, E_Menu_Item *mi)
>  {
>     E_Fm2_Smart_Data *sd;
> Index: e/src/bin/e_icon.c
> ===================================================================
> --- e/src/bin/e_icon.c        (revision 40530)
> +++ e/src/bin/e_icon.c        (working copy)
> @@ -27,6 +27,8 @@
>  static void _e_icon_smart_color_set(Evas_Object *obj, int r, int g,
> int b, int a);
>  static void _e_icon_smart_clip_set(Evas_Object *obj, Evas_Object * clip);
>  static void _e_icon_smart_clip_unset(Evas_Object *obj);
> +static void _e_icon_obj_prepare(Evas_Object *obj, E_Smart_Data *sd);
> +static void _e_icon_preloaded(void *data, Evas *e, Evas_Object *obj,
> void *event_info);
> 
>  /* local subsystem globals */
>  static Evas_Smart *_e_smart = NULL;
> @@ -39,6 +41,21 @@
>     return evas_object_smart_add(evas, _e_smart);
>  }
> 
> +static void
> +_e_icon_obj_prepare(Evas_Object *obj, E_Smart_Data *sd)
> +{
> +   if (!sd->obj) return;
> +
> +   if (!strcmp(evas_object_type_get(sd->obj), "edje"))
> +     {
> +        evas_object_del(sd->obj);
> +        sd->obj = evas_object_image_add(evas_object_evas_get(obj));
> +        evas_object_event_callback_add(sd->obj,
> EVAS_CALLBACK_IMAGE_PRELOADED,
> +                                       _e_icon_preloaded, obj);
> +        evas_object_smart_member_add(sd->obj, obj);
> +     }
> +}
> +
>  EAPI void
>  e_icon_file_set(Evas_Object *obj, const char *file)
>  {
> @@ -47,6 +64,7 @@
>     sd = evas_object_smart_data_get(obj);
>     if (!sd) return;
>     /* smart code here */
> +   _e_icon_obj_prepare(obj, sd);
>     /* FIXME: 64x64 - unhappy about this. use icon size */
>     if (sd->size != 0)
>       evas_object_image_load_size_set(sd->obj, sd->size, sd->size);
> @@ -63,6 +81,7 @@
>     sd = evas_object_smart_data_get(obj);
>     if (!sd) return;
>     /* smart code here */
> +   _e_icon_obj_prepare(obj, sd);
>     if (sd->size != 0)
>       evas_object_image_load_size_set(sd->obj, sd->size, sd->size);
>     evas_object_image_file_set(sd->obj, file, key);
> Index: e/src/modules/fileman/e_fwin.c
> ===================================================================
> --- e/src/modules/fileman/e_fwin.c    (revision 40530)
> +++ e/src/modules/fileman/e_fwin.c    (working copy)
> @@ -432,12 +432,16 @@
>     fwin->pages = eina_list_append(fwin->pages, page);
>     fwin->cur_page = page;
> 
> -   o = edje_object_add(e_win_evas_get(fwin->win));
> +   o = e_icon_add(e_win_evas_get(fwin->win));
> +   e_icon_scale_size_set(o, 0);
> +   e_icon_fill_inside_set(o, 0);
>     edje_object_part_swallow(fwin->bg_obj, "e.swallow.bg", o);
>     evas_object_pass_events_set(o, 1);
>     fwin->under_obj = o;
> 
> -   o = edje_object_add(e_win_evas_get(fwin->win));
> +   o = e_icon_add(e_win_evas_get(fwin->win));
> +   e_icon_scale_size_set(o, 0);
> +   e_icon_fill_inside_set(o, 0);
>     edje_object_part_swallow(e_scrollframe_edje_object_get
> (page->scrollframe_obj), "e.swallow.overlay", o);
>     evas_object_pass_events_set(o, 1);
>     fwin->over_obj = o;
> @@ -1157,7 +1161,7 @@
>     E_Fwin *fwin;
>     E_Fwin_Page *page;
>     Efreet_Desktop *ef;
> -   char buf[PATH_MAX];
> +   char buf[PATH_MAX], *ext;
> 
>     page = data;
>     fwin = page->fwin;
> @@ -1178,20 +1182,43 @@
>       // frees - doesnt just unref.
>       efreet_desktop_free(ef);
>       }
> +   else
> +     {
> +        #define RELEASE_STR(x) if (x) { eina_stringshare_del(x); (x) =
> NULL; }
> +           RELEASE_STR(fwin->wallpaper_file);
> +           RELEASE_STR(fwin->overlay_file);
> +           RELEASE_STR(fwin->scrollframe_file);
> +           RELEASE_STR(fwin->theme_file);
> +        #undef RELEASE_STR
> +     }
>     if (fwin->under_obj)
>       {
>       evas_object_hide(fwin->under_obj);
> -     edje_object_file_set(fwin->under_obj, NULL, NULL);
>       if (fwin->wallpaper_file)
> -       edje_object_file_set(fwin->under_obj, fwin->wallpaper_file,
> "e/desktop/background");
> +       {
> +             ext = strrchr(fwin->wallpaper_file, '.');
> +             if (ext && !strcasecmp(ext, ".edj"))
> +                e_icon_file_edje_set(fwin->under_obj,
> fwin->wallpaper_file, "e/desktop/background");
> +             else
> +                e_icon_file_set(fwin->under_obj, fwin->wallpaper_file);
> +       }
> +     else
> +          e_icon_file_edje_set(fwin->under_obj, NULL, NULL);
>       evas_object_show(fwin->under_obj);
>       }
>     if (fwin->over_obj)
>       {
>       evas_object_hide(fwin->over_obj);
> -     edje_object_file_set(fwin->over_obj, NULL, NULL);
>       if (fwin->overlay_file)
> -       edje_object_file_set(fwin->over_obj, fwin->overlay_file,
> "e/desktop/background");
> +       {
> +             ext = strrchr(fwin->overlay_file, '.');
> +             if (ext && !strcasecmp(ext, ".edj"))
> +            e_icon_file_edje_set(fwin->over_obj, fwin->overlay_file,
> "e/desktop/background");
> +             else
> +               e_icon_file_set(fwin->over_obj, fwin->overlay_file);
> +       }
> +     else
> +          e_icon_file_edje_set(fwin->over_obj, NULL, NULL);
>       evas_object_show(fwin->over_obj);
>       }
>     if (page->scrollframe_obj)
> Index: efreet/src/lib/efreet_desktop.c
> ===================================================================
> --- efreet/src/lib/efreet_desktop.c   (revision 40530)
> +++ efreet/src/lib/efreet_desktop.c   (working copy)
> @@ -429,7 +429,7 @@
>      Efreet_Ini *ini;
>      int ok = 1;
> 
> -    ini = efreet_ini_new(desktop->orig_path);
> +    ini = efreet_ini_new(NULL);
>      efreet_ini_section_add(ini, "Desktop Entry");
>      efreet_ini_section_set(ini, "Desktop Entry");
> 
> @@ -1838,3 +1838,48 @@
>      /* just dup an already absolute buffer */
>      return strdup(path);
>  }
> +
> +EAPI Eina_Bool
> +efreet_desktop_x_field_set(Efreet_Desktop *desktop, const char *key,
> const char *data)
> +{
> +   if (!desktop || strncmp(key, "X-", 2))
> +      return EINA_FALSE;
> +
> +   if (!desktop->x)
> +     desktop->x =
> eina_hash_string_superfast_new(EINA_FREE_CB(eina_stringshare_del));
> +
> +   eina_hash_del(desktop->x, key, NULL);
> +   eina_hash_add(desktop->x, key, eina_stringshare_add(data));
> +
> +   return EINA_TRUE;
> +}
> +
> +EAPI const char *
> +efreet_desktop_x_field_get(Efreet_Desktop *desktop, const char *key)
> +{
> +   const char *ret;
> +
> +   if (!desktop || strncmp(key, "X-", 2))
> +      return NULL;
> +
> +   if (!desktop->x)
> +      return NULL;
> +
> +   ret = eina_hash_find(desktop->x, key);
> +   if (!ret)
> +      return NULL;
> +
> +   return eina_stringshare_add(ret);
> +}
> +
> +EAPI Eina_Bool
> +efreet_desktop_x_field_del(Efreet_Desktop *desktop, const char *key)
> +{
> +   if (!desktop || strncmp(key, "X-", 2))
> +      return EINA_FALSE;
> +
> +   if (!desktop->x)
> +      return EINA_FALSE;
> +
> +   return eina_hash_del(desktop->x, key, NULL);
> +}
> Index: efreet/src/lib/efreet_desktop.h
> ===================================================================
> --- efreet/src/lib/efreet_desktop.h   (revision 40530)
> +++ efreet/src/lib/efreet_desktop.h   (working copy)
> @@ -136,6 +136,10 @@
>  EAPI Eina_List        *efreet_desktop_string_list_parse(const char *string);
>  EAPI char             *efreet_desktop_string_list_join(Eina_List *list);
> 
> +EAPI Eina_Bool         efreet_desktop_x_field_set(Efreet_Desktop
> *desktop, const char *key, const char *data);
> +EAPI const char *      efreet_desktop_x_field_get(Efreet_Desktop
> *desktop, const char *key);
> +EAPI Eina_Bool         efreet_desktop_x_field_del(Efreet_Desktop
> *desktop, const char *key);
> +
>  EAPI void              efreet_desktop_cache_flush(void);
> 
>  /**
> 
> 
> WBR, Sergey.
> 


-- 
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler)    [email protected]


------------------------------------------------------------------------------
Crystal Reports - New Free Runtime and 30 Day Trial
Check out the new simplified licensing option that enables 
unlimited royalty-free distribution of the report engine 
for externally facing server and web deployment. 
http://p.sf.net/sfu/businessobjects
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to