ebc8f469创建于 2020年5月10日历史提交
import paper from 'paper';
import { colors } from '../colors';

type buttonOptions = {
  alpha?: number
  highlightedColor?: paper.Color
  selectedColor?: paper.Color
  disabledColor?: paper.Color
};
export function createButton(item, buttonSize: number, onClick, options?: buttonOptions) {
  const alpha = options?.alpha ?? 0.0001;
  const highlightedColor = options?.highlightedColor?.clone() ?? colors.sand.color.clone();
  const selectedColor = options?.selectedColor?.clone() ?? colors.npc.color.clone();
  const disabledColor = options?.disabledColor?.clone() ?? null;

  const group = new paper.Group();

  const button = new paper.Path.Circle(new paper.Point(0, 0), buttonSize);

  group.applyMatrix = false;
  group.addChildren([button, item]);

  function updateColor(btn: paper.Path.Circle) {
    btn.fillColor =
      (group.data.disabled && disabledColor) ? disabledColor
      : (group.data.selected || group.data.pressed) ? selectedColor
      : highlightedColor;

    if (group.data.selected) {
      btn.fillColor.alpha = 1;
    } else if (group.data.pressed) {
      btn.fillColor.alpha = 0.5;
    } else if (group.data.hovered) {
      btn.fillColor.alpha = 1;
    } else {
      btn.fillColor.alpha = alpha;
    }
  }
  updateColor(button);

  group.data = {
    selected: false,
    hovered: false,
    pressed: false,
    disabled: false,
    select(isSelected) {
      group.data.selected = isSelected;
      updateColor(button);
    },
    hover(isHover) {
      group.data.hovered = isHover;
      updateColor(button);
    },
    press(isPressed) {
      group.data.pressed = isPressed;
      updateColor(button);
    },
    disable(isDisabled) {
      group.data.disabled = isDisabled;
      item.opacity = isDisabled ? 0.5 : 1;
      updateColor(button);
      if (isDisabled) {
        group.data.hover(false);
      }
    },
  };
  group.onMouseEnter = function () {
    if (group.data.disabled) {
      return;
    }
    group.data.hover(true);
  };
  group.onMouseLeave = function () {
    if (group.data.disabled) {
      return;
    }
    group.data.press(false);
    group.data.hover(false);
  };
  group.onMouseDown = function () {
    if (group.data.disabled) {
      return;
    }
    group.data.press(true);
  };
  group.onMouseUp = function (event) {
    if (group.data.disabled) {
      return;
    }
    if (group.data.pressed) {
      onClick(event, group);
    }
    group.data.press(false);
  };
  return group;
}