@mint-ui/map 1.2.0-test.10 → 1.2.0-test.11
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/MintMapController.d.ts +1 -0
- package/dist/components/mint-map/core/advanced/woongCanvas/{WoongKonvaMarker.d.ts → WoongCanvasLayer.d.ts} +52 -13
- package/dist/components/mint-map/core/advanced/woongCanvas/{WoongKonvaMarker.js → WoongCanvasLayer.js} +39 -31
- package/dist/components/mint-map/core/advanced/woongCanvas/index.d.ts +2 -2
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/renderer.d.ts +59 -0
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/renderer.js +226 -0
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.d.ts +1 -0
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.js +18 -0
- package/dist/components/mint-map/core/wrapper/MapMarkerWrapper.js +22 -1
- package/dist/components/mint-map/google/GoogleMintMapController.d.ts +1 -0
- package/dist/components/mint-map/google/GoogleMintMapController.js +5 -1
- package/dist/components/mint-map/kakao/KakaoMintMapController.d.ts +1 -0
- package/dist/components/mint-map/kakao/KakaoMintMapController.js +5 -1
- package/dist/components/mint-map/naver/NaverMintMapController.d.ts +3 -0
- package/dist/components/mint-map/naver/NaverMintMapController.js +38 -4
- package/dist/index.es.js +341 -35
- package/dist/index.js +3 -2
- package/dist/index.umd.js +342 -35
- package/package.json +1 -1
|
@@ -24,6 +24,7 @@ export declare abstract class MintMapController {
|
|
|
24
24
|
abstract updateMarker(marker: Marker, options: MarkerOptions): void;
|
|
25
25
|
abstract clearDrawable(drawable: Drawable): boolean;
|
|
26
26
|
abstract markerToTheTop(marker: Marker): void;
|
|
27
|
+
abstract restoreMarkerZIndex(marker: Marker): void;
|
|
27
28
|
abstract isMapDragged(): boolean;
|
|
28
29
|
abstract setMapDragged(value: boolean): void;
|
|
29
30
|
abstract setMarkerZIndex(marker: Marker, zIndex: number): void;
|
|
@@ -4,26 +4,17 @@ import { KonvaCanvasMarkerData, CanvasDataType, CustomRenderBase, CustomRenderAn
|
|
|
4
4
|
export { KonvaMarkerProvider, LRUCache, SpatialHashGrid, CanvasDataType } from "./shared";
|
|
5
5
|
export type { KonvaCanvasMarkerOption, Paths, KonvaCanvasMarkerData, CustomRenderBase, CustomRenderAnimation, CustomRenderEvent, RenderUtils, RenderBaseParams, RenderAnimationParams, RenderEventParams } from "./shared";
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
* @template T 마커 데이터의 추가 속성 타입
|
|
7
|
+
* 공통 Props (MARKER와 POLYGON 모두 사용)
|
|
9
8
|
*/
|
|
10
|
-
|
|
9
|
+
interface WoongCanvasLayerBaseProps<T> extends Pick<MarkerOptions, 'zIndex' | 'anchor' | 'visible'> {
|
|
11
10
|
/** 렌더링할 마커 데이터 배열 */
|
|
12
11
|
markers: KonvaCanvasMarkerData<T>[];
|
|
13
|
-
/** 데이터 타입 (MARKER 또는 POLYGON) */
|
|
14
|
-
dataType: CanvasDataType;
|
|
15
12
|
/** 마커 클릭 시 호출되는 콜백 (선택) */
|
|
16
13
|
onClick?: (payload: KonvaCanvasMarkerData<T>, selectedIds: Set<string>) => void;
|
|
17
14
|
/** 마커에 마우스 오버 시 호출되는 콜백 (선택) */
|
|
18
15
|
onMouseOver?: (payload: KonvaCanvasMarkerData<T>) => void;
|
|
19
16
|
/** 마커에서 마우스 아웃 시 호출되는 콜백 (선택) */
|
|
20
17
|
onMouseOut?: (payload: KonvaCanvasMarkerData<T>) => void;
|
|
21
|
-
/** Base Layer 렌더링 함수 (필수) */
|
|
22
|
-
renderBase: CustomRenderBase<T>;
|
|
23
|
-
/** Animation Layer 렌더링 함수 (선택, 애니메이션용) */
|
|
24
|
-
renderAnimation?: CustomRenderAnimation<T>;
|
|
25
|
-
/** Event Layer 렌더링 함수 (선택) */
|
|
26
|
-
renderEvent?: CustomRenderEvent<T>;
|
|
27
18
|
/** 다중 선택 활성화 여부 (기본: false) */
|
|
28
19
|
enableMultiSelect?: boolean;
|
|
29
20
|
/** hover 시 마커를 최상단으로 표시 (기본: false) */
|
|
@@ -41,6 +32,54 @@ export interface WoongKonvaMarkerProps<T> extends Pick<MarkerOptions, 'zIndex' |
|
|
|
41
32
|
/** 상호작용 비활성화 (hover, click 등 모든 이벤트 차단) */
|
|
42
33
|
disableInteraction?: boolean;
|
|
43
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* MARKER 타입 Props - 커스텀 렌더링 필수
|
|
37
|
+
*/
|
|
38
|
+
interface WoongCanvasLayerPropsForMarker<T> extends WoongCanvasLayerBaseProps<T> {
|
|
39
|
+
/** 데이터 타입 */
|
|
40
|
+
dataType: CanvasDataType.MARKER;
|
|
41
|
+
/** Base Layer 렌더링 함수 (필수) */
|
|
42
|
+
renderBase: CustomRenderBase<T>;
|
|
43
|
+
/** Animation Layer 렌더링 함수 (선택, 애니메이션용) */
|
|
44
|
+
renderAnimation?: CustomRenderAnimation<T>;
|
|
45
|
+
/** Event Layer 렌더링 함수 (선택) */
|
|
46
|
+
renderEvent?: CustomRenderEvent<T>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* POLYGON 타입 Props - 스타일 속성으로 내부 처리
|
|
50
|
+
*/
|
|
51
|
+
interface WoongCanvasLayerPropsForPolygon<T> extends WoongCanvasLayerBaseProps<T> {
|
|
52
|
+
/** 데이터 타입 */
|
|
53
|
+
dataType: CanvasDataType.POLYGON;
|
|
54
|
+
/** 기본 폴리곤 채우기 색상 (필수) */
|
|
55
|
+
baseFillColor: string;
|
|
56
|
+
/** 기본 폴리곤 테두리 색상 (필수) */
|
|
57
|
+
baseStrokeColor: string;
|
|
58
|
+
/** 기본 폴리곤 테두리 두께 (필수) */
|
|
59
|
+
baseLineWidth: number;
|
|
60
|
+
/** 선택된 폴리곤 채우기 색상 (필수) */
|
|
61
|
+
selectedFillColor: string;
|
|
62
|
+
/** 선택된 폴리곤 테두리 색상 (필수) */
|
|
63
|
+
selectedStrokeColor: string;
|
|
64
|
+
/** 선택된 폴리곤 테두리 두께 (필수) */
|
|
65
|
+
selectedLineWidth: number;
|
|
66
|
+
/** 마지막 선택된 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor) */
|
|
67
|
+
activeFillColor?: string;
|
|
68
|
+
/** 마지막 선택된 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor) */
|
|
69
|
+
activeStrokeColor?: string;
|
|
70
|
+
/** 마지막 선택된 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth) */
|
|
71
|
+
activeLineWidth?: number;
|
|
72
|
+
/** Hover 시 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor) */
|
|
73
|
+
hoveredFillColor?: string;
|
|
74
|
+
/** Hover 시 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor) */
|
|
75
|
+
hoveredStrokeColor?: string;
|
|
76
|
+
/** Hover 시 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth) */
|
|
77
|
+
hoveredLineWidth?: number;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 최종 Props 타입 - Discriminated Union
|
|
81
|
+
*/
|
|
82
|
+
export declare type WoongCanvasLayerProps<T> = WoongCanvasLayerPropsForMarker<T> | WoongCanvasLayerPropsForPolygon<T>;
|
|
44
83
|
/**
|
|
45
84
|
* 🔥 React.memo 최적화: 마커 배열과 selectedItems 변경 체크
|
|
46
85
|
*
|
|
@@ -50,5 +89,5 @@ export interface WoongKonvaMarkerProps<T> extends Pick<MarkerOptions, 'zIndex' |
|
|
|
50
89
|
*
|
|
51
90
|
* 주의: JSON.stringify() 사용 금지! (매우 느림)
|
|
52
91
|
*/
|
|
53
|
-
declare const
|
|
54
|
-
export default
|
|
92
|
+
declare const WoongCanvasLayer: <T>(props: WoongCanvasLayerProps<T>) => React.ReactPortal;
|
|
93
|
+
export default WoongCanvasLayer;
|
|
@@ -14,6 +14,7 @@ var types = require('./shared/types.js');
|
|
|
14
14
|
var utils = require('./shared/utils.js');
|
|
15
15
|
var context = require('./shared/context.js');
|
|
16
16
|
var performance = require('./shared/performance.js');
|
|
17
|
+
var renderer = require('./shared/renderer.js');
|
|
17
18
|
|
|
18
19
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
19
20
|
|
|
@@ -35,30 +36,27 @@ var Konva__default = /*#__PURE__*/_interopDefaultLegacy(Konva);
|
|
|
35
36
|
* @template T 마커 데이터의 추가 속성 타입
|
|
36
37
|
*/
|
|
37
38
|
|
|
38
|
-
var
|
|
39
|
-
var markers =
|
|
40
|
-
dataType =
|
|
41
|
-
onClick =
|
|
42
|
-
onMouseOver =
|
|
43
|
-
onMouseOut =
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
_g = _a.disableInteraction,
|
|
60
|
-
disableInteraction = _g === void 0 ? false : _g,
|
|
61
|
-
options = tslib.__rest(_a, ["markers", "dataType", "onClick", "onMouseOver", "onMouseOut", "renderBase", "renderAnimation", "renderEvent", "enableMultiSelect", "topOnHover", "enableViewportCulling", "cullingMargin", "maxCacheSize", "selectedItems", "selectedItem", "disableInteraction"]); // --------------------------------------------------------------------------
|
|
39
|
+
var WoongCanvasLayerComponent = function (props) {
|
|
40
|
+
var markers = props.markers,
|
|
41
|
+
dataType = props.dataType,
|
|
42
|
+
onClick = props.onClick,
|
|
43
|
+
onMouseOver = props.onMouseOver,
|
|
44
|
+
onMouseOut = props.onMouseOut,
|
|
45
|
+
_a = props.enableMultiSelect,
|
|
46
|
+
enableMultiSelect = _a === void 0 ? false : _a,
|
|
47
|
+
_b = props.topOnHover,
|
|
48
|
+
topOnHover = _b === void 0 ? false : _b,
|
|
49
|
+
_c = props.enableViewportCulling,
|
|
50
|
+
enableViewportCulling = _c === void 0 ? true : _c,
|
|
51
|
+
_d = props.cullingMargin,
|
|
52
|
+
cullingMargin = _d === void 0 ? performance.DEFAULT_CULLING_MARGIN : _d,
|
|
53
|
+
_e = props.maxCacheSize,
|
|
54
|
+
maxCacheSize = _e === void 0 ? performance.DEFAULT_MAX_CACHE_SIZE : _e,
|
|
55
|
+
externalSelectedItems = props.selectedItems,
|
|
56
|
+
externalSelectedItem = props.selectedItem,
|
|
57
|
+
_f = props.disableInteraction,
|
|
58
|
+
disableInteraction = _f === void 0 ? false : _f,
|
|
59
|
+
options = tslib.__rest(props, ["markers", "dataType", "onClick", "onMouseOver", "onMouseOut", "enableMultiSelect", "topOnHover", "enableViewportCulling", "cullingMargin", "maxCacheSize", "selectedItems", "selectedItem", "disableInteraction"]); // --------------------------------------------------------------------------
|
|
62
60
|
// Hooks & Context
|
|
63
61
|
// --------------------------------------------------------------------------
|
|
64
62
|
|
|
@@ -336,7 +334,7 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
336
334
|
}
|
|
337
335
|
}
|
|
338
336
|
}; // --------------------------------------------------------------------------
|
|
339
|
-
// 렌더링 함수
|
|
337
|
+
// 렌더링 함수 결정 (dataType에 따라)
|
|
340
338
|
// --------------------------------------------------------------------------
|
|
341
339
|
|
|
342
340
|
/**
|
|
@@ -351,6 +349,18 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
351
349
|
/** Base Layer에서 사용할 빈 Set (재사용) */
|
|
352
350
|
|
|
353
351
|
React.useRef(new Set());
|
|
352
|
+
/**
|
|
353
|
+
* 실제 사용할 렌더링 함수 결정
|
|
354
|
+
* - MARKER: 외부에서 전달받은 renderBase 사용 (필수)
|
|
355
|
+
* - POLYGON: renderer.ts의 팩토리 함수로 생성 (props 기반)
|
|
356
|
+
*/
|
|
357
|
+
|
|
358
|
+
var renderBase = dataType === types.CanvasDataType.MARKER ? props.renderBase : renderer.renderPolygonBase(props.baseFillColor, props.baseStrokeColor, props.baseLineWidth);
|
|
359
|
+
var renderAnimation = dataType === types.CanvasDataType.MARKER ? props.renderAnimation : undefined;
|
|
360
|
+
var renderEvent = dataType === types.CanvasDataType.MARKER ? props.renderEvent : function () {
|
|
361
|
+
var polygonProps = props;
|
|
362
|
+
return renderer.renderPolygonEvent(polygonProps.selectedFillColor, polygonProps.selectedStrokeColor, polygonProps.selectedLineWidth, polygonProps.activeFillColor, polygonProps.activeStrokeColor, polygonProps.activeLineWidth, polygonProps.hoveredFillColor, polygonProps.hoveredStrokeColor, polygonProps.hoveredLineWidth);
|
|
363
|
+
}();
|
|
354
364
|
/**
|
|
355
365
|
* Base 레이어 렌더링 (뷰포트 컬링 적용, 선택된 마커 제외)
|
|
356
366
|
*
|
|
@@ -1056,13 +1066,11 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
1056
1066
|
}, [markers]);
|
|
1057
1067
|
return reactDom.createPortal(React__default["default"].createElement("div", {
|
|
1058
1068
|
ref: containerRef,
|
|
1059
|
-
style:
|
|
1069
|
+
style: {
|
|
1060
1070
|
position: 'absolute',
|
|
1061
1071
|
width: '100%',
|
|
1062
1072
|
height: '100%'
|
|
1063
|
-
}
|
|
1064
|
-
pointerEvents: 'none'
|
|
1065
|
-
})
|
|
1073
|
+
}
|
|
1066
1074
|
}), divElement);
|
|
1067
1075
|
};
|
|
1068
1076
|
/**
|
|
@@ -1076,7 +1084,7 @@ var WoongKonvaMarkerComponent = function (_a) {
|
|
|
1076
1084
|
*/
|
|
1077
1085
|
|
|
1078
1086
|
|
|
1079
|
-
var
|
|
1087
|
+
var WoongCanvasLayer = React__default["default"].memo(WoongCanvasLayerComponent, function (prevProps, nextProps) {
|
|
1080
1088
|
// 1. markers 비교
|
|
1081
1089
|
var prevMarkers = prevProps.markers;
|
|
1082
1090
|
var nextMarkers = nextProps.markers; // 참조가 같으면 스킵
|
|
@@ -1127,4 +1135,4 @@ Object.defineProperty(exports, 'CanvasDataType', {
|
|
|
1127
1135
|
exports.KonvaMarkerProvider = context.KonvaMarkerProvider;
|
|
1128
1136
|
exports.LRUCache = performance.LRUCache;
|
|
1129
1137
|
exports.SpatialHashGrid = performance.SpatialHashGrid;
|
|
1130
|
-
exports["default"] =
|
|
1138
|
+
exports["default"] = WoongCanvasLayer;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { default as
|
|
2
|
-
export * from "./
|
|
1
|
+
export { default as WoongCanvasLayer } from "./WoongCanvasLayer";
|
|
2
|
+
export * from "./WoongCanvasLayer";
|
|
3
3
|
export * from "./shared";
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 폴리곤 렌더링 유틸리티
|
|
3
|
+
*
|
|
4
|
+
* 이 파일은 폴리곤 렌더링을 위한 헬퍼 함수와 팩토리 함수를 제공합니다.
|
|
5
|
+
*/
|
|
6
|
+
import { CustomRenderBase, CustomRenderEvent, KonvaCanvasMarkerData } from "./types";
|
|
7
|
+
/**
|
|
8
|
+
* 폴리곤 그리기 헬퍼 함수 (도넛 폴리곤 지원)
|
|
9
|
+
*/
|
|
10
|
+
export declare const drawPolygon: ({ ctx, polygonOffsets, isDonutPolygon, fillColor, strokeColor, lineWidth }: {
|
|
11
|
+
ctx: CanvasRenderingContext2D;
|
|
12
|
+
polygonOffsets: number[][][][];
|
|
13
|
+
isDonutPolygon: boolean;
|
|
14
|
+
fillColor: string;
|
|
15
|
+
strokeColor: string;
|
|
16
|
+
lineWidth: number;
|
|
17
|
+
}) => void;
|
|
18
|
+
/**
|
|
19
|
+
* 폴리곤 Base 렌더링 함수
|
|
20
|
+
*
|
|
21
|
+
* @param baseFillColor 기본 폴리곤 채우기 색상
|
|
22
|
+
* @param baseStrokeColor 기본 폴리곤 테두리 색상
|
|
23
|
+
* @param baseLineWidth 기본 폴리곤 테두리 두께
|
|
24
|
+
* @returns Base Layer 렌더링 함수
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* const renderBase = renderPolygonBase(
|
|
28
|
+
* 'rgba(255, 100, 100, 0.5)',
|
|
29
|
+
* 'rgba(200, 50, 50, 0.8)',
|
|
30
|
+
* 2
|
|
31
|
+
* );
|
|
32
|
+
*/
|
|
33
|
+
export declare const renderPolygonBase: <T = any>(baseFillColor: string, baseStrokeColor: string, baseLineWidth: number) => CustomRenderBase<KonvaCanvasMarkerData<T>>;
|
|
34
|
+
/**
|
|
35
|
+
* 폴리곤 Event 렌더링 함수
|
|
36
|
+
*
|
|
37
|
+
* @param selectedFillColor 선택된 폴리곤 채우기 색상
|
|
38
|
+
* @param selectedStrokeColor 선택된 폴리곤 테두리 색상
|
|
39
|
+
* @param selectedLineWidth 선택된 폴리곤 테두리 두께
|
|
40
|
+
* @param activeFillColor 마지막 선택된 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
|
|
41
|
+
* @param activeStrokeColor 마지막 선택된 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
|
|
42
|
+
* @param activeLineWidth 마지막 선택된 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
|
|
43
|
+
* @param hoveredFillColor Hover 시 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
|
|
44
|
+
* @param hoveredStrokeColor Hover 시 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
|
|
45
|
+
* @param hoveredLineWidth Hover 시 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
|
|
46
|
+
* @returns Event Layer 렌더링 함수
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* const renderEvent = renderPolygonEvent(
|
|
50
|
+
* 'rgba(255, 193, 7, 0.7)',
|
|
51
|
+
* 'rgba(255, 152, 0, 1)',
|
|
52
|
+
* 4,
|
|
53
|
+
* 'rgba(255, 0, 0, 0.8)',
|
|
54
|
+
* undefined,
|
|
55
|
+
* undefined,
|
|
56
|
+
* 'rgba(100, 150, 255, 0.8)'
|
|
57
|
+
* );
|
|
58
|
+
*/
|
|
59
|
+
export declare const renderPolygonEvent: <T = any>(selectedFillColor: string, selectedStrokeColor: string, selectedLineWidth: number, activeFillColor?: string, activeStrokeColor?: string, activeLineWidth?: number, hoveredFillColor?: string, hoveredStrokeColor?: string, hoveredLineWidth?: number) => CustomRenderEvent<KonvaCanvasMarkerData<T>>;
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 폴리곤 렌더링 유틸리티
|
|
7
|
+
*
|
|
8
|
+
* 이 파일은 폴리곤 렌더링을 위한 헬퍼 함수와 팩토리 함수를 제공합니다.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 폴리곤 그리기 헬퍼 함수 (도넛 폴리곤 지원)
|
|
13
|
+
*/
|
|
14
|
+
var drawPolygon = function (_a) {
|
|
15
|
+
var ctx = _a.ctx,
|
|
16
|
+
polygonOffsets = _a.polygonOffsets,
|
|
17
|
+
isDonutPolygon = _a.isDonutPolygon,
|
|
18
|
+
fillColor = _a.fillColor,
|
|
19
|
+
strokeColor = _a.strokeColor,
|
|
20
|
+
lineWidth = _a.lineWidth;
|
|
21
|
+
|
|
22
|
+
for (var _i = 0, polygonOffsets_1 = polygonOffsets; _i < polygonOffsets_1.length; _i++) {
|
|
23
|
+
var multiPolygon = polygonOffsets_1[_i];
|
|
24
|
+
|
|
25
|
+
if (isDonutPolygon) {
|
|
26
|
+
ctx.beginPath(); // 1. 외부 폴리곤 그리기
|
|
27
|
+
|
|
28
|
+
if (multiPolygon[0] && multiPolygon[0].length > 0) {
|
|
29
|
+
ctx.moveTo(multiPolygon[0][0][0], multiPolygon[0][0][1]);
|
|
30
|
+
|
|
31
|
+
for (var i = 1; i < multiPolygon[0].length; i++) {
|
|
32
|
+
ctx.lineTo(multiPolygon[0][i][0], multiPolygon[0][i][1]);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
ctx.closePath();
|
|
36
|
+
} // 2. 내부 폴리곤 (구멍들) 그리기 - 같은 path에 추가
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
for (var j = 1; j < multiPolygon.length; j++) {
|
|
40
|
+
var innerPolygon = multiPolygon[j];
|
|
41
|
+
if (innerPolygon.length === 0) continue;
|
|
42
|
+
ctx.moveTo(innerPolygon[0][0], innerPolygon[0][1]);
|
|
43
|
+
|
|
44
|
+
for (var i = 1; i < innerPolygon.length; i++) {
|
|
45
|
+
ctx.lineTo(innerPolygon[i][0], innerPolygon[i][1]);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
ctx.closePath();
|
|
49
|
+
} // 3. evenodd fill rule로 구멍 뚫기
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
ctx.fillStyle = fillColor;
|
|
53
|
+
ctx.fill('evenodd'); // 4. 외곽선 그리기
|
|
54
|
+
|
|
55
|
+
ctx.strokeStyle = strokeColor;
|
|
56
|
+
ctx.lineWidth = lineWidth;
|
|
57
|
+
ctx.stroke();
|
|
58
|
+
} else {
|
|
59
|
+
// 일반 폴리곤
|
|
60
|
+
for (var _b = 0, multiPolygon_1 = multiPolygon; _b < multiPolygon_1.length; _b++) {
|
|
61
|
+
var polygonGroup = multiPolygon_1[_b];
|
|
62
|
+
if (!polygonGroup.length) continue;
|
|
63
|
+
ctx.beginPath();
|
|
64
|
+
var firstPoint = polygonGroup[0];
|
|
65
|
+
ctx.moveTo(firstPoint[0], firstPoint[1]);
|
|
66
|
+
|
|
67
|
+
for (var i = 1; i < polygonGroup.length; i++) {
|
|
68
|
+
var point = polygonGroup[i];
|
|
69
|
+
ctx.lineTo(point[0], point[1]);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
ctx.closePath();
|
|
73
|
+
ctx.fillStyle = fillColor;
|
|
74
|
+
ctx.strokeStyle = strokeColor;
|
|
75
|
+
ctx.lineWidth = lineWidth;
|
|
76
|
+
ctx.fill();
|
|
77
|
+
ctx.stroke();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* 폴리곤 Base 렌더링 함수
|
|
84
|
+
*
|
|
85
|
+
* @param baseFillColor 기본 폴리곤 채우기 색상
|
|
86
|
+
* @param baseStrokeColor 기본 폴리곤 테두리 색상
|
|
87
|
+
* @param baseLineWidth 기본 폴리곤 테두리 두께
|
|
88
|
+
* @returns Base Layer 렌더링 함수
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* const renderBase = renderPolygonBase(
|
|
92
|
+
* 'rgba(255, 100, 100, 0.5)',
|
|
93
|
+
* 'rgba(200, 50, 50, 0.8)',
|
|
94
|
+
* 2
|
|
95
|
+
* );
|
|
96
|
+
*/
|
|
97
|
+
|
|
98
|
+
var renderPolygonBase = function (baseFillColor, baseStrokeColor, baseLineWidth) {
|
|
99
|
+
return function (_a) {
|
|
100
|
+
var ctx = _a.ctx,
|
|
101
|
+
items = _a.items,
|
|
102
|
+
selectedIds = _a.selectedIds,
|
|
103
|
+
utils = _a.utils;
|
|
104
|
+
|
|
105
|
+
for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {
|
|
106
|
+
var item = items_1[_i]; // 선택된 항목은 Event Layer에서 그림
|
|
107
|
+
|
|
108
|
+
if (selectedIds.has(item.id)) continue;
|
|
109
|
+
if (!item.paths) continue;
|
|
110
|
+
var polygonOffsets = utils.getOrComputePolygonOffsets(item);
|
|
111
|
+
if (!polygonOffsets) continue;
|
|
112
|
+
drawPolygon({
|
|
113
|
+
ctx: ctx,
|
|
114
|
+
polygonOffsets: polygonOffsets,
|
|
115
|
+
isDonutPolygon: item.isDonutPolygon || false,
|
|
116
|
+
fillColor: baseFillColor,
|
|
117
|
+
strokeColor: baseStrokeColor,
|
|
118
|
+
lineWidth: baseLineWidth
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* 폴리곤 Event 렌더링 함수
|
|
125
|
+
*
|
|
126
|
+
* @param selectedFillColor 선택된 폴리곤 채우기 색상
|
|
127
|
+
* @param selectedStrokeColor 선택된 폴리곤 테두리 색상
|
|
128
|
+
* @param selectedLineWidth 선택된 폴리곤 테두리 두께
|
|
129
|
+
* @param activeFillColor 마지막 선택된 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
|
|
130
|
+
* @param activeStrokeColor 마지막 선택된 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
|
|
131
|
+
* @param activeLineWidth 마지막 선택된 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
|
|
132
|
+
* @param hoveredFillColor Hover 시 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
|
|
133
|
+
* @param hoveredStrokeColor Hover 시 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
|
|
134
|
+
* @param hoveredLineWidth Hover 시 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
|
|
135
|
+
* @returns Event Layer 렌더링 함수
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* const renderEvent = renderPolygonEvent(
|
|
139
|
+
* 'rgba(255, 193, 7, 0.7)',
|
|
140
|
+
* 'rgba(255, 152, 0, 1)',
|
|
141
|
+
* 4,
|
|
142
|
+
* 'rgba(255, 0, 0, 0.8)',
|
|
143
|
+
* undefined,
|
|
144
|
+
* undefined,
|
|
145
|
+
* 'rgba(100, 150, 255, 0.8)'
|
|
146
|
+
* );
|
|
147
|
+
*/
|
|
148
|
+
|
|
149
|
+
var renderPolygonEvent = function (selectedFillColor, selectedStrokeColor, selectedLineWidth, activeFillColor, activeStrokeColor, activeLineWidth, hoveredFillColor, hoveredStrokeColor, hoveredLineWidth) {
|
|
150
|
+
// 기본값 설정 (selected 기준)
|
|
151
|
+
var _activeFillColor = activeFillColor || selectedFillColor;
|
|
152
|
+
|
|
153
|
+
var _activeStrokeColor = activeStrokeColor || selectedStrokeColor;
|
|
154
|
+
|
|
155
|
+
var _activeLineWidth = activeLineWidth || selectedLineWidth;
|
|
156
|
+
|
|
157
|
+
var _hoveredFillColor = hoveredFillColor || selectedFillColor;
|
|
158
|
+
|
|
159
|
+
var _hoveredStrokeColor = hoveredStrokeColor || selectedStrokeColor;
|
|
160
|
+
|
|
161
|
+
var _hoveredLineWidth = hoveredLineWidth || selectedLineWidth;
|
|
162
|
+
|
|
163
|
+
return function (_a) {
|
|
164
|
+
var ctx = _a.ctx,
|
|
165
|
+
hoveredItem = _a.hoveredItem,
|
|
166
|
+
utils = _a.utils,
|
|
167
|
+
selectedItems = _a.selectedItems,
|
|
168
|
+
selectedItem = _a.selectedItem; // 1. 선택된 항목들 그리기 (마지막 선택 항목과 호버된 항목 제외)
|
|
169
|
+
|
|
170
|
+
if (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.length) {
|
|
171
|
+
for (var _i = 0, selectedItems_1 = selectedItems; _i < selectedItems_1.length; _i++) {
|
|
172
|
+
var item = selectedItems_1[_i]; // 마지막 선택 항목과 호버된 항목은 나중에 따로 그림
|
|
173
|
+
|
|
174
|
+
if (item.id === (selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.id) || (hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.id) === item.id) continue;
|
|
175
|
+
if (!item.paths) continue;
|
|
176
|
+
var polygonOffsets = utils.getOrComputePolygonOffsets(item);
|
|
177
|
+
if (!polygonOffsets) continue;
|
|
178
|
+
drawPolygon({
|
|
179
|
+
ctx: ctx,
|
|
180
|
+
polygonOffsets: polygonOffsets,
|
|
181
|
+
isDonutPolygon: item.isDonutPolygon || false,
|
|
182
|
+
fillColor: selectedFillColor,
|
|
183
|
+
strokeColor: selectedStrokeColor,
|
|
184
|
+
lineWidth: selectedLineWidth
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
} // 2. 마지막 선택된 항목 그리기 (호버되지 않은 경우)
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
if ((selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.paths) && (hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.id) !== selectedItem.id) {
|
|
191
|
+
var polygonOffsets = utils.getOrComputePolygonOffsets(selectedItem);
|
|
192
|
+
|
|
193
|
+
if (polygonOffsets) {
|
|
194
|
+
drawPolygon({
|
|
195
|
+
ctx: ctx,
|
|
196
|
+
polygonOffsets: polygonOffsets,
|
|
197
|
+
isDonutPolygon: selectedItem.isDonutPolygon || false,
|
|
198
|
+
fillColor: _activeFillColor,
|
|
199
|
+
strokeColor: _activeStrokeColor,
|
|
200
|
+
lineWidth: _activeLineWidth
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
} // 3. 호버된 항목 그리기 (가장 위에 표시)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
if (hoveredItem === null || hoveredItem === void 0 ? void 0 : hoveredItem.paths) {
|
|
207
|
+
var polygonOffsets = utils.getOrComputePolygonOffsets(hoveredItem);
|
|
208
|
+
if (!polygonOffsets) return;
|
|
209
|
+
var isSelected = selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.some(function (item) {
|
|
210
|
+
return item.id === hoveredItem.id;
|
|
211
|
+
});
|
|
212
|
+
drawPolygon({
|
|
213
|
+
ctx: ctx,
|
|
214
|
+
polygonOffsets: polygonOffsets,
|
|
215
|
+
isDonutPolygon: hoveredItem.isDonutPolygon || false,
|
|
216
|
+
fillColor: isSelected ? _activeFillColor : _hoveredFillColor,
|
|
217
|
+
strokeColor: isSelected ? _activeStrokeColor : _hoveredStrokeColor,
|
|
218
|
+
lineWidth: isSelected ? _activeLineWidth : _hoveredLineWidth
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
exports.drawPolygon = drawPolygon;
|
|
225
|
+
exports.renderPolygonBase = renderPolygonBase;
|
|
226
|
+
exports.renderPolygonEvent = renderPolygonEvent;
|
|
@@ -29,3 +29,4 @@ export declare const isPointInPolygonData: (clickedOffset: Offset, polygonData:
|
|
|
29
29
|
* 마커 히트 테스트
|
|
30
30
|
*/
|
|
31
31
|
export declare const isPointInMarkerData: (clickedOffset: Offset, markerData: KonvaCanvasMarkerData<any>, getMarkerOffset: (data: KonvaCanvasMarkerData<any>) => Offset | null) => boolean;
|
|
32
|
+
export declare const hexToRgba: (hexColor: string, alpha?: number) => string;
|
|
@@ -156,9 +156,27 @@ var isPointInMarkerData = function (clickedOffset, markerData, getMarkerOffset)
|
|
|
156
156
|
var y = markerOffset.y - boxHeight - tailHeight;
|
|
157
157
|
return clickedOffset.x >= x && clickedOffset.x <= x + boxWidth && clickedOffset.y >= y && clickedOffset.y <= y + boxHeight;
|
|
158
158
|
};
|
|
159
|
+
var hexToRgba = function (hexColor, alpha) {
|
|
160
|
+
if (alpha === void 0) {
|
|
161
|
+
alpha = 1;
|
|
162
|
+
} // NOTE: 입력된 hexColor에서 "#" 제거
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
var hex = hexColor.replace('#', ''); // NOTE: 6자리일 경우 알파 값은 사용자가 제공한 alpha 값으로 설정
|
|
166
|
+
|
|
167
|
+
if (hex.length === 6) {
|
|
168
|
+
var r = parseInt(hex.substring(0, 2), 16);
|
|
169
|
+
var g = parseInt(hex.substring(2, 4), 16);
|
|
170
|
+
var b = parseInt(hex.substring(4, 6), 16);
|
|
171
|
+
return "rgba(".concat(r, ", ").concat(g, ", ").concat(b, ", ").concat(alpha, ")");
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
throw new Error('Invalid hex color format');
|
|
175
|
+
};
|
|
159
176
|
|
|
160
177
|
exports.computeMarkerOffset = computeMarkerOffset;
|
|
161
178
|
exports.computePolygonOffsets = computePolygonOffsets;
|
|
179
|
+
exports.hexToRgba = hexToRgba;
|
|
162
180
|
exports.isPointInMarkerData = isPointInMarkerData;
|
|
163
181
|
exports.isPointInPolygon = isPointInPolygon;
|
|
164
182
|
exports.isPointInPolygonData = isPointInPolygonData;
|
|
@@ -172,7 +172,7 @@ function MapMarkerWrapper(_a) {
|
|
|
172
172
|
var onMouseOverHandler = function (e) {
|
|
173
173
|
var _a;
|
|
174
174
|
|
|
175
|
-
var marker = markerRef.current;
|
|
175
|
+
var marker = markerRef.current;
|
|
176
176
|
|
|
177
177
|
if (marker) {
|
|
178
178
|
var mouseOverHandler = (_a = options === null || options === void 0 ? void 0 : options.event) === null || _a === void 0 ? void 0 : _a.get('mouseover');
|
|
@@ -185,6 +185,25 @@ function MapMarkerWrapper(_a) {
|
|
|
185
185
|
|
|
186
186
|
next && topOnHover && controller.markerToTheTop(marker);
|
|
187
187
|
}
|
|
188
|
+
}; // 20251014 | 장한별 | mouseleave 이벤트 추가, 마우스가 마커 위에서 떠날 때 원래 zindex 를 복구하기 위함
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
var onMouseLeaveHandler = function (e) {
|
|
192
|
+
var _a;
|
|
193
|
+
|
|
194
|
+
var marker = markerRef.current;
|
|
195
|
+
|
|
196
|
+
if (marker) {
|
|
197
|
+
var mouseOutHandler = (_a = options === null || options === void 0 ? void 0 : options.event) === null || _a === void 0 ? void 0 : _a.get('mouseout');
|
|
198
|
+
var next = true;
|
|
199
|
+
|
|
200
|
+
if (mouseOutHandler) {
|
|
201
|
+
var hasNext = mouseOutHandler(e);
|
|
202
|
+
hasNext !== undefined && (next = hasNext);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
next && topOnHover && controller.restoreMarkerZIndex(marker);
|
|
206
|
+
}
|
|
188
207
|
}; //create object
|
|
189
208
|
|
|
190
209
|
|
|
@@ -202,10 +221,12 @@ function MapMarkerWrapper(_a) {
|
|
|
202
221
|
}); //드래그 여부 초기화를 먼저 수행하기 위해 capture : true 처리
|
|
203
222
|
|
|
204
223
|
divElement.addEventListener('mouseover', onMouseOverHandler);
|
|
224
|
+
divElement.addEventListener('mouseleave', onMouseLeaveHandler);
|
|
205
225
|
return function () {
|
|
206
226
|
divElement.removeEventListener('click', onClickHandler);
|
|
207
227
|
divElement.removeEventListener('mousedown', onMousedownHandler);
|
|
208
228
|
divElement.removeEventListener('mouseover', onMouseOverHandler);
|
|
229
|
+
divElement.removeEventListener('mouseleave', onMouseLeaveHandler);
|
|
209
230
|
|
|
210
231
|
if (markerRef.current) {
|
|
211
232
|
controller.clearDrawable(markerRef.current);
|
|
@@ -28,6 +28,7 @@ export declare class GoogleMintMapController extends MintMapController {
|
|
|
28
28
|
private getMaxZIndex;
|
|
29
29
|
setMarkerZIndex(marker: Marker, zIndex: number): void;
|
|
30
30
|
markerToTheTop(marker: Marker): void;
|
|
31
|
+
restoreMarkerZIndex(marker: Marker): void;
|
|
31
32
|
clearDrawable(drawable: Drawable): boolean;
|
|
32
33
|
private dragged;
|
|
33
34
|
isMapDragged(): boolean;
|
|
@@ -20,7 +20,7 @@ var polygon = require('../core/util/polygon.js');
|
|
|
20
20
|
require('../naver/NaverMintMapController.js');
|
|
21
21
|
require('../core/advanced/canvas/CanvasMarkerClaude.js');
|
|
22
22
|
require('../core/advanced/MapLoadingComponents.js');
|
|
23
|
-
require('../core/advanced/woongCanvas/
|
|
23
|
+
require('../core/advanced/woongCanvas/WoongCanvasLayer.js');
|
|
24
24
|
require('../core/advanced/woongCanvas/shared/types.js');
|
|
25
25
|
require('../core/advanced/woongCanvas/shared/context.js');
|
|
26
26
|
require('../core/advanced/woongCanvas/shared/performance.js');
|
|
@@ -340,6 +340,10 @@ function (_super) {
|
|
|
340
340
|
}
|
|
341
341
|
};
|
|
342
342
|
|
|
343
|
+
GoogleMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Google Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
|
|
344
|
+
// 이 기능은 Naver Maps에서만 사용 가능합니다.
|
|
345
|
+
};
|
|
346
|
+
|
|
343
347
|
GoogleMintMapController.prototype.clearDrawable = function (drawable) {
|
|
344
348
|
if (drawable && drawable.native) {
|
|
345
349
|
if (drawable.native instanceof google.maps.Marker || drawable.native instanceof google.maps.Polygon || drawable.native instanceof google.maps.Polyline) {
|
|
@@ -31,6 +31,7 @@ export declare class KakaoMintMapController extends MintMapController {
|
|
|
31
31
|
private getMaxZIndex;
|
|
32
32
|
setMarkerZIndex(marker: Marker, zIndex: number): void;
|
|
33
33
|
markerToTheTop(marker: Marker): void;
|
|
34
|
+
restoreMarkerZIndex(marker: Marker): void;
|
|
34
35
|
clearDrawable(drawable: Drawable): boolean;
|
|
35
36
|
private dragged;
|
|
36
37
|
isMapDragged(): boolean;
|
|
@@ -21,7 +21,7 @@ var polygon = require('../core/util/polygon.js');
|
|
|
21
21
|
require('../naver/NaverMintMapController.js');
|
|
22
22
|
require('../core/advanced/canvas/CanvasMarkerClaude.js');
|
|
23
23
|
require('../core/advanced/MapLoadingComponents.js');
|
|
24
|
-
require('../core/advanced/woongCanvas/
|
|
24
|
+
require('../core/advanced/woongCanvas/WoongCanvasLayer.js');
|
|
25
25
|
require('../core/advanced/woongCanvas/shared/types.js');
|
|
26
26
|
require('../core/advanced/woongCanvas/shared/context.js');
|
|
27
27
|
require('../core/advanced/woongCanvas/shared/performance.js');
|
|
@@ -348,6 +348,10 @@ function (_super) {
|
|
|
348
348
|
}
|
|
349
349
|
};
|
|
350
350
|
|
|
351
|
+
KakaoMintMapController.prototype.restoreMarkerZIndex = function (marker) {// Kakao Maps에서는 restoreMarkerZIndex 기능을 지원하지 않습니다.
|
|
352
|
+
// 이 기능은 Naver Maps에서만 사용 가능합니다.
|
|
353
|
+
};
|
|
354
|
+
|
|
351
355
|
KakaoMintMapController.prototype.clearDrawable = function (drawable) {
|
|
352
356
|
var _this = this;
|
|
353
357
|
|