1 /** 2 * @fileOverview drag extension for position 3 * @author yiminghe@gmail.com 4 */ 5 KISSY.add("component/uibase/drag", function (S) { 6 7 /** 8 * @name Drag 9 * @class 10 * Drag extension class. 11 * Make element draggable. 12 * @memberOf Component.UIBase 13 */ 14 function Drag() { 15 } 16 17 Drag.ATTRS = 18 19 /** 20 * @lends Component.UIBase.Drag 21 */ 22 { 23 /** 24 * Current draggable element's handlers. 25 * See {@link DD.Draggable#handlers} 26 */ 27 handlers:{ 28 value:[] 29 }, 30 /** 31 * Whether current element is draggable. 32 * @type Boolean 33 */ 34 draggable:{value:true} 35 }; 36 37 function dragExtAction(ev) { 38 this.set("xy", [ev.left, ev.top]); 39 } 40 41 Drag.prototype = { 42 43 _uiSetHandlers:function (v) { 44 var d; 45 if (v && v.length > 0 && (d = this.__drag)) { 46 d.set("handlers", v); 47 } 48 }, 49 50 __bindUI:function () { 51 var DD = S.require("dd") || {}, 52 Draggable = DD.Draggable, 53 d, 54 self = this, 55 dragCfg = self.get("draggable"), 56 el = self.get("el"); 57 if (dragCfg && Draggable) { 58 if (dragCfg === true) { 59 dragCfg = {}; 60 } 61 d = self.__drag = new Draggable({ 62 node:el, 63 move:dragCfg.proxy 64 }); 65 66 if (dragCfg.proxy) { 67 dragCfg.proxy.moveOnEnd = false; 68 d.on("dragend", function () { 69 var proxyOffset = p.get("proxyNode").offset(); 70 el.css("visibility", ""); 71 self.set("x", proxyOffset.left); 72 self.set("y", proxyOffset.top); 73 }); 74 var p = self.__proxy = new DD.Proxy(dragCfg.proxy); 75 p.attachDrag(d); 76 } else { 77 d.on("drag", dragExtAction, self); 78 } 79 80 if (dragCfg.scroll) { 81 var s = self.__scroll = new DD.Scroll(dragCfg.scroll); 82 s.attachDrag(d); 83 } 84 85 } 86 }, 87 88 _uiSetDraggable:function (v) { 89 var d = this.__drag; 90 d && d.set("disabled", !v); 91 }, 92 93 __destructor:function () { 94 var self = this, 95 p = self.__proxy, 96 s = self.__scroll, 97 d = self.__drag; 98 d && d.destroy(); 99 s && s.destroy(); 100 p && p.destroy(); 101 } 102 103 }; 104 return Drag; 105 106 });