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);
|