123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- import { css, cx } from "@linaria/core";
- import { Image, View } from "@queenjs/ui";
- import { Checkbox, Radio, RadioChangeEvent, Tag } from "ant-design-vue";
- import { defineUI, queenApi } from "queenjs";
- import { reactive } from "vue";
- import { any, bool, string } from "vue-types";
- import PreviewMaterialModal from "../../components/PreviewMaterialModal";
- const options = [
- { label: "1倍", value: 1 },
- { label: "2倍", value: 2 },
- ];
- export default defineUI({
- props: {
- type: string<"image" | "video">().def("image"),
- active: bool(),
- record: any(),
- },
- emits: ["select", "change"],
- setup(props, { emit }) {
- const state = reactive({
- qos: 1,
- });
- const change = (e: RadioChangeEvent) => {
- state.qos = e.target.value;
- emit("change", state.qos);
- };
- const showModal = () => {
- const { record, type } = props;
- const isVideo = type == "video";
- queenApi.dialog(
- <PreviewMaterialModal
- data={{
- url: isVideo ? record.videoUrl : record?.thumbnailUrl,
- fileType: type,
- }}
- />,
- {
- title: "预览渲染模板",
- width: "1000px",
- }
- );
- };
- return () => {
- const { active, record, type } = props;
- const isVideo = type == "video";
- return (
- <div class="cursor-pointer">
- <View
- ratio={1.4}
- onClick={() => emit("select")}
- class={cx(
- itemStyles,
- "relative overflow-hidden group",
- active && "active"
- )}
- >
- {isVideo && (
- <Tag color="#E88B00" class="absolute right-0 top-0 z-9 !mr-0">
- 视频
- </Tag>
- )}
- {active && (
- <Checkbox checked class="!-mt-0.2em absolute top-0 left-0 z-3" />
- )}
- {!isVideo ? (
- <Image class="h-1/1 w-1/1" src={record?.thumbnailUrl} />
- ) : (
- <video src={record.videoUrl} class="h-1/1 w-1/1 object-cover" />
- )}
- <span
- class="absolute left-1/2 top-1/2 z-3 transform -translate-x-1/2 -translate-y-1/2 rounded-1/2 w-56px leading-56px text-center bg-primary transition-all opacity-0 group-hover:opacity-100 hover:(bg-opacity-50)"
- onClick={(e) => {
- e.stopPropagation();
- showModal();
- }}
- >
- 预览
- </span>
- </View>
- <div>
- <div class="py-8px">
- 尺寸:{record.width} * {record.height}
- </div>
- <div>
- 渲染分辨率:
- <Radio.Group
- disabled={!props.active}
- value={state.qos}
- options={options}
- onChange={change}
- />
- </div>
- </div>
- </div>
- );
- };
- },
- });
- const itemStyles = css`
- border: 1px solid transparent;
- &.active {
- border-color: @inf-primary-color;
- }
- `;
|