1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2025-07-04 19:12:51 +00:00

Updated renderer to handle refreshing

Now we can refresh renderers that aren't in a DOM tree
This commit is contained in:
Jeremy Ruston 2012-02-17 12:34:56 +00:00
parent 56eb3dc1dc
commit 221cc80c65

View File

@ -62,7 +62,7 @@ MacroNode.prototype.render = function(type) {
MacroNode.prototype.renderInDom = function(domNode,insertBefore) { MacroNode.prototype.renderInDom = function(domNode,insertBefore) {
// Create the wrapper node for the macro // Create the wrapper node for the macro
var macroContainer = document.createElement(this.macro.wrapperTag || "div"); var macroContainer = document.createElement(this.macro.wrapperTag || "span");
this.domNode = macroContainer; this.domNode = macroContainer;
if(insertBefore) { if(insertBefore) {
domNode.insertBefore(macroContainer,insertBefore); domNode.insertBefore(macroContainer,insertBefore);
@ -85,6 +85,37 @@ MacroNode.prototype.renderInDom = function(domNode,insertBefore) {
} }
}; };
MacroNode.prototype.refresh = function(changes) {
var t,
self = this,
hasDependencyChanged = function() {
if(self.dependencies.dependentAll) {
return true;
}
for(var rel in self.dependencies) {
if(rel !== "dependentAll") {
for(var t in self.dependencies[rel]) {
if(changes.hasOwnProperty(t)) {
return true;
}
}
}
}
return false;
};
// Check if any of the dependencies of this macro node have changed
if(hasDependencyChanged()) {
// Re-execute the macro if so
var tiddler = this.store.getTiddler(this.tiddlerTitle);
this.execute(tiddler);
} else {
// Refresh any children
for(t=0; t<this.content.length; t++) {
this.content[t].refresh(changes);
}
}
};
MacroNode.prototype.refreshInDom = function(changes) { MacroNode.prototype.refreshInDom = function(changes) {
var t, var t,
self = this, self = this,
@ -108,7 +139,7 @@ MacroNode.prototype.refreshInDom = function(changes) {
// Ask the macro to rerender itself if it can // Ask the macro to rerender itself if it can
var tiddler = this.store.getTiddler(this.tiddlerTitle); var tiddler = this.store.getTiddler(this.tiddlerTitle);
if(this.macro.refresh) { if(this.macro.refresh) {
this.macro.refresh(this,tiddler,this.store); this.macro.refresh(changes,this,tiddler,this.store);
} else { } else {
// Manually reexecute and rerender this macro // Manually reexecute and rerender this macro
while(this.domNode.hasChildNodes()) { while(this.domNode.hasChildNodes()) {
@ -217,6 +248,14 @@ ElementNode.prototype.renderInDom = function(domNode) {
} }
}; };
ElementNode.prototype.refresh = function(changes) {
if(this.children) {
for(var t=0; t<this.children.length; t++) {
this.children[t].refresh(changes);
}
}
};
ElementNode.prototype.refreshInDom = function(changes) { ElementNode.prototype.refreshInDom = function(changes) {
if(this.children) { if(this.children) {
for(var t=0; t<this.children.length; t++) { for(var t=0; t<this.children.length; t++) {
@ -250,6 +289,10 @@ TextNode.prototype.renderInDom = function(domNode) {
domNode.appendChild(document.createTextNode(this.text)); domNode.appendChild(document.createTextNode(this.text));
}; };
TextNode.prototype.refresh = function(changes) {
// Text nodes don't need refreshing
};
TextNode.prototype.refreshInDom = function(changes) { TextNode.prototype.refreshInDom = function(changes) {
// Text nodes don't need refreshing // Text nodes don't need refreshing
}; };
@ -279,6 +322,10 @@ EntityNode.prototype.renderInDom = function(domNode) {
domNode.appendChild(document.createTextNode(utils.entityDecode(this.entity))); domNode.appendChild(document.createTextNode(utils.entityDecode(this.entity)));
}; };
EntityNode.prototype.refresh = function(changes) {
// Entity nodes don't need refreshing
};
EntityNode.prototype.refreshInDom = function(changes) { EntityNode.prototype.refreshInDom = function(changes) {
// Entity nodes don't need refreshing // Entity nodes don't need refreshing
}; };
@ -310,6 +357,10 @@ RawNode.prototype.renderInDom = function(domNode) {
domNode.appendChild(div); domNode.appendChild(div);
}; };
RawNode.prototype.refresh = function(changes) {
// Raw nodes don't need refreshing
};
RawNode.prototype.refreshInDom = function(changes) { RawNode.prototype.refreshInDom = function(changes) {
// Raw nodes don't need refreshing // Raw nodes don't need refreshing
}; };
@ -348,7 +399,7 @@ var SplitLabelNode = function(type,left,right,classes) {
/* /*
Static method to construct a slider Static method to construct a slider
*/ */
var SliderNode = function(type,label,tooltip,children) { var SliderNode = function(type,label,tooltip,isOpen,children) {
var attributes = { var attributes = {
"class": "tw-slider", "class": "tw-slider",
"data-tw-slider-type": type "data-tw-slider-type": type
@ -370,7 +421,7 @@ var SliderNode = function(type,label,tooltip,children) {
ElementNode("div", ElementNode("div",
{ {
"class": ["tw-slider-body"], "class": ["tw-slider-body"],
"style": {"display": "none"} "style": {"display": isOpen ? "block" : "none"}
}, },
children children
) )
@ -417,6 +468,12 @@ Renderer.prototype.renderInDom = function(domNode,type) {
} }
}; };
Renderer.prototype.refresh = function(changes) {
for(var t=0; t<this.steps.length; t++) {
this.steps[t].refresh(changes);
}
};
Renderer.prototype.refreshInDom = function(changes) { Renderer.prototype.refreshInDom = function(changes) {
for(var t=0; t<this.steps.length; t++) { for(var t=0; t<this.steps.length; t++) {
this.steps[t].refreshInDom(changes); this.steps[t].refreshInDom(changes);