[maemo-commits] [maemo-commits] r12076 - in projects/haf/trunk/hildon-fm: . hildon-fm

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Mon Jun 4 10:28:04 EEST 2007
Author: marivoll
Date: 2007-06-04 10:27:56 +0300 (Mon, 04 Jun 2007)
New Revision: 12076

Modified:
   projects/haf/trunk/hildon-fm/ChangeLog
   projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-chooser-dialog.c
   projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-chooser-dialog.h
Log:
	* hildon-fm/hildon-file-chooser-dialog.c,
	hildon-fm/hildon-file-chooser-dialog.h (sync_extensions_combo,
	extension_changed,
	hildon_file_chooser_dialog_add_extensions_combo): New.


Modified: projects/haf/trunk/hildon-fm/ChangeLog
===================================================================
--- projects/haf/trunk/hildon-fm/ChangeLog	2007-06-01 20:43:33 UTC (rev 12075)
+++ projects/haf/trunk/hildon-fm/ChangeLog	2007-06-04 07:27:56 UTC (rev 12076)
@@ -1,3 +1,16 @@
+2007-06-04  Marius Vollmer  <marius.vollmer at nokia.com>
+
+	* hildon-fm/hildon-file-chooser-dialog.c,
+	hildon-fm/hildon-file-chooser-dialog.h (sync_extensions_combo,
+	extension_changed,
+	hildon_file_chooser_dialog_add_extensions_combo): New.
+
+2007-06-01  Marius Vollmer  <marius.vollmer at nokia.com>
+
+	* hildon-fm/hildon-file-chooser-dialog.h,
+	hildon-fm/hildon-file-chooser-dialog.c
+	(hildon_file_chooser_dialog_add_extra): New.
+
 2007-05-31  Marius Vollmer  <marius.vollmer at nokia.com>
 
 	* hildon-fm/hildon-file-selection.c (trigger_repair): Pass address

Modified: projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-chooser-dialog.c
===================================================================
--- projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-chooser-dialog.c	2007-06-01 20:43:33 UTC (rev 12075)
+++ projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-chooser-dialog.c	2007-06-04 07:27:56 UTC (rev 12076)
@@ -70,6 +70,7 @@
 #define FILE_SELECTION_WIDTH_TOTAL 590  /* Width for full filetree (both
                                            content and navigation pane) */
 
+static void sync_extensions_combo (HildonFileChooserDialogPrivate *priv);
 
 #define HILDON_FILE_CHOOSER_DIALOG_TYPE_SELECTION_MODE (hildon_file_chooser_dialog_selection_mode_get_type())
 static GType
@@ -110,11 +111,13 @@
     GtkWidget *cancel_button;
     HildonFileSelection *filetree;
     HildonFileSystemModel *model;
+    GtkSizeGroup *caption_size_group;
     GtkWidget *caption_control_name;
     GtkWidget *caption_control_location;
     GtkWidget *label_location;
     GtkWidget *entry_name;
     GtkWidget *hbox_location, *image_location, *title_location;
+    GtkWidget *extensions_combo;
     GtkFileChooserAction action;
     GtkWidget *popup;
     GtkWidget *multiple_label, *hbox_items;
@@ -531,6 +534,7 @@
             g_free(priv->ext_name);
             priv->ext_name = g_strdup(dot);
             *dot = '\0';
+	    sync_extensions_combo (priv);
       }
   }
 
@@ -1583,6 +1587,8 @@
     HildonFileChooserDialogPrivate *priv =
         HILDON_FILE_CHOOSER_DIALOG(obj)->priv;
 
+    g_object_unref(priv->caption_size_group);
+
     g_free(priv->stub_name);
     g_free(priv->ext_name);
 
@@ -1793,6 +1799,7 @@
                                     HildonFileChooserDialogPrivate);
 
     size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
+    priv->caption_size_group = size_group;
     priv->filters = NULL;
     priv->autonaming_enabled = TRUE;
     priv->should_show_folder_button = TRUE;
@@ -1853,7 +1860,6 @@
     gtk_box_pack_start(GTK_BOX(priv->caption_control_location), eventbox, TRUE, TRUE, 0);
     gtk_size_group_add_widget(size_group, priv->label_location);
     gtk_size_group_add_widget(size_group, label_items);
-    g_object_unref(size_group);
 
     priv->popup = gtk_menu_new();
     shell = GTK_MENU_SHELL(priv->popup);
@@ -2036,6 +2042,162 @@
 }
 
 /**
+ * hildon_file_chooser_dialog_add_extra:
+ * @self: dialog widget
+ * @widget: widget to add
+ *
+ * Add @widget to the dialog, below the "Name" and "Location" fields.
+ * When @widget is a #HildonCaption, care is taken that the labels line
+ * up with existing HildonCaptions.
+ */
+void
+hildon_file_chooser_dialog_add_extra (HildonFileChooserDialog *self,
+				      GtkWidget *widget)
+{
+  HildonFileChooserDialogPrivate *priv = self->priv;
+
+  /* XXX - HildonCaption widgets seem to need special treatment when
+           setting their size groups...
+  */
+  if (HILDON_IS_CAPTION (widget))
+    hildon_caption_set_size_group (HILDON_CAPTION (widget), 
+				   priv->caption_size_group);
+  else
+    gtk_size_group_add_widget (priv->caption_size_group, widget);
+
+  gtk_box_pack_start (GTK_BOX(GTK_DIALOG(self)->vbox), widget,
+		      FALSE, TRUE, 0);
+}
+
+static void
+sync_extensions_combo (HildonFileChooserDialogPrivate *priv)
+{
+  if (priv->ext_name && priv->extensions_combo)
+    {
+      GtkTreeModel *model;
+      GtkTreeIter iter;
+      gboolean valid;
+      int i;
+
+      model = gtk_combo_box_get_model (GTK_COMBO_BOX (priv->extensions_combo));
+
+      i = 0;
+      valid = gtk_tree_model_get_iter_first (model, &iter);
+      while (valid)
+	{
+	  gchar *ext;
+	  gtk_tree_model_get (model, &iter, 1, &ext, -1);
+	  if (strcmp (ext, priv->ext_name + 1) == 0)
+	    {
+	      gtk_combo_box_set_active (GTK_COMBO_BOX (priv->extensions_combo),
+					i);
+	      g_free (ext);
+	      break;
+	    }
+
+	  g_free (ext);
+	  i++;
+	  valid = gtk_tree_model_iter_next (model, &iter); 
+	}
+    }
+}
+
+static void
+extension_changed (GtkComboBox *widget, gpointer data)
+{
+  gchar *ext;
+  GtkTreeModel *model;
+  GtkTreeIter iter;
+
+  HildonFileChooserDialogPrivate *priv = 
+    HILDON_FILE_CHOOSER_DIALOG (data)->priv;
+
+  model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
+  gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter);
+  gtk_tree_model_get (model, &iter, 1, &ext, -1);
+  
+  g_free (priv->ext_name);
+  priv->ext_name = g_strconcat (".", ext, NULL);
+  hildon_file_chooser_dialog_do_autonaming (priv);
+
+  g_free (ext);
+}
+
+/**
+ * hildon_file_chooser_dialog_add_extensions_combo:
+ * @self: dialog widget
+ * @extensions: extensions to offer
+ * @ext_names: names of the extensions to show in the UI
+ *
+ * Create and add a combo box widget with a list of file extensions.
+ * This combobox will track and modify the extension of the current
+ * filename; it is not a filter.
+ *
+ * @extensions should be a vector of strings, terminated by #NULL.  The
+ * strings in it are the extensions, without a leading '.'.
+ *
+ * @ext_names, when non-#NULL, is a vector parallel to @extensions
+ * that determines the names of the extensions to use in the UI.  When
+ * @ext_names is NULL, the extensions themselves are used as the
+ * names.
+ */
+
+GtkWidget *
+hildon_file_chooser_dialog_add_extensions_combo (HildonFileChooserDialog *self,
+						 char **extensions,
+						 char **ext_names)
+{
+  GtkTreeIter      iter;
+  GtkListStore    *model;
+  GtkCellRenderer *renderer;
+  GtkWidget       *caption;
+  GtkWidget       *combo;
+  gint            i = 0;
+
+  g_return_val_if_fail (self->priv->extensions_combo == NULL, NULL);
+    
+  model = GTK_LIST_STORE (gtk_list_store_new (2,
+					      G_TYPE_STRING,
+					      G_TYPE_STRING));
+  combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (model));
+  self->priv->extensions_combo = combo;
+
+  for (i = 0; extensions[i]; i++)
+    {
+      gtk_list_store_append (model, &iter);
+      gtk_list_store_set (model, &iter,
+			  0, ext_names? ext_names[i] : extensions[i],
+			  1, extensions[i],
+			  -1);
+    }
+
+  renderer = gtk_cell_renderer_text_new ();
+  gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo),
+			      renderer, TRUE);
+  gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo),
+				  renderer, "text", 0, NULL);
+
+  g_object_unref(model);
+
+  g_signal_connect (G_OBJECT (combo), "changed",
+		    G_CALLBACK (extension_changed), self);
+
+  caption = hildon_caption_new (NULL,
+				_("sfil_fi_save_object_dialog_type"),
+				combo, NULL,
+				HILDON_CAPTION_OPTIONAL);
+
+  hildon_file_chooser_dialog_add_extra (self, caption);
+  
+  gtk_widget_show (combo);
+  gtk_widget_show (caption);
+  
+  sync_extensions_combo (self->priv);
+
+  return combo;
+}
+
+/**
  * hildon_file_chooser_dialog_set_safe_folder:
  * @self: a #HildonFileChooserDialog widget.
  * @local_path: a path to safe folder.

Modified: projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-chooser-dialog.h
===================================================================
--- projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-chooser-dialog.h	2007-06-01 20:43:33 UTC (rev 12075)
+++ projects/haf/trunk/hildon-fm/hildon-fm/hildon-file-chooser-dialog.h	2007-06-04 07:27:56 UTC (rev 12076)
@@ -87,7 +87,31 @@
 void     hildon_file_chooser_dialog_set_show_upnp (HildonFileChooserDialog *self, gboolean value);
 gboolean hildon_file_chooser_dialog_get_show_upnp (HildonFileChooserDialog *self);
 
+/* Add WIDGET to the dialog, below the "Name" and "Location" fields.
+   When WIDGET is a HildonCaption, care is taken that the labels line
+   up with existing HildonCaptions.
+*/
+void hildon_file_chooser_dialog_add_extra (HildonFileChooserDialog *self,
+					   GtkWidget *widget);
+
+/* Create and add a combo box widget with a list of file extensions.
+   This combobox will track and modify the extension of the current
+   filename, it is not a filter.
+
+   EXTENSIONS should be a vector of strings, terminated by NULL.  The
+   strings in it are the extensions, without a leading '.'.
+
+   EXT_NAMES, when non-NULL, is a vector parallel to EXTENSIONS that
+   determines the names of the extensions to use in the UI.  When
+   EXT_NAMES is NULL, the exentions themselved are used as the names.
+*/
+GtkWidget *
+hildon_file_chooser_dialog_add_extensions_combo (HildonFileChooserDialog *self,
+						 char **extensions,
+						 char **ext_names);
+
 /* 
+
     Note! Other functionality is provided by GtkFileChooser interface. See:
     
     http://developer.gnome.org/doc/API/2.0/gtk/GtkFileChooser.html 


More information about the maemo-commits mailing list