diff options
author | Matthias Clasen <mclasen@redhat.com> | 2019-12-21 22:21:27 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2020-06-01 22:10:53 -0400 |
commit | cb2901ec4093ff1e75a389308a807713ec36d33c (patch) | |
tree | cd807a5bdc1da1ea9049b0866d7f1216270e6eba /gtk/gtkcolumnviewtitle.c | |
parent | f27bd061fbfd0b69bd1110e1c380b017057519a3 (diff) | |
download | gtk+-cb2901ec4093ff1e75a389308a807713ec36d33c.tar.gz |
columnviewtitle: Display a context menu
When the ::header-menu property is set on the
column, use the menu model to create and show
a context menu.
Diffstat (limited to 'gtk/gtkcolumnviewtitle.c')
-rw-r--r-- | gtk/gtkcolumnviewtitle.c | 70 |
1 files changed, 63 insertions, 7 deletions
diff --git a/gtk/gtkcolumnviewtitle.c b/gtk/gtkcolumnviewtitle.c index 306064bcd8..ae66022ac9 100644 --- a/gtk/gtkcolumnviewtitle.c +++ b/gtk/gtkcolumnviewtitle.c @@ -30,6 +30,8 @@ #include "gtkbox.h" #include "gtkimage.h" #include "gtkgestureclick.h" +#include "gtkpopovermenu.h" +#include "gtknative.h" struct _GtkColumnViewTitle { @@ -40,6 +42,7 @@ struct _GtkColumnViewTitle GtkWidget *box; GtkWidget *title; GtkWidget *sort; + GtkWidget *popup_menu; }; struct _GtkColumnViewTitleClass @@ -70,10 +73,14 @@ gtk_column_view_title_size_allocate (GtkWidget *widget, int height, int baseline) { + GtkColumnViewTitle *self = GTK_COLUMN_VIEW_TITLE (widget); GtkWidget *child = gtk_widget_get_first_child (widget); if (child) gtk_widget_allocate (child, width, height, baseline, NULL); + + if (self->popup_menu) + gtk_native_check_resize (GTK_NATIVE (self->popup_menu)); } static void @@ -82,6 +89,7 @@ gtk_column_view_title_dispose (GObject *object) GtkColumnViewTitle *self = GTK_COLUMN_VIEW_TITLE (object); g_clear_pointer (&self->box, gtk_widget_unparent); + g_clear_pointer (&self->popup_menu, gtk_widget_unparent); g_clear_object (&self->column); @@ -112,13 +120,8 @@ gtk_column_view_title_resize_func (GtkWidget *widget) } static void -click_pressed_cb (GtkGestureClick *gesture, - guint n_press, - gdouble x, - gdouble y, - GtkWidget *widget) +activate_sort (GtkColumnViewTitle *self) { - GtkColumnViewTitle *self = GTK_COLUMN_VIEW_TITLE (widget); GtkSorter *sorter; GtkColumnView *view; GtkColumnViewSorter *view_sorter; @@ -133,6 +136,56 @@ click_pressed_cb (GtkGestureClick *gesture, } static void +show_menu (GtkColumnViewTitle *self, + double x, + double y) +{ + if (!self->popup_menu) + { + GMenuModel *model; + + model = gtk_column_view_column_get_header_menu (self->column); + if (!model) + return; + + self->popup_menu = gtk_popover_menu_new_from_model (model); + gtk_widget_set_parent (self->popup_menu, GTK_WIDGET (self)); + gtk_popover_set_position (GTK_POPOVER (self->popup_menu), GTK_POS_BOTTOM); + + gtk_popover_set_has_arrow (GTK_POPOVER (self->popup_menu), FALSE); + gtk_widget_set_halign (self->popup_menu, GTK_ALIGN_START); + } + + if (x != -1 && y != -1) + { + GdkRectangle rect = { x, y, 1, 1 }; + gtk_popover_set_pointing_to (GTK_POPOVER (self->popup_menu), &rect); + } + else + gtk_popover_set_pointing_to (GTK_POPOVER (self->popup_menu), NULL); + + gtk_popover_popup (GTK_POPOVER (self->popup_menu)); +} + +static void +click_released_cb (GtkGestureClick *gesture, + guint n_press, + double x, + double y, + GtkWidget *widget) +{ + GtkColumnViewTitle *self = GTK_COLUMN_VIEW_TITLE (widget); + guint button; + + button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)); + + if (button == GDK_BUTTON_PRIMARY) + activate_sort (self); + else if (button == GDK_BUTTON_SECONDARY) + show_menu (self, x, y); +} + +static void gtk_column_view_title_init (GtkColumnViewTitle *self) { GtkWidget *widget = GTK_WIDGET (self); @@ -150,7 +203,8 @@ gtk_column_view_title_init (GtkColumnViewTitle *self) gtk_box_append (GTK_BOX (self->box), self->sort); gesture = gtk_gesture_click_new (); - g_signal_connect (gesture, "pressed", G_CALLBACK (click_pressed_cb), self); + gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), 0); + g_signal_connect (gesture, "released", G_CALLBACK (click_released_cb), self); gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (gesture)); } @@ -199,6 +253,8 @@ gtk_column_view_title_update (GtkColumnViewTitle *self) } else gtk_widget_hide (self->sort); + + g_clear_pointer (&self->popup_menu, gtk_widget_unparent); } GtkColumnViewColumn * |