[gnome-shell] altTab: Port to St.ScrollView
- From: Adel Gadllah <agadllah src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] altTab: Port to St.ScrollView
- Date: Tue, 28 Feb 2012 13:56:57 +0000 (UTC)
commit 714ffc5ef160adb51b500e914070afe7abf5e825
Author: Adel Gadllah <adel gadllah gmail com>
Date: Fri Feb 3 18:50:03 2012 +0100
altTab: Port to St.ScrollView
The appSwitcher has been using a custom scrolling implementation because
St.ScrollView was buggy when it was written. The bugs have been fixed
so remove the custom implementation and move to St.ScrollView.
https://bugzilla.gnome.org/show_bug.cgi?id=613194
js/ui/altTab.js | 115 +++++++++++++++++++++++++++----------------------------
1 files changed, 57 insertions(+), 58 deletions(-)
---
diff --git a/js/ui/altTab.js b/js/ui/altTab.js
index 25e6db7..ab2160c 100644
--- a/js/ui/altTab.js
+++ b/js/ui/altTab.js
@@ -2,6 +2,7 @@
const Clutter = imports.gi.Clutter;
const Gdk = imports.gi.Gdk;
+const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta;
@@ -561,14 +562,13 @@ const SwitcherList = new Lang.Class({
this._list.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
this._list.connect('allocate', Lang.bind(this, this._allocate));
- this._clipBin = new St.Bin({style_class: 'cbin'});
- this._clipBin.child = this._list;
- this.actor.add_actor(this._clipBin);
+ this._scrollView = new St.ScrollView({ style_class: 'hfade' });
+ this._scrollView.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER);
- this._leftGradient = new St.BoxLayout({style_class: 'thumbnail-scroll-gradient-left', vertical: true});
- this._rightGradient = new St.BoxLayout({style_class: 'thumbnail-scroll-gradient-right', vertical: true});
- this.actor.add_actor(this._leftGradient);
- this.actor.add_actor(this._rightGradient);
+ let scrollBox = new St.BoxLayout();
+ scrollBox.add_actor(this._list);
+ this._scrollView.add_actor(scrollBox);
+ this.actor.add_actor(this._scrollView);
// Those arrows indicate whether scrolling in one direction is possible
this._leftArrow = new St.DrawingArea({ style_class: 'switcher-arrow',
@@ -599,21 +599,9 @@ const SwitcherList = new Lang.Class({
let childBox = new Clutter.ActorBox();
let scrollable = this._minSize > box.x2 - box.x1;
- this._clipBin.allocate(box, flags);
-
- childBox.x1 = 0;
- childBox.y1 = 0;
- childBox.x2 = this._leftGradient.width;
- childBox.y2 = this.actor.height;
- this._leftGradient.allocate(childBox, flags);
- this._leftGradient.opacity = (this._scrollableLeft && scrollable) ? 255 : 0;
-
- childBox.x1 = (this.actor.allocation.x2 - this.actor.allocation.x1) - this._rightGradient.width;
- childBox.y1 = 0;
- childBox.x2 = childBox.x1 + this._rightGradient.width;
- childBox.y2 = this.actor.height;
- this._rightGradient.allocate(childBox, flags);
- this._rightGradient.opacity = (this._scrollableRight && scrollable) ? 255 : 0;
+ box.y1 -= this.actor.get_theme_node().get_padding(St.Side.TOP);
+ box.y2 += this.actor.get_theme_node().get_padding(St.Side.BOTTOM);
+ this._scrollView.allocate(box, flags);
let arrowWidth = Math.floor(leftPadding / 3);
let arrowHeight = arrowWidth * 2;
@@ -622,7 +610,7 @@ const SwitcherList = new Lang.Class({
childBox.x2 = childBox.x1 + arrowWidth;
childBox.y2 = childBox.y1 + arrowHeight;
this._leftArrow.allocate(childBox, flags);
- this._leftArrow.opacity = this._leftGradient.opacity;
+ this._leftArrow.opacity = (this._scrollableLeft && scrollable) ? 255 : 0;
arrowWidth = Math.floor(rightPadding / 3);
arrowHeight = arrowWidth * 2;
@@ -631,7 +619,7 @@ const SwitcherList = new Lang.Class({
childBox.x2 = childBox.x1 + arrowWidth;
childBox.y2 = childBox.y1 + arrowHeight;
this._rightArrow.allocate(childBox, flags);
- this._rightArrow.opacity = this._rightGradient.opacity;
+ this._rightArrow.opacity = (this._scrollableRight && scrollable) ? 255 : 0;
},
addItem : function(item, label) {
@@ -679,47 +667,66 @@ const SwitcherList = new Lang.Class({
this._items[this._highlighted].add_style_pseudo_class('selected');
}
+ let adjustment = this._scrollView.hscroll.adjustment;
+ let [value, lower, upper, stepIncrement, pageIncrement, pageSize] = adjustment.get_values();
let [absItemX, absItemY] = this._items[index].get_transformed_position();
let [result, posX, posY] = this.actor.transform_stage_point(absItemX, 0);
let [containerWidth, containerHeight] = this.actor.get_transformed_size();
if (posX + this._items[index].get_width() > containerWidth)
this._scrollToRight();
- else if (posX < 0)
+ else if (this._items[index].allocation.x1 - value < 0)
this._scrollToLeft();
},
_scrollToLeft : function() {
- let x = this._items[this._highlighted].allocation.x1;
+ let adjustment = this._scrollView.hscroll.adjustment;
+ let [value, lower, upper, stepIncrement, pageIncrement, pageSize] = adjustment.get_values();
+
+ let item = this._items[this._highlighted];
+
+ if (item.allocation.x1 < value)
+ value = Math.min(0, item.allocation.x1);
+ else if (item.allocation.x2 > value + pageSize)
+ value = Math.max(upper, item.allocation.x2 - pageSize);
+
this._scrollableRight = true;
- Tweener.addTween(this._list, { anchor_x: x,
- time: POPUP_SCROLL_TIME,
- transition: 'easeOutQuad',
- onComplete: Lang.bind(this, function () {
- if (this._highlighted == 0) {
- this._scrollableLeft = false;
- this.actor.queue_relayout();
- }
- })
- });
+ Tweener.addTween(adjustment,
+ { value: value,
+ time: POPUP_SCROLL_TIME,
+ transition: 'easeOutQuad',
+ onComplete: Lang.bind(this, function () {
+ if (this._highlighted == 0) {
+ this._scrollableLeft = false;
+ this.actor.queue_relayout();
+ }
+ })
+ });
},
_scrollToRight : function() {
+ let adjustment = this._scrollView.hscroll.adjustment;
+ let [value, lower, upper, stepIncrement, pageIncrement, pageSize] = adjustment.get_values();
+
+ let item = this._items[this._highlighted];
+
+ if (item.allocation.x1 < value)
+ value = Math.max(0, item.allocation.x1);
+ else if (item.allocation.x2 > value + pageSize)
+ value = Math.min(upper, item.allocation.x2 - pageSize);
+
this._scrollableLeft = true;
- let monitor = Main.layoutManager.primaryMonitor;
- let padding = this.actor.get_theme_node().get_horizontal_padding();
- let parentPadding = this.actor.get_parent().get_theme_node().get_horizontal_padding();
- let x = this._items[this._highlighted].allocation.x2 - monitor.width + padding + parentPadding;
- Tweener.addTween(this._list, { anchor_x: x,
- time: POPUP_SCROLL_TIME,
- transition: 'easeOutQuad',
- onComplete: Lang.bind(this, function () {
- if (this._highlighted == this._items.length - 1) {
- this._scrollableRight = false;
- this.actor.queue_relayout();
- }
- })
- });
+ Tweener.addTween(adjustment,
+ { value: value,
+ time: POPUP_SCROLL_TIME,
+ transition: 'easeOutQuad',
+ onComplete: Lang.bind(this, function () {
+ if (this._highlighted == this._items.length - 1) {
+ this._scrollableRight = false;
+ this.actor.queue_relayout();
+ }
+ })
+ });
},
_itemActivated: function(n) {
@@ -838,14 +845,6 @@ const SwitcherList = new Lang.Class({
// we don't allocate it.
}
}
-
- let leftPadding = this.actor.get_theme_node().get_padding(St.Side.LEFT);
- let rightPadding = this.actor.get_theme_node().get_padding(St.Side.RIGHT);
- let topPadding = this.actor.get_theme_node().get_padding(St.Side.TOP);
- let bottomPadding = this.actor.get_theme_node().get_padding(St.Side.BOTTOM);
-
- // Clip the area for scrolling
- this._clipBin.set_clip(0, -topPadding, (this.actor.allocation.x2 - this.actor.allocation.x1) - leftPadding - rightPadding, this.actor.height + bottomPadding);
}
});
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]