[gnome-shell/gbsneto/custom-icon-positions: 2/11] appDisplay: Add placeholder when moving from folder dialog
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell/gbsneto/custom-icon-positions: 2/11] appDisplay: Add placeholder when moving from folder dialog
- Date: Fri, 10 Jul 2020 15:42:03 +0000 (UTC)
commit e08b5ddb73c69e40966115a15633f60a4b0978aa
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date: Tue Jun 23 12:05:27 2020 -0300
appDisplay: Add placeholder when moving from folder dialog
When moving an icon from a folder dialog, the app grid doesn't
really have an icon to move around.
Add a placeholder icon and hijack it in the various places.
https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1284
js/ui/appDisplay.js | 46 ++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 42 insertions(+), 4 deletions(-)
---
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index cdc48fd659..96fc656775 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -633,6 +633,7 @@ class AppDisplay extends BaseAppView {
this._delayedMoveId = 0;
this._targetDropPosition = null;
this._nudgedItem = null;
+ this._placeholder = null;
Main.overview.connect('hidden', () => this.goToPage(0));
@@ -720,17 +721,42 @@ class AppDisplay extends BaseAppView {
this._pageManager.pages = pages;
}
+ _ensurePlaceholder(source) {
+ if (this._placeholder)
+ return;
+
+ const appSys = Shell.AppSystem.get_default();
+ const app = appSys.lookup_app(source.id);
+
+ this._placeholder = new AppIcon(app, {
+ isDraggable: global.settings.is_writable('favorite-apps'),
+ });
+ this._placeholder.scaleAndFade();
+ this._redisplay();
+ }
+
+ _removePlaceholder() {
+ if (this._placeholder) {
+ this._placeholder.undoScaleAndFade();
+ this._placeholder = null;
+ this._redisplay();
+ }
+ }
+
getAppInfos() {
return this._appInfoList;
}
_getItemPosition(item) {
+ if (item === this._placeholder)
+ return this._grid.getItemPosition(item);
+
return this._pageManager.getAppPosition(item.id);
}
_compareItems(a, b) {
- const [aPage, aPosition] = this._pageManager.getAppPosition(a.id);
- const [bPage, bPosition] = this._pageManager.getAppPosition(b.id);
+ const [aPage, aPosition] = this._getItemPosition(a);
+ const [bPage, bPosition] = this._getItemPosition(b);
if (aPage === -1 && bPage === -1)
return a.name.localeCompare(b.name);
@@ -808,6 +834,10 @@ class AppDisplay extends BaseAppView {
appIcons.push(icon);
});
+ // At last, if there's a placeholder available, add it
+ if (this._placeholder)
+ appIcons.push(this._placeholder);
+
return appIcons;
}
@@ -952,7 +982,7 @@ class AppDisplay extends BaseAppView {
if (!success)
return;
- const { source } = dragEvent;
+ const source = this._placeholder ? this._placeholder : dragEvent.source;
const [item, dragLocation] = this.getDropTarget(x, y);
// Dragging over invalid parts of the grid cancels the timeout
@@ -1040,11 +1070,18 @@ class AppDisplay extends BaseAppView {
'[gnome-shell] this._lastOvershootTimeoutId');
}
- _onDragBegin() {
+ _onDragBegin(_overview, source) {
this._dragMonitor = {
dragMotion: this._onDragMotion.bind(this),
};
DND.addDragMonitor(this._dragMonitor);
+
+ // When dragging from a folder dialog, the dragged app icon doesn't
+ // exist in AppDisplay. We work around that by adding a placeholder
+ // icon that is either destroyed on cancel, or becomes the effective
+ // new icon when dropped.
+ if (_getViewFromIcon(source) instanceof FolderView)
+ this._ensurePlaceholder(source);
}
_onDragMotion(dragEvent) {
@@ -1072,6 +1109,7 @@ class AppDisplay extends BaseAppView {
this._resetOvershoot();
this._removeNudge();
+ this._removePlaceholder();
}
_onDragCancelled(_overview, source) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]