<template>
  <q-dialog
    persistent
    v-model="show_dialog"
    @before-hide="resetData"
    @keydown="
      (evt) => {
        if (!loading && evt.keyCode == 27) {
          show_dialog = false;
        }
        if (
          evt.keyCode == 37 &&
          (current_index != -1 || multiple_select.length > 1)
        ) {
          //左
          sub_x();
        }
        if (
          evt.keyCode == 38 &&
          (current_index != -1 || multiple_select.length > 1)
        ) {
          //上
          sub_y();
        }
        if (
          evt.keyCode == 39 &&
          (current_index != -1 || multiple_select.length > 1)
        ) {
          //右
          add_x();
        }
        if (
          evt.keyCode == 40 &&
          (current_index != -1 || multiple_select.length > 1)
        ) {
          //下
          add_y();
        }
        if (evt.keyCode == 17) {
          //ctrl
          multiple = true;
        }
        //对齐
        if (evt.keyCode == 87 && multiple_select.length > 1) {
          //上
          alignTop();
        }
        if (evt.keyCode == 83 && multiple_select.length > 1) {
          //下
          alignBottom();
        }
        if (evt.keyCode == 65 && multiple_select.length > 1) {
          //左
          alignLeft();
        }
        if (evt.keyCode == 68 && multiple_select.length > 1) {
          //右
          alignRight();
        }
        //保存魔墙配置
        if (evt.keyCode == 83 && evt.shiftKey) {
          //右
          export_magic_wall();
        }
      }
    "
    @keyup="
      (evt) => {
        if (evt.keyCode == 17) {
          //ctrl
          multiple = false;
        }
      }
    "
  >
    <q-card class="overflow-hidden" style="max-width: 60vw">
      <q-form @submit="onSubmit">
        <q-card-section class="q-ma-none q-pa-sm">
          <div class="row">
            <div class="col-auto text-h6">
              {{ $t("magic wall") }}
            </div>
            <q-space />
            <div>
              <q-btn
                :loading="loading"
                flat
                round
                :disable="loading"
                icon="close"
                color="red"
                v-close-popup
                @click="close_magic_switch()"
              >
                <q-tooltip>
                  {{ $t("close") }}
                </q-tooltip>
              </q-btn>
            </div>
          </div>
        </q-card-section>

        <q-separator />

        <q-card-section style="max-height: 80vh; width: 55vw" class="q-pa-none">
          <q-scroll-area style="height: 70vh">
            <q-card class="my-card" flat bordered>
              <q-card-section horizontal>
                <q-card-section class="col-3" style="">
                  <div class="text-h5">{{ $t("angle") }}</div>
                  <q-separator />
                  <br />
                  <div class="row no-wrap items-center">
                    <q-item>
                      <q-item-section avatar>
                        <span class="q-mb-md" style="font-size: 1rem">
                          angle:</span
                        >
                      </q-item-section>
                      <q-item-section>
                        <q-input
                          v-if="current_index > -1"
                          type="number"
                          min="0"
                          v-model="test_monitor_wall[current_index].angle"
                          @keydown="testLog($event)"
                          oninput="if(value<0)value=0;if(value>360)value=360;"
                          hint=""
                          @update:model-value="changeAngle()"
                        >
                          <template v-slot:append>
                            <span class="input_append">°</span>
                          </template>
                        </q-input>
                        <q-input
                          v-else
                          type="number"
                          min="0"
                          :model-value="0"
                          :disable="true"
                          hint=""
                        >
                          <template v-slot:append>
                            <span class="input_append">°</span>
                          </template>
                        </q-input>
                      </q-item-section>
                    </q-item>
                  </div>
                  <br />
                  <div class="text-h5">
                    {{ $t("physical central location") }}
                  </div>
                  <q-separator />
                  <br />
                  <div class="row no-wrap items-center">
                    <q-item>
                      <q-item-section avatar>
                        <span class="q-mb-md">X:</span>
                      </q-item-section>
                      <q-item-section>
                        <q-input
                          v-if="current_index > -1"
                          type="number"
                          :min="min_x()"
                          v-model="test_monitor_wall[current_index].centerx"
                          @update:model-value="center_x()"
                          @keydown="testLog($event)"
                          :max="max_x()"
                          :rules="[
                            (val) =>
                              (val != null &&
                                val != undefined &&
                                val.toString().length > 0) ||
                              $t('Please type something'),
                            (val) =>
                              parseInt(val) >= 0 ||
                              $t('the number must be greater than 0'),
                          ]"
                          lazy-rules
                          hint=""
                        >
                          <template v-slot:append>
                            <span class="input_append text-h6">px</span>
                          </template>
                        </q-input>
                        <q-input
                          v-else
                          type="number"
                          min="0"
                          :model-value="0"
                          :disable="true"
                          hint=""
                        >
                          <template v-slot:append>
                            <span class="input_append text-h6">px</span>
                          </template>
                        </q-input>
                      </q-item-section>
                    </q-item>
                  </div>
                  <br />

                  <div class="row">
                    <q-item>
                      <q-item-section avatar>
                        <span class="q-mb-md">Y:</span>
                      </q-item-section>
                      <q-item-section>
                        <q-input
                          v-if="current_index > -1"
                          :hint="''"
                          type="number"
                          :min="min_y()"
                          :max="max_y()"
                          v-model="test_monitor_wall[current_index].centery"
                          @update:model-value="center_y()"
                          @keydown="testLog($event)"
                          :rules="[
                            (val) =>
                              (val != null &&
                                val != undefined &&
                                val.toString().length > 0) ||
                              $t('Please type something'),
                            (val) =>
                              parseInt(val) > 0 ||
                              $t('the number must be greater than 0'),
                          ]"
                          lazy-rules
                        >
                          <template v-slot:append>
                            <span class="input_append text-h6">px</span>
                          </template>
                        </q-input>
                        <q-input
                          v-else
                          type="number"
                          min="0"
                          :model-value="0"
                          :disable="true"
                          hint=""
                        >
                          <template v-slot:append>
                            <span class="input_append text-h6">px</span>
                          </template>
                        </q-input>
                      </q-item-section>
                    </q-item>
                  </div>
                </q-card-section>
                <q-separator vertical></q-separator>

                <q-card-section
                  @dragenter="onDragEnter"
                  @dragleave="onDragLeave"
                  @dragover="onDragOver"
                  @drop="onDrop"
                  style="
                    max-height: 80vh;
                    width: 75%;
                    position: relative;
                    margin-top: 1.5vh; ;
                  "
                >
                  <div class="text-h6 row">
                    <div for="" class="col-2">{{ $t("resize") }}</div>
                    <q-slider
                      class="col"
                      style="font-size: 0.7rem"
                      v-model="percenter"
                      @update:model-value="changePercenter()"
                      @keydown.prevent.stop.capture="testLog($event)"
                      label
                      :label-value="percenter"
                      markers
                      switch-marker-labels-side
                      label-always
                      :min="0.1"
                      :max="2"
                      :step="0.05"
                    />
                  </div>
                  <div
                    style="
                      position: absolute;
                      height: 20.7vw;
                      width: 36.8vw;
                      text-align: center;
                    "
                    :class="$store.state.power_state ? 'wall' : ''"
                  >
                    <!-- <div
                    class="row"
                    v-for="i in 64 / 8"
                    :key="i"
                    style="height: 12.5%; align-items: center"
                    :class="i % 2 == 0 ? 'wall_row' : ''"
                  >
                    <div class="col" v-for="j in 8" :key="j">
                      {{ i * j }}
                    </div>
                  </div> -->
                  </div>
                  <div
                    ref="wall"
                    v-if="$store.state.power_state"
                    style="
                      position: absolute;
                      height: 20.7vw;
                      width: 36.8vw;
                      overflow: hidden;
                    "
                    @click="canel_active()"
                  >
                    <div
                      v-for="(item, index) of test_monitor_wall"
                      @click.stop="Unchecked == false"
                    >
                      <vue3-resize-drag
                        v-if="item.isShow"
                        :w="item.w"
                        :h="item.h"
                        :x="item.currentx"
                        :y="item.currenty"
                        :isActive="true"
                        :isGuide="true && item.angle == 0"
                        :rotate="parseInt(item.angle.toString())"
                        :is-resizable="false"
                        :resizeIconSize="10"
                        style="
                          background-color: grey;
                          text-align: center;
                          position: absolute;
                        "
                        @moveHandler="moveingMonitor(item, $event, index)"
                        @moveEndHandler="moveMonitor(item, $event)"
                        @mousedown="activeMouseDown(item, index)"
                        :z-index="item.active ? 99 : 0"
                      >
                        <div
                          class="full-height full-width"
                          :class="item.active ? 'monitor_selected' : ''"
                          style="text-align: center"
                          :style="{ lineHeight: show_box_line_height(item.h) }"
                        >
                          <q-popup-proxy context-menu>
                            <q-list>
                              <q-item clickable v-close-popup>
                                <q-item-section
                                  @click="closeWindow(item, index)"
                                >
                                  {{ $t("close this window") }}
                                </q-item-section>
                              </q-item>
                              <q-item clickable v-close-popup>
                                <q-item-section
                                  @click="closeOtherWindows(item, index)"
                                >
                                  {{ $t("close other windows") }}
                                </q-item-section>
                              </q-item>
                              <q-item clickable v-close-popup>
                                <q-item-section @click="closeAllWindows()">
                                  {{ $t("close all windows") }}
                                </q-item-section>
                              </q-item>
                            </q-list>
                          </q-popup-proxy>
                          {{ item.uuid }}
                          <q-separator></q-separator>
                          x:{{ item.centerx }} y:{{ item.centery }}
                          <!-- <q-separator></q-separator>
                        W:{{ filter_px(item.w) }}H:{{ filter_px(item.h) }} -->
                        </div>
                      </vue3-resize-drag>
                    </div>
                  </div>
                </q-card-section>
              </q-card-section>
            </q-card>
            <br />
            <q-card class="my-card" flat bordered>
              <q-item>
                <q-item-section>
                  <q-item-label class="text-h6">{{
                    $t("monitors list")
                  }}</q-item-label>
                </q-item-section>
              </q-item>

              <q-item>
                <q-item-section avatar>
                  <span class="q-mb-md">W:</span>
                </q-item-section>
                <q-item-section>
                  <q-input
                    v-if="monitor_list_current_index > -1"
                    type="text"
                    v-model="test_monitor_list[monitor_list_current_index].cmw"
                    @update:model-value="changewidth()"
                    :rules="[
                      (val) =>
                        (val != null &&
                          val != undefined &&
                          val.toString().length > 0) ||
                        $t('Please type something'),
                      (val) =>
                        parseInt(val) >= 0 ||
                        $t('the number must be greater than 0'),
                      (val) =>
                        parseInt(val) <= 3840 ||
                        $t('the number must be less than 3840'),
                    ]"
                    lazy-rules
                    hint=""
                  >
                    <template v-slot:append>
                      <span class="input_append text-h6">mm</span>
                    </template>
                  </q-input>
                  <q-input
                    v-else
                    type="number"
                    :model-value="0"
                    :disable="true"
                    hint=""
                  >
                    <template v-slot:append>
                      <span class="input_append text-h6">mm</span>
                    </template>
                  </q-input>
                </q-item-section>
                <q-item-section avatar>
                  <span class="q-mb-md">H:</span>
                </q-item-section>
                <q-item-section>
                  <q-input
                    v-if="monitor_list_current_index > -1"
                    type="text"
                    v-model="test_monitor_list[monitor_list_current_index].cmh"
                    @update:model-value="changeHeight()"
                    :rules="[
                      (val) =>
                        (val != null &&
                          val != undefined &&
                          val.toString().length > 0) ||
                        $t('Please type something'),
                      (val) =>
                        parseInt(val) >= 0 ||
                        $t('the number must be greater than 0'),
                      (val) =>
                        parseInt(val) <= 2160 ||
                        $t('the number must be less than 2160'),
                    ]"
                    lazy-rules
                    hint=""
                  >
                    <template v-slot:append>
                      <span class="input_append text-h6">mm</span>
                    </template>
                  </q-input>
                  <q-input
                    v-else
                    type="number"
                    min="0"
                    :model-value="0"
                    :disable="true"
                    hint=""
                  >
                    <template v-slot:append>
                      <span class="input_append text-h6">mm</span>
                    </template>
                  </q-input>
                </q-item-section>
              </q-item>
              <q-separator></q-separator>
              <q-card-section horizontal>
                <q-list key="uuid" class="full-width">
                  <div
                    v-for="item in Math.ceil(output_length / 4)"
                    class="row justify-around"
                  >
                    <div
                      v-for="j in 4"
                      style="display: inline-block"
                      v-if="item < output_length / 4 || output_length % 4 == 0"
                      :style="{ lineHeight: box_line_height(item, j) }"
                    >
                      <div
                        v-if="
                          test_monitor_list[(item - 1) * 4 + (j - 1)].isHide
                        "
                      ></div>
                      <div
                        v-else
                        :class="
                          test_monitor_list[(item - 1) * 4 + (j - 1)].isactive
                            ? 'list_select'
                            : ''
                        "
                        style="
                        background-color: grey;
                        border: 1px solid black;
                        text-align: center;
                        font-size: {{ percenter }};
                      "
                        :style="{
                          width: box_width(item, j),
                          height: box_height(item, j),
                        }"
                        :draggable="$store.state.power_state"
                        @click="activeMonitorList((item - 1) * 4 + (j - 1))"
                        @dragstart="
                          (evt) =>
                            onDragStart(
                              evt,
                              test_monitor_list[(item - 1) * 4 + (j - 1)]
                            )
                        "
                        @dragend="(evt) => onDragend(evt, item, j)"
                      >
                        {{ test_monitor_list[(item - 1) * 4 + (j - 1)].uuid }}
                        W:{{
                          filter_px(
                            test_monitor_list[(item - 1) * 4 + (j - 1)].cmw
                          )
                        }}
                        H:{{
                          filter_px(
                            test_monitor_list[(item - 1) * 4 + (j - 1)].cmh
                          )
                        }}
                      </div>
                    </div>
                    <div
                      v-else
                      v-for="j in output_length % 4"
                      style="display: inline-block; text-align: center"
                      :style="{ lineHeight: box_line_height(item, j) }"
                    >
                      <div
                        v-if="
                          test_monitor_list[(item - 1) * 4 + (j - 1)].isHide
                        "
                      ></div>
                      <!-- :class="monitor_list_current_index==(item - 1) * 4 + (j - 1)?'list_select':''" -->
                      <div
                        v-else
                        style="background-color: grey; border: 1px solid black"
                        :style="{
                          width: box_width(item, j),
                          height: box_height(item, j),
                        }"
                        :class="
                          test_monitor_list[(item - 1) * 4 + (j - 1)].isactive
                            ? 'list_select'
                            : ''
                        "
                        @click="activeMonitorList((item - 1) * 4 + (j - 1))"
                        :draggable="$store.state.power_state"
                        @dragstart="
                          (evt) =>
                            onDragStart(
                              evt,
                              test_monitor_list[(item - 1) * 4 + (j - 1)]
                            )
                        "
                        @dragend="(evt) => onDragend(evt, item, j)"
                      >
                        {{ test_monitor_list[(item - 1) * 4 + (j - 1)].uuid }}
                        W:{{
                          filter_px(
                            test_monitor_list[(item - 1) * 4 + (j - 1)].cmw
                          )
                        }}
                        H:{{
                          filter_px(
                            test_monitor_list[(item - 1) * 4 + (j - 1)].cmh
                          )
                        }}
                      </div>
                    </div>
                  </div>
                </q-list>
              </q-card-section>
            </q-card>

            <q-separator />
          </q-scroll-area>
        </q-card-section>
        <q-separator />
        <q-card-actions>
          <q-btn
            v-if="magic_isbutton"
            :loading="loading"
            flat
            :label="$t('export magic')"
            no-caps
            color="primary"
            @click="export_magic_wall"
          />
          <q-toggle
            v-model="magic_switch"
            @update:model-value="upload_magic_switch()"
            :label="$t('raster graph')"
          />
          <q-space />
          <q-btn
            :loading="loading"
            flat
            :label="$t('Cancel')"
            no-caps
            color="primary"
            v-close-popup
            @click="close_magic_switch()"
          />
          <q-btn
            :loading="loading"
            flat
            no-caps
            :label="$t('revert')"
            color="primary"
            @click="refresh_all"
          />
          <q-btn
            ref="accept"
            flat
            :label="$t('Accept')"
            no-caps
            :loading="loading"
            type="submit"
            color="primary"
          />
        </q-card-actions>
      </q-form>
    </q-card>
  </q-dialog>
</template>

<style scoped>
.monitor_selected {
  outline-style: dashed;
  outline-color: transparent;
  background-color: dimgrey;
}

.wall {
  border: 1px solid black;
  background: no-repeat url("../../public/magic_bg/bg.jpg");
  background-size: 36.8vw 20.7vw;
}

.wall_row {
  background-color: #166fab;
}

.drag-enter {
  outline-style: dashed;
}
.list_select {
  border: 2px dashed black !important;
}
</style>

<script lang="ts">
import { defineComponent, ref, watch, computed, Ref, reactive } from "vue";
import { useStore } from "src/store";
import {
  useQuasar,
  extend,
  QBtn,
  QCard,
  QCardActions,
  QCardSection,
  QDialog,
  QInput,
  QItem,
  QItemLabel,
  QItemSection,
  QList,
  QPopupProxy,
  QSeparator,
  QSpace,
  QTooltip,
  exportFile,
  QForm,
  QSlider,
} from "quasar";
import { useI18n } from "vue-i18n";
import GlobalData from "src/common/GlobalData";
import vue3ResizeDrag from "../third_lib/vue3-resize-drag/components/vue3-resize-drag/index.vue";
import MagicWallConfig from "src/entities/MagicWallConfig";
import { PointF } from "src/entities/RectF";
import EventBus, { EventNamesDefine } from "src/common/EventBus";
import { Protocol } from "src/entities/WSProtocol";
import { NotifyMessage } from "src/common/ClientConnection";

export class test_monitor {
  uuid = "";
  active = false;
  start_x = 0;
  start_y = 0;
  InitialW = 0;
  InitialH = 0;
  startw = 0.0;
  starth = 0.0;
  w = 0.0;
  h = 0.0;
  cmw = 0.0;
  cmh = 0.0;
  currentx = 0.0;
  currenty = 0.0;
  centerx = 0;
  centery = 0;
  angle = 0;
  id = 0;
  resize = 0.0;
  resizew = 0.0;
  resizeh = 0.0;
  isHide = false;
  isShow = false;
  isactive = false;
  reset() {
    this.uuid = "";
    this.active = false;
    this.start_x = 0;
    this.start_y = 0;
    this.w = 0.0;
    this.h = 0.0;
    this.cmh = 0.0;
    this.cmw = 0.0;
    this.currentx = 0.0;
    this.currenty = 0.0;
    this.centerx = 0;
    this.centery = 0;
    this.angle = 0;
    this.id = 0;
    this.isHide = false; //列表隐藏
    this.isShow = false; //墙显示
    this.resize = 0.0;
    this.resizew = 0.0;
    this.resizeh = 0.0;
    this.InitialW = 0;
    this.InitialW = 0;
    this.startw = 0.0;
    this.starth = 0.0;
    this.isactive = false;
  }
  constructor(id: number, uuid: string, w: number, h: number, resize: number) {
    this.reset();
    this.id = id;
    this.uuid = uuid;
    this.w = w;
    this.h = h;
    this.resize = resize;
    this.startw = 128;
    this.starth = 72;
    this.cmw = 0.0;
    this.cmh = 0.0;
  }
}
class test_monitor2 {
  w = 0.0;
  h = 0.0;
  currentx = 0.0;
  currenty = 0.0;
  centerx = 0.0;
  centery = 0.0;
  angle = 0;
  id = 0;
  constructor(id: number, w: number, h: number) {
    this.currentx = 0.0;
    this.currenty = 0.0;
    this.angle = 0;
    this.centerx = 0;
    this.centery = 0;
    this.id = id;
    this.w = w;
    this.h = h;
  }
}
class exporttxt {
  id = 0;
  point_left_top = {};
  point_left_bootom = {};
  point_right_top = {};
  point_right_bottom = {};
  w = 0.0;
  h = 0.0;
  angle = 0;
  constructor(
    id: number,
    w: number,
    h: number,
    angle: number,
    point_left_top: {},
    point_left_bootom: {},
    point_right_top: {},
    point_right_bottom: {}
  ) {
    this.id = id;
    this.point_left_top = point_left_top;
    this.point_left_bootom = point_left_bootom;
    this.point_right_top = point_right_top;
    this.point_right_bottom = point_right_bottom;
    this.w = w;
    this.h = h;
    this.angle = angle;
  }
}
export default defineComponent({
  name: "ComponentControlPanelDialog",
  components: { vue3ResizeDrag },
  setup() {
    let $store = useStore();
    let $q = useQuasar();
    let $t = useI18n();
    let lcm = ref(0);
    let show_dialog = ref(false);
    let magic_isbutton = ref(false);
    let loading = ref(false);
    let wall: Ref<HTMLElement | null> = ref(null);
    let current_index = ref(-1);
    let monitor_list_current_index = ref(-1);
    const monitor_percenter = ref([0.1, 0.2, 0.3, 0.4, 0.5]);
    const monitor_proportion = ref(["16:9", "4:3"]);
    let window_rect = reactive({
      x: 0,
      y: 0,
      width: 0,
      height: 0,
      angle: 0,
    });
    let multiple = ref(false);
    const aw = 303.5;
    const ah = 171;
    const bw = 269.5;
    const bh = 152;
    const cw = 255.5;
    const ch = 144;
    const model = ref(null);
    let magic_switch = ref(false);
    const options = ref([
      {
        id: "55",
        w: 1214,
        h: 684,
        desc: "Google",
      },
      {
        id: "49",
        w: 1078,
        h: 608,
        desc: "Facebook",
      },
      {
        id: "46",
        w: 1022,
        h: 577,
        desc: "Twitter",
      },
      {
        id: "70",
        w: 1920,
        h: 1080,
        desc: "Apple",
      },
      // {
      //   id: '55',
      //   w:1214,
      //   h:684,
      //   desc: 'Oracle',
      //   inactive: true
      // }
    ]);
    //调整与背景的百分比
    const percenter = ref(1);
    let last_percenter = ref(1);
    const ar = 0.5;
    const br = 0.6;
    const cr = 0.7;
    let test_monitor_list: Ref<test_monitor[]> = ref([
      new test_monitor(0, "01", aw, ah, ar),
      new test_monitor(1, "02", aw, ah, ar),
      new test_monitor(2, "03", aw, ah, ar),
      new test_monitor(3, "04", aw, ah, ar),
      new test_monitor(4, "05", bw, bh, br),
      new test_monitor(5, "06", bw, bh, br),
      new test_monitor(6, "07", bw, bh, br),
      new test_monitor(7, "08", bw, bh, br),
      new test_monitor(8, "09", cw, ch, cr),
      new test_monitor(9, "10", cw, ch, cr),
      new test_monitor(10, "11", cw, ch, cr),
      new test_monitor(11, "12", cw, ch, cr),
      // new test_monitor(12, "13", cw, ch, cr)
    ]);
    interface show__Rect {
      width: number;
      height: number;
      x: number;
      y: number;
      left: number;
      top: number;
      angle: number;
    }

    const filter_px = (val: number) => {
      return Math.round(val);
    };
    const realtime_upload = async () => {
      let client = GlobalData.getInstance().getCurrentClient();
      const settings = await GlobalData.getInstance()
        .getCurrentClient()
        ?.getOutputBoardSetting();
      if (settings) {
        output_length.value =
          parseInt(settings.wall_col.toString()) *
          parseInt(settings.wall_row.toString());
        if (output_length.value > test_monitor_list.value.length) {
          let num = output_length.value - test_monitor_list.value.length;
          while (num > 0) {
            let index = test_monitor_list.value.length;
            let uuid = (index + 1).toString();
            test_monitor_list.value.push(
              new test_monitor(index, uuid, aw, ah, ar)
            );
            num--;
          }
          getpx();
        }
      }

      const cloud_monitor_list = new MagicWallConfig();
      const wall_dom = wall.value;
      if (wall_dom && settings) {
        cloud_monitor_list.magic_wall_enable = true;
        cloud_monitor_list.col = parseInt(settings.wall_col.toString());
        cloud_monitor_list.row = parseInt(settings.wall_row.toString());
        test_monitor_wall.value.forEach((element, index) => {
          if (element.isShow) {
            cloud_monitor_list.windows.push({
              index: element.id,
              lt: new PointF(
                element.currentx / wall_dom.offsetWidth,
                element.currenty / wall_dom.offsetHeight
              ),
              h: element.h / wall_dom.offsetHeight,
              w: element.w / wall_dom.offsetWidth,
              angle: parseInt(element.angle.toString()),
              initial_h: element.InitialH,
              initial_w: element.InitialW,
              percenter: percenter.value,
              background_h: wall_dom.offsetHeight,
              background_w: wall_dom.offsetWidth,
            });
          }
        });
      }
      if (client) {
        const setMagic = await client.setMagicWallConfig(cloud_monitor_list);
        if (setMagic?.success) {
          let monitorList: any = [];
          test_monitor_wall.value.forEach((element, index) => {
            if (element.isShow && wall_dom) {
              monitorList.push({
                id: element.id,
                currentx: element.currentx / wall_dom.offsetWidth,
                currenty: element.currenty / wall_dom.offsetHeight,
                h: element.h / wall_dom.offsetHeight,
                w: element.w / wall_dom.offsetWidth,
                angle: parseInt(element.angle.toString()),
      centerx: element.centerx / 3840,
                  centery: element.centery / 2160,
              });
            }
          });
          $store.commit("setShowMonitorList", monitorList);
        }
        if (!setMagic?.success) {
          $q.notify({
            color: "negative",
            icon: "warning",
            message: $t.t("update magic wall") + $t.t("fail") + "!",
            position: "top",
            timeout: 2500,
          });
        }
      }
    };
    const getpx = () => {
      const wall_dom = wall.value;
      if (wall_dom) {
        lcm.value = (wall_dom.offsetWidth * 0.5) / 1214;
        test_monitor_list.value.forEach((ele) => {
          ele.cmw = Math.round(ele.w / lcm.value);
          ele.cmh = Math.round(ele.h / lcm.value);
        });
      }
    };
    const upload_magic_switch = async () => {
      let client = GlobalData.getInstance().getCurrentClient();
      if (client) {
        const SetMagicWallGridState = await client.setMagicWallGridState(
          magic_switch.value
        );
      }
    };
    const close_magic_switch = () => {
      magic_switch.value = false;
      upload_magic_switch();
    };
    const radians = (item: test_monitor) => {
      return /*a*/ (item.angle * Math.PI) / 180;
    };
    const calculateCoordinates = (
      px: number,
      py: number,
      cx: number,
      cy: number,
      item: test_monitor
    ) => {
      const x =
        cx +
        (px - cx) * Math.cos(radians(item)) -
        (py - cy) * Math.sin(radians(item));

      const y =
        cy +
        (px - cx) * Math.sin(radians(item)) +
        (py - cy) * Math.cos(radians(item));

      return { x, y };
    };
    const four_point = (item: test_monitor) => {
      const wall_dom = wall.value;
      let centerx: any, centery: any;
      if (wall_dom) {
        centerx = (item.centerx / 3840) * wall_dom.offsetWidth;
        centery = (item.centery / 2160) * wall_dom.offsetHeight;
      }
      centerx = Math.round(centerx);
      centery = Math.round(centery);
      // item.centerx = Math.round((item.centerx));
      // item.centery = Math.round(item.centery);
      const x2: number = item.currentx + item.w;
      const y2: number = item.currenty + item.h;
      const x1: number = centerx;
      const y1: number = centery;
      if (item.angle != 0) {
        const point_left_top = calculateCoordinates(
          item.currentx,
          item.currenty,
          x1,
          y1,
          item
        );
        const point_left_bootom = calculateCoordinates(
          item.currentx,
          y2,
          x1,
          y1,
          item
        );
        const point_right_top = calculateCoordinates(
          x2,
          item.currenty,
          x1,
          y1,
          item
        );
        const point_right_bottom = calculateCoordinates(x2, y2, x1, y1, item);
        const point_list = [
          point_left_top,
          point_left_bootom,
          point_right_top,
          point_right_bottom,
        ];
        return point_list;
      } else {
        const point_list = [
          { x: item.currentx, y: item.currenty }, //左上
          { x: x2, y: item.currenty }, //右上
          { x: item.currentx, y: y2 }, //左下
          { x: x2, y: y2 }, //右下
        ];
        return point_list;
      }
    };
    let offsetHeight = ref(0.0);
    let offsetWidth = ref(0.0);
    let test_monitor_wall: Ref<test_monitor[]> = ref([]);
    let last_wall: Ref<test_monitor[]> = ref([]);
    let output_length = ref(0);
    let multiple_select: Ref<number[]> = ref([]);
    const set_x = () => {
      const wall_dom = wall.value;
      const item = test_monitor_wall.value[current_index.value];
      const rx: number = item.currentx + item.w;
      if (wall_dom) {
        if (rx > wall_dom.offsetWidth) {
          item.currentx = wall_dom.offsetWidth - item.w;
          return item.currentx;
        } else {
          return item.currentx;
        }
      }
    };
    const min_x = (
      item: test_monitor = test_monitor_wall.value[current_index.value]
    ) => {
      const wall_dom = wall.value;
      const point_list = four_point(item);
      if (wall_dom) {
        if (item.angle != 0 && point_list) {
          let minx = 0;
          point_list.forEach((element) => {
            if (minx > element.x) {
              minx = element.x;
            }
          });
          if (minx < 0) {
            return Math.round(
              ((item.w / 2 + item.currentx + Math.abs(minx)) /
                wall_dom.offsetWidth) *
                3840
            );
          } else {
            return Math.round((minx / wall_dom.offsetWidth) * 3840);
          }
        } else {
          return Math.round((item.w / 2 / wall_dom.offsetWidth) * 3840);
        }
      }
    };
    const max_x = (
      item: test_monitor = test_monitor_wall.value[current_index.value]
    ) => {
      const wall_dom = wall.value;
      const point_list = four_point(item);
      if (wall_dom) {
        if (item.angle != 0 && point_list) {
          let maxx = 0;
          point_list.forEach((element) => {
            if (maxx < element.x) {
              maxx = element.x;
            }
          });
          if (maxx > wall_dom.offsetWidth) {
            return Math.round(
              ((item.currentx + item.w / 2 - (maxx - wall_dom.offsetWidth)) /
                wall_dom.offsetWidth) *
                3840
            );
          } else {
            return Math.round(
              ((item.currentx + item.w / 2 - (maxx - wall_dom.offsetWidth)) /
                wall_dom.offsetWidth) *
                3840
            );
          }
        } else {
          return Math.round(
            ((wall_dom.offsetWidth - item.w / 2) / wall_dom.offsetWidth) * 3840
          );
        }
      }
    };
    const set_y = () => {
      //输入框正向溢出
      const wall_dom = wall.value;
      const item = test_monitor_wall.value[current_index.value];
      const ry: number = item.currenty + item.h;
      if (wall_dom) {
        if (ry > wall_dom.offsetHeight) {
          item.currenty = wall_dom.offsetHeight - item.h;
          return item.currenty;
        } else {
          return item.currenty;
        }
      }
    };
    const min_y = (
      item: test_monitor = test_monitor_wall.value[current_index.value]
    ) => {
      const wall_dom = wall.value;
      const point_list = four_point(item);
      if (wall_dom) {
        if (item.angle != 0 && point_list) {
          let miny = 0;
          point_list.forEach((element) => {
            if (miny > element.y) {
              miny = element.y;
            }
          });
          if (miny < 0) {
            return Math.round(
              ((item.h / 2 + item.currenty + Math.abs(miny)) /
                wall_dom.offsetHeight) *
                2160
            );
          } else {
            return Math.round((miny / wall_dom.offsetHeight) * 2160);
          }
        } else {
          return Math.round((item.h / 2 / wall_dom.offsetHeight) * 2160);
        }
      }
    };
    const max_y = (
      item: test_monitor = test_monitor_wall.value[current_index.value]
    ) => {
      const wall_dom = wall.value;
      const point_list = four_point(item);
      if (wall_dom) {
        if (item.angle != 0 && point_list) {
          let maxy = 0;
          point_list.forEach((element) => {
            if (maxy < element.y) {
              maxy = element.y;
            }
          });
          if (maxy > wall_dom.offsetHeight) {
            return Math.round(
              ((item.currenty + item.h / 2 - (maxy - wall_dom.offsetHeight)) /
                wall_dom.offsetHeight) *
                2160
            );
          } else {
            return Math.round(
              ((item.currenty + item.h / 2 - (maxy - wall_dom.offsetHeight)) /
                wall_dom.offsetHeight) *
                2160
            );
          }
        } else {
          return Math.round(
            ((wall_dom.offsetHeight - item.h / 2) / wall_dom.offsetHeight) *
              2160
          );
        }
      }
    };
    let Unchecked = ref(false);
    const moveingMonitor = (
      item: test_monitor,
      rect: show__Rect,
      index: number
    ) => {
      item.active = true;
      if (item.active) {
        test_monitor_wall.value.forEach((element) => {
          element.active = false;
        });
      }
      const wall_dom = wall.value;
      if (wall_dom) {
        item.h = item.InitialH * percenter.value;
        item.w = item.InitialW * percenter.value;
        item.active = true;
        item.currentx = rect.left;
        item.currenty = rect.top;
        item.centerx = Math.round(
          ((item.currentx + item.w / 2) / wall_dom?.offsetWidth) * 3840
        );
        item.centery = Math.round(
          ((item.currenty + item.h / 2) / wall_dom?.offsetHeight) * 2160
        );
      }

      if (Number.isNaN(rect.left || rect.left < 0)) {
        item.currentx = 0;
      }
    };

    const moveMonitor = (item: test_monitor, rect: show__Rect) => {
      //计算是否超出,然后放回
      const wall_dom = wall.value;
      if (item.angle != 0) {
        exceedrange(item);
      } else if (wall_dom) {
        if (rect.left < 0) {
          item.currentx = 0;
        } else if (wall_dom && rect.left > wall_dom.offsetWidth - item.w) {
          item.currentx = Number(set_x()) ?? 0;
        } else {
          item.currentx = rect.left;
        }
        if (rect.top < 0) {
          item.currenty = 0;
        } else if (wall_dom && rect.top > wall_dom.offsetHeight - item.h) {
          item.currenty = set_y() ?? 0;
        } else {
          item.currenty = rect.top;
        }
        item.centerx = Math.round(
          ((item.currentx + item.w / 2) / wall_dom?.offsetWidth) * 3840
        );
        item.centery = Math.round(
          ((item.currenty + item.h / 2) / wall_dom?.offsetHeight) * 2160
        );
      }
      realtime_upload();
    };
    const exceedrange = (item: test_monitor) => {
      const wall_dom = wall.value;
      let a = 0;
      const point_list = four_point(item);
      if (wall_dom && point_list) {
        let maxx = 0;
        let maxy = 0;
        let minx = 0;
        let miny = 0;
        point_list.forEach((element) => {
          if (minx > element.x) {
            minx = element.x;
          }
          if (maxx < element.x) {
            maxx = element.x;
          }
          if (miny > element.y) {
            miny = element.y;
          }
          if (maxy < element.y) {
            maxy = element.y;
          }
        });
        if (minx < 0) {
          item.currentx += Math.abs(minx);
          item.centerx = Math.round(
            ((item.w / 2 + item.currentx) / wall_dom.offsetWidth) * 3840
          );
        }
        if (maxx > wall_dom.offsetWidth) {
          item.currentx -= maxx - wall_dom.offsetWidth;
          item.centerx = Math.round(
            ((item.currentx + item.w / 2) / wall_dom.offsetWidth) * 3840
          );
        }
        if (miny < 0) {
          item.currenty += Math.abs(miny);
          item.centery = Math.round(
            ((item.h / 2 + item.currenty) / wall_dom.offsetHeight) * 2160
          );
        }
        if (maxy > wall_dom.offsetHeight) {
          item.currenty -= maxy - wall_dom.offsetHeight;
          item.centery = Math.round(
            ((item.currenty + item.h / 2) / wall_dom.offsetHeight) * 2160
          );
        }
      }
    };
    const activeMonitorList = (index: number) => {
      monitor_list_current_index.value = index;
      test_monitor_list.value[index].isactive = true;
      test_monitor_list.value.forEach((element) => {
        element.isactive = false;
      });
      test_monitor_list.value[index].isactive = true;
    };
    let test_delete_flag = false;
    const refresh_all = () => {
      test_monitor_wall.value = [];
      current_index.value = -1;
      monitor_list_current_index.value=-1
      percenter.value = last_percenter.value;
      multiple_select.value = [];
      multiple.value = false;
      loading.value = false;
      test_monitor_list.value.forEach((element) => {
        element.isHide = false;
        element.isactive=false;
      });
      last_wall.value.forEach((element) => {
        element.isShow = true;
        test_monitor_wall.value.push(JSON.parse(JSON.stringify(element)));
        test_monitor_list.value[element.id].isHide = true;
      });
      realtime_upload();
    };
    EventBus.getInstance().on(EventNamesDefine.WindowResize, () => {
      const wall_dom = wall.value;
      if (wall_dom) {
        test_monitor_wall.value.forEach(async (element) => {
          let teph = element.InitialH;
          let tepw = element.InitialW;
          element.InitialH = wall_dom.offsetHeight * element.resizeh;
          element.InitialW = wall_dom.offsetWidth * element.resizew;
          element.h = element.InitialH * percenter.value;
          element.w = element.InitialW * percenter.value;
          let sizeh = element.InitialH / teph;
          let sizew = element.InitialW / tepw;
          element.currentx = element.currentx * sizew;
          element.currenty = element.currenty * sizeh;
          element.centerx =
            Math.round(((element.currentx + element.w / 2) / wall_dom.offsetWidth) * 3840);
          element.centery =
            Math.round(((element.currenty + element.h / 2) / wall_dom.offsetHeight) * 2160);
        });
      }
    });
    const refresh_magic = (a: any) => {
      let monitorList: any = [];
      $store.commit("setShowMonitorList", monitorList);
      if (a) {
        a.forEach((element: any) => {
          let item: test_monitor2 = new test_monitor2(0, 0, 0);
          item.h = element.h;
          item.w = element.w;
          item.currentx = element.lt.x;
          item.currenty = element.lt.y;
          item.angle = element.angle;
          item.id = element.index;
          if ($store.state.show_monitor_list.length == 0) {
            monitorList.push(item);
            $store.commit("setShowMonitorList", monitorList);
          } else {
            let flag = false;
            $store.state.show_monitor_list.forEach((ele: any) => {
              if (element.index == ele.id) {
                flag = true;
              }
            });
            if (!flag) {
              monitorList.push(item);
              $store.commit("setShowMonitorList", monitorList);
            }
          }
        });
      }
      const wall_dom = wall.value;
      if (a && wall_dom) {
        test_monitor_wall.value = [];
        a.forEach((element: any) => {
          let item: test_monitor = new test_monitor(0, "0", 0, 0, 0);
          extend(true, item, test_monitor_list.value[element.index]);
          let sizeh = wall_dom.offsetHeight / element.background_h;
          let sizew = wall_dom.offsetWidth / element.background_w;
          item.currentx = element.lt.x * wall_dom.offsetWidth;
          item.currenty = element.lt.y * wall_dom.offsetHeight;
          percenter.value = parseFloat(element.percenter.toString());
          last_percenter.value = percenter.value;
          item.InitialH = element.initial_h * sizeh;
          item.InitialW = element.initial_w * sizew;
          item.h = item.InitialH * percenter.value;
          item.w = item.InitialW * percenter.value;
          item.resizew = item.InitialW / wall_dom.offsetWidth;
          item.resizeh = item.InitialH / wall_dom.offsetHeight;
          item.centerx =
            Math.round(((item.currentx + item.w / 2) / wall_dom.offsetWidth) * 3840);
          item.centery =
            Math.round(((item.currenty + item.h / 2) / wall_dom.offsetHeight) * 2160);
          item.angle = element.angle;
          item.isShow = true;
          test_monitor_wall.value.push(JSON.parse(JSON.stringify(item)));
          test_monitor_list.value.forEach((ele) => {
            if (element.index == ele.id) {
              ele.isHide = true;
            }
          });
        });
      }
    };
    const sub_x = () => {
      const wall_dom = wall.value;
      let item = test_monitor_wall.value[current_index.value];
      let minx = 1000;
      if (wall_dom) {
        if (multiple_select.value.length > 1) {
          multiple_select.value.forEach((element) => {
            if (element != -1) {
              let tep_item = test_monitor_wall.value[element];
              let min = min_x(tep_item) ?? 0;
              if (tep_item.centerx > min) {
                if (minx > tep_item.centerx && tep_item.angle != 0) {
                  minx = tep_item.centerx;
                  current_index.value = element;
                }
                tep_item.centerx--;
                tep_item.currentx =
                  (tep_item.centerx / 3840) * wall_dom.offsetWidth - tep_item.w/2;
              }
            }
          });
        } else {
          let min = min_x() ?? 0;
          if (item.centerx > min) {
            item.centerx--;
            item.currentx =
                  (item.centerx / 3840) * wall_dom.offsetWidth - item.w/2;
          }
        }
      }
      realtime_upload();
    };
    const sub_y = () => {
      const wall_dom = wall.value;
      let item = test_monitor_wall.value[current_index.value];
      let miny = 1000;
      if (wall_dom) {
        if (multiple_select.value.length > 1) {
          multiple_select.value.forEach((element) => {
            if (element != -1) {
              let tep_item = test_monitor_wall.value[element];
              let min = min_y(tep_item) ?? 0;
              if (tep_item.centery > min) {
                if (miny > tep_item.centery) {
                  miny = tep_item.centery;
                  current_index.value = element;
                }
                tep_item.centery--;
                tep_item.currenty =
                  (tep_item.centery / 2160) * wall_dom.offsetHeight -
                  tep_item.h/2;
              }
            }
          });
        } else {
          let min = min_y() ?? 0;
          if (item.centery > min) {
            item.centery--;
            item.currenty =
                  (item.centery / 2160) * wall_dom.offsetHeight -
                  item.h/2;
          }
        }
      }
      realtime_upload();
    };
    const add_x = () => {
      let item = test_monitor_wall.value[current_index.value];
      let maxx = 0;
      if (multiple_select.value.length > 1) {
        multiple_select.value.forEach((element) => {
          if (element != -1) {
            let tep_item = test_monitor_wall.value[element];
            let max = max_x(tep_item) ?? 0;
            if (tep_item.centerx < max) {
              if (maxx < tep_item.centerx && tep_item.angle != 0) {
                maxx = tep_item.centerx;
                current_index.value = element;
              }
              tep_item.centerx++;
              const wall_dom = wall.value;
              if (wall_dom) {
                tep_item.currentx =
                  (tep_item.centerx / 3840) * wall_dom.offsetWidth - tep_item.w/2;
              }
            }
          }
        });
      } else {
        let max = max_x() ?? 0;
        if (item.centerx < max) {
          item.centerx++;
          const wall_dom = wall.value;
          if (wall_dom) {
            item.currentx =
              (item.centerx / 3840) * wall_dom.offsetWidth - item.w/2;
          }
        }
      }
      realtime_upload();
    };
    const add_y = () => {
      const wall_dom = wall.value;
      let item = test_monitor_wall.value[current_index.value];
      let maxy = 0;
      if (wall_dom) {
        if (multiple_select.value.length > 1) {
          multiple_select.value.forEach((element) => {
            if (element != -1) {
              let tep_item = test_monitor_wall.value[element];
              let max = max_y(tep_item) ?? 0;
              if (tep_item.centery < max) {
                if (maxy < tep_item.centery && tep_item.angle != 0) {
                  maxy = tep_item.centery;
                  current_index.value = element;
                }
                tep_item.centery++;
                tep_item.currenty =
                  (tep_item.centery / 2160) * wall_dom.offsetHeight -
                  tep_item.h/2;
              }
            }
          });
        } else {
          let max = max_y() ?? 0;
          if (item.centery < max) {
            item.centery++;
            item.currenty =
              (item.centery / 2160) * wall_dom.offsetHeight - item.h/2;
          }
        }
      }
      realtime_upload();
    };
    EventBus.getInstance().on(
      EventNamesDefine.NotifyMessage,
      (notify: NotifyMessage) => {
        try {
          switch (notify.packet.command) {
            case Protocol.Commands.kRpcSetMagicWallGridState:
              {
                let temp = JSON.parse(
                  notify.data
                ) as Protocol.MagicWallGridStateNotifyEntity;
                if (temp) {
                  magic_switch.value = temp.grid_showing;
                }
              }
              break;
            case Protocol.Commands.kSetApplicationConfig: {
              let temp = JSON.parse(
                notify.data
              ) as Protocol.SetApplicationConfigRequestEntity;
              if (temp.key == "magic_wall_config") {
                const a = JSON.parse(temp.value).windows;
                if (
                  current_index.value == -1 ||
                  multiple_select.value.length < 1
                ) {
                  refresh_magic(a);
                }
              }
              break;
            }
          }
        } catch (e) {
          console.error(e);
        }
      }
    );
    return {
      sub_x,
      sub_y,
      add_x,
      add_y,
      close_magic_switch,
      upload_magic_switch,
      magic_switch,
      magic_isbutton,
      refresh_all,
      getpx,
      lcm,
      model,
      options,
      offsetHeight,
      offsetWidth,
      filter_px,
      activeMonitorList,
      monitor_percenter,
      monitor_proportion,
      output_length,
      multiple_select,
      multiple,
      exceedrange,
      four_point,
      show_dialog,
      loading,
      window_rect,
      Unchecked,
      monitor_list_current_index,
      current_index,
      test_monitor_list,
      test_monitor_wall,
      percenter,
      last_percenter,
      wall,
      set_x,
      min_x,
      max_x,
      set_y,
      min_y,
      max_y,
      moveMonitor,
      moveingMonitor,
      loga(a: any) {
        console.log(a);
      },
      async showDialog() {
        monitor_list_current_index.value = -1;
        show_dialog.value = true;
        magic_switch.value = true;
        let client = GlobalData.getInstance().getCurrentClient();
        if (client) {
          const settings = await GlobalData.getInstance()
            .getCurrentClient()
            ?.getOutputBoardSetting();
          const response = await client.getMagicWallConfig();
          const wall_dom = wall.value;
          const SetMagicWallGridState = await client.setMagicWallGridState(
            magic_switch.value
          );
          if (wall_dom) {
            offsetHeight.value = wall_dom.offsetHeight;
            offsetWidth.value = wall_dom.offsetWidth;
            getpx();
          }
          if (response && settings) {
            const a = response?.config.windows;
            output_length.value =
              parseInt(settings.wall_col.toString()) *
              parseInt(settings.wall_row.toString());
            if (output_length.value > test_monitor_list.value.length) {
              let num = output_length.value - test_monitor_list.value.length;
              while (num > 0) {
                let index = test_monitor_list.value.length;
                let uuid = (index + 1).toString();
                test_monitor_list.value.push(
                  new test_monitor(index, uuid, aw, ah, ar)
                );
                num--;
              }
              getpx();
            }
            if (
              output_length.value !=
              response.config.col * response.config.row
            ) {
              test_monitor_wall.value = [];
              current_index.value = -1;
              percenter.value = 1;
              multiple_select.value = [];
              multiple.value = false;
              last_wall.value = [];
              test_monitor_list.value.forEach((element) => {
                element.isHide = false;
              });
              $store.commit("setShowMonitorList", []);
              loading.value = false;
            } else if (a && wall_dom) {
              a.forEach((element) => {
                let item: test_monitor = new test_monitor(0, "0", 0, 0, 0);
                extend(true, item, test_monitor_list.value[element.index]);
                let sizeh = wall_dom.offsetHeight / element.background_h;
                let sizew = wall_dom.offsetWidth / element.background_w;
                item.currentx = element.lt.x * wall_dom.offsetWidth;
                item.currenty = element.lt.y * wall_dom.offsetHeight;
                percenter.value = parseFloat(element.percenter.toString());
                last_percenter.value = percenter.value;
                item.InitialH = element.initial_h * sizeh;
                item.InitialW = element.initial_w * sizew;
                item.h = item.InitialH * percenter.value;
                item.w = item.InitialW * percenter.value;
                item.resizew = item.InitialW / wall_dom.offsetWidth;
                item.resizeh = item.InitialH / wall_dom.offsetHeight;
                item.centerx = Math.round(
                  ((item.currentx + item.w / 2) / wall_dom.offsetWidth) * 3840
                );
                item.centery = Math.round(
                  ((item.currenty + item.h / 2) / wall_dom.offsetHeight) * 2160
                );
                item.angle = element.angle;
                item.isShow = true;
                test_monitor_wall.value.push(JSON.parse(JSON.stringify(item)));
                last_wall.value.push(JSON.parse(JSON.stringify(item)));
                test_monitor_list.value.forEach((ele) => {
                  if (element.index == ele.id) {
                    ele.isHide = true;
                  }
                });
              });
              if (a.length == 1) {
                current_index.value = 0;
              } else {
                current_index.value = -1;
              }
            }
          }
        }
      },
      resetData() {
        test_monitor_wall.value = [];
        current_index.value = -1;
        percenter.value = 1;
        multiple_select.value = [];
        multiple.value = false;
        last_wall.value = [];
        test_monitor_list.value.forEach((element) => {
          element.isHide = false;
          element.isactive = false;
        });

        loading.value = false;
      },
      async onSubmit() {
        loading.value = true;
        let client = GlobalData.getInstance().getCurrentClient();
        const wall_dom = wall.value;
        const settings = await GlobalData.getInstance()
          .getCurrentClient()
          ?.getOutputBoardSetting();
        if (client && wall_dom && settings) {
          const cloud_monitor_list = new MagicWallConfig();
          cloud_monitor_list.magic_wall_enable = true;
          cloud_monitor_list.col = parseInt(settings.wall_col.toString());
          cloud_monitor_list.row = parseInt(settings.wall_row.toString());
          test_monitor_wall.value.forEach((element, index) => {
            if (element.isShow) {
              cloud_monitor_list.windows.push({
                index: element.id,
                lt: new PointF(
                  element.currentx / wall_dom.offsetWidth,
                  element.currenty / wall_dom.offsetHeight
                ),
                h: element.h / wall_dom.offsetHeight,
                w: element.w / wall_dom.offsetWidth,
                angle: parseInt(element.angle.toString()),
                initial_h: element.InitialH,
                initial_w: element.InitialW,
                percenter: percenter.value,
                background_h: wall_dom.offsetHeight,
                background_w: wall_dom.offsetWidth,
              });
            }
          });
          const setMagic = await client.setMagicWallConfig(cloud_monitor_list);

          if (setMagic?.success) {
            let monitorList: any = [];
            test_monitor_wall.value.forEach((element, index) => {
              if (element.isShow && wall_dom) {
                monitorList.push({
                  id: element.id,
                  currentx: element.currentx / wall_dom.offsetWidth,
                  currenty: element.currenty / wall_dom.offsetHeight,
                  h: element.h / wall_dom.offsetHeight,
                  w: element.w / wall_dom.offsetWidth,
                  angle: parseInt(element.angle.toString()),
                  centerx: element.centerx / 3840,
                  centery: element.centery / 2160,
                });
              }
            });
            $store.commit("setShowMonitorList", monitorList);
          }
          $q.notify({
            color: setMagic?.success ? "positive" : "negative",
            icon: setMagic?.success ? "done" : "warning",
            message:
              $t.t("set magic wall") +
              (setMagic?.success ? $t.t("success") : $t.t("fail")) +
              "!",
            position: "top",
            timeout: 2500,
          });
          show_dialog.value = false;
          close_magic_switch();
        }
        loading.value = false;
      },
      activeMouseDown(item: test_monitor, index: number) {
        item.active = true;
        Unchecked.value = false;
        if (multiple.value) {
          if (multiple_select.value.indexOf(index) != -1) {
            test_monitor_wall.value[index].active = false;
            multiple_select.value[multiple_select.value.indexOf(index)] = -1;
          } else {
            multiple_select.value.push(index);
            test_monitor_wall.value[index].active = true;
            current_index.value = index;
          }
        } else {
          multiple_select.value = [];
          if (item.active) {
            test_monitor_wall.value.forEach((element) => {
              element.active = false;
            });
            multiple_select.value.push(index);
          }
          item.active = true;
        }
        item.active = true;

        current_index.value = index;
      },
      onDragStart(e: DragEvent, item: test_monitor) {
        item.start_x = e.offsetX;
        item.start_y = e.offsetY;
        item.active = false;
        test_delete_flag = false;
        e.dataTransfer?.setData("item", JSON.stringify(item));
        monitor_list_current_index.value = -1;
      },
      onDragOver(e: DragEvent) {
        e.preventDefault();
      },
      onDrop(e: DragEvent) {
        if (e.dataTransfer?.getData("item") != "") {
          let item = JSON.parse(e.dataTransfer?.getData("item") + "");
          item.currentx = e.offsetX - item.start_x;
          item.currenty = e.offsetY - item.start_y;
          item.active = true;
          item.angle = 0;
          if (item.active) {
            test_monitor_wall.value.forEach((element) => {
              element.active = false;
            });
          }
          if (item.currentx < 0) {
            item.currentx = 0;
            window_rect.x = 0;
          } else {
            window_rect.x = item.currentx;
          }
          if (item.currenty < 0) {
            item.currenty = 0;
            window_rect.y = 0;
          } else {
            window_rect.y = item.currenty;
          }
          test_delete_flag = false;
          const wall_dom = wall.value;
          item.isShow = true;
          if (wall_dom) {
            item.InitialH = item.h;
            item.InitialW = item.w;
            item.resizew = item.w / wall_dom.offsetWidth;
            item.resizeh = item.h / wall_dom.offsetHeight;
            item.h = item.InitialH * percenter.value;
            item.w = item.InitialW * percenter.value;
            if (item.currentx > wall_dom?.offsetWidth - item.w) {
              item.currentx = wall_dom?.offsetWidth - item.w;
            }
            if (item.currenty > wall_dom?.offsetHeight - item.h) {
              item.currenty = wall_dom?.offsetHeight - item.h;
            }
            item.centerx = Math.round(
              ((item.currentx + item.w / 2) / wall_dom?.offsetWidth) * 3840
            );
            item.centery = Math.round(
              ((item.currenty + item.h / 2) / wall_dom?.offsetHeight) * 2160
            );
            if (
              item.h > wall_dom.offsetHeight ||
              item.w > wall_dom.offsetWidth
            ) {
              $q.notify({
                color: "negative",
                icon: "warning",
                message: "该显示器超出,请调整缩放",
                position: "top",
                timeout: 2500,
              });
            } else {
              if (test_monitor_wall.value.indexOf(item) == -1) {
                test_monitor_wall.value.push(item);
                test_delete_flag = true;
              }
              current_index.value = test_monitor_wall.value.length - 1;
              realtime_upload();
              monitor_list_current_index.value = -1;
            }
          }
        }
      },

      onDragEnter(e: DragEvent, index: string) {
        e.stopPropagation();
        let target: HTMLElement | null = e.target as HTMLElement;
        if (target && target.draggable !== true) {
          while (
            target &&
            !target.classList.contains("window_flag") &&
            !target.classList.contains("wall_item_flag")
          ) {
            target = target.parentElement;
          }
          target?.classList.add("drag-enter");
        }
      },
      onDragend(e: DragEvent, row: number, col: number) {
        let num = (row - 1) * 4 + (col - 1);
        if (test_delete_flag) {
          test_monitor_list.value[num].isHide = true;
        }
      },
      onDragLeave(e: DragEvent) {
        let target: HTMLElement = e.target as HTMLElement;
        target?.classList.remove("drag-enter");
      },
      closeWindow(item: test_monitor, index: number) {
        current_index.value = -1;
        item.cmw = Math.round(item.w / lcm.value);
        item.cmh = Math.round(item.h / lcm.value);
        test_monitor_list.value[item.id] = JSON.parse(
          JSON.stringify(test_monitor_wall.value[index])
        );
        test_monitor_list.value[item.id].isHide = false;
        test_monitor_wall.value[index].isShow = false;
        multiple_select.value = [];
        realtime_upload();
      },
      closeOtherWindows(item: test_monitor, index: number) {
        current_index.value = index;
        test_monitor_wall.value.forEach((ele) => {
          ele.cmh = Math.round(ele.h / lcm.value);
          ele.cmw = Math.round(ele.w / lcm.value);
          test_monitor_list.value[ele.id] = JSON.parse(JSON.stringify(ele));
        });
        test_monitor_list.value.forEach((element) => {
          element.isHide = false;
        });
        test_monitor_wall.value.forEach((element) => {
          element.isShow = false;
        });
        test_monitor_list.value[item.id].isHide = true;
        test_monitor_wall.value[index].isShow = true;
        realtime_upload();
      },
      //cache和与主存间的地址映射由硬件自动完成
      closeAllWindows() {
        current_index.value = -1;
        test_monitor_wall.value.forEach((ele) => {
          ele.cmh = Math.round(ele.h / lcm.value);
          ele.cmw = Math.round(ele.w / lcm.value);
          test_monitor_list.value[ele.id] = JSON.parse(JSON.stringify(ele));
        });
        test_monitor_list.value.forEach((element) => {
          element.isHide = false;
        });
        test_monitor_wall.value.forEach((element) => {
          element.isShow = false;
        });
        multiple_select.value = [];
        realtime_upload();
      },
      box_width(row: number, col: number) {
        let tep = JSON.parse(
          JSON.stringify(test_monitor_list.value[(row - 1) * 4 + (col - 1)])
        );
        return tep.startw + "px";
      },
      box_height(row: number, col: number) {
        let tep = JSON.parse(
          JSON.stringify(test_monitor_list.value[(row - 1) * 4 + (col - 1)])
        );
        return tep.starth + "px";
      },
      box_line_height(row: number, col: number) {
        let tep = JSON.parse(
          JSON.stringify(test_monitor_list.value[(row - 1) * 4 + (col - 1)])
        );
        return tep.starth * 0.4 + "px";
      },
      show_box_line_height(height: number) {
        return height * 0.3 + "px";
      },
      center_x() {
        const wall_dom = wall.value;
        const item = test_monitor_wall.value[current_index.value];
        if (wall_dom) {
          item.currentx =
            (item.centerx / 3840) * wall_dom?.offsetWidth - item.w / 2;
        }
        realtime_upload();
      },
      center_y() {
        const wall_dom = wall.value;
        const item = test_monitor_wall.value[current_index.value];
        if (wall_dom) {
          item.currenty =
            (item.centery / 2160) * wall_dom?.offsetHeight - item.h / 2;
        }
        realtime_upload();
      },
      changePercenter() {
        const wall_dom = wall.value;
        let tep = false;
        test_monitor_wall.value.forEach((element) => {
          element.w = element.InitialW * percenter.value;
          element.h = element.InitialH * percenter.value;
          const rx: number = element.currentx + element.w;
          const ry: number = element.currenty + element.h;
          const wall_dom = wall.value;
          if (wall_dom) {
            if (rx > wall_dom.offsetWidth) {
              element.currentx = wall_dom.offsetWidth - element.w;
            }
            if (ry > wall_dom.offsetHeight) {
              element.currenty = wall_dom.offsetHeight - element.h;
            }
            element.centerx = Math.round(
              ((element.currentx + element.w / 2) / wall_dom?.offsetWidth) *
                3840
            );
            element.centery = Math.round(
              ((element.currenty + element.h / 2) / wall_dom?.offsetHeight) *
                2160
            );
          }

          if (element.isShow) {
            tep = true;
          }
        });
        realtime_upload();
      },
      canel_active() {
        Unchecked.value = true;
        if (Unchecked) {
          current_index.value = -1;
          test_monitor_wall.value.forEach((element) => {
            element.active = false;
          });
        }
        multiple_select.value = [];
        multiple.value = false;
        if (monitor_list_current_index.value != -1) {
          test_monitor_list.value[monitor_list_current_index.value].isactive =
            false;
          monitor_list_current_index.value = -1;
        }
      },
      changeAngle() {
        const wall_dom = wall.value;
        let item = test_monitor_wall.value[current_index.value];
        exceedrange(item);
        realtime_upload();
      },

      changewidth() {
        let item = test_monitor_list.value[monitor_list_current_index.value];
        item.w = Number(item.cmw) * lcm.value;
      },
      changeHeight() {
        let item = test_monitor_list.value[monitor_list_current_index.value];
        item.h = item.cmh * lcm.value;
      },
      alignTop() {
        let item = test_monitor_wall.value[multiple_select.value[0]];
        multiple_select.value.forEach((element) => {
          if (element != -1) {
            let tep_item = test_monitor_wall.value[element];
            tep_item.currenty = item.currenty;
          }
        });

        realtime_upload();
      },
      alignBottom() {
        let item = test_monitor_wall.value[multiple_select.value[0]];
        multiple_select.value.forEach((element) => {
          if (element != -1) {
            let tep_item = test_monitor_wall.value[element];
            tep_item.currenty = item.currenty + item.h - tep_item.h;
          }
        });
        realtime_upload();
      },
      alignRight() {
        let item = test_monitor_wall.value[multiple_select.value[0]];
        multiple_select.value.forEach((element) => {
          if (element != -1) {
            let tep_item = test_monitor_wall.value[element];
            tep_item.currentx = item.currentx + item.w - tep_item.w;
          }
        });

        realtime_upload();
      },
      alignLeft() {
        let item = test_monitor_wall.value[multiple_select.value[0]];
        multiple_select.value.forEach((element) => {
          if (element != -1) {
            let tep_item = test_monitor_wall.value[element];
            tep_item.currentx = item.currentx;
          }
        });
        realtime_upload();
      },
      testLog(a: any) {
        if (current_index.value != -1 || multiple_select.value.length > 1) {
          switch (a.key) {
            case "ArrowRight":
              {
                a.preventDefault();
                add_x();
              }
              break;
            case "ArrowLeft":
              {
                a.preventDefault();
                sub_x();
              }
              break;
            case "ArrowUp":
              {
                a.preventDefault();
                sub_y();
              }
              break;
            case "ArrowDown":
              {
                a.preventDefault();
                add_y();
              }
              break;
          }
        }
      },
      export_magic_wall() {
        let res: string = "";
        test_monitor_wall.value.forEach((ele, index) => {
          const point_list = four_point(ele);
          if (wall.value && point_list && ele.isShow) {
            point_list?.forEach((element) => {
              if (wall.value) {
                element.x = Math.round(
                  (element.x / wall.value.offsetWidth) * 3840
                );
                element.y = Math.round(
                  (element.y / wall.value.offsetHeight) * 2160
                );
              }
            });
            let item: exporttxt = new exporttxt(0, 0, 0, 0, {}, {}, {}, {});
            item.id = ele.id;
            item.point_left_top = [point_list[0]];
            item.point_left_bootom = [point_list[1]];
            item.point_right_top = [point_list[2]];
            item.point_right_bottom = [point_list[3]];
            item.w = Math.round((ele.w / wall.value?.offsetWidth) * 3840);
            item.h = Math.round((ele.h / wall.value.offsetHeight) * 2160);
            item.angle = ele.angle;
            res = res + JSON.stringify(item) + "\r\n";
          }
        });
        res = res.replace(/\"/g, "");
        const status = exportFile("magic_wall.txt", res);
        if (status === true) {
        } else {
          $q.notify({
            type: "warning",
            message: $t.t("data export ") + $t.t("fail") + "!",
            position: "top",
            timeout: 1500,
          });
        }
      },
    };
  },
});
</script>