app/widgets/gimpcontainergridview.c implement GtkWidget::popup_menu() and

2003-09-30  Michael Natterer  <mitch@gimp.org>

	* 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.
This commit is contained in:
Michael Natterer 2003-09-30 15:55:23 +00:00 committed by Michael Natterer
parent b563329c28
commit 33d35e65db
3 changed files with 162 additions and 0 deletions

View File

@ -1,3 +1,11 @@
2003-09-30 Michael Natterer <mitch@gimp.org>
* 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 <sven@gimp.org>
* app/gui/dialogs-commands.c (dialogs_create_dockable_cmd_callback):

View File

@ -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,

View File

@ -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,