[gnome-shell] [boxPointer] implement the other arrowSide values



commit 702f596c44940a8cdf9dfb42ed6cb1fbcbe8fe3a
Author: Dan Winship <danw gnome org>
Date:   Thu May 20 11:18:46 2010 -0400

    [boxPointer] implement the other arrowSide values
    
    https://bugzilla.gnome.org/show_bug.cgi?id=619541

 js/ui/boxpointer.js |   61 ++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 48 insertions(+), 13 deletions(-)
---
diff --git a/js/ui/boxpointer.js b/js/ui/boxpointer.js
index c85d118..1f651c6 100644
--- a/js/ui/boxpointer.js
+++ b/js/ui/boxpointer.js
@@ -22,8 +22,6 @@ function BoxPointer(side, binProperties) {
 
 BoxPointer.prototype = {
     _init: function(arrowSide, binProperties) {
-        if (arrowSide != St.Side.TOP)
-            throw new Error('Not implemented');
         this._arrowSide = arrowSide;
         this._arrowOrigin = 0;
         this.actor = new St.Bin({ x_fill: true,
@@ -83,14 +81,23 @@ BoxPointer.prototype = {
         childBox.x2 = availWidth;
         childBox.y2 = availHeight;
         this._border.allocate(childBox, flags);
+
+        childBox.x1 = borderWidth;
+        childBox.y1 = borderWidth;
+        childBox.x2 = availWidth - borderWidth;
+        childBox.y2 = availHeight - borderWidth;
         switch (this._arrowSide) {
             case St.Side.TOP:
-                childBox.x1 = borderWidth;
-                childBox.y1 = rise + borderWidth;
-                childBox.x2 = availWidth - borderWidth;
-                childBox.y2 = availHeight - borderWidth;
+                childBox.y1 += rise;
+                break;
+            case St.Side.BOTTOM:
+                childBox.y2 -= rise;
+                break;
+            case St.Side.LEFT:
+                childBox.x1 += rise;
                 break;
-            default:
+            case St.Side.RIGHT:
+                childBox.x2 -= rise;
                 break;
         }
         this.bin.allocate(childBox, flags);
@@ -106,6 +113,7 @@ BoxPointer.prototype = {
         [found, borderRadius] = themeNode.get_length('-arrow-border-radius', false);
 
         let halfBorder = borderWidth / 2;
+        let halfBase = Math.floor(base/2);
 
         let borderColor = new Clutter.Color();
         themeNode.get_color('-arrow-border-color', false, borderColor);
@@ -121,30 +129,57 @@ BoxPointer.prototype = {
         }
         let cr = area.get_context();
         Clutter.cairo_set_source_color(cr, borderColor);
+
+        // Translate so that box goes from 0,0 to boxWidth,boxHeight,
+        // with the arrow poking out of that
         if (this._arrowSide == St.Side.TOP) {
             cr.translate(0, rise);
+        } else if (this._arrowSide == St.Side.LEFT) {
+            cr.translate(rise, 0);
         }
+
         cr.moveTo(borderRadius, halfBorder);
+
         if (this._arrowSide == St.Side.TOP) {
-            cr.translate(0, -rise);
-            let halfBase = Math.floor(base/2);
-            cr.lineTo(this._arrowOrigin - halfBase, rise + halfBorder);
-            cr.lineTo(this._arrowOrigin, halfBorder);
-            cr.lineTo(this._arrowOrigin + halfBase, rise + halfBorder);
-            cr.translate(0, rise);
+            cr.lineTo(this._arrowOrigin - halfBase, halfBorder);
+            cr.lineTo(this._arrowOrigin, halfBorder - rise);
+            cr.lineTo(this._arrowOrigin + halfBase, halfBorder);
         }
         cr.lineTo(boxWidth - borderRadius, halfBorder);
+
         cr.arc(boxWidth - borderRadius - halfBorder, borderRadius + halfBorder, borderRadius,
                3*Math.PI/2, Math.PI*2);
+
+        if (this._arrowSide == St.Side.RIGHT) {
+            cr.lineTo(boxWidth - halfBorder, this._arrowOrigin - halfBase);
+            cr.lineTo(boxWidth - halfBorder + rise, this._arrowOrigin);
+            cr.lineTo(boxWidth - halfBorder, this._arrowOrigin + halfBase);
+        }
         cr.lineTo(boxWidth - halfBorder, boxHeight - borderRadius);
+
         cr.arc(boxWidth - borderRadius - halfBorder, boxHeight - borderRadius - halfBorder, borderRadius,
                0, Math.PI/2);
+
+        if (this._arrowSide == St.Side.BOTTOM) {
+            cr.lineTo(this._arrowOrigin + halfBase, boxHeight - halfBorder);
+            cr.lineTo(this._arrowOrigin, boxHeight - halfBorder + rise);
+            cr.lineTo(this._arrowOrigin - halfBase, boxHeight - halfBorder);
+        }
         cr.lineTo(borderRadius, boxHeight - halfBorder);
+
         cr.arc(borderRadius + halfBorder, boxHeight - borderRadius - halfBorder, borderRadius,
                Math.PI/2, Math.PI);
+
+        if (this._arrowSide == St.Side.LEFT) {
+            cr.lineTo(halfBorder, this._arrowOrigin + halfBase);
+            cr.lineTo(halfBorder - rise, this._arrowOrigin);
+            cr.lineTo(halfBorder, this._arrowOrigin - halfBase);
+        }
         cr.lineTo(halfBorder, borderRadius);
+
         cr.arc(borderRadius + halfBorder, borderRadius + halfBorder, borderRadius,
                Math.PI, 3*Math.PI/2);
+
         Clutter.cairo_set_source_color(cr, backgroundColor);
         cr.fillPreserve();
         Clutter.cairo_set_source_color(cr, borderColor);



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