@@ -130,6 +130,17 @@ String getInitialArea(DocumentPage? page) {
130130 return page? .areas.firstWhereOrNull ((e) => e.isInitial)? .name ?? '' ;
131131}
132132
133+ Area _createDuplicatedArea (Area area, List <Area > existingAreas) {
134+ final baseName = area.name.isEmpty ? 'Area' : area.name;
135+ final existingNames = existingAreas.map ((e) => e.name).toSet ();
136+ var name = baseName;
137+ var count = 1 ;
138+ while (existingNames.contains (name)) {
139+ name = '$baseName (${count ++})' ;
140+ }
141+ return area.copyWith (name: name);
142+ }
143+
133144class DocumentBloc extends ReplayBloc <DocumentEvent , DocumentState > {
134145 final _historyReloadRunner = CoalescedAsyncRunner (
135146 delay: const Duration (milliseconds: 50 ),
@@ -1203,6 +1214,45 @@ class DocumentBloc extends ReplayBloc<DocumentEvent, DocumentState> {
12031214 reset: shouldRepaint,
12041215 );
12051216 }, transformer: sequential ());
1217+ on < AreasDuplicated > ((event, emit) async {
1218+ final current = state;
1219+ if (current is ! DocumentLoadSuccess ) return ;
1220+ if (! (embedding? .editable ?? true )) return ;
1221+ final selectedPages = event.pages.toSet ();
1222+ var data = current.data.setPage (current.page, current.pageName).$1;
1223+ var currentPage = current.page;
1224+ var currentPageChanged = false ;
1225+ for (final (pageName, realPageName) in data.getPagesWithNames ()) {
1226+ if (! selectedPages.contains (pageName) &&
1227+ ! selectedPages.contains (realPageName)) {
1228+ continue ;
1229+ }
1230+ final page = data.getPage (realPageName);
1231+ if (page == null ) continue ;
1232+ final duplicatedArea = _createDuplicatedArea (event.area, page.areas);
1233+ final areas = [
1234+ ...page.areas.map ((e) {
1235+ if (duplicatedArea.isInitial && e.isInitial) {
1236+ return e.copyWith (isInitial: false );
1237+ }
1238+ return e;
1239+ }),
1240+ duplicatedArea,
1241+ ];
1242+ final updatedPage = page.copyWith (areas: areas);
1243+ data = data.setPage (updatedPage, realPageName).$1;
1244+ if (realPageName == current.pageName) {
1245+ currentPage = updatedPage;
1246+ currentPageChanged = true ;
1247+ }
1248+ }
1249+ _saveState (
1250+ emit,
1251+ state: current.copyWith (data: data, page: currentPage),
1252+ shouldRefresh: () => currentPageChanged,
1253+ reset: currentPageChanged,
1254+ );
1255+ }, transformer: sequential ());
12061256 on < AreasRemoved > ((event, emit) {
12071257 final current = state;
12081258 if (current is ! DocumentLoadSuccess ) return ;
0 commit comments