2024-09-30 15:54:09 +05:30
import Widget from "../../../canvas/widgets/base"
import Tools from "../../../canvas/constants/tools"
import { convertObjectToKeyValueString , removeKeyFromObject } from "../../../utils/common"
2024-09-30 19:13:26 +05:30
import { CustomTkWidgetBase } from "./base"
2024-09-30 15:54:09 +05:30
2024-09-30 19:13:26 +05:30
class Slider extends CustomTkWidgetBase {
2024-09-30 15:54:09 +05:30
static widgetType = "scale"
// FIXME: You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use
constructor ( props ) {
super ( props )
this . state = {
... this . state ,
widgetName : "Scale" ,
size : { width : 'fit' , height : 'fit' } ,
attrs : {
... this . state . attrs ,
styling : {
... this . state . attrs . styling ,
// TODO: trough color
troughColor : {
label : "Trough Color" ,
tool : Tools . COLOR _PICKER ,
value : "#fff" ,
onChange : ( value ) => {
// this.setWidgetInnerStyle("color", value)
this . setAttrValue ( "styling.troughColor" , value )
}
}
} ,
scale : {
label : "Scale" ,
display : "horizontal" ,
min : {
label : "Min" ,
tool : Tools . NUMBER _INPUT , // the tool to display, can be either HTML ELement or a constant string
toolProps : { placeholder : "min" } ,
value : 0 ,
onChange : ( value ) => this . setAttrValue ( "scale.min" , value )
} ,
max : {
label : "Max" ,
tool : Tools . NUMBER _INPUT ,
toolProps : { placeholder : "max" } ,
value : 100 ,
onChange : ( value ) => this . setAttrValue ( "scale.max" , value )
} ,
step : {
label : "Step" ,
tool : Tools . NUMBER _INPUT ,
toolProps : { placeholder : "max" , stringMode : true , step : "0.1" } ,
value : 1 ,
onChange : ( value ) => this . setAttrValue ( "scale.step" , value )
} ,
default : {
label : "Default" ,
tool : Tools . NUMBER _INPUT ,
toolProps : { placeholder : "max" , stringMode : true , step : "0.1" } ,
value : 0 ,
onChange : ( value ) => this . setAttrValue ( "scale.default" , value )
}
} ,
orientation : {
label : "Orientation" ,
tool : Tools . SELECT _DROPDOWN ,
toolProps : { placeholder : "select orientation" } ,
value : "" ,
options : [ { value : "horizontal" , label : "horizontal" } , { value : "vertical" , label : "vertical" } ] ,
onChange : ( value ) => {
// const widgetStyling = {
// transformOrigin: "0 0",
// transform: value === "horizontal" ? "rotate(0deg)" : "rotate(90deg)"
// }
// this.setState((prev) => ({
// widgetOuterStyling: {...prev, ...widgetStyling}
// }))
// this.setWidgetOuterStyle("transform-origin", "0 0")
// this.setWidgetOuterStyle("transform", value === "horizontal" ? "rotate(0deg)" : "rotate(90deg)")
this . setAttrValue ( "orientation" , value )
}
} ,
}
}
}
componentDidMount ( ) {
super . componentDidMount ( )
this . setAttrValue ( "styling.backgroundColor" , "#fff" )
}
generateCode ( variableName , parent ) {
// TODO: add orientation
const config = this . getConfigCode ( )
config [ "from_" ] = this . getAttrValue ( "scale.min" )
config [ "to" ] = this . getAttrValue ( "scale.max" )
config [ "resolution" ] = this . getAttrValue ( "scale.step" )
if ( this . getAttrValue ( "orientation" ) ) {
config [ "orientation" ] = this . getAttrValue ( "orientation" )
}
const defaultValue = this . getAttrValue ( "scale.default" )
return [
2024-09-30 19:13:26 +05:30
` ${ variableName } _var = ctk.DoubleVar(value= ${ defaultValue } ) ` ,
` ${ variableName } = ctk.CTkSlider(master= ${ parent } , variable= ${ variableName } _var) ` ,
` ${ variableName } .configure( ${ convertObjectToKeyValueString ( config ) } ) ` ,
2024-09-30 15:54:09 +05:30
` ${ variableName } . ${ this . getLayoutCode ( ) } `
]
}
getToolbarAttrs ( ) {
const toolBarAttrs = super . getToolbarAttrs ( )
return ( {
id : this . _ _id ,
widgetName : toolBarAttrs . widgetName ,
placeHolder : this . state . attrs . placeHolder ,
size : toolBarAttrs . size ,
... this . state . attrs ,
} )
}
renderContent ( ) {
return (
< div className = "tw-w-flex tw-flex-col tw-w-full tw-h-full tw-rounded-md tw-overflow-hidden" >
< div className = " flex flex - col items - center justify - center h - screen
bg - gray - 100 " style = { this . getInnerRenderStyling ( ) } >
< div className = "w-full max-w-md" >
< input
type = "range"
min = { this . getAttrValue ( "scale.min" ) }
max = { this . getAttrValue ( "scale.max" ) }
step = { this . getAttrValue ( "scale.step" ) }
value = { this . getAttrValue ( "scale.default" ) }
style = { { backgroundColor : this . getAttrValue ( "styling.troughColor" ) } }
className = "tw-pointer-events-none w-full h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer accent-blue-500"
/ >
< / d i v >
< / d i v >
< / d i v >
)
}
}
export default Slider