1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2025-08-08 14:55:17 +00:00

Add stateTitle stateField stateIndex attributes (#3529)

* make triggerPopup optionally set state directly

* update button widget for new state attributes

* update reveal widget for new state attributes

* fix errors in button widget
This commit is contained in:
BurningTreeC 2018-11-18 20:16:46 +01:00 committed by Jeremy Ruston
parent 2b6514ddc2
commit 849844be12
3 changed files with 53 additions and 21 deletions

View File

@ -134,9 +134,13 @@ Popup.prototype.show = function(options) {
height: options.domNode.offsetHeight height: options.domNode.offsetHeight
}; };
} }
options.wiki.setTextReference(options.title, var popupRect = "(" + rect.left + "," + rect.top + "," +
"(" + rect.left + "," + rect.top + "," + rect.width + "," + rect.height + ")";
rect.width + "," + rect.height + ")"); if(options.noStateReference) {
options.wiki.setText(options.title,"text",undefined,popupRect);
} else {
options.wiki.setTextReference(options.title,popupRect);
}
// Add the click handler if we have any popups // Add the click handler if we have any popups
if(this.popups.length > 0) { if(this.popups.length > 0) {
this.rootElement.addEventListener("click",this,true); this.rootElement.addEventListener("click",this,true);

View File

@ -41,9 +41,9 @@ ButtonWidget.prototype.render = function(parent,nextSibling) {
var domNode = this.document.createElement(tag); var domNode = this.document.createElement(tag);
// Assign classes // Assign classes
var classes = this["class"].split(" ") || [], var classes = this["class"].split(" ") || [],
isPoppedUp = this.popup && this.isPoppedUp(); isPoppedUp = (this.popup || this.popupTitle) && this.isPoppedUp();
if(this.selectedClass) { if(this.selectedClass) {
if(this.set && this.setTo && this.isSelected()) { if((this.set || this.setTitle) && this.setTo && this.isSelected()) {
$tw.utils.pushTop(classes,this.selectedClass.split(" ")); $tw.utils.pushTop(classes,this.selectedClass.split(" "));
} }
if(isPoppedUp) { if(isPoppedUp) {
@ -78,11 +78,11 @@ ButtonWidget.prototype.render = function(parent,nextSibling) {
self.dispatchMessage(event); self.dispatchMessage(event);
handled = true; handled = true;
} }
if(self.popup) { if(self.popup || self.popupTitle) {
self.triggerPopup(event); self.triggerPopup(event);
handled = true; handled = true;
} }
if(self.set) { if(self.set || self.setTitle) {
self.setTiddler(); self.setTiddler();
handled = true; handled = true;
} }
@ -122,11 +122,14 @@ ButtonWidget.prototype.getBoundingClientRect = function() {
}; };
ButtonWidget.prototype.isSelected = function() { ButtonWidget.prototype.isSelected = function() {
return this.wiki.getTextReference(this.set,this.defaultSetValue,this.getVariable("currentTiddler")) === this.setTo; return this.setTitle ? (this.setField ? this.wiki.getTiddler(this.setTitle).getFieldString(this.setField) === this.setTo :
(this.setIndex ? this.wiki.extractTiddlerDataItem(this.setTitle,this.setIndex) === this.setTo :
this.wiki.getTiddlerText(this.setTitle))) || this.defaultSetValue || this.getVariable("currentTiddler") :
this.wiki.getTextReference(this.set,this.defaultSetValue,this.getVariable("currentTiddler")) === this.setTo;
}; };
ButtonWidget.prototype.isPoppedUp = function() { ButtonWidget.prototype.isPoppedUp = function() {
var tiddler = this.wiki.getTiddler(this.popup); var tiddler = this.popupTitle ? this.wiki.getTiddler(this.popupTitle) : this.wiki.getTiddler(this.popup);
var result = tiddler && tiddler.fields.text ? $tw.popup.readPopupState(tiddler.fields.text) : false; var result = tiddler && tiddler.fields.text ? $tw.popup.readPopupState(tiddler.fields.text) : false;
return result; return result;
}; };
@ -150,15 +153,30 @@ ButtonWidget.prototype.dispatchMessage = function(event) {
}; };
ButtonWidget.prototype.triggerPopup = function(event) { ButtonWidget.prototype.triggerPopup = function(event) {
if(this.popupTitle) {
$tw.popup.triggerPopup({
domNode: this.domNodes[0],
title: this.popupTitle,
wiki: this.wiki,
noStateReference: true
});
} else {
$tw.popup.triggerPopup({ $tw.popup.triggerPopup({
domNode: this.domNodes[0], domNode: this.domNodes[0],
title: this.popup, title: this.popup,
wiki: this.wiki wiki: this.wiki
}); });
}
}; };
ButtonWidget.prototype.setTiddler = function() { ButtonWidget.prototype.setTiddler = function() {
if(this.setTitle) {
this.setField ? this.wiki.setText(this.setTitle,this.setField,undefined,this.setTo) :
(this.setIndex ? this.wiki.setText(this.setTitle,undefined,this.setIndex,this.setTo) :
this.wiki.setText(this.setTitle,"text",undefined,this.setTo));
} else {
this.wiki.setTextReference(this.set,this.setTo,this.getVariable("currentTiddler")); this.wiki.setTextReference(this.set,this.setTo,this.getVariable("currentTiddler"));
}
}; };
/* /*
@ -183,6 +201,10 @@ ButtonWidget.prototype.execute = function() {
this.buttonTag = this.getAttribute("tag"); this.buttonTag = this.getAttribute("tag");
this.dragTiddler = this.getAttribute("dragTiddler"); this.dragTiddler = this.getAttribute("dragTiddler");
this.dragFilter = this.getAttribute("dragFilter"); this.dragFilter = this.getAttribute("dragFilter");
this.setTitle = this.getAttribute("setTitle");
this.setField = this.getAttribute("setField");
this.setIndex = this.getAttribute("setIndex");
this.popupTitle = this.getAttribute("popupTitle");
// Make child widgets // Make child widgets
this.makeChildWidgets(); this.makeChildWidgets();
}; };
@ -192,7 +214,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 || changedAttributes.dragFilter || changedAttributes.dragTiddler || (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.popupTitle && changedAttributes[this.popupTitle]) || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle) {
this.refreshSelf(); this.refreshSelf();
return true; return true;
} }

View File

@ -102,7 +102,10 @@ RevealWidget.prototype.execute = function() {
this.openAnimation = this.animate === "no" ? undefined : "open"; this.openAnimation = this.animate === "no" ? undefined : "open";
this.closeAnimation = this.animate === "no" ? undefined : "close"; this.closeAnimation = this.animate === "no" ? undefined : "close";
// Compute the title of the state tiddler and read it // Compute the title of the state tiddler and read it
this.stateTitle = this.state; this.stateTiddlerTitle = this.state;
this.stateTitle = this.getAttribute("stateTitle");
this.stateField = this.getAttribute("stateField");
this.stateIndex = this.getAttribute("stateIndex");
this.readState(); this.readState();
// Construct the child widgets // Construct the child widgets
var childNodes = this.isOpen ? this.parseTreeNode.children : []; var childNodes = this.isOpen ? this.parseTreeNode.children : [];
@ -115,7 +118,10 @@ Read the state tiddler
*/ */
RevealWidget.prototype.readState = function() { RevealWidget.prototype.readState = function() {
// Read the information from the state tiddler // Read the information from the state tiddler
var state = this.stateTitle ? this.wiki.getTextReference(this.stateTitle,this["default"],this.getVariable("currentTiddler")) : this["default"]; var state = this.stateTitle ? (this.stateField ? this.wiki.getTiddler(this.stateTitle).getFieldString(this.stateField) :
(this.stateIndex ? this.wiki.extractTiddlerDataItem(this.stateTitle,this.stateIndex) :
this.wiki.getTiddlerText(this.stateTitle))) || this["default"] || this.getVariable("currentTiddler") :
(this.stateTiddlerTitle ? this.wiki.getTextReference(this.state,this["default"],this.getVariable("currentTiddler")) : this["default"]);
switch(this.type) { switch(this.type) {
case "popup": case "popup":
this.readPopupState(state); this.readPopupState(state);
@ -170,13 +176,13 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of
*/ */
RevealWidget.prototype.refresh = function(changedTiddlers) { RevealWidget.prototype.refresh = function(changedTiddlers) {
var changedAttributes = this.computeAttributes(); var changedAttributes = this.computeAttributes();
if(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes["default"] || changedAttributes.animate) { if(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes["default"] || changedAttributes.animate || changedAttributes.stateTitle || changedAttributes.stateField || changedAttributes.stateIndex) {
this.refreshSelf(); this.refreshSelf();
return true; return true;
} else { } else {
var currentlyOpen = this.isOpen; var currentlyOpen = this.isOpen;
this.readState(); this.readState();
if(this.isOpen !== currentlyOpen || (this.stateTitle && changedTiddlers[this.stateTitle])) { if(this.isOpen !== currentlyOpen || (this.stateTiddlerTitle && changedTiddlers[this.stateTiddlerTitle])) {
if(this.retain === "yes") { if(this.retain === "yes") {
this.updateState(); this.updateState();
} else { } else {