// Copyright (c) 2022 Robin Davies // // Permission is hereby granted, free of charge, to any person obtaining a copy of // this software and associated documentation files (the "Software"), to deal in // the Software without restriction, including without limitation the rights to // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of // the Software, and to permit persons to whom the Software is furnished to do so, // subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. import React, {ReactNode, SyntheticEvent } from 'react'; import MenuItem from '@mui/material/MenuItem'; import Select from '@mui/material/Select'; import Switch from '@mui/material/Switch'; import { UiControl, ScalePoint } from './Lv2Plugin'; import { Theme } from '@mui/material/styles'; import WithStyles, {withTheme} from './WithStyles'; import { withStyles } from "tss-react/mui"; import {createStyles} from './WithStyles'; import { ZoomedControlInfo } from './PiPedalModel'; import DialogEx from './DialogEx'; import Typography from '@mui/material/Typography'; import { PiPedalModelFactory, PiPedalModel } from './PiPedalModel'; import ZoomedDial from './ZoomedDial'; import IconButtonEx from './IconButtonEx'; import NavigateBeforeIcon from '@mui/icons-material/NavigateBefore'; import NavigateNextIcon from '@mui/icons-material/NavigateNext'; const styles = (theme: Theme) => createStyles({ switchTrack: { height: '100%', width: '100%', borderRadius: 14 / 2, zIndex: -1, transition: theme.transitions.create(['opacity', 'background-color'], { duration: theme.transitions.duration.shortest }), backgroundColor: theme.palette.primary.main, opacity: theme.palette.mode === 'light' ? 0.38 : 0.3 } }); interface ZoomedUiControlProps extends WithStyles { theme: Theme; dialogOpen: boolean; onDialogClose: () => void; onDialogClosed: () => void; controlInfo: ZoomedControlInfo | undefined } interface ZoomedUiControlState { value: number } /* const Transition = React.forwardRef(function Transition( props: TransitionProps & { children?: React.ReactElement }, ref: React.Ref, ) { return ; }); */ const ZoomedUiControl = withTheme(withStyles( class extends React.Component { model: PiPedalModel; constructor(props: ZoomedUiControlProps) { super(props); this.model = PiPedalModelFactory.getInstance(); this.state = { value: this.getCurrentValue() }; } getCurrentValue(): number { if (!this.props.controlInfo) { return 0; } else { const uiControl = this.props.controlInfo.uiControl; const instanceId = this.props.controlInfo.instanceId; if (instanceId === -2 && uiControl.symbol === "volume_db") { return this.model.pedalboard.get()?.input_volume_db??0; } const pedalboardItem = this.model.pedalboard.get()?.getItem(instanceId); const value: number = pedalboardItem?.getControlValue(uiControl.symbol) ?? 0; return value; } } onSelectChanged(val: string | number) { const v = Number.parseFloat(val.toString()); this.setState({ value: v }); if (this.props.controlInfo) { this.model.setPedalboardControl( this.props.controlInfo.instanceId, this.props.controlInfo.uiControl.symbol, v); } } onCheckChanged(checked: boolean): void { const v = checked ? 1: 0; this.setState({ value: v }); if (this.props.controlInfo) { this.model.setPedalboardControl( this.props.controlInfo.instanceId, this.props.controlInfo.uiControl.symbol, v); } } hasControlChanged(oldProps: ZoomedUiControlProps, newProps: ZoomedUiControlProps) { if (oldProps.controlInfo === null) { return newProps.controlInfo !== null; } else if (newProps.controlInfo === null) { return oldProps.controlInfo !== null; } else { if (newProps.controlInfo?.instanceId !== oldProps.controlInfo?.instanceId) return true; if (newProps.controlInfo?.uiControl.symbol !== oldProps.controlInfo?.uiControl.symbol) return true; } return false; } componentDidUpdate(oldProps: ZoomedUiControlProps) { if (this.hasControlChanged(oldProps, this.props)) { const currentValue = this.getCurrentValue(); if (this.state.value !== currentValue) { this.setState({ value: this.getCurrentValue() }); } } } onDrag(e: SyntheticEvent) { e.preventDefault(); e.stopPropagation(); return false; } makeSelect(control: UiControl, value: number): ReactNode { const classes = withStyles.getClasses(this.props); if (control.isOnOffSwitch()) { // normal gray unchecked state. return ( { this.onCheckChanged(event.target.checked); }} /> ); } if (control.isAbToggle()) { // unchecked color is not gray. return ( { this.onCheckChanged(event.target.checked); }} classes={{ track: classes.switchTrack }} style={{ color: this.props.theme.palette.primary.main }} /> ); } else { return ( ); } } onDoubleTap() { const controlInfo = this.props.controlInfo; if (!controlInfo) return; const instanceId = controlInfo?.instanceId; const uiControl = controlInfo?.uiControl; this.model.setPedalboardControl(instanceId,uiControl.symbol,uiControl.default_value); } render() { if (!this.props.controlInfo) { return false; } const uiControl = this.props.controlInfo.uiControl; const displayValue = uiControl.formatDisplayValue(this.state.value) ?? ""; if (uiControl.isOnOffSwitch()) { displayValue = this.state.value !== 0 ? "On": "Off"; } else if (uiControl.isSelect()) { displayValue = "\u00A0"; } return ( { this.props.onDialogClose() }} onAbort={() => { this.props.onDialogClose() }} onEnterKey={()=>{/*nothing*/}} >
{ this.model.onNextZoomedControl(); } } >
{this.props.controlInfo.name} {(uiControl.isDial() || uiControl.isGraphicEq()) ? ( {this.onDoubleTap();}} onPreviewValue={(v) => { this.setState({ value: v }); }} onSetValue={(v) => { this.setState({ value: v }); if (this.props.controlInfo) { this.model.setPedalboardControl( this.props.controlInfo.instanceId, this.props.controlInfo.uiControl.symbol, v); } }} /> ) :
{this.makeSelect(uiControl,this.state.value)}
} {displayValue}
{ this.model.onPreviousZoomedControl(); } } >
); } }, styles)); export default ZoomedUiControl;