Source: view/vizCandidateDns/CandidateDnViewList.js

  1. /** @module */
  2. import CandidateDnView from './CandidateDnView.js'
  3. /**
  4. * A simple list of candidateDnView instances.
  5. * It really just passes along function calls to each member of the list.
  6. * It also checks if that member exists. Alternatively, it was deleted.
  7. * @constructor
  8. */
  9. export default function CandidateDnViewList(viewSettings, candidateDnList, screen, simOptions, electionOptionsMan) {
  10. const self = this
  11. const canDnViews = []
  12. self.rendererMaker = () => ({ render: () => {} })
  13. // Publish to DraggableManager //
  14. const observers = []
  15. self.attachNewG = (o) => { observers.push(o) }
  16. const updateObservers = (g) => { observers.forEach((o) => o.updateNewG(g)) }
  17. // Subscribe to Sim //
  18. candidateDnList.attachNewE(self)
  19. self.updateNewE = (candidateDn) => {
  20. self.newCandidateDn(candidateDn)
  21. }
  22. // Data Setters and Getters //
  23. self.newCandidateDn = function (candidateDn) {
  24. const canDnView = new CandidateDnView(candidateDn, screen, 21, 21, viewSettings, simOptions, electionOptionsMan)
  25. canDnViews.push(canDnView)
  26. canDnView.graphic.setRenderer(self.rendererMaker)
  27. updateObservers(canDnView)
  28. }
  29. // get sim entities that exist
  30. self.getCanDnViews = () => {
  31. const a = canDnViews.filter((canDnView) => canDnView.canDn.exists)
  32. return a
  33. }
  34. // get the underlying entities of the above
  35. self.getCandidateDistributions = () => {
  36. const canDnViewsEx = self.getCanDnViews()
  37. return canDnViewsEx.map((canDnView) => canDnView.canDn)
  38. }
  39. self.getCandidateDistributionsAll = () => canDnViews.map((canDnView) => canDnView.canDn)
  40. // Update //
  41. self.setCandidateDnWins = (partyWinFraction) => {
  42. const canDnViewsExisting = self.getCanDnViews()
  43. if (canDnViewsExisting.length > 1) {
  44. canDnViewsExisting.forEach((canDnView) => {
  45. const party0 = canDnView.canDn.party[0]
  46. const winFraction = partyWinFraction[party0]
  47. canDnView.graphic.setWinFraction(winFraction)
  48. })
  49. }
  50. }
  51. self.updateViewXY = () => {
  52. canDnViews.forEach((canDnView) => canDnView.graphic.updateViewXY())
  53. }
  54. // Render //
  55. self.render = () => {
  56. canDnViews.forEach((canDnView) => {
  57. if (canDnView.canDn.exists) canDnView.graphic.renderer.render()
  58. })
  59. }
  60. self.setRenderer = (rendererMaker) => {
  61. self.rendererMaker = rendererMaker
  62. canDnViews.forEach((canDnView) => canDnView.graphic.setRenderer(rendererMaker))
  63. }
  64. self.renderForeground = () => {
  65. if (viewSettings.showGhosts) {
  66. self.renderForegroundAll()
  67. } else {
  68. self.renderForegroundExisting()
  69. }
  70. }
  71. self.renderForegroundExisting = () => {
  72. canDnViews.forEach((canDnView) => {
  73. if (canDnView.canDn.exists) canDnView.graphic.renderForeground()
  74. })
  75. }
  76. self.renderForegroundAll = () => {
  77. canDnViews.forEach((canDnView) => canDnView.graphic.renderForeground())
  78. }
  79. }