Hello Moom, CodeWarrior,

As per my discussion with CodeWarrior, here is a diff for
etk_filechooser_widget which does the following:

***********************************************************************
-Adds 2 new properties: Select_Multiple and Show_Hidden.

-Adds a function to allow/disallow multiple files to be selected. (False
By Default).

-Adds a function to allow/disallow showing of hidden files. (False By
Default).

-Adds a function to get the current_folder.

-Adds a function to get/set the current_file.
***********************************************************************

Please give it a once-over, and if everything is kewl, commit it :)

I've tested all this with a proto app I am making. The only "gotcha" I
found is that show_hidden needs to be set before the current_folder is
set. Perhaps there is a way to work around that.

Cheers,
devilhorns
--- etk_filechooser_widget.c.orig	2006-02-10 05:43:33.000000000 -0500
+++ etk_filechooser_widget.c	2006-02-10 19:30:36.000000000 -0500
@@ -29,7 +29,9 @@
 
 enum _Etk_Filechooser_Widget_Property_Id
 {
-   ETK_FILECHOOSER_WIDGET_PATH_PROPERTY
+   ETK_FILECHOOSER_WIDGET_PATH_PROPERTY,
+   ETK_FILECHOOSER_WIDGET_SELECT_MULTIPLE_PROPERTY,
+   ETK_FILECHOOSER_WIDGET_SHOW_HIDDEN_PROPERTY
 };
 
 typedef struct _Etk_Filechooser_Widget_Icons
@@ -45,6 +47,7 @@
 static void _etk_filechooser_widget_favs_get(Etk_Filechooser_Widget *filechooser_widget);
 static void _etk_filechooser_widget_dir_row_selected_cb(Etk_Object *object, Etk_Tree_Row *row, void *data);
 static void _etk_filechooser_widget_fav_row_selected_cb(Etk_Object *object, Etk_Tree_Row *row, void *data);
+static void _etk_filechooser_widget_file_row_selected_cb(Etk_Object *object, Etk_Tree_Row *row, void *data);
 
 static Etk_Filechooser_Widget_Icons _etk_file_chooser_icons[] =
 {
@@ -67,7 +70,7 @@
    { "rar", "mimetypes/package-x-generic_16" },
 };
 static int _etk_file_chooser_num_icons = sizeof(_etk_file_chooser_icons) / sizeof (_etk_file_chooser_icons[0]);
-static Etk_Signal *_etk_filechooser_widget_signals[ETK_FILECHOOSER_WIDGET_NUM_SIGNALS];
+//static Etk_Signal *_etk_filechooser_widget_signals[ETK_FILECHOOSER_WIDGET_NUM_SIGNALS];
 
 /**************************
  *
@@ -90,7 +93,9 @@
       //_etk_filechooser_widget_signals[ETK_FILECHOOSER_WIDGET_TEXT_POPPED_SIGNAL] = etk_signal_new("text_popped", filechooser_widget_type, -1, etk_marshaller_VOID__INT_POINTER, NULL, NULL);
       
       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));
+
       filechooser_widget_type->property_set = _etk_filechooser_widget_property_set;
       filechooser_widget_type->property_get = _etk_filechooser_widget_property_get;
    }
@@ -135,8 +140,11 @@
    ecore_list_goto_first(files);
    while ((file_name = ecore_list_next(files)))
    {
-      if (file_name[0] == '.')
-         continue;
+      if (!filechooser_widget->show_hidden) 
+	{
+	   if (file_name[0] == '.')
+	     continue;
+	}
       
       free(file_path);
       file_path = malloc(strlen(folder) + strlen(file_name) + 2);
@@ -162,9 +170,12 @@
       const char *ext;
       char *icon = NULL;
       int i;
-      
-      if (file_name[0] == '.')
-         continue;
+
+      if (!filechooser_widget->show_hidden) 
+	{      
+	   if (file_name[0] == '.')
+	     continue;
+	}
       
       free(file_path);
       file_path = malloc(strlen(folder) + strlen(file_name) + 2);
@@ -197,6 +208,112 @@
    ecore_list_destroy(files);
 }
 
+/**
+ * @brief Retrieve the current folder
+ * @return Returns the current folder
+ */
+char *etk_filechooser_widget_current_folder_get(Etk_Filechooser_Widget *filechooser_widget) 
+{
+   Etk_Widget *fcw;
+
+   if (!(fcw = ETK_WIDGET(filechooser_widget)) || !filechooser_widget->dir_tree)
+      return NULL;
+
+   return filechooser_widget->current_folder;
+}
+
+/**
+ * @brief Sets the current filename
+ * @return
+ */
+void etk_filechooser_widget_current_file_set(Etk_Filechooser_Widget *filechooser_widget, const char *file)
+{
+   Etk_Widget *fcw;
+
+   if (!(fcw = ETK_WIDGET(filechooser_widget)) || !filechooser_widget->files_tree)
+      return;
+
+   filechooser_widget->current_file = strdup(file);
+}
+
+/**
+ * @brief Retrieve the currently selected filename
+ * @return Returns the currenttly selected filename
+ */
+char *etk_filechooser_widget_current_file_get(Etk_Filechooser_Widget *filechooser_widget)
+{
+   Etk_Widget *fcw;
+
+   if (!(fcw = ETK_WIDGET(filechooser_widget)) || !filechooser_widget->files_tree)
+      return NULL;
+
+   if (!filechooser_widget->current_file)
+     return NULL;
+   
+   return filechooser_widget->current_file;
+}
+
+/**
+ * @brief Set if the filechooser widget can select multiple files
+ * @return
+ */
+void 
+etk_filechooser_widget_select_multiple_set(Etk_Filechooser_Widget *filechooser_widget, Etk_Bool select_multiple)
+{
+   Etk_Widget *fcw;
+
+   if (!(fcw = ETK_WIDGET(filechooser_widget)) || !filechooser_widget->files_tree)
+      return;
+
+   etk_tree_multiple_select_set(ETK_TREE(filechooser_widget->files_tree), select_multiple);   
+}
+
+/**
+ * @brief Retrieve if the file chooser widget can select multiple files
+ * @return Returns if the file chooser widget can select multiple files
+ */
+Etk_Bool 
+etk_filechooser_widget_select_multiple_get(Etk_Filechooser_Widget *filechooser_widget)
+{
+   Etk_Widget *fcw;
+
+   if (!(fcw = ETK_WIDGET(filechooser_widget)) || !filechooser_widget->files_tree)
+      return ETK_FALSE;
+
+   return etk_tree_multiple_select_get(ETK_TREE(filechooser_widget->files_tree));
+}
+
+/**
+ * @brief Sets if the file chooser widget can show hidden files
+ * @return
+ */
+void 
+etk_filechooser_widget_show_hidden_set(Etk_Filechooser_Widget *filechooser_widget, Etk_Bool show_hidden)
+{
+   Etk_Widget *fcw;
+
+   if (!(fcw = ETK_WIDGET(filechooser_widget)))
+      return;
+
+   filechooser_widget->show_hidden = show_hidden;
+   //etk_filechooser_widget_current_folder_set(filechooser_widget, filechooser_widget->current_folder);
+}
+
+/**
+ * @brief Retrieve if the file chooser widget can show hidden files
+ * @return Returns if the file chooser widget can show hidden files
+ */
+Etk_Bool 
+etk_filechooser_widget_show_hidden_get(Etk_Filechooser_Widget *filechooser_widget)
+{
+   Etk_Widget *fcw;
+
+   if (!(fcw = ETK_WIDGET(filechooser_widget)))
+      return ETK_FALSE;
+
+   return filechooser_widget->show_hidden;
+}
+
 /**************************
  *
  * Etk specific functions
@@ -249,10 +366,15 @@
    fcw->files_date_col = etk_tree_col_new(ETK_TREE(fcw->files_tree), "Date", etk_tree_model_text_new(ETK_TREE(fcw->files_tree)), 60);
    etk_tree_build(ETK_TREE(fcw->files_tree));
    etk_widget_show(fcw->files_tree);
+   etk_signal_connect("row_selected", ETK_OBJECT(fcw->files_tree), ETK_CALLBACK(_etk_filechooser_widget_file_row_selected_cb), fcw);
 
    _etk_filechooser_widget_favs_get(ETK_FILECHOOSER_WIDGET(fcw));   
    
    fcw->current_folder = NULL;
+   fcw->current_file = NULL;
+   fcw->select_multiple = ETK_FALSE;
+   fcw->show_hidden = ETK_FALSE;
+   
    /* Go to home */
    etk_filechooser_widget_current_folder_set(ETK_FILECHOOSER_WIDGET(fcw), NULL);
 }
@@ -263,6 +385,7 @@
    if (!filechooser_widget)
       return;
    free(filechooser_widget->current_folder);
+   free(filechooser_widget->current_file);
 }
 
 /* Sets the property whose id is "property_id" to the value "value" */
@@ -278,8 +401,14 @@
       case ETK_FILECHOOSER_WIDGET_HAS_RESIZE_GRIP_PROPERTY:
          etk_filechooser_widget_has_resize_grip_set(filechooser_widget, etk_property_value_bool_get(value));
          break;*/
-      default:
-         break;
+    case ETK_FILECHOOSER_WIDGET_SELECT_MULTIPLE_PROPERTY:
+      etk_filechooser_widget_select_multiple_set(filechooser_widget, etk_property_value_bool_get(value));
+      break;
+    case ETK_FILECHOOSER_WIDGET_SHOW_HIDDEN_PROPERTY:
+      etk_filechooser_widget_show_hidden_set(filechooser_widget, etk_property_value_bool_get(value));
+      break;
+    default:
+      break;
    }
 }
 
@@ -296,8 +425,14 @@
       case ETK_FILECHOOSER_WIDGET_HAS_RESIZE_GRIP_PROPERTY:
          etk_property_value_bool_set(value, filechooser_widget->has_resize_grip);
          break;*/
-      default:
-         break;
+    case ETK_FILECHOOSER_WIDGET_SELECT_MULTIPLE_PROPERTY:
+      etk_property_value_bool_set(value, etk_filechooser_widget_select_multiple_get(filechooser_widget));
+      break;
+    case ETK_FILECHOOSER_WIDGET_SHOW_HIDDEN_PROPERTY:
+      etk_property_value_bool_set(value, etk_filechooser_widget_show_hidden_get(filechooser_widget));
+      break;
+    default:
+      break;
    }
 }
 
@@ -368,9 +503,26 @@
      return;
       
    selected_dir = etk_tree_row_data_get(row);
-   etk_filechooser_widget_current_folder_set(filechooser_widget, selected_dir);
+   etk_filechooser_widget_current_folder_set(filechooser_widget, selected_dir);   
+}
+
+/* Called when a row of the "files" tree is selected */
+static void _etk_filechooser_widget_file_row_selected_cb(Etk_Object *object, Etk_Tree_Row *row, void *data)
+{
+   Etk_Filechooser_Widget *filechooser_widget;
+   char *selected_file;
+   char *new_file;
    
-}    
+   if (!(filechooser_widget = ETK_FILECHOOSER_WIDGET(data)))
+      return;
+
+   etk_tree_row_fields_get(row, filechooser_widget->files_name_col, NULL, NULL, &selected_file, NULL);
+
+   new_file = malloc(strlen(filechooser_widget->current_folder) + strlen(selected_file) + 2);
+   sprintf(new_file, "%s/%s", filechooser_widget->current_folder, selected_file);
+   etk_filechooser_widget_current_file_set(filechooser_widget, new_file);
+   free(new_file);
+}
 
 /**************************
  *
--- etk_filechooser_widget.h.orig	2006-02-10 05:43:40.000000000 -0500
+++ etk_filechooser_widget.h	2006-02-10 18:54:31.000000000 -0500
@@ -41,15 +41,28 @@
    Etk_Widget *files_tree;
    Etk_Tree_Col *files_name_col;
    Etk_Tree_Col *files_date_col;   
+
+   Etk_Bool select_multiple;
+   Etk_Bool show_hidden;
    
    char *current_folder;
+   char *current_file;
 };
 
 Etk_Type *etk_filechooser_widget_type_get();
 Etk_Widget *etk_filechooser_widget_new();
 
+void etk_filechooser_widget_select_multiple_set(Etk_Filechooser_Widget *filechooser_widget, Etk_Bool select_multiple);
+Etk_Bool etk_filechooser_widget_select_multiple_get(Etk_Filechooser_Widget *filechooser_widget);
+
+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_current_folder_set(Etk_Filechooser_Widget *filechooser_widget, const char *folder);
+char *etk_filechooser_widget_current_folder_get(Etk_Filechooser_Widget *filechooser_widget);
 
+void etk_filechooser_widget_current_file_set(Etk_Filechooser_Widget *filechooser_widget, const char *file);
+char *etk_filechooser_widget_current_file_get(Etk_Filechooser_Widget *filechooser_widget);
 
 /** @} */
 

Reply via email to