@sequent-org/moodboard 1.2.14 → 1.2.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sequent-org/moodboard",
3
- "version": "1.2.14",
3
+ "version": "1.2.15",
4
4
  "type": "module",
5
5
  "description": "Interactive moodboard",
6
6
  "main": "./src/index.js",
@@ -170,12 +170,51 @@ export class PixiEngine {
170
170
  removeObject(objectId) {
171
171
  const pixiObject = this.objects.get(objectId);
172
172
  if (pixiObject) {
173
+ console.log('🗑️ PixiEngine: удаляем объект из сцены:', objectId);
174
+
175
+ // Удаляем из родительского контейнера
173
176
  if (this.worldLayer) {
174
177
  this.worldLayer.removeChild(pixiObject);
175
178
  } else {
176
179
  this.app.stage.removeChild(pixiObject);
177
180
  }
181
+
182
+ // ИСПРАВЛЕНИЕ: Полная очистка для изображений/эмоджи
183
+ if (pixiObject instanceof PIXI.Sprite) {
184
+ console.log('🗑️ PixiEngine: очищаем ресурсы изображения/эмоджи');
185
+
186
+ // Очищаем текстуру (особенно важно для data URL)
187
+ if (pixiObject.texture && pixiObject.texture !== PIXI.Texture.WHITE) {
188
+ // Не уничтожаем базовые текстуры PIXI
189
+ const textureSource = pixiObject.texture.baseTexture?.resource?.src;
190
+ if (textureSource && (textureSource.startsWith('data:') || textureSource.includes('emodji'))) {
191
+ pixiObject.texture.destroy(false); // Уничтожаем только созданную текстуру
192
+ }
193
+ }
194
+
195
+ // Очищаем все события
196
+ pixiObject.removeAllListeners();
197
+
198
+ // Принудительно уничтожаем спрайт
199
+ pixiObject.destroy({ children: true, texture: false, baseTexture: false });
200
+ } else {
201
+ // Для других типов объектов - стандартная очистка
202
+ if (pixiObject.destroy) {
203
+ pixiObject.destroy({ children: true });
204
+ }
205
+ }
206
+
207
+ // Удаляем из карты объектов
178
208
  this.objects.delete(objectId);
209
+
210
+ // ПРИНУДИТЕЛЬНЫЙ РЕНДЕР после удаления
211
+ if (this.app && this.app.renderer) {
212
+ this.app.renderer.render(this.app.stage);
213
+ }
214
+
215
+ console.log(`✅ PixiEngine: объект ${objectId} полностью удален и рендер обновлен`);
216
+ } else {
217
+ console.warn(`⚠️ PixiEngine: объект ${objectId} не найден для удаления`);
179
218
  }
180
219
  }
181
220
 
@@ -54,10 +54,14 @@ export class DeleteObjectCommand extends BaseCommand {
54
54
  }
55
55
 
56
56
  async execute() {
57
+ console.log('🗑️ DeleteObjectCommand: начинаем удаление объекта:', this.objectId);
58
+
57
59
  // Удаляем объект из состояния и PIXI
58
60
  this.coreMoodboard.state.removeObject(this.objectId);
59
61
  this.coreMoodboard.pixi.removeObject(this.objectId);
60
62
 
63
+ console.log('🗑️ DeleteObjectCommand: объект удален из state и PIXI');
64
+
61
65
  // Если это файловый объект с fileId, удаляем файл с сервера
62
66
  if (this.fileIdToDelete && this.coreMoodboard.fileUploadService) {
63
67
  try {
@@ -70,9 +74,12 @@ export class DeleteObjectCommand extends BaseCommand {
70
74
  }
71
75
  }
72
76
 
77
+ // Эмитим событие удаления для обновления всех UI компонентов
73
78
  this.coreMoodboard.eventBus.emit(Events.Object.Deleted, {
74
79
  objectId: this.objectId
75
80
  });
81
+
82
+ console.log('✅ DeleteObjectCommand: событие Events.Object.Deleted отправлено');
76
83
  }
77
84
 
78
85
  undo() {
@@ -135,13 +135,23 @@ export class SelectTool extends BaseTool {
135
135
  // Обработка удаления объектов (undo создания, delete команды и т.д.)
136
136
  this.eventBus.on(Events.Object.Deleted, (data) => {
137
137
  const objectId = data?.objectId || data;
138
+ console.log('🗑️ SelectTool: получено событие удаления объекта:', objectId);
139
+
138
140
  if (objectId && this.selection.has(objectId)) {
141
+ console.log('🗑️ SelectTool: удаляем объект из selection:', objectId);
139
142
  this.removeFromSelection(objectId);
140
143
 
141
- // Если выделение стало пустым, скрываем ручки
144
+ // ИСПРАВЛЕНИЕ: Принудительно очищаем selection если он стал пустым
142
145
  if (this.selection.size() === 0) {
146
+ console.log('🗑️ SelectTool: selection пустой, скрываем ручки');
147
+ this.emit(Events.Tool.SelectionClear);
143
148
  this.updateResizeHandles();
144
149
  }
150
+ } else if (objectId) {
151
+ console.log('🗑️ SelectTool: объект не был в selection, но проверяем ручки');
152
+ // Дополнительная проверка - возможно объект был удален не через selection
153
+ // Принудительно обновляем ручки
154
+ this.updateResizeHandles();
145
155
  }
146
156
  });
147
157
  }
@@ -35,6 +35,22 @@ export class HtmlHandlesLayer {
35
35
  this.eventBus.on(Events.Tool.SelectionRemove, () => this.update());
36
36
  this.eventBus.on(Events.Tool.SelectionClear, () => this.hide());
37
37
  this.eventBus.on(Events.Tool.DragUpdate, () => this.update());
38
+
39
+ // ИСПРАВЛЕНИЕ: Обработка удаления объектов
40
+ this.eventBus.on(Events.Object.Deleted, ({ objectId }) => {
41
+ console.log('🗑️ HtmlHandlesLayer: объект удален, принудительно очищаем ручки:', objectId);
42
+
43
+ // Принудительно скрываем и очищаем все ручки
44
+ this.hide();
45
+
46
+ // Очищаем DOM от старых ручек
47
+ this.layer.innerHTML = '';
48
+
49
+ // Обновляем для актуального состояния
50
+ setTimeout(() => {
51
+ this.update();
52
+ }, 10); // Небольшая задержка для полной очистки
53
+ });
38
54
  this.eventBus.on(Events.Tool.DragStart, () => { this._handlesSuppressed = true; this._setHandlesVisibility(false); });
39
55
  this.eventBus.on(Events.Tool.DragEnd, () => { this._handlesSuppressed = false; this._setHandlesVisibility(true); });
40
56
  this.eventBus.on(Events.Tool.ResizeUpdate, () => this.update());