@mint-ui/map 1.2.0-test.56 → 1.2.0-test.57
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/dist/components/mint-map/core/advanced/CanvasMarkerLayer/CanvasMarkerLayer.d.ts +0 -2
- package/dist/components/mint-map/core/advanced/CanvasMarkerLayer/CanvasMarkerLayer.js +5 -37
- package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/CanvasPolygonLayer.d.ts +16 -3
- package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/CanvasPolygonLayer.js +30 -15
- package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/renderer.d.ts +61 -0
- package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/renderer.js +433 -0
- package/dist/index.es.js +464 -52
- package/dist/index.umd.js +464 -52
- package/package.json +1 -1
package/dist/index.es.js
CHANGED
|
@@ -3883,10 +3883,9 @@ var CanvasMarkerLayer = function (props) {
|
|
|
3883
3883
|
externalSelectedItem = props.selectedItem,
|
|
3884
3884
|
_f = props.disableInteraction,
|
|
3885
3885
|
disableInteraction = _f === void 0 ? false : _f,
|
|
3886
|
-
hoverZIndex = props.hoverZIndex,
|
|
3887
3886
|
renderBase = props.renderBase,
|
|
3888
3887
|
renderEvent = props.renderEvent,
|
|
3889
|
-
options = __rest(props, ["data", "onClick", "onMouseOver", "onMouseOut", "enableMultiSelect", "topOnHover", "enableViewportCulling", "cullingMargin", "maxCacheSize", "selectedItems", "selectedItem", "disableInteraction", "
|
|
3888
|
+
options = __rest(props, ["data", "onClick", "onMouseOver", "onMouseOut", "enableMultiSelect", "topOnHover", "enableViewportCulling", "cullingMargin", "maxCacheSize", "selectedItems", "selectedItem", "disableInteraction", "renderBase", "renderEvent"]);
|
|
3890
3889
|
|
|
3891
3890
|
var controller = useMintMapController();
|
|
3892
3891
|
var context = useCanvasContext();
|
|
@@ -3916,9 +3915,7 @@ var CanvasMarkerLayer = function (props) {
|
|
|
3916
3915
|
y: 0
|
|
3917
3916
|
}); // 드래그 시작 시점의 hover 상태 저장 (드래그 중 hover 고정용)
|
|
3918
3917
|
|
|
3919
|
-
var dragStartHoveredItemRef = useRef(null); //
|
|
3920
|
-
|
|
3921
|
-
var originalZIndexRef = useRef(currentZIndex); // 성능 최적화 Refs
|
|
3918
|
+
var dragStartHoveredItemRef = useRef(null); // 성능 최적화 Refs
|
|
3922
3919
|
|
|
3923
3920
|
var offsetCacheRef = useRef(new LRUCache(maxCacheSize));
|
|
3924
3921
|
var spatialIndexRef = useRef(new SpatialHashGrid(SPATIAL_GRID_CELL_SIZE));
|
|
@@ -4164,21 +4161,7 @@ var CanvasMarkerLayer = function (props) {
|
|
|
4164
4161
|
return;
|
|
4165
4162
|
}
|
|
4166
4163
|
|
|
4167
|
-
|
|
4168
|
-
hoveredItemRef.current = hoveredData; // hoverZIndex가 설정되어 있고 마커가 존재할 때 z-index 변경
|
|
4169
|
-
|
|
4170
|
-
if (hoverZIndex !== undefined && markerRef.current) {
|
|
4171
|
-
// hover 상태가 변경될 때만 z-index 업데이트
|
|
4172
|
-
if (prevHovered !== hoveredData) {
|
|
4173
|
-
// 이전 hover가 끝났을 때 원래 z-index로 복원
|
|
4174
|
-
if (prevHovered && !hoveredData) {
|
|
4175
|
-
controller.setMarkerZIndex(markerRef.current, originalZIndexRef.current);
|
|
4176
|
-
} // 새로운 hover가 시작될 때 hoverZIndex로 변경
|
|
4177
|
-
else if (hoveredData && !prevHovered) {
|
|
4178
|
-
controller.setMarkerZIndex(markerRef.current, hoverZIndex);
|
|
4179
|
-
}
|
|
4180
|
-
}
|
|
4181
|
-
}
|
|
4164
|
+
hoveredItemRef.current = hoveredData;
|
|
4182
4165
|
|
|
4183
4166
|
if (draggingRef.current) {
|
|
4184
4167
|
controller.setMapCursor('grabbing');
|
|
@@ -4257,12 +4240,7 @@ var CanvasMarkerLayer = function (props) {
|
|
|
4257
4240
|
if (disableInteractionRef.current) return;
|
|
4258
4241
|
var prevHovered = hoveredItemRef.current;
|
|
4259
4242
|
if (!prevHovered) return;
|
|
4260
|
-
hoveredItemRef.current = null;
|
|
4261
|
-
|
|
4262
|
-
if (hoverZIndex !== undefined && markerRef.current) {
|
|
4263
|
-
controller.setMarkerZIndex(markerRef.current, originalZIndexRef.current);
|
|
4264
|
-
}
|
|
4265
|
-
|
|
4243
|
+
hoveredItemRef.current = null;
|
|
4266
4244
|
controller.setMapCursor('grab');
|
|
4267
4245
|
doRenderEvent();
|
|
4268
4246
|
onMouseOut === null || onMouseOut === void 0 ? void 0 : onMouseOut(prevHovered);
|
|
@@ -4287,16 +4265,7 @@ var CanvasMarkerLayer = function (props) {
|
|
|
4287
4265
|
}, options);
|
|
4288
4266
|
|
|
4289
4267
|
if (markerRef.current) {
|
|
4290
|
-
controller.updateMarker(markerRef.current, markerOptions);
|
|
4291
|
-
|
|
4292
|
-
if (options.zIndex !== undefined) {
|
|
4293
|
-
originalZIndexRef.current = options.zIndex; // hover 상태가 아닐 때만 z-index 업데이트 (hover 중이면 hoverZIndex 유지)
|
|
4294
|
-
|
|
4295
|
-
if (!hoveredItemRef.current || hoverZIndex === undefined) {
|
|
4296
|
-
controller.setMarkerZIndex(markerRef.current, options.zIndex);
|
|
4297
|
-
}
|
|
4298
|
-
}
|
|
4299
|
-
|
|
4268
|
+
controller.updateMarker(markerRef.current, markerOptions);
|
|
4300
4269
|
return;
|
|
4301
4270
|
}
|
|
4302
4271
|
|
|
@@ -4309,7 +4278,6 @@ var CanvasMarkerLayer = function (props) {
|
|
|
4309
4278
|
}
|
|
4310
4279
|
|
|
4311
4280
|
if (options.zIndex !== undefined) {
|
|
4312
|
-
originalZIndexRef.current = options.zIndex;
|
|
4313
4281
|
controller.setMarkerZIndex(markerRef.current, options.zIndex);
|
|
4314
4282
|
}
|
|
4315
4283
|
}, [options]); // Konva 초기화 및 이벤트 리스너 등록
|
|
@@ -5143,6 +5111,435 @@ var renderPolygonEventWithCustomStyle = function (customStyle) {
|
|
|
5143
5111
|
}
|
|
5144
5112
|
};
|
|
5145
5113
|
};
|
|
5114
|
+
/**
|
|
5115
|
+
* 폴리곤 Base 렌더링 함수 팩토리 (하이브리드 방식: customStyle + 개별 props)
|
|
5116
|
+
*
|
|
5117
|
+
* Base Layer에서 사용할 렌더링 함수를 생성합니다.
|
|
5118
|
+
* customStyle이 제공되면 우선적으로 사용하며, null/undefined를 반환하면 개별 props로 정의된 기본 스타일을 사용합니다.
|
|
5119
|
+
*
|
|
5120
|
+
* @template T 폴리곤 데이터의 추가 속성 타입
|
|
5121
|
+
* @param customStyle 폴리곤 스타일 커스터마이징 함수 (선택)
|
|
5122
|
+
* @param baseFillColor 기본 폴리곤 채우기 색상 (fallback용)
|
|
5123
|
+
* @param baseStrokeColor 기본 폴리곤 테두리 색상 (fallback용)
|
|
5124
|
+
* @param baseLineWidth 기본 폴리곤 테두리 두께 (fallback용)
|
|
5125
|
+
* @returns Base Layer 렌더링 함수
|
|
5126
|
+
*/
|
|
5127
|
+
|
|
5128
|
+
var renderPolygonBaseWithHybrid = function (customStyle, baseFillColor, baseStrokeColor, baseLineWidth) {
|
|
5129
|
+
return function (_a) {
|
|
5130
|
+
var ctx = _a.ctx,
|
|
5131
|
+
items = _a.items,
|
|
5132
|
+
selectedIds = _a.selectedIds,
|
|
5133
|
+
utils = _a.utils;
|
|
5134
|
+
|
|
5135
|
+
for (var _i = 0, items_4 = items; _i < items_4.length; _i++) {
|
|
5136
|
+
var item = items_4[_i]; // 선택된 항목은 Event Layer에서 그림 (중복 렌더링 방지)
|
|
5137
|
+
|
|
5138
|
+
if (selectedIds.has(item.id)) continue; // paths가 없으면 스킵
|
|
5139
|
+
|
|
5140
|
+
if (!item.paths) continue; // 좌표 변환 (자동 캐싱)
|
|
5141
|
+
|
|
5142
|
+
var polygonOffsets = utils.getOrComputePolygonOffsets(item);
|
|
5143
|
+
if (!polygonOffsets) continue; // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
|
|
5144
|
+
|
|
5145
|
+
var style = void 0;
|
|
5146
|
+
|
|
5147
|
+
if (customStyle) {
|
|
5148
|
+
var context = {
|
|
5149
|
+
isActive: false,
|
|
5150
|
+
isHovered: false,
|
|
5151
|
+
isSelected: false
|
|
5152
|
+
};
|
|
5153
|
+
style = customStyle(item, context);
|
|
5154
|
+
} // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
|
|
5155
|
+
|
|
5156
|
+
|
|
5157
|
+
if (!style) {
|
|
5158
|
+
style = {
|
|
5159
|
+
fillColor: baseFillColor,
|
|
5160
|
+
lineWidth: baseLineWidth,
|
|
5161
|
+
strokeColor: baseStrokeColor
|
|
5162
|
+
};
|
|
5163
|
+
} // 폴리곤 그리기
|
|
5164
|
+
|
|
5165
|
+
|
|
5166
|
+
drawPolygon({
|
|
5167
|
+
ctx: ctx,
|
|
5168
|
+
fillColor: style.fillColor,
|
|
5169
|
+
isDonutPolygon: item.isDonutPolygon || false,
|
|
5170
|
+
lineWidth: style.lineWidth,
|
|
5171
|
+
polygonOffsets: polygonOffsets,
|
|
5172
|
+
strokeColor: style.strokeColor
|
|
5173
|
+
});
|
|
5174
|
+
}
|
|
5175
|
+
};
|
|
5176
|
+
};
|
|
5177
|
+
/**
|
|
5178
|
+
* 폴리곤 Event 렌더링 함수 팩토리 (하이브리드 방식: customStyle + 개별 props)
|
|
5179
|
+
*
|
|
5180
|
+
* Event Layer에서 사용할 렌더링 함수를 생성합니다.
|
|
5181
|
+
* customStyle이 제공되면 우선적으로 사용하며, null/undefined를 반환하면 개별 props로 정의된 기본 스타일을 사용합니다.
|
|
5182
|
+
*
|
|
5183
|
+
* @template T 폴리곤 데이터의 추가 속성 타입
|
|
5184
|
+
* @param customStyle 폴리곤 스타일 커스터마이징 함수 (선택)
|
|
5185
|
+
* @param baseFillColor 기본 폴리곤 채우기 색상 (fallback용)
|
|
5186
|
+
* @param baseStrokeColor 기본 폴리곤 테두리 색상 (fallback용)
|
|
5187
|
+
* @param baseLineWidth 기본 폴리곤 테두리 두께 (fallback용)
|
|
5188
|
+
* @param selectedFillColor 선택된 폴리곤 채우기 색상 (fallback용)
|
|
5189
|
+
* @param selectedStrokeColor 선택된 폴리곤 테두리 색상 (fallback용)
|
|
5190
|
+
* @param selectedLineWidth 선택된 폴리곤 테두리 두께 (fallback용)
|
|
5191
|
+
* @param activeFillColor 마지막 선택된 폴리곤 채우기 색상 (fallback용)
|
|
5192
|
+
* @param activeStrokeColor 마지막 선택된 폴리곤 테두리 색상 (fallback용)
|
|
5193
|
+
* @param activeLineWidth 마지막 선택된 폴리곤 테두리 두께 (fallback용)
|
|
5194
|
+
* @param hoveredFillColor Hover 시 폴리곤 채우기 색상 (fallback용)
|
|
5195
|
+
* @param hoveredStrokeColor Hover 시 폴리곤 테두리 색상 (fallback용)
|
|
5196
|
+
* @param hoveredLineWidth Hover 시 폴리곤 테두리 두께 (fallback용)
|
|
5197
|
+
* @returns Event Layer 렌더링 함수
|
|
5198
|
+
*/
|
|
5199
|
+
|
|
5200
|
+
var renderPolygonEventWithHybrid = function (customStyle, baseFillColor, baseStrokeColor, baseLineWidth, selectedFillColor, selectedStrokeColor, selectedLineWidth, activeFillColor, activeStrokeColor, activeLineWidth, hoveredFillColor, hoveredStrokeColor, hoveredLineWidth) {
|
|
5201
|
+
// 기본값 설정 (base 기준)
|
|
5202
|
+
var _selectedFillColor = selectedFillColor || baseFillColor;
|
|
5203
|
+
|
|
5204
|
+
var _selectedStrokeColor = selectedStrokeColor || baseStrokeColor;
|
|
5205
|
+
|
|
5206
|
+
var _selectedLineWidth = selectedLineWidth || baseLineWidth;
|
|
5207
|
+
|
|
5208
|
+
var _activeFillColor = activeFillColor || _selectedFillColor;
|
|
5209
|
+
|
|
5210
|
+
var _activeStrokeColor = activeStrokeColor || _selectedStrokeColor;
|
|
5211
|
+
|
|
5212
|
+
var _activeLineWidth = activeLineWidth || _selectedLineWidth;
|
|
5213
|
+
|
|
5214
|
+
var _hoveredFillColor = hoveredFillColor || _selectedFillColor;
|
|
5215
|
+
|
|
5216
|
+
var _hoveredStrokeColor = hoveredStrokeColor || _selectedStrokeColor;
|
|
5217
|
+
|
|
5218
|
+
var _hoveredLineWidth = hoveredLineWidth || _selectedLineWidth;
|
|
5219
|
+
|
|
5220
|
+
return function (_a) {
|
|
5221
|
+
var ctx = _a.ctx,
|
|
5222
|
+
hoveredItem = _a.hoveredItem,
|
|
5223
|
+
selectedItem = _a.selectedItem,
|
|
5224
|
+
selectedItems = _a.selectedItems,
|
|
5225
|
+
utils = _a.utils; // 성능 최적화: selectedItems를 Set으로 변환하여 O(1) 조회 (매번 some() 체크 방지)
|
|
5226
|
+
|
|
5227
|
+
var selectedIdsSet = selectedItems ? new Set(selectedItems.map(function (item) {
|
|
5228
|
+
return item.id;
|
|
5229
|
+
})) : new Set();
|
|
5230
|
+
var hoveredItemId = hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.id;
|
|
5231
|
+
var selectedItemId = selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.id; // 1. 선택된 항목들 그리기 (마지막 선택 항목과 호버된 항목 제외)
|
|
5232
|
+
|
|
5233
|
+
if (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.length) {
|
|
5234
|
+
for (var _i = 0, selectedItems_4 = selectedItems; _i < selectedItems_4.length; _i++) {
|
|
5235
|
+
var item = selectedItems_4[_i]; // 마지막 선택 항목과 호버된 항목은 나중에 따로 그림
|
|
5236
|
+
|
|
5237
|
+
if (item.id === selectedItemId || item.id === hoveredItemId) continue;
|
|
5238
|
+
if (!item.paths) continue;
|
|
5239
|
+
var polygonOffsets = utils.getOrComputePolygonOffsets(item);
|
|
5240
|
+
if (!polygonOffsets) continue; // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
|
|
5241
|
+
|
|
5242
|
+
var style = void 0;
|
|
5243
|
+
|
|
5244
|
+
if (customStyle) {
|
|
5245
|
+
var context = {
|
|
5246
|
+
isActive: false,
|
|
5247
|
+
isHovered: false,
|
|
5248
|
+
isSelected: true
|
|
5249
|
+
};
|
|
5250
|
+
style = customStyle(item, context);
|
|
5251
|
+
} // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
|
|
5252
|
+
|
|
5253
|
+
|
|
5254
|
+
if (!style) {
|
|
5255
|
+
style = {
|
|
5256
|
+
fillColor: _selectedFillColor,
|
|
5257
|
+
lineWidth: _selectedLineWidth,
|
|
5258
|
+
strokeColor: _selectedStrokeColor
|
|
5259
|
+
};
|
|
5260
|
+
}
|
|
5261
|
+
|
|
5262
|
+
drawPolygon({
|
|
5263
|
+
ctx: ctx,
|
|
5264
|
+
fillColor: style.fillColor,
|
|
5265
|
+
isDonutPolygon: item.isDonutPolygon || false,
|
|
5266
|
+
lineWidth: style.lineWidth,
|
|
5267
|
+
polygonOffsets: polygonOffsets,
|
|
5268
|
+
strokeColor: style.strokeColor
|
|
5269
|
+
});
|
|
5270
|
+
}
|
|
5271
|
+
} // 2. 마지막 선택된 항목 그리기 (호버되지 않은 경우)
|
|
5272
|
+
|
|
5273
|
+
|
|
5274
|
+
if ((selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.paths) && hoveredItemId !== selectedItemId) {
|
|
5275
|
+
var polygonOffsets = utils.getOrComputePolygonOffsets(selectedItem);
|
|
5276
|
+
|
|
5277
|
+
if (polygonOffsets) {
|
|
5278
|
+
// customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
|
|
5279
|
+
var style = void 0;
|
|
5280
|
+
|
|
5281
|
+
if (customStyle) {
|
|
5282
|
+
var context = {
|
|
5283
|
+
isActive: true,
|
|
5284
|
+
isHovered: false,
|
|
5285
|
+
isSelected: true
|
|
5286
|
+
};
|
|
5287
|
+
style = customStyle(selectedItem, context);
|
|
5288
|
+
} // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
|
|
5289
|
+
|
|
5290
|
+
|
|
5291
|
+
if (!style) {
|
|
5292
|
+
style = {
|
|
5293
|
+
fillColor: _activeFillColor,
|
|
5294
|
+
lineWidth: _activeLineWidth,
|
|
5295
|
+
strokeColor: _activeStrokeColor
|
|
5296
|
+
};
|
|
5297
|
+
}
|
|
5298
|
+
|
|
5299
|
+
drawPolygon({
|
|
5300
|
+
ctx: ctx,
|
|
5301
|
+
fillColor: style.fillColor,
|
|
5302
|
+
isDonutPolygon: selectedItem.isDonutPolygon || false,
|
|
5303
|
+
lineWidth: style.lineWidth,
|
|
5304
|
+
polygonOffsets: polygonOffsets,
|
|
5305
|
+
strokeColor: style.strokeColor
|
|
5306
|
+
});
|
|
5307
|
+
}
|
|
5308
|
+
} // 3. 호버된 항목 그리기 (가장 위에 표시)
|
|
5309
|
+
|
|
5310
|
+
|
|
5311
|
+
if (hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.paths) {
|
|
5312
|
+
var polygonOffsets = utils.getOrComputePolygonOffsets(hoveredItem); // 좌표 변환 실패 시 스킵 (return은 렌더링 함수 종료)
|
|
5313
|
+
|
|
5314
|
+
if (!polygonOffsets) return; // 성능 최적화: Set을 사용하여 O(1) 조회 (이전: O(m) some() 체크)
|
|
5315
|
+
|
|
5316
|
+
var isSelected = selectedIdsSet.has(hoveredItem.id); // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
|
|
5317
|
+
|
|
5318
|
+
var style = void 0;
|
|
5319
|
+
|
|
5320
|
+
if (customStyle) {
|
|
5321
|
+
var context = {
|
|
5322
|
+
isActive: isSelected && hoveredItem.id === selectedItemId,
|
|
5323
|
+
isHovered: !isSelected,
|
|
5324
|
+
isSelected: isSelected
|
|
5325
|
+
};
|
|
5326
|
+
style = customStyle(hoveredItem, context);
|
|
5327
|
+
} // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
|
|
5328
|
+
|
|
5329
|
+
|
|
5330
|
+
if (!style) {
|
|
5331
|
+
style = {
|
|
5332
|
+
fillColor: isSelected ? _activeFillColor : _hoveredFillColor,
|
|
5333
|
+
lineWidth: isSelected ? _activeLineWidth : _hoveredLineWidth,
|
|
5334
|
+
strokeColor: isSelected ? _activeStrokeColor : _hoveredStrokeColor
|
|
5335
|
+
};
|
|
5336
|
+
}
|
|
5337
|
+
|
|
5338
|
+
drawPolygon({
|
|
5339
|
+
ctx: ctx,
|
|
5340
|
+
fillColor: style.fillColor,
|
|
5341
|
+
isDonutPolygon: hoveredItem.isDonutPolygon || false,
|
|
5342
|
+
lineWidth: style.lineWidth,
|
|
5343
|
+
polygonOffsets: polygonOffsets,
|
|
5344
|
+
strokeColor: style.strokeColor
|
|
5345
|
+
});
|
|
5346
|
+
}
|
|
5347
|
+
};
|
|
5348
|
+
};
|
|
5349
|
+
/**
|
|
5350
|
+
* 폴리곤 Base 렌더링 함수 팩토리 (하이브리드 방식: customStyle + renderStyle)
|
|
5351
|
+
*
|
|
5352
|
+
* Base Layer에서 사용할 렌더링 함수를 생성합니다.
|
|
5353
|
+
* customStyle이 제공되면 우선적으로 사용하며, null/undefined를 반환하면 renderStyle로 정의된 기본 스타일을 사용합니다.
|
|
5354
|
+
*
|
|
5355
|
+
* @template T 폴리곤 데이터의 추가 속성 타입
|
|
5356
|
+
* @param customStyle 폴리곤 스타일 커스터마이징 함수 (선택)
|
|
5357
|
+
* @param renderStyle 폴리곤 스타일 객체 (fallback용)
|
|
5358
|
+
* @returns Base Layer 렌더링 함수
|
|
5359
|
+
*/
|
|
5360
|
+
|
|
5361
|
+
var renderPolygonBaseWithHybridObject = function (customStyle, renderStyle) {
|
|
5362
|
+
return function (_a) {
|
|
5363
|
+
var ctx = _a.ctx,
|
|
5364
|
+
items = _a.items,
|
|
5365
|
+
selectedIds = _a.selectedIds,
|
|
5366
|
+
utils = _a.utils;
|
|
5367
|
+
|
|
5368
|
+
for (var _i = 0, items_5 = items; _i < items_5.length; _i++) {
|
|
5369
|
+
var item = items_5[_i]; // 선택된 항목은 Event Layer에서 그림 (중복 렌더링 방지)
|
|
5370
|
+
|
|
5371
|
+
if (selectedIds.has(item.id)) continue; // paths가 없으면 스킵
|
|
5372
|
+
|
|
5373
|
+
if (!item.paths) continue; // 좌표 변환 (자동 캐싱)
|
|
5374
|
+
|
|
5375
|
+
var polygonOffsets = utils.getOrComputePolygonOffsets(item);
|
|
5376
|
+
if (!polygonOffsets) continue; // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
|
|
5377
|
+
|
|
5378
|
+
var style = void 0;
|
|
5379
|
+
|
|
5380
|
+
if (customStyle) {
|
|
5381
|
+
var context = {
|
|
5382
|
+
isActive: false,
|
|
5383
|
+
isHovered: false,
|
|
5384
|
+
isSelected: false
|
|
5385
|
+
};
|
|
5386
|
+
style = customStyle(item, context);
|
|
5387
|
+
} // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
|
|
5388
|
+
|
|
5389
|
+
|
|
5390
|
+
if (!style) {
|
|
5391
|
+
style = renderStyle.base;
|
|
5392
|
+
} // 폴리곤 그리기
|
|
5393
|
+
|
|
5394
|
+
|
|
5395
|
+
drawPolygon({
|
|
5396
|
+
ctx: ctx,
|
|
5397
|
+
fillColor: style.fillColor,
|
|
5398
|
+
isDonutPolygon: item.isDonutPolygon || false,
|
|
5399
|
+
lineWidth: style.lineWidth,
|
|
5400
|
+
polygonOffsets: polygonOffsets,
|
|
5401
|
+
strokeColor: style.strokeColor
|
|
5402
|
+
});
|
|
5403
|
+
}
|
|
5404
|
+
};
|
|
5405
|
+
};
|
|
5406
|
+
/**
|
|
5407
|
+
* 폴리곤 Event 렌더링 함수 팩토리 (하이브리드 방식: customStyle + renderStyle)
|
|
5408
|
+
*
|
|
5409
|
+
* Event Layer에서 사용할 렌더링 함수를 생성합니다.
|
|
5410
|
+
* customStyle이 제공되면 우선적으로 사용하며, null/undefined를 반환하면 renderStyle로 정의된 기본 스타일을 사용합니다.
|
|
5411
|
+
*
|
|
5412
|
+
* @template T 폴리곤 데이터의 추가 속성 타입
|
|
5413
|
+
* @param customStyle 폴리곤 스타일 커스터마이징 함수 (선택)
|
|
5414
|
+
* @param renderStyle 폴리곤 스타일 객체 (fallback용)
|
|
5415
|
+
* @returns Event Layer 렌더링 함수
|
|
5416
|
+
*/
|
|
5417
|
+
|
|
5418
|
+
var renderPolygonEventWithHybridObject = function (customStyle, renderStyle) {
|
|
5419
|
+
// 기본값 설정 (개별 props 방식과 동일한 로직)
|
|
5420
|
+
var _selectedStyle = renderStyle.selected || renderStyle.base;
|
|
5421
|
+
|
|
5422
|
+
var _activeStyle = renderStyle.active || _selectedStyle;
|
|
5423
|
+
|
|
5424
|
+
var _hoveredStyle = renderStyle.hovered || _selectedStyle;
|
|
5425
|
+
|
|
5426
|
+
return function (_a) {
|
|
5427
|
+
var ctx = _a.ctx,
|
|
5428
|
+
hoveredItem = _a.hoveredItem,
|
|
5429
|
+
selectedItem = _a.selectedItem,
|
|
5430
|
+
selectedItems = _a.selectedItems,
|
|
5431
|
+
utils = _a.utils; // 성능 최적화: selectedItems를 Set으로 변환하여 O(1) 조회 (매번 some() 체크 방지)
|
|
5432
|
+
|
|
5433
|
+
var selectedIdsSet = selectedItems ? new Set(selectedItems.map(function (item) {
|
|
5434
|
+
return item.id;
|
|
5435
|
+
})) : new Set();
|
|
5436
|
+
var hoveredItemId = hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.id;
|
|
5437
|
+
var selectedItemId = selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.id; // 1. 선택된 항목들 그리기 (마지막 선택 항목과 호버된 항목 제외)
|
|
5438
|
+
|
|
5439
|
+
if (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.length) {
|
|
5440
|
+
for (var _i = 0, selectedItems_5 = selectedItems; _i < selectedItems_5.length; _i++) {
|
|
5441
|
+
var item = selectedItems_5[_i]; // 마지막 선택 항목과 호버된 항목은 나중에 따로 그림
|
|
5442
|
+
|
|
5443
|
+
if (item.id === selectedItemId || item.id === hoveredItemId) continue;
|
|
5444
|
+
if (!item.paths) continue;
|
|
5445
|
+
var polygonOffsets = utils.getOrComputePolygonOffsets(item);
|
|
5446
|
+
if (!polygonOffsets) continue; // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
|
|
5447
|
+
|
|
5448
|
+
var style = void 0;
|
|
5449
|
+
|
|
5450
|
+
if (customStyle) {
|
|
5451
|
+
var context = {
|
|
5452
|
+
isActive: false,
|
|
5453
|
+
isHovered: false,
|
|
5454
|
+
isSelected: true
|
|
5455
|
+
};
|
|
5456
|
+
style = customStyle(item, context);
|
|
5457
|
+
} // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
|
|
5458
|
+
|
|
5459
|
+
|
|
5460
|
+
if (!style) {
|
|
5461
|
+
style = _selectedStyle;
|
|
5462
|
+
}
|
|
5463
|
+
|
|
5464
|
+
drawPolygon({
|
|
5465
|
+
ctx: ctx,
|
|
5466
|
+
fillColor: style.fillColor,
|
|
5467
|
+
isDonutPolygon: item.isDonutPolygon || false,
|
|
5468
|
+
lineWidth: style.lineWidth,
|
|
5469
|
+
polygonOffsets: polygonOffsets,
|
|
5470
|
+
strokeColor: style.strokeColor
|
|
5471
|
+
});
|
|
5472
|
+
}
|
|
5473
|
+
} // 2. 마지막 선택된 항목 그리기 (호버되지 않은 경우)
|
|
5474
|
+
|
|
5475
|
+
|
|
5476
|
+
if ((selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.paths) && hoveredItemId !== selectedItemId) {
|
|
5477
|
+
var polygonOffsets = utils.getOrComputePolygonOffsets(selectedItem);
|
|
5478
|
+
|
|
5479
|
+
if (polygonOffsets) {
|
|
5480
|
+
// customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
|
|
5481
|
+
var style = void 0;
|
|
5482
|
+
|
|
5483
|
+
if (customStyle) {
|
|
5484
|
+
var context = {
|
|
5485
|
+
isActive: true,
|
|
5486
|
+
isHovered: false,
|
|
5487
|
+
isSelected: true
|
|
5488
|
+
};
|
|
5489
|
+
style = customStyle(selectedItem, context);
|
|
5490
|
+
} // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
|
|
5491
|
+
|
|
5492
|
+
|
|
5493
|
+
if (!style) {
|
|
5494
|
+
style = _activeStyle;
|
|
5495
|
+
}
|
|
5496
|
+
|
|
5497
|
+
drawPolygon({
|
|
5498
|
+
ctx: ctx,
|
|
5499
|
+
fillColor: style.fillColor,
|
|
5500
|
+
isDonutPolygon: selectedItem.isDonutPolygon || false,
|
|
5501
|
+
lineWidth: style.lineWidth,
|
|
5502
|
+
polygonOffsets: polygonOffsets,
|
|
5503
|
+
strokeColor: style.strokeColor
|
|
5504
|
+
});
|
|
5505
|
+
}
|
|
5506
|
+
} // 3. 호버된 항목 그리기 (가장 위에 표시)
|
|
5507
|
+
|
|
5508
|
+
|
|
5509
|
+
if (hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.paths) {
|
|
5510
|
+
var polygonOffsets = utils.getOrComputePolygonOffsets(hoveredItem); // 좌표 변환 실패 시 스킵 (return은 렌더링 함수 종료)
|
|
5511
|
+
|
|
5512
|
+
if (!polygonOffsets) return; // 성능 최적화: Set을 사용하여 O(1) 조회 (이전: O(m) some() 체크)
|
|
5513
|
+
|
|
5514
|
+
var isSelected = selectedIdsSet.has(hoveredItem.id); // customStyle이 있으면 우선 사용, 없거나 null/undefined 반환 시 기본 스타일 사용
|
|
5515
|
+
|
|
5516
|
+
var style = void 0;
|
|
5517
|
+
|
|
5518
|
+
if (customStyle) {
|
|
5519
|
+
var context = {
|
|
5520
|
+
isActive: isSelected && hoveredItem.id === selectedItemId,
|
|
5521
|
+
isHovered: !isSelected,
|
|
5522
|
+
isSelected: isSelected
|
|
5523
|
+
};
|
|
5524
|
+
style = customStyle(hoveredItem, context);
|
|
5525
|
+
} // customStyle이 없거나 null/undefined를 반환하면 기본 스타일 사용
|
|
5526
|
+
|
|
5527
|
+
|
|
5528
|
+
if (!style) {
|
|
5529
|
+
style = isSelected ? _activeStyle : _hoveredStyle;
|
|
5530
|
+
}
|
|
5531
|
+
|
|
5532
|
+
drawPolygon({
|
|
5533
|
+
ctx: ctx,
|
|
5534
|
+
fillColor: style.fillColor,
|
|
5535
|
+
isDonutPolygon: hoveredItem.isDonutPolygon || false,
|
|
5536
|
+
lineWidth: style.lineWidth,
|
|
5537
|
+
polygonOffsets: polygonOffsets,
|
|
5538
|
+
strokeColor: style.strokeColor
|
|
5539
|
+
});
|
|
5540
|
+
}
|
|
5541
|
+
};
|
|
5542
|
+
};
|
|
5146
5543
|
|
|
5147
5544
|
var CanvasPolygonLayer = function (props) {
|
|
5148
5545
|
var data = props.data,
|
|
@@ -5159,14 +5556,14 @@ var CanvasPolygonLayer = function (props) {
|
|
|
5159
5556
|
externalSelectedItem = props.selectedItem,
|
|
5160
5557
|
_e = props.disableInteraction,
|
|
5161
5558
|
disableInteraction = _e === void 0 ? false : _e,
|
|
5162
|
-
options = __rest(props, ["data", "onClick", "enableMultiSelect", "enableViewportCulling", "cullingMargin", "maxCacheSize", "selectedItems", "selectedItem", "disableInteraction"]); //
|
|
5559
|
+
options = __rest(props, ["data", "onClick", "enableMultiSelect", "enableViewportCulling", "cullingMargin", "maxCacheSize", "selectedItems", "selectedItem", "disableInteraction"]); // customStyle은 다른 방식과 함께 사용 가능
|
|
5163
5560
|
|
|
5164
5561
|
|
|
5165
|
-
var
|
|
5166
|
-
var isObjectMode =
|
|
5167
|
-
var isIndividualMode =
|
|
5562
|
+
var hasCustomStyle = 'customStyle' in props && props.customStyle !== undefined;
|
|
5563
|
+
var isObjectMode = 'renderStyle' in props && props.renderStyle !== undefined;
|
|
5564
|
+
var isIndividualMode = 'baseFillColor' in props && props.baseFillColor !== undefined; // 각 방식별 props 추출
|
|
5168
5565
|
|
|
5169
|
-
var
|
|
5566
|
+
var customStyle = hasCustomStyle ? props.customStyle : undefined;
|
|
5170
5567
|
var individualProps = isIndividualMode ? props : undefined;
|
|
5171
5568
|
var objectProps = isObjectMode ? props : undefined; // --------------------------------------------------------------------------
|
|
5172
5569
|
// Hooks & Context
|
|
@@ -5276,17 +5673,32 @@ var CanvasPolygonLayer = function (props) {
|
|
|
5276
5673
|
}; // 렌더링 함수 생성 (스타일 지정 방식에 따라 분기)
|
|
5277
5674
|
|
|
5278
5675
|
var renderBase;
|
|
5279
|
-
var renderEvent;
|
|
5280
|
-
|
|
5281
|
-
if (
|
|
5282
|
-
|
|
5283
|
-
|
|
5284
|
-
|
|
5285
|
-
|
|
5286
|
-
|
|
5676
|
+
var renderEvent; // customStyle이 있으면 하이브리드 방식 사용, 없으면 기존 방식 사용
|
|
5677
|
+
|
|
5678
|
+
if (isObjectMode && objectProps) {
|
|
5679
|
+
if (hasCustomStyle) {
|
|
5680
|
+
// customStyle + renderStyle 하이브리드
|
|
5681
|
+
renderBase = renderPolygonBaseWithHybridObject(customStyle, objectProps.renderStyle);
|
|
5682
|
+
renderEvent = renderPolygonEventWithHybridObject(customStyle, objectProps.renderStyle);
|
|
5683
|
+
} else {
|
|
5684
|
+
// renderStyle만 사용
|
|
5685
|
+
renderBase = renderPolygonBaseWithObject(objectProps.renderStyle);
|
|
5686
|
+
renderEvent = renderPolygonEventWithObject(objectProps.renderStyle);
|
|
5687
|
+
}
|
|
5287
5688
|
} else if (isIndividualMode && individualProps) {
|
|
5288
|
-
|
|
5289
|
-
|
|
5689
|
+
if (hasCustomStyle) {
|
|
5690
|
+
// customStyle + 개별 props 하이브리드
|
|
5691
|
+
renderBase = renderPolygonBaseWithHybrid(customStyle, individualProps.baseFillColor, individualProps.baseStrokeColor, individualProps.baseLineWidth);
|
|
5692
|
+
renderEvent = renderPolygonEventWithHybrid(customStyle, individualProps.baseFillColor, individualProps.baseStrokeColor, individualProps.baseLineWidth, individualProps.selectedFillColor, individualProps.selectedStrokeColor, individualProps.selectedLineWidth, individualProps.activeFillColor, individualProps.activeStrokeColor, individualProps.activeLineWidth, individualProps.hoveredFillColor, individualProps.hoveredStrokeColor, individualProps.hoveredLineWidth);
|
|
5693
|
+
} else {
|
|
5694
|
+
// 개별 props만 사용
|
|
5695
|
+
renderBase = renderPolygonBase(individualProps.baseFillColor, individualProps.baseStrokeColor, individualProps.baseLineWidth);
|
|
5696
|
+
renderEvent = renderPolygonEvent(individualProps.baseFillColor, individualProps.baseStrokeColor, individualProps.baseLineWidth, individualProps.selectedFillColor, individualProps.selectedStrokeColor, individualProps.selectedLineWidth, individualProps.activeFillColor, individualProps.activeStrokeColor, individualProps.activeLineWidth, individualProps.hoveredFillColor, individualProps.hoveredStrokeColor, individualProps.hoveredLineWidth);
|
|
5697
|
+
}
|
|
5698
|
+
} else if (hasCustomStyle && customStyle) {
|
|
5699
|
+
// customStyle만 사용 (기존 방식)
|
|
5700
|
+
renderBase = renderPolygonBaseWithCustomStyle(customStyle);
|
|
5701
|
+
renderEvent = renderPolygonEventWithCustomStyle(customStyle);
|
|
5290
5702
|
} else {
|
|
5291
5703
|
throw new Error('Invalid props: one of customStyle, renderStyle, or individual style props must be provided');
|
|
5292
5704
|
} // Base Layer 렌더링 (뷰포트 컬링 적용)
|