/**
|
|
A list that provides a pull-to-refresh feature, which allows new data to be
|
|
retrieved and updated in the list.
|
|
|
|
PulldownList provides the onPullRelease event to allow an application to start
|
|
retrieving new data. The onPullComplete event indicates that the pull is
|
|
complete and it's time to update the list with the new data.
|
|
|
|
{name: "list", kind: "PulldownList", onSetupItem: "setupItem",
|
|
onPullRelease: "pullRelease", onPullComplete: "pullComplete",
|
|
components: [
|
|
{name: "item"}
|
|
]}
|
|
|
|
pullRelease: function() {
|
|
this.search();
|
|
},
|
|
processSearchResults: function(inRequest, inResponse) {
|
|
this.results = inResponse.results;
|
|
this.$.list.setCount(this.results.length);
|
|
this.$.list.completePull();
|
|
},
|
|
pullComplete: function() {
|
|
this.$.list.reset();
|
|
}
|
|
*/
|
|
enyo.kind({
|
|
name: "enyo.PulldownList",
|
|
kind: "List",
|
|
touch: true,
|
|
pully: null,
|
|
pulldownTools: [
|
|
{name: "pulldown", classes: "enyo-list-pulldown", components: [
|
|
{name: "puller", kind: "Puller"}
|
|
]}
|
|
],
|
|
events: {
|
|
onPullStart: "",
|
|
onPullCancel: "",
|
|
onPull: "",
|
|
onPullRelease: "",
|
|
onPullComplete: ""
|
|
},
|
|
handlers: {
|
|
onScrollStart: "scrollStartHandler",
|
|
onScroll: "scrollHandler",
|
|
onScrollStop: "scrollStopHandler",
|
|
ondragfinish: "dragfinish"
|
|
},
|
|
//
|
|
pullingMessage: "Pull down to refresh...",
|
|
pulledMessage: "Release to refresh...",
|
|
loadingMessage: "Loading...",
|
|
//
|
|
pullingIconClass: "enyo-puller-arrow enyo-puller-arrow-down",
|
|
pulledIconClass: "enyo-puller-arrow enyo-puller-arrow-up",
|
|
loadingIconClass: "",
|
|
//* @protected
|
|
create: function() {
|
|
var p = {kind: "Puller", showing: false, text: this.loadingMessage, iconClass: this.loadingIconClass, onCreate: "setPully"};
|
|
this.listTools.splice(0, 0, p);
|
|
this.inherited(arguments);
|
|
this.setPulling();
|
|
},
|
|
initComponents: function() {
|
|
this.createChrome(this.pulldownTools);
|
|
this.accel = enyo.dom.canAccelerate();
|
|
this.translation = this.accel ? "translate3d" : "translate";
|
|
this.inherited(arguments);
|
|
},
|
|
setPully: function(inSender, inEvent) {
|
|
this.pully = inEvent.originator;
|
|
},
|
|
scrollStartHandler: function() {
|
|
this.firedPullStart = false;
|
|
this.firedPull = false;
|
|
this.firedPullCancel = false;
|
|
},
|
|
scrollHandler: function(inSender) {
|
|
if (this.completingPull) {
|
|
this.pully.setShowing(false);
|
|
}
|
|
var s = this.getStrategy().$.scrollMath;
|
|
var over = s.y;
|
|
if (s.isInOverScroll() && over > 0) {
|
|
enyo.dom.transformValue(this.$.pulldown, this.translation, "0," + over + "px" + (this.accel ? ",0" : ""));
|
|
if (!this.firedPullStart) {
|
|
this.firedPullStart = true;
|
|
this.pullStart();
|
|
this.pullHeight = this.$.pulldown.getBounds().height;
|
|
}
|
|
if (over > this.pullHeight && !this.firedPull) {
|
|
this.firedPull = true;
|
|
this.firedPullCancel = false;
|
|
this.pull();
|
|
}
|
|
if (this.firedPull && !this.firedPullCancel && over < this.pullHeight) {
|
|
this.firedPullCancel = true;
|
|
this.firedPull = false;
|
|
this.pullCancel();
|
|
}
|
|
}
|
|
},
|
|
scrollStopHandler: function() {
|
|
if (this.completingPull) {
|
|
this.completingPull = false;
|
|
this.doPullComplete();
|
|
}
|
|
},
|
|
dragfinish: function() {
|
|
if (this.firedPull) {
|
|
var s = this.getStrategy().$.scrollMath;
|
|
s.setScrollY(s.y - this.pullHeight);
|
|
this.pullRelease();
|
|
}
|
|
},
|
|
//* @public
|
|
//* To signal that the list should execute pull completion. This usually be called after the application has received the new data.
|
|
completePull: function() {
|
|
this.completingPull = true;
|
|
this.$.strategy.$.scrollMath.setScrollY(this.pullHeight);
|
|
this.$.strategy.$.scrollMath.start();
|
|
},
|
|
//* @protected
|
|
pullStart: function() {
|
|
this.setPulling();
|
|
this.pully.setShowing(false);
|
|
this.$.puller.setShowing(true);
|
|
this.doPullStart();
|
|
},
|
|
pull: function() {
|
|
this.setPulled();
|
|
this.doPull();
|
|
},
|
|
pullCancel: function() {
|
|
this.setPulling();
|
|
this.doPullCancel();
|
|
},
|
|
pullRelease: function() {
|
|
this.$.puller.setShowing(false);
|
|
this.pully.setShowing(true);
|
|
this.doPullRelease();
|
|
},
|
|
setPulling: function() {
|
|
this.$.puller.setText(this.pullingMessage);
|
|
this.$.puller.setIconClass(this.pullingIconClass);
|
|
},
|
|
setPulled: function() {
|
|
this.$.puller.setText(this.pulledMessage);
|
|
this.$.puller.setIconClass(this.pulledIconClass);
|
|
}
|
|
});
|
|
|
|
enyo.kind({
|
|
name: "enyo.Puller",
|
|
classes: "enyo-puller",
|
|
published: {
|
|
text: "",
|
|
iconClass: ""
|
|
},
|
|
events: {
|
|
onCreate: ""
|
|
},
|
|
components: [
|
|
{name: "icon"},
|
|
{name: "text", tag: "span", classes: "enyo-puller-text"}
|
|
],
|
|
create: function() {
|
|
this.inherited(arguments);
|
|
this.doCreate();
|
|
this.textChanged();
|
|
this.iconClassChanged();
|
|
},
|
|
textChanged: function() {
|
|
this.$.text.setContent(this.text);
|
|
},
|
|
iconClassChanged: function() {
|
|
this.$.icon.setClasses(this.iconClass);
|
|
}
|
|
});
|