quick-lounge-applet r246 - in trunk: . data/ui src
- From: paobac svn gnome org
- To: svn-commits-list gnome org
- Subject: quick-lounge-applet r246 - in trunk: . data/ui src
- Date: Tue, 3 Feb 2009 12:36:53 +0000 (UTC)
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]