2011-07-15 07:02:54 -07:00
/*
* TODO :
* - child elements focusing support
* - user defined icon / label cb
* - show / hide / add buttons ? ? ?
* - show / hide hidden files
* - make variable / function names that are sensible
2013-06-18 17:00:41 -07:00
* - Pattern Filter support
* - Custom Filter support
2013-07-25 04:00:45 -07:00
* - is ' is_save ' flag and API needed ? If it is not is_save mode ,
* entry is disabled and anchor can ' t be clicked .
* Also user should be able to type custom name in this mode .
2009-08-12 09:08:53 -07:00
*/
2013-04-25 22:13:00 -07:00
# ifdef HAVE_CONFIG_H
# include "elementary_config.h"
# endif
2009-08-12 09:08:53 -07:00
2012-05-03 15:44:26 -07:00
# include <Elementary.h>
# include "elm_priv.h"
2012-08-01 14:03:33 -07:00
# include "elm_widget_fileselector.h"
2009-08-12 09:08:53 -07:00
2012-11-25 22:32:53 -08:00
EAPI Eo_Op ELM_OBJ_FILESELECTOR_BASE_ID = EO_NOOP ;
# define MY_CLASS ELM_OBJ_FILESELECTOR_CLASS
# define MY_CLASS_NAME "elm_fileselector"
2011-06-25 16:39:43 -07:00
2012-02-20 00:26:17 -08:00
static Elm_Genlist_Item_Class * list_itc [ ELM_FILE_LAST ] ;
2012-02-22 23:36:12 -08:00
static Elm_Gengrid_Item_Class * grid_itc [ ELM_FILE_LAST ] ;
2009-08-12 09:08:53 -07:00
2013-09-02 16:39:02 -07:00
# define ELM_PRIV_FILESELECTOR_SIGNALS(cmd) \
2013-10-01 20:35:23 -07:00
cmd ( SIG_ACTIVATED , " activated " , " s " ) \
2013-09-02 16:39:02 -07:00
cmd ( SIG_DIRECTORY_OPEN , " directory,open " , " s " ) \
cmd ( SIG_DONE , " done " , " s " ) \
2013-09-12 06:17:07 -07:00
cmd ( SIG_SELECTED , " selected " , " s " ) \
cmd ( SIG_SELECTED_INVALID , " selected,invalid " , " s " )
2013-09-02 16:39:02 -07:00
ELM_PRIV_FILESELECTOR_SIGNALS ( ELM_PRIV_STATIC_VARIABLE_DECLARE ) ;
2012-05-03 15:44:26 -07:00
static const Evas_Smart_Cb_Description _smart_callbacks [ ] = {
2013-09-02 16:39:02 -07:00
ELM_PRIV_FILESELECTOR_SIGNALS ( ELM_PRIV_SMART_CALLBACKS_DESC )
2010-12-07 11:18:14 -08:00
{ NULL , NULL }
2010-04-05 12:18:36 -07:00
} ;
2012-05-03 15:44:26 -07:00
/* 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 ) ;
2013-09-30 08:49:50 -07:00
if ( sd - > populate_idler ) free ( ecore_idler_del ( sd - > populate_idler ) ) ;
2012-05-02 18:19:05 -07:00
2013-03-18 09:07:38 -07:00
eo_do_super ( sd - > obj , MY_CLASS , evas_obj_smart_del ( ) ) ;
2011-06-25 16:39:43 -07:00
}
2009-08-12 09:08:53 -07:00
static void
2012-11-25 22:32:53 -08:00
_elm_fileselector_smart_sizing_eval ( Eo * obj , void * _pd EINA_UNUSED , va_list * list EINA_UNUSED )
2009-08-12 09:08:53 -07:00
{
Evas_Coord minw = - 1 , minh = - 1 ;
2012-05-03 15:44:26 -07:00
2013-10-05 01:12:11 -07:00
ELM_WIDGET_DATA_GET_OR_RETURN ( obj , wd ) ;
2012-05-03 15:44:26 -07:00
2010-11-22 11:24:48 -08:00
elm_coords_finger_size_adjust ( 1 , & minw , 1 , & minh ) ;
2012-05-03 15:44:26 -07:00
edje_object_size_min_restricted_calc
2012-11-25 22:32:53 -08:00
( wd - > resize_obj , & minw , & minh , minw , minh ) ;
2009-08-12 09:08:53 -07:00
evas_object_size_hint_min_set ( obj , minw , minh ) ;
2010-11-22 11:24:48 -08:00
}
2011-02-08 04:08:28 -08:00
static void
_mirrored_set ( Evas_Object * obj , Eina_Bool rtl )
{
2012-05-03 15:44:26 -07:00
ELM_FILESELECTOR_DATA_GET ( obj , sd ) ;
elm_widget_mirrored_set ( sd - > cancel_button , rtl ) ;
elm_widget_mirrored_set ( sd - > ok_button , rtl ) ;
elm_widget_mirrored_set ( sd - > files_list , rtl ) ;
2013-09-26 01:37:48 -07:00
elm_widget_mirrored_set ( sd - > files_grid , rtl ) ;
2012-05-03 15:44:26 -07:00
elm_widget_mirrored_set ( sd - > up_button , rtl ) ;
elm_widget_mirrored_set ( sd - > home_button , rtl ) ;
2011-02-08 04:08:28 -08:00
}
2012-11-25 22:32:53 -08:00
static void
_elm_fileselector_smart_theme ( Eo * obj , void * _pd , va_list * list )
2010-11-22 11:24:48 -08:00
{
2012-05-03 15:44:26 -07:00
const char * style ;
2010-11-22 11:24:48 -08:00
const char * data ;
char buf [ 1024 ] ;
2012-11-25 22:32:53 -08:00
Elm_Fileselector_Smart_Data * sd = _pd ;
2013-10-05 01:12:11 -07:00
ELM_WIDGET_DATA_GET_OR_RETURN ( obj , wd ) ;
2012-11-25 22:32:53 -08:00
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
if ( ret ) * ret = EINA_FALSE ;
Eina_Bool int_ret ;
2011-02-10 07:13:05 -08:00
2013-03-18 09:07:38 -07:00
eo_do_super ( obj , MY_CLASS , elm_wdg_theme ( & int_ret ) ) ;
2012-11-25 22:32:53 -08:00
if ( ! int_ret ) return ;
2010-11-22 11:24:48 -08:00
2012-05-03 15:44:26 -07:00
style = elm_widget_style_get ( obj ) ;
_mirrored_set ( obj , elm_widget_mirrored_get ( obj ) ) ;
2010-11-22 11:24:48 -08:00
2012-05-03 15:44:26 -07:00
data = edje_object_data_get
2012-11-25 22:32:53 -08:00
( wd - > resize_obj , " path_separator " ) ;
2012-05-03 15:44:26 -07:00
if ( data ) sd - > path_separator = data ;
else sd - > path_separator = " / " ;
2010-11-22 11:24:48 -08:00
snprintf ( buf , sizeof ( buf ) , " fileselector/%s " , style ) ;
2012-05-03 15:44:26 -07:00
# 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 ) ; \
2010-12-10 05:01:51 -08:00
}
2012-05-03 15:44:26 -07:00
SWALLOW ( " elm.swallow.up " , sd - > up_button ) ;
SWALLOW ( " elm.swallow.home " , sd - > home_button ) ;
2012-05-16 12:40:47 -07:00
SWALLOW ( " elm.swallow.spinner " , sd - > spinner ) ;
elm_object_style_set ( sd - > spinner , " wheel " ) ;
2012-05-03 15:44:26 -07:00
if ( sd - > mode = = ELM_FILESELECTOR_LIST )
2010-12-10 05:01:51 -08:00
{
2012-05-03 15:44:26 -07:00
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 ) ;
2010-12-10 05:01:51 -08:00
}
else
{
2012-05-03 15:44:26 -07:00
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 ) ;
2010-12-10 05:01:51 -08:00
}
2012-05-03 15:44:26 -07:00
SWALLOW ( " elm.swallow.path " , sd - > path_entry ) ;
2013-09-25 07:43:22 -07:00
SWALLOW ( " elm.swallow.filename " , sd - > name_entry ) ;
2010-11-22 11:24:48 -08:00
snprintf ( buf , sizeof ( buf ) , " fileselector/actions/%s " , style ) ;
2013-06-18 17:00:41 -07:00
SWALLOW ( " elm.swallow.filters " , sd - > filter_hoversel ) ;
2012-05-03 15:44:26 -07:00
SWALLOW ( " elm.swallow.cancel " , sd - > cancel_button ) ;
SWALLOW ( " elm.swallow.ok " , sd - > ok_button ) ;
2010-12-10 05:01:51 -08:00
# undef SWALLOW
2010-11-22 11:24:48 -08:00
2012-11-25 22:32:53 -08:00
edje_object_message_signal_process ( wd - > resize_obj ) ;
2012-05-03 15:44:26 -07:00
elm_layout_sizing_eval ( obj ) ;
2012-11-25 22:32:53 -08:00
if ( ret ) * ret = EINA_TRUE ;
2009-08-12 09:08:53 -07:00
}
2012-05-03 15:44:26 -07:00
/*** GENLIST/GENGRID "MODEL" ***/
2010-12-07 11:18:14 -08:00
static char *
2012-05-03 15:44:26 -07:00
_itc_text_get ( void * data ,
Evas_Object * obj __UNUSED__ ,
const char * source __UNUSED__ )
2009-08-12 09:08:53 -07:00
{
2012-05-03 15:44:26 -07:00
return elm_entry_utf8_to_markup
( ecore_file_file_get ( data ) ) ; /* NOTE this will be free()'d by
* the caller */
2009-08-12 09:08:53 -07:00
}
2010-12-07 11:18:14 -08:00
static Evas_Object *
2012-05-03 15:44:26 -07:00
_itc_icon_folder_get ( void * data __UNUSED__ ,
2011-06-25 16:39:43 -07:00
Evas_Object * obj ,
2012-05-03 15:44:26 -07:00
const char * source )
2009-08-12 09:08:53 -07:00
{
Evas_Object * ic ;
2011-06-25 16:39:43 -07:00
if ( strcmp ( source , " elm.swallow.icon " ) ) return NULL ;
2011-05-31 09:16:01 -07:00
2011-06-25 16:39:43 -07:00
ic = elm_icon_add ( obj ) ;
elm_icon_standard_set ( ic , " folder " ) ;
2011-05-31 09:16:01 -07:00
2012-05-03 15:44:26 -07:00
evas_object_size_hint_aspect_set ( ic , EVAS_ASPECT_CONTROL_VERTICAL , 1 , 1 ) ;
2011-06-25 16:39:43 -07:00
return ic ;
}
static Evas_Object *
2012-05-03 15:44:26 -07:00
_itc_icon_image_get ( void * data ,
2011-06-25 16:39:43 -07:00
Evas_Object * obj ,
2012-05-03 15:44:26 -07:00
const char * source )
2011-06-25 16:39:43 -07:00
{
const char * filename = data ;
Evas_Object * ic ;
if ( strcmp ( source , " elm.swallow.icon " ) ) return NULL ;
ic = elm_icon_add ( obj ) ;
elm_icon_standard_set ( ic , " image " ) ;
elm_icon_thumb_set ( ic , filename , NULL ) ;
2012-05-03 15:44:26 -07:00
evas_object_size_hint_aspect_set ( ic , EVAS_ASPECT_CONTROL_VERTICAL , 1 , 1 ) ;
2011-06-25 16:39:43 -07:00
return ic ;
}
static Evas_Object *
2012-05-03 15:44:26 -07:00
_itc_icon_file_get ( void * data __UNUSED__ ,
2011-06-25 16:39:43 -07:00
Evas_Object * obj ,
2012-05-03 15:44:26 -07:00
const char * source )
2011-06-25 16:39:43 -07:00
{
Evas_Object * ic ;
if ( strcmp ( source , " elm.swallow.icon " ) ) return NULL ;
ic = elm_icon_add ( obj ) ;
elm_icon_standard_set ( ic , " file " ) ;
2012-05-03 15:44:26 -07:00
evas_object_size_hint_aspect_set ( ic , EVAS_ASPECT_CONTROL_VERTICAL , 1 , 1 ) ;
2011-06-25 16:39:43 -07:00
return ic ;
2009-08-12 09:08:53 -07:00
}
2009-10-22 15:10:23 -07:00
static Eina_Bool
2010-12-07 11:18:14 -08:00
_itc_state_get ( void * data __UNUSED__ ,
Evas_Object * obj __UNUSED__ ,
const char * source __UNUSED__ )
2009-08-12 09:08:53 -07:00
{
return EINA_FALSE ;
}
static void
2012-05-03 15:44:26 -07:00
_itc_del ( void * data ,
2010-12-07 11:18:14 -08:00
Evas_Object * obj __UNUSED__ )
2009-08-12 09:08:53 -07:00
{
eina_stringshare_del ( data ) ;
}
2012-05-03 15:45:01 -07:00
static void
_anchors_do ( Evas_Object * obj ,
const char * path )
{
char * * tok , buf [ PATH_MAX * 3 ] , * s ;
int i , j ;
ELM_FILESELECTOR_DATA_GET ( obj , sd ) ;
s = elm_entry_utf8_to_markup ( path ) ;
2013-07-17 18:25:57 -07:00
if ( ! s ) return ;
2012-05-03 15:45:01 -07:00
buf [ 0 ] = ' \0 ' ;
tok = eina_str_split ( s , " / " , 0 ) ;
free ( s ) ;
eina_strlcat ( buf , " <a href=/>root</a> " , sizeof ( buf ) ) ;
for ( i = 0 ; tok [ i ] ; i + + )
{
if ( ( ! tok [ i ] ) | | ( ! tok [ i ] [ 0 ] ) ) continue ;
eina_strlcat ( buf , sd - > path_separator , sizeof ( buf ) ) ;
eina_strlcat ( buf , " <a href= " , sizeof ( buf ) ) ;
for ( j = 0 ; j < = i ; j + + )
{
if ( strlen ( tok [ j ] ) < 1 ) continue ;
eina_strlcat ( buf , " / " , sizeof ( buf ) ) ;
eina_strlcat ( buf , tok [ j ] , sizeof ( buf ) ) ;
}
eina_strlcat ( buf , " > " , sizeof ( buf ) ) ;
eina_strlcat ( buf , tok [ i ] , sizeof ( buf ) ) ;
eina_strlcat ( buf , " </a> " , sizeof ( buf ) ) ;
}
free ( tok [ 0 ] ) ;
free ( tok ) ;
elm_object_text_set ( sd - > path_entry , buf ) ;
}
2013-06-18 17:00:41 -07:00
static Eina_Bool
_mime_type_matched ( const char * mime_filter , const char * mime_type )
{
int i = 0 ;
while ( mime_filter [ i ] ! = ' \0 ' )
{
if ( mime_filter [ i ] ! = mime_type [ i ] )
{
if ( mime_filter [ i ] = = ' * ' & & mime_filter [ i + 1 ] = = ' \0 ' )
return EINA_TRUE ;
return EINA_FALSE ;
}
i + + ;
}
if ( mime_type [ i ] ! = ' \0 ' ) return EINA_FALSE ;
return EINA_TRUE ;
}
static Eina_Bool
_check_filters ( const Elm_Fileselector_Filter * filter , const char * file_name )
{
const char * mime_type = NULL ;
int i ;
if ( ! filter ) return EINA_TRUE ;
# ifdef ELM_EFREET
mime_type = efreet_mime_type_get ( file_name ) ;
# endif
if ( ! mime_type ) return EINA_FALSE ;
for ( i = 0 ; filter - > mime_types [ i ] ; + + i )
{
if ( _mime_type_matched ( filter - > mime_types [ i ] , mime_type ) )
return EINA_TRUE ;
}
return EINA_FALSE ;
}
2011-06-25 16:39:43 -07:00
# ifdef HAVE_EIO
static Eina_Bool
2012-05-13 05:23:39 -07:00
_ls_filter_cb ( void * data ,
2012-05-15 13:02:59 -07:00
Eio_File * handler __UNUSED__ ,
2012-05-03 15:44:26 -07:00
const Eina_File_Direct_Info * info )
2011-06-25 16:39:43 -07:00
{
2012-05-13 05:23:39 -07:00
Listing_Request * lreq = data ;
2011-06-25 16:39:43 -07:00
if ( info - > path [ info - > name_start ] = = ' . ' )
return EINA_FALSE ;
2012-05-13 05:23:39 -07:00
if ( lreq - > sd - > only_folder & & info - > type ! = EINA_FILE_DIR )
2012-08-01 14:03:33 -07:00
return EINA_FALSE ;
2011-06-25 16:39:43 -07:00
2013-06-18 17:00:41 -07:00
if ( info - > type ! = EINA_FILE_DIR & & ! _check_filters ( lreq - > sd - > current_filter , info - > path ) )
return EINA_FALSE ;
2011-06-25 16:39:43 -07:00
return EINA_TRUE ;
}
static int
2012-05-03 15:44:26 -07:00
_file_grid_cmp ( const void * a ,
const void * b )
2011-06-25 16:39:43 -07:00
{
2012-01-30 02:29:51 -08:00
const Elm_Object_Item * ga = a ;
const Elm_Object_Item * gb = b ;
2011-06-25 16:39:43 -07:00
const Elm_Gengrid_Item_Class * ca = elm_gengrid_item_item_class_get ( ga ) ;
const Elm_Gengrid_Item_Class * cb = elm_gengrid_item_item_class_get ( gb ) ;
2012-02-22 23:36:12 -08:00
if ( ca = = grid_itc [ ELM_DIRECTORY ] )
2011-06-25 16:39:43 -07:00
{
2012-02-22 23:36:12 -08:00
if ( cb ! = grid_itc [ ELM_DIRECTORY ] )
2011-06-25 16:39:43 -07:00
return - 1 ;
}
2012-02-22 23:36:12 -08:00
else if ( cb = = grid_itc [ ELM_DIRECTORY ] )
2011-09-05 13:30:12 -07:00
{
return 1 ;
}
2011-06-25 16:39:43 -07:00
2012-01-30 17:22:16 -08:00
return strcoll ( elm_object_item_data_get ( ga ) , elm_object_item_data_get ( gb ) ) ;
2011-06-25 16:39:43 -07:00
}
static int
2012-05-03 15:44:26 -07:00
_file_list_cmp ( const void * a ,
const void * b )
2011-06-25 16:39:43 -07:00
{
2012-01-19 21:18:31 -08:00
const Elm_Object_Item * la = a ;
const Elm_Object_Item * lb = b ;
2011-06-25 16:39:43 -07:00
const Elm_Genlist_Item_Class * ca = elm_genlist_item_item_class_get ( la ) ;
const Elm_Genlist_Item_Class * cb = elm_genlist_item_item_class_get ( lb ) ;
2012-02-20 00:26:17 -08:00
if ( ca = = list_itc [ ELM_DIRECTORY ] )
2011-06-25 16:39:43 -07:00
{
2012-02-20 00:26:17 -08:00
if ( cb ! = list_itc [ ELM_DIRECTORY ] )
2011-06-25 16:39:43 -07:00
return - 1 ;
}
2012-02-20 00:26:17 -08:00
else if ( cb = = list_itc [ ELM_DIRECTORY ] )
2011-09-05 13:30:12 -07:00
{
return 1 ;
}
2011-06-25 16:39:43 -07:00
2012-01-25 23:31:30 -08:00
return strcoll ( elm_object_item_data_get ( la ) , elm_object_item_data_get ( lb ) ) ;
2011-06-25 16:39:43 -07:00
}
2012-05-03 15:44:26 -07:00
static void
_signal_first ( Listing_Request * lreq )
2012-05-02 10:01:48 -07:00
{
2012-05-03 15:44:26 -07:00
if ( ! lreq - > first ) return ;
2013-10-16 19:04:57 -07:00
if ( lreq - > sd - > multi )
{
char * path ;
EINA_LIST_FREE ( lreq - > sd - > paths , path )
free ( path ) ;
}
2012-05-03 15:44:26 -07:00
evas_object_smart_callback_call
( lreq - > obj , SIG_DIRECTORY_OPEN , ( void * ) lreq - > path ) ;
if ( ! lreq - > parent_it )
2012-05-02 10:01:48 -07:00
{
2012-05-03 15:44:26 -07:00
elm_genlist_clear ( lreq - > sd - > files_list ) ;
elm_gengrid_clear ( lreq - > sd - > files_grid ) ;
eina_stringshare_replace ( & lreq - > sd - > path , lreq - > path ) ;
_anchors_do ( lreq - > obj , lreq - > path ) ;
2013-09-25 07:43:22 -07:00
elm_object_text_set ( lreq - > sd - > name_entry , " " ) ;
2012-05-02 10:01:48 -07:00
}
2012-05-03 15:44:26 -07:00
lreq - > first = EINA_FALSE ;
2011-06-25 16:39:43 -07:00
}
static void
2012-05-03 15:44:26 -07:00
_ls_main_cb ( void * data ,
Eio_File * handler ,
2012-05-15 13:02:59 -07:00
const Eina_File_Direct_Info * info )
2011-06-25 16:39:43 -07:00
{
2012-05-03 15:44:26 -07:00
Listing_Request * lreq = data ;
2013-09-10 02:47:30 -07:00
Elm_Object_Item * item ;
2012-05-15 13:02:59 -07:00
int itcn = ELM_FILE_UNKNOW ;
2011-06-25 16:39:43 -07:00
2012-05-03 15:44:26 -07:00
if ( eio_file_check ( handler ) ) return ;
if ( ! lreq - > sd - > files_list | | ! lreq - > sd - > files_grid
| | lreq - > sd - > current ! = handler )
2011-06-27 03:26:06 -07:00
{
eio_file_cancel ( handler ) ;
2012-05-03 15:44:26 -07:00
return ;
2011-06-27 03:26:06 -07:00
}
2011-06-25 16:39:43 -07:00
2012-05-03 15:44:26 -07:00
_signal_first ( lreq ) ;
2011-06-25 16:39:43 -07:00
2012-05-15 13:02:59 -07:00
if ( info - > type = = EINA_FILE_DIR )
itcn = ELM_DIRECTORY ;
else
2012-07-25 04:19:59 -07:00
{
if ( evas_object_image_extension_can_load_get
2012-08-01 14:03:33 -07:00
( info - > path + info - > name_start ) )
2012-07-25 04:19:59 -07:00
itcn = ELM_FILE_IMAGE ;
}
2012-05-15 13:02:59 -07:00
2012-05-03 15:44:26 -07:00
if ( lreq - > sd - > mode = = ELM_FILESELECTOR_LIST )
2013-09-10 02:47:30 -07:00
{
item = elm_genlist_item_sorted_insert ( lreq - > sd - > files_list , list_itc [ itcn ] ,
eina_stringshare_add ( info - > path ) ,
lreq - > parent_it ,
( ( lreq - > sd - > expand ) & & ( itcn = = ELM_DIRECTORY ) )
? ELM_GENLIST_ITEM_TREE : ELM_GENLIST_ITEM_NONE ,
_file_list_cmp , NULL , NULL ) ;
if ( lreq - > selected & & ! strcmp ( info - > path , lreq - > selected ) )
2013-09-25 07:43:22 -07:00
{
elm_genlist_item_selected_set ( item , EINA_TRUE ) ;
elm_object_text_set ( lreq - > sd - > name_entry , ecore_file_file_get ( info - > path ) ) ;
}
2013-09-10 02:47:30 -07:00
}
2012-05-03 15:44:26 -07:00
else if ( lreq - > sd - > mode = = ELM_FILESELECTOR_GRID )
2013-09-10 02:47:30 -07:00
{
item = elm_gengrid_item_sorted_insert ( lreq - > sd - > files_grid , grid_itc [ itcn ] ,
eina_stringshare_add ( info - > path ) ,
_file_grid_cmp , NULL , NULL ) ;
if ( lreq - > selected & & ! strcmp ( info - > path , lreq - > selected ) )
2013-09-25 07:43:22 -07:00
{
elm_gengrid_item_selected_set ( item , EINA_TRUE ) ;
elm_object_text_set ( lreq - > sd - > name_entry , ecore_file_file_get ( info - > path ) ) ;
}
2013-09-10 02:47:30 -07:00
}
2011-06-25 16:39:43 -07:00
}
static void
2012-05-03 15:44:26 -07:00
_listing_request_cleanup ( Listing_Request * lreq )
2011-06-25 16:39:43 -07:00
{
2012-05-03 15:44:26 -07:00
EINA_REFCOUNT_UNREF ( lreq - > sd ) _elm_fileselector_smart_del_do ( lreq - > sd ) ;
2011-06-25 16:39:43 -07:00
2012-05-03 15:44:26 -07:00
eina_stringshare_del ( lreq - > path ) ;
2013-09-10 02:47:30 -07:00
eina_stringshare_del ( lreq - > selected ) ;
2012-05-03 15:44:26 -07:00
free ( lreq ) ;
2011-06-25 16:39:43 -07:00
}
static void
2012-05-03 15:44:26 -07:00
_ls_done_cb ( void * data , Eio_File * handler __UNUSED__ )
2011-06-25 16:39:43 -07:00
{
2012-05-03 15:44:26 -07:00
Listing_Request * lreq = data ;
2011-06-25 16:39:43 -07:00
2012-05-03 15:44:26 -07:00
_signal_first ( lreq ) ;
2012-05-16 12:40:47 -07:00
elm_progressbar_pulse ( lreq - > sd - > spinner , EINA_FALSE ) ;
elm_layout_signal_emit ( lreq - > obj , " elm,action,spinner,hide " , " elm " ) ;
2011-06-25 16:39:43 -07:00
2012-05-03 15:44:26 -07:00
lreq - > sd - > current = NULL ;
_listing_request_cleanup ( lreq ) ;
2011-06-25 16:39:43 -07:00
}
static void
2012-05-03 15:44:26 -07:00
_ls_error_cb ( void * data , Eio_File * handler , int error __UNUSED__ )
2011-06-25 16:39:43 -07:00
{
2012-05-03 15:44:26 -07:00
Listing_Request * lreq = data ;
2011-06-25 16:39:43 -07:00
2012-05-16 12:40:47 -07:00
elm_progressbar_pulse ( lreq - > sd - > spinner , EINA_FALSE ) ;
elm_layout_signal_emit ( lreq - > obj , " elm,action,spinner,hide " , " elm " ) ;
2012-05-03 15:44:26 -07:00
if ( lreq - > sd - > current = = handler )
lreq - > sd - > current = NULL ;
_listing_request_cleanup ( lreq ) ;
2011-06-25 16:39:43 -07:00
}
# endif
2009-08-12 09:08:53 -07:00
static void
2012-05-03 15:44:26 -07:00
_populate ( Evas_Object * obj ,
const char * path ,
2013-09-10 02:47:30 -07:00
Elm_Object_Item * parent_it ,
const char * selected )
2009-08-12 09:08:53 -07:00
{
2012-05-03 15:44:26 -07:00
ELM_FILESELECTOR_DATA_GET ( obj , sd ) ;
2013-06-11 23:03:47 -07:00
if ( ! path ) return ;
2012-05-03 15:44:26 -07:00
2011-06-25 16:39:43 -07:00
# ifdef HAVE_EIO
2012-05-03 15:44:26 -07:00
Listing_Request * lreq ;
2011-06-25 16:39:43 -07:00
# else
2012-05-03 15:44:26 -07:00
Eina_List * files = NULL , * dirs = NULL ;
2011-06-25 08:35:53 -07:00
Eina_File_Direct_Info * file ;
Eina_Iterator * it ;
2012-05-03 15:44:26 -07:00
const char * entry ;
2011-06-25 16:39:43 -07:00
# endif
2009-08-12 09:08:53 -07:00
2012-05-03 15:44:26 -07:00
# ifndef HAVE_EIO /* synchronous listing path */
if ( ! ecore_file_is_dir ( path ) ) return ;
2011-06-25 08:35:53 -07:00
it = eina_file_stat_ls ( path ) ;
2012-05-03 15:44:26 -07:00
if ( ! it ) return ;
2013-10-16 19:04:57 -07:00
if ( sd - > multi )
{
char * path ;
EINA_LIST_FREE ( sd - > paths , path )
free ( path ) ;
}
2010-11-25 02:01:39 -08:00
evas_object_smart_callback_call ( obj , SIG_DIRECTORY_OPEN , ( void * ) path ) ;
2012-05-03 15:44:26 -07:00
if ( ! parent_it )
2009-08-12 09:08:53 -07:00
{
2012-05-03 15:44:26 -07:00
elm_genlist_clear ( sd - > files_list ) ;
elm_gengrid_clear ( sd - > files_grid ) ;
eina_stringshare_replace ( & sd - > path , path ) ;
_anchors_do ( obj , path ) ;
2013-09-25 07:43:22 -07:00
elm_object_text_set ( sd - > name_entry , " " ) ;
2009-08-12 09:08:53 -07:00
}
2009-10-22 15:10:23 -07:00
2012-10-01 00:36:27 -07:00
EINA_ITERATOR_FOREACH ( it , file )
2009-08-12 09:08:53 -07:00
{
2011-06-25 08:35:53 -07:00
const char * filename ;
2012-05-03 15:44:26 -07:00
if ( file - > path [ file - > name_start ] = = ' . ' ) continue ;
2011-06-25 08:35:53 -07:00
filename = eina_stringshare_add ( file - > path ) ;
if ( file - > type = = EINA_FILE_DIR )
dirs = eina_list_append ( dirs , filename ) ;
2013-06-18 17:00:41 -07:00
else if ( ! sd - > only_folder & & _check_filters ( sd - > current_filter , filename ) )
2011-06-25 08:35:53 -07:00
files = eina_list_append ( files , filename ) ;
2009-08-12 15:43:50 -07:00
}
2011-06-25 08:35:53 -07:00
eina_iterator_free ( it ) ;
2009-08-12 15:43:50 -07:00
2012-05-03 15:44:26 -07:00
files = eina_list_sort
( files , eina_list_count ( files ) , EINA_COMPARE_CB ( strcoll ) ) ;
dirs = eina_list_sort
( dirs , eina_list_count ( dirs ) , EINA_COMPARE_CB ( strcoll ) ) ;
2013-03-08 20:23:42 -08:00
EINA_LIST_FREE ( dirs , entry )
2009-09-06 17:00:33 -07:00
{
2012-05-03 15:44:26 -07:00
if ( sd - > mode = = ELM_FILESELECTOR_LIST )
elm_genlist_item_append ( sd - > files_list , list_itc [ ELM_DIRECTORY ] ,
entry , /* item data */
parent_it ,
2012-07-25 04:19:59 -07:00
( sd - > expand )
? ELM_GENLIST_ITEM_TREE : ELM_GENLIST_ITEM_NONE ,
2010-12-10 05:01:51 -08:00
NULL , NULL ) ;
2012-05-03 15:44:26 -07:00
else if ( sd - > mode = = ELM_FILESELECTOR_GRID )
elm_gengrid_item_append ( sd - > files_grid , grid_itc [ ELM_DIRECTORY ] ,
entry , /* item data */
2010-12-10 05:01:51 -08:00
NULL , NULL ) ;
2009-09-06 17:00:33 -07:00
}
2009-10-22 15:10:23 -07:00
2013-03-08 20:23:42 -08:00
EINA_LIST_FREE ( files , entry )
2009-09-06 17:00:33 -07:00
{
2012-05-03 15:44:26 -07:00
Elm_Fileselector_Type type =
evas_object_image_extension_can_load_fast_get ( entry ) ?
2011-06-25 16:39:43 -07:00
ELM_FILE_IMAGE : ELM_FILE_UNKNOW ;
2012-05-03 15:44:26 -07:00
if ( sd - > mode = = ELM_FILESELECTOR_LIST )
2013-09-10 02:47:30 -07:00
{
Elm_Object_Item * item ;
item = elm_genlist_item_append ( sd - > files_list , list_itc [ type ] ,
entry , /* item data */
parent_it , ELM_GENLIST_ITEM_NONE ,
NULL , NULL ) ;
if ( selected & & ! strcmp ( entry , selected ) )
2013-09-25 07:43:22 -07:00
{
elm_genlist_item_selected_set ( item , EINA_TRUE ) ;
elm_object_text_set ( sd - > name_entry , ecore_file_file_get ( entry ) ) ;
}
2013-09-10 02:47:30 -07:00
}
2012-05-03 15:44:26 -07:00
else if ( sd - > mode = = ELM_FILESELECTOR_GRID )
2013-09-10 02:47:30 -07:00
{
Elm_Object_Item * item ;
item = elm_gengrid_item_append ( sd - > files_grid , grid_itc [ type ] ,
entry , /* item data */
NULL , NULL ) ;
if ( selected & & ! strcmp ( entry , selected ) )
2013-09-25 07:43:22 -07:00
{
elm_gengrid_item_selected_set ( item , EINA_TRUE ) ;
elm_object_text_set ( sd - > name_entry , ecore_file_file_get ( entry ) ) ;
}
2013-09-10 02:47:30 -07:00
}
2009-09-06 17:00:33 -07:00
}
2012-05-03 15:44:26 -07:00
# else /* asynchronous listing path */
if ( sd - > expand & & sd - > current ) return ;
if ( sd - > current ) eio_file_cancel ( sd - > current ) ;
lreq = malloc ( sizeof ( Listing_Request ) ) ;
if ( ! lreq ) return ;
lreq - > sd = sd ;
EINA_REFCOUNT_REF ( lreq - > sd ) ;
lreq - > parent_it = parent_it ; /* FIXME: should we refcount the parent_it ? */
lreq - > obj = obj ;
lreq - > path = eina_stringshare_add ( path ) ;
lreq - > first = EINA_TRUE ;
2013-09-10 02:47:30 -07:00
if ( selected )
lreq - > selected = eina_stringshare_add ( selected ) ;
else
lreq - > selected = NULL ;
2012-05-03 15:44:26 -07:00
sd - > current = eio_file_stat_ls ( path , _ls_filter_cb , _ls_main_cb ,
_ls_done_cb , _ls_error_cb , lreq ) ;
2012-05-16 12:40:47 -07:00
elm_progressbar_pulse ( sd - > spinner , EINA_TRUE ) ;
elm_layout_signal_emit ( lreq - > obj , " elm,action,spinner,show " , " elm " ) ;
2011-06-25 16:39:43 -07:00
# endif
2009-08-12 09:08:53 -07:00
}
2012-05-03 15:44:26 -07:00
static void
_on_list_expanded ( void * data ,
Evas_Object * obj __UNUSED__ ,
void * event_info )
{
Elm_Object_Item * it = event_info ;
const char * path = elm_object_item_data_get ( it ) ;
2013-09-10 02:47:30 -07:00
_populate ( data , path , it , NULL ) ;
2012-05-03 15:44:26 -07:00
}
2010-09-07 20:54:42 -07:00
2012-05-03 15:44:26 -07:00
static void
_on_list_contracted ( void * data __UNUSED__ ,
Evas_Object * obj __UNUSED__ ,
void * event_info )
2012-05-02 10:01:48 -07:00
{
2012-05-03 15:44:26 -07:00
Elm_Object_Item * it = event_info ;
elm_genlist_item_subitems_clear ( it ) ;
}
static void
_on_list_expand_req ( void * data __UNUSED__ ,
Evas_Object * obj __UNUSED__ ,
void * event_info )
{
Elm_Object_Item * it = event_info ;
elm_genlist_item_expanded_set ( it , EINA_TRUE ) ;
}
static void
_on_list_contract_req ( void * data __UNUSED__ ,
Evas_Object * obj __UNUSED__ ,
void * event_info )
{
Elm_Object_Item * it = event_info ;
elm_genlist_item_expanded_set ( it , EINA_FALSE ) ;
}
static Eina_Bool
2013-09-30 08:49:50 -07:00
_populate_do ( void * data )
2012-05-03 15:44:26 -07:00
{
struct sel_data * sdata = data ;
const char * p ;
ELM_FILESELECTOR_DATA_GET ( sdata - > fs , sd ) ;
2013-09-30 08:49:50 -07:00
/* keep a ref to path 'couse it will be destroyed by _populate */
p = eina_stringshare_add ( sdata - > path ) ;
_populate ( sdata - > fs , p , NULL , NULL ) ;
eina_stringshare_del ( p ) ;
2012-05-03 15:44:26 -07:00
2013-09-30 08:49:50 -07:00
sd - > populate_idler = NULL ;
2012-05-03 15:44:26 -07:00
free ( sdata ) ;
return ECORE_CALLBACK_CANCEL ;
}
2013-09-30 08:49:50 -07:00
static void
_on_item_double_clicked ( void * data ,
Evas_Object * obj __UNUSED__ ,
void * event_info )
{
//This event_info could be a list or gengrid item
Elm_Object_Item * it = event_info ;
struct sel_data * sdata ;
void * old_sdata ;
const char * path ;
Eina_Bool is_dir ;
ELM_FILESELECTOR_DATA_GET ( data , sd ) ;
if ( ! sd - > double_tap_navigation ) return ;
path = elm_object_item_data_get ( it ) ;
if ( ! path ) return ;
is_dir = ecore_file_is_dir ( path ) ;
if ( ! is_dir ) return ;
sdata = malloc ( sizeof ( * sdata ) ) ;
if ( ! sdata ) return ;
sdata - > fs = data ;
sdata - > path = path ;
if ( sd - > populate_idler )
{
old_sdata = ecore_idler_del ( sd - > populate_idler ) ;
free ( old_sdata ) ;
}
sd - > populate_idler = ecore_idler_add ( _populate_do , sdata ) ;
}
2013-10-01 20:35:23 -07:00
static void
_on_item_activated ( void * data ,
Evas_Object * obj __UNUSED__ ,
void * event_info )
{
//This event_info could be a list or gengrid item
Elm_Object_Item * it = event_info ;
const char * path ;
Eina_Bool is_dir ;
path = elm_object_item_data_get ( it ) ;
if ( ! path ) return ;
is_dir = ecore_file_is_dir ( path ) ;
if ( is_dir ) return ;
evas_object_smart_callback_call ( data , SIG_ACTIVATED , ( void * ) path ) ;
}
2013-10-16 19:04:57 -07:00
static void
_clear_selections ( Elm_Fileselector_Smart_Data * sd , Elm_Object_Item * last_selected )
{
Eina_List * items ;
Elm_Object_Item * sel ;
if ( sd - > mode = = ELM_FILESELECTOR_LIST )
{
items = eina_list_clone ( elm_genlist_selected_items_get ( sd - > files_list ) ) ;
EINA_LIST_FREE ( items , sel )
{
if ( sel = = last_selected ) continue ;
elm_genlist_item_selected_set ( sel , EINA_FALSE ) ;
}
}
else if ( sd - > mode = = ELM_FILESELECTOR_GRID )
{
items = eina_list_clone ( elm_gengrid_selected_items_get ( sd - > files_grid ) ) ;
EINA_LIST_FREE ( items , sel )
{
if ( sel = = last_selected ) continue ;
elm_gengrid_item_selected_set ( sel , EINA_FALSE ) ;
}
}
}
2012-05-03 15:44:26 -07:00
static void
_on_item_selected ( void * data ,
Evas_Object * obj __UNUSED__ ,
void * event_info )
{
//This event_info could be a list or gengrid item
Elm_Object_Item * it = event_info ;
struct sel_data * sdata ;
2013-09-30 08:49:50 -07:00
void * old_sdata ;
2013-07-17 10:48:07 -07:00
const char * path ;
2013-09-30 08:49:50 -07:00
char * parent_path ;
Eina_Bool is_dir ;
2012-05-03 15:44:26 -07:00
ELM_FILESELECTOR_DATA_GET ( data , sd ) ;
2013-07-17 10:48:07 -07:00
path = elm_object_item_data_get ( it ) ;
2013-09-30 08:49:50 -07:00
if ( ! path ) return ;
2013-07-17 10:48:07 -07:00
2013-09-30 08:49:50 -07:00
is_dir = ecore_file_is_dir ( path ) ;
/* We need to send callback when:
* - path is dir and mode is ONLY FOLDER
* - path is file and mode is NOT ONLY FOLDER */
if ( is_dir = = sd - > only_folder )
2012-05-03 15:44:26 -07:00
{
2013-10-16 19:04:57 -07:00
if ( sd - > multi )
{
Eina_List * li ;
const char * p ;
Eina_Strbuf * buf ;
if ( sd - > dir_selected )
{
_clear_selections ( sd , it ) ;
sd - > dir_selected = EINA_FALSE ;
}
buf = eina_strbuf_new ( ) ;
EINA_LIST_FOREACH ( sd - > paths , li , p )
{
eina_strbuf_append ( buf , ecore_file_file_get ( p ) ) ;
eina_strbuf_append_length ( buf , " , " , 2 ) ;
}
sd - > paths = eina_list_append ( sd - > paths , strdup ( path ) ) ;
eina_strbuf_append ( buf , ecore_file_file_get ( path ) ) ;
elm_object_text_set ( sd - > name_entry , eina_strbuf_string_get ( buf ) ) ;
eina_strbuf_free ( buf ) ;
}
else
elm_object_text_set ( sd - > name_entry , ecore_file_file_get ( path ) ) ;
2013-09-30 08:49:50 -07:00
evas_object_smart_callback_call ( data , SIG_SELECTED , ( void * ) path ) ;
}
else
2013-10-16 19:04:57 -07:00
{
if ( sd - > multi & & is_dir & & sd - > double_tap_navigation )
{
_clear_selections ( sd , it ) ;
sd - > dir_selected = EINA_TRUE ;
}
elm_object_text_set ( sd - > name_entry , " " ) ;
}
2013-09-30 08:49:50 -07:00
/* We need to populate, if path is directory and:
* - mode is GRID ;
* - mode is LIST and ' not expand mode ' ;
* in other cases update anchors . */
if ( ! is_dir ) return ;
2012-05-03 15:44:26 -07:00
2013-09-30 08:49:50 -07:00
if ( sd - > expand & & sd - > mode = = ELM_FILESELECTOR_LIST )
{
if ( sd - > only_folder )
{
parent_path = ecore_file_dir_get ( path ) ;
eina_stringshare_replace ( & sd - > path , parent_path ) ;
_anchors_do ( data , parent_path ) ;
free ( parent_path ) ;
}
else
{
eina_stringshare_replace ( & sd - > path , path ) ;
_anchors_do ( data , path ) ;
}
return ;
2012-05-03 15:44:26 -07:00
}
2013-09-30 08:49:50 -07:00
if ( sd - > double_tap_navigation ) return ;
2013-08-06 04:08:16 -07:00
sdata = malloc ( sizeof ( * sdata ) ) ;
2013-09-30 08:49:50 -07:00
if ( ! sdata ) return ;
2013-08-06 04:08:16 -07:00
sdata - > fs = data ;
sdata - > path = path ;
2013-09-30 08:49:50 -07:00
if ( sd - > populate_idler )
2012-05-03 15:44:26 -07:00
{
2013-09-30 08:49:50 -07:00
old_sdata = ecore_idler_del ( sd - > populate_idler ) ;
free ( old_sdata ) ;
2012-05-03 15:44:26 -07:00
}
2013-09-30 08:49:50 -07:00
sd - > populate_idler = ecore_idler_add ( _populate_do , sdata ) ;
2012-05-03 15:44:26 -07:00
}
2013-10-16 19:04:57 -07:00
static void
_on_item_unselected ( void * data ,
Evas_Object * obj __UNUSED__ ,
void * event_info )
{
Eina_List * li , * l ;
char * path ;
const char * unselected_path ;
Eina_Strbuf * buf ;
Elm_Object_Item * it = event_info ;
Eina_Bool first = EINA_TRUE ;
ELM_FILESELECTOR_DATA_GET ( data , sd ) ;
if ( ! sd - > multi ) return ;
unselected_path = elm_object_item_data_get ( it ) ;
if ( ! unselected_path ) return ;
buf = eina_strbuf_new ( ) ;
EINA_LIST_FOREACH_SAFE ( sd - > paths , li , l , path )
{
if ( ! strcmp ( path , unselected_path ) )
{
sd - > paths = eina_list_remove_list ( sd - > paths , li ) ;
free ( path ) ;
}
else
{
if ( ! first )
eina_strbuf_append_length ( buf , " , " , 2 ) ;
else
first = EINA_FALSE ;
eina_strbuf_append ( buf , ecore_file_file_get ( path ) ) ;
}
}
elm_object_text_set ( sd - > name_entry , eina_strbuf_string_get ( buf ) ) ;
eina_strbuf_free ( buf ) ;
}
2012-05-03 15:44:26 -07:00
static void
_on_dir_up ( void * data ,
Evas_Object * obj __UNUSED__ ,
void * event_info __UNUSED__ )
{
Evas_Object * fs = data ;
char * parent ;
ELM_FILESELECTOR_DATA_GET ( fs , sd ) ;
parent = ecore_file_dir_get ( sd - > path ) ;
2013-09-10 02:47:30 -07:00
_populate ( fs , parent , NULL , NULL ) ;
2012-05-03 15:44:26 -07:00
free ( parent ) ;
}
static void
_home ( void * data ,
Evas_Object * obj __UNUSED__ ,
void * event_info __UNUSED__ )
{
Evas_Object * fs = data ;
2013-09-10 02:47:30 -07:00
_populate ( fs , getenv ( " HOME " ) , NULL , NULL ) ;
2012-05-03 15:44:26 -07:00
}
2013-06-18 17:00:41 -07:00
static void
_current_filer_changed ( void * data ,
Evas_Object * obj ,
void * event_info __UNUSED__ )
{
Elm_Fileselector_Filter * filter = data ;
if ( filter - > sd - > current_filter = = filter ) return ;
elm_object_text_set ( obj , filter - > filter_name ) ;
filter - > sd - > current_filter = filter ;
2013-09-10 02:47:30 -07:00
_populate ( filter - > sd - > obj , filter - > sd - > path , NULL , NULL ) ;
2013-06-18 17:00:41 -07:00
}
2012-05-03 15:44:26 -07:00
static void
_ok ( void * data ,
Evas_Object * obj __UNUSED__ ,
void * event_info __UNUSED__ )
{
2013-09-25 07:43:22 -07:00
const char * name ;
const char * selection = NULL ;
2012-05-03 15:44:26 -07:00
Evas_Object * fs = data ;
2013-09-25 07:43:22 -07:00
ELM_FILESELECTOR_DATA_GET ( fs , sd ) ;
2012-05-03 15:44:26 -07:00
2013-09-25 07:43:22 -07:00
if ( ! sd - > path )
{
evas_object_smart_callback_call ( fs , SIG_DONE , NULL ) ;
return ;
}
name = elm_object_text_get ( sd - > name_entry ) ;
if ( name & & name [ 0 ] ! = ' \0 ' )
selection = eina_stringshare_printf ( " %s/%s " , sd - > path , name ) ;
else
selection = eina_stringshare_add ( elm_fileselector_selected_get ( fs ) ) ;
evas_object_smart_callback_call ( fs , SIG_DONE , ( void * ) selection ) ;
eina_stringshare_del ( selection ) ;
2012-05-03 15:44:26 -07:00
}
static void
_canc ( void * data ,
Evas_Object * obj __UNUSED__ ,
void * event_info __UNUSED__ )
{
Evas_Object * fs = data ;
evas_object_smart_callback_call ( fs , SIG_DONE , NULL ) ;
}
2013-01-03 12:48:14 -08:00
static void
_on_text_clicked ( void * data __UNUSED__ ,
Evas_Object * obj ,
void * event_info __UNUSED__ )
{
ELM_FILESELECTOR_DATA_GET ( data , sd ) ;
2013-07-23 03:34:34 -07:00
/* FIXME: When anchor is clicked, current callback is also called.
* But when it is " anchor,clicked " entry should be unfocused , so we remove
* focus in achor_clicked .
*
* Check if entry is focused .
* It will be so if empty place ( not anchor ) was clicked . */
if ( ! elm_object_focus_get ( obj ) ) return ;
2013-01-03 12:48:14 -08:00
elm_entry_entry_set ( obj , sd - > path ) ;
2013-06-27 03:21:44 -07:00
elm_entry_cursor_pos_set ( obj , eina_stringshare_strlen ( sd - > path ) ) ;
2013-01-03 12:48:14 -08:00
}
static void
_on_text_activated ( void * data ,
2013-08-21 13:18:09 -07:00
Evas_Object * obj ,
void * event_info __UNUSED__ )
2013-01-03 12:48:14 -08:00
{
Evas_Object * fs = data ;
2013-09-10 02:47:30 -07:00
const char * p , * path ;
char * dir ;
2013-01-03 12:48:14 -08:00
2013-09-10 02:47:30 -07:00
ELM_FILESELECTOR_DATA_GET ( fs , sd ) ;
path = elm_object_text_get ( obj ) ;
2013-09-12 06:17:07 -07:00
if ( ! ecore_file_exists ( path ) )
{
evas_object_smart_callback_call ( fs , SIG_SELECTED , ( void * ) path ) ;
evas_object_smart_callback_call ( fs , SIG_SELECTED_INVALID , ( void * ) path ) ;
goto end ;
}
2013-09-10 02:47:30 -07:00
if ( ecore_file_is_dir ( path ) )
{
// keep a ref to path 'couse it will be destroyed by _populate
p = eina_stringshare_add ( path ) ;
_populate ( fs , p , NULL , NULL ) ;
eina_stringshare_del ( p ) ;
2013-09-12 06:17:07 -07:00
if ( sd - > only_folder )
evas_object_smart_callback_call ( fs , SIG_SELECTED , ( void * ) path ) ;
2013-09-10 02:47:30 -07:00
goto end ;
}
dir = ecore_file_dir_get ( path ) ;
if ( ! dir ) goto end ;
if ( strcmp ( dir , sd - > path ) )
2013-09-12 06:17:07 -07:00
{
_populate ( fs , dir , NULL , path ) ;
if ( sd - > only_folder )
evas_object_smart_callback_call ( fs , SIG_SELECTED , ( void * ) path ) ;
}
2013-01-03 12:48:14 -08:00
else
2013-09-10 02:47:30 -07:00
{
if ( sd - > mode = = ELM_FILESELECTOR_LIST )
{
Elm_Object_Item * item = elm_genlist_first_item_get ( sd - > files_list ) ;
while ( item )
{
2013-09-11 01:07:10 -07:00
const char * item_path = elm_object_item_data_get ( item ) ;
if ( ! strcmp ( item_path , path ) )
{
elm_genlist_item_selected_set ( item , EINA_TRUE ) ;
2013-09-25 07:43:22 -07:00
elm_object_text_set ( sd - > name_entry , ecore_file_file_get ( path ) ) ;
2013-09-11 01:07:10 -07:00
break ;
}
item = elm_genlist_item_next_get ( item ) ;
2013-09-10 02:47:30 -07:00
}
}
else
{
Elm_Object_Item * item = elm_gengrid_first_item_get ( sd - > files_list ) ;
while ( item )
{
2013-09-11 01:07:10 -07:00
const char * item_path = elm_object_item_data_get ( item ) ;
if ( ! strcmp ( item_path , path ) )
{
2013-09-10 02:47:30 -07:00
elm_gengrid_item_selected_set ( item , EINA_TRUE ) ;
2013-09-25 07:43:22 -07:00
elm_object_text_set ( sd - > name_entry , ecore_file_file_get ( path ) ) ;
2013-09-10 02:47:30 -07:00
break ;
2013-09-11 01:07:10 -07:00
}
item = elm_gengrid_item_next_get ( item ) ;
2013-09-10 02:47:30 -07:00
}
}
}
free ( dir ) ;
2013-01-03 12:48:14 -08:00
2013-09-10 02:47:30 -07:00
end :
2013-07-23 03:34:34 -07:00
elm_object_focus_set ( obj , EINA_FALSE ) ;
2013-01-03 12:48:14 -08:00
}
static void
2013-07-18 07:46:56 -07:00
_on_text_unfocused ( void * data ,
2013-08-21 13:18:09 -07:00
Evas_Object * obj __UNUSED__ ,
void * event_info __UNUSED__ )
2013-01-03 12:48:14 -08:00
{
2013-07-18 07:46:56 -07:00
ELM_FILESELECTOR_DATA_GET ( data , sd ) ;
_anchors_do ( data , sd - > path ) ;
2013-01-03 12:48:14 -08:00
}
2012-05-03 15:44:26 -07:00
static void
_anchor_clicked ( void * data ,
2013-01-03 23:38:26 -08:00
Evas_Object * obj __UNUSED__ ,
2012-05-03 15:44:26 -07:00
void * event_info )
{
Elm_Entry_Anchor_Info * info = event_info ;
Evas_Object * fs = data ;
const char * p ;
// keep a ref to path 'couse it will be destroyed by _populate
p = eina_stringshare_add ( info - > name ) ;
2013-09-10 02:47:30 -07:00
_populate ( fs , p , NULL , NULL ) ;
2012-05-03 15:44:26 -07:00
eina_stringshare_del ( p ) ;
2013-07-23 03:34:34 -07:00
/* After anchor was clicked, entry will be focused, and will be editable.
* It ' s wrong . So remove focus . */
elm_object_focus_set ( obj , EINA_FALSE ) ;
2012-05-03 15:44:26 -07:00
}
static void
2012-11-25 22:32:53 -08:00
_elm_fileselector_smart_add ( Eo * obj , void * _pd , va_list * list EINA_UNUSED )
2012-05-03 15:44:26 -07:00
{
2012-05-16 12:40:47 -07:00
Evas_Object * ic , * bt , * li , * en , * grid , * pb ;
2010-12-10 05:01:51 -08:00
int s ;
2010-12-03 06:08:33 -08:00
2012-11-25 22:32:53 -08:00
Elm_Fileselector_Smart_Data * priv = _pd ;
2012-05-03 15:44:26 -07:00
EINA_REFCOUNT_INIT ( priv ) ;
2011-04-01 04:51:11 -07:00
2013-03-18 09:07:38 -07:00
eo_do_super ( obj , MY_CLASS , evas_obj_smart_add ( ) ) ;
2013-09-24 21:33:39 -07:00
elm_widget_sub_object_parent_add ( obj ) ;
2010-09-29 05:22:30 -07:00
elm_widget_can_focus_set ( obj , EINA_FALSE ) ;
2009-08-12 09:08:53 -07:00
2012-05-03 15:44:26 -07:00
priv - > expand = ! ! _elm_config - > fileselector_expand_enable ;
2013-09-30 08:49:50 -07:00
priv - > double_tap_navigation = ! ! _elm_config - > fileselector_double_tap_navigation_enable ;
2011-04-01 04:51:11 -07:00
2013-03-01 18:04:31 -08:00
if ( ! elm_layout_theme_set
( obj , " fileselector " , " base " , elm_widget_style_get ( obj ) ) )
CRITICAL ( " Failed to set layout! " ) ;
2009-10-22 15:10:23 -07:00
2009-08-12 09:08:53 -07:00
// up btn
2012-05-03 15:44:26 -07:00
ic = elm_icon_add ( obj ) ;
2009-08-12 09:08:53 -07:00
elm_icon_standard_set ( ic , " arrow_up " ) ;
evas_object_size_hint_aspect_set ( ic , EVAS_ASPECT_CONTROL_VERTICAL , 1 , 1 ) ;
2012-05-03 15:44:26 -07:00
bt = elm_button_add ( obj ) ;
2011-02-10 07:13:05 -08:00
elm_widget_mirrored_automatic_set ( bt , EINA_FALSE ) ;
2011-11-17 13:02:31 -08:00
elm_object_part_content_set ( bt , " icon " , ic ) ;
2011-10-19 07:17:14 -07:00
elm_object_domain_translatable_text_set ( bt , PACKAGE , N_ ( " Up " ) ) ;
2009-08-12 09:08:53 -07:00
evas_object_size_hint_align_set ( bt , 0.0 , 0.0 ) ;
2012-05-03 15:44:26 -07:00
evas_object_smart_callback_add ( bt , " clicked " , _on_dir_up , obj ) ;
2012-05-02 10:01:48 -07:00
2012-05-02 18:19:05 -07:00
elm_widget_sub_object_add ( obj , bt ) ;
2012-05-03 15:44:26 -07:00
priv - > up_button = bt ;
2009-10-22 15:10:23 -07:00
2009-08-12 09:08:53 -07:00
// home btn
2012-05-03 15:44:26 -07:00
ic = elm_icon_add ( obj ) ;
2009-08-12 09:08:53 -07:00
elm_icon_standard_set ( ic , " home " ) ;
evas_object_size_hint_aspect_set ( ic , EVAS_ASPECT_CONTROL_VERTICAL , 1 , 1 ) ;
2012-05-03 15:44:26 -07:00
bt = elm_button_add ( obj ) ;
2011-02-10 07:13:05 -08:00
elm_widget_mirrored_automatic_set ( bt , EINA_FALSE ) ;
2011-11-17 13:02:31 -08:00
elm_object_part_content_set ( bt , " icon " , ic ) ;
2011-10-19 07:17:14 -07:00
elm_object_domain_translatable_text_set ( bt , PACKAGE , N_ ( " Home " ) ) ;
2009-08-12 09:08:53 -07:00
evas_object_size_hint_align_set ( bt , 0.0 , 0.0 ) ;
evas_object_smart_callback_add ( bt , " clicked " , _home , obj ) ;
2010-11-22 11:24:48 -08:00
elm_widget_sub_object_add ( obj , bt ) ;
2012-05-03 15:44:26 -07:00
priv - > home_button = bt ;
2009-08-12 09:08:53 -07:00
2012-05-16 12:40:47 -07:00
// spinner
pb = elm_progressbar_add ( obj ) ;
elm_widget_sub_object_add ( obj , pb ) ;
priv - > spinner = pb ;
2012-02-22 23:36:12 -08:00
list_itc [ ELM_DIRECTORY ] - > func . content_get =
grid_itc [ ELM_DIRECTORY ] - > func . content_get = _itc_icon_folder_get ;
list_itc [ ELM_FILE_IMAGE ] - > func . content_get =
grid_itc [ ELM_FILE_IMAGE ] - > func . content_get = _itc_icon_image_get ;
list_itc [ ELM_FILE_UNKNOW ] - > func . content_get =
grid_itc [ ELM_FILE_UNKNOW ] - > func . content_get = _itc_icon_file_get ;
2012-05-03 15:44:26 -07:00
li = elm_genlist_add ( obj ) ;
2011-02-10 07:13:05 -08:00
elm_widget_mirrored_automatic_set ( li , EINA_FALSE ) ;
2010-11-22 11:24:48 -08:00
evas_object_size_hint_align_set ( li , EVAS_HINT_FILL , EVAS_HINT_FILL ) ;
evas_object_size_hint_weight_set ( li , EVAS_HINT_EXPAND , EVAS_HINT_EXPAND ) ;
evas_object_size_hint_min_set ( li , 100 , 100 ) ;
2009-08-12 09:08:53 -07:00
2012-05-03 15:44:26 -07:00
grid = elm_gengrid_add ( obj ) ;
2011-02-10 07:13:05 -08:00
elm_widget_mirrored_automatic_set ( grid , EINA_FALSE ) ;
2010-12-10 05:01:51 -08:00
evas_object_size_hint_align_set ( grid , EVAS_HINT_FILL , EVAS_HINT_FILL ) ;
evas_object_size_hint_weight_set ( grid , EVAS_HINT_EXPAND , EVAS_HINT_EXPAND ) ;
2012-03-06 04:04:25 -08:00
// XXX: will fail for dynamic finger size changing
2012-05-03 15:44:26 -07:00
s = elm_config_finger_size_get ( ) * 2 ;
2010-12-10 05:01:51 -08:00
elm_gengrid_item_size_set ( grid , s , s ) ;
elm_gengrid_align_set ( grid , 0.0 , 0.0 ) ;
2012-05-03 15:44:26 -07:00
evas_object_smart_callback_add ( li , " selected " , _on_item_selected , obj ) ;
2013-10-16 19:04:57 -07:00
evas_object_smart_callback_add ( li , " unselected " , _on_item_unselected , obj ) ;
2013-09-30 08:49:50 -07:00
evas_object_smart_callback_add ( li , " clicked,double " , _on_item_double_clicked , obj ) ;
2013-10-01 20:35:23 -07:00
evas_object_smart_callback_add ( li , " activated " , _on_item_activated , obj ) ;
2012-05-03 15:44:26 -07:00
evas_object_smart_callback_add
( li , " expand,request " , _on_list_expand_req , obj ) ;
evas_object_smart_callback_add
( li , " contract,request " , _on_list_contract_req , obj ) ;
evas_object_smart_callback_add ( li , " expanded " , _on_list_expanded , obj ) ;
evas_object_smart_callback_add ( li , " contracted " , _on_list_contracted , obj ) ;
evas_object_smart_callback_add ( grid , " selected " , _on_item_selected , obj ) ;
2013-10-16 19:04:57 -07:00
evas_object_smart_callback_add ( grid , " unselected " , _on_item_unselected , obj ) ;
2013-09-30 08:49:50 -07:00
evas_object_smart_callback_add ( grid , " clicked,double " , _on_item_double_clicked , obj ) ;
2013-10-01 20:35:23 -07:00
evas_object_smart_callback_add ( grid , " activated " , _on_item_activated , obj ) ;
2010-12-10 05:01:51 -08:00
2010-11-22 11:24:48 -08:00
elm_widget_sub_object_add ( obj , li ) ;
2010-12-10 05:01:51 -08:00
elm_widget_sub_object_add ( obj , grid ) ;
2012-05-03 15:44:26 -07:00
priv - > files_list = li ;
priv - > files_grid = grid ;
2009-08-12 09:08:53 -07:00
2009-09-06 17:00:33 -07:00
// path entry
2012-05-03 15:44:26 -07:00
en = elm_entry_add ( obj ) ;
2011-06-17 02:44:31 -07:00
elm_entry_scrollable_set ( en , EINA_TRUE ) ;
2011-02-10 07:13:05 -08:00
elm_widget_mirrored_automatic_set ( en , EINA_FALSE ) ;
2011-06-17 02:44:31 -07:00
elm_entry_single_line_set ( en , EINA_TRUE ) ;
elm_entry_line_wrap_set ( en , ELM_WRAP_CHAR ) ;
2010-11-22 11:24:48 -08:00
evas_object_size_hint_weight_set ( en , EVAS_HINT_EXPAND , EVAS_HINT_EXPAND ) ;
evas_object_size_hint_align_set ( en , EVAS_HINT_FILL , EVAS_HINT_FILL ) ;
evas_object_smart_callback_add ( en , " anchor,clicked " , _anchor_clicked , obj ) ;
2013-01-03 12:48:14 -08:00
evas_object_smart_callback_add ( en , " clicked " , _on_text_clicked , obj ) ;
evas_object_smart_callback_add ( en , " unfocused " , _on_text_unfocused , obj ) ;
evas_object_smart_callback_add ( en , " activated " , _on_text_activated , obj ) ;
2010-11-22 11:24:48 -08:00
elm_widget_sub_object_add ( obj , en ) ;
2012-05-03 15:44:26 -07:00
priv - > path_entry = en ;
2010-11-22 11:24:48 -08:00
2013-09-25 07:43:22 -07:00
// name entry
en = elm_entry_add ( obj ) ;
elm_entry_scrollable_set ( en , EINA_TRUE ) ;
elm_widget_mirrored_automatic_set ( en , EINA_FALSE ) ;
elm_entry_editable_set ( en , EINA_TRUE ) ;
elm_entry_single_line_set ( en , EINA_TRUE ) ;
elm_entry_line_wrap_set ( en , ELM_WRAP_CHAR ) ;
evas_object_size_hint_weight_set ( en , EVAS_HINT_EXPAND , EVAS_HINT_EXPAND ) ;
evas_object_size_hint_align_set ( en , EVAS_HINT_FILL , EVAS_HINT_FILL ) ;
elm_widget_sub_object_add ( obj , en ) ;
priv - > name_entry = en ;
2010-11-22 11:24:48 -08:00
elm_fileselector_buttons_ok_cancel_set ( obj , EINA_TRUE ) ;
elm_fileselector_is_save_set ( obj , EINA_FALSE ) ;
2012-11-25 22:32:53 -08:00
eo_do ( obj , elm_wdg_theme ( NULL ) ) ;
2012-05-03 15:44:26 -07:00
}
static void
2012-11-25 22:32:53 -08:00
_elm_fileselector_smart_del ( Eo * obj EINA_UNUSED , void * _pd , va_list * list EINA_UNUSED )
2012-05-03 15:44:26 -07:00
{
2012-11-25 22:32:53 -08:00
Elm_Fileselector_Smart_Data * sd = _pd ;
2013-06-18 17:00:41 -07:00
Elm_Fileselector_Filter * filter ;
2013-10-16 19:04:57 -07:00
char * path ;
2012-05-03 15:44:26 -07:00
# ifdef HAVE_EIO
if ( sd - > current ) eio_file_cancel ( sd - > current ) ;
# endif
2013-06-18 17:00:41 -07:00
EINA_LIST_FREE ( sd - > filter_list , filter )
{
eina_stringshare_del ( filter - > filter_name ) ;
free ( filter - > mime_types [ 0 ] ) ;
free ( filter - > mime_types ) ;
free ( filter ) ;
}
2013-10-16 19:04:57 -07:00
EINA_LIST_FREE ( sd - > paths , path )
free ( path ) ;
2012-05-03 15:44:26 -07:00
sd - > files_list = NULL ;
sd - > files_grid = NULL ;
/* this one matching EINA_REFCOUNT_INIT() */
EINA_REFCOUNT_UNREF ( sd ) _elm_fileselector_smart_del_do ( sd ) ;
}
EAPI Evas_Object *
elm_fileselector_add ( Evas_Object * parent )
{
EINA_SAFETY_ON_NULL_RETURN_VAL ( parent , NULL ) ;
2012-11-25 22:32:53 -08:00
Evas_Object * obj = eo_add ( MY_CLASS , parent ) ;
eo_unref ( obj ) ;
return obj ;
}
2012-05-03 15:44:26 -07:00
2012-11-25 22:32:53 -08:00
static void
_constructor ( Eo * obj , void * _pd EINA_UNUSED , va_list * list EINA_UNUSED )
{
Elm_Fileselector_Smart_Data * sd = _pd ;
sd - > obj = obj ;
2013-03-18 09:07:38 -07:00
eo_do_super ( obj , MY_CLASS , eo_constructor ( ) ) ;
2012-11-25 22:32:53 -08:00
eo_do ( obj ,
evas_obj_type_set ( MY_CLASS_NAME ) ,
evas_obj_smart_callbacks_descriptions_set ( _smart_callbacks , NULL ) ) ;
2009-08-12 09:08:53 -07:00
}
2009-09-06 17:00:33 -07:00
EAPI void
2010-12-07 11:18:14 -08:00
elm_fileselector_is_save_set ( Evas_Object * obj ,
2012-05-03 15:44:26 -07:00
Eina_Bool is_save )
2009-09-06 17:00:33 -07:00
{
2012-05-03 15:44:26 -07:00
ELM_FILESELECTOR_CHECK ( obj ) ;
2012-11-25 22:32:53 -08:00
eo_do ( obj , elm_obj_fileselector_is_save_set ( is_save ) ) ;
}
static void
_is_save_set ( Eo * obj , void * _pd , va_list * list )
{
Eina_Bool is_save = va_arg ( * list , int ) ;
Elm_Fileselector_Smart_Data * sd = _pd ;
2010-11-22 11:24:48 -08:00
2013-09-25 07:43:22 -07:00
elm_object_disabled_set ( sd - > name_entry , ! is_save ) ;
2010-11-22 11:24:48 -08:00
2012-05-03 15:44:26 -07:00
if ( is_save ) elm_layout_signal_emit ( obj , " elm,state,save,on " , " elm " ) ;
else elm_layout_signal_emit ( obj , " elm,state,save,off " , " elm " ) ;
2009-09-06 17:00:33 -07:00
}
EAPI Eina_Bool
2010-03-23 20:06:00 -07:00
elm_fileselector_is_save_get ( const Evas_Object * obj )
2009-09-06 17:00:33 -07:00
{
2012-05-03 15:44:26 -07:00
ELM_FILESELECTOR_CHECK ( obj ) EINA_FALSE ;
2012-11-25 22:32:53 -08:00
Eina_Bool ret = EINA_FALSE ;
eo_do ( ( Eo * ) obj , elm_obj_fileselector_is_save_get ( & ret ) ) ;
return ret ;
}
2012-05-03 15:44:26 -07:00
2012-11-25 22:32:53 -08:00
static void
_is_save_get ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
Elm_Fileselector_Smart_Data * sd = _pd ;
2013-09-25 07:43:22 -07:00
* ret = ! elm_object_disabled_get ( sd - > name_entry ) ;
2009-09-06 17:00:33 -07:00
}
2009-10-22 15:10:23 -07:00
EAPI void
2010-12-07 11:18:14 -08:00
elm_fileselector_folder_only_set ( Evas_Object * obj ,
2012-05-03 15:44:26 -07:00
Eina_Bool only )
2009-10-22 15:10:23 -07:00
{
2012-05-03 15:44:26 -07:00
ELM_FILESELECTOR_CHECK ( obj ) ;
2012-11-25 22:32:53 -08:00
eo_do ( obj , elm_obj_fileselector_folder_only_set ( only ) ) ;
}
static void
_folder_only_set ( Eo * obj , void * _pd , va_list * list )
{
Eina_Bool only = va_arg ( * list , int ) ;
Elm_Fileselector_Smart_Data * sd = _pd ;
2012-05-03 15:44:26 -07:00
if ( sd - > only_folder = = only ) return ;
sd - > only_folder = ! ! only ;
2013-09-10 02:47:30 -07:00
if ( sd - > path ) _populate ( obj , sd - > path , NULL , NULL ) ;
2009-10-22 15:10:23 -07:00
}
EAPI Eina_Bool
2010-03-31 13:19:55 -07:00
elm_fileselector_folder_only_get ( const Evas_Object * obj )
2009-10-22 15:10:23 -07:00
{
2012-05-03 15:44:26 -07:00
ELM_FILESELECTOR_CHECK ( obj ) EINA_FALSE ;
2012-11-25 22:32:53 -08:00
Eina_Bool ret = EINA_FALSE ;
eo_do ( ( Eo * ) obj , elm_obj_fileselector_folder_only_get ( & ret ) ) ;
return ret ;
}
2012-05-03 15:44:26 -07:00
2012-11-25 22:32:53 -08:00
static void
_folder_only_get ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
Elm_Fileselector_Smart_Data * sd = _pd ;
* ret = sd - > only_folder ;
2009-10-22 15:10:23 -07:00
}
EAPI void
2010-12-07 11:18:14 -08:00
elm_fileselector_buttons_ok_cancel_set ( Evas_Object * obj ,
2012-05-03 15:44:26 -07:00
Eina_Bool visible )
2009-10-22 15:10:23 -07:00
{
2012-11-25 22:32:53 -08:00
ELM_FILESELECTOR_CHECK ( obj ) ;
eo_do ( obj , elm_obj_fileselector_buttons_ok_cancel_set ( visible ) ) ;
}
static void
_buttons_ok_cancel_set ( Eo * obj , void * _pd , va_list * list )
{
Eina_Bool visible = va_arg ( * list , int ) ;
2010-11-25 02:01:39 -08:00
Evas_Object * bt ;
2012-05-03 15:44:26 -07:00
2012-11-25 22:32:53 -08:00
Elm_Fileselector_Smart_Data * sd = _pd ;
2010-03-09 19:47:33 -08:00
2013-06-24 14:07:26 -07:00
if ( visible & & ( ! sd - > ok_button ) )
2010-11-22 11:24:48 -08:00
{
2010-03-09 19:47:33 -08:00
// cancel btn
bt = elm_button_add ( obj ) ;
2011-02-10 07:13:05 -08:00
elm_widget_mirrored_automatic_set ( bt , EINA_FALSE ) ;
2011-10-19 07:17:14 -07:00
elm_object_domain_translatable_text_set ( bt , PACKAGE , N_ ( " Cancel " ) ) ;
2010-11-22 11:24:48 -08:00
2010-03-09 19:47:33 -08:00
evas_object_smart_callback_add ( bt , " clicked " , _canc , obj ) ;
2010-11-22 11:24:48 -08:00
2012-05-03 15:44:26 -07:00
sd - > cancel_button = bt ;
2010-03-31 13:19:55 -07:00
2010-03-09 19:47:33 -08:00
// ok btn
bt = elm_button_add ( obj ) ;
2011-02-10 07:13:05 -08:00
elm_widget_mirrored_automatic_set ( bt , EINA_FALSE ) ;
2011-10-19 07:17:14 -07:00
elm_object_domain_translatable_text_set ( bt , PACKAGE , N_ ( " OK " ) ) ;
2010-11-22 11:24:48 -08:00
2010-03-09 19:47:33 -08:00
evas_object_smart_callback_add ( bt , " clicked " , _ok , obj ) ;
2010-11-22 11:24:48 -08:00
2012-05-03 15:44:26 -07:00
sd - > ok_button = bt ;
2010-11-22 11:24:48 -08:00
2012-11-25 22:32:53 -08:00
eo_do ( obj , elm_wdg_theme ( NULL ) ) ;
2009-10-22 15:10:23 -07:00
}
2013-06-28 15:21:57 -07:00
else if ( ! visible )
2009-10-22 15:10:23 -07:00
{
2012-05-03 15:44:26 -07:00
evas_object_del ( sd - > cancel_button ) ;
sd - > cancel_button = NULL ;
evas_object_del ( sd - > ok_button ) ;
sd - > ok_button = NULL ;
2009-10-22 15:10:23 -07:00
}
}
EAPI Eina_Bool
2010-03-31 13:19:55 -07:00
elm_fileselector_buttons_ok_cancel_get ( const Evas_Object * obj )
2009-10-22 15:10:23 -07:00
{
2012-05-03 15:44:26 -07:00
ELM_FILESELECTOR_CHECK ( obj ) EINA_FALSE ;
2012-11-25 22:32:53 -08:00
Eina_Bool ret = EINA_FALSE ;
eo_do ( ( Eo * ) obj , elm_obj_fileselector_buttons_ok_cancel_get ( & ret ) ) ;
return ret ;
}
2012-05-03 15:44:26 -07:00
2012-11-25 22:32:53 -08:00
static void
_buttons_ok_cancel_get ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
Elm_Fileselector_Smart_Data * sd = _pd ;
* ret = sd - > ok_button ? EINA_TRUE : EINA_FALSE ;
2009-10-22 15:10:23 -07:00
}
2009-08-12 09:08:53 -07:00
EAPI void
2010-12-07 11:18:14 -08:00
elm_fileselector_expandable_set ( Evas_Object * obj ,
2012-05-03 15:44:26 -07:00
Eina_Bool expand )
2009-08-12 09:08:53 -07:00
{
2012-05-03 15:44:26 -07:00
ELM_FILESELECTOR_CHECK ( obj ) ;
2012-11-25 22:32:53 -08:00
eo_do ( obj , elm_obj_fileselector_expandable_set ( expand ) ) ;
}
static void
_expandable_set ( Eo * obj , void * _pd , va_list * list )
{
Eina_Bool expand = va_arg ( * list , int ) ;
Elm_Fileselector_Smart_Data * sd = _pd ;
2012-05-02 18:19:05 -07:00
2012-05-03 15:44:26 -07:00
sd - > expand = ! ! expand ;
2010-04-09 10:52:55 -07:00
2013-09-10 02:47:30 -07:00
if ( sd - > path ) _populate ( obj , sd - > path , NULL , NULL ) ;
2009-08-12 09:08:53 -07:00
}
2010-03-31 13:19:55 -07:00
EAPI Eina_Bool
elm_fileselector_expandable_get ( const Evas_Object * obj )
{
2012-05-03 15:44:26 -07:00
ELM_FILESELECTOR_CHECK ( obj ) EINA_FALSE ;
2012-11-25 22:32:53 -08:00
Eina_Bool ret = EINA_FALSE ;
eo_do ( ( Eo * ) obj , elm_obj_fileselector_expandable_get ( & ret ) ) ;
return ret ;
}
2012-05-03 15:44:26 -07:00
2012-11-25 22:32:53 -08:00
static void
_expandable_get ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
Elm_Fileselector_Smart_Data * sd = _pd ;
* ret = sd - > expand ;
2010-03-31 13:19:55 -07:00
}
2009-09-06 17:00:33 -07:00
EAPI void
2010-12-07 11:18:14 -08:00
elm_fileselector_path_set ( Evas_Object * obj ,
2012-05-03 15:44:26 -07:00
const char * _path )
2009-09-06 17:00:33 -07:00
{
2012-05-03 15:44:26 -07:00
ELM_FILESELECTOR_CHECK ( obj ) ;
2012-11-25 22:32:53 -08:00
eo_do ( obj , elm_obj_fileselector_path_set ( _path ) ) ;
}
static void
_path_set ( Eo * obj , void * _pd EINA_UNUSED , va_list * list )
{
const char * _path = va_arg ( * list , const char * ) ;
char * path ;
2012-05-03 15:44:26 -07:00
2012-02-20 01:22:23 -08:00
path = ecore_file_realpath ( _path ) ;
2013-09-10 02:47:30 -07:00
_populate ( obj , path , NULL , NULL ) ;
2012-02-20 01:22:23 -08:00
free ( path ) ;
2009-09-06 17:00:33 -07:00
}
EAPI const char *
2010-03-23 20:06:00 -07:00
elm_fileselector_path_get ( const Evas_Object * obj )
2009-09-06 17:00:33 -07:00
{
2012-05-03 15:44:26 -07:00
ELM_FILESELECTOR_CHECK ( obj ) NULL ;
2012-11-25 22:32:53 -08:00
const char * ret = NULL ;
eo_do ( ( Eo * ) obj , elm_obj_fileselector_path_get ( & ret ) ) ;
return ret ;
}
2012-05-03 15:44:26 -07:00
2012-11-25 22:32:53 -08:00
static void
_path_get ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
const char * * ret = va_arg ( * list , const char * * ) ;
Elm_Fileselector_Smart_Data * sd = _pd ;
* ret = sd - > path ;
2009-09-06 17:00:33 -07:00
}
2010-12-10 05:01:51 -08:00
EAPI void
2012-05-03 15:44:26 -07:00
elm_fileselector_mode_set ( Evas_Object * obj ,
2010-12-10 05:01:51 -08:00
Elm_Fileselector_Mode mode )
{
2012-05-03 15:44:26 -07:00
ELM_FILESELECTOR_CHECK ( obj ) ;
2012-11-25 22:32:53 -08:00
eo_do ( obj , elm_obj_fileselector_mode_set ( mode ) ) ;
}
2012-05-03 15:44:26 -07:00
2012-11-25 22:32:53 -08:00
static void
_mode_set ( Eo * obj , void * _pd , va_list * list )
{
Elm_Fileselector_Mode mode = va_arg ( * list , Elm_Fileselector_Mode ) ;
Elm_Fileselector_Smart_Data * sd = _pd ;
2012-05-02 10:01:48 -07:00
2012-05-03 15:44:26 -07:00
if ( mode = = sd - > mode ) return ;
2010-12-10 05:01:51 -08:00
2012-05-03 15:44:26 -07:00
evas_object_hide ( elm_layout_content_unset ( obj , " elm.swallow.files " ) ) ;
2010-12-10 05:01:51 -08:00
if ( mode = = ELM_FILESELECTOR_LIST )
2012-05-03 15:44:26 -07:00
elm_layout_content_set ( obj , " elm.swallow.files " , sd - > files_list ) ;
else elm_layout_content_set ( obj , " elm.swallow.files " , sd - > files_grid ) ;
2010-12-10 05:01:51 -08:00
2012-05-03 15:44:26 -07:00
sd - > mode = mode ;
2010-12-10 05:01:51 -08:00
2013-09-10 02:47:30 -07:00
_populate ( obj , sd - > path , NULL , NULL ) ;
2010-12-10 05:01:51 -08:00
}
EAPI Elm_Fileselector_Mode
elm_fileselector_mode_get ( const Evas_Object * obj )
{
2012-05-03 15:44:26 -07:00
ELM_FILESELECTOR_CHECK ( obj ) ELM_FILESELECTOR_LAST ;
2012-11-25 22:32:53 -08:00
Elm_Fileselector_Mode ret = ELM_FILESELECTOR_LAST ;
eo_do ( ( Eo * ) obj , elm_obj_fileselector_mode_get ( & ret ) ) ;
return ret ;
}
2012-05-02 18:19:05 -07:00
2012-11-25 22:32:53 -08:00
static void
_mode_get ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
Elm_Fileselector_Mode * ret = va_arg ( * list , Elm_Fileselector_Mode * ) ;
Elm_Fileselector_Smart_Data * sd = _pd ;
* ret = sd - > mode ;
2010-12-10 05:01:51 -08:00
}
2013-10-16 19:04:57 -07:00
EAPI void
elm_fileselector_multi_select_set ( Evas_Object * obj , Eina_Bool multi )
{
ELM_FILESELECTOR_CHECK ( obj ) ;
eo_do ( obj , elm_obj_fileselector_multi_select_set ( multi ) ) ;
}
static void
_multi_select_set ( Eo * obj __UNUSED__ , void * _pd , va_list * list __UNUSED__ )
{
Eina_Bool multi = va_arg ( * list , int ) ;
Elm_Fileselector_Smart_Data * sd = _pd ;
char * path ;
multi = ! ! multi ;
if ( sd - > multi = = multi ) return ;
sd - > multi = multi ;
elm_genlist_multi_select_set ( sd - > files_list , multi ) ;
elm_gengrid_multi_select_set ( sd - > files_grid , multi ) ;
if ( ! sd - > multi )
{
_clear_selections ( sd , NULL ) ;
EINA_LIST_FREE ( sd - > paths , path )
free ( path ) ;
}
else
{
const Eina_List * selected_items , * li ;
const Elm_Object_Item * it ;
if ( sd - > mode = = ELM_FILESELECTOR_LIST )
selected_items = elm_genlist_selected_items_get ( sd - > files_list ) ;
else
selected_items = elm_gengrid_selected_items_get ( sd - > files_list ) ;
EINA_LIST_FOREACH ( selected_items , li , it )
{
path = elm_object_item_data_get ( it ) ;
sd - > paths = eina_list_append ( sd - > paths , strdup ( path ) ) ;
}
}
}
EAPI Eina_Bool
elm_fileselector_multi_select_get ( const Evas_Object * obj )
{
ELM_FILESELECTOR_CHECK ( obj ) EINA_FALSE ;
Eina_Bool ret = EINA_FALSE ;
eo_do ( ( Eo * ) obj , elm_obj_fileselector_multi_select_get ( & ret ) ) ;
return ret ;
}
static void
_multi_select_get ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
Elm_Fileselector_Smart_Data * sd = _pd ;
* ret = sd - > multi ;
}
2010-03-09 19:47:33 -08:00
EAPI const char *
2010-03-23 20:06:00 -07:00
elm_fileselector_selected_get ( const Evas_Object * obj )
2009-08-12 09:08:53 -07:00
{
2012-05-03 15:44:26 -07:00
ELM_FILESELECTOR_CHECK ( obj ) NULL ;
2012-11-25 22:32:53 -08:00
const char * ret = NULL ;
eo_do ( ( Eo * ) obj , elm_obj_fileselector_selected_get ( & ret ) ) ;
return ret ;
}
static void
_selected_get ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
2013-01-03 12:48:14 -08:00
const char * fp ;
2012-11-25 22:32:53 -08:00
const char * * ret = va_arg ( * list , const char * * ) ;
* ret = NULL ;
Elm_Fileselector_Smart_Data * sd = _pd ;
2012-05-02 10:01:48 -07:00
2012-11-25 22:32:53 -08:00
if ( ! sd - > path ) return ;
2012-05-03 15:44:26 -07:00
2013-01-03 12:48:14 -08:00
fp = elm_object_text_get ( sd - > path_entry ) ;
if ( ecore_file_exists ( fp ) )
2009-09-06 17:00:33 -07:00
{
2013-08-21 13:18:09 -07:00
eina_stringshare_replace ( & sd - > selection , fp ) ;
2012-05-03 15:44:26 -07:00
2012-11-25 22:32:53 -08:00
* ret = sd - > selection ;
return ;
2009-09-06 17:00:33 -07:00
}
2010-03-31 13:19:55 -07:00
2012-11-25 22:32:53 -08:00
* ret = sd - > path ;
2012-05-03 15:44:26 -07:00
if ( sd - > mode = = ELM_FILESELECTOR_LIST )
2010-12-10 05:01:51 -08:00
{
2012-05-03 15:44:26 -07:00
Elm_Object_Item * gl_it = elm_genlist_selected_item_get ( sd - > files_list ) ;
2012-11-25 22:32:53 -08:00
if ( gl_it ) * ret = elm_object_item_data_get ( gl_it ) ;
2010-12-10 05:01:51 -08:00
}
else
{
2012-05-03 15:44:26 -07:00
Elm_Object_Item * gg_it = elm_gengrid_selected_item_get ( sd - > files_grid ) ;
2012-11-25 22:32:53 -08:00
if ( gg_it ) * ret = elm_object_item_data_get ( gg_it ) ;
2010-12-10 05:01:51 -08:00
}
2010-03-31 13:19:55 -07:00
2009-08-12 09:08:53 -07:00
}
2010-04-08 13:36:37 -07:00
EAPI Eina_Bool
2010-12-07 11:18:14 -08:00
elm_fileselector_selected_set ( Evas_Object * obj ,
2012-05-03 15:44:26 -07:00
const char * _path )
2010-04-08 13:36:37 -07:00
{
2012-11-25 22:32:53 -08:00
ELM_FILESELECTOR_CHECK ( obj ) EINA_FALSE ;
Eina_Bool ret = EINA_FALSE ;
eo_do ( obj , elm_obj_fileselector_selected_set ( _path , & ret ) ) ;
return ret ;
}
static void
_selected_set ( Eo * obj , void * _pd , va_list * list )
{
const char * _path = va_arg ( * list , const char * ) ;
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
2013-06-10 07:47:54 -07:00
char * selected ;
2012-11-25 22:32:53 -08:00
if ( ret ) * ret = EINA_TRUE ;
2012-02-20 01:22:23 -08:00
char * path ;
2012-05-03 15:44:26 -07:00
2012-11-25 22:32:53 -08:00
Elm_Fileselector_Smart_Data * sd = _pd ;
2012-05-03 15:44:26 -07:00
2012-02-20 01:22:23 -08:00
path = ecore_file_realpath ( _path ) ;
2013-09-10 02:47:30 -07:00
if ( ecore_file_is_dir ( path ) ) _populate ( obj , path , NULL , NULL ) ;
2010-04-08 13:36:37 -07:00
else
{
2010-09-07 20:54:42 -07:00
if ( ! ecore_file_exists ( path ) )
2012-02-20 01:22:23 -08:00
{
2012-11-25 22:32:53 -08:00
if ( ret ) * ret = EINA_FALSE ;
2012-02-20 01:22:23 -08:00
goto clean_up ;
}
2010-09-07 20:54:42 -07:00
2013-06-11 00:48:20 -07:00
selected = ecore_file_dir_get ( path ) ;
2013-09-10 02:47:30 -07:00
_populate ( obj , selected , NULL , NULL ) ;
2013-06-10 07:47:54 -07:00
eina_stringshare_replace ( & sd - > selection , path ) ;
free ( selected ) ;
2010-04-08 13:36:37 -07:00
}
2012-02-20 01:22:23 -08:00
clean_up :
free ( path ) ;
2010-04-08 13:36:37 -07:00
}
2012-11-25 22:32:53 -08:00
2013-10-16 19:04:57 -07:00
EAPI const Eina_List *
elm_fileselector_selected_paths_get ( const Evas_Object * obj )
{
ELM_FILESELECTOR_CHECK ( obj ) NULL ;
const Eina_List * ret = NULL ;
eo_do ( ( Eo * ) obj , elm_obj_fileselector_selected_paths_get ( & ret ) ) ;
return ret ;
}
static void
_selected_paths_get ( Eo * obj __UNUSED__ , void * _pd , va_list * list )
{
const Eina_List * * ret = va_arg ( * list , const Eina_List * * ) ;
Elm_Fileselector_Smart_Data * sd = _pd ;
if ( ! ret ) return ;
if ( sd - > multi )
* ret = sd - > paths ;
else
* ret = NULL ;
}
2013-06-18 17:00:41 -07:00
EAPI Eina_Bool
elm_fileselector_mime_types_filter_append ( Evas_Object * obj , const char * mime_type , const char * filter_name )
{
ELM_FILESELECTOR_CHECK ( obj ) EINA_FALSE ;
Eina_Bool ret = EINA_FALSE ;
eo_do ( obj , elm_obj_fileselector_mime_types_filter_append ( mime_type , filter_name , & ret ) ) ;
return ret ;
}
static void
_mime_types_filter_append ( Eo * obj , void * _pd , va_list * list )
{
const char * mime_types = va_arg ( * list , const char * ) ;
const char * filter_name = va_arg ( * list , const char * ) ;
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
Elm_Fileselector_Smart_Data * sd ;
Elm_Fileselector_Filter * ff ;
Eina_Bool int_ret = EINA_FALSE ;
Eina_Bool need_theme = EINA_FALSE ;
if ( ! mime_types ) goto end ;
sd = _pd ;
ff = malloc ( sizeof ( Elm_Fileselector_Filter ) ) ;
if ( ! ff ) goto end ;
if ( filter_name )
ff - > filter_name = eina_stringshare_add ( filter_name ) ;
else
ff - > filter_name = eina_stringshare_add ( mime_types ) ;
ff - > sd = sd ;
ff - > mime_types = eina_str_split ( mime_types , " , " , 0 ) ;
if ( ! sd - > filter_list )
{
sd - > current_filter = ff ;
sd - > filter_hoversel = elm_hoversel_add ( obj ) ;
elm_object_text_set ( sd - > filter_hoversel , ff - > filter_name ) ;
need_theme = EINA_TRUE ;
}
elm_hoversel_item_add ( sd - > filter_hoversel , ff - > filter_name , NULL , ELM_ICON_NONE , _current_filer_changed , ff ) ;
sd - > filter_list = eina_list_append ( sd - > filter_list , ff ) ;
2013-09-10 02:47:30 -07:00
_populate ( obj , sd - > path , NULL , NULL ) ;
2013-06-18 17:00:41 -07:00
if ( need_theme )
eo_do ( obj , elm_wdg_theme ( NULL ) ) ;
int_ret = EINA_TRUE ;
end :
if ( ret ) * ret = int_ret ;
}
EAPI void
elm_fileselector_filters_clear ( Evas_Object * obj )
{
ELM_FILESELECTOR_CHECK ( obj ) ;
eo_do ( obj , elm_obj_fileselector_filters_clear ( ) ) ;
}
static void
_filters_clear ( Eo * obj , void * _pd , va_list * list EINA_UNUSED )
{
Elm_Fileselector_Smart_Data * sd = _pd ;
Elm_Fileselector_Filter * filter ;
EINA_LIST_FREE ( sd - > filter_list , filter )
{
eina_stringshare_del ( filter - > filter_name ) ;
free ( filter - > mime_types [ 0 ] ) ;
free ( filter - > mime_types ) ;
free ( filter ) ;
}
ELM_SAFE_FREE ( sd - > filter_hoversel , evas_object_del ) ;
2013-09-10 02:47:30 -07:00
_populate ( obj , sd - > path , NULL , NULL ) ;
2013-06-18 17:00:41 -07:00
}
2012-11-25 22:32:53 -08:00
static void
_elm_fileselector_smart_focus_next_manager_is ( Eo * obj EINA_UNUSED , void * _pd EINA_UNUSED , va_list * list )
{
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
* ret = EINA_FALSE ;
}
static void
_elm_fileselector_smart_focus_direction_manager_is ( Eo * obj EINA_UNUSED , void * _pd EINA_UNUSED , va_list * list )
{
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
* ret = EINA_FALSE ;
}
2013-07-22 09:51:27 -07:00
static void
_elm_fileselector_smart_text_set ( Eo * obj EINA_UNUSED , void * _pd , va_list * list )
{
Elm_Fileselector_Smart_Data * sd = _pd ;
const char * part = va_arg ( * list , const char * ) ;
const char * label = va_arg ( * list , const char * ) ;
Eina_Bool * ret = va_arg ( * list , Eina_Bool * ) ;
if ( ret ) * ret = EINA_FALSE ;
2013-07-22 14:11:30 -07:00
Eina_Bool int_ret = EINA_FALSE ;
if ( ! part ) return ;
2013-07-22 09:51:27 -07:00
if ( sd - > ok_button & & ! strcmp ( part , " ok " ) )
{
elm_object_text_set ( sd - > ok_button , label ) ;
2013-07-22 14:11:30 -07:00
int_ret = EINA_TRUE ;
2013-07-22 09:51:27 -07:00
}
else if ( sd - > cancel_button & & ! strcmp ( part , " cancel " ) )
{
elm_object_text_set ( sd - > cancel_button , label ) ;
2013-07-22 14:11:30 -07:00
int_ret = EINA_TRUE ;
2013-07-22 09:51:27 -07:00
}
2013-07-22 14:11:30 -07:00
else
eo_do_super ( obj , MY_CLASS , elm_obj_layout_text_set ( part , label , & int_ret ) ) ;
if ( ret ) * ret = int_ret ;
2013-07-22 09:51:27 -07:00
}
2012-11-25 22:32:53 -08:00
static void
_class_constructor ( Eo_Class * klass )
{
2013-06-26 23:21:37 -07:00
unsigned int i ;
2012-11-25 22:32:53 -08:00
const Eo_Op_Func_Description func_desc [ ] = {
EO_OP_FUNC ( EO_BASE_ID ( EO_BASE_SUB_ID_CONSTRUCTOR ) , _constructor ) ,
EO_OP_FUNC ( EVAS_OBJ_SMART_ID ( EVAS_OBJ_SMART_SUB_ID_ADD ) , _elm_fileselector_smart_add ) ,
EO_OP_FUNC ( EVAS_OBJ_SMART_ID ( EVAS_OBJ_SMART_SUB_ID_DEL ) , _elm_fileselector_smart_del ) ,
EO_OP_FUNC ( ELM_WIDGET_ID ( ELM_WIDGET_SUB_ID_THEME ) , _elm_fileselector_smart_theme ) ,
EO_OP_FUNC ( ELM_WIDGET_ID ( ELM_WIDGET_SUB_ID_FOCUS_NEXT_MANAGER_IS ) , _elm_fileselector_smart_focus_next_manager_is ) ,
EO_OP_FUNC ( ELM_WIDGET_ID ( ELM_WIDGET_SUB_ID_FOCUS_DIRECTION_MANAGER_IS ) , _elm_fileselector_smart_focus_direction_manager_is ) ,
EO_OP_FUNC ( ELM_OBJ_LAYOUT_ID ( ELM_OBJ_LAYOUT_SUB_ID_SIZING_EVAL ) , _elm_fileselector_smart_sizing_eval ) ,
2013-07-22 09:51:27 -07:00
EO_OP_FUNC ( ELM_OBJ_LAYOUT_ID ( ELM_OBJ_LAYOUT_SUB_ID_TEXT_SET ) , _elm_fileselector_smart_text_set ) ,
2012-11-25 22:32:53 -08:00
EO_OP_FUNC ( ELM_OBJ_FILESELECTOR_ID ( ELM_OBJ_FILESELECTOR_SUB_ID_IS_SAVE_SET ) , _is_save_set ) ,
EO_OP_FUNC ( ELM_OBJ_FILESELECTOR_ID ( ELM_OBJ_FILESELECTOR_SUB_ID_IS_SAVE_GET ) , _is_save_get ) ,
EO_OP_FUNC ( ELM_OBJ_FILESELECTOR_ID ( ELM_OBJ_FILESELECTOR_SUB_ID_FOLDER_ONLY_SET ) , _folder_only_set ) ,
EO_OP_FUNC ( ELM_OBJ_FILESELECTOR_ID ( ELM_OBJ_FILESELECTOR_SUB_ID_FOLDER_ONLY_GET ) , _folder_only_get ) ,
EO_OP_FUNC ( ELM_OBJ_FILESELECTOR_ID ( ELM_OBJ_FILESELECTOR_SUB_ID_BUTTONS_OK_CANCEL_SET ) , _buttons_ok_cancel_set ) ,
EO_OP_FUNC ( ELM_OBJ_FILESELECTOR_ID ( ELM_OBJ_FILESELECTOR_SUB_ID_BUTTONS_OK_CANCEL_GET ) , _buttons_ok_cancel_get ) ,
EO_OP_FUNC ( ELM_OBJ_FILESELECTOR_ID ( ELM_OBJ_FILESELECTOR_SUB_ID_EXPANDABLE_SET ) , _expandable_set ) ,
EO_OP_FUNC ( ELM_OBJ_FILESELECTOR_ID ( ELM_OBJ_FILESELECTOR_SUB_ID_EXPANDABLE_GET ) , _expandable_get ) ,
EO_OP_FUNC ( ELM_OBJ_FILESELECTOR_ID ( ELM_OBJ_FILESELECTOR_SUB_ID_PATH_SET ) , _path_set ) ,
EO_OP_FUNC ( ELM_OBJ_FILESELECTOR_ID ( ELM_OBJ_FILESELECTOR_SUB_ID_PATH_GET ) , _path_get ) ,
EO_OP_FUNC ( ELM_OBJ_FILESELECTOR_ID ( ELM_OBJ_FILESELECTOR_SUB_ID_MODE_SET ) , _mode_set ) ,
EO_OP_FUNC ( ELM_OBJ_FILESELECTOR_ID ( ELM_OBJ_FILESELECTOR_SUB_ID_MODE_GET ) , _mode_get ) ,
2013-10-16 19:04:57 -07:00
EO_OP_FUNC ( ELM_OBJ_FILESELECTOR_ID ( ELM_OBJ_FILESELECTOR_SUB_ID_MULTI_SELECT_SET ) , _multi_select_set ) ,
EO_OP_FUNC ( ELM_OBJ_FILESELECTOR_ID ( ELM_OBJ_FILESELECTOR_SUB_ID_MULTI_SELECT_GET ) , _multi_select_get ) ,
2012-11-25 22:32:53 -08:00
EO_OP_FUNC ( ELM_OBJ_FILESELECTOR_ID ( ELM_OBJ_FILESELECTOR_SUB_ID_SELECTED_GET ) , _selected_get ) ,
EO_OP_FUNC ( ELM_OBJ_FILESELECTOR_ID ( ELM_OBJ_FILESELECTOR_SUB_ID_SELECTED_SET ) , _selected_set ) ,
2013-10-16 19:04:57 -07:00
EO_OP_FUNC ( ELM_OBJ_FILESELECTOR_ID ( ELM_OBJ_FILESELECTOR_SUB_ID_SELECTED_PATHS_GET ) , _selected_paths_get ) ,
2013-06-18 17:00:41 -07:00
EO_OP_FUNC ( ELM_OBJ_FILESELECTOR_ID ( ELM_OBJ_FILESELECTOR_SUB_ID_MIME_TYPES_FILTER_APPEND ) , _mime_types_filter_append ) ,
EO_OP_FUNC ( ELM_OBJ_FILESELECTOR_ID ( ELM_OBJ_FILESELECTOR_SUB_ID_FILTERS_CLEAR ) , _filters_clear ) ,
2012-11-25 22:32:53 -08:00
EO_OP_FUNC_SENTINEL
} ;
eo_class_funcs_set ( klass , func_desc ) ;
2013-02-09 23:52:31 -08:00
evas_smart_legacy_type_register ( MY_CLASS_NAME , klass ) ;
2013-06-26 23:21:37 -07:00
for ( i = 0 ; i < ELM_FILE_LAST ; + + i )
{
list_itc [ i ] = elm_genlist_item_class_new ( ) ;
grid_itc [ i ] = elm_gengrid_item_class_new ( ) ;
list_itc [ i ] - > item_style = " default " ;
list_itc [ i ] - > func . text_get = grid_itc [ i ] - > func . text_get =
_itc_text_get ;
list_itc [ i ] - > func . state_get = grid_itc [ i ] - > func . state_get =
_itc_state_get ;
list_itc [ i ] - > func . del = grid_itc [ i ] - > func . del = _itc_del ;
}
2012-11-25 22:32:53 -08:00
}
2013-06-26 23:21:37 -07:00
static void
_class_destructor ( Eo_Class * klass EINA_UNUSED )
{
unsigned int i ;
for ( i = 0 ; i < ELM_FILE_LAST ; + + i )
{
elm_genlist_item_class_free ( list_itc [ i ] ) ;
elm_gengrid_item_class_free ( grid_itc [ i ] ) ;
}
}
2012-11-25 22:32:53 -08:00
static const Eo_Op_Description op_desc [ ] = {
EO_OP_DESCRIPTION ( ELM_OBJ_FILESELECTOR_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 widget. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FILESELECTOR_SUB_ID_IS_SAVE_GET , " Get whether the given file selector is in 'saving dialog' mode. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FILESELECTOR_SUB_ID_FOLDER_ONLY_SET , " Enable/disable folder-only view for a given file selector widget. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FILESELECTOR_SUB_ID_FOLDER_ONLY_GET , " Get whether folder-only view is set for a given file selector widget. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FILESELECTOR_SUB_ID_BUTTONS_OK_CANCEL_SET , " Enable/disable the 'ok' and 'cancel' buttons on a given file selector widget. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FILESELECTOR_SUB_ID_BUTTONS_OK_CANCEL_GET , " Get whether the 'ok' and 'cancel' buttons on a given file selector widget are being shown. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FILESELECTOR_SUB_ID_EXPANDABLE_SET , " Enable/disable a tree view in the given file selector widget, if it's in #ELM_FILESELECTOR_LIST mode. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FILESELECTOR_SUB_ID_EXPANDABLE_GET , " Get whether tree view is enabled for the given file selector widget. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FILESELECTOR_SUB_ID_PATH_SET , " Set, programmatically, the directory that a given file selector widget will display contents from. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FILESELECTOR_SUB_ID_PATH_GET , " Get the parent directory's path that a given file selector widget is displaying. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FILESELECTOR_SUB_ID_MODE_SET , " Set the mode in which a given file selector widget will display (layout) file system entries in its view. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FILESELECTOR_SUB_ID_MODE_GET , " Get the mode in which a given file selector widget is displaying (layouting) file system entries in its view. " ) ,
2013-10-16 19:04:57 -07:00
EO_OP_DESCRIPTION ( ELM_OBJ_FILESELECTOR_SUB_ID_MULTI_SELECT_SET , " Enable or disable multi-selection in the file selector widget. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FILESELECTOR_SUB_ID_MULTI_SELECT_GET , " Get if multi-selection in file selector widget is enabled or disabled. " ) ,
2012-11-25 22:32:53 -08:00
EO_OP_DESCRIPTION ( ELM_OBJ_FILESELECTOR_SUB_ID_SELECTED_GET , " Get the currently selected item's (full) path, in the given file selector widget. " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FILESELECTOR_SUB_ID_SELECTED_SET , " Set, programmatically, the currently selected file/directory in the given file selector widget. " ) ,
2013-10-16 19:04:57 -07:00
EO_OP_DESCRIPTION ( ELM_OBJ_FILESELECTOR_SUB_ID_SELECTED_PATHS_GET , " Get the currently selected item's (full) path, in the given file selector widget. " ) ,
2013-06-18 17:00:41 -07:00
EO_OP_DESCRIPTION ( ELM_OBJ_FILESELECTOR_SUB_ID_MIME_TYPES_FILTER_APPEND , " Append mime type filter " ) ,
EO_OP_DESCRIPTION ( ELM_OBJ_FILESELECTOR_SUB_ID_FILTERS_CLEAR , " Clear filters " ) ,
2012-11-25 22:32:53 -08:00
EO_OP_DESCRIPTION_SENTINEL
} ;
static const Eo_Class_Description class_desc = {
EO_VERSION ,
MY_CLASS_NAME ,
EO_CLASS_TYPE_REGULAR ,
EO_CLASS_DESCRIPTION_OPS ( & ELM_OBJ_FILESELECTOR_BASE_ID , op_desc , ELM_OBJ_FILESELECTOR_SUB_ID_LAST ) ,
NULL ,
sizeof ( Elm_Fileselector_Smart_Data ) ,
_class_constructor ,
2013-06-26 23:21:37 -07:00
_class_destructor
2012-11-25 22:32:53 -08:00
} ;
EO_DEFINE_CLASS ( elm_obj_fileselector_class_get , & class_desc , ELM_OBJ_LAYOUT_CLASS , NULL ) ;