Add demo
This commit is contained in:
		
							
								
								
									
										235
									
								
								doric-demo/src/ColorPaletteDemo.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										235
									
								
								doric-demo/src/ColorPaletteDemo.tsx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,235 @@ | |||||||
|  | import { | ||||||
|  |   Panel, | ||||||
|  |   Group, | ||||||
|  |   jsx, | ||||||
|  |   VLayout, | ||||||
|  |   layoutConfig, | ||||||
|  |   Scroller, | ||||||
|  |   Color, | ||||||
|  |   HLayout, | ||||||
|  |   Text, | ||||||
|  |   Gravity, | ||||||
|  |   Stack, | ||||||
|  |   createRef, | ||||||
|  |   ViewHolder, | ||||||
|  |   ViewModel, | ||||||
|  |   VMPanel, | ||||||
|  |   modal, | ||||||
|  | } from "doric"; | ||||||
|  | import { SeekBar } from "./components/SeekBar"; | ||||||
|  | import { colors } from "./utils"; | ||||||
|  |  | ||||||
|  | interface ColorModel { | ||||||
|  |   color: number; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | class ColorVH extends ViewHolder { | ||||||
|  |   colorRef = createRef<Stack>(); | ||||||
|  |   colorLabelRef = createRef<Text>(); | ||||||
|  |   rSeekBar = createRef<SeekBar>(); | ||||||
|  |   gSeekBar = createRef<SeekBar>(); | ||||||
|  |   bSeekBar = createRef<SeekBar>(); | ||||||
|  |   aSeekBar = createRef<SeekBar>(); | ||||||
|  |  | ||||||
|  |   build(root: Group) { | ||||||
|  |     <Scroller parent={root} layoutConfig={layoutConfig().most()}> | ||||||
|  |       <VLayout layoutConfig={layoutConfig().mostWidth().fitHeight()} space={10}> | ||||||
|  |         <Stack | ||||||
|  |           ref={this.colorRef} | ||||||
|  |           layoutConfig={layoutConfig().just().configAlignment(Gravity.Center)} | ||||||
|  |           width={100} | ||||||
|  |           height={100} | ||||||
|  |         ></Stack> | ||||||
|  |         <Text | ||||||
|  |           textSize={16} | ||||||
|  |           layoutConfig={layoutConfig().fit().configAlignment(Gravity.Center)} | ||||||
|  |           ref={this.colorLabelRef} | ||||||
|  |         ></Text> | ||||||
|  |         <HLayout | ||||||
|  |           layoutConfig={layoutConfig().mostWidth().fitHeight()} | ||||||
|  |           space={10} | ||||||
|  |           gravity={Gravity.Center} | ||||||
|  |           padding={{ left: 10, right: 10 }} | ||||||
|  |         > | ||||||
|  |           <Text | ||||||
|  |             layoutConfig={layoutConfig().justWidth().justHeight()} | ||||||
|  |             width={50} | ||||||
|  |             height={30} | ||||||
|  |             textSize={20} | ||||||
|  |             textColor={Color.WHITE} | ||||||
|  |             backgroundColor={Color.RED} | ||||||
|  |           > | ||||||
|  |             R | ||||||
|  |           </Text> | ||||||
|  |           <SeekBar | ||||||
|  |             ref={this.rSeekBar} | ||||||
|  |             layoutConfig={layoutConfig().mostWidth().justHeight()} | ||||||
|  |             height={30} | ||||||
|  |             backgroundColor={colors[3].alpha(0.3)} | ||||||
|  |             contentColor={colors[1]} | ||||||
|  |           ></SeekBar> | ||||||
|  |         </HLayout> | ||||||
|  |         <HLayout | ||||||
|  |           layoutConfig={layoutConfig().mostWidth().fitHeight()} | ||||||
|  |           space={10} | ||||||
|  |           gravity={Gravity.Center} | ||||||
|  |           padding={{ left: 10, right: 10 }} | ||||||
|  |         > | ||||||
|  |           <Text | ||||||
|  |             layoutConfig={layoutConfig().justWidth().justHeight()} | ||||||
|  |             width={50} | ||||||
|  |             height={30} | ||||||
|  |             textSize={20} | ||||||
|  |             textColor={Color.WHITE} | ||||||
|  |             backgroundColor={Color.GREEN} | ||||||
|  |           > | ||||||
|  |             G | ||||||
|  |           </Text> | ||||||
|  |           <SeekBar | ||||||
|  |             ref={this.gSeekBar} | ||||||
|  |             layoutConfig={layoutConfig().mostWidth().justHeight()} | ||||||
|  |             height={30} | ||||||
|  |             backgroundColor={colors[3].alpha(0.3)} | ||||||
|  |             contentColor={colors[1]} | ||||||
|  |           ></SeekBar> | ||||||
|  |         </HLayout> | ||||||
|  |         <HLayout | ||||||
|  |           layoutConfig={layoutConfig().mostWidth().fitHeight()} | ||||||
|  |           space={10} | ||||||
|  |           gravity={Gravity.Center} | ||||||
|  |           padding={{ left: 10, right: 10 }} | ||||||
|  |         > | ||||||
|  |           <Text | ||||||
|  |             layoutConfig={layoutConfig().justWidth().justHeight()} | ||||||
|  |             width={50} | ||||||
|  |             height={30} | ||||||
|  |             textSize={20} | ||||||
|  |             textColor={Color.WHITE} | ||||||
|  |             backgroundColor={Color.BLUE} | ||||||
|  |           > | ||||||
|  |             B | ||||||
|  |           </Text> | ||||||
|  |           <SeekBar | ||||||
|  |             ref={this.bSeekBar} | ||||||
|  |             layoutConfig={layoutConfig().mostWidth().justHeight()} | ||||||
|  |             height={30} | ||||||
|  |             backgroundColor={colors[3].alpha(0.3)} | ||||||
|  |             contentColor={colors[1]} | ||||||
|  |           ></SeekBar> | ||||||
|  |         </HLayout> | ||||||
|  |         <HLayout | ||||||
|  |           layoutConfig={layoutConfig().mostWidth().fitHeight()} | ||||||
|  |           space={10} | ||||||
|  |           gravity={Gravity.Center} | ||||||
|  |           padding={{ left: 10, right: 10 }} | ||||||
|  |         > | ||||||
|  |           <Text | ||||||
|  |             layoutConfig={layoutConfig().justWidth().justHeight()} | ||||||
|  |             width={50} | ||||||
|  |             height={30} | ||||||
|  |             textSize={20} | ||||||
|  |             textColor={Color.WHITE} | ||||||
|  |             backgroundColor={Color.GRAY} | ||||||
|  |           > | ||||||
|  |             A | ||||||
|  |           </Text> | ||||||
|  |           <SeekBar | ||||||
|  |             ref={this.aSeekBar} | ||||||
|  |             layoutConfig={layoutConfig().mostWidth().justHeight()} | ||||||
|  |             height={30} | ||||||
|  |             backgroundColor={colors[3].alpha(0.3)} | ||||||
|  |             contentColor={colors[1]} | ||||||
|  |           ></SeekBar> | ||||||
|  |         </HLayout> | ||||||
|  |       </VLayout> | ||||||
|  |     </Scroller>; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | class ColorVM extends ViewModel<ColorModel, ColorVH> { | ||||||
|  |   onAttached(state: ColorModel, vh: ColorVH) { | ||||||
|  |     vh.rSeekBar.current.apply({ | ||||||
|  |       context: this.context, | ||||||
|  |       onProgressChanged: (progress: number) => { | ||||||
|  |         this.updateState((state) => { | ||||||
|  |           state.color = | ||||||
|  |             (state.color & 0xff00ffff) + | ||||||
|  |             ((Math.round(progress * 0xff) & 0xff) << 16); | ||||||
|  |         }); | ||||||
|  |       }, | ||||||
|  |     }); | ||||||
|  |     vh.gSeekBar.current.apply({ | ||||||
|  |       context: this.context, | ||||||
|  |       onProgressChanged: (progress: number) => { | ||||||
|  |         this.updateState((state) => { | ||||||
|  |           state.color = | ||||||
|  |             (state.color & 0xffff00ff) + | ||||||
|  |             ((Math.round(progress * 0xff) & 0xff) << 8); | ||||||
|  |         }); | ||||||
|  |       }, | ||||||
|  |     }); | ||||||
|  |     vh.bSeekBar.current.apply({ | ||||||
|  |       context: this.context, | ||||||
|  |       onProgressChanged: (progress: number) => { | ||||||
|  |         this.updateState((state) => { | ||||||
|  |           state.color = | ||||||
|  |             (state.color & 0xffffff00) + (Math.round(progress * 0xff) & 0xff); | ||||||
|  |         }); | ||||||
|  |       }, | ||||||
|  |     }); | ||||||
|  |     vh.aSeekBar.current.apply({ | ||||||
|  |       context: this.context, | ||||||
|  |       onProgressChanged: (progress: number) => { | ||||||
|  |         this.updateState((state) => { | ||||||
|  |           state.color = | ||||||
|  |             (state.color & 0x00ffffff) + | ||||||
|  |             ((Math.round(progress * 0xff) & 0xff) << 24); | ||||||
|  |         }); | ||||||
|  |       }, | ||||||
|  |     }); | ||||||
|  |     vh.colorLabelRef.current.apply({ | ||||||
|  |       onClick: async () => { | ||||||
|  |         const color = await modal(this.context).prompt({ | ||||||
|  |           title: "Please input color", | ||||||
|  |         }); | ||||||
|  |         this.updateState((state) => { | ||||||
|  |           state.color = parseInt(color, 16); | ||||||
|  |         }); | ||||||
|  |       }, | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  |   onBind(state: ColorModel, vh: ColorVH) { | ||||||
|  |     const color = state.color; | ||||||
|  |     const a = (color >> 24) & 0xff; | ||||||
|  |     const r = (color >> 16) & 0xff; | ||||||
|  |  | ||||||
|  |     const g = (color >> 8) & 0xff; | ||||||
|  |  | ||||||
|  |     const b = color & 0xff; | ||||||
|  |     vh.colorRef.current.backgroundColor = new Color(color); | ||||||
|  |     vh.colorLabelRef.current.text = `${a.toString(16)}${r.toString( | ||||||
|  |       16 | ||||||
|  |     )}${g.toString(16)}${b.toString(16)}`.toLocaleUpperCase(); | ||||||
|  |     vh.rSeekBar.current.progress = r / 0xff; | ||||||
|  |     vh.gSeekBar.current.progress = g / 0xff; | ||||||
|  |     vh.bSeekBar.current.progress = b / 0xff; | ||||||
|  |     vh.aSeekBar.current.progress = a / 0xff; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @Entry | ||||||
|  | export class ColorPalettePanel extends VMPanel<ColorModel, ColorVH> { | ||||||
|  |   getViewModelClass() { | ||||||
|  |     return ColorVM; | ||||||
|  |   } | ||||||
|  |   getState() { | ||||||
|  |     const val = Math.floor(0xff * 0.3); | ||||||
|  |     let color = val | ((val << 8) | (val << 16) | 0xff000000); | ||||||
|  |     return { | ||||||
|  |       color, | ||||||
|  |     }; | ||||||
|  |   } | ||||||
|  |   getViewHolderClass() { | ||||||
|  |     return ColorVH; | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										69
									
								
								doric-demo/src/components/SeekBar.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								doric-demo/src/components/SeekBar.tsx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | |||||||
|  | import { | ||||||
|  |   GestureContainer, | ||||||
|  |   ViewComponent, | ||||||
|  |   Stack, | ||||||
|  |   Color, | ||||||
|  |   LayoutSpec, | ||||||
|  |   BridgeContext, | ||||||
|  |   loge, | ||||||
|  |   Panel, | ||||||
|  | } from "doric"; | ||||||
|  |  | ||||||
|  | @ViewComponent | ||||||
|  | export class SeekBar extends GestureContainer { | ||||||
|  |   private content: Stack; | ||||||
|  |   private maxWidth = 0; | ||||||
|  |   context?: BridgeContext; | ||||||
|  |   onProgressChanged?: (progress: number) => void; | ||||||
|  |  | ||||||
|  |   set progress(progress: number) { | ||||||
|  |     if (this.maxWidth === 0) { | ||||||
|  |       Promise.resolve().then(() => { | ||||||
|  |         if (this.context) { | ||||||
|  |           (this.context.entity as Panel).addOnRenderFinishedCallback( | ||||||
|  |             async () => { | ||||||
|  |               this.maxWidth = await this.getWidth(this.context!!); | ||||||
|  |               this.content.width = this.maxWidth * progress; | ||||||
|  |             } | ||||||
|  |           ); | ||||||
|  |         } | ||||||
|  |       }); | ||||||
|  |     } else { | ||||||
|  |       this.content.width = this.maxWidth * progress; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   constructor() { | ||||||
|  |     super(); | ||||||
|  |     this.content = new Stack(); | ||||||
|  |     this.content.layoutConfig = { | ||||||
|  |       widthSpec: LayoutSpec.JUST, | ||||||
|  |       heightSpec: LayoutSpec.MOST, | ||||||
|  |     }; | ||||||
|  |     this.content.backgroundColor = Color.RED; | ||||||
|  |     this.onTouchDown = async (event) => { | ||||||
|  |       if (!this.context) { | ||||||
|  |         return; | ||||||
|  |       } | ||||||
|  |       this.maxWidth = await this.getWidth(this.context); | ||||||
|  |       event.x = Math.max(0, event.x); | ||||||
|  |       this.content.width = event.x; | ||||||
|  |       this.onProgressChanged?.( | ||||||
|  |         Math.max(0, Math.min(1, event.x / this.maxWidth)) | ||||||
|  |       ); | ||||||
|  |     }; | ||||||
|  |     this.onTouchMove = async (event) => { | ||||||
|  |       if (!this.context) { | ||||||
|  |         return; | ||||||
|  |       } | ||||||
|  |       event.x = Math.max(0, event.x); | ||||||
|  |       this.content.width = event.x; | ||||||
|  |       this.onProgressChanged?.( | ||||||
|  |         Math.max(0, Math.min(1, event.x / this.maxWidth)) | ||||||
|  |       ); | ||||||
|  |     }; | ||||||
|  |     this.addChild(this.content); | ||||||
|  |   } | ||||||
|  |   set contentColor(color: Color) { | ||||||
|  |     this.content.backgroundColor = color; | ||||||
|  |   } | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user