[gnome-calendar/calendar-management] source-manager: show the edit popover with right-click



commit 3220b2fc3777d73b4376f1b4d8885f2c86fc4a90
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Thu Feb 5 11:02:24 2015 -0200

    source-manager: show the edit popover with right-click

 data/ui/source-manager-dialog.ui |    1 +
 src/gcal-source-manager-dialog.c |   79 +++++++++++++++++++++++++++++++++++++-
 2 files changed, 78 insertions(+), 2 deletions(-)
---
diff --git a/data/ui/source-manager-dialog.ui b/data/ui/source-manager-dialog.ui
index 8f863a1..54c3bf5 100644
--- a/data/ui/source-manager-dialog.ui
+++ b/data/ui/source-manager-dialog.ui
@@ -59,6 +59,7 @@
                         <property name="selection_mode">none</property>
                         <property name="activate_on_single_click">True</property>
                         <signal name="row_activated" handler="row_activated_cb" 
object="GcalSourceManagerDialog" swapped="no"/>
+                        <signal name="button_release_event" handler="button_release_cb" 
object="GcalSourceManagerDialog" swapped="no"/>
                       </object>
                     </child>
                   </object>
diff --git a/src/gcal-source-manager-dialog.c b/src/gcal-source-manager-dialog.c
index e6ea5c7..38bee02 100644
--- a/src/gcal-source-manager-dialog.c
+++ b/src/gcal-source-manager-dialog.c
@@ -61,6 +61,10 @@ enum {
 };
 
 /* callbacks */
+static gboolean button_release_cb                          (GtkWidget           *widget,
+                                                            GdkEventButton      *event,
+                                                            gpointer             user_data);
+
 static void     color_action_activated                     (GSimpleAction       *menu_item,
                                                             GVariant            *value,
                                                             gpointer             user_data);
@@ -117,6 +121,13 @@ static GtkWidget* make_row_for_source                      (GcalSourceManagerDia
 static void       update_action_states                     (GcalSourceManagerDialog *dialog,
                                                             ESource                 *source);
 
+static void       setup_edit_popover                       (GcalSourceManagerDialog *dialog,
+                                                            GtkWidget               *parent,
+                                                            gint                     x,
+                                                            gint                     y,
+                                                            gint                     width,
+                                                            gint                     height);
+
 /* prototypes */
 static void     gcal_source_manager_dialog_constructed     (GObject             *object);
 
@@ -145,6 +156,39 @@ static GActionEntry action_entries[] =
 };
 
 /**
+ * button_release_cb:
+ *
+ * When right-clicked, show the edit
+ * popover pointing to the pointer
+ * position.
+ *
+ * Returns:
+ */
+static gboolean
+button_release_cb (GtkWidget      *widget,
+                   GdkEventButton *event,
+                   gpointer        user_data)
+{
+  GcalSourceManagerDialogPrivate *priv;
+  GtkWidget *row;
+  ESource *source;
+
+  if (event->button != 3)
+    return GDK_EVENT_PROPAGATE;
+
+  priv = gcal_source_manager_dialog_get_instance_private (GCAL_SOURCE_MANAGER_DIALOG (user_data));
+  row = GTK_WIDGET (gtk_list_box_get_row_at_y (GTK_LIST_BOX (priv->sources_listbox), event->y));
+  source = g_hash_table_lookup (priv->row_to_source, row);
+
+  update_action_states (GCAL_SOURCE_MANAGER_DIALOG (user_data), source);
+
+  if (row != NULL)
+    setup_edit_popover (GCAL_SOURCE_MANAGER_DIALOG (user_data), priv->sources_listbox, event->x, event->y, 
1, 1);
+
+  return GDK_EVENT_STOP;
+}
+
+/**
  * color_action_activated:
  *
  * Change the source's color
@@ -407,8 +451,9 @@ row_activated_cb (GtkListBox    *listbox,
 
   if (row != NULL)
     {
-      gtk_popover_set_relative_to (GTK_POPOVER (priv->source_popover), GTK_WIDGET (row));
-      gtk_widget_show (priv->source_popover);
+      setup_edit_popover (GCAL_SOURCE_MANAGER_DIALOG (user_data), GTK_WIDGET (row), 0, 0,
+                          gtk_widget_get_allocated_width (GTK_WIDGET (row)),
+                          gtk_widget_get_allocated_height (GTK_WIDGET (row)));
     }
 }
 
@@ -742,6 +787,35 @@ update_action_states (GcalSourceManagerDialog *dialog,
   priv->updating = FALSE;
 }
 
+/**
+ * setup_edit_popover:
+ *
+ * Place and show the edit sources popover.
+ *
+ * Returns:
+ */
+static void
+setup_edit_popover (GcalSourceManagerDialog *dialog,
+                    GtkWidget               *parent,
+                    gint                     x,
+                    gint                     y,
+                    gint                     width,
+                    gint                     height)
+{
+  GcalSourceManagerDialogPrivate *priv = gcal_source_manager_dialog_get_instance_private (dialog);
+  GdkRectangle rect;
+
+  rect.x = x;
+  rect.y = y;
+  rect.width = width;
+  rect.height = height;
+
+  gtk_popover_set_relative_to (GTK_POPOVER (priv->source_popover), parent);
+  gtk_popover_set_pointing_to (GTK_POPOVER (priv->source_popover), &rect);
+
+  gtk_widget_show (priv->source_popover);
+}
+
 GtkWidget *
 gcal_source_manager_dialog_new (GcalManager *manager)
 {
@@ -825,6 +899,7 @@ gcal_source_manager_dialog_class_init (GcalSourceManagerDialogClass *klass)
   gtk_widget_class_bind_template_child_private (widget_class, GcalSourceManagerDialog, source_popover);
   gtk_widget_class_bind_template_child_private (widget_class, GcalSourceManagerDialog, sources_listbox);
 
+  gtk_widget_class_bind_template_callback (widget_class, button_release_cb);
   gtk_widget_class_bind_template_callback (widget_class, row_activated_cb);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]