mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-11-23 18:17:20 +00:00
Refactor draggable stuff for easier reuse
And in the process, make the button widget draggable. Unfortunately, Firefox has a bug that prevents buttons from being dragged (see https://bugzilla.mozilla.org/show_bug.cgi?id=568313 and https://bugzilla.mozilla.org/show_bug.cgi?id=646823). So we have to use the “tag” attribute to make it use a different element.
This commit is contained in:
parent
3a00d2eea3
commit
8f1114960a
@ -1,82 +0,0 @@
|
|||||||
/*\
|
|
||||||
title: $:/core/modules/utils/dom/datatransfer.js
|
|
||||||
type: application/javascript
|
|
||||||
module-type: utils
|
|
||||||
|
|
||||||
Browser data transfer utilities, used with the clipboard and drag and drop
|
|
||||||
|
|
||||||
\*/
|
|
||||||
(function(){
|
|
||||||
|
|
||||||
/*jslint node: true, browser: true */
|
|
||||||
/*global $tw: false */
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
exports.importDataTransfer = function(dataTransfer,fallbackTitle,callback) {
|
|
||||||
// Try each provided data type in turn
|
|
||||||
for(var t=0; t<importDataTypes.length; t++) {
|
|
||||||
if(!$tw.browser.isIE || importDataTypes[t].IECompatible) {
|
|
||||||
// Get the data
|
|
||||||
var dataType = importDataTypes[t];
|
|
||||||
var data = dataTransfer.getData(dataType.type);
|
|
||||||
// Import the tiddlers in the data
|
|
||||||
if(data !== "" && data !== null) {
|
|
||||||
if($tw.log.IMPORT) {
|
|
||||||
console.log("Importing data type '" + dataType.type + "', data: '" + data + "'")
|
|
||||||
}
|
|
||||||
var tiddlerFields = dataType.toTiddlerFieldsArray(data,fallbackTitle);
|
|
||||||
callback(tiddlerFields);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var importDataTypes = [
|
|
||||||
{type: "text/vnd.tiddler", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {
|
|
||||||
return parseJSONTiddlers(data,fallbackTitle);
|
|
||||||
}},
|
|
||||||
{type: "URL", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {
|
|
||||||
// Check for tiddler data URI
|
|
||||||
var match = decodeURIComponent(data).match(/^data\:text\/vnd\.tiddler,(.*)/i);
|
|
||||||
if(match) {
|
|
||||||
return parseJSONTiddlers(match[1],fallbackTitle);
|
|
||||||
} else {
|
|
||||||
return [{text: data}]; // As URL string
|
|
||||||
}
|
|
||||||
}},
|
|
||||||
{type: "text/x-moz-url", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {
|
|
||||||
// Check for tiddler data URI
|
|
||||||
var match = decodeURIComponent(data).match(/^data\:text\/vnd\.tiddler,(.*)/i);
|
|
||||||
if(match) {
|
|
||||||
return parseJSONTiddlers(match[1],fallbackTitle);
|
|
||||||
} else {
|
|
||||||
return [{text: data}]; // As URL string
|
|
||||||
}
|
|
||||||
}},
|
|
||||||
{type: "text/html", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {
|
|
||||||
return [{text: data}];
|
|
||||||
}},
|
|
||||||
{type: "text/plain", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {
|
|
||||||
return [{text: data}];
|
|
||||||
}},
|
|
||||||
{type: "Text", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {
|
|
||||||
return [{text: data}];
|
|
||||||
}},
|
|
||||||
{type: "text/uri-list", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {
|
|
||||||
return [{text: data}];
|
|
||||||
}}
|
|
||||||
];
|
|
||||||
|
|
||||||
function parseJSONTiddlers(json,fallbackTitle) {
|
|
||||||
var data = JSON.parse(json);
|
|
||||||
if(!$tw.utils.isArray(data)) {
|
|
||||||
data = [data];
|
|
||||||
}
|
|
||||||
data.forEach(function(fields) {
|
|
||||||
fields.title = fields.title || fallbackTitle;
|
|
||||||
});
|
|
||||||
return data;
|
|
||||||
};
|
|
||||||
|
|
||||||
})();
|
|
172
core/modules/utils/dom/dragndrop.js
Normal file
172
core/modules/utils/dom/dragndrop.js
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
/*\
|
||||||
|
title: $:/core/modules/utils/dom/dragndrop.js
|
||||||
|
type: application/javascript
|
||||||
|
module-type: utils
|
||||||
|
|
||||||
|
Browser data transfer utilities, used with the clipboard and drag and drop
|
||||||
|
|
||||||
|
\*/
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
/*jslint node: true, browser: true */
|
||||||
|
/*global $tw: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
/*
|
||||||
|
Options:
|
||||||
|
|
||||||
|
domNode: dom node to make draggable
|
||||||
|
dragTiddlerFn: optional function to retrieve the title of tiddler to drag
|
||||||
|
dragFilterFn: optional function to retreive the filter defining a list of tiddlers to drag
|
||||||
|
widget: widget to use as the contect for the filter
|
||||||
|
*/
|
||||||
|
exports.makeDraggable = function(options) {
|
||||||
|
var dragImage,
|
||||||
|
domNode = options.domNode;
|
||||||
|
// Make the dom node draggable
|
||||||
|
domNode.setAttribute("draggable","true");
|
||||||
|
// Add event handlers
|
||||||
|
$tw.utils.addEventListeners(domNode,[
|
||||||
|
{name: "dragstart", handlerFunction: function(event) {
|
||||||
|
// Collect the tiddlers being dragged
|
||||||
|
var dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),
|
||||||
|
dragFilter = options.dragFilterFn && options.dragFilterFn(),
|
||||||
|
titles = dragTiddler ? [dragTiddler] : [];
|
||||||
|
if(dragFilter) {
|
||||||
|
titles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));
|
||||||
|
}
|
||||||
|
var titleString = $tw.utils.stringifyList(titles);
|
||||||
|
// Check that we've something to drag
|
||||||
|
if(titles.length > 0 && event.target === domNode) {
|
||||||
|
// Mark the drag in progress
|
||||||
|
$tw.dragInProgress = domNode;
|
||||||
|
// Set the dragging class on the element being dragged
|
||||||
|
$tw.utils.addClass(event.target,"tc-dragging");
|
||||||
|
// Create the drag image elements
|
||||||
|
dragImage = options.widget.document.createElement("div");
|
||||||
|
dragImage.className = "tc-tiddler-dragger";
|
||||||
|
var inner = options.widget.document.createElement("div");
|
||||||
|
inner.className = "tc-tiddler-dragger-inner";
|
||||||
|
inner.appendChild(options.widget.document.createTextNode(
|
||||||
|
titles.length === 1 ?
|
||||||
|
titles[0] :
|
||||||
|
titles.length + " tiddlers"
|
||||||
|
));
|
||||||
|
dragImage.appendChild(inner);
|
||||||
|
options.widget.document.body.appendChild(dragImage);
|
||||||
|
// Set the data transfer properties
|
||||||
|
var dataTransfer = event.dataTransfer;
|
||||||
|
// Set up the image
|
||||||
|
dataTransfer.effectAllowed = "copy";
|
||||||
|
if(dataTransfer.setDragImage) {
|
||||||
|
dataTransfer.setDragImage(dragImage.firstChild,-16,-16);
|
||||||
|
}
|
||||||
|
// Set up the data transfer
|
||||||
|
dataTransfer.clearData();
|
||||||
|
var jsonData = [];
|
||||||
|
if(titles.length > 1) {
|
||||||
|
titles.forEach(function(title) {
|
||||||
|
jsonData.push(options.widget.wiki.getTiddlerAsJson(title));
|
||||||
|
});
|
||||||
|
jsonData = "[" + jsonData.join(",") + "]";
|
||||||
|
} else {
|
||||||
|
jsonData = options.widget.wiki.getTiddlerAsJson(titles[0]);
|
||||||
|
}
|
||||||
|
// IE doesn't like these content types
|
||||||
|
if(!$tw.browser.isIE) {
|
||||||
|
dataTransfer.setData("text/vnd.tiddler",jsonData);
|
||||||
|
dataTransfer.setData("text/plain",titleString);
|
||||||
|
dataTransfer.setData("text/x-moz-url","data:text/vnd.tiddler," + encodeURIComponent(jsonData));
|
||||||
|
}
|
||||||
|
dataTransfer.setData("URL","data:text/vnd.tiddler," + encodeURIComponent(jsonData));
|
||||||
|
dataTransfer.setData("Text",titleString);
|
||||||
|
event.stopPropagation();
|
||||||
|
} else {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}},
|
||||||
|
{name: "dragend", handlerFunction: function(event) {
|
||||||
|
if(event.target === domNode) {
|
||||||
|
$tw.dragInProgress = null;
|
||||||
|
// Remove the dragging class on the element being dragged
|
||||||
|
$tw.utils.removeClass(event.target,"tc-dragging");
|
||||||
|
// Delete the drag image element
|
||||||
|
if(dragImage) {
|
||||||
|
dragImage.parentNode.removeChild(dragImage);
|
||||||
|
dragImage = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}}
|
||||||
|
]);
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.importDataTransfer = function(dataTransfer,fallbackTitle,callback) {
|
||||||
|
// Try each provided data type in turn
|
||||||
|
for(var t=0; t<importDataTypes.length; t++) {
|
||||||
|
if(!$tw.browser.isIE || importDataTypes[t].IECompatible) {
|
||||||
|
// Get the data
|
||||||
|
var dataType = importDataTypes[t];
|
||||||
|
var data = dataTransfer.getData(dataType.type);
|
||||||
|
// Import the tiddlers in the data
|
||||||
|
if(data !== "" && data !== null) {
|
||||||
|
if($tw.log.IMPORT) {
|
||||||
|
console.log("Importing data type '" + dataType.type + "', data: '" + data + "'")
|
||||||
|
}
|
||||||
|
var tiddlerFields = dataType.toTiddlerFieldsArray(data,fallbackTitle);
|
||||||
|
callback(tiddlerFields);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var importDataTypes = [
|
||||||
|
{type: "text/vnd.tiddler", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {
|
||||||
|
return parseJSONTiddlers(data,fallbackTitle);
|
||||||
|
}},
|
||||||
|
{type: "URL", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {
|
||||||
|
// Check for tiddler data URI
|
||||||
|
var match = decodeURIComponent(data).match(/^data\:text\/vnd\.tiddler,(.*)/i);
|
||||||
|
if(match) {
|
||||||
|
return parseJSONTiddlers(match[1],fallbackTitle);
|
||||||
|
} else {
|
||||||
|
return [{text: data}]; // As URL string
|
||||||
|
}
|
||||||
|
}},
|
||||||
|
{type: "text/x-moz-url", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {
|
||||||
|
// Check for tiddler data URI
|
||||||
|
var match = decodeURIComponent(data).match(/^data\:text\/vnd\.tiddler,(.*)/i);
|
||||||
|
if(match) {
|
||||||
|
return parseJSONTiddlers(match[1],fallbackTitle);
|
||||||
|
} else {
|
||||||
|
return [{text: data}]; // As URL string
|
||||||
|
}
|
||||||
|
}},
|
||||||
|
{type: "text/html", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {
|
||||||
|
return [{text: data}];
|
||||||
|
}},
|
||||||
|
{type: "text/plain", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {
|
||||||
|
return [{text: data}];
|
||||||
|
}},
|
||||||
|
{type: "Text", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {
|
||||||
|
return [{text: data}];
|
||||||
|
}},
|
||||||
|
{type: "text/uri-list", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {
|
||||||
|
return [{text: data}];
|
||||||
|
}}
|
||||||
|
];
|
||||||
|
|
||||||
|
function parseJSONTiddlers(json,fallbackTitle) {
|
||||||
|
var data = JSON.parse(json);
|
||||||
|
if(!$tw.utils.isArray(data)) {
|
||||||
|
data = [data];
|
||||||
|
}
|
||||||
|
data.forEach(function(fields) {
|
||||||
|
fields.title = fields.title || fallbackTitle;
|
||||||
|
});
|
||||||
|
return data;
|
||||||
|
};
|
||||||
|
|
||||||
|
})();
|
@ -95,6 +95,15 @@ ButtonWidget.prototype.render = function(parent,nextSibling) {
|
|||||||
}
|
}
|
||||||
return handled;
|
return handled;
|
||||||
},false);
|
},false);
|
||||||
|
// Make it draggable if required
|
||||||
|
if(this.dragTiddler || this.dragFilter) {
|
||||||
|
$tw.utils.makeDraggable({
|
||||||
|
domNode: domNode,
|
||||||
|
dragTiddlerFn: function() {return self.dragTiddler;},
|
||||||
|
dragFilterFn: function() {return self.dragFilter;},
|
||||||
|
widget: this
|
||||||
|
});
|
||||||
|
}
|
||||||
// Insert element
|
// Insert element
|
||||||
parent.insertBefore(domNode,nextSibling);
|
parent.insertBefore(domNode,nextSibling);
|
||||||
this.renderChildren(domNode,null);
|
this.renderChildren(domNode,null);
|
||||||
@ -172,6 +181,8 @@ ButtonWidget.prototype.execute = function() {
|
|||||||
this.selectedClass = this.getAttribute("selectedClass");
|
this.selectedClass = this.getAttribute("selectedClass");
|
||||||
this.defaultSetValue = this.getAttribute("default","");
|
this.defaultSetValue = this.getAttribute("default","");
|
||||||
this.buttonTag = this.getAttribute("tag");
|
this.buttonTag = this.getAttribute("tag");
|
||||||
|
this.dragTiddler = this.getAttribute("dragTiddler");
|
||||||
|
this.dragFilter = this.getAttribute("dragFilter");
|
||||||
// Make child widgets
|
// Make child widgets
|
||||||
this.makeChildWidgets();
|
this.makeChildWidgets();
|
||||||
};
|
};
|
||||||
@ -181,7 +192,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of
|
|||||||
*/
|
*/
|
||||||
ButtonWidget.prototype.refresh = function(changedTiddlers) {
|
ButtonWidget.prototype.refresh = function(changedTiddlers) {
|
||||||
var changedAttributes = this.computeAttributes();
|
var changedAttributes = this.computeAttributes();
|
||||||
if(changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes["class"] || changedAttributes.selectedClass || changedAttributes.style || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup])) {
|
if(changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes["class"] || changedAttributes.selectedClass || changedAttributes.style || changedAttributes.dragFilter || changedAttributes.dragTiddler || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup])) {
|
||||||
this.refreshSelf();
|
this.refreshSelf();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -47,96 +47,24 @@ DraggableWidget.prototype.render = function(parent,nextSibling) {
|
|||||||
classes.push(this.draggableClasses);
|
classes.push(this.draggableClasses);
|
||||||
}
|
}
|
||||||
domNode.setAttribute("class",classes.join(" "));
|
domNode.setAttribute("class",classes.join(" "));
|
||||||
domNode.setAttribute("draggable","true");
|
|
||||||
// Add event handlers
|
// Add event handlers
|
||||||
$tw.utils.addEventListeners(domNode,[
|
$tw.utils.makeDraggable({
|
||||||
{name: "dragstart", handlerObject: this, handlerMethod: "handleDragStartEvent"},
|
domNode: domNode,
|
||||||
{name: "dragend", handlerObject: this, handlerMethod: "handleDragEndEvent"}
|
dragTiddlerFn: function() {return self.getAttribute("tiddler");},
|
||||||
]);
|
dragFilterFn: function() {return self.getAttribute("filter");},
|
||||||
|
widget: this
|
||||||
|
});
|
||||||
// Insert the link into the DOM and render any children
|
// Insert the link into the DOM and render any children
|
||||||
parent.insertBefore(domNode,nextSibling);
|
parent.insertBefore(domNode,nextSibling);
|
||||||
this.renderChildren(domNode,null);
|
this.renderChildren(domNode,null);
|
||||||
this.domNodes.push(domNode);
|
this.domNodes.push(domNode);
|
||||||
};
|
};
|
||||||
|
|
||||||
DraggableWidget.prototype.handleDragStartEvent = function(event) {
|
|
||||||
var self = this;
|
|
||||||
// Collect the tiddlers
|
|
||||||
var titles = [];
|
|
||||||
if(this.draggableTiddler) {
|
|
||||||
titles.push(this.draggableTiddler);
|
|
||||||
}
|
|
||||||
if(this.draggableFilter) {
|
|
||||||
titles.push.apply(titles,this.wiki.filterTiddlers(this.draggableFilter,this));
|
|
||||||
}
|
|
||||||
var titleString = $tw.utils.stringifyList(titles);
|
|
||||||
if(titles.length > 0 && event.target === this.domNodes[0]) {
|
|
||||||
$tw.dragInProgress = this.domNodes[0];
|
|
||||||
// Set the dragging class on the element being dragged
|
|
||||||
$tw.utils.addClass(event.target,"tc-dragging");
|
|
||||||
// Create the drag image elements
|
|
||||||
this.dragImage = this.document.createElement("div");
|
|
||||||
this.dragImage.className = "tc-tiddler-dragger";
|
|
||||||
var inner = this.document.createElement("div");
|
|
||||||
inner.className = "tc-tiddler-dragger-inner";
|
|
||||||
inner.appendChild(this.document.createTextNode(
|
|
||||||
titles.length === 1 ?
|
|
||||||
titles[0] :
|
|
||||||
titles.length + " tiddlers"
|
|
||||||
));
|
|
||||||
this.dragImage.appendChild(inner);
|
|
||||||
this.document.body.appendChild(this.dragImage);
|
|
||||||
// Set the data transfer properties
|
|
||||||
var dataTransfer = event.dataTransfer;
|
|
||||||
// Set up the image
|
|
||||||
dataTransfer.effectAllowed = "copy";
|
|
||||||
if(dataTransfer.setDragImage) {
|
|
||||||
dataTransfer.setDragImage(this.dragImage.firstChild,-16,-16);
|
|
||||||
}
|
|
||||||
// Set up the data transfer
|
|
||||||
dataTransfer.clearData();
|
|
||||||
var jsonData = [];
|
|
||||||
if(titles.length > 1) {
|
|
||||||
titles.forEach(function(title) {
|
|
||||||
jsonData.push(self.wiki.getTiddlerAsJson(title));
|
|
||||||
});
|
|
||||||
jsonData = "[" + jsonData.join(",") + "]";
|
|
||||||
} else {
|
|
||||||
jsonData = this.wiki.getTiddlerAsJson(titles[0]);
|
|
||||||
}
|
|
||||||
// IE doesn't like these content types
|
|
||||||
if(!$tw.browser.isIE) {
|
|
||||||
dataTransfer.setData("text/vnd.tiddler",jsonData);
|
|
||||||
dataTransfer.setData("text/plain",titleString);
|
|
||||||
dataTransfer.setData("text/x-moz-url","data:text/vnd.tiddler," + encodeURIComponent(jsonData));
|
|
||||||
}
|
|
||||||
dataTransfer.setData("URL","data:text/vnd.tiddler," + encodeURIComponent(jsonData));
|
|
||||||
dataTransfer.setData("Text",titleString);
|
|
||||||
event.stopPropagation();
|
|
||||||
} else {
|
|
||||||
event.preventDefault();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
DraggableWidget.prototype.handleDragEndEvent = function(event) {
|
|
||||||
if(event.target === this.domNodes[0]) {
|
|
||||||
$tw.dragInProgress = null;
|
|
||||||
// Remove the dragging class on the element being dragged
|
|
||||||
$tw.utils.removeClass(event.target,"tc-dragging");
|
|
||||||
// Delete the drag image element
|
|
||||||
if(this.dragImage) {
|
|
||||||
this.dragImage.parentNode.removeChild(this.dragImage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Compute the internal state of the widget
|
Compute the internal state of the widget
|
||||||
*/
|
*/
|
||||||
DraggableWidget.prototype.execute = function() {
|
DraggableWidget.prototype.execute = function() {
|
||||||
// Pick up our attributes
|
// Pick up our attributes
|
||||||
this.draggableTiddler = this.getAttribute("tiddler");
|
|
||||||
this.draggableFilter = this.getAttribute("filter");
|
|
||||||
this.draggableTag = this.getAttribute("tag","div");
|
this.draggableTag = this.getAttribute("tag","div");
|
||||||
this.draggableClasses = this.getAttribute("class");
|
this.draggableClasses = this.getAttribute("class");
|
||||||
// Make the child widgets
|
// Make the child widgets
|
||||||
@ -148,7 +76,7 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of
|
|||||||
*/
|
*/
|
||||||
DraggableWidget.prototype.refresh = function(changedTiddlers) {
|
DraggableWidget.prototype.refresh = function(changedTiddlers) {
|
||||||
var changedAttributes = this.computeAttributes();
|
var changedAttributes = this.computeAttributes();
|
||||||
if(changedAttributes.tiddler || changedTiddlers.tag || changedTiddlers["class"]) {
|
if(changedTiddlers.tag || changedTiddlers["class"]) {
|
||||||
this.refreshSelf();
|
this.refreshSelf();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -111,11 +111,13 @@ LinkWidget.prototype.renderLink = function(parent,nextSibling) {
|
|||||||
$tw.utils.addEventListeners(domNode,[
|
$tw.utils.addEventListeners(domNode,[
|
||||||
{name: "click", handlerObject: this, handlerMethod: "handleClickEvent"},
|
{name: "click", handlerObject: this, handlerMethod: "handleClickEvent"},
|
||||||
]);
|
]);
|
||||||
|
// Make the link draggable if required
|
||||||
if(this.draggable === "yes") {
|
if(this.draggable === "yes") {
|
||||||
$tw.utils.addEventListeners(domNode,[
|
$tw.utils.makeDraggable({
|
||||||
{name: "dragstart", handlerObject: this, handlerMethod: "handleDragStartEvent"},
|
domNode: domNode,
|
||||||
{name: "dragend", handlerObject: this, handlerMethod: "handleDragEndEvent"}
|
dragTiddlerFn: function() {return self.to;},
|
||||||
]);
|
widget: this
|
||||||
|
});
|
||||||
}
|
}
|
||||||
// Insert the link into the DOM and render any children
|
// Insert the link into the DOM and render any children
|
||||||
parent.insertBefore(domNode,nextSibling);
|
parent.insertBefore(domNode,nextSibling);
|
||||||
@ -142,59 +144,6 @@ LinkWidget.prototype.handleClickEvent = function(event) {
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
LinkWidget.prototype.handleDragStartEvent = function(event) {
|
|
||||||
if(event.target === this.domNodes[0]) {
|
|
||||||
if(this.to) {
|
|
||||||
$tw.dragInProgress = this.domNodes[0];
|
|
||||||
// Set the dragging class on the element being dragged
|
|
||||||
$tw.utils.addClass(event.target,"tc-tiddlylink-dragging");
|
|
||||||
// Create the drag image elements
|
|
||||||
this.dragImage = this.document.createElement("div");
|
|
||||||
this.dragImage.className = "tc-tiddler-dragger";
|
|
||||||
var inner = this.document.createElement("div");
|
|
||||||
inner.className = "tc-tiddler-dragger-inner";
|
|
||||||
inner.appendChild(this.document.createTextNode(this.to));
|
|
||||||
this.dragImage.appendChild(inner);
|
|
||||||
this.document.body.appendChild(this.dragImage);
|
|
||||||
// Set the data transfer properties
|
|
||||||
var dataTransfer = event.dataTransfer;
|
|
||||||
// First the image
|
|
||||||
dataTransfer.effectAllowed = "copy";
|
|
||||||
if(dataTransfer.setDragImage) {
|
|
||||||
dataTransfer.setDragImage(this.dragImage.firstChild,-16,-16);
|
|
||||||
}
|
|
||||||
// Then the data
|
|
||||||
dataTransfer.clearData();
|
|
||||||
var jsonData = this.wiki.getTiddlerAsJson(this.to),
|
|
||||||
textData = this.wiki.getTiddlerText(this.to,""),
|
|
||||||
title = (new RegExp("^" + $tw.config.textPrimitives.wikiLink + "$","mg")).exec(this.to) ? this.to : "[[" + this.to + "]]";
|
|
||||||
// IE doesn't like these content types
|
|
||||||
if(!$tw.browser.isIE) {
|
|
||||||
dataTransfer.setData("text/vnd.tiddler",jsonData);
|
|
||||||
dataTransfer.setData("text/plain",title);
|
|
||||||
dataTransfer.setData("text/x-moz-url","data:text/vnd.tiddler," + encodeURIComponent(jsonData));
|
|
||||||
}
|
|
||||||
dataTransfer.setData("URL","data:text/vnd.tiddler," + encodeURIComponent(jsonData));
|
|
||||||
dataTransfer.setData("Text",title);
|
|
||||||
event.stopPropagation();
|
|
||||||
} else {
|
|
||||||
event.preventDefault();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
LinkWidget.prototype.handleDragEndEvent = function(event) {
|
|
||||||
if(event.target === this.domNodes[0]) {
|
|
||||||
$tw.dragInProgress = null;
|
|
||||||
// Remove the dragging class on the element being dragged
|
|
||||||
$tw.utils.removeClass(event.target,"tc-tiddlylink-dragging");
|
|
||||||
// Delete the drag image element
|
|
||||||
if(this.dragImage) {
|
|
||||||
this.dragImage.parentNode.removeChild(this.dragImage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Compute the internal state of the widget
|
Compute the internal state of the widget
|
||||||
*/
|
*/
|
||||||
|
@ -2,9 +2,7 @@ title: $:/core/ui/TagTemplate
|
|||||||
|
|
||||||
<span class="tc-tag-list-item">
|
<span class="tc-tag-list-item">
|
||||||
<$set name="transclusion" value=<<currentTiddler>>>
|
<$set name="transclusion" value=<<currentTiddler>>>
|
||||||
<$draggable tag="span" filter="[all[current]tagging[]]">
|
<$macrocall $name="tag-pill-body" tag=<<currentTiddler>> icon={{!!icon}} colour={{!!color}} palette={{$:/palette}} element-tag="""$button""" element-attributes="""popup=<<qualify "$:/state/popup/tag">> dragFilter='[all[current]tagging[]]' tag='span'"""/>
|
||||||
<$macrocall $name="tag-pill-body" tag=<<currentTiddler>> icon={{!!icon}} colour={{!!color}} palette={{$:/palette}} element-tag="""$button""" element-attributes="""popup=<<qualify "$:/state/popup/tag">>"""/>
|
|
||||||
</$draggable>
|
|
||||||
<$reveal state=<<qualify "$:/state/popup/tag">> type="popup" position="below" animate="yes" class="tc-drop-down">
|
<$reveal state=<<qualify "$:/state/popup/tag">> type="popup" position="below" animate="yes" class="tc-drop-down">
|
||||||
<$transclude tiddler="$:/core/ui/ListItemTemplate"/>
|
<$transclude tiddler="$:/core/ui/ListItemTemplate"/>
|
||||||
<$list filter="[all[shadows+tiddlers]tag[$:/tags/TagDropdown]!has[draft.of]]" variable="listItem">
|
<$list filter="[all[shadows+tiddlers]tag[$:/tags/TagDropdown]!has[draft.of]]" variable="listItem">
|
||||||
|
Loading…
Reference in New Issue
Block a user