quick-lounge-applet r246 - in trunk: . data/ui src



Author: paobac
Date: Tue Feb  3 12:36:52 2009
New Revision: 246
URL: http://svn.gnome.org/viewvc/quick-lounge-applet?rev=246&view=rev

Log:
2009-02-03  Paolo Bacchilega  <paobac svn gnome org>

	* src/qck-desktop-entry-dialog.c: 
	
	allow to select the command from the file chooser.
	
	* src/dlg-pick-applications.c: 
	* data/ui/choose-from-menu.ui: 

	Re-designed the "choose application from menu" dialog.


Modified:
   trunk/ChangeLog
   trunk/data/ui/choose-from-menu.ui
   trunk/src/dlg-pick-applications.c
   trunk/src/qck-desktop-entry-dialog.c

Modified: trunk/data/ui/choose-from-menu.ui
==============================================================================
--- trunk/data/ui/choose-from-menu.ui	(original)
+++ trunk/data/ui/choose-from-menu.ui	Tue Feb  3 12:36:52 2009
@@ -3,7 +3,9 @@
   <requires lib="gtk+" version="2.14"/>
   <!-- interface-naming-policy toplevel-contextual -->
   <object class="GtkDialog" id="from_menu_dialog">
-    <property name="border_width">6</property>
+    <property name="width_request">650</property>
+    <property name="height_request">400</property>
+    <property name="border_width">5</property>
     <property name="title" translatable="yes">Add Existing Launcher</property>
     <property name="window_position">center</property>
     <property name="type_hint">normal</property>
@@ -11,81 +13,107 @@
     <child internal-child="vbox">
       <object class="GtkVBox" id="dialog-vbox2">
         <property name="visible">True</property>
-        <property name="spacing">12</property>
+        <property name="spacing">5</property>
         <child>
           <object class="GtkVBox" id="vbox8">
             <property name="visible">True</property>
             <property name="border_width">6</property>
             <property name="spacing">5</property>
             <child>
-              <object class="GtkLabel" id="label17">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Available applications:</property>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkScrolledWindow" id="scrolledwindow2">
-                <property name="width_request">600</property>
-                <property name="height_request">300</property>
+              <object class="GtkHPaned" id="hpaned2">
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
-                <property name="hscrollbar_policy">automatic</property>
-                <property name="vscrollbar_policy">automatic</property>
-                <property name="shadow_type">in</property>
+                <property name="position">250</property>
+                <property name="position_set">True</property>
                 <child>
-                  <object class="GtkTreeView" id="fm_treeview">
+                  <object class="GtkVBox" id="vbox3">
                     <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="enable_search">False</property>
-                  </object>
-                </child>
-              </object>
-              <packing>
-                <property name="position">1</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkHBox" id="hbox13">
-                <property name="visible">True</property>
-                <property name="spacing">5</property>
-                <child>
-                  <object class="GtkButton" id="fm_expand_button">
-                    <property name="label" translatable="yes">E_xpand All</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="use_underline">True</property>
+                    <property name="orientation">vertical</property>
+                    <property name="spacing">6</property>
+                    <child>
+                      <object class="GtkLabel" id="label3">
+                        <property name="visible">True</property>
+                        <property name="xalign">0</property>
+                        <property name="label" translatable="yes">Menu:</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkScrolledWindow" id="scrolledwindow3">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="hscrollbar_policy">automatic</property>
+                        <property name="vscrollbar_policy">automatic</property>
+                        <property name="shadow_type">in</property>
+                        <child>
+                          <object class="GtkTreeView" id="directory_treeview">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="headers_visible">False</property>
+                            <property name="enable_search">False</property>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
                   </object>
                   <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">0</property>
+                    <property name="resize">False</property>
+                    <property name="shrink">True</property>
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkButton" id="fm_collapse_button">
-                    <property name="label" translatable="yes">Collap_se All</property>
+                  <object class="GtkVBox" id="vbox4">
                     <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="use_underline">True</property>
+                    <property name="orientation">vertical</property>
+                    <property name="spacing">6</property>
+                    <child>
+                      <object class="GtkLabel" id="label4">
+                        <property name="visible">True</property>
+                        <property name="xalign">0</property>
+                        <property name="label" translatable="yes">Available applications:</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkScrolledWindow" id="scrolledwindow4">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="hscrollbar_policy">automatic</property>
+                        <property name="vscrollbar_policy">automatic</property>
+                        <property name="shadow_type">in</property>
+                        <child>
+                          <object class="GtkTreeView" id="application_treeview">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="headers_visible">False</property>
+                            <property name="enable_search">False</property>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
                   </object>
                   <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">1</property>
+                    <property name="resize">True</property>
+                    <property name="shrink">True</property>
                   </packing>
                 </child>
               </object>
               <packing>
-                <property name="expand">False</property>
-                <property name="position">2</property>
+                <property name="position">0</property>
               </packing>
             </child>
           </object>
@@ -98,7 +126,7 @@
             <property name="visible">True</property>
             <property name="layout_style">end</property>
             <child>
-              <object class="GtkButton" id="fm_help_button">
+              <object class="GtkButton" id="help_button">
                 <property name="label">gtk-help</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
@@ -114,7 +142,7 @@
               </packing>
             </child>
             <child>
-              <object class="GtkButton" id="fm_cancel_button">
+              <object class="GtkButton" id="cancel_button">
                 <property name="label">gtk-cancel</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
@@ -129,7 +157,7 @@
               </packing>
             </child>
             <child>
-              <object class="GtkButton" id="fm_ok_button">
+              <object class="GtkButton" id="ok_button">
                 <property name="label">gtk-add</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
@@ -153,9 +181,9 @@
       </object>
     </child>
     <action-widgets>
-      <action-widget response="0">fm_help_button</action-widget>
-      <action-widget response="0">fm_cancel_button</action-widget>
-      <action-widget response="0">fm_ok_button</action-widget>
+      <action-widget response="0">help_button</action-widget>
+      <action-widget response="0">cancel_button</action-widget>
+      <action-widget response="0">ok_button</action-widget>
     </action-widgets>
   </object>
 </interface>

Modified: trunk/src/dlg-pick-applications.c
==============================================================================
--- trunk/src/dlg-pick-applications.c	(original)
+++ trunk/src/dlg-pick-applications.c	Tue Feb  3 12:36:52 2009
@@ -3,7 +3,7 @@
 /*
  *  Quick Lounge Applet
  *
- *  Copyright (C) 2001 The Free Software Foundation, Inc.
+ *  Copyright (C) 2001-2009 The Free Software Foundation, Inc.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -30,18 +30,26 @@
 #include "file-utils.h"
 
 
-#define ICON_SIZE_MENU  22    /* icons size in menus */
 #define GET_WIDGET(name) _gtk_builder_get_widget (data->builder, (name))
 
 
 enum {
 	APP_URI_COLUMN = 0,
-	USE_APP_COLUMN,
-	IS_LAUNCHER_COLUMN,
 	APP_ICON_COLUMN,
 	APP_NAME_COLUMN,
 	APP_COMMENT_COLUMN,
-	NUM_COLUMNS
+	USE_APP_COLUMN,
+	APP_N_COLUMNS
+};
+
+
+enum {
+	DIRECTORY_MENU_POINTER_COLUMN = 0,
+	DIRECTORY_MENU_FILE_COLUMN,
+	DIRECTORY_MENU_ID_COLUMN,
+	DIRECTORY_ICON_COLUMN,
+	DIRECTORY_NAME_COLUMN,
+	DIRECTORY_N_COLUMNS
 };
 	
 
@@ -49,15 +57,14 @@
 	QuickLounge   *quick_lounge;
 	QuickBox      *quick_box;
 	int            pos;
-
 	GtkBuilder    *builder;
-
 	GtkWidget     *dialog;
-	GtkWidget     *tree_view;
-
-	GtkTreeModel  *model;
-
-	gboolean something_added;
+	GtkWidget     *directory_treeview;
+	GtkWidget     *application_treeview;
+	GtkTreeModel  *directory_model;
+	GtkTreeModel  *application_model;
+	GHashTable    *uris;
+	GList         *tree_items;
 } DialogData;
 
 
@@ -67,6 +74,8 @@
 	    DialogData *data)
 {
 	g_object_unref (data->builder);
+	g_list_foreach (data->tree_items, (GFunc) gmenu_tree_item_unref, NULL);
+	g_hash_table_destroy (data->uris);
 	g_free (data);
 }
 
@@ -80,42 +89,36 @@
 }
 
 
-static gboolean 
-check_check (GtkTreeModel *model, 
-	     GtkTreePath  *path, 
-	     GtkTreeIter  *iter, 
-	     gpointer      callback_data)
+static gboolean
+add_selected_applications (DialogData *data) 
 {
-	DialogData *data = callback_data;
-	gboolean    use_app;
-
-	gtk_tree_model_get (data->model, iter, 
-			    USE_APP_COLUMN, &use_app, 
-			    -1);
-
-	if (use_app) {
-		char *src_uri, *dest_uri;
-
-		gtk_tree_model_get (data->model, iter, 
-				    APP_URI_COLUMN, &src_uri, 
-				    -1);
-
+	gboolean  changed = FALSE;
+	GList    *keys;
+	GList    *scan;
+	
+	keys = g_hash_table_get_keys (data->uris);
+	for (scan = keys; scan; scan = scan->next) {
+		const char *path = scan->data;
+		char       *src_uri;
+		char       *dest_uri;
+		
+		src_uri = g_filename_to_uri (path, NULL, NULL);
 		dest_uri = quick_lounge_util__get_unique_uri (data->quick_lounge);
-
 		if (! file_copy (src_uri, dest_uri)) {
 			g_free (src_uri);
-			return FALSE;
+			g_free (dest_uri);
+			break;
 		}
 
 		quick_box_add_button (data->quick_box, dest_uri, ++data->pos);
-
-		g_free (src_uri);
+		changed = TRUE;
+		
 		g_free (dest_uri);
-
-		data->something_added = TRUE;
+		g_free (src_uri);
 	}
-
-	return FALSE;
+	g_list_free (keys);
+	
+	return changed;
 }
 
 
@@ -124,9 +127,7 @@
 ok_cb (GtkWidget  *widget, 
        DialogData *data)
 {
-	gtk_tree_model_foreach (data->model, check_check, data);
-
-	if (data->something_added) {
+	if (add_selected_applications (data)) {
 		quick_lounge_save_order (data->quick_lounge);
 		dlg_properties_update (data->quick_lounge->prop_dialog);
 	}
@@ -135,60 +136,45 @@
 }
 
 
-void
-add_applications_from_dir (DialogData         *data,
-			   GtkTreeIter        *tree_iter,
-			   GMenuTreeDirectory  *menu_dir)
+static void
+set_application_list (DialogData         *data,
+		      GMenuTreeDirectory *menu_dir)
 {
-	QuickLounge *quick_lounge = data->quick_lounge;
-	GSList      *items, *scan;
+	GSList *items, *scan;
 
-	GtkTreeIter  iter;
+	gtk_list_store_clear (GTK_LIST_STORE (data->application_model));
+	
+	if (menu_dir == NULL)
+		return;
 
 	items = gmenu_tree_directory_get_contents (menu_dir);
-
 	for (scan = items; scan; scan = scan->next) {
 		GMenuTreeItem *item = scan->data;
-		const char        *icon_path = NULL;
-		GdkPixbuf         *icon = NULL;
-
+		GtkTreeIter    iter;
+		const char    *icon = NULL;
+		GdkPixbuf     *image = NULL;
+	
 		switch (gmenu_tree_item_get_type (item)) {
-		case GMENU_TREE_ITEM_DIRECTORY:
-			icon_path = gmenu_tree_directory_get_icon (GMENU_TREE_DIRECTORY (item));
-			if (icon_path != NULL)
-				icon = create_pixbuf (quick_lounge->icon_theme, icon_path, ICON_SIZE_MENU);
-		
-			gtk_tree_store_append (GTK_TREE_STORE (data->model), &iter, tree_iter);
-			gtk_tree_store_set (GTK_TREE_STORE (data->model), &iter,
-				    APP_URI_COLUMN, NULL,
-				    USE_APP_COLUMN, FALSE,
-				    IS_LAUNCHER_COLUMN, FALSE,
-				    APP_ICON_COLUMN, icon,
-				    APP_NAME_COLUMN, gmenu_tree_directory_get_name (GMENU_TREE_DIRECTORY (item)),
-				    APP_COMMENT_COLUMN, gmenu_tree_directory_get_comment (GMENU_TREE_DIRECTORY (item)),
-				    -1);
-			if (icon != NULL)
-				g_object_unref (icon);
-
-			add_applications_from_dir (data, &iter, GMENU_TREE_DIRECTORY (item));
-			break;
 		case GMENU_TREE_ITEM_ENTRY:
-			icon_path = gmenu_tree_entry_get_icon (GMENU_TREE_ENTRY (item));
-			if (icon_path != NULL)
-				icon = create_pixbuf (quick_lounge->icon_theme, icon_path, ICON_SIZE_MENU);
+			icon = gmenu_tree_entry_get_icon (GMENU_TREE_ENTRY (item));
+			if (icon != NULL) {
+				int size;
+				
+				size = _gtk_icon_get_pixel_size (GTK_WIDGET (data->dialog), GTK_ICON_SIZE_BUTTON);
+				image = create_pixbuf (data->quick_lounge->icon_theme, icon, size);
+			}
 		
-			gtk_tree_store_append (GTK_TREE_STORE (data->model), &iter, tree_iter);
-			gtk_tree_store_set (GTK_TREE_STORE (data->model), &iter,
-				    APP_URI_COLUMN, gmenu_tree_entry_get_desktop_file_path (GMENU_TREE_ENTRY (item)),
-				    USE_APP_COLUMN, FALSE,
-				    IS_LAUNCHER_COLUMN, TRUE,
-				    APP_ICON_COLUMN, icon,
-				    APP_NAME_COLUMN, gmenu_tree_entry_get_name (GMENU_TREE_ENTRY (item)),
-				    APP_COMMENT_COLUMN, gmenu_tree_entry_get_comment (GMENU_TREE_ENTRY (item)),
-				    -1);
+			gtk_list_store_append (GTK_LIST_STORE (data->application_model), &iter);
+			gtk_list_store_set (GTK_LIST_STORE (data->application_model), &iter,
+					    APP_URI_COLUMN, gmenu_tree_entry_get_desktop_file_path (GMENU_TREE_ENTRY (item)),
+					    APP_ICON_COLUMN, image,
+					    APP_NAME_COLUMN, gmenu_tree_entry_get_name (GMENU_TREE_ENTRY (item)),
+					    APP_COMMENT_COLUMN, gmenu_tree_entry_get_comment (GMENU_TREE_ENTRY (item)),
+					    USE_APP_COLUMN, FALSE,
+					    -1);
 		
-			if (icon != NULL)
-				g_object_unref (icon);
+			if (image != NULL)
+				g_object_unref (image);
 
 			break;
 		default:
@@ -197,58 +183,108 @@
 
 		gmenu_tree_item_unref (item);
 	}
+	g_slist_free (items);
+}		 
+
 
+static void
+add_directories_from_dir (DialogData         *data,
+			  const char         *menu_file,
+			  GtkTreeIter        *tree_iter,
+			  GMenuTreeDirectory *menu_dir,
+			  gboolean            expand)
+{
+	QuickLounge *quick_lounge = data->quick_lounge;
+	const char  *icon = NULL;
+	GdkPixbuf   *image = NULL;
+	GtkTreeIter  iter;
+	GSList      *items, *scan;
+	
+	data->tree_items = g_list_prepend (data->tree_items, gmenu_tree_item_ref (menu_dir));
+	
+	icon = gmenu_tree_directory_get_icon (menu_dir);
+	if (icon != NULL) {
+		int size;
+		
+		size = _gtk_icon_get_pixel_size (GTK_WIDGET (data->dialog), GTK_ICON_SIZE_BUTTON);
+		image = create_pixbuf (quick_lounge->icon_theme, icon, size);
+	}
+	
+	gtk_tree_store_append (GTK_TREE_STORE (data->directory_model), &iter, tree_iter);
+	gtk_tree_store_set (GTK_TREE_STORE (data->directory_model), &iter,
+			    DIRECTORY_MENU_POINTER_COLUMN, menu_dir,
+			    DIRECTORY_MENU_FILE_COLUMN, menu_file,
+			    DIRECTORY_MENU_ID_COLUMN, gmenu_tree_directory_get_menu_id (menu_dir),			    
+			    DIRECTORY_ICON_COLUMN, image,
+			    DIRECTORY_NAME_COLUMN, gmenu_tree_directory_get_name (menu_dir),
+			    -1);
+	
+	if (image != NULL)
+		g_object_unref (image);
+
+	items = gmenu_tree_directory_get_contents (menu_dir);
+	for (scan = items; scan; scan = scan->next) {
+		GMenuTreeItem *item = scan->data;
+
+		switch (gmenu_tree_item_get_type (item)) {
+		case GMENU_TREE_ITEM_DIRECTORY:
+			add_directories_from_dir (data, menu_file, &iter, GMENU_TREE_DIRECTORY (item), FALSE);
+			break;
+		default:
+			break;
+		}
+		
+		gmenu_tree_item_ref (item);
+	}
 	g_slist_free (items);
+	
+	if (expand) {
+		GtkTreePath *path;
+			
+		path = gtk_tree_model_get_path (data->directory_model, &iter); 
+		gtk_tree_view_expand_row (GTK_TREE_VIEW (data->directory_treeview), path, FALSE);
+		gtk_tree_path_free (path);
+	}
 }
 
 
-void
-add_applications (DialogData  *data,
-		  const char  *menu_file)
+static void
+add_directories_from_file (DialogData *data,
+			   const char *menu_file)
 {
-	GMenuTree           *menu_tree;
-	GMenuTreeDirectory  *menu_dir;
+	GMenuTree          *menu_tree;
+	GMenuTreeDirectory *menu_dir;
 
 	menu_tree = gmenu_tree_lookup (menu_file, GMENU_TREE_FLAGS_NONE);
 	if (menu_tree == NULL)
 		return;
 
 	menu_dir = gmenu_tree_get_root_directory (menu_tree);
-	add_applications_from_dir (data, NULL, menu_dir);
+	add_directories_from_dir (data, menu_file, NULL, menu_dir, TRUE);
 	gmenu_tree_item_unref (menu_dir);
 
-	gtk_tree_view_expand_all (GTK_TREE_VIEW (data->tree_view));
-
 	gmenu_tree_unref (menu_tree);
 }
 
 
 static int
-name_column_sort_func (GtkTreeModel *model, 
-                       GtkTreeIter  *a, 
-                       GtkTreeIter  *b, 
-                       gpointer      user_data)
-{
-        char     *app1, *app2;
-	int       result;
-	gboolean  is_launcher1, is_launcher2;
+directory_name_column_sort_func (GtkTreeModel *model, 
+				 GtkTreeIter  *a, 
+				 GtkTreeIter  *b, 
+				 gpointer      user_data)
+{
+        char *app1;
+        char *app2;
+	int   result;
 
         gtk_tree_model_get (model, a, 
-			    APP_NAME_COLUMN, &app1, 
-			    IS_LAUNCHER_COLUMN, &is_launcher1,
+			    DIRECTORY_NAME_COLUMN, &app1, 
 			    -1);
-
 	gtk_tree_model_get (model, b, 
-			    APP_NAME_COLUMN, &app2, 
-			    IS_LAUNCHER_COLUMN, &is_launcher2,
+			    DIRECTORY_NAME_COLUMN, &app2, 
 			    -1);
 
-	if (is_launcher1 == is_launcher2)
-		result = strcasecmp (app1, app2);
-	else if (is_launcher1)
-		result = 1;
-	else
-		result = -1;
+	result = g_utf8_collate (app1, app2);
 
 	g_free (app1);
 	g_free (app2);
@@ -258,35 +294,126 @@
 
 
 static void
+directory_treeview_selection_changed_cb (GtkTreeSelection *selection,
+                                         gpointer          user_data)
+{
+	DialogData         *data = user_data;
+	GtkTreeIter         iter;
+	GMenuTreeDirectory *menu_dir;
+
+	if (! gtk_tree_selection_get_selected (selection, &data->directory_model, &iter))
+		return;
+		
+	gtk_tree_model_get (data->directory_model, &iter,
+			    DIRECTORY_MENU_POINTER_COLUMN, &menu_dir,
+			    -1);
+		
+	set_application_list (data, menu_dir);
+}
+
+
+static void
+directory_list_add_columns (DialogData  *data,
+			    GtkTreeView *treeview)
+{
+	GtkCellRenderer   *renderer;
+	GtkTreeViewColumn *column;
+	GtkTreeSelection  *selection;
+	
+	column = gtk_tree_view_column_new ();
+	gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
+	gtk_tree_view_column_set_sort_column_id (column, DIRECTORY_NAME_COLUMN);
+	
+	renderer = gtk_cell_renderer_pixbuf_new ();
+	gtk_tree_view_column_pack_start (column, renderer, FALSE);
+	gtk_tree_view_column_set_attributes (column, renderer,
+                                             "pixbuf", DIRECTORY_ICON_COLUMN,
+                                             NULL);
+
+	renderer = gtk_cell_renderer_text_new ();
+	gtk_tree_view_column_pack_start (column, renderer, TRUE);
+	gtk_tree_view_column_set_attributes (column, renderer,
+                                             "text", DIRECTORY_NAME_COLUMN,
+                                             NULL);   
+                                             
+	gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (data->directory_model), directory_name_column_sort_func, NULL, NULL);
+	gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (data->directory_model), 
+					      GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
+					      GTK_SORT_ASCENDING);   
+					      
+	selection = gtk_tree_view_get_selection (treeview);
+	g_signal_connect (selection,
+			  "changed",
+			  G_CALLBACK (directory_treeview_selection_changed_cb),
+			  data);
+}
+
+
+static void
 use_app_toggled (GtkCellRendererToggle *cell,
 		 char                  *path_string,
 		 gpointer               callback_data)
 {
-	DialogData   *data  = callback_data;
-	GtkTreePath  *path = gtk_tree_path_new_from_string (path_string);
-	GtkTreeIter   iter;
-        gboolean      active;
+	DialogData  *data = callback_data;
+	GtkTreePath *path;
+	GtkTreeIter  iter;
+	char        *uri;
+        gboolean     active;
 
-	gtk_tree_model_get_iter (data->model, &iter, path);
+	path = gtk_tree_path_new_from_string (path_string);
+	gtk_tree_model_get_iter (data->application_model, &iter, path);
 	gtk_tree_path_free (path);
 	
-	gtk_tree_model_get (GTK_TREE_MODEL (data->model), 
-			    &iter, 
-			    USE_APP_COLUMN, 
-			    &active, 
+	gtk_tree_model_get (GTK_TREE_MODEL (data->application_model), &iter,
+			    APP_URI_COLUMN, &uri, 
+			    USE_APP_COLUMN, &active, 
 			    -1);
+			    
+	active = ! active;
+	if (active) {
+		if (! g_hash_table_lookup (data->uris, uri))
+			g_hash_table_insert (data->uris, g_strdup (uri), GINT_TO_POINTER (1));
+	}
+	else 
+		g_hash_table_remove (data->uris, uri); 
+		
+	gtk_list_store_set (GTK_LIST_STORE (data->application_model), &iter, 
+			    USE_APP_COLUMN, active, 
+			    -1);
+			    
+	g_free (uri);
+}
+
 
-	gtk_tree_store_set (GTK_TREE_STORE (data->model), 
-			    &iter, 
-			    USE_APP_COLUMN, 
-			    !active, 
+static int
+application_name_column_sort_func (GtkTreeModel *model, 
+				   GtkTreeIter  *a, 
+				   GtkTreeIter  *b, 
+				   gpointer      user_data)
+{
+        char *app1;
+        char *app2;
+	int   result;
+
+        gtk_tree_model_get (model, a, 
+			    APP_NAME_COLUMN, &app1, 
 			    -1);
+	gtk_tree_model_get (model, b, 
+			    APP_NAME_COLUMN, &app2, 
+			    -1);
+
+	result = g_utf8_collate (app1, app2);
+
+	g_free (app1);
+	g_free (app2);
+
+        return result;
 }
 
 
 static void
-add_columns (DialogData  *data,
-	     GtkTreeView *treeview)
+application_list_add_columns (DialogData  *data,
+			      GtkTreeView *treeview)
 {
 	GtkCellRenderer   *renderer;
 	GtkTreeViewColumn *column;
@@ -294,26 +421,22 @@
 	column = gtk_tree_view_column_new ();
 
 	renderer = gtk_cell_renderer_toggle_new ();
-	g_signal_connect (G_OBJECT (renderer), 
-			  "toggled", 
-			  G_CALLBACK (use_app_toggled),
-			  data);
-
 	gtk_tree_view_column_pack_start (column, renderer, FALSE);
 	gtk_tree_view_column_set_attributes (column, renderer,
                                              "active", USE_APP_COLUMN,
-					     "visible", IS_LAUNCHER_COLUMN,
                                              NULL);
-	gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column),
-					 GTK_TREE_VIEW_COLUMN_FIXED);
-	gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 30);
-	g_object_set (G_OBJECT (renderer), "xalign", 0.5, NULL); 
+	/*g_object_set (G_OBJECT (renderer), "xalign", 0.5, NULL);*/ 
         gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);	
-
+	
+	g_signal_connect (G_OBJECT (renderer), 
+			  "toggled", 
+			  G_CALLBACK (use_app_toggled),
+			  data);
+	
 	/**/
 
 	column = gtk_tree_view_column_new ();
-	gtk_tree_view_column_set_title (column, _("Application"));
+	/*gtk_tree_view_column_set_title (column, _("Application"));*/
 
 	renderer = gtk_cell_renderer_pixbuf_new ();
 	gtk_tree_view_column_pack_start (column, renderer, FALSE);
@@ -327,16 +450,16 @@
                                              "text", APP_NAME_COLUMN,
                                              NULL);
 
-	gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
+	/*gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);*/
 	gtk_tree_view_column_set_sort_column_id (column, APP_NAME_COLUMN);
 
         gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
-	gtk_tree_view_set_expander_column (treeview, column);
-	gtk_tree_view_column_set_clickable (column, FALSE);
+	/*gtk_tree_view_set_expander_column (treeview, column);
+	gtk_tree_view_column_set_clickable (column, FALSE);*/
 
 	/**/
 
-	column = gtk_tree_view_column_new ();
+	/*column = gtk_tree_view_column_new ();
 	gtk_tree_view_column_set_title (column, _("Description"));
 
 	renderer = gtk_cell_renderer_text_new ();
@@ -346,7 +469,13 @@
                                              NULL);
 
 	gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
-        gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
+        gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);*/
+        
+        
+	gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (data->application_model), application_name_column_sort_func, NULL, NULL);
+	gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (data->application_model), 
+					      GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
+					      GTK_SORT_ASCENDING);
 }
 
 
@@ -354,56 +483,53 @@
 dlg_pick_applications (QuickLounge  *quick_lounge,
 		       int           pos)
 {
-	DialogData *data;
-	GtkWidget  *btn_ok;
-	GtkWidget  *btn_cancel;
-	GtkWidget  *btn_help;
-	GtkWidget  *btn_collapse;
-	GtkWidget  *btn_expand;
-
+	DialogData       *data;
+	GtkWidget        *btn_ok;
+	GtkWidget        *btn_cancel;
+	GtkWidget        *btn_help;
+	GtkTreeSelection *selection;
+	GtkTreePath      *path;
+	
 	data = g_new0 (DialogData, 1);
 
 	data->quick_lounge = quick_lounge;
 	data->quick_box = QUICK_BOX (quick_lounge->quick_box);
 	data->pos = pos;
-
+	data->uris = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, NULL);
+	
 	data->builder = _gtk_builder_new_from_file ("choose-from-menu.ui");
 
 	/* Get the widgets. */
 
 	data->dialog = GET_WIDGET("from_menu_dialog");
-	data->tree_view = GET_WIDGET("fm_treeview");
-
-	btn_collapse = GET_WIDGET("fm_collapse_button");
-	btn_expand = GET_WIDGET("fm_expand_button");
-
-	btn_cancel = GET_WIDGET("fm_cancel_button");
-	btn_ok = GET_WIDGET("fm_ok_button");
-	btn_help = GET_WIDGET("fm_help_button");
+	data->directory_treeview = GET_WIDGET("directory_treeview");
+	data->application_treeview = GET_WIDGET("application_treeview");
+	
+	btn_cancel = GET_WIDGET("cancel_button");
+	btn_ok = GET_WIDGET("ok_button");
+	btn_help = GET_WIDGET("help_button");
 
 	/* Set widgets data. */
 
-	data->model = GTK_TREE_MODEL (gtk_tree_store_new (NUM_COLUMNS, 
-							  G_TYPE_STRING,
-							  G_TYPE_BOOLEAN,
-							  G_TYPE_BOOLEAN,
-							  GDK_TYPE_PIXBUF,
-							  G_TYPE_STRING,
-							  G_TYPE_STRING));
-	gtk_tree_view_set_model (GTK_TREE_VIEW (data->tree_view), data->model);
-	g_object_unref (data->model);
-
-	add_columns (data, GTK_TREE_VIEW (data->tree_view));
-
-	gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (data->model), name_column_sort_func, NULL, NULL);
-
-	gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (data->model),
-                                         APP_NAME_COLUMN, name_column_sort_func,
-                                         NULL, NULL);
-
-	gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (data->model), 
-					      GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
-					      GTK_SORT_ASCENDING);
+	data->directory_model = GTK_TREE_MODEL (gtk_tree_store_new (DIRECTORY_N_COLUMNS, 
+								    G_TYPE_POINTER,
+								    G_TYPE_STRING,
+								    G_TYPE_STRING,
+								    GDK_TYPE_PIXBUF,
+								    G_TYPE_STRING));
+	gtk_tree_view_set_model (GTK_TREE_VIEW (data->directory_treeview), data->directory_model);
+	g_object_unref (data->directory_model);
+	directory_list_add_columns (data, GTK_TREE_VIEW (data->directory_treeview));
+
+	data->application_model = GTK_TREE_MODEL (gtk_list_store_new (APP_N_COLUMNS, 
+								      G_TYPE_STRING,
+								      GDK_TYPE_PIXBUF,
+								      G_TYPE_STRING,								     
+								      G_TYPE_STRING,
+								      G_TYPE_BOOLEAN));
+	gtk_tree_view_set_model (GTK_TREE_VIEW (data->application_treeview), data->application_model);
+	g_object_unref (data->application_model);
+	application_list_add_columns (data, GTK_TREE_VIEW (data->application_treeview));
 
 	/* Set the signals handlers. */
 	
@@ -411,32 +537,19 @@
 			  "destroy",
 			  G_CALLBACK (destroy_cb),
 			  data);
-
 	g_signal_connect_swapped (G_OBJECT (btn_cancel), 
 				  "clicked",
 				  G_CALLBACK (gtk_widget_destroy),
 				  data->dialog);
-
 	g_signal_connect (G_OBJECT (btn_help), 
 			  "clicked",
 			  G_CALLBACK (help_cb),
 			  data);
-
 	g_signal_connect (G_OBJECT (btn_ok), 
 			  "clicked",
 			  G_CALLBACK (ok_cb),
 			  data);
 
-	g_signal_connect_swapped (G_OBJECT (btn_collapse), 
-				  "clicked",
-				  G_CALLBACK (gtk_tree_view_collapse_all),
-				  data->tree_view);
-
-	g_signal_connect_swapped (G_OBJECT (btn_expand), 
-				  "clicked",
-				  G_CALLBACK (gtk_tree_view_expand_all),
-				  data->tree_view);
-
 	/* run dialog. */
 
 	g_object_set_data (G_OBJECT (data->dialog), "dialog_data", data);
@@ -446,6 +559,13 @@
 	
 	gtk_widget_show (data->dialog);
 
-	add_applications (data, "applications.menu"); 
-	add_applications (data, "settings.menu"); 
+	add_directories_from_file (data, "applications.menu"); 
+	add_directories_from_file (data, "settings.menu"); 
+	
+	selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (data->directory_treeview));
+	path = gtk_tree_path_new ();
+	gtk_tree_path_append_index (path, 0);
+	gtk_tree_path_append_index (path, 0);
+	gtk_tree_selection_select_path (selection, path);
+	gtk_tree_path_free (path);
 }

Modified: trunk/src/qck-desktop-entry-dialog.c
==============================================================================
--- trunk/src/qck-desktop-entry-dialog.c	(original)
+++ trunk/src/qck-desktop-entry-dialog.c	Tue Feb  3 12:36:52 2009
@@ -210,7 +210,7 @@
 
 
 static void
-file_chooser_response_cb (GtkWidget             *widget,
+icon_chooser_response_cb (GtkWidget             *widget,
                           int                    response,
                           QckDesktopEntryDialog *self)
 {
@@ -242,14 +242,14 @@
 icon_button_clicked_cb (GtkButton             *button,
                         QckDesktopEntryDialog *self)
 {
-	GtkWidget *file_chooser;
+	GtkWidget *icon_chooser;
 	char      *icon;
 	char      *icon_path;
 	GFile     *file;
 	char      *uri;
 	gboolean   set_current = FALSE;
 	
-	file_chooser = gtk_file_chooser_dialog_new (_("Choose an Image"),
+	icon_chooser = gtk_file_chooser_dialog_new (_("Select an Image"),
 						    GTK_WINDOW (self),
 						    GTK_FILE_CHOOSER_ACTION_OPEN,
 						    GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
@@ -257,9 +257,9 @@
 						    GTK_STOCK_OK, GTK_RESPONSE_OK,
 						    NULL);
 						    
-	gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (file_chooser), FALSE);
-        gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (file_chooser),TRUE);
-        gtk_dialog_set_default_response (GTK_DIALOG (file_chooser), GTK_RESPONSE_OK);
+	gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (icon_chooser), FALSE);
+        gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (icon_chooser),TRUE);
+        gtk_dialog_set_default_response (GTK_DIALOG (icon_chooser), GTK_RESPONSE_OK);
         
         icon = g_key_file_get_string (self->priv->current, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, NULL);        
         icon_path = panel_find_icon (gtk_icon_theme_get_default (), icon, _gtk_icon_get_pixel_size (GTK_WIDGET (self), GTK_ICON_SIZE_DIALOG));
@@ -270,17 +270,17 @@
 	file = g_file_new_for_path (icon_path);
 	uri = g_file_get_uri (file);	
 	if (set_current)
-		gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (file_chooser), uri);
+		gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (icon_chooser), uri);
 	else
-		gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (file_chooser), uri);
+		gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (icon_chooser), uri);
 	             
-	g_signal_connect (G_OBJECT (file_chooser),
+	g_signal_connect (G_OBJECT (icon_chooser),
 			  "response",
-			  G_CALLBACK (file_chooser_response_cb),
+			  G_CALLBACK (icon_chooser_response_cb),
 			  self);
 
-        gtk_window_set_modal (GTK_WINDOW (file_chooser), TRUE);
-        gtk_widget_show (file_chooser);
+        gtk_window_set_modal (GTK_WINDOW (icon_chooser), TRUE);
+        gtk_widget_show (icon_chooser);
         
 	g_free (uri);
         g_object_unref (file);        
@@ -290,6 +290,83 @@
 
 
 static void
+command_chooser_response_cb (GtkWidget             *widget,
+                             int                    response,
+                             QckDesktopEntryDialog *self)
+{
+        GtkFileChooser *file_chooser = GTK_FILE_CHOOSER (widget);
+        char           *command;
+        
+        if ((response == GTK_RESPONSE_CANCEL) || (response == GTK_RESPONSE_DELETE_EVENT)) {
+                gtk_widget_destroy (widget);
+                return;
+        }
+        
+	if (response != GTK_RESPONSE_OK)
+		return;
+        
+	command = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (file_chooser));
+	if (command == NULL)
+		return;
+        
+	g_key_file_set_string (self->priv->current, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, command);
+	gtk_entry_set_text (GTK_ENTRY (GET_WIDGET ("exec_entry")), command);
+        
+	qck_desktop_entry_dialog_changed (self);
+	gtk_widget_destroy (GTK_WIDGET (file_chooser));
+       	        
+	g_free (command);
+}
+
+
+static void
+browse_button_clicked_cb (GtkButton             *button,
+                          QckDesktopEntryDialog *self)
+{
+	GtkWidget *command_chooser;
+	char      *path;
+	GFile     *file;
+	char      *uri;
+	gboolean   set_current = FALSE;
+	
+	command_chooser = gtk_file_chooser_dialog_new (_("Select a Command"),
+						       GTK_WINDOW (self),
+						       GTK_FILE_CHOOSER_ACTION_OPEN,
+						       GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+						       GTK_STOCK_OK, GTK_RESPONSE_OK,
+						       NULL);
+						    
+	gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (command_chooser), FALSE);
+        gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (command_chooser),TRUE);
+        gtk_dialog_set_default_response (GTK_DIALOG (command_chooser), GTK_RESPONSE_OK);
+        
+        path = g_key_file_get_string (self->priv->current, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, NULL);        
+        if (path == NULL) {
+        	path = g_strdup (g_get_home_dir ());
+        	set_current = TRUE;
+        }
+	file = g_file_new_for_path (path);
+	uri = g_file_get_uri (file);	
+	if (set_current)
+		gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (command_chooser), uri);
+	else
+		gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (command_chooser), uri);
+	             
+	g_signal_connect (G_OBJECT (command_chooser),
+			  "response",
+			  G_CALLBACK (command_chooser_response_cb),
+			  self);
+
+        gtk_window_set_modal (GTK_WINDOW (command_chooser), TRUE);
+        gtk_widget_show (command_chooser);
+        
+	g_free (uri);
+	g_object_unref (file);        
+	g_free (path);
+}
+
+
+static void
 qck_desktop_entry_dialog_construct (QckDesktopEntryDialog *self,
 				    const char            *title,
 				    GtkWindow             *parent,
@@ -339,6 +416,10 @@
   			  "clicked",
   			  G_CALLBACK (icon_button_clicked_cb),
   			  self);
+  	g_signal_connect (GET_WIDGET ("browse_button"),
+  			  "clicked",
+  			  G_CALLBACK (browse_button_clicked_cb),
+  			  self);
 }
 
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]