APIs

Show:
  1. /**
  2. SceneSelectionView Backbone > View
  3. @class SceneSelectionView
  4. @constructor
  5. @return {Object} instantiated SceneSelectionView
  6. **/
  7. define(['jquery', 'backbone', 'imagesloaded'], function ($, Backbone, imagesloaded) {
  8.  
  9. BB.SERVICES.SCENES_SELECTION_VIEW = 'SceneSelectionView';
  10.  
  11. var SceneSelectionView = Backbone.View.extend({
  12.  
  13. /**
  14. Constructor
  15. @method initialize
  16. **/
  17. initialize: function () {
  18. var self = this;
  19. self.m_selectedSceneID = -1;
  20. self.m_sceneProperties = new BB.View({
  21. el: Elements.SCENE_SELECTION_PROPERTIES
  22. });
  23.  
  24. self.m_propertiesPanel = BB.comBroker.getService(BB.SERVICES.PROPERTIES_VIEW);
  25. self.m_propertiesPanel.addView(this.m_sceneProperties);
  26. BB.comBroker.setService(BB.SERVICES['SCENES_SELECTION_VIEW'], this);
  27.  
  28. self._render();
  29. self._listenAddRemoveScene();
  30. self._listenSceneRemoved();
  31. self._listenDuplicateScene();
  32. self._listenSceneRename();
  33. self._listenSceneSelectorWrap();
  34. },
  35.  
  36. /**
  37. Shoot down wrap div clicks to keep wizard inline
  38. @method _listenSceneSelectorWrap
  39. **/
  40. _listenSceneSelectorWrap: function () {
  41. var self = this;
  42. $(Elements.SCENE_SELECTOR_LIST).on('click', function (e) {
  43. if ((e.target.tagName).toLocaleLowerCase() == 'div') {
  44. e.preventDefault();
  45. e.stopImmediatePropagation();
  46. return false
  47. }
  48. })
  49. },
  50.  
  51. /**
  52. Populate the LI with all available scenes from msdb
  53. @method _render
  54. **/
  55. _render: function () {
  56. var self = this;
  57. $(Elements.SCENE_SELECTOR_LIST).empty();
  58. var scenenames = BB.Pepper.getSceneNames();
  59. if (_.size(scenenames) == 0)
  60. return;
  61. _.forEach(scenenames, function (i_scene, i_id) {
  62. var pseudoID = pepper.getPseudoIdFromSceneId(i_id);
  63. var icon = BB.PepperHelper.getIconFromMimeType(i_scene.mimeType);
  64. var snippet = '<a href="#" class="' + BB.lib.unclass(Elements.CLASS_CAMPIGN_LIST_ITEM) + ' list-group-item" data-sceneid="' + pseudoID + '">' +
  65. '<h4>' + '<i style="font-size: 1.6em; position: relative; top: 5px; left: -5px" class="fa ' + icon + '"></i>' + i_scene.label + '</h4>' +
  66. '<p class="list-group-item-text">' + '&nbsp;' + '</p>' +
  67. '<div class="openProps">' +
  68. '<button type="button" class="' + BB.lib.unclass(Elements.CLASS_OPEN_PROPS_BUTTON) + ' btn btn-default btn-sm"><i style="font-size: 1.5em" class="fa fa-gear"></i></button>' +
  69. '</div>' +
  70. '</a>';
  71. $(Elements.SCENE_SELECTOR_LIST).append($(snippet));
  72. });
  73. self._stopEventListening();
  74. self._listenOpenProps();
  75. self._listenSelectScene();
  76. self._listenInputChange();
  77. },
  78.  
  79. /**
  80. Push last scene to top
  81. @method _pushLastSceneTop
  82. @param {Number} i_delay
  83. @param {Number} i_delay
  84. **/
  85. _pushLastSceneTop: function (i_delay, i_duration) {
  86. var self = this;
  87. var height = 0, lastHeight = 0;
  88. $(Elements.SCENE_SELECTOR_LIST).children().each(function () {
  89. lastHeight = $(this).outerHeight(true);
  90. height = height + $(this).outerHeight(true);
  91. });
  92. height = 0 - (height - lastHeight);
  93. var last = $(Elements.SCENE_SELECTOR_LIST).children(':last-child');
  94. TweenLite.to($(last), i_duration, {
  95. top: height,
  96. delay: i_delay,
  97. onComplete: function () {
  98. $(last).prependTo(Elements.SCENE_SELECTOR_LIST);
  99. $(last).css({top: 0});
  100. }
  101. });
  102. },
  103.  
  104. /**
  105. Listen to renaming of scene so we can render the updated scene list
  106. @method _listenSceneRename
  107. **/
  108. _listenSceneRename: function () {
  109. var self = this;
  110. BB.comBroker.listen(BB.EVENTS['SCENE_LIST_UPDATED'], function (e) {
  111. self._render();
  112. if (e.edata=='pushToTop'){
  113. self._pushLastSceneTop(1,1);
  114. }
  115. });
  116. },
  117.  
  118. /**
  119. Listen to duplicate scene
  120. @method _listenDuplicateScene
  121. **/
  122. _listenDuplicateScene: function () {
  123. var self = this;
  124. $(Elements.DUPLICATE_SCENE).on('click', function () {
  125. if (self.m_selectedSceneID == -1) {
  126. bootbox.alert($(Elements.MSG_BOOTBOX_SELECT_SCENE_FIRST).text());
  127. return;
  128. }
  129. var scenePlayerData = pepper.getScenePlayerdata(self.m_selectedSceneID);
  130. BB.comBroker.getService(BB.SERVICES['SCENE_EDIT_VIEW']).createScene(scenePlayerData, true, false);
  131. // self._render();
  132. });
  133. },
  134.  
  135. /**
  136. Listen for user trigger on campaign selection and populate the properties panel
  137. @method _listenOpenProps
  138. @return none
  139. **/
  140. _listenOpenProps: function () {
  141. var self = this;
  142. $(Elements.CLASS_OPEN_PROPS_BUTTON, self.el).on('click', function (e) {
  143. $(Elements.CLASS_CAMPIGN_LIST_ITEM, self.el).removeClass('active');
  144. var elem = $(e.target).closest('a').addClass('active');
  145. self.m_selectedSceneID = $(elem).data('sceneid');
  146. var sceneID = pepper.getSceneIdFromPseudoId(self.m_selectedSceneID);
  147. var domSceneData = pepper.getScenePlayerdataDom(sceneID);
  148. var label = $(domSceneData).find('Player').attr('label');
  149. $(Elements.FORM_SCENE_NAME).val(label);
  150. self.m_propertiesPanel.selectView(self.m_sceneProperties);
  151. self.m_propertiesPanel.openPropertiesPanel();
  152. return false;
  153. });
  154. },
  155.  
  156. /**
  157. Listen select scene
  158. @method _listenSelectScene
  159. @return none
  160. **/
  161. _listenSelectScene: function () {
  162. var self = this;
  163. $(Elements.CLASS_CAMPIGN_LIST_ITEM, self.el).on('click', function (e) {
  164. $(Elements.CLASS_CAMPIGN_LIST_ITEM, self.el).removeClass('active');
  165. $(this).addClass('active');
  166. self.m_selectedSceneID = $(this).data('sceneid');
  167. BB.comBroker.getService(BB.SERVICES['SCENE_EDIT_VIEW']).disposeScene();
  168. self.m_propertiesPanel.resetPropertiesView();
  169. self.options.stackView.slideToPage(Elements.SCENE_SLIDER_ELEMENT_VIEW, 'right');
  170. setTimeout(function () {
  171. BB.comBroker.fire(BB.EVENTS.LOAD_SCENE, this, null, self.m_selectedSceneID);
  172. }, 555);
  173. //return false;
  174. });
  175. },
  176.  
  177. /**
  178. Wire changing of campaign name through scene properties
  179. @method _listenInputChange
  180. @return none
  181. **/
  182. _listenInputChange: function () {
  183. var self = this;
  184. self.m_onChange = _.debounce(function (e) {
  185. var text = $(e.target).val();
  186. var sceneID = pepper.getSceneIdFromPseudoId(self.m_selectedSceneID);
  187. var domSceneData = pepper.getScenePlayerdataDom(sceneID);
  188. if (BB.lib.isEmpty(text))
  189. return;
  190. text = BB.lib.cleanProbCharacters(text, 1);
  191. $(domSceneData).find('Player').attr('label', text);
  192. pepper.setScenePlayerData(sceneID, (new XMLSerializer()).serializeToString(domSceneData));
  193. self.$el.find('[data-sceneid="' + self.m_selectedSceneID + '"]').find('h4').text(text);
  194. BB.comBroker.fire(BB.EVENTS.SCENE_LIST_UPDATED, this);
  195. }, 333, false);
  196. $(Elements.FORM_SCENE_NAME).on("input", self.m_onChange);
  197. },
  198.  
  199. /**
  200. Wire the UI including new scene creation and delete existing scene
  201. @method _listenAddRemoveScene
  202. **/
  203. _listenAddRemoveScene: function () {
  204. var self = this;
  205. $(Elements.NEW_SCENE).on('click', function (e) {
  206. self.options.stackView.slideToPage(Elements.SCENE_CREATOR, 'right');
  207. return false;
  208. self.m_selectedSceneID = -1;
  209. BB.comBroker.fire(BB.EVENTS.NEW_SCENE_ADD, this, null);
  210. BB.comBroker.fire(BB.EVENTS.SCENE_LIST_UPDATED, this);
  211. return false;
  212. });
  213.  
  214. $(Elements.REMOVE_SELECTED_SCENE).on('click', function (e) {
  215. if (self.m_selectedSceneID != -1) {
  216. bootbox.confirm($(Elements.MSG_BOOTBOX_SURE_DELETE_SCENE).text(), function (result) {
  217. if (result == true) {
  218. // var selectedElement = self.$el.find('[data-sceneid="' + self.m_selectedSceneID + '"]');
  219. // selectedElement.remove();
  220. BB.comBroker.fire(BB.EVENTS.SCENE_EDITOR_REMOVE, self, this, self.m_selectedSceneID);
  221. BB.comBroker.fire(BB.EVENTS.SCENE_LIST_UPDATED, this);
  222. }
  223. });
  224. } else {
  225. bootbox.alert($(Elements.MSG_BOOTBOX_SELECT_SCENE_FIRST).text());
  226. return false;
  227. }
  228. });
  229. },
  230.  
  231. /**
  232. Listen after a scene has been removed so we can update the list
  233. @method _listenSceneRemoved
  234. **/
  235. _listenSceneRemoved: function () {
  236. var self = this;
  237. BB.comBroker.listen(BB.EVENTS.REMOVED_SCENE, function (e) {
  238. self.m_selectedSceneID = -1;
  239. self._render();
  240. });
  241. },
  242.  
  243. /**
  244. Stop listening to scene li events
  245. @method _stopEventListening
  246. **/
  247. _stopEventListening: function () {
  248. var self = this;
  249. $(Elements.CLASS_OPEN_PROPS_BUTTON, self.el).off('click');
  250. $(Elements.CLASS_CAMPIGN_LIST_ITEM, self.el).off('click');
  251. $(Elements.FORM_SCENE_NAME).off("input", self.m_onChange);
  252. }
  253. });
  254.  
  255. return SceneSelectionView;
  256. });
  257.  
  258.