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.

144 lines
4.6KB

  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. var эл = this.создатьИлиПолучитьЭлемент(имя);
  41. let за = виды.задано[вид];
  42. for (let параметр in за)
  43. {
  44. эл.style.setProperty(параметр, за[параметр]);
  45. }
  46. };
  47. this.обновитьРасположение = function(имя, x, y, угол)
  48. {
  49. var за = this.задано[имя];
  50. var эл = this.элементы[имя];
  51. эл.style.left = `${x}px`;
  52. эл.style.top = `${y}px`;
  53. var transform = `rotate(${угол}deg) `;
  54. let вид = за["вид"];
  55. if (вид)
  56. {
  57. let виза = виды.задано[вид];
  58. if (виза["transform"])
  59. {
  60. transform += виза["transform"];
  61. }
  62. }
  63. эл.style.transform = transform;
  64. };
  65. this.обновитьЭлемент = function(имя, свойство, значение)
  66. {
  67. if (!this.задано[имя])
  68. {
  69. this.задано[имя] = {};
  70. }
  71. this.задано[имя][свойство] = значение;
  72. var за = this.задано[имя];
  73. var эл = this.создатьИлиПолучитьЭлемент(имя);
  74. if (свойство == "ширина")
  75. {
  76. эл.style.width = `${за.ширина}px`;
  77. }
  78. else if (свойство == "высота")
  79. {
  80. эл.style.height = `${за.высота}px`;
  81. }
  82. else if (
  83. (свойство == "x") ||
  84. (свойство == "y") ||
  85. (свойство == "угол") ||
  86. (свойство == "вид.transform")
  87. ) {
  88. var ум = this.умолчание;
  89. var x = за.x ? за.x : ум.x;
  90. var y = за.y ? за.y : ум.y;
  91. var угол = за.угол ? за.угол : ум.угол;
  92. this.обновитьРасположение(имя, x, y, угол);
  93. }
  94. else if (свойство == "вид")
  95. {
  96. this.обновитьВид(имя, значение);
  97. }
  98. };
  99. this.обновитьЭлементыВида = function(вид)
  100. {
  101. for (let имя in this.задано)
  102. {
  103. let заданныйВид = this.задано[имя]["вид"];
  104. if (заданныйВид && заданныйВид == вид)
  105. {
  106. this.обновитьВид(имя, вид);
  107. }
  108. }
  109. };
  110. this.обработатьКлюч = function(ключ, путь, значение)
  111. {
  112. if (путь[0] == "изображения")
  113. {
  114. var имя = путь[1];
  115. var свойство = путь.slice(2).join(".");
  116. this.обновитьЭлемент(имя, свойство, значение);
  117. }
  118. };
  119. this.обработатьСобытие = function(событие)
  120. {
  121. let префикс = "виды/";
  122. if (событие.startsWith(префикс))
  123. {
  124. let вид = событие.substring(префикс.length);
  125. this.обновитьЭлементыВида(вид);
  126. }
  127. };
  128. // Конструктор.
  129. this.создать();
  130. }