123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- // wrapped by build app
- define("dojox/mobile/app/ListSelector", ["dijit","dojo","dojox","dojo/require!dojox/mobile/app/_Widget,dojo/fx"], function(dijit,dojo,dojox){
- dojo.provide("dojox.mobile.app.ListSelector");
- dojo.experimental("dojox.mobile.app.ListSelector");
- dojo.require("dojox.mobile.app._Widget");
- dojo.require("dojo.fx");
- dojo.declare("dojox.mobile.app.ListSelector", dojox.mobile.app._Widget, {
- // data: Array
- // The array of items to display. Each element in the array
- // should have both a label and value attribute, e.g.
- // [{label: "Open", value: 1} , {label: "Delete", value: 2}]
- data: null,
- // controller: Object
- // The current SceneController widget.
- controller: null,
- // onChoose: Function
- // The callback function for when an item is selected
- onChoose: null,
- destroyOnHide: false,
- _setDataAttr: function(data){
- this.data = data;
-
- if(this.data){
- this.render();
- }
- },
- postCreate: function(){
- dojo.addClass(this.domNode, "listSelector");
-
- var _this = this;
-
- this.connect(this.domNode, "onclick", function(event){
- if(!dojo.hasClass(event.target, "listSelectorRow")){
- return;
- }
-
- if(_this.onChoose){
- _this.onChoose(_this.data[event.target._idx].value);
- }
- _this.hide();
- });
- this.connect(this.domNode, "onmousedown", function(event){
- if(!dojo.hasClass(event.target, "listSelectorRow")){
- return;
- }
- dojo.addClass(event.target, "listSelectorRow-selected");
- });
- this.connect(this.domNode, "onmouseup", function(event){
- if(!dojo.hasClass(event.target, "listSelectorRow")){
- return;
- }
- dojo.removeClass(event.target, "listSelectorRow-selected");
- });
- this.connect(this.domNode, "onmouseout", function(event){
- if(!dojo.hasClass(event.target, "listSelectorRow")){
- return;
- }
- dojo.removeClass(event.target, "listSelectorRow-selected");
- });
-
- var viewportSize = this.controller.getWindowSize();
-
- this.mask = dojo.create("div", {"class": "dialogUnderlayWrapper",
- innerHTML: "<div class=\"dialogUnderlay\"></div>"
- }, this.controller.assistant.domNode);
-
- this.connect(this.mask, "onclick", function(){
- _this.onChoose && _this.onChoose();
- _this.hide();
- });
- },
- show: function(fromNode){
- // Using dojo.fx here. Must figure out how to do this with CSS animations!!
- var startPos;
-
- var windowSize = this.controller.getWindowSize();
- var fromNodePos;
- if(fromNode){
- fromNodePos = dojo._abs(fromNode);
- startPos = fromNodePos;
- }else{
- startPos.x = windowSize.w / 2;
- startPos.y = 200;
- }
- console.log("startPos = ", startPos);
-
- dojo.style(this.domNode, {
- opacity: 0,
- display: "",
- width: Math.floor(windowSize.w * 0.8) + "px"
- });
-
- var maxWidth = 0;
- dojo.query(">", this.domNode).forEach(function(node){
- dojo.style(node, {
- "float": "left"
- });
- maxWidth = Math.max(maxWidth, dojo.marginBox(node).w);
- dojo.style(node, {
- "float": "none"
- });
- });
- maxWidth = Math.min(maxWidth, Math.round(windowSize.w * 0.8))
- + dojo.style(this.domNode, "paddingLeft")
- + dojo.style(this.domNode, "paddingRight")
- + 1;
-
- dojo.style(this.domNode, "width", maxWidth + "px");
- var targetHeight = dojo.marginBox(this.domNode).h;
-
- var _this = this;
-
-
- var targetY = fromNodePos ?
- Math.max(30, fromNodePos.y - targetHeight - 10) :
- this.getScroll().y + 30;
-
- console.log("fromNodePos = ", fromNodePos, " targetHeight = ", targetHeight,
- " targetY = " + targetY, " startPos ", startPos);
-
-
- var anim1 = dojo.animateProperty({
- node: this.domNode,
- duration: 400,
- properties: {
- width: {start: 1, end: maxWidth},
- height: {start: 1, end: targetHeight},
- top: {start: startPos.y, end: targetY},
- left: {start: startPos.x, end: (windowSize.w/2 - maxWidth/2)},
- opacity: {start: 0, end: 1},
- fontSize: {start: 1}
- },
- onEnd: function(){
- dojo.style(_this.domNode, "width", "inherit");
- }
- });
- var anim2 = dojo.fadeIn({
- node: this.mask,
- duration: 400
- });
- dojo.fx.combine([anim1, anim2]).play();
- },
- hide: function(){
- // Using dojo.fx here. Must figure out how to do this with CSS animations!!
-
- var _this = this;
-
- var anim1 = dojo.animateProperty({
- node: this.domNode,
- duration: 500,
- properties: {
- width: {end: 1},
- height: {end: 1},
- opacity: {end: 0},
- fontSize: {end: 1}
- },
- onEnd: function(){
- if(_this.get("destroyOnHide")){
- _this.destroy();
- }
- }
- });
-
- var anim2 = dojo.fadeOut({
- node: this.mask,
- duration: 400
- });
- dojo.fx.combine([anim1, anim2]).play();
- },
- render: function(){
- // summary:
- // Renders
-
- dojo.empty(this.domNode);
- dojo.style(this.domNode, "opacity", 0);
-
- var row;
-
- for(var i = 0; i < this.data.length; i++){
- // Create each row and add any custom classes. Also set the _idx property.
- row = dojo.create("div", {
- "class": "listSelectorRow " + (this.data[i].className || ""),
- innerHTML: this.data[i].label
- }, this.domNode);
-
- row._idx = i;
-
- if(i == 0){
- dojo.addClass(row, "first");
- }
- if(i == this.data.length - 1){
- dojo.addClass(row, "last");
- }
-
- }
- },
- destroy: function(){
- this.inherited(arguments);
- dojo.destroy(this.mask);
- }
- });
- });
|