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.

147 lines
4.7KB

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