1 #include <Elementary.h>
3 #include "elm_widget_fileselector_button.h"
5 EAPI Eo_Op ELM_OBJ_FILESELECTOR_BUTTON_BASE_ID = EO_NOOP;
7 #define MY_CLASS ELM_OBJ_FILESELECTOR_BUTTON_CLASS
9 #define MY_CLASS_NAME "elm_fileselector_button"
11 #define DEFAULT_WINDOW_TITLE "Select a file"
13 static const char SIG_FILE_CHOSEN[] = "file,chosen";
14 static const char SIG_LANG_CHANGED[] = "language,changed";
16 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
17 {SIG_FILE_CHOSEN, "s"},
18 {SIG_LANG_CHANGED, ""},
23 _elm_fileselector_button_smart_translate(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
25 Eina_Bool *ret = va_arg(*list, Eina_Bool *);
26 evas_object_smart_callback_call(obj, SIG_LANG_CHANGED, NULL);
27 if (ret) *ret = EINA_TRUE;
31 _elm_fileselector_button_smart_theme(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
33 Eina_Bool *ret = va_arg(*list, Eina_Bool *);
34 if (ret) *ret = EINA_FALSE;
40 Elm_Widget_Smart_Data *wd = eo_data_scope_get(obj, ELM_OBJ_WIDGET_CLASS);
42 style = eina_stringshare_add(elm_widget_style_get(obj));
44 snprintf(buf, sizeof(buf), "fileselector_button/%s", style);
46 /* file selector button's style has an extra bit */
47 eina_stringshare_replace(&(wd->style), buf);
49 eo_do_super(obj, MY_CLASS, elm_wdg_theme(&int_ret));
52 eina_stringshare_replace(&(wd->style), style);
54 eina_stringshare_del(style);
56 if (ret) *ret = EINA_TRUE;
60 _selection_done(void *data,
61 Evas_Object *obj __UNUSED__,
64 Elm_Fileselector_Button_Smart_Data *sd = data;
65 const char *file = event_info;
68 if (file) eina_stringshare_replace(&sd->fsd.path, file);
75 evas_object_smart_callback_call
76 (sd->obj, SIG_FILE_CHOSEN, (void *)file);
80 _new_window_add(Elm_Fileselector_Button_Smart_Data *sd)
82 Evas_Object *win, *bg;
84 win = elm_win_add(NULL, "fileselector_button", ELM_WIN_DIALOG_BASIC);
85 elm_win_title_set(win, sd->window_title);
86 elm_win_autodel_set(win, EINA_TRUE);
87 evas_object_smart_callback_add(win, "delete,request", _selection_done, sd);
90 elm_win_resize_object_add(win, bg);
91 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
94 evas_object_resize(win, sd->w, sd->h);
99 _parent_win_get(Evas_Object *obj)
101 while ((obj) && (strcmp(elm_widget_type_get(obj), "elm_win")))
102 obj = elm_object_parent_widget_get(obj);
108 _activate(Elm_Fileselector_Button_Smart_Data *sd)
110 Eina_Bool is_inwin = EINA_FALSE;
116 sd->fsw = _parent_win_get(sd->obj);
119 sd->fsw = _new_window_add(sd);
122 sd->fsw = elm_win_inwin_add(sd->fsw);
123 is_inwin = EINA_TRUE;
127 sd->fsw = _new_window_add(sd);
129 sd->fs = elm_fileselector_add(sd->fsw);
130 elm_widget_mirrored_set
131 (sd->fs, elm_widget_mirrored_get(sd->obj));
132 elm_widget_mirrored_automatic_set(sd->fs, EINA_FALSE);
133 elm_fileselector_expandable_set(sd->fs, sd->fsd.expandable);
134 elm_fileselector_folder_only_set(sd->fs, sd->fsd.folder_only);
135 elm_fileselector_is_save_set(sd->fs, sd->fsd.is_save);
136 elm_fileselector_selected_set(sd->fs, sd->fsd.path);
137 evas_object_size_hint_weight_set
138 (sd->fs, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
139 evas_object_size_hint_align_set(sd->fs, EVAS_HINT_FILL, EVAS_HINT_FILL);
140 evas_object_smart_callback_add(sd->fs, "done", _selection_done, sd);
141 evas_object_show(sd->fs);
145 elm_win_inwin_content_set(sd->fsw, sd->fs);
146 elm_win_inwin_activate(sd->fsw);
150 elm_win_resize_object_add(sd->fsw, sd->fs);
151 evas_object_show(sd->fsw);
156 _button_clicked(void *data,
157 Evas_Object *obj __UNUSED__,
158 void *event_info __UNUSED__)
164 _elm_fileselector_button_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
166 Elm_Fileselector_Button_Smart_Data *priv = _pd;
168 eo_do_super(obj, MY_CLASS, evas_obj_smart_add());
170 priv->window_title = eina_stringshare_add(DEFAULT_WINDOW_TITLE);
171 if (getenv("HOME")) priv->fsd.path = eina_stringshare_add(getenv("HOME"));
172 else priv->fsd.path = eina_stringshare_add("/");
174 priv->fsd.expandable = _elm_config->fileselector_expand_enable;
175 priv->inwin_mode = _elm_config->inwin_dialogs_enable;
179 elm_widget_mirrored_automatic_set(obj, EINA_FALSE);
181 evas_object_smart_callback_add(obj, "clicked", _button_clicked, priv);
183 eo_do(obj, elm_wdg_theme(NULL));
184 elm_widget_can_focus_set(obj, EINA_TRUE);
188 _elm_fileselector_button_smart_del(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
192 Elm_Fileselector_Button_Smart_Data *sd = _pd;
194 if (sd->window_title) eina_stringshare_del(sd->window_title);
195 if (sd->fsd.path) eina_stringshare_del(sd->fsd.path);
198 win = evas_object_data_del(obj, "win");
199 evas_object_del(win);
202 eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
206 _elm_fileselector_button_smart_admits_autorepeat_get(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list)
208 Eina_Bool *ret = va_arg(*list, Eina_Bool *);
213 elm_fileselector_button_add(Evas_Object *parent)
215 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
216 Evas_Object *obj = eo_add(MY_CLASS, parent);
222 _constructor(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
224 Elm_Fileselector_Button_Smart_Data *sd = _pd;
227 eo_do_super(obj, MY_CLASS, eo_constructor());
229 evas_obj_type_set(MY_CLASS_NAME),
230 evas_obj_smart_callbacks_descriptions_set(_smart_callbacks, NULL));
232 elm_widget_sub_object_add(eo_parent_get(obj), obj);
236 elm_fileselector_button_window_title_set(Evas_Object *obj,
239 ELM_FILESELECTOR_BUTTON_CHECK(obj);
240 eo_do(obj, elm_obj_fileselector_button_window_title_set(title));
244 _window_title_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
246 const char *title = va_arg(*list, const char *);
247 Elm_Fileselector_Button_Smart_Data *sd = _pd;
249 eina_stringshare_replace(&sd->window_title, title);
251 if (sd->fsw) elm_win_title_set(sd->fsw, sd->window_title);
255 elm_fileselector_button_window_title_get(const Evas_Object *obj)
257 ELM_FILESELECTOR_BUTTON_CHECK(obj) NULL;
258 const char *ret = NULL;
259 eo_do((Eo *) obj, elm_obj_fileselector_button_window_title_get(&ret));
264 _window_title_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
266 const char **ret = va_arg(*list, const char **);
267 Elm_Fileselector_Button_Smart_Data *sd = _pd;
269 *ret = sd->window_title;
273 elm_fileselector_button_window_size_set(Evas_Object *obj,
277 ELM_FILESELECTOR_BUTTON_CHECK(obj);
278 eo_do(obj, elm_obj_fileselector_button_window_size_set(width, height));
282 _window_size_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
284 Evas_Coord width = va_arg(*list, Evas_Coord);
285 Evas_Coord height = va_arg(*list, Evas_Coord);
286 Elm_Fileselector_Button_Smart_Data *sd = _pd;
291 if (sd->fsw) evas_object_resize(sd->fsw, sd->w, sd->h);
295 elm_fileselector_button_window_size_get(const Evas_Object *obj,
299 ELM_FILESELECTOR_BUTTON_CHECK(obj);
300 eo_do((Eo *) obj, elm_obj_fileselector_button_window_size_get(width, height));
304 _window_size_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
306 Evas_Coord *width = va_arg(*list, Evas_Coord *);
307 Evas_Coord *height = va_arg(*list, Evas_Coord *);
308 Elm_Fileselector_Button_Smart_Data *sd = _pd;
310 if (width) *width = sd->w;
311 if (height) *height = sd->h;
315 elm_fileselector_button_path_set(Evas_Object *obj,
318 ELM_FILESELECTOR_BUTTON_CHECK(obj);
319 eo_do(obj, elm_obj_fileselector_button_path_set(path));
323 _path_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
325 const char *path = va_arg(*list, const char *);
326 Elm_Fileselector_Button_Smart_Data *sd = _pd;
328 eina_stringshare_replace(&sd->fsd.path, path);
330 if (sd->fs) elm_fileselector_selected_set(sd->fs, sd->fsd.path);
334 elm_fileselector_button_path_get(const Evas_Object *obj)
336 ELM_FILESELECTOR_BUTTON_CHECK(obj) NULL;
337 const char *ret = NULL;
338 eo_do((Eo *) obj, elm_obj_fileselector_button_path_get(&ret));
343 _path_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
345 const char **ret = va_arg(*list, const char **);
346 Elm_Fileselector_Button_Smart_Data *sd = _pd;
352 elm_fileselector_button_expandable_set(Evas_Object *obj,
355 ELM_FILESELECTOR_BUTTON_CHECK(obj);
356 eo_do(obj, elm_obj_fileselector_button_expandable_set(value));
360 _expandable_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
362 Eina_Bool value = va_arg(*list, int);
363 Elm_Fileselector_Button_Smart_Data *sd = _pd;
365 sd->fsd.expandable = value;
367 if (sd->fs) elm_fileselector_expandable_set(sd->fs, sd->fsd.expandable);
371 elm_fileselector_button_expandable_get(const Evas_Object *obj)
373 ELM_FILESELECTOR_BUTTON_CHECK(obj) EINA_FALSE;
374 Eina_Bool ret = EINA_FALSE;
375 eo_do((Eo *) obj, elm_obj_fileselector_button_expandable_get(&ret));
380 _expandable_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
382 Eina_Bool *ret = va_arg(*list, Eina_Bool *);
383 Elm_Fileselector_Button_Smart_Data *sd = _pd;
385 *ret = sd->fsd.expandable;
389 elm_fileselector_button_folder_only_set(Evas_Object *obj,
392 ELM_FILESELECTOR_BUTTON_CHECK(obj);
393 eo_do(obj, elm_obj_fileselector_button_folder_only_set(value));
397 _folder_only_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
399 Eina_Bool value = va_arg(*list, int);
400 Elm_Fileselector_Button_Smart_Data *sd = _pd;
402 sd->fsd.folder_only = value;
404 if (sd->fs) elm_fileselector_folder_only_set(sd->fs, sd->fsd.folder_only);
408 elm_fileselector_button_folder_only_get(const Evas_Object *obj)
410 ELM_FILESELECTOR_BUTTON_CHECK(obj) EINA_FALSE;
411 Eina_Bool ret = EINA_FALSE;
412 eo_do((Eo *) obj, elm_obj_fileselector_button_folder_only_get(&ret));
417 _folder_only_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
419 Eina_Bool *ret = va_arg(*list, Eina_Bool *);
420 Elm_Fileselector_Button_Smart_Data *sd = _pd;
422 *ret = sd->fsd.folder_only;
426 elm_fileselector_button_is_save_set(Evas_Object *obj,
429 ELM_FILESELECTOR_BUTTON_CHECK(obj);
430 eo_do(obj, elm_obj_fileselector_button_is_save_set(value));
434 _is_save_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
436 Eina_Bool value = va_arg(*list, int);
437 Elm_Fileselector_Button_Smart_Data *sd = _pd;
439 sd->fsd.is_save = value;
441 if (sd->fs) elm_fileselector_is_save_set(sd->fs, sd->fsd.is_save);
445 elm_fileselector_button_is_save_get(const Evas_Object *obj)
447 ELM_FILESELECTOR_BUTTON_CHECK(obj) EINA_FALSE;
448 Eina_Bool ret = EINA_FALSE;
449 eo_do((Eo *) obj, elm_obj_fileselector_button_is_save_get(&ret));
454 _is_save_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
456 Eina_Bool *ret = va_arg(*list, Eina_Bool *);
457 Elm_Fileselector_Button_Smart_Data *sd = _pd;
459 *ret = sd->fsd.is_save;
463 elm_fileselector_button_inwin_mode_set(Evas_Object *obj,
466 ELM_FILESELECTOR_BUTTON_CHECK(obj);
467 eo_do(obj, elm_obj_fileselector_button_inwin_mode_set(value));
471 _inwin_mode_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
473 Eina_Bool value = va_arg(*list, int);
474 Elm_Fileselector_Button_Smart_Data *sd = _pd;
476 sd->inwin_mode = value;
480 elm_fileselector_button_inwin_mode_get(const Evas_Object *obj)
482 ELM_FILESELECTOR_BUTTON_CHECK(obj) EINA_FALSE;
483 Eina_Bool ret = EINA_FALSE;
484 eo_do((Eo *) obj, elm_obj_fileselector_button_inwin_mode_get(&ret));
489 _inwin_mode_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
491 Eina_Bool *ret = va_arg(*list, Eina_Bool *);
492 Elm_Fileselector_Button_Smart_Data *sd = _pd;
494 *ret = sd->inwin_mode;
498 _class_constructor(Eo_Class *klass)
500 const Eo_Op_Func_Description func_desc[] = {
501 EO_OP_FUNC(EO_BASE_ID(EO_BASE_SUB_ID_CONSTRUCTOR), _constructor),
502 EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_ADD), _elm_fileselector_button_smart_add),
503 EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_DEL), _elm_fileselector_button_smart_del),
505 EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_THEME), _elm_fileselector_button_smart_theme),
506 EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_TRANSLATE), _elm_fileselector_button_smart_translate),
508 EO_OP_FUNC(ELM_OBJ_BUTTON_ID(ELM_OBJ_BUTTON_SUB_ID_ADMITS_AUTOREPEAT_GET), _elm_fileselector_button_smart_admits_autorepeat_get),
510 EO_OP_FUNC(ELM_OBJ_FILESELECTOR_BUTTON_ID(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_WINDOW_TITLE_SET), _window_title_set),
511 EO_OP_FUNC(ELM_OBJ_FILESELECTOR_BUTTON_ID(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_WINDOW_TITLE_GET), _window_title_get),
512 EO_OP_FUNC(ELM_OBJ_FILESELECTOR_BUTTON_ID(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_WINDOW_SIZE_SET), _window_size_set),
513 EO_OP_FUNC(ELM_OBJ_FILESELECTOR_BUTTON_ID(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_WINDOW_SIZE_GET), _window_size_get),
514 EO_OP_FUNC(ELM_OBJ_FILESELECTOR_BUTTON_ID(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_PATH_SET), _path_set),
515 EO_OP_FUNC(ELM_OBJ_FILESELECTOR_BUTTON_ID(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_PATH_GET), _path_get),
516 EO_OP_FUNC(ELM_OBJ_FILESELECTOR_BUTTON_ID(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_EXPANDABLE_SET), _expandable_set),
517 EO_OP_FUNC(ELM_OBJ_FILESELECTOR_BUTTON_ID(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_EXPANDABLE_GET), _expandable_get),
518 EO_OP_FUNC(ELM_OBJ_FILESELECTOR_BUTTON_ID(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_FOLDER_ONLY_SET), _folder_only_set),
519 EO_OP_FUNC(ELM_OBJ_FILESELECTOR_BUTTON_ID(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_FOLDER_ONLY_GET), _folder_only_get),
520 EO_OP_FUNC(ELM_OBJ_FILESELECTOR_BUTTON_ID(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_IS_SAVE_SET), _is_save_set),
521 EO_OP_FUNC(ELM_OBJ_FILESELECTOR_BUTTON_ID(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_IS_SAVE_GET), _is_save_get),
522 EO_OP_FUNC(ELM_OBJ_FILESELECTOR_BUTTON_ID(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_INWIN_MODE_SET), _inwin_mode_set),
523 EO_OP_FUNC(ELM_OBJ_FILESELECTOR_BUTTON_ID(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_INWIN_MODE_GET), _inwin_mode_get),
526 eo_class_funcs_set(klass, func_desc);
528 evas_smart_legacy_type_register(MY_CLASS_NAME, klass);
531 static const Eo_Op_Description op_desc[] = {
532 EO_OP_DESCRIPTION(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_WINDOW_TITLE_SET, "Set the title for a given file selector button widget's window."),
533 EO_OP_DESCRIPTION(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_WINDOW_TITLE_GET, "Get the title for a given file selector button widget's window."),
534 EO_OP_DESCRIPTION(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_WINDOW_SIZE_SET, "Set the size of a given file selector button widget's window, holding the file selector itself."),
535 EO_OP_DESCRIPTION(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_WINDOW_SIZE_GET, "Get the size of a given file selector button widget's window, holding the file selector itself."),
536 EO_OP_DESCRIPTION(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_PATH_SET, "Set the initial file system path for a given file selector button widget."),
537 EO_OP_DESCRIPTION(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_PATH_GET, "Get the initial file system path set for a given file selector button widget."),
538 EO_OP_DESCRIPTION(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_EXPANDABLE_SET, "Enable/disable a tree view in the given file selector button widget's internal file selector."),
539 EO_OP_DESCRIPTION(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_EXPANDABLE_GET, "Get whether tree view is enabled for the given file selector button widget's internal file selector."),
540 EO_OP_DESCRIPTION(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_FOLDER_ONLY_SET, "Set whether a given file selector button widget's internal file selector is to display folders only or the directory contents, as well."),
541 EO_OP_DESCRIPTION(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_FOLDER_ONLY_GET, "Get whether a given file selector button widget's internal file selector is displaying folders only or the directory contents, as well."),
542 EO_OP_DESCRIPTION(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_IS_SAVE_SET, "Enable/disable the file name entry box where the user can type in a name for a file, in a given file selector button widget's internal file selector."),
543 EO_OP_DESCRIPTION(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_IS_SAVE_GET, "Get whether the given file selector button widget's internal file selector is in 'saving dialog' mode."),
544 EO_OP_DESCRIPTION(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_INWIN_MODE_SET, "Set whether a given file selector button widget's internal file selector will raise an Elementary 'inner window', instead of a dedicated Elementary window."),
545 EO_OP_DESCRIPTION(ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_INWIN_MODE_GET, "Get whether a given file selector button widget's internal file selector will raise an Elementary 'inner window', instead of a dedicated Elementary window."),
546 EO_OP_DESCRIPTION_SENTINEL
549 static const Eo_Class_Description class_desc = {
552 EO_CLASS_TYPE_REGULAR,
553 EO_CLASS_DESCRIPTION_OPS(&ELM_OBJ_FILESELECTOR_BUTTON_BASE_ID, op_desc, ELM_OBJ_FILESELECTOR_BUTTON_SUB_ID_LAST),
555 sizeof(Elm_Fileselector_Button_Smart_Data),
560 EO_DEFINE_CLASS(elm_obj_fileselector_button_class_get, &class_desc, ELM_OBJ_BUTTON_CLASS, NULL);