안녕하세요:) 개발자 우디입니다! 아래 내용 관련하여 작업 중이신 분들께 도움이되길 바라며 글을 공유하니 참고 부탁드립니다😊
(이번에 벨로그로 이사오면서 예전 글을 옮겨적었습니다. 이 점 양해 부탁드립니다!)
개괄하자면.
실제 코드 적용
데이터 불러오기
const gameEventData = this.props.projectContext.state.gameEventGraph;
데이터 바인딩
let lolHorizontalUpperBoxJoin = matchRange
.selectAll('rect.lolHorizontalUpperBox')
.data([data['matchRange']]); //array
// 데이터 수에 따라 엘리먼트 생성
lolHorizontalUpperBoxJoin.enter().append('rect').attr('class', 'lolHorizontalUpperBox');
시각화 요소 지정 & 사용자 반응 지정
let lolHorizontalUpperBoxJoinAll = gameEventGraph.selectAll('rect.lolHorizontalUpperBox');
lolHorizontalUpperBoxJoinAll
.attr('x', d => {
return d['start'];
})
.attr('y', 0)
.attr('width', d => {
return d['end'] - d['start'];
})
.attr('height', halfViewBoxHeight)
.attr('fill', RED_TEAM_BACKGROUND_COLOR_STR)
.on('mouseover', showUpperBoxTooltip)
.on('mousemove', moveTooltip)
.on('mouseleave', hideTooltip);
.on('click', buttonClick);
오브젝트에 마우스 호버 시 툴팁으로 추가 정보 제공하는 코드 추가
const tooltip = d3
.select('div#gameEventGraphTooltip')
.style('display', 'none');
showTooltip: 사용자가 각 오브젝트에 마우스 호버 시 툴팁 보여주는 메소드. 내부 메시지는 오브젝트 정보에 따라 달라짐.
showUpperBoxTooltip: 사용자 마우스가 상단 박스에 호버 시 툴팁 보여주는 메소드.
showLowerBoxTooltip: 사용자 마우스가 하단 박스에 호버 시 툴팁 보여주는 메소드.
moveTooltip: 사용자 마우스가 호버한 상태에서 움직일 경우의 메소드
hideTooltip: 사용자 마우스가 특정 영역을 호버했다가 벗어날 경우의 메소드.
let showTooltip = (e, d) => {
tooltip.transition().duration(100).style('display', 'block');
let rect = this.gameEventTrackRef.current.getBoundingClientRect();
let relativeX = e.pageX - rect.left;
tooltip
.html(this.getTooltipHtml(d))
.style('left', relativeX + 10 + 'px')
.style('top', '30px')
.style('padding', '8px 15px 8px 9px')
.style('background-color', TOOLTIP_BACKGROUND_COLOR);
};
let showUpperBoxTooltip = (e, d) => {
tooltip.transition().duration(100).style('display', 'block');
let rect = this.gameEventTrackRef.current.getBoundingClientRect();
let relativeX = e.pageX - rect.left;
tooltip
.html('...')
.style('left', relativeX + 10 + 'px').style('top', '30px')
.style('padding', '8px 15px 8px 9px')
.style('background-color', TOOLTIP_BACKGROUND_COLOR);
};
let showLowerBoxTooltip = (e, d) => {
tooltip.transition().duration(100).style('display', 'block');
let rect = this.gameEventTrackRef.current.getBoundingClientRect();
let relativeX = e.pageX - rect.left;
tooltip
.html('...')
.style('left', relativeX + 10 + 'px')
.style('top', '30px')
.style('padding', '8px 15px 8px 9px')
.style('background-color', TOOLTIP_BACKGROUND_COLOR);
};
let moveTooltip = (e, d) => {
let rect = this.gameEventTrackRef.current.getBoundingClientRect();
let relativeX = e.pageX - rect.left;
tooltip
.style('left', relativeX + 10 + 'px')
.style('top', '30px')
.style('padding', '8px 15px 8px 9px')
.style('background-color', TOOLTIP_BACKGROUND_COLOR);
};
let hideTooltip = (e, d) => {
tooltip.transition().duration(100).style('display', 'none');
};
getTooltipHtml = (d) => {
...생략...
return `${eventType}<br/>${startTime}`;
};
lolInhibitorRedYellowAll
...
.on('mouseover', showTooltip)
.on('mousemove', moveTooltip)
.on('mouseleave', hideTooltip)
...
클릭 이벤트 추가
let buttonClick = (e, d) => {
...생략...
};
lolInhibitorRedYellowAll
...
.on('click', buttonClick);
줌 속성에 따라 적절한 width 값으로 설정하기
getProperWidthOfObject = () => {
let targetUnitWidth = this.props.timelineContext.api.getTargetUnitWidth();
let defaultWidth = 50; // 단위: 초
let properWidth =
targetUnitWidth === 3600 //줌in 1회
? defaultWidth / 2
: targetUnitWidth === 7200 //줌in 2회
? defaultWidth / 4
: targetUnitWidth === 14400 //줌in 3회
? defaultWidth / 8
: defaultWidth;
return properWidth;
};
lolInhibitorRedYellowAll
...
.attr('width', this.getProperWidthOfObject())
...
.attr('preserveAspectRatio', 'none')