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