Add a field for an "add to shortcuts" menu item. (popup_menu_detach_cb):

2004-07-29  Federico Mena Quintero  <federico@ximian.com>

	* gtk/gtkfilechooserdefault.c (struct _GtkFileChooserDefault): Add
	a field for an "add to shortcuts" menu item.
	(popup_menu_detach_cb): Clear out the field.
	(file_list_build_popup_menu): Only build the menu here.
	(file_list_update_popup_menu): Build the menu, then update the
	sensitivity of its items.
	(file_list_popup_menu): Use file_list_update_popup_menu().
	(bookmarks_check_add_sensitivity): Also set the sensitivity of the
	popup menu item.  Correctly handle the case for a *single* file.
	Simplify a bit.
	(bookmarks_add_selected_folder): New helper function; code moved
	over from add_bookmark_button_clicked_cb().
	(add_bookmark_button_clicked_cb): Use the function above.
	(selection_check): Rather than returning a boolean value for
	emptiness, actually return the number of selected rows.  Also,
	simplify a bit.
	(get_selected_path): New helper function.
This commit is contained in:
Federico Mena Quintero 2004-07-29 20:53:52 +00:00 committed by Federico Mena Quintero
parent 705a7066c3
commit 15f23d383c
5 changed files with 210 additions and 60 deletions

View File

@ -1,3 +1,23 @@
2004-07-29 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkfilechooserdefault.c (struct _GtkFileChooserDefault): Add
a field for an "add to shortcuts" menu item.
(popup_menu_detach_cb): Clear out the field.
(file_list_build_popup_menu): Only build the menu here.
(file_list_update_popup_menu): Build the menu, then update the
sensitivity of its items.
(file_list_popup_menu): Use file_list_update_popup_menu().
(bookmarks_check_add_sensitivity): Also set the sensitivity of the
popup menu item. Correctly handle the case for a *single* file.
Simplify a bit.
(bookmarks_add_selected_folder): New helper function; code moved
over from add_bookmark_button_clicked_cb().
(add_bookmark_button_clicked_cb): Use the function above.
(selection_check): Rather than returning a boolean value for
emptiness, actually return the number of selected rows. Also,
simplify a bit.
(get_selected_path): New helper function.
2004-07-29 Anders Carlsson <andersca@gnome.org>
* demos/gtk-demo/Makefile.am:

View File

@ -1,3 +1,23 @@
2004-07-29 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkfilechooserdefault.c (struct _GtkFileChooserDefault): Add
a field for an "add to shortcuts" menu item.
(popup_menu_detach_cb): Clear out the field.
(file_list_build_popup_menu): Only build the menu here.
(file_list_update_popup_menu): Build the menu, then update the
sensitivity of its items.
(file_list_popup_menu): Use file_list_update_popup_menu().
(bookmarks_check_add_sensitivity): Also set the sensitivity of the
popup menu item. Correctly handle the case for a *single* file.
Simplify a bit.
(bookmarks_add_selected_folder): New helper function; code moved
over from add_bookmark_button_clicked_cb().
(add_bookmark_button_clicked_cb): Use the function above.
(selection_check): Rather than returning a boolean value for
emptiness, actually return the number of selected rows. Also,
simplify a bit.
(get_selected_path): New helper function.
2004-07-29 Anders Carlsson <andersca@gnome.org>
* demos/gtk-demo/Makefile.am:

View File

@ -1,3 +1,23 @@
2004-07-29 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkfilechooserdefault.c (struct _GtkFileChooserDefault): Add
a field for an "add to shortcuts" menu item.
(popup_menu_detach_cb): Clear out the field.
(file_list_build_popup_menu): Only build the menu here.
(file_list_update_popup_menu): Build the menu, then update the
sensitivity of its items.
(file_list_popup_menu): Use file_list_update_popup_menu().
(bookmarks_check_add_sensitivity): Also set the sensitivity of the
popup menu item. Correctly handle the case for a *single* file.
Simplify a bit.
(bookmarks_add_selected_folder): New helper function; code moved
over from add_bookmark_button_clicked_cb().
(add_bookmark_button_clicked_cb): Use the function above.
(selection_check): Rather than returning a boolean value for
emptiness, actually return the number of selected rows. Also,
simplify a bit.
(get_selected_path): New helper function.
2004-07-29 Anders Carlsson <andersca@gnome.org>
* demos/gtk-demo/Makefile.am:

View File

@ -1,3 +1,23 @@
2004-07-29 Federico Mena Quintero <federico@ximian.com>
* gtk/gtkfilechooserdefault.c (struct _GtkFileChooserDefault): Add
a field for an "add to shortcuts" menu item.
(popup_menu_detach_cb): Clear out the field.
(file_list_build_popup_menu): Only build the menu here.
(file_list_update_popup_menu): Build the menu, then update the
sensitivity of its items.
(file_list_popup_menu): Use file_list_update_popup_menu().
(bookmarks_check_add_sensitivity): Also set the sensitivity of the
popup menu item. Correctly handle the case for a *single* file.
Simplify a bit.
(bookmarks_add_selected_folder): New helper function; code moved
over from add_bookmark_button_clicked_cb().
(add_bookmark_button_clicked_cb): Use the function above.
(selection_check): Rather than returning a boolean value for
emptiness, actually return the number of selected rows. Also,
simplify a bit.
(get_selected_path): New helper function.
2004-07-29 Anders Carlsson <andersca@gnome.org>
* demos/gtk-demo/Makefile.am:

View File

@ -43,6 +43,7 @@
#include "gtkiconfactory.h"
#include "gtkicontheme.h"
#include "gtkimage.h"
#include "gtkimagemenuitem.h"
#include "gtkintl.h"
#include "gtklabel.h"
#include "gtkmarshalers.h"
@ -51,6 +52,7 @@
#include "gtkpathbar.h"
#include "gtkprivate.h"
#include "gtkscrolledwindow.h"
#include "gtkseparatormenuitem.h"
#include "gtksizegroup.h"
#include "gtkstock.h"
#include "gtktable.h"
@ -108,6 +110,7 @@ struct _GtkFileChooserDefault
GtkWidget *browse_shortcuts_remove_button;
GtkWidget *browse_files_tree_view;
GtkWidget *browse_files_popup_menu;
GtkWidget *browse_files_popup_menu_add_shortcut_item;
GtkWidget *browse_files_popup_menu_hidden_files_item;
GtkWidget *browse_new_folder_button;
GtkWidget *browse_path_bar;
@ -355,6 +358,8 @@ static int shortcuts_get_index (GtkFileChooserDefault *impl,
static int shortcut_find_position (GtkFileChooserDefault *impl,
const GtkFilePath *path);
static void bookmarks_check_add_sensitivity (GtkFileChooserDefault *impl);
static void list_selection_changed (GtkTreeSelection *tree_selection,
GtkFileChooserDefault *impl);
static void list_row_activated (GtkTreeView *tree_view,
@ -1756,10 +1761,9 @@ add_bookmark_foreach_cb (GtkTreeModel *model,
shortcuts_add_bookmark_from_path (impl, file_path, -1);
}
/* Callback used when the "Add bookmark" button is clicked */
/* Adds a bookmark from the currently selected item in the file list */
static void
add_bookmark_button_clicked_cb (GtkButton *button,
GtkFileChooserDefault *impl)
bookmarks_add_selected_folder (GtkFileChooserDefault *impl)
{
GtkTreeSelection *selection;
@ -1773,6 +1777,14 @@ add_bookmark_button_clicked_cb (GtkButton *button,
impl);
}
/* Callback used when the "Add bookmark" button is clicked */
static void
add_bookmark_button_clicked_cb (GtkButton *button,
GtkFileChooserDefault *impl)
{
bookmarks_add_selected_folder (impl);
}
/* Returns TRUE plus an iter in the shortcuts_model if a row is selected;
* returns FALSE if no shortcut is selected.
*/
@ -1832,7 +1844,7 @@ remove_bookmark_button_clicked_cb (GtkButton *button,
struct selection_check_closure {
GtkFileChooserDefault *impl;
gboolean empty;
int num_selected;
gboolean all_files;
gboolean all_folders;
};
@ -1850,7 +1862,7 @@ selection_check_foreach_cb (GtkTreeModel *model,
gboolean is_folder;
closure = data;
closure->empty = FALSE;
closure->num_selected++;
gtk_tree_model_sort_convert_iter_to_child_iter (closure->impl->sort_model, &child_iter, iter);
@ -1864,46 +1876,27 @@ selection_check_foreach_cb (GtkTreeModel *model,
/* Checks whether the selected items in the file list are all files or all folders */
static void
selection_check (GtkFileChooserDefault *impl,
gboolean *empty,
int *num_selected,
gboolean *all_files,
gboolean *all_folders)
{
struct selection_check_closure closure;
GtkTreeSelection *selection;
closure.impl = impl;
closure.num_selected = 0;
closure.all_files = TRUE;
closure.all_folders = TRUE;
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->browse_files_tree_view));
gtk_tree_selection_selected_foreach (selection,
selection_check_foreach_cb,
&closure);
if (impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
|| impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER)
{
if (gtk_tree_selection_count_selected_rows (selection) == 0)
closure.empty = TRUE;
else
{
closure.empty = FALSE;
closure.all_files = FALSE;
closure.all_folders = TRUE;
}
}
else
{
g_assert (impl->action == GTK_FILE_CHOOSER_ACTION_OPEN
|| impl->action == GTK_FILE_CHOOSER_ACTION_SAVE);
g_assert (closure.num_selected == 0 || !(closure.all_files && closure.all_folders));
closure.impl = impl;
closure.empty = TRUE;
closure.all_files = TRUE;
closure.all_folders = TRUE;
gtk_tree_selection_selected_foreach (selection,
selection_check_foreach_cb,
&closure);
}
g_assert (closure.empty || !(closure.all_files && closure.all_folders));
if (empty)
*empty = closure.empty;
if (num_selected)
*num_selected = closure.num_selected;
if (all_files)
*all_files = closure.all_files;
@ -1912,6 +1905,44 @@ selection_check (GtkFileChooserDefault *impl,
*all_folders = closure.all_folders;
}
struct get_selected_path_closure {
GtkFileChooserDefault *impl;
const GtkFilePath *path;
};
static void
get_selected_path_foreach_cb (GtkTreeModel *model,
GtkTreePath *path,
GtkTreeIter *iter,
gpointer data)
{
struct get_selected_path_closure *closure;
GtkTreeIter child_iter;
closure = data;
gtk_tree_model_sort_convert_iter_to_child_iter (closure->impl->sort_model, &child_iter, iter);
closure->path = _gtk_file_system_model_get_path (closure->impl->browse_files_model, &child_iter);
}
/* Returns a selected path from the file list */
static const GtkFilePath *
get_selected_path (GtkFileChooserDefault *impl)
{
struct get_selected_path_closure closure;
GtkTreeSelection *selection;
closure.impl = impl;
closure.path = NULL;
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->browse_files_tree_view));
gtk_tree_selection_selected_foreach (selection,
get_selected_path_foreach_cb,
&closure);
return closure.path;
}
/* Sensitize the "add bookmark" button if all the selected items are folders, or
* if there are no selected items *and* the current folder is not in the
* bookmarks list. De-sensitize the button otherwise.
@ -1919,24 +1950,29 @@ selection_check (GtkFileChooserDefault *impl,
static void
bookmarks_check_add_sensitivity (GtkFileChooserDefault *impl)
{
int num_selected;
gboolean all_folders;
gboolean active;
GtkTreeSelection *selection;
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->browse_files_tree_view));
selection_check (impl, &num_selected, NULL, &all_folders);
if (gtk_tree_selection_count_selected_rows (selection) == 0)
if (num_selected == 0)
active = (shortcut_find_position (impl, impl->current_folder) == -1);
else
else if (num_selected == 1)
{
gboolean all_folders;
const GtkFilePath *path;
selection_check (impl, NULL, NULL, &all_folders);
active = (impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ||
impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER ||
all_folders);
path = get_selected_path (impl);
active = all_folders && (shortcut_find_position (impl, path) == -1);
}
else
active = all_folders;
gtk_widget_set_sensitive (impl->browse_shortcuts_add_button, active);
if (impl->browse_files_popup_menu_add_shortcut_item)
gtk_widget_set_sensitive (impl->browse_files_popup_menu_add_shortcut_item,
(num_selected == 0) ? FALSE : active);
}
/* Sets the sensitivity of the "remove bookmark" button depending on whether a
@ -2696,9 +2732,18 @@ popup_menu_detach_cb (GtkWidget *attach_widget,
g_assert (GTK_IS_FILE_CHOOSER_DEFAULT (impl));
impl->browse_files_popup_menu = NULL;
impl->browse_files_popup_menu_add_shortcut_item = NULL;
impl->browse_files_popup_menu_hidden_files_item = NULL;
}
/* Callback used when the "Add to Shortcuts" menu item is activated */
static void
add_to_shortcuts_cb (GtkMenuItem *item,
GtkFileChooserDefault *impl)
{
bookmarks_add_selected_folder (impl);
}
/* Callback used when the "Show Hidden Files" menu item is toggled */
static void
show_hidden_toggled_cb (GtkCheckMenuItem *item,
@ -2713,22 +2758,47 @@ show_hidden_toggled_cb (GtkCheckMenuItem *item,
static void
file_list_build_popup_menu (GtkFileChooserDefault *impl)
{
if (!impl->browse_files_popup_menu)
{
impl->browse_files_popup_menu = gtk_menu_new ();
gtk_menu_attach_to_widget (GTK_MENU (impl->browse_files_popup_menu),
impl->browse_files_tree_view,
popup_menu_detach_cb);
GtkWidget *item;
impl->browse_files_popup_menu_hidden_files_item =
gtk_check_menu_item_new_with_mnemonic (_("Show _Hidden Files"));
g_signal_connect (impl->browse_files_popup_menu_hidden_files_item, "toggled",
G_CALLBACK (show_hidden_toggled_cb), impl);
if (impl->browse_files_popup_menu)
return;
gtk_widget_show (impl->browse_files_popup_menu_hidden_files_item);
gtk_menu_shell_append (GTK_MENU_SHELL (impl->browse_files_popup_menu),
impl->browse_files_popup_menu_hidden_files_item);
}
impl->browse_files_popup_menu = gtk_menu_new ();
gtk_menu_attach_to_widget (GTK_MENU (impl->browse_files_popup_menu),
impl->browse_files_tree_view,
popup_menu_detach_cb);
item = gtk_image_menu_item_new_with_mnemonic (_("_Add to Shortcuts"));
impl->browse_files_popup_menu_add_shortcut_item = item;
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item),
gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_MENU));
gtk_widget_set_sensitive (item, FALSE);
g_signal_connect (item, "activate",
G_CALLBACK (add_to_shortcuts_cb), impl);
gtk_widget_show (item);
gtk_menu_shell_append (GTK_MENU_SHELL (impl->browse_files_popup_menu), item);
item = gtk_separator_menu_item_new ();
gtk_widget_show (item);
gtk_menu_shell_append (GTK_MENU_SHELL (impl->browse_files_popup_menu), item);
item = gtk_check_menu_item_new_with_mnemonic (_("Show _Hidden Files"));
impl->browse_files_popup_menu_hidden_files_item = item;
g_signal_connect (item, "toggled",
G_CALLBACK (show_hidden_toggled_cb), impl);
gtk_widget_show (item);
gtk_menu_shell_append (GTK_MENU_SHELL (impl->browse_files_popup_menu), item);
}
/* Updates the popup menu for the file list, creating it if necessary */
static void
file_list_update_popup_menu (GtkFileChooserDefault *impl)
{
file_list_build_popup_menu (impl);
/* The sensitivity of the Add to Shortcuts item is set in
* bookmarks_check_add_sensitivity()
*/
g_signal_handlers_block_by_func (impl->browse_files_popup_menu_hidden_files_item,
G_CALLBACK (show_hidden_toggled_cb), impl);
@ -2774,7 +2844,7 @@ static void
file_list_popup_menu (GtkFileChooserDefault *impl,
GdkEventButton *event)
{
file_list_build_popup_menu (impl);
file_list_update_popup_menu (impl);
if (event)
gtk_menu_popup (GTK_MENU (impl->browse_files_popup_menu),
NULL, NULL, NULL, NULL,