Add demo
This commit is contained in:
parent
d5d3612fc1
commit
95aa9b8362
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