[gnome-shell] popup-menu: Allow adjusting where in the source the arrow points to



commit 85520e34ab8696e518fe76ebdd432cb41279b1ae
Author: Florian MÃllner <fmuellner gnome org>
Date:   Thu Sep 15 00:14:03 2011 +0200

    popup-menu: Allow adjusting where in the source the arrow points to
    
    Currently BoxPointer/Menus always point to the center of the
    associated source actor. This is generally what we want, but
    add some API to adjust that behavior for the cases where it
    isn't.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=659274

 js/ui/boxpointer.js |   22 ++++++++++++++++++----
 js/ui/popupMenu.js  |   10 +++++++---
 2 files changed, 25 insertions(+), 7 deletions(-)
---
diff --git a/js/ui/boxpointer.js b/js/ui/boxpointer.js
index 4f6a2fb..00da8a2 100644
--- a/js/ui/boxpointer.js
+++ b/js/ui/boxpointer.js
@@ -46,6 +46,7 @@ BoxPointer.prototype = {
         this._yOffset = 0;
         this._xPosition = 0;
         this._yPosition = 0;
+        this._sourceAlignment = 0.5;
     },
 
     show: function(animate, onComplete) {
@@ -180,7 +181,7 @@ BoxPointer.prototype = {
         this.bin.allocate(childBox, flags);
 
         if (this._sourceActor && this._sourceActor.mapped)
-            this._reposition(this._sourceActor, this._alignment);
+            this._reposition(this._sourceActor, this._arrowAlignment);
     },
 
     _drawBorder: function(area) {
@@ -312,18 +313,31 @@ BoxPointer.prototype = {
         this.actor.show();
 
         this._sourceActor = sourceActor;
-        this._alignment = alignment;
+        this._arrowAlignment = alignment;
 
         this._reposition(sourceActor, alignment);
     },
 
+    setSourceAlignment: function(alignment) {
+        this._sourceAlignment = alignment;
+
+        if (!this._sourceActor)
+            return;
+
+        // We need to show it now to force an allocation,
+        // so that we can query the correct size.
+        this.actor.show();
+
+        this._reposition(this._sourceActor, this._arrowAlignment);
+    },
+
     _reposition: function(sourceActor, alignment) {
         // Position correctly relative to the sourceActor
         let sourceNode = sourceActor.get_theme_node();
         let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box());
         let sourceAllocation = Shell.util_get_transformed_allocation(sourceActor);
-        let sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) / 2;
-        let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) / 2;
+        let sourceCenterX = sourceAllocation.x1 + sourceContentBox.x1 + (sourceContentBox.x2 - sourceContentBox.x1) * this._sourceAlignment;
+        let sourceCenterY = sourceAllocation.y1 + sourceContentBox.y1 + (sourceContentBox.y2 - sourceContentBox.y1) * this._sourceAlignment;
         let [minWidth, minHeight, natWidth, natHeight] = this.actor.get_preferred_size();
 
         // We also want to keep it onscreen, and separated from the
diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js
index d5048a2..2b5a3d9 100644
--- a/js/ui/popupMenu.js
+++ b/js/ui/popupMenu.js
@@ -1142,10 +1142,10 @@ function PopupMenu() {
 PopupMenu.prototype = {
     __proto__: PopupMenuBase.prototype,
 
-    _init: function(sourceActor, alignment, arrowSide) {
+    _init: function(sourceActor, arrowAlignment, arrowSide) {
         PopupMenuBase.prototype._init.call (this, sourceActor, 'popup-menu-content');
 
-        this._alignment = alignment;
+        this._arrowAlignment = arrowAlignment;
         this._arrowSide = arrowSide;
 
         this._boxPointer = new BoxPointer.BoxPointer(arrowSide,
@@ -1198,13 +1198,17 @@ PopupMenu.prototype = {
         this._boxPointer.setArrowOrigin(origin);
     },
 
+    setSourceAlignment: function(alignment) {
+        this._boxPointer.setSourceAlignment(alignment);
+    },
+
     open: function(animate) {
         if (this.isOpen)
             return;
 
         this.isOpen = true;
 
-        this._boxPointer.setPosition(this.sourceActor, this._alignment);
+        this._boxPointer.setPosition(this.sourceActor, this._arrowAlignment);
         this._boxPointer.show(animate);
 
         this.actor.raise_top();



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