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.

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