|
@@ -260,145 +260,167 @@ export default defineComponent({
|
|
|
} catch (error) {}
|
|
|
});
|
|
|
return () => (
|
|
|
- <div
|
|
|
- id="selectionBox"
|
|
|
- class={[
|
|
|
- styles.selectionContainer,
|
|
|
- ]}
|
|
|
- onClick={(e: Event) => e.stopPropagation()}
|
|
|
- >
|
|
|
- {selectData.staves.map((item: any) => {
|
|
|
- // 评测得分
|
|
|
- const scoreItem = item.id && evaluatingData.evaluatings[item.measureListIndex];
|
|
|
- // for(let idx in evaluatingData.evaluatings) {
|
|
|
- // const { show, measureIndex } = evaluatingData.evaluatings[idx]
|
|
|
- // if (show && measureIndex !== item.measureListIndex) {
|
|
|
- // evaluatingData.evaluatings[idx].show = false
|
|
|
- // }
|
|
|
- // }
|
|
|
- // 高级模式下,显示节拍线
|
|
|
- // 不是报告模式
|
|
|
- // 不是多小节休止符
|
|
|
- // 节拍线开关
|
|
|
- // 当前小节
|
|
|
- // 当前小节
|
|
|
- const lineShow =
|
|
|
- !state.isReport &&
|
|
|
- metronomeData.cursorMode === 2 &&
|
|
|
- item.MeasureNumberXML === metronomeData.activeMetro?.measureNumberXML &&
|
|
|
- state.times[state.activeNoteIndex].MeasureNumberXML === item.MeasureNumberXML;
|
|
|
- return (
|
|
|
- <>
|
|
|
- {item.staveBox && (
|
|
|
- <div
|
|
|
- class={[
|
|
|
- styles.position,
|
|
|
- // scoreItem ? `scoreItemLeve${scoreItem.leve}` : "", // 去掉评测小节得分的背景色
|
|
|
- item.multipleRestMeasures <= 1 ? styles.staveBg : "",
|
|
|
- (state.platform === IPlatform.PC && state.zoom > 0.8) ? styles.linePC : '',
|
|
|
- ]}
|
|
|
- style={item.staveBox}
|
|
|
- onClick={() => handleSelection(item)}
|
|
|
- >
|
|
|
- {lineShow && (
|
|
|
- <div style={{height: selectData.measureHeight + 'px', position: 'relative'}}>
|
|
|
+ <>
|
|
|
+ <div class={styles.staveBgContainer}>
|
|
|
+ {
|
|
|
+ selectData.staves.map((item: any) => {
|
|
|
+ return (
|
|
|
+ <>
|
|
|
+ {
|
|
|
+ item.staveBox && item.multipleRestMeasures <= 1 &&
|
|
|
<div
|
|
|
- class={[
|
|
|
- styles.line,
|
|
|
- state.setting.eyeProtection ? styles.eyeLine : '',
|
|
|
- state.musicRenderType == EnumMusicRenderType.staff ? styles.lineStaff : styles.lineJianPu,
|
|
|
- ]}
|
|
|
- style={{ left: metronomeData.activeMetro.left }}></div>
|
|
|
- </div>
|
|
|
- )}
|
|
|
- {!state.isReport &&
|
|
|
- !!item.multipleRestMeasures &&
|
|
|
- state.activeMeasureIndex == item.MeasureNumberXML && (
|
|
|
- <div class={styles.dotWrap}>{item.multipleRestMeasures}</div>
|
|
|
- )}
|
|
|
- <Transition
|
|
|
- name="centerTop"
|
|
|
- onAfterEnter={() => {
|
|
|
- scoreItem.show = false;
|
|
|
- }}
|
|
|
+ style={{
|
|
|
+ left:item.staveBox.left,
|
|
|
+ top:`calc(${item.staveBox.top} + ${item.staveBox.height})`,
|
|
|
+ width:item.staveBox.width
|
|
|
+ }}
|
|
|
+ class={[styles.staveBg]}
|
|
|
+ ></div>
|
|
|
+ }
|
|
|
+ </>
|
|
|
+ )
|
|
|
+ })
|
|
|
+ }
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ id="selectionBox"
|
|
|
+ class={[
|
|
|
+ styles.selectionContainer,
|
|
|
+ ]}
|
|
|
+ onClick={(e: Event) => e.stopPropagation()}
|
|
|
+ >
|
|
|
+ {selectData.staves.map((item: any) => {
|
|
|
+ // 评测得分
|
|
|
+ const scoreItem = item.id && evaluatingData.evaluatings[item.measureListIndex];
|
|
|
+ // for(let idx in evaluatingData.evaluatings) {
|
|
|
+ // const { show, measureIndex } = evaluatingData.evaluatings[idx]
|
|
|
+ // if (show && measureIndex !== item.measureListIndex) {
|
|
|
+ // evaluatingData.evaluatings[idx].show = false
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // 高级模式下,显示节拍线
|
|
|
+ // 不是报告模式
|
|
|
+ // 不是多小节休止符
|
|
|
+ // 节拍线开关
|
|
|
+ // 当前小节
|
|
|
+ // 当前小节
|
|
|
+ const lineShow =
|
|
|
+ !state.isReport &&
|
|
|
+ metronomeData.cursorMode === 2 &&
|
|
|
+ item.MeasureNumberXML === metronomeData.activeMetro?.measureNumberXML &&
|
|
|
+ state.times[state.activeNoteIndex].MeasureNumberXML === item.MeasureNumberXML;
|
|
|
+ return (
|
|
|
+ <>
|
|
|
+ {item.staveBox && (
|
|
|
+ <div
|
|
|
+ class={[
|
|
|
+ styles.position,
|
|
|
+ // scoreItem ? `scoreItemLeve${scoreItem.leve}` : "", // 去掉评测小节得分的背景色
|
|
|
+ (state.platform === IPlatform.PC && state.zoom > 0.8) ? styles.linePC : '',
|
|
|
+ ]}
|
|
|
+ style={item.staveBox}
|
|
|
+ onClick={() => handleSelection(item)}
|
|
|
>
|
|
|
- {scoreItem?.show && (
|
|
|
- <div
|
|
|
- class={styles.scoreItem}
|
|
|
- style={{ color: leveByScoreMeasureIcons[scoreItem.leve]?.color || "" }}
|
|
|
- >
|
|
|
- <img src={leveByScoreMeasureIcons[scoreItem.leve]?.icon} />
|
|
|
- <span>{scoreItem.score}</span>
|
|
|
+ {lineShow && (
|
|
|
+ <div style={{height: selectData.measureHeight + 'px', position: 'relative'}}>
|
|
|
+ <div
|
|
|
+ class={[
|
|
|
+ styles.line,
|
|
|
+ state.setting.eyeProtection ? styles.eyeLine : '',
|
|
|
+ state.musicRenderType == EnumMusicRenderType.staff ? styles.lineStaff : styles.lineJianPu,
|
|
|
+ ]}
|
|
|
+ style={{ left: metronomeData.activeMetro.left }}></div>
|
|
|
</div>
|
|
|
)}
|
|
|
- </Transition>
|
|
|
- </div>
|
|
|
- )}
|
|
|
- </>
|
|
|
- );
|
|
|
- })}
|
|
|
- {selectData.notes.map((item: any) => {
|
|
|
- return (
|
|
|
- <div
|
|
|
- class={[styles.position, disableClickNote.value && styles.disable, styles.note, `noteIndex_${item.index}`]}
|
|
|
- style={item.bbox}
|
|
|
- onClick={() => skipNotePlay(item.index)}
|
|
|
- >
|
|
|
- {/* <div class={styles.noteFollow} data-vf={"vf" + item.id}>
|
|
|
- <Icon name="success" />
|
|
|
- <Icon name="cross" />
|
|
|
- </div> */}
|
|
|
- <div class={styles.noteFollow} data-vf={"vf" + item.id}>
|
|
|
- {/* <Icon name="success" />
|
|
|
- <Icon name="cross" /> */}
|
|
|
- <div class={[styles.followTipUp, 'tip-up']}>
|
|
|
- <img src={IntonationUp} />
|
|
|
- <span>音准<i>高了</i></span>
|
|
|
- </div>
|
|
|
- <div class={[styles.followTipDown, 'tip-down']}>
|
|
|
- <img src={IntonationDown} />
|
|
|
- <span>音准<i>低了</i></span>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div class={[styles.noteDot, 'node-dot']}></div>
|
|
|
- </div>
|
|
|
- );
|
|
|
- })}
|
|
|
- {/* 选段 */}
|
|
|
- {
|
|
|
- sectionPosData.value.map((item,index) =>{
|
|
|
+ {!state.isReport &&
|
|
|
+ !!item.multipleRestMeasures &&
|
|
|
+ state.activeMeasureIndex == item.MeasureNumberXML && (
|
|
|
+ <div class={styles.dotWrap}>{item.multipleRestMeasures}</div>
|
|
|
+ )}
|
|
|
+ <Transition
|
|
|
+ name="centerTop"
|
|
|
+ onAfterEnter={() => {
|
|
|
+ scoreItem.show = false;
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ {scoreItem?.show && (
|
|
|
+ <div
|
|
|
+ class={styles.scoreItem}
|
|
|
+ style={{ color: leveByScoreMeasureIcons[scoreItem.leve]?.color || "" }}
|
|
|
+ >
|
|
|
+ <img src={leveByScoreMeasureIcons[scoreItem.leve]?.icon} />
|
|
|
+ <span>{scoreItem.score}</span>
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
+ </Transition>
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
+ </>
|
|
|
+ );
|
|
|
+ })}
|
|
|
+ {selectData.notes.map((item: any) => {
|
|
|
return (
|
|
|
- item && <div class={styles.selectBox} style={item}>
|
|
|
- <div class={[styles.selectHandle,index>0&&styles.selectHandleRight,(state.playState==="play" || query.workRecord)&&styles.playIng]} onClick={()=>{
|
|
|
- // 如果选择了2个 删除左边的时候
|
|
|
- if(state.section.length===2&&index === 0){
|
|
|
- state.section = []
|
|
|
- // 重置速度和播放倍率
|
|
|
- resetBaseRate(state.activeNoteIndex);
|
|
|
- showToast({
|
|
|
- message: "请选择开始小节",
|
|
|
- duration: 0,
|
|
|
- position: "top",
|
|
|
- className: "selectionToast",
|
|
|
- });
|
|
|
- }else{
|
|
|
- state.section.splice(index,1)
|
|
|
- state.section = [...state.section] // 触发 watch
|
|
|
- showToast({
|
|
|
- message: state.section.length?"请选择结束小节":"请选择开始小节",
|
|
|
- duration: 0,
|
|
|
- position: "top",
|
|
|
- className: "selectionToast",
|
|
|
- });
|
|
|
- }
|
|
|
- }}></div>
|
|
|
+ <div
|
|
|
+ class={[styles.position, disableClickNote.value && styles.disable, styles.note, `noteIndex_${item.index}`]}
|
|
|
+ style={item.bbox}
|
|
|
+ onClick={() => skipNotePlay(item.index)}
|
|
|
+ >
|
|
|
+ {/* <div class={styles.noteFollow} data-vf={"vf" + item.id}>
|
|
|
+ <Icon name="success" />
|
|
|
+ <Icon name="cross" />
|
|
|
+ </div> */}
|
|
|
+ <div class={styles.noteFollow} data-vf={"vf" + item.id}>
|
|
|
+ {/* <Icon name="success" />
|
|
|
+ <Icon name="cross" /> */}
|
|
|
+ <div class={[styles.followTipUp, 'tip-up']}>
|
|
|
+ <img src={IntonationUp} />
|
|
|
+ <span>音准<i>高了</i></span>
|
|
|
+ </div>
|
|
|
+ <div class={[styles.followTipDown, 'tip-down']}>
|
|
|
+ <img src={IntonationDown} />
|
|
|
+ <span>音准<i>低了</i></span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class={[styles.noteDot, 'node-dot']}></div>
|
|
|
</div>
|
|
|
- )
|
|
|
- })
|
|
|
- }
|
|
|
- {/* 移动模块 */}
|
|
|
- {query.isMove == "1" && <MoveMusicScore />}
|
|
|
- </div>
|
|
|
+ );
|
|
|
+ })}
|
|
|
+ {/* 选段 */}
|
|
|
+ {
|
|
|
+ sectionPosData.value.map((item,index) =>{
|
|
|
+ return (
|
|
|
+ item && <div class={styles.selectBox} style={item}>
|
|
|
+ <div class={[styles.selectHandle,index>0&&styles.selectHandleRight,(state.playState==="play" || query.workRecord)&&styles.playIng]} onClick={()=>{
|
|
|
+ // 如果选择了2个 删除左边的时候
|
|
|
+ if(state.section.length===2&&index === 0){
|
|
|
+ state.section = []
|
|
|
+ // 重置速度和播放倍率
|
|
|
+ resetBaseRate(state.activeNoteIndex);
|
|
|
+ showToast({
|
|
|
+ message: "请选择开始小节",
|
|
|
+ duration: 0,
|
|
|
+ position: "top",
|
|
|
+ className: "selectionToast",
|
|
|
+ });
|
|
|
+ }else{
|
|
|
+ state.section.splice(index,1)
|
|
|
+ state.section = [...state.section] // 触发 watch
|
|
|
+ showToast({
|
|
|
+ message: state.section.length?"请选择结束小节":"请选择开始小节",
|
|
|
+ duration: 0,
|
|
|
+ position: "top",
|
|
|
+ className: "selectionToast",
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }}></div>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ })
|
|
|
+ }
|
|
|
+ {/* 移动模块 */}
|
|
|
+ {query.isMove == "1" && <MoveMusicScore />}
|
|
|
+ </div>
|
|
|
+ </>
|
|
|
);
|
|
|
},
|
|
|
});
|