static void _label_sliding_change(Evas_Object *obj) { char *plaintxt; int plainlen = 0; ELM_LABEL_DATA_GET(obj, sd); // doesn't support multiline sliding effect if (sd->linewrap) { sd->slidingmode = EINA_FALSE; return; } plaintxt = _elm_util_mkup_to_text (edje_object_part_text_get (ELM_WIDGET_DATA(sd)->resize_obj, "elm.text")); if (plaintxt != NULL) { plainlen = strlen(plaintxt); free(plaintxt); } // too short to slide label if (plainlen < 1) { sd->slidingmode = EINA_TRUE; return; } if (sd->slidingmode) { Edje_Message_Float_Set *msg = alloca(sizeof(Edje_Message_Float_Set) + (sizeof(double))); if (sd->ellipsis) { sd->slidingellipsis = EINA_TRUE; elm_label_ellipsis_set(obj, EINA_FALSE); } msg->count = 1; msg->val[0] = sd->slide_duration; edje_object_message_send (ELM_WIDGET_DATA(sd)->resize_obj, EDJE_MESSAGE_FLOAT_SET, 0, msg); edje_object_signal_emit (ELM_WIDGET_DATA(sd)->resize_obj, "elm,state,slide,start", "elm"); } else { edje_object_signal_emit (ELM_WIDGET_DATA(sd)->resize_obj, "elm,state,slide,stop", "elm"); if (sd->slidingellipsis) { sd->slidingellipsis = EINA_FALSE; elm_label_ellipsis_set(obj, EINA_TRUE); } } }
static void _icon_thumb_finish(Elm_Icon_Smart_Data *sd, Ethumb_Client *ethumbd) { const char *file = NULL, *group = NULL; Eina_Bool ret; elm_image_file_get(ELM_WIDGET_DATA(sd)->obj, &file, &group); file = eina_stringshare_ref(file); group = eina_stringshare_ref(group); ret = _icon_thumb_display(sd); if (!ret && file) { if (!sd->thumb.retry) { _elm_icon_retry = eina_list_append(_elm_icon_retry, sd); sd->thumb.retry = EINA_TRUE; } /* Back to previous image */ elm_image_file_set(ELM_WIDGET_DATA(sd)->obj, file, group); } _icon_thumb_cleanup(ethumbd); eina_stringshare_del(file); eina_stringshare_del(group); }
static void _recalc(void *data) { ELM_LABEL_DATA_GET(data, sd); Evas_Coord minw = -1, minh = -1; Evas_Coord resw; evas_event_freeze(evas_object_evas_get(data)); evas_object_geometry_get (ELM_WIDGET_DATA(sd)->resize_obj, NULL, NULL, &resw, NULL); if (sd->wrap_w > resw) resw = sd->wrap_w; edje_object_size_min_restricted_calc (ELM_WIDGET_DATA(sd)->resize_obj, &minw, &minh, resw, 0); /* This is a hack to workaround the way min size hints are treated. * If the minimum width is smaller than the restricted width, it means * the mininmum doesn't matter. */ if ((minw <= resw) && (minw != sd->wrap_w)) { Evas_Coord ominw = -1; evas_object_size_hint_min_get(data, &ominw, NULL); minw = ominw; } evas_object_size_hint_min_set(data, minw, minh); evas_event_thaw(evas_object_evas_get(data)); evas_event_thaw_eval(evas_object_evas_get(data)); }
static void _elm_label_smart_sizing_eval(Evas_Object *obj) { Evas_Coord minw = -1, minh = -1; Evas_Coord resw, resh; ELM_LABEL_DATA_GET(obj, sd); if (sd->linewrap) { evas_object_geometry_get (ELM_WIDGET_DATA(sd)->resize_obj, NULL, NULL, &resw, &resh); if (resw == sd->lastw) return; sd->lastw = resw; _recalc(obj); } else { evas_event_freeze(evas_object_evas_get(obj)); evas_object_geometry_get (ELM_WIDGET_DATA(sd)->resize_obj, NULL, NULL, &resw, &resh); edje_object_size_min_calc (ELM_WIDGET_DATA(sd)->resize_obj, &minw, &minh); if (sd->wrap_w > 0 && minw > sd->wrap_w) minw = sd->wrap_w; evas_object_size_hint_min_set(obj, minw, minh); evas_event_thaw(evas_object_evas_get(obj)); evas_event_thaw_eval(evas_object_evas_get(obj)); } }
static void _set_month_year(Elm_Calendar_Smart_Data *sd) { char *buf; /* Set selected month */ buf = sd->format_func(&sd->shown_time); if (buf) { elm_layout_text_set(ELM_WIDGET_DATA(sd)->obj, "month_text", buf); free(buf); } else elm_layout_text_set(ELM_WIDGET_DATA(sd)->obj, "month_text", ""); }
// EINA_DEPRECATED static void _text_day_color_update(Elm_Calendar_Smart_Data *sd, int pos) { char emission[32]; switch (sd->day_color[pos]) { case DAY_WEEKDAY: snprintf(emission, sizeof(emission), "cit_%i,weekday", pos); break; case DAY_SATURDAY: snprintf(emission, sizeof(emission), "cit_%i,saturday", pos); break; case DAY_SUNDAY: snprintf(emission, sizeof(emission), "cit_%i,sunday", pos); break; default: return; } elm_layout_signal_emit(ELM_WIDGET_DATA(sd)->obj, emission, "elm"); }
static void _val_set(Evas_Object *obj) { Eina_Bool rtl; double pos; ELM_SLIDER_DATA_GET(obj, sd); if (sd->val_max > sd->val_min) pos = (sd->val - sd->val_min) / (sd->val_max - sd->val_min); else pos = 0.0; if (pos < 0.0) pos = 0.0; else if (pos > 1.0) pos = 1.0; rtl = elm_widget_mirrored_get(obj); if ((!rtl && sd->inverted) || (rtl && ((!sd->horizontal && sd->inverted) || (sd->horizontal && !sd->inverted)))) pos = 1.0 - pos; edje_object_part_drag_value_set (ELM_WIDGET_DATA(sd)->resize_obj, "elm.dragable.slider", pos, pos); }
static void _val_fetch(Evas_Object *obj) { Eina_Bool rtl; double posx = 0.0, posy = 0.0, pos = 0.0, val; ELM_SLIDER_DATA_GET(obj, sd); edje_object_part_drag_value_get (ELM_WIDGET_DATA(sd)->resize_obj, "elm.dragable.slider", &posx, &posy); if (sd->horizontal) pos = posx; else pos = posy; rtl = elm_widget_mirrored_get(obj); if ((!rtl && sd->inverted) || (rtl && ((!sd->horizontal && sd->inverted) || (sd->horizontal && !sd->inverted)))) pos = 1.0 - pos; val = (pos * (sd->val_max - sd->val_min)) + sd->val_min; if (val != sd->val) { sd->val = val; evas_object_smart_callback_call(obj, SIG_CHANGED, NULL); if (sd->delay) ecore_timer_del(sd->delay); sd->delay = ecore_timer_add(0.2, _delay_change, obj); } }
static Eina_Bool _icon_thumb_display(Elm_Icon_Smart_Data *sd) { Eina_Bool ret = EINA_FALSE; if (sd->thumb.format == ETHUMB_THUMB_EET) { int prefix_size; const char **ext, *ptr; static const char *extensions[] = { ".avi", ".mp4", ".ogv", ".mov", ".mpg", ".wmv", NULL }; prefix_size = eina_stringshare_strlen(sd->thumb.file.path) - 4; if (prefix_size >= 0) { ptr = sd->thumb.file.path + prefix_size; for (ext = extensions; *ext; ++ext) if (!strcasecmp(ptr, *ext)) { sd->is_video = EINA_TRUE; break; } } ret = elm_image_file_set (ELM_WIDGET_DATA(sd)->obj, sd->thumb.thumb.path, sd->thumb.thumb.key); sd->is_video = EINA_FALSE; } if (!ret) ret = elm_image_file_set (ELM_WIDGET_DATA(sd)->obj, sd->thumb.thumb.path, sd->thumb.thumb.key); if (ret) evas_object_smart_callback_call (ELM_WIDGET_DATA(sd)->obj, SIG_THUMB_DONE, NULL); else evas_object_smart_callback_call (ELM_WIDGET_DATA(sd)->obj, SIG_THUMB_ERROR, NULL); return ret; }
static inline void _not_today(Elm_Calendar_Smart_Data *sd) { char emission[32]; snprintf(emission, sizeof(emission), "cit_%i,not_today", sd->today_it); elm_layout_signal_emit(ELM_WIDGET_DATA(sd)->obj, emission, "elm"); sd->today_it = -1; }
/* final routine on deletion */ static void _elm_fileselector_smart_del_do(Elm_Fileselector_Smart_Data *sd) { if (sd->path) eina_stringshare_del(sd->path); if (sd->selection) eina_stringshare_del(sd->selection); if (sd->sel_idler) free(ecore_idler_del(sd->sel_idler)); ELM_WIDGET_CLASS(_elm_fileselector_parent_sc)->base.del (ELM_WIDGET_DATA(sd)->obj); }
static void _elm_fileselector_smart_sizing_eval(Evas_Object *obj) { Evas_Coord minw = -1, minh = -1; ELM_FILESELECTOR_DATA_GET(obj, sd); elm_coords_finger_size_adjust(1, &minw, 1, &minh); edje_object_size_min_restricted_calc (ELM_WIDGET_DATA(sd)->resize_obj, &minw, &minh, minw, minh); evas_object_size_hint_min_set(obj, minw, minh); }
static void _elm_bubble_smart_sizing_eval(Evas_Object *obj) { Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1; ELM_BUBBLE_DATA_GET(obj, sd); elm_coords_finger_size_adjust(1, &minw, 1, &minh); edje_object_size_min_restricted_calc (ELM_WIDGET_DATA(sd)->resize_obj, &minw, &minh, minw, minh); evas_object_size_hint_min_set(obj, minw, minh); evas_object_size_hint_max_set(obj, maxw, maxh); }
static void _elm_calendar_smart_sizing_eval(Evas_Object *obj) { Evas_Coord minw = -1, minh = -1; ELM_CALENDAR_DATA_GET(obj, sd); elm_coords_finger_size_adjust(8, &minw, ELM_DAY_LAST, &minh); edje_object_size_min_restricted_calc (ELM_WIDGET_DATA(sd)->resize_obj, &minw, &minh, minw, minh); evas_object_size_hint_min_set(obj, minw, minh); evas_object_size_hint_max_set(obj, -1, -1); }
static Eina_Bool _elm_photo_smart_theme(Evas_Object *obj) { ELM_PHOTO_DATA_GET(obj, sd); if (!ELM_WIDGET_CLASS(_elm_photo_parent_sc)->theme(obj)) return EINA_FALSE; edje_object_mirrored_set (ELM_WIDGET_DATA(sd)->resize_obj, elm_widget_mirrored_get(obj)); elm_widget_theme_object_set (obj, ELM_WIDGET_DATA(sd)->resize_obj, "photo", "base", elm_widget_style_get(obj)); elm_object_scale_set(sd->icon, elm_widget_scale_get(obj)); edje_object_scale_set(ELM_WIDGET_DATA(sd)->resize_obj, elm_widget_scale_get(obj) * elm_config_scale_get()); _sizing_eval(obj); return EINA_TRUE; }
static Eina_Bool _elm_fileselector_button_smart_theme(Evas_Object *obj) { char buf[4096]; const char *style; ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd); style = eina_stringshare_add(elm_widget_style_get(obj)); snprintf(buf, sizeof(buf), "fileselector_button/%s", style); /* file selector button's style has an extra bit */ eina_stringshare_replace(&(ELM_WIDGET_DATA(sd)->style), buf); if (!ELM_WIDGET_CLASS(_elm_fileselector_button_parent_sc)->theme(obj)) return EINA_FALSE; eina_stringshare_replace(&(ELM_WIDGET_DATA(sd)->style), style); eina_stringshare_del(style); return EINA_TRUE; }
static Eina_Bool _elm_label_smart_theme(Evas_Object *obj) { Eina_Bool ret; ELM_LABEL_DATA_GET(obj, sd); evas_event_freeze(evas_object_evas_get(obj)); ret = ELM_WIDGET_CLASS(_elm_label_parent_sc)->theme(obj); if (!ret) goto end; _label_format_set(ELM_WIDGET_DATA(sd)->resize_obj, sd->format); _label_sliding_change(obj); end: evas_event_thaw(evas_object_evas_get(obj)); evas_event_thaw_eval(evas_object_evas_get(obj)); return ret; }
static void _icon_thumb_error(Ethumb_Client *client, void *data) { Elm_Icon_Smart_Data *sd = data; if (EINA_UNLIKELY(!sd->thumb.request)) { ERR("Something odd happened with a thumbnail request"); return; } _icon_pending_request--; sd->thumb.request = NULL; ERR("could not generate thumbnail for %s (key: %s)", sd->thumb.file.path, sd->thumb.file.key); evas_object_smart_callback_call(ELM_WIDGET_DATA(sd)->obj, SIG_THUMB_ERROR, NULL); _icon_thumb_cleanup(client); }
static void _sizing_eval(Evas_Object *obj) { Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1; double scale; ELM_PHOTO_DATA_GET(obj, sd); if (sd->size <= 0) return; scale = (sd->size * elm_widget_scale_get(obj) * elm_config_scale_get()); evas_object_size_hint_min_set(sd->icon, scale, scale); elm_coords_finger_size_adjust(1, &minw, 1, &minh); edje_object_size_min_restricted_calc (ELM_WIDGET_DATA(sd)->resize_obj, &minw, &minh, minw, minh); elm_coords_finger_size_adjust(1, &minw, 1, &minh); maxw = minw; maxh = minh; evas_object_size_hint_min_set(obj, minw, minh); evas_object_size_hint_max_set(obj, maxw, maxh); }
static void _icon_thumb_apply(Elm_Icon_Smart_Data *sd) { Ethumb_Client *ethumbd; int min_size; ethumbd = elm_thumb_ethumb_client_get(); _icon_thumb_stop(sd, ethumbd); if (!sd->thumb.file.path) return; _icon_pending_request++; if (!ethumb_client_file_set (ethumbd, sd->thumb.file.path, sd->thumb.file.key)) return; min_size = _icon_size_min_get(ELM_WIDGET_DATA(sd)->obj); ethumb_client_size_set(ethumbd, min_size, min_size); sd->thumb.request = ethumb_client_thumb_async_get (ethumbd, _icon_thumb_done, _icon_thumb_error, sd); }
static Eina_Bool _elm_fileselector_smart_theme(Evas_Object *obj) { const char *style; const char *data; char buf[1024]; ELM_FILESELECTOR_DATA_GET(obj, sd); if (!ELM_WIDGET_CLASS(_elm_fileselector_parent_sc)->theme(obj)) return EINA_FALSE; style = elm_widget_style_get(obj); _mirrored_set(obj, elm_widget_mirrored_get(obj)); data = edje_object_data_get (ELM_WIDGET_DATA(sd)->resize_obj, "path_separator"); if (data) sd->path_separator = data; else sd->path_separator = "/"; snprintf(buf, sizeof(buf), "fileselector/%s", style); #define SWALLOW(part_name, object_ptn) \ if (object_ptn) \ { \ elm_widget_style_set(object_ptn, buf); \ if (!elm_layout_content_set(obj, part_name, object_ptn)) \ evas_object_hide(object_ptn); \ } SWALLOW("elm.swallow.up", sd->up_button); SWALLOW("elm.swallow.home", sd->home_button); SWALLOW("elm.swallow.spinner", sd->spinner); elm_object_style_set(sd->spinner, "wheel"); if (sd->mode == ELM_FILESELECTOR_LIST) { if (elm_layout_content_set(obj, "elm.swallow.files", sd->files_list)) evas_object_hide(sd->files_grid); else evas_object_hide(sd->files_list); } else { if (elm_layout_content_set(obj, "elm.swallow.files", sd->files_grid)) evas_object_hide(sd->files_list); else evas_object_hide(sd->files_grid); } SWALLOW("elm.swallow.filename", sd->filename_entry); SWALLOW("elm.swallow.path", sd->path_entry); snprintf(buf, sizeof(buf), "fileselector/actions/%s", style); SWALLOW("elm.swallow.cancel", sd->cancel_button); SWALLOW("elm.swallow.ok", sd->ok_button); #undef SWALLOW edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj); elm_layout_sizing_eval(obj); return EINA_TRUE; }
static void _elm_bg_smart_sizing_eval(Evas_Object *obj) { Evas_Coord iw = 0, ih = 0, mw = -1, mh = -1; Evas_Coord bx = 0, by = 0, bw = 0, bh = 0; Evas_Coord fx = 0, fy = 0, fw = 0, fh = 0; Evas_Coord nx = 0, ny = 0, nw = 0, nh = 0; const char *p; ELM_BG_DATA_GET(obj, sd); if ((!sd->img) || (!sd->file)) return; if (((p = strrchr(sd->file, '.'))) && (!strcasecmp(p, ".edj"))) return; /* grab image size */ evas_object_image_size_get(sd->img, &iw, &ih); if ((iw < 1) || (ih < 1)) return; /* grab base object dimensions */ evas_object_geometry_get (ELM_WIDGET_DATA(sd)->resize_obj, &bx, &by, &bw, &bh); /* set some defaults */ nx = bx; ny = by; nw = bw; nh = bh; switch (sd->option) { case ELM_BG_OPTION_CENTER: fw = nw = iw; fh = nh = ih; nx = ((bw - fw) / 2); ny = ((bh - fh) / 2); mw = iw; mh = ih; break; case ELM_BG_OPTION_SCALE: fw = bw; fh = ((ih * fw) / iw); if (fh < bh) { fh = bh; fw = ((iw * fh) / ih); } fx = ((bw - fw) / 2); fy = ((bh - fh) / 2); break; case ELM_BG_OPTION_TILE: fw = iw; fh = ih; break; case ELM_BG_OPTION_STRETCH: default: fw = bw; fh = bh; break; } evas_object_move(sd->img, nx, ny); evas_object_resize(sd->img, nw, nh); evas_object_image_fill_set(sd->img, fx, fy, fw, fh); evas_object_size_hint_min_set(sd->img, mw, mh); evas_object_size_hint_max_set(sd->img, mw, mh); }