ListSelector.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. // wrapped by build app
  2. define("dojox/mobile/app/ListSelector", ["dijit","dojo","dojox","dojo/require!dojox/mobile/app/_Widget,dojo/fx"], function(dijit,dojo,dojox){
  3. dojo.provide("dojox.mobile.app.ListSelector");
  4. dojo.experimental("dojox.mobile.app.ListSelector");
  5. dojo.require("dojox.mobile.app._Widget");
  6. dojo.require("dojo.fx");
  7. dojo.declare("dojox.mobile.app.ListSelector", dojox.mobile.app._Widget, {
  8. // data: Array
  9. // The array of items to display. Each element in the array
  10. // should have both a label and value attribute, e.g.
  11. // [{label: "Open", value: 1} , {label: "Delete", value: 2}]
  12. data: null,
  13. // controller: Object
  14. // The current SceneController widget.
  15. controller: null,
  16. // onChoose: Function
  17. // The callback function for when an item is selected
  18. onChoose: null,
  19. destroyOnHide: false,
  20. _setDataAttr: function(data){
  21. this.data = data;
  22. if(this.data){
  23. this.render();
  24. }
  25. },
  26. postCreate: function(){
  27. dojo.addClass(this.domNode, "listSelector");
  28. var _this = this;
  29. this.connect(this.domNode, "onclick", function(event){
  30. if(!dojo.hasClass(event.target, "listSelectorRow")){
  31. return;
  32. }
  33. if(_this.onChoose){
  34. _this.onChoose(_this.data[event.target._idx].value);
  35. }
  36. _this.hide();
  37. });
  38. this.connect(this.domNode, "onmousedown", function(event){
  39. if(!dojo.hasClass(event.target, "listSelectorRow")){
  40. return;
  41. }
  42. dojo.addClass(event.target, "listSelectorRow-selected");
  43. });
  44. this.connect(this.domNode, "onmouseup", function(event){
  45. if(!dojo.hasClass(event.target, "listSelectorRow")){
  46. return;
  47. }
  48. dojo.removeClass(event.target, "listSelectorRow-selected");
  49. });
  50. this.connect(this.domNode, "onmouseout", function(event){
  51. if(!dojo.hasClass(event.target, "listSelectorRow")){
  52. return;
  53. }
  54. dojo.removeClass(event.target, "listSelectorRow-selected");
  55. });
  56. var viewportSize = this.controller.getWindowSize();
  57. this.mask = dojo.create("div", {"class": "dialogUnderlayWrapper",
  58. innerHTML: "<div class=\"dialogUnderlay\"></div>"
  59. }, this.controller.assistant.domNode);
  60. this.connect(this.mask, "onclick", function(){
  61. _this.onChoose && _this.onChoose();
  62. _this.hide();
  63. });
  64. },
  65. show: function(fromNode){
  66. // Using dojo.fx here. Must figure out how to do this with CSS animations!!
  67. var startPos;
  68. var windowSize = this.controller.getWindowSize();
  69. var fromNodePos;
  70. if(fromNode){
  71. fromNodePos = dojo._abs(fromNode);
  72. startPos = fromNodePos;
  73. }else{
  74. startPos.x = windowSize.w / 2;
  75. startPos.y = 200;
  76. }
  77. console.log("startPos = ", startPos);
  78. dojo.style(this.domNode, {
  79. opacity: 0,
  80. display: "",
  81. width: Math.floor(windowSize.w * 0.8) + "px"
  82. });
  83. var maxWidth = 0;
  84. dojo.query(">", this.domNode).forEach(function(node){
  85. dojo.style(node, {
  86. "float": "left"
  87. });
  88. maxWidth = Math.max(maxWidth, dojo.marginBox(node).w);
  89. dojo.style(node, {
  90. "float": "none"
  91. });
  92. });
  93. maxWidth = Math.min(maxWidth, Math.round(windowSize.w * 0.8))
  94. + dojo.style(this.domNode, "paddingLeft")
  95. + dojo.style(this.domNode, "paddingRight")
  96. + 1;
  97. dojo.style(this.domNode, "width", maxWidth + "px");
  98. var targetHeight = dojo.marginBox(this.domNode).h;
  99. var _this = this;
  100. var targetY = fromNodePos ?
  101. Math.max(30, fromNodePos.y - targetHeight - 10) :
  102. this.getScroll().y + 30;
  103. console.log("fromNodePos = ", fromNodePos, " targetHeight = ", targetHeight,
  104. " targetY = " + targetY, " startPos ", startPos);
  105. var anim1 = dojo.animateProperty({
  106. node: this.domNode,
  107. duration: 400,
  108. properties: {
  109. width: {start: 1, end: maxWidth},
  110. height: {start: 1, end: targetHeight},
  111. top: {start: startPos.y, end: targetY},
  112. left: {start: startPos.x, end: (windowSize.w/2 - maxWidth/2)},
  113. opacity: {start: 0, end: 1},
  114. fontSize: {start: 1}
  115. },
  116. onEnd: function(){
  117. dojo.style(_this.domNode, "width", "inherit");
  118. }
  119. });
  120. var anim2 = dojo.fadeIn({
  121. node: this.mask,
  122. duration: 400
  123. });
  124. dojo.fx.combine([anim1, anim2]).play();
  125. },
  126. hide: function(){
  127. // Using dojo.fx here. Must figure out how to do this with CSS animations!!
  128. var _this = this;
  129. var anim1 = dojo.animateProperty({
  130. node: this.domNode,
  131. duration: 500,
  132. properties: {
  133. width: {end: 1},
  134. height: {end: 1},
  135. opacity: {end: 0},
  136. fontSize: {end: 1}
  137. },
  138. onEnd: function(){
  139. if(_this.get("destroyOnHide")){
  140. _this.destroy();
  141. }
  142. }
  143. });
  144. var anim2 = dojo.fadeOut({
  145. node: this.mask,
  146. duration: 400
  147. });
  148. dojo.fx.combine([anim1, anim2]).play();
  149. },
  150. render: function(){
  151. // summary:
  152. // Renders
  153. dojo.empty(this.domNode);
  154. dojo.style(this.domNode, "opacity", 0);
  155. var row;
  156. for(var i = 0; i < this.data.length; i++){
  157. // Create each row and add any custom classes. Also set the _idx property.
  158. row = dojo.create("div", {
  159. "class": "listSelectorRow " + (this.data[i].className || ""),
  160. innerHTML: this.data[i].label
  161. }, this.domNode);
  162. row._idx = i;
  163. if(i == 0){
  164. dojo.addClass(row, "first");
  165. }
  166. if(i == this.data.length - 1){
  167. dojo.addClass(row, "last");
  168. }
  169. }
  170. },
  171. destroy: function(){
  172. this.inherited(arguments);
  173. dojo.destroy(this.mask);
  174. }
  175. });
  176. });