1 #include <Elementary.h>
3 #include "elm_widget_fileselector_button.h"
5 EAPI const char ELM_FILESELECTOR_BUTTON_SMART_NAME[] =
6 "elm_fileselector_button";
8 #define DEFAULT_WINDOW_TITLE "Select a file"
10 static const char SIG_FILE_CHOSEN[] = "file,chosen";
11 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
12 {SIG_FILE_CHOSEN, "s"},
16 EVAS_SMART_SUBCLASS_NEW
17 (ELM_FILESELECTOR_BUTTON_SMART_NAME, _elm_fileselector_button,
18 Elm_Fileselector_Button_Smart_Class, Elm_Button_Smart_Class,
19 elm_button_smart_class_get, _smart_callbacks);
22 _elm_fileselector_button_smart_theme(Evas_Object *obj)
27 ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
29 style = eina_stringshare_add(elm_widget_style_get(obj));
31 snprintf(buf, sizeof(buf), "fileselector_button/%s", style);
33 /* file selector button's style has an extra bit */
34 eina_stringshare_replace(&(ELM_WIDGET_DATA(sd)->style), buf);
36 if (!ELM_WIDGET_CLASS(_elm_fileselector_button_parent_sc)->theme(obj))
39 eina_stringshare_replace(&(ELM_WIDGET_DATA(sd)->style), style);
41 eina_stringshare_del(style);
47 _selection_done(void *data,
48 Evas_Object *obj __UNUSED__,
51 Elm_Fileselector_Button_Smart_Data *sd = data;
52 const char *file = event_info;
55 if (file) eina_stringshare_replace(&sd->fsd.path, file);
62 evas_object_smart_callback_call
63 (ELM_WIDGET_DATA(sd)->obj, SIG_FILE_CHOSEN, (void *)file);
67 _new_window_add(Elm_Fileselector_Button_Smart_Data *sd)
69 Evas_Object *win, *bg;
71 win = elm_win_add(NULL, "fileselector_button", ELM_WIN_DIALOG_BASIC);
72 elm_win_title_set(win, sd->window_title);
73 elm_win_autodel_set(win, EINA_TRUE);
74 evas_object_smart_callback_add(win, "delete,request", _selection_done, sd);
77 elm_win_resize_object_add(win, bg);
78 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
81 evas_object_resize(win, sd->w, sd->h);
86 _parent_win_get(Evas_Object *obj)
88 while ((obj) && (strcmp(elm_widget_type_get(obj), "elm_win")))
89 obj = elm_object_parent_widget_get(obj);
95 _activate(Elm_Fileselector_Button_Smart_Data *sd)
97 Eina_Bool is_inwin = EINA_FALSE;
103 sd->fsw = _parent_win_get(ELM_WIDGET_DATA(sd)->obj);
106 sd->fsw = _new_window_add(sd);
109 sd->fsw = elm_win_inwin_add(sd->fsw);
110 is_inwin = EINA_TRUE;
114 sd->fsw = _new_window_add(sd);
116 sd->fs = elm_fileselector_add(sd->fsw);
117 elm_widget_mirrored_set
118 (sd->fs, elm_widget_mirrored_get(ELM_WIDGET_DATA(sd)->obj));
119 elm_widget_mirrored_automatic_set(sd->fs, EINA_FALSE);
120 elm_fileselector_expandable_set(sd->fs, sd->fsd.expandable);
121 elm_fileselector_folder_only_set(sd->fs, sd->fsd.folder_only);
122 elm_fileselector_is_save_set(sd->fs, sd->fsd.is_save);
123 elm_fileselector_selected_set(sd->fs, sd->fsd.path);
124 evas_object_size_hint_weight_set
125 (sd->fs, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
126 evas_object_size_hint_align_set(sd->fs, EVAS_HINT_FILL, EVAS_HINT_FILL);
127 evas_object_smart_callback_add(sd->fs, "done", _selection_done, sd);
128 evas_object_show(sd->fs);
132 elm_win_inwin_content_set(sd->fsw, sd->fs);
133 elm_win_inwin_activate(sd->fsw);
137 elm_win_resize_object_add(sd->fsw, sd->fs);
138 evas_object_show(sd->fsw);
143 _button_clicked(void *data,
144 Evas_Object *obj __UNUSED__,
145 void *event_info __UNUSED__)
151 _elm_fileselector_button_smart_add(Evas_Object *obj)
153 EVAS_SMART_DATA_ALLOC(obj, Elm_Fileselector_Button_Smart_Data);
155 ELM_WIDGET_CLASS(_elm_fileselector_button_parent_sc)->base.add(obj);
157 priv->window_title = eina_stringshare_add(DEFAULT_WINDOW_TITLE);
158 if (getenv("HOME")) priv->fsd.path = eina_stringshare_add(getenv("HOME"));
159 else priv->fsd.path = eina_stringshare_add("/");
161 priv->fsd.expandable = _elm_config->fileselector_expand_enable;
162 priv->inwin_mode = _elm_config->inwin_dialogs_enable;
166 elm_widget_mirrored_automatic_set(obj, EINA_FALSE);
168 evas_object_smart_callback_add(obj, "clicked", _button_clicked, priv);
170 _elm_fileselector_button_smart_theme(obj);
171 elm_widget_can_focus_set(obj, EINA_TRUE);
175 _elm_fileselector_button_smart_del(Evas_Object *obj)
179 ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
181 if (sd->window_title) eina_stringshare_del(sd->window_title);
182 if (sd->fsd.path) eina_stringshare_del(sd->fsd.path);
185 win = evas_object_data_del(obj, "win");
186 evas_object_del(win);
189 ELM_WIDGET_CLASS(_elm_fileselector_button_parent_sc)->base.del(obj);
193 _elm_fileselector_button_smart_set_user(
194 Elm_Fileselector_Button_Smart_Class *sc)
196 ELM_WIDGET_CLASS(sc)->base.add = _elm_fileselector_button_smart_add;
197 ELM_WIDGET_CLASS(sc)->base.del = _elm_fileselector_button_smart_del;
199 ELM_WIDGET_CLASS(sc)->theme = _elm_fileselector_button_smart_theme;
201 ELM_BUTTON_CLASS(sc)->admits_autorepeat = EINA_FALSE;
204 EAPI const Elm_Fileselector_Button_Smart_Class *
205 elm_fileselector_button_smart_class_get(void)
207 static Elm_Fileselector_Button_Smart_Class _sc =
208 ELM_FILESELECTOR_BUTTON_SMART_CLASS_INIT_NAME_VERSION
209 (ELM_FILESELECTOR_BUTTON_SMART_NAME);
210 static const Elm_Fileselector_Button_Smart_Class *class = NULL;
211 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
213 if (class) return class;
215 _elm_fileselector_button_smart_set(&_sc);
216 esc->callbacks = _smart_callbacks;
223 elm_fileselector_button_add(Evas_Object *parent)
227 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
229 obj = elm_widget_add(_elm_fileselector_button_smart_class_new(), parent);
230 if (!obj) return NULL;
232 if (!elm_widget_sub_object_add(parent, obj))
233 ERR("could not add %p as sub object of %p", obj, parent);
239 elm_fileselector_button_window_title_set(Evas_Object *obj,
242 ELM_FILESELECTOR_BUTTON_CHECK(obj);
243 ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
245 eina_stringshare_replace(&sd->window_title, title);
247 if (sd->fsw) elm_win_title_set(sd->fsw, sd->window_title);
251 elm_fileselector_button_window_title_get(const Evas_Object *obj)
253 ELM_FILESELECTOR_BUTTON_CHECK(obj) NULL;
254 ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
256 return sd->window_title;
260 elm_fileselector_button_window_size_set(Evas_Object *obj,
264 ELM_FILESELECTOR_BUTTON_CHECK(obj);
265 ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
270 if (sd->fsw) evas_object_resize(sd->fsw, sd->w, sd->h);
274 elm_fileselector_button_window_size_get(const Evas_Object *obj,
278 ELM_FILESELECTOR_BUTTON_CHECK(obj);
279 ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
281 if (width) *width = sd->w;
282 if (height) *height = sd->h;
286 elm_fileselector_button_path_set(Evas_Object *obj,
289 ELM_FILESELECTOR_BUTTON_CHECK(obj);
290 ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
292 eina_stringshare_replace(&sd->fsd.path, path);
294 if (sd->fs) elm_fileselector_selected_set(sd->fs, sd->fsd.path);
298 elm_fileselector_button_path_get(const Evas_Object *obj)
300 ELM_FILESELECTOR_BUTTON_CHECK(obj) NULL;
301 ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
307 elm_fileselector_button_expandable_set(Evas_Object *obj,
310 ELM_FILESELECTOR_BUTTON_CHECK(obj);
311 ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
313 sd->fsd.expandable = value;
315 if (sd->fs) elm_fileselector_expandable_set(sd->fs, sd->fsd.expandable);
319 elm_fileselector_button_expandable_get(const Evas_Object *obj)
321 ELM_FILESELECTOR_BUTTON_CHECK(obj) EINA_FALSE;
322 ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
324 return sd->fsd.expandable;
328 elm_fileselector_button_folder_only_set(Evas_Object *obj,
331 ELM_FILESELECTOR_BUTTON_CHECK(obj);
332 ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
334 sd->fsd.folder_only = value;
336 if (sd->fs) elm_fileselector_folder_only_set(sd->fs, sd->fsd.folder_only);
340 elm_fileselector_button_folder_only_get(const Evas_Object *obj)
342 ELM_FILESELECTOR_BUTTON_CHECK(obj) EINA_FALSE;
343 ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
345 return sd->fsd.folder_only;
349 elm_fileselector_button_is_save_set(Evas_Object *obj,
352 ELM_FILESELECTOR_BUTTON_CHECK(obj);
353 ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
355 sd->fsd.is_save = value;
357 if (sd->fs) elm_fileselector_is_save_set(sd->fs, sd->fsd.is_save);
361 elm_fileselector_button_is_save_get(const Evas_Object *obj)
363 ELM_FILESELECTOR_BUTTON_CHECK(obj) EINA_FALSE;
364 ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
366 return sd->fsd.is_save;
370 elm_fileselector_button_inwin_mode_set(Evas_Object *obj,
373 ELM_FILESELECTOR_BUTTON_CHECK(obj);
374 ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
376 sd->inwin_mode = value;
380 elm_fileselector_button_inwin_mode_get(const Evas_Object *obj)
382 ELM_FILESELECTOR_BUTTON_CHECK(obj) EINA_FALSE;
383 ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
385 return sd->inwin_mode;