1+ import type { Layer } from "@/core/domain/model/Layer" ;
2+ import { Character } from "@/core/domain/model/Character" ;
3+ import { ExternalCharacter } from "@/external/core/domain/model/ExternalCharacter" ;
4+ import { ExternalLayer } from "@/external/core/domain/model/ExternalLayer" ;
15import { $CONVERT_MOVIE_CLIP_INPUT_ID } from "@/config/ConvertMovieClipConfig" ;
26import { $getCurrentWorkSpace } from "@/core/application/CoreUtil" ;
37import { execute as convertMovieClipModalHideUseCase } from "./ConvertMovieClipModalHideUseCase" ;
48import { execute as externalLibraryAddNewMovieClipUseCase } from "@/external/controller/application/ExternalLibrary/usecase/ExternalLibraryAddNewMovieClipUseCase" ;
9+ import { execute as convertMovieClipModalCalcPositionService } from "../service/ConvertMovieClipModalCalcPositionService" ;
10+ import { execute as screenAreaCalcSelectedBoundsService } from "@/screen/application/ScreenArea/service/ScreenAreaCalcSelectedBoundsService" ;
511
612/**
713 * @description 指定の名前のMovieClipを作成して、選択中のDisplayObjectを配置
@@ -17,9 +23,7 @@ export const execute = async (event: PointerEvent): Promise<void> =>
1723 const movieClip = workspace . scene ;
1824
1925 // 選択中のDisplayObjectがない場合は処理を終了する
20- if ( ! movieClip . selectedDepths . size
21- || movieClip . selectedDepths . size > 1
22- ) {
26+ if ( movieClip . selectedDepths . size !== 1 ) {
2327 return ;
2428 }
2529
@@ -29,23 +33,115 @@ export const execute = async (event: PointerEvent): Promise<void> =>
2933 return ;
3034 }
3135
36+ const layer = movieClip . getLayer (
37+ movieClip . selectedDepths . keys ( ) . next ( ) . value as number
38+ ) ;
39+ if ( ! layer ) {
40+ return ;
41+ }
42+
43+ const bounds = screenAreaCalcSelectedBoundsService ( movieClip ) ;
44+ if ( ! bounds ) {
45+ return ;
46+ }
47+
3248 // イベントの伝播を停止する
3349 event . stopPropagation ( ) ;
3450
35- // 指定の名前でMovieClipを作成
36- const name = inputElement . value ;
37-
3851 // ライブラリにMovieClipを追加
3952 const newMovieClip = await externalLibraryAddNewMovieClipUseCase (
4053 workspace ,
4154 movieClip ,
42- name
55+ inputElement . value
4356 ) ;
4457
4558 // MovieClipに選択中のDisplayObjectを配置
59+ const depths = movieClip . selectedDepths . values ( ) . next ( ) . value as number [ ] ;
60+
61+ // 昇順にソート
62+ depths . sort ( ( a , b ) => a - b ) ;
63+
64+ // 移動先のMovieClipのレイヤーを取得
65+ const targetExternalLayer = new ExternalLayer (
66+ workspace ,
67+ newMovieClip ,
68+ newMovieClip . layers [ 0 ] as NonNullable < Layer >
69+ ) ;
70+
71+ // キーフレームの開始位置と終了位置
72+ let startFrame = 1 ;
73+ let endFrame = 2 ;
74+
75+ // 削除した際に深度が変わるので、先に配列にキャッシュする
76+ const characters = [ ] ;
77+ const frame = movieClip . currentFrame ;
78+ for ( let idx = 0 ; idx < depths . length ; idx += 1 ) {
79+ const character = layer . getCharacter ( frame , depths [ idx ] ) ;
80+ if ( ! character ) {
81+ continue ;
82+ }
83+
84+ if ( idx === 0 ) {
85+ startFrame = character . startFrame ;
86+ endFrame = character . endFrame ;
87+ }
88+
89+ characters . push ( character ) ;
90+ }
4691
47- // MovieClipをレイヤーに配置
48- console . log ( newMovieClip ) ;
92+ // 選択しているDisplayObjectを現在のMovieClipから削除して、新しいMovieClipに移動
93+ for ( let idx = 0 ; idx < characters . length ; idx += 1 ) {
94+
95+ const character = characters [ idx ] ;
96+ if ( ! character ) {
97+ continue ;
98+ }
99+
100+ // 選択中のDisplayObjectを削除
101+ const externalCharacter = new ExternalCharacter (
102+ workspace ,
103+ movieClip ,
104+ layer ,
105+ character
106+ ) ;
107+ await externalCharacter . remove ( ) ;
108+
109+ // 1フレームだけのDisplayObjectに変更
110+ externalCharacter . startFrame = 1 ;
111+ externalCharacter . endFrame = 2 ;
112+
113+ // 新しいMovieClipのレイヤーにDisplayObjectを追加
114+ const newExternalCharacter = await targetExternalLayer . addCharacter (
115+ externalCharacter ,
116+ idx
117+ ) ;
118+
119+ // 中心点に合わせて座標を移動
120+ const position = convertMovieClipModalCalcPositionService ( character , bounds ) ;
121+ await newExternalCharacter . setX ( position . x ) ;
122+ await newExternalCharacter . setY ( position . y ) ;
123+ }
124+
125+ // 新しいMovieClipのDisplayObjectを作成して配置
126+ const newCharacter = new Character ( ) ;
127+ newCharacter . libraryId = newMovieClip . id ;
128+ newCharacter . startFrame = startFrame ;
129+ newCharacter . endFrame = endFrame ;
130+
131+ // todo: xy position
132+
133+ const currentExternalLayer = new ExternalLayer (
134+ workspace ,
135+ movieClip ,
136+ layer
137+ ) ;
138+
139+ await currentExternalLayer . addCharacter ( new ExternalCharacter (
140+ workspace ,
141+ movieClip ,
142+ layer ,
143+ newCharacter
144+ ) ) ;
49145
50146 // モーダルを非表示にする
51147 convertMovieClipModalHideUseCase ( ) ;
0 commit comments