You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

139 lines
4.7KB

  1. function Изображения(события, виды, корень)
  2. {
  3. this.создать = function()
  4. {
  5. this.умолчание = {
  6. x: 0,
  7. y: 0,
  8. ширина: 100,
  9. высота: 100,
  10. угол: 0,
  11. };
  12. this.задано = {};
  13. this.элементы = {};
  14. события.подписать(this);
  15. };
  16. this.создатьИлиПолучитьЭлемент = function(имя)
  17. {
  18. var эл = this.элементы[имя];
  19. if (эл)
  20. {
  21. return эл;
  22. }
  23. var ум = this.умолчание;
  24. эл = document.createElement("div");
  25. эл.id = `изображения-${имя}`;
  26. эл.style.position = "absolute";
  27. эл.style.display = "block";
  28. // Свойства по умолчанию.
  29. эл.style.left = `${ум.x}px`;
  30. эл.style.top = `${ум.y}px`;
  31. эл.style.width = `${ум.ширина}px`;
  32. эл.style.height = `${ум.высота}px`;
  33. эл.style.transform = `rotate(${ум.угол}rad)`;
  34. this.элементы[имя] = эл;
  35. корень.appendChild(эл);
  36. return эл;
  37. };
  38. this.обновитьВид = function(имя, вид)
  39. {
  40. /**/console.debug("ИГР Изображения.обновитьВ имя/вид", имя, вид);
  41. var эл = this.создатьИлиПолучитьЭлемент(имя);
  42. let за = виды.задано[вид];
  43. for (let параметр in за)
  44. {
  45. эл.style.setProperty(параметр, за[параметр]);
  46. }
  47. };
  48. this.обновитьРасположение = function(имя, x, y, угол)
  49. {
  50. var за = this.задано[имя];
  51. var эл = this.элементы[имя];
  52. эл.style.left = `${x}px`;
  53. эл.style.top = `${y}px`;
  54. var transform = `rotate(${угол}deg) `;
  55. if (за["вид.transform"])
  56. {
  57. transform += за["вид.transform"];
  58. }
  59. эл.style.transform = transform;
  60. };
  61. this.обновитьЭлемент = function(имя, свойство, значение)
  62. {
  63. if (!this.задано[имя])
  64. {
  65. this.задано[имя] = {};
  66. }
  67. this.задано[имя][свойство] = значение;
  68. var за = this.задано[имя];
  69. var эл = this.создатьИлиПолучитьЭлемент(имя);
  70. if (свойство == "ширина")
  71. {
  72. эл.style.width = `${за.ширина}px`;
  73. }
  74. else if (свойство == "высота")
  75. {
  76. эл.style.height = `${за.высота}px`;
  77. }
  78. else if (
  79. (свойство == "x") ||
  80. (свойство == "y") ||
  81. (свойство == "угол") ||
  82. (свойство == "вид.transform")
  83. ) {
  84. var ум = this.умолчание;
  85. var x = за.x ? за.x : ум.x;
  86. var y = за.y ? за.y : ум.y;
  87. var угол = за.угол ? за.угол : ум.угол;
  88. this.обновитьРасположение(имя, x, y, угол);
  89. }
  90. else if (свойство == "вид")
  91. {
  92. this.обновитьВид(имя, значение);
  93. }
  94. };
  95. this.обновитьЭлементыВида = function(вид)
  96. {
  97. for (let имя in this.задано)
  98. {
  99. let заданныйВид = this.задано[имя]["вид"];
  100. if (заданныйВид && заданныйВид == вид)
  101. {
  102. /**/console.debug("ИГР Изображения.обработатьС обновитьВид имя/вид", имя, вид);
  103. this.обновитьВид(имя, вид);
  104. }
  105. }
  106. };
  107. this.обработатьКлюч = function(ключ, путь, значение)
  108. {
  109. if (путь[0] == "изображения")
  110. {
  111. var имя = путь[1];
  112. var свойство = путь.slice(2).join(".");
  113. this.обновитьЭлемент(имя, свойство, значение);
  114. }
  115. };
  116. this.обработатьСобытие = function(событие)
  117. {
  118. let префикс = "виды/";
  119. if (событие.startsWith(префикс))
  120. {
  121. let вид = событие.substring(префикс.length);
  122. this.обновитьЭлементыВида(вид);
  123. }
  124. };
  125. // Конструктор.
  126. this.создать();
  127. }