1 #include <Elementary.h>
4 typedef struct _Widget_Data Widget_Data;
13 static const char *widtype = NULL;
15 static const char SIG_CHANGED[] = "changed";
16 static const char SIG_ACTIVATED[] = "activated";
17 static const char SIG_PRESS[] = "press";
18 static const char SIG_LONGPRESSED[] = "longpressed";
19 static const char SIG_CLICKED[] = "clicked";
20 static const char SIG_CLICKED_DOUBLE[] = "clicked,double";
21 static const char SIG_FOCUSED[] = "focused";
22 static const char SIG_UNFOCUSED[] = "unfocused";
23 static const char SIG_SELECTION_PASTE[] = "selection,paste";
24 static const char SIG_SELECTION_COPY[] = "selection,copy";
25 static const char SIG_SELECTION_CUT[] = "selection,cut";
26 static const char SIG_UNPRESSED[] = "unpressed";
27 static const char SIG_FILE_CHOSEN[] = "file,chosen";
28 static const Evas_Smart_Cb_Description _signals[] =
33 {SIG_LONGPRESSED, ""},
35 {SIG_CLICKED_DOUBLE, ""},
38 {SIG_SELECTION_PASTE, ""},
39 {SIG_SELECTION_COPY, ""},
40 {SIG_SELECTION_CUT, ""},
42 {SIG_FILE_CHOSEN, "s"},
46 #define SIG_FWD(name) \
48 _##name##_fwd(void *data, Evas_Object *obj __UNUSED__, void *event_info) \
50 evas_object_smart_callback_call(data, SIG_##name, event_info); \
56 SIG_FWD(CLICKED_DOUBLE)
59 SIG_FWD(SELECTION_PASTE)
60 SIG_FWD(SELECTION_COPY)
61 SIG_FWD(SELECTION_CUT)
65 static void _mirrored_set(Evas_Object *obj, Eina_Bool rtl);
68 _FILE_CHOSEN_fwd(void *data, Evas_Object *obj __UNUSED__, void *event_info)
70 Widget_Data *wd = elm_widget_data_get(data);
71 const char *file = event_info;
72 elm_entry_entry_set(wd->entry, file);
73 evas_object_smart_callback_call(data, SIG_FILE_CHOSEN, event_info);
77 _ACTIVATED_fwd(void *data, Evas_Object *obj __UNUSED__, void *event_info)
79 Widget_Data *wd = elm_widget_data_get(data);
80 const char *file = elm_entry_entry_get(wd->entry);
81 elm_fileselector_button_path_set(wd->button, file);
82 evas_object_smart_callback_call(data, SIG_ACTIVATED, event_info);
86 _del_hook(Evas_Object *obj)
88 Widget_Data *wd = elm_widget_data_get(obj);
93 _sizing_eval(Evas_Object *obj)
95 Widget_Data *wd = elm_widget_data_get(obj);
96 Evas_Coord minw = -1, minh = -1;
98 edje_object_size_min_calc(wd->edje, &minw, &minh);
99 evas_object_size_hint_min_set(obj, minw, minh);
100 evas_object_size_hint_max_set(obj, -1, -1);
104 _elm_fileselector_entry_focus_next_hook(const Evas_Object *obj, Elm_Focus_Direction dir, Evas_Object **next)
106 Widget_Data *wd = elm_widget_data_get(obj);
111 Evas_Object *chain[2];
114 if (dir == ELM_FOCUS_PREVIOUS)
116 chain[0] = wd->button;
117 chain[1] = wd->entry;
119 else if (dir == ELM_FOCUS_NEXT)
121 chain[0] = wd->entry;
122 chain[1] = wd->button;
127 unsigned char i = elm_widget_focus_get(chain[1]);
129 if (elm_widget_focus_next_get(chain[i], dir, next))
134 Evas_Object *to_focus;
135 if (elm_widget_focus_next_get(chain[i], dir, &to_focus))
145 _mirrored_set(Evas_Object *obj, Eina_Bool rtl)
147 Widget_Data *wd = elm_widget_data_get(obj);
149 elm_widget_mirrored_set(wd->button, rtl);
150 edje_object_mirrored_set(wd->edje, rtl);
154 _theme_hook(Evas_Object *obj)
156 Widget_Data *wd = elm_widget_data_get(obj);
157 const char *style = elm_widget_style_get(obj);
161 _elm_widget_mirrored_reload(obj);
162 _mirrored_set(obj, elm_widget_mirrored_get(obj));
164 _elm_theme_object_set(obj, wd->edje, "fileselector_entry", "base", style);
165 if (elm_object_disabled_get(obj))
166 edje_object_signal_emit(wd->edje, "elm,state,disabled", "elm");
168 if (!style) style = "default";
169 snprintf(buf, sizeof(buf), "fileselector_entry/%s", style);
170 elm_widget_style_set(wd->button, buf);
171 elm_widget_style_set(wd->entry, buf);
173 edje_object_part_swallow(obj, "elm.swallow.button", wd->button);
174 edje_object_part_swallow(obj, "elm.swallow.entry", wd->entry);
176 edje_object_message_signal_process(wd->edje);
177 edje_object_scale_set
178 (wd->edje, elm_widget_scale_get(obj) * _elm_config->scale);
183 _disable_hook(Evas_Object *obj)
185 Widget_Data *wd = elm_widget_data_get(obj);
186 Eina_Bool val = elm_widget_disabled_get(obj);
189 edje_object_signal_emit(wd->edje, "elm,state,disabled", "elm");
191 edje_object_signal_emit(wd->edje, "elm,state,enabled", "elm");
193 elm_widget_disabled_set(wd->button, val);
194 elm_widget_disabled_set(wd->entry, val);
198 _changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
204 _elm_fileselector_entry_button_label_set(Evas_Object *obj, const char *item, const char *label)
206 ELM_CHECK_WIDTYPE(obj, widtype);
207 Widget_Data *wd = elm_widget_data_get(obj);
208 if (item && strcmp(item, "default")) return;
210 elm_object_text_set(wd->button, label);
214 _elm_fileselector_entry_button_label_get(const Evas_Object *obj, const char *item)
216 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
217 Widget_Data *wd = elm_widget_data_get(obj);
218 if (item && strcmp(item, "default")) return NULL;
219 if (!wd) return NULL;
220 return elm_object_text_get(wd->button);
224 elm_fileselector_entry_add(Evas_Object *parent)
230 ELM_WIDGET_STANDARD_SETUP(wd, Widget_Data, parent, e, obj, NULL);
232 ELM_SET_WIDTYPE(widtype, "fileselector_entry");
233 elm_widget_type_set(obj, "fileselector_entry");
234 elm_widget_sub_object_add(parent, obj);
235 elm_widget_data_set(obj, wd);
236 elm_widget_del_hook_set(obj, _del_hook);
237 elm_widget_disable_hook_set(obj, _disable_hook);
238 elm_widget_focus_next_hook_set(obj, _elm_fileselector_entry_focus_next_hook);
239 elm_widget_can_focus_set(obj, EINA_FALSE);
240 elm_widget_theme_hook_set(obj, _theme_hook);
241 elm_widget_text_set_hook_set(obj, _elm_fileselector_entry_button_label_set);
242 elm_widget_text_get_hook_set(obj, _elm_fileselector_entry_button_label_get);
244 wd->edje = edje_object_add(e);
245 _elm_theme_object_set(obj, wd->edje, "fileselector_entry", "base", "default");
246 elm_widget_resize_object_set(obj, wd->edje);
248 wd->button = elm_fileselector_button_add(obj);
249 elm_widget_mirrored_automatic_set(wd->button, EINA_FALSE);
250 ELM_SET_WIDTYPE(widtype, "fileselector_entry");
251 elm_widget_style_set(wd->button, "fileselector_entry/default");
252 edje_object_part_swallow(wd->edje, "elm.swallow.button", wd->button);
253 elm_widget_sub_object_add(obj, wd->button);
254 evas_object_event_callback_add
255 (wd->button, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj);
256 elm_fileselector_button_expandable_set(wd->button,
257 _elm_config->fileselector_expand_enable);
259 #define SIG_FWD(name) \
260 evas_object_smart_callback_add(wd->button, SIG_##name, _##name##_fwd, obj)
263 SIG_FWD(FILE_CHOSEN);
266 wd->entry = elm_entry_add(obj);
267 elm_entry_scrollable_set(wd->entry, EINA_TRUE);
268 elm_widget_mirrored_automatic_set(wd->entry, EINA_FALSE);
269 elm_widget_style_set(wd->entry, "fileselector_entry/default");
270 elm_entry_single_line_set(wd->entry, EINA_TRUE);
271 elm_entry_editable_set(wd->entry, EINA_TRUE);
272 edje_object_part_swallow(wd->edje, "elm.swallow.entry", wd->entry);
273 elm_widget_sub_object_add(obj, wd->entry);
274 evas_object_event_callback_add
275 (wd->entry, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj);
277 #define SIG_FWD(name) \
278 evas_object_smart_callback_add(wd->entry, SIG_##name, _##name##_fwd, obj)
282 SIG_FWD(LONGPRESSED);
284 SIG_FWD(CLICKED_DOUBLE);
287 SIG_FWD(SELECTION_PASTE);
288 SIG_FWD(SELECTION_COPY);
289 SIG_FWD(SELECTION_CUT);
292 _mirrored_set(obj, elm_widget_mirrored_get(obj));
295 // TODO: convert Elementary to subclassing of Evas_Smart_Class
296 // TODO: and save some bytes, making descriptions per-class and not instance!
297 evas_object_smart_callbacks_descriptions_set(obj, _signals);
302 elm_fileselector_entry_button_label_set(Evas_Object *obj, const char *label)
304 _elm_fileselector_entry_button_label_set(obj, NULL, label);
308 elm_fileselector_entry_button_label_get(const Evas_Object *obj)
310 return _elm_fileselector_entry_button_label_get(obj, NULL);
314 elm_fileselector_entry_selected_set(Evas_Object *obj, const char *path)
316 ELM_CHECK_WIDTYPE(obj, widtype);
317 Widget_Data *wd = elm_widget_data_get(obj);
319 elm_fileselector_button_path_set(wd->button, path);
323 elm_fileselector_entry_selected_get(const Evas_Object *obj)
325 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
326 Widget_Data *wd = elm_widget_data_get(obj);
327 if (!wd) return NULL;
328 return elm_fileselector_button_path_get(wd->button);
332 elm_fileselector_entry_window_title_set(Evas_Object *obj, const char *title)
334 ELM_CHECK_WIDTYPE(obj, widtype);
335 Widget_Data *wd = elm_widget_data_get(obj);
337 elm_fileselector_button_window_title_set(wd->button, title);
341 elm_fileselector_entry_window_title_get(const Evas_Object *obj)
343 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
344 Widget_Data *wd = elm_widget_data_get(obj);
345 if (!wd) return NULL;
346 return elm_fileselector_button_window_title_get(wd->button);
350 elm_fileselector_entry_window_size_set(Evas_Object *obj, Evas_Coord width, Evas_Coord height)
352 ELM_CHECK_WIDTYPE(obj, widtype);
353 Widget_Data *wd = elm_widget_data_get(obj);
355 elm_fileselector_button_window_size_set(wd->button, width, height);
359 elm_fileselector_entry_window_size_get(const Evas_Object *obj, Evas_Coord *width, Evas_Coord *height)
361 ELM_CHECK_WIDTYPE(obj, widtype);
362 Widget_Data *wd = elm_widget_data_get(obj);
364 elm_fileselector_button_window_size_get(wd->button, width, height);
368 elm_fileselector_entry_path_set(Evas_Object *obj, const char *path)
370 ELM_CHECK_WIDTYPE(obj, widtype);
371 Widget_Data *wd = elm_widget_data_get(obj);
373 elm_fileselector_button_path_set(wd->button, path);
374 elm_entry_entry_set(wd->entry, path);
378 elm_fileselector_entry_path_get(const Evas_Object *obj)
380 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
381 Widget_Data *wd = elm_widget_data_get(obj);
382 if (!wd) return NULL;
383 return elm_entry_entry_get(wd->entry);
387 elm_fileselector_entry_expandable_set(Evas_Object *obj, Eina_Bool value)
389 ELM_CHECK_WIDTYPE(obj, widtype);
390 Widget_Data *wd = elm_widget_data_get(obj);
392 elm_fileselector_button_expandable_set(wd->button, value);
396 elm_fileselector_entry_expandable_get(const Evas_Object *obj)
398 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
399 Widget_Data *wd = elm_widget_data_get(obj);
400 if (!wd) return EINA_FALSE;
401 return elm_fileselector_button_expandable_get(wd->button);
405 elm_fileselector_entry_folder_only_set(Evas_Object *obj, Eina_Bool value)
407 ELM_CHECK_WIDTYPE(obj, widtype);
408 Widget_Data *wd = elm_widget_data_get(obj);
410 elm_fileselector_button_folder_only_set(wd->button, value);
414 elm_fileselector_entry_folder_only_get(const Evas_Object *obj)
416 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
417 Widget_Data *wd = elm_widget_data_get(obj);
418 if (!wd) return EINA_FALSE;
419 return elm_fileselector_button_folder_only_get(wd->button);
423 elm_fileselector_entry_is_save_set(Evas_Object *obj, Eina_Bool value)
425 ELM_CHECK_WIDTYPE(obj, widtype);
426 Widget_Data *wd = elm_widget_data_get(obj);
428 elm_fileselector_button_is_save_set(wd->button, value);
432 elm_fileselector_entry_is_save_get(const Evas_Object *obj)
434 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
435 Widget_Data *wd = elm_widget_data_get(obj);
436 if (!wd) return EINA_FALSE;
437 return elm_fileselector_button_is_save_get(wd->button);
441 elm_fileselector_entry_inwin_mode_set(Evas_Object *obj, Eina_Bool value)
443 ELM_CHECK_WIDTYPE(obj, widtype);
444 Widget_Data *wd = elm_widget_data_get(obj);
446 elm_fileselector_button_inwin_mode_set(wd->button, value);
450 elm_fileselector_entry_inwin_mode_get(const Evas_Object *obj)
452 ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
453 Widget_Data *wd = elm_widget_data_get(obj);
454 if (!wd) return EINA_FALSE;
455 return elm_fileselector_button_inwin_mode_get(wd->button);
459 elm_fileselector_entry_button_icon_set(Evas_Object *obj, Evas_Object *icon)
461 ELM_CHECK_WIDTYPE(obj, widtype);
462 Widget_Data *wd = elm_widget_data_get(obj);
464 elm_fileselector_button_icon_set(wd->button, icon);
468 elm_fileselector_entry_button_icon_get(const Evas_Object *obj)
470 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
471 Widget_Data *wd = elm_widget_data_get(obj);
472 if (!wd) return NULL;
473 return elm_fileselector_button_icon_get(wd->button);
477 elm_fileselector_entry_button_icon_unset(Evas_Object *obj)
479 ELM_CHECK_WIDTYPE(obj, widtype) NULL;
480 Widget_Data *wd = elm_widget_data_get(obj);
481 if (!wd) return NULL;
482 return elm_fileselector_button_icon_unset(wd->button);