summaryrefslogtreecommitdiff
path: root/gtk/gtkcolumnviewtitle.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2019-12-21 22:21:27 -0500
committerMatthias Clasen <mclasen@redhat.com>2020-06-01 22:10:53 -0400
commitcb2901ec4093ff1e75a389308a807713ec36d33c (patch)
treecd807a5bdc1da1ea9049b0866d7f1216270e6eba /gtk/gtkcolumnviewtitle.c
parentf27bd061fbfd0b69bd1110e1c380b017057519a3 (diff)
downloadgtk+-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.c70
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 *