appDisplay: Readd next and previous page icons previews
This was lost 2 commits ago, but now we reimplement this in a different way. There is some jesting with allocations, since we cannot use transformed positions while changing translation of the icons. This new implementation works regardless of the screen resolution. Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2335>
This commit is contained in:
parent
48bcc8f0e2
commit
f22a5c5a91
@ -229,6 +229,7 @@ class BaseAppViewGridLayout extends Clutter.BinLayout {
|
|||||||
|
|
||||||
this._showIndicators = false;
|
this._showIndicators = false;
|
||||||
this._currentPage = 0;
|
this._currentPage = 0;
|
||||||
|
this._pageWidth = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
_getIndicatorsWidth(box) {
|
_getIndicatorsWidth(box) {
|
||||||
@ -315,6 +316,65 @@ class BaseAppViewGridLayout extends Clutter.BinLayout {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_getEndIcon(icons) {
|
||||||
|
const {columnsPerPage} = this._grid.layoutManager;
|
||||||
|
const index = Math.min(icons.length, columnsPerPage);
|
||||||
|
return icons[Math.max(index - 1, 0)];
|
||||||
|
}
|
||||||
|
|
||||||
|
_translatePreviousPageIcons(value, ltr) {
|
||||||
|
if (this._currentPage === 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const previousPage = this._currentPage - 1;
|
||||||
|
const icons = this._grid.getItemsAtPage(previousPage).filter(i => i.visible);
|
||||||
|
if (icons.length === 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const {left, right} = this._grid.indicatorsPadding;
|
||||||
|
const {columnSpacing} = this._grid.layoutManager;
|
||||||
|
const endIcon = this._getEndIcon(icons);
|
||||||
|
let iconOffset;
|
||||||
|
|
||||||
|
if (ltr) {
|
||||||
|
const currentPageOffset = this._pageWidth * this._currentPage;
|
||||||
|
iconOffset = currentPageOffset - endIcon.allocation.x2 + left - columnSpacing;
|
||||||
|
} else {
|
||||||
|
const rtlPage = this._grid.nPages - previousPage - 1;
|
||||||
|
const pageOffset = this._pageWidth * rtlPage;
|
||||||
|
iconOffset = pageOffset - endIcon.allocation.x1 - right + columnSpacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const icon of icons)
|
||||||
|
icon.translationX = iconOffset * value;
|
||||||
|
}
|
||||||
|
|
||||||
|
_translateNextPageIcons(value, ltr) {
|
||||||
|
if (this._currentPage >= this._grid.nPages - 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const nextPage = this._currentPage + 1;
|
||||||
|
const icons = this._grid.getItemsAtPage(nextPage).filter(i => i.visible);
|
||||||
|
if (icons.length === 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const {left, right} = this._grid.indicatorsPadding;
|
||||||
|
const {columnSpacing} = this._grid.layoutManager;
|
||||||
|
let iconOffset;
|
||||||
|
|
||||||
|
if (ltr) {
|
||||||
|
const pageOffset = this._pageWidth * nextPage;
|
||||||
|
iconOffset = pageOffset - icons[0].allocation.x1 - right + columnSpacing;
|
||||||
|
} else {
|
||||||
|
const rtlPage = this._grid.nPages - this._currentPage - 1;
|
||||||
|
const currentPageOffset = this._pageWidth * rtlPage;
|
||||||
|
iconOffset = currentPageOffset - icons[0].allocation.x2 + left - columnSpacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const icon of icons)
|
||||||
|
icon.translationX = iconOffset * value;
|
||||||
|
}
|
||||||
|
|
||||||
_syncPageIndicators() {
|
_syncPageIndicators() {
|
||||||
if (!this._container)
|
if (!this._container)
|
||||||
return;
|
return;
|
||||||
@ -338,6 +398,16 @@ class BaseAppViewGridLayout extends Clutter.BinLayout {
|
|||||||
ltr ? leftArrowOffset : rightArrowOffset;
|
ltr ? leftArrowOffset : rightArrowOffset;
|
||||||
this._nextPageArrow.translationX =
|
this._nextPageArrow.translationX =
|
||||||
ltr ? rightArrowOffset : leftArrowOffset;
|
ltr ? rightArrowOffset : leftArrowOffset;
|
||||||
|
|
||||||
|
// Page icons
|
||||||
|
this._translatePreviousPageIcons(value, ltr);
|
||||||
|
this._translateNextPageIcons(value, ltr);
|
||||||
|
|
||||||
|
if (this._grid.nPages > 0) {
|
||||||
|
this._grid.getItemsAtPage(this._currentPage).forEach(icon => {
|
||||||
|
icon.translationX = 0;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_set_container(container) {
|
vfunc_set_container(container) {
|
||||||
@ -367,6 +437,8 @@ class BaseAppViewGridLayout extends Clutter.BinLayout {
|
|||||||
this._previousPageArrow.allocate(ltr ? leftBox : rightBox);
|
this._previousPageArrow.allocate(ltr ? leftBox : rightBox);
|
||||||
this._nextPageIndicator.allocate(ltr ? rightBox : leftBox);
|
this._nextPageIndicator.allocate(ltr ? rightBox : leftBox);
|
||||||
this._nextPageArrow.allocate(ltr ? rightBox : leftBox);
|
this._nextPageArrow.allocate(ltr ? rightBox : leftBox);
|
||||||
|
|
||||||
|
this._pageWidth = box.get_width();
|
||||||
}
|
}
|
||||||
|
|
||||||
goToPage(page, animate = true) {
|
goToPage(page, animate = true) {
|
||||||
|
Loading…
Reference in New Issue
Block a user