pieceMap.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. (function () {
  2. 'use strict';
  3. angular.module('ariaNg').directive('ngPieceMap', ['aria2TaskService', function (aria2TaskService) {
  4. return {
  5. restrict: 'E',
  6. template: '<div class="piece-map"></div>',
  7. replace: true,
  8. scope: {
  9. bitField: '=',
  10. pieceCount: '='
  11. },
  12. link: function (scope, element) {
  13. var pieces = [];
  14. var currentPieceStatus = [];
  15. var redraw = function () {
  16. currentPieceStatus = aria2TaskService.getPieceStatus(scope.bitField, scope.pieceCount);
  17. pieces.length = 0;
  18. element.empty();
  19. var pieceCount = Math.max(1, currentPieceStatus.length);
  20. for (var i = 0; i < pieceCount; i++) {
  21. var piece = angular.element('<div class="piece' + (currentPieceStatus[i] ? ' piece-completed' : '') + '"></div>');
  22. pieces.push(piece);
  23. element.append(piece);
  24. }
  25. };
  26. var refresh = function () {
  27. var newPieceStatus = aria2TaskService.getPieceStatus(scope.bitField, scope.pieceCount);
  28. if (!currentPieceStatus || !newPieceStatus || currentPieceStatus.length !== newPieceStatus.length || newPieceStatus.length !== pieces.length) {
  29. redraw();
  30. return;
  31. }
  32. for (var i = 0; i < pieces.length; i++) {
  33. if (currentPieceStatus[i] !== newPieceStatus[i]) {
  34. if (newPieceStatus[i]) {
  35. pieces[i].addClass('piece-completed');
  36. } else {
  37. pieces[i].removeClass('piece-completed');
  38. }
  39. }
  40. }
  41. currentPieceStatus = newPieceStatus;
  42. };
  43. scope.$watch('bitField', function () {
  44. refresh();
  45. });
  46. scope.$watch('pieceCount', function () {
  47. redraw();
  48. });
  49. }
  50. };
  51. }]);
  52. }());