[gnome-shell] dnd: Centralize drag actor positioning code, use shellWorkspaceLaunch for workspaces
- From: Colin Walters <walters src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnome-shell] dnd: Centralize drag actor positioning code, use shellWorkspaceLaunch for workspaces
- Date: Thu, 20 Aug 2009 23:38:04 +0000 (UTC)
commit dd1a309cb6699c1ab77664bd6a48ec22f07f4d1a
Author: Colin Walters <walters verbum org>
Date: Mon Aug 17 20:29:54 2009 -0400
dnd: Centralize drag actor positioning code, use shellWorkspaceLaunch for workspaces
We had multiple copies of the code to position a drag actor given a particular
source. Instead, just put it inside dnd.js.
Second, rather than test for GenericDisplay/WellDisplayItem etc.,
in various places, add a new method on each source "shellWorkspaceLaunch"
which both marks the item as being droppable on a workspace, and is
called by the workspaces code to launch the item.
js/ui/appDisplay.js | 23 +++++++++--------------
js/ui/dnd.js | 15 +++++++++++++--
js/ui/docDisplay.js | 8 +++++++-
js/ui/genericDisplay.js | 18 ++----------------
js/ui/workspaces.js | 6 ++----
5 files changed, 33 insertions(+), 37 deletions(-)
---
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index a278e5e..d69a3b5 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -76,6 +76,10 @@ AppDisplayItem.prototype = {
// Returns a preview icon for the item.
_createPreviewIcon : function() {
return this._appInfo.create_icon_texture(GenericDisplay.PREVIEW_ICON_SIZE);
+ },
+
+ shellWorkspaceLaunch: function() {
+ this.launch();
}
};
@@ -540,21 +544,12 @@ WellDisplayItem.prototype = {
this.appInfo.launch();
},
- // Draggable interface - FIXME deduplicate with GenericDisplay
+ shellWorkspaceLaunch : function() {
+ this.launch();
+ },
+
getDragActor: function(stageX, stageY) {
- this.dragActor = this.appInfo.create_icon_texture(APP_ICON_SIZE);
-
- // If the user dragged from the icon itself, then position
- // the dragActor over the original icon. Otherwise center it
- // around the pointer
- let [iconX, iconY] = this._icon.get_transformed_position();
- let [iconWidth, iconHeight] = this._icon.get_transformed_size();
- if (stageX > iconX && stageX <= iconX + iconWidth &&
- stageY > iconY && stageY <= iconY + iconHeight)
- this.dragActor.set_position(iconX, iconY);
- else
- this.dragActor.set_position(stageX - this.dragActor.width / 2, stageY - this.dragActor.height / 2);
- return this.dragActor;
+ return this.appInfo.create_icon_texture(APP_ICON_SIZE);
},
// Returns the original icon that is being used as a source for the cloned texture
diff --git a/js/ui/dnd.js b/js/ui/dnd.js
index 2eb5f78..87cb5d8 100644
--- a/js/ui/dnd.js
+++ b/js/ui/dnd.js
@@ -82,10 +82,21 @@ _Draggable.prototype = {
// Drag actor does not always have to be the same as actor. For example drag actor
// can be an image that's part of the actor. So to perform "snap back" correctly we need
// to know what was the drag actor source.
- if (this.actor._delegate.getDragActorSource)
+ if (this.actor._delegate.getDragActorSource) {
this._dragActorSource = this.actor._delegate.getDragActorSource();
- else
+ // If the user dragged from the source, then position
+ // the dragActor over it. Otherwise, center it
+ // around the pointer
+ let [sourceX, sourceY] = this._dragActorSource.get_transformed_position();
+ let [sourceWidth, sourceHeight] = this._dragActorSource.get_transformed_size();
+ if (stageX > sourceX && stageX <= sourceX + sourceWidth &&
+ stageY > sourceY && stageY <= sourceY + sourceHeight)
+ this._dragActor.set_position(sourceX, sourceY);
+ else
+ this._dragActor.set_position(stageX - this._dragActor.width / 2, stageY - this._dragActor.height / 2);
+ } else {
this._dragActorSource = this.actor;
+ }
this._dragOrigParent = undefined;
this._ungrabActor(actor);
this._grabActor(this._dragActor);
diff --git a/js/ui/docDisplay.js b/js/ui/docDisplay.js
index 8dd1339..605d7f8 100644
--- a/js/ui/docDisplay.js
+++ b/js/ui/docDisplay.js
@@ -83,9 +83,15 @@ DocDisplayItem.prototype = {
}
},
+ //// Drag and Drop ////
+
+ shellWorkspaceLaunch: function() {
+ this.launch();
+ },
+
//// Private Methods ////
- // Updates the last visited time displayed in the description text for the item.
+ // Updates the last visited time displayed in the description text for the item.
_resetTimeDisplay: function(currentSecs) {
let lastSecs = this._docInfo.timestamp;
let timeDelta = currentSecs - lastSecs;
diff --git a/js/ui/genericDisplay.js b/js/ui/genericDisplay.js
index 6f13477..b874bc9 100644
--- a/js/ui/genericDisplay.js
+++ b/js/ui/genericDisplay.js
@@ -126,8 +126,6 @@ GenericDisplayItem.prototype = {
// It is used for updating the description text inside the details actor when
// the description text for the item is updated.
this._detailsDescriptions = [];
-
- this.dragActor = null;
},
//// Draggable object interface ////
@@ -135,21 +133,9 @@ GenericDisplayItem.prototype = {
// Returns a cloned texture of the item's icon to represent the item as it
// is being dragged.
getDragActor: function(stageX, stageY) {
- this.dragActor = this._createIcon();
-
- // If the user dragged from the icon itself, then position
- // the dragActor over the original icon. Otherwise center it
- // around the pointer
- let [iconX, iconY] = this._icon.get_transformed_position();
- let [iconWidth, iconHeight] = this._icon.get_transformed_size();
- if (stageX > iconX && stageX <= iconX + iconWidth &&
- stageY > iconY && stageY <= iconY + iconHeight)
- this.dragActor.set_position(iconX, iconY);
- else
- this.dragActor.set_position(stageX - this.dragActor.width / 2, stageY - this.dragActor.height / 2);
- return this.dragActor;
+ return this._createIcon();
},
-
+
// Returns the item icon, a separate copy of which is used to
// represent the item as it is being dragged. This is used to
// determine a snap-back location for the drag icon if it does
diff --git a/js/ui/workspaces.js b/js/ui/workspaces.js
index 39e2cd4..7fa0bb1 100644
--- a/js/ui/workspaces.js
+++ b/js/ui/workspaces.js
@@ -11,9 +11,7 @@ const Pango = imports.gi.Pango;
const Shell = imports.gi.Shell;
const Signals = imports.signals;
-const AppDisplay = imports.ui.appDisplay;
const DND = imports.ui.dnd;
-const GenericDisplay = imports.ui.genericDisplay;
const Main = imports.ui.main;
const Overview = imports.ui.overview;
const Panel = imports.ui.panel;
@@ -855,9 +853,9 @@ Workspace.prototype = {
false, // don't create workspace
time);
return true;
- } else if (source instanceof GenericDisplay.GenericDisplayItem || source instanceof AppDisplay.WellDisplayItem) {
+ } else if (source.shellWorkspaceLaunch) {
this._metaWorkspace.activate(time);
- source.launch();
+ source.shellWorkspaceLaunch();
return true;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]