AlphaSliderFoundation.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import BaseFoundation, { DefaultAdapter } from "../base/foundation";
  2. import ColorPickerFoundation, { ColorPickerAdapter, ColorPickerProps, ColorPickerState } from "./foundation";
  3. import { HsvaColor } from "./interface";
  4. export interface AlphaSliderBaseProps {
  5. width: number;
  6. height: number;
  7. hsva: HsvaColor;
  8. handleSize: number;
  9. foundation: ColorPickerFoundation
  10. }
  11. export interface AlphaSliderBaseState {
  12. handlePosition: number;
  13. isHandleGrabbing: boolean
  14. }
  15. export interface AlphaSliderAdapter<P = Record<string, any>, S = Record<string, any>> extends DefaultAdapter<P, S> {
  16. handleMouseDown: (e: any) => void;
  17. handleMouseUp: (e: any) => void;
  18. getColorPickerFoundation: () => ColorPickerFoundation;
  19. getDOM: () => HTMLDivElement
  20. }
  21. class AlphaSliderFoundation extends BaseFoundation<AlphaSliderAdapter<AlphaSliderBaseProps, AlphaSliderBaseState>, AlphaSliderBaseProps, AlphaSliderBaseState> {
  22. constructor(adapter: AlphaSliderAdapter<AlphaSliderBaseProps, AlphaSliderBaseState>) {
  23. super({
  24. ...adapter
  25. });
  26. }
  27. handleMouseDown = (e: any) => {
  28. this._adapter.handleMouseDown(e);
  29. }
  30. handleMouseUp = (e: any) => {
  31. this._adapter.handleMouseUp(e);
  32. }
  33. setHandlePositionByMousePosition = (e: MouseEvent) => {
  34. const rect = this._adapter.getDOM()?.getBoundingClientRect();
  35. if (!rect) {
  36. return;
  37. }
  38. const { width, handleSize } = this._adapter.getProps();
  39. const colorPickerFoundation = this._adapter.getColorPickerFoundation();
  40. const mousePosition = e.clientX - rect.x;
  41. const handlePosition = colorPickerFoundation.getAlphaHandlePositionByMousePosition(mousePosition, width, handleSize);
  42. colorPickerFoundation.handleAlphaChangeByHandle({ a: Number((Math.min(Math.max(mousePosition / width, 0), 1)).toFixed(2)) });
  43. this.setState({ handlePosition });
  44. }
  45. }
  46. export default AlphaSliderFoundation;