folderIcon: Allow dropping application icons

Connect to the overview signals related to Drag n' Drop, and
allow dropping application icons in it. Dropping an icon
appends the application id to the folder's GSettings key.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/603
This commit is contained in:
Georges Basile Stavracas Neto
2019-06-28 19:47:32 -03:00
parent 23191ec239
commit cc9f949b65

View File

@ -1221,6 +1221,11 @@ var FolderIcon = class FolderIcon {
this.view = new FolderView(this._folder, parentView);
Main.overview.connect('item-drag-begin',
this._onDragBegin.bind(this));
Main.overview.connect('item-drag-end',
this._onDragEnd.bind(this));
this.actor.connect('clicked', this.open.bind(this));
this.actor.connect('destroy', this.onDestroy.bind(this));
this.actor.connect('notify::mapped', () => {
@ -1254,6 +1259,47 @@ var FolderIcon = class FolderIcon {
return this.view.getAllItems().map(item => item.id);
}
_onDragBegin() {
this._parentView.inhibitEventBlocker();
}
_onDragEnd() {
this._parentView.uninhibitEventBlocker();
}
_canDropAt(source) {
if (!(source instanceof AppIcon))
return false;
if (!global.settings.is_writable('favorite-apps'))
return false;
if (this._folder.get_strv('apps').includes(source.id))
return false
return true;
}
handleDragOver(source, actor, x, y, time) {
if (!this._canDropAt(source))
return DND.DragMotionResult.NO_DROP;
return DND.DragMotionResult.MOVE_DROP;
}
acceptDrop(source, actor, x, y, time) {
if (!this._canDropAt(source))
return true;
let app = source.app;
let folderApps = this._folder.get_strv('apps');
folderApps.push(app.id);
this._folder.set_strv('apps', folderApps);
return true;
}
_updateName() {
let name = _getFolderName(this._folder);
if (this.name == name)