From 33d35e65dbbfaa95865c3362b7737e94a6cabc6c Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Tue, 30 Sep 2003 15:55:23 +0000 Subject: [PATCH] app/widgets/gimpcontainergridview.c implement GtkWidget::popup_menu() and 2003-09-30 Michael Natterer * app/widgets/gimpcontainergridview.c * app/widgets/gimpcontainertreeview.c: implement GtkWidget::popup_menu() and pop up the menu from the selected item. If there is no selected item, return FALSE to makeGimpDockable pop up the menu from its menu button. --- ChangeLog | 8 +++ app/widgets/gimpcontainergridview.c | 65 +++++++++++++++++++++ app/widgets/gimpcontainertreeview.c | 89 +++++++++++++++++++++++++++++ 3 files changed, 162 insertions(+) diff --git a/ChangeLog b/ChangeLog index 0e4a75b3de..16a99fb317 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2003-09-30 Michael Natterer + + * app/widgets/gimpcontainergridview.c + * app/widgets/gimpcontainertreeview.c: implement + GtkWidget::popup_menu() and pop up the menu from the selected + item. If there is no selected item, return FALSE to + makeGimpDockable pop up the menu from its menu button. + 2003-09-30 Sven Neumann * app/gui/dialogs-commands.c (dialogs_create_dockable_cmd_callback): diff --git a/app/widgets/gimpcontainergridview.c b/app/widgets/gimpcontainergridview.c index d228499bdd..a5eb7f992c 100644 --- a/app/widgets/gimpcontainergridview.c +++ b/app/widgets/gimpcontainergridview.c @@ -36,6 +36,7 @@ #include "core/gimpviewable.h" #include "gimpcontainergridview.h" +#include "gimpitemfactory.h" #include "gimppreview.h" #include "gimppreviewrenderer.h" #include "gtkhwrapbox.h" @@ -58,6 +59,7 @@ static gboolean gimp_container_grid_view_move_cursor (GimpContainerGridView *v gint count); static gboolean gimp_container_grid_view_focus (GtkWidget *widget, GtkDirectionType direction); +static gboolean gimp_container_grid_view_popup_menu (GtkWidget *widget); static gpointer gimp_container_grid_view_insert_item (GimpContainerView *view, GimpViewable *viewable, @@ -141,6 +143,7 @@ gimp_container_grid_view_class_init (GimpContainerGridViewClass *klass) binding_set = gtk_binding_set_by_class (klass); widget_class->focus = gimp_container_grid_view_focus; + widget_class->popup_menu = gimp_container_grid_view_popup_menu; container_view_class->insert_item = gimp_container_grid_view_insert_item; container_view_class->remove_item = gimp_container_grid_view_remove_item; @@ -355,6 +358,68 @@ gimp_container_grid_view_focus (GtkWidget *widget, return FALSE; } +static void +gimp_container_grid_view_menu_position (GtkMenu *menu, + gint *x, + gint *y, + gpointer data) +{ + GtkWidget *widget; + GtkRequisition requisition; + GdkScreen *screen; + + widget = GTK_WIDGET (data); + + gdk_window_get_origin (widget->window, x, y); + + if (GTK_WIDGET_NO_WINDOW (widget)) + { + *x += widget->allocation.x; + *y += widget->allocation.y; + } + + *x += widget->allocation.width / 2; + *y += widget->allocation.height / 2; + + gtk_widget_size_request (GTK_WIDGET (menu), &requisition); + + screen = gtk_widget_get_screen (GTK_WIDGET (menu)); + + if (*x + requisition.width > gdk_screen_get_width (screen)) + *x -= requisition.width; + + if (*x < 0) + *x = 0; + + if (*y + requisition.height > gdk_screen_get_height (screen)) + *y -= requisition.height; + + if (*y < 0) + *y = 0; +} + +static gboolean +gimp_container_grid_view_popup_menu (GtkWidget *widget) +{ + GimpContainerGridView *grid_view; + GimpEditor *editor; + + grid_view = GIMP_CONTAINER_GRID_VIEW (widget); + editor = GIMP_EDITOR (widget); + + if (editor->item_factory && grid_view->selected_item) + { + gimp_item_factory_popup_with_data (editor->item_factory, + editor->item_factory_data, + gimp_container_grid_view_menu_position, + grid_view->selected_item, + NULL); + return TRUE; + } + + return FALSE; +} + static gpointer gimp_container_grid_view_insert_item (GimpContainerView *view, GimpViewable *viewable, diff --git a/app/widgets/gimpcontainertreeview.c b/app/widgets/gimpcontainertreeview.c index 12d5f59293..53a162310b 100644 --- a/app/widgets/gimpcontainertreeview.c +++ b/app/widgets/gimpcontainertreeview.c @@ -38,6 +38,7 @@ #include "gimpcontainertreeview.h" #include "gimpcontainertreeview-dnd.h" #include "gimpdnd.h" +#include "gimpitemfactory.h" #include "gimppreviewrenderer.h" #include "gimpwidgets-utils.h" @@ -57,6 +58,7 @@ static void gimp_container_tree_view_init (GimpContainerTreeView static GObject *gimp_container_tree_view_constructor (GType type, guint n_params, GObjectConstructParam *params); +static gboolean gimp_container_tree_view_popup_menu (GtkWidget *widget); static void gimp_container_tree_view_set_container (GimpContainerView *view, GimpContainer *container); @@ -125,15 +127,19 @@ static void gimp_container_tree_view_class_init (GimpContainerTreeViewClass *klass) { GObjectClass *object_class; + GtkWidgetClass *widget_class; GimpContainerViewClass *container_view_class; object_class = G_OBJECT_CLASS (klass); + widget_class = GTK_WIDGET_CLASS (klass); container_view_class = GIMP_CONTAINER_VIEW_CLASS (klass); parent_class = g_type_class_peek_parent (klass); object_class->constructor = gimp_container_tree_view_constructor; + widget_class->popup_menu = gimp_container_tree_view_popup_menu; + container_view_class->set_container = gimp_container_tree_view_set_container; container_view_class->insert_item = gimp_container_tree_view_insert_item; container_view_class->remove_item = gimp_container_tree_view_remove_item; @@ -251,6 +257,89 @@ gimp_container_tree_view_constructor (GType type, return object; } +static void +gimp_container_tree_view_menu_position (GtkMenu *menu, + gint *x, + gint *y, + gpointer data) +{ + GimpContainerTreeView *tree_view; + GtkWidget *widget; + GtkTreeIter selected_iter; + GtkRequisition requisition; + GdkScreen *screen; + + tree_view = GIMP_CONTAINER_TREE_VIEW (data); + widget = GTK_WIDGET (tree_view->view); + + gdk_window_get_origin (widget->window, x, y); + + if (GTK_WIDGET_NO_WINDOW (widget)) + { + *x += widget->allocation.x; + *y += widget->allocation.y; + } + + if (gtk_tree_selection_get_selected (tree_view->selection, NULL, + &selected_iter)) + { + GtkTreePath *path; + GdkRectangle cell_rect; + + path = gtk_tree_model_get_path (tree_view->model, &selected_iter); + gtk_tree_view_get_cell_area (tree_view->view, path, + tree_view->main_column, &cell_rect); + gtk_tree_path_free (path); + + *x += widget->allocation.width / 2; + *y += cell_rect.y + cell_rect.height / 2; + } + else + { + *x += widget->style->xthickness; + *y += widget->style->ythickness; + } + + gtk_widget_size_request (GTK_WIDGET (menu), &requisition); + + screen = gtk_widget_get_screen (GTK_WIDGET (menu)); + + if (*x + requisition.width > gdk_screen_get_width (screen)) + *x -= requisition.width; + + if (*x < 0) + *x = 0; + + if (*y + requisition.height > gdk_screen_get_height (screen)) + *y -= requisition.height; + + if (*y < 0) + *y = 0; +} + +static gboolean +gimp_container_tree_view_popup_menu (GtkWidget *widget) +{ + GimpContainerTreeView *tree_view; + GimpEditor *editor; + + tree_view = GIMP_CONTAINER_TREE_VIEW (widget); + editor = GIMP_EDITOR (widget); + + if (editor->item_factory && + gtk_tree_selection_get_selected (tree_view->selection, NULL, NULL)) + { + gimp_item_factory_popup_with_data (editor->item_factory, + editor->item_factory_data, + gimp_container_tree_view_menu_position, + editor, + NULL); + return TRUE; + } + + return FALSE; +} + GtkWidget * gimp_container_tree_view_new (GimpContainer *container, GimpContext *context,