123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- import { CompToolbars } from "@/modules/editor/objects/Toolbars";
- import { css } from "@linaria/core";
- import { defineComponent, onMounted, onUnmounted } from "vue";
- import { useEditor } from "../../../..";
- import { IconMove, IconRotate } from "@/assets/icons";
- export const Transfer = defineComponent({
- setup() {
- const editor = useEditor();
- const { store, controls, helper } = editor;
- const { transferCtrl } = controls;
- const { transferStyle } = transferCtrl;
- onMounted(() => {
- setTimeout(() => {
- const pageEl = helper.findRootComp()?.$el;
- if (pageEl) {
- transferCtrl.init(pageEl.firstChild as HTMLElement);
- }
- });
- });
- onUnmounted(() => {
- transferCtrl.destroy();
- console.log("transferCtrl.destroy========================")
- });
- return () => {
- const comp = transferCtrl.currComp;
- const toolbarOpts =
- CompToolbars[transferCtrl.currComp.compKey] || CompToolbars.default;
- // const showTransfer =
- // store.isEditComp || store.pageCompIds.includes(comp.id);
- const showTransfer = true;
- return (
- transferStyle.width && (
- <div
- class="transfer absolute"
- style={{
- top: transferStyle.top,
- left: transferStyle.left,
- width: transferStyle.width,
- }}
-
-
- >
- <div
- class={borderStyle}
- style={{
- width: transferStyle.width,
- height: transferStyle.height,
- }}
- />
- {showTransfer && (
- <>
- <div
- class={resizeStyle}
- style={{ marginBottom: "-" + transferStyle.height }}
- onMousedown={(e) =>
- transferCtrl.mousedown(
- e,
- comp.compKey === "Image" ? "resizeXY" : "scale"
- )
- }
- />
- <div class={toolbarStyle}>
- {toolbarOpts.map((item) => {
- return item.getVisible.call(editor, comp) ? (
- <item.component
- class="p-4px"
- value={item.getValue?.(comp)}
- onClick={() => item.onClick.call(editor, comp)}
- />
- ) : null;
- })}
- </div>
- <div
- class={transformBtnsStyle}
- style={{ marginBottom: "-" + transferStyle.height }}
- >
- <div
- class={transBtnStyle}
- onMousedown={(e) => transferCtrl.mousedown(e, "rotate")}
- >
- <IconRotate />
- </div>
- </div>
- <div
- class={resizeHeightBtnCls}
- style={{ top: transferStyle.height }}
- onMousedown={(e) => transferCtrl.mousedown(e, "resizeY")}
- />
- <div
- class={resizeWidthBtnCls}
- style={{ top: parseInt(transferStyle.height) / 2 + "px" }}
- onMousedown={(e) => transferCtrl.mousedown(e, "resizeX")}
- />
- </>
- )}
- </div>
- )
- );
- };
- },
- });
- const borderStyle = css`
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- outline: 2px solid @inf-primary-color;
- pointer-events: none;
- z-index: 999;
- `;
- const resizeStyle = css`
- position: absolute;
- bottom: 0;
- right: 0;
- width: 16px;
- height: 16px;
- border-radius: 50%;
- background-color: #fff;
- z-index: 999;
- transform: translate(50%, 50%);
- box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.2);
- cursor: nwse-resize;
- &:hover {
- border-color: @inf-primary-color;
- }
- `;
- const transformBtnsStyle = css`
- @apply space-x-10px whitespace-nowrap;
- position: absolute;
- bottom: 0;
- left: 50%;
- font-size: 16px;
- z-index: 999;
- transform: translate(-50%, 50px);
- `;
- const transBtnStyle = css`
- display: inline-block;
- width: 36px;
- height: 36px;
- border-radius: 50%;
- background-color: #fff;
- text-align: center;
- line-height: 36px;
- font-size: 20px;
- color: #333;
- @apply shadow cursor-move;
- &:hover {
- color: #fff;
- background-color: @inf-primary-color;
- }
- `;
- const toolbarStyle = css`
- @apply bg-white shadow rounded space-x-4px p-4px whitespace-nowrap;
- position: absolute;
- top: 0;
- left: 50%;
- transform: translate(-50%, -40px);
- z-index: 999;
- `;
- const resizeHeightBtnCls = css`
- position: absolute;
- width: 30px;
- height: 8px;
- border-radius: 4px;
- left: 50%;
- transform: translate(-50%, -4px);
- cursor: ns-resize;
- background: rgba(255, 255, 255, 0.3);
- &:hover {
- background: @inf-primary-color;
- }
- @apply shadow;
- z-index: 999;
- `;
- const resizeWidthBtnCls = css`
- position: absolute;
- width: 8px;
- height: 30px;
- border-radius: 4px;
- right: 0;
- transform: translate(4px, -50%);
- cursor: ew-resize;
- background: rgba(255, 255, 255, 0.3);
- &:hover {
- background: @inf-primary-color;
- }
- @apply shadow;
- z-index: 999;
- `;
|