Enlightenment CVS committal Author : davemds Project : e17 Module : libs/etk
Dir : e17/libs/etk/src/lib Modified Files: etk_filechooser_widget.c etk_filechooser_widget.h Log Message: Etk_Filechooser_Widget improvements, see bug #151 for details =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_filechooser_widget.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -3 -r1.23 -r1.24 --- etk_filechooser_widget.c 25 Jul 2007 17:00:58 -0000 1.23 +++ etk_filechooser_widget.c 13 Aug 2007 00:20:16 -0000 1.24 @@ -16,6 +16,8 @@ #include "etk_tree_model.h" #include "etk_paned.h" #include "etk_box.h" +#include "etk_entry.h" +#include "etk_label.h" #include "config.h" /* OS-specific to list the mount points */ @@ -45,7 +47,8 @@ { ETK_FILECHOOSER_WIDGET_PATH_PROPERTY, ETK_FILECHOOSER_WIDGET_SELECT_MULTIPLE_PROPERTY, - ETK_FILECHOOSER_WIDGET_SHOW_HIDDEN_PROPERTY + ETK_FILECHOOSER_WIDGET_SHOW_HIDDEN_PROPERTY, + ETK_FILECHOOSER_WIDGET_IS_SAVE_PROPERTY }; typedef struct _Etk_Filechooser_Widget_Icons @@ -63,6 +66,7 @@ static void _etk_filechooser_widget_place_activated_cb(Etk_Object *object, Etk_Tree_Row *row, void *data); static void _etk_filechooser_widget_fav_activated_cb(Etk_Object *object, Etk_Tree_Row *row, void *data); static void _etk_filechooser_widget_file_activated_cb(Etk_Object *object, Etk_Tree_Row *row, void *data); +static void _etk_filechooser_widget_file_selected_cb(Etk_Object *object, Etk_Tree_Row *row, void *data); static void _etk_filechooser_widget_places_tree_fill(Etk_Filechooser_Widget *fcw); static void _etk_filechooser_widget_favs_tree_fill(Etk_Filechooser_Widget *fcw); @@ -116,6 +120,7 @@ etk_type_property_add(filechooser_widget_type, "path", ETK_FILECHOOSER_WIDGET_PATH_PROPERTY, ETK_PROPERTY_STRING, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_string(NULL)); etk_type_property_add(filechooser_widget_type, "select-multiple", ETK_FILECHOOSER_WIDGET_SELECT_MULTIPLE_PROPERTY, ETK_PROPERTY_BOOL, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_bool(ETK_FALSE)); etk_type_property_add(filechooser_widget_type, "show-hidden", ETK_FILECHOOSER_WIDGET_SHOW_HIDDEN_PROPERTY, ETK_PROPERTY_BOOL, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_bool(ETK_FALSE)); + etk_type_property_add(filechooser_widget_type, "is-save", ETK_FILECHOOSER_WIDGET_IS_SAVE_PROPERTY, ETK_PROPERTY_BOOL, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_bool(ETK_FALSE)); filechooser_widget_type->property_set = _etk_filechooser_widget_property_set; filechooser_widget_type->property_get = _etk_filechooser_widget_property_get; @@ -157,6 +162,9 @@ filechooser_widget->current_folder = strdup(folder); etk_tree_clear(ETK_TREE(filechooser_widget->files_tree)); + if (!filechooser_widget->is_save) + etk_entry_clear(ETK_ENTRY(filechooser_widget->name_entry)); + /* TODO: Do not walk through the list twice!! */ ecore_list_first_goto(files); while ((filename = ecore_list_next(files))) @@ -245,8 +253,13 @@ if (!filechooser_widget && !(filechooser_widget->files_tree)) return NULL; - if ((row = etk_tree_selected_row_get(ETK_TREE(filechooser_widget->files_tree)))) - etk_tree_row_fields_get(row, filechooser_widget->files_name_col, NULL, NULL, &filename, NULL); + if (!filechooser_widget->is_save) + { + if ((row = etk_tree_selected_row_get(ETK_TREE(filechooser_widget->files_tree)))) + etk_tree_row_fields_get(row, filechooser_widget->files_name_col, NULL, NULL, &filename, NULL); + } + else + filename = etk_entry_text_get(ETK_ENTRY(filechooser_widget->name_entry)); return filename; } @@ -291,7 +304,7 @@ */ Etk_Bool etk_filechooser_widget_select_multiple_get(Etk_Filechooser_Widget *filechooser_widget) { - if (filechooser_widget) + if (!filechooser_widget) return ETK_FALSE; /* TODO: notify */ return etk_tree_multiple_select_get(ETK_TREE(filechooser_widget->files_tree)); @@ -324,6 +337,34 @@ return filechooser_widget->show_hidden; } +/** + * @brief Sets if the file chooser is a save chooser + * @param filechooser_widget a filechooser widget + * @param is_save ETK_TRUE to enable the file name entry (aka save widget) + * If @p is_save is TRUE then the user have the ability to write a custom file name + * in the file name entry. Else the file name entry is disabled. + */ +void etk_filechooser_widget_is_save_set(Etk_Filechooser_Widget *filechooser_widget, Etk_Bool is_save) +{ + if (!filechooser_widget) + return; + + filechooser_widget->is_save = is_save; + etk_widget_disabled_set(filechooser_widget->name_entry, !is_save); + + //etk_object_notify(ETK_OBJECT(filechooser_widget), "is_save"); +} + +/** + * @brief Retrieve if the file chooser widget is a save chooser + * @return Returns if the file chooser widget is a save chooser + */ +Etk_Bool etk_filechooser_widget_is_save_get(Etk_Filechooser_Widget *filechooser_widget) +{ + if (!filechooser_widget) + return ETK_FALSE; + return filechooser_widget->is_save; +} /************************** * * Etk specific functions @@ -333,7 +374,10 @@ /* Initializes the members */ static void _etk_filechooser_widget_constructor(Etk_Filechooser_Widget *fcw) { + Etk_Widget *hpaned; Etk_Widget *vpaned; + Etk_Widget *hbox; + Etk_Widget *label; if (!fcw) return; @@ -343,14 +387,28 @@ fcw->current_folder = NULL; fcw->select_multiple = ETK_FALSE; fcw->show_hidden = ETK_FALSE; + fcw->is_save = ETK_FALSE; + + fcw->vbox = etk_vbox_new(ETK_FALSE,0); + etk_widget_parent_set(fcw->vbox, ETK_WIDGET(fcw)); + + hbox = etk_hbox_new(ETK_FALSE,10); + etk_box_append(ETK_BOX(fcw->vbox),hbox,ETK_BOX_START,ETK_BOX_EXPAND_FILL,3); + + label = etk_label_new("<b>File name:</b>"); + etk_box_append(ETK_BOX(hbox),label,ETK_BOX_START,ETK_BOX_NONE,10); + + fcw->name_entry = etk_entry_new(); + etk_widget_disabled_set(fcw->name_entry, ETK_TRUE); + etk_box_append(ETK_BOX(hbox),fcw->name_entry,ETK_BOX_START,ETK_BOX_EXPAND_FILL,10); - fcw->hpaned = etk_hpaned_new(); - etk_widget_parent_set(fcw->hpaned, ETK_WIDGET(fcw)); - etk_widget_show(fcw->hpaned); - etk_widget_internal_set(fcw->hpaned, ETK_TRUE); + hpaned = etk_hpaned_new(); + etk_box_append(ETK_BOX(fcw->vbox),hpaned,ETK_BOX_START,ETK_BOX_EXPAND_FILL,10); + etk_widget_show(hpaned); + etk_widget_internal_set(hpaned, ETK_TRUE); vpaned = etk_vpaned_new(); - etk_paned_child1_set(ETK_PANED(fcw->hpaned), vpaned, ETK_FALSE); + etk_paned_child1_set(ETK_PANED(hpaned), vpaned, ETK_FALSE); etk_widget_show(vpaned); etk_widget_internal_set(vpaned, ETK_TRUE); @@ -363,7 +421,7 @@ etk_tree_build(ETK_TREE(fcw->places_tree)); etk_widget_show(fcw->places_tree); etk_widget_internal_set(fcw->places_tree, ETK_TRUE); - etk_signal_connect("row-activated", ETK_OBJECT(fcw->places_tree), ETK_CALLBACK(_etk_filechooser_widget_place_activated_cb), fcw); + etk_signal_connect("row-selected", ETK_OBJECT(fcw->places_tree), ETK_CALLBACK(_etk_filechooser_widget_place_activated_cb), fcw); fcw->fav_tree = etk_tree_new(); etk_widget_size_request_set(fcw->fav_tree, 180, 180); @@ -374,11 +432,11 @@ etk_tree_build(ETK_TREE(fcw->fav_tree)); etk_widget_show(fcw->fav_tree); etk_widget_internal_set(fcw->fav_tree, ETK_TRUE); - etk_signal_connect("row-activated", ETK_OBJECT(fcw->fav_tree), ETK_CALLBACK(_etk_filechooser_widget_fav_activated_cb), fcw); + etk_signal_connect("row-selected", ETK_OBJECT(fcw->fav_tree), ETK_CALLBACK(_etk_filechooser_widget_fav_activated_cb), fcw); fcw->files_tree = etk_tree_new(); etk_widget_size_request_set(fcw->files_tree, 400, 120); - etk_paned_child2_set(ETK_PANED(fcw->hpaned), fcw->files_tree, ETK_TRUE); + etk_paned_child2_set(ETK_PANED(hpaned), fcw->files_tree, ETK_TRUE); fcw->files_name_col = etk_tree_col_new(ETK_TREE(fcw->files_tree), _("Filename"), 100, 0.0); etk_tree_col_model_add(fcw->files_name_col, etk_tree_model_image_new()); etk_tree_col_model_add(fcw->files_name_col, etk_tree_model_text_new()); @@ -389,6 +447,7 @@ etk_widget_show(fcw->files_tree); etk_widget_internal_set(fcw->files_tree, ETK_TRUE); etk_signal_connect("row-activated", ETK_OBJECT(fcw->files_tree), ETK_CALLBACK(_etk_filechooser_widget_file_activated_cb), fcw); + etk_signal_connect("row-selected", ETK_OBJECT(fcw->files_tree), ETK_CALLBACK(_etk_filechooser_widget_file_selected_cb), fcw); _etk_filechooser_widget_places_tree_fill(ETK_FILECHOOSER_WIDGET(fcw)); _etk_filechooser_widget_favs_tree_fill(ETK_FILECHOOSER_WIDGET(fcw)); @@ -421,6 +480,9 @@ case ETK_FILECHOOSER_WIDGET_SHOW_HIDDEN_PROPERTY: etk_filechooser_widget_show_hidden_set(filechooser_widget, etk_property_value_bool_get(value)); break; + case ETK_FILECHOOSER_WIDGET_IS_SAVE_PROPERTY: + etk_filechooser_widget_is_save_set(filechooser_widget, etk_property_value_bool_get(value)); + break; /* TODO: ETK_FILECHOOSER_WIDGET_PATH_PROPERTY */ default: break; @@ -443,6 +505,9 @@ case ETK_FILECHOOSER_WIDGET_SHOW_HIDDEN_PROPERTY: etk_property_value_bool_set(value, etk_filechooser_widget_show_hidden_get(filechooser_widget)); break; + case ETK_FILECHOOSER_WIDGET_IS_SAVE_PROPERTY: + etk_property_value_bool_set(value, etk_filechooser_widget_is_save_get(filechooser_widget)); + break; /* TODO: ETK_FILECHOOSER_WIDGET_PATH_PROPERTY */ default: break; @@ -456,7 +521,7 @@ if (!(fcw = ETK_FILECHOOSER_WIDGET(widget)) || !size_requisition) return; - etk_widget_size_request(fcw->hpaned, size_requisition); + etk_widget_size_request(fcw->vbox, size_requisition); } /* Renders the filechooser in the allocated geometry */ @@ -466,7 +531,7 @@ if (!(fcw = ETK_FILECHOOSER_WIDGET(widget))) return; - etk_widget_size_allocate(fcw->hpaned, geometry); + etk_widget_size_allocate(fcw->vbox, geometry); } /************************** @@ -475,7 +540,7 @@ * **************************/ -/* Called when a row of the "places" tree is activated (double-click or space) */ +/* Called when a row of the "places" tree is selected (single click) */ static void _etk_filechooser_widget_place_activated_cb(Etk_Object *object, Etk_Tree_Row *row, void *data) { Etk_Filechooser_Widget *filechooser_widget; @@ -493,9 +558,10 @@ } else etk_filechooser_widget_current_folder_set(filechooser_widget, selected_dir); + etk_tree_unselect_all(ETK_TREE(filechooser_widget->fav_tree)); } -/* Called when a row of the "favorites" tree is activated (double-click or space) */ +/* Called when a row of the "favorites" tree is selected (single click) */ static void _etk_filechooser_widget_fav_activated_cb(Etk_Object *object, Etk_Tree_Row *row, void *data) { Etk_Filechooser_Widget *filechooser_widget; @@ -503,6 +569,7 @@ if (!(filechooser_widget = ETK_FILECHOOSER_WIDGET(data))) return; etk_filechooser_widget_current_folder_set(filechooser_widget, etk_tree_row_data_get(row)); + etk_tree_unselect_all(ETK_TREE(filechooser_widget->places_tree)); } /* Called when a row of the "files" tree is activated (double-click or space) */ @@ -526,7 +593,22 @@ ; } } - +/* Called when a row of the "files" tree is selected (single click) */ +static void _etk_filechooser_widget_file_selected_cb(Etk_Object *object, Etk_Tree_Row *row, void *data) +{ + Etk_Filechooser_Widget *filechooser_widget; + char *selected_file; + char file_path[PATH_MAX]; + + if (!(filechooser_widget = ETK_FILECHOOSER_WIDGET(data))) + return; + + etk_tree_row_fields_get(row, filechooser_widget->files_name_col, NULL, NULL, &selected_file, NULL); + snprintf(file_path, PATH_MAX, "%s/%s", filechooser_widget->current_folder, selected_file); + + if (ecore_file_exists(file_path) && !ecore_file_is_dir(file_path)) + etk_entry_text_set(ETK_ENTRY(filechooser_widget->name_entry),selected_file); +} /************************** * * Private functions @@ -544,9 +626,9 @@ etk_tree_freeze(ETK_TREE(fcw->places_tree)); - row = etk_tree_row_append(ETK_TREE(fcw->places_tree), NULL, + /* row = etk_tree_row_append(ETK_TREE(fcw->places_tree), NULL, fcw->places_col, etk_theme_icon_path_get(), "actions/go-up_16", "..", NULL); - etk_tree_row_data_set_full(row, strdup(".."), free); + etk_tree_row_data_set_full(row, strdup(".."), free); */ if ((home = getenv("HOME"))) { =================================================================== RCS file: /cvs/e/e17/libs/etk/src/lib/etk_filechooser_widget.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- etk_filechooser_widget.h 27 Jul 2007 16:24:14 -0000 1.6 +++ etk_filechooser_widget.h 13 Aug 2007 00:20:16 -0000 1.7 @@ -11,7 +11,7 @@ * @{ */ -/** Gets the type of a status bar */ +/** Gets the type of a fileschooser widget */ #define ETK_FILECHOOSER_WIDGET_TYPE (etk_filechooser_widget_type_get()) /** Casts the object to an Etk_Filechooser_Widget */ #define ETK_FILECHOOSER_WIDGET(obj) (ETK_OBJECT_CAST((obj), ETK_FILECHOOSER_WIDGET_TYPE, Etk_Filechooser_Widget)) @@ -20,7 +20,7 @@ /** * @struct Etk_Filechooser_Widget - * @brief An Etk_Filechooser_Widget is a widget used to select several files + * @brief An Etk_Filechooser_Widget is a widget used to select one or more files */ struct Etk_Filechooser_Widget { @@ -28,7 +28,8 @@ /* Inherit from Etk_Widget */ Etk_Widget widget; - Etk_Widget *hpaned; + Etk_Widget *vbox; + Etk_Widget *name_entry; Etk_Widget *places_tree; Etk_Tree_Col *places_col; @@ -42,6 +43,7 @@ Etk_Bool select_multiple; Etk_Bool show_hidden; + Etk_Bool is_save; char *current_folder; }; @@ -54,6 +56,9 @@ void etk_filechooser_widget_show_hidden_set(Etk_Filechooser_Widget *filechooser_widget, Etk_Bool show_hidden); Etk_Bool etk_filechooser_widget_show_hidden_get(Etk_Filechooser_Widget *filechooser_widget); + +void etk_filechooser_widget_is_save_set(Etk_Filechooser_Widget *filechooser_widget, Etk_Bool is_save); +Etk_Bool etk_filechooser_widget_is_save_get(Etk_Filechooser_Widget *filechooser_widget); void etk_filechooser_widget_current_folder_set(Etk_Filechooser_Widget *filechooser_widget, const char *folder); const char *etk_filechooser_widget_current_folder_get(Etk_Filechooser_Widget *filechooser_widget); ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs