[gnome-shell] dnd: Centralize drag actor positioning code, use shellWorkspaceLaunch for workspaces



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]