<template> <div class="window_class window_flag" :class=" $props.window.uuid == $store.state.selected_window ? 'window_selected' : 'window_normal' " @mousedown="onMouseDown" @click="onClick" @touchend="onTouchEnd" :style="{ background: $props.window.client_color, }" > <q-popup-proxy context-menu> <q-list> <q-item clickable v-close-popup :disable="$props.disable" @click="$emit('edit_volume', $props.window.window_id)" v-if="false && !$props.window.muted && is_audo_player_window" > <q-item-section> {{ $t("edit volume") }} </q-item-section> </q-item> <q-item clickable v-close-popup :disable="$props.disable" @click="$emit('mute_unmute', $props.window.window_id)" v-if="false && is_audo_player_window" > <q-item-section> {{ $props.window.muted ? $t("unmute") : $t("mute") }} </q-item-section> </q-item> <q-item clickable v-close-popup :disable="$props.disable" @click="$emit('replace_this_window', $props.window.window_id)" > <q-item-section> {{ $t("replace window") }} </q-item-section> </q-item> <q-item clickable v-close-popup :disable="$props.disable" @click="$emit('edit_rect', $props.window.window_id)" > <q-item-section> {{ $t("edit window rect") }} </q-item-section> </q-item> <q-item clickable v-close-popup :disable="$props.disable" @click="$emit('close_this_window', $props.window.window_id)" > <q-item-section> {{ $t("close this window") }} </q-item-section> </q-item> <q-item clickable v-close-popup :disable="$props.disable" @click="$emit('close_other_windows', $props.window.window_id)" > <q-item-section> {{ $t("close other windows") }} </q-item-section> </q-item> <q-item v-if="false" clickable v-close-popup :disable="$props.disable" @click="$emit('close_all_windows', $props.window.window_id)" > <q-item-section> {{ $t("close all windows") }} </q-item-section> </q-item> <q-item clickable v-if="false"> <q-item-section>{{ $t("trimming window") }}</q-item-section> <q-item-section side> <q-icon name="keyboard_arrow_right" /> </q-item-section> <q-menu anchor="top end" self="top start"> <q-list> <q-item v-close-popup :disable="$props.disable" clickable> <q-item-section>{{ $t("trimming window pos") }}</q-item-section> </q-item> <q-item v-close-popup :disable="$props.disable" clickable> <q-item-section>{{ $t("trimming window size") }}</q-item-section> </q-item> </q-list> </q-menu> </q-item> <q-item v-if="false" clickable v-close-popup :disable="$props.disable" @click="$emit('top_window', $props.window.window_id)" > <q-item-section> {{ $t("top window") }} </q-item-section> </q-item> <q-item v-if="false" clickable v-close-popup :disable="$props.disable" @click="$emit('lower_window', $props.window.window_id)" > <q-item-section> {{ $t("lower window") }} </q-item-section> </q-item> <div> <q-item clickable v-close-popup :disable="$props.disable" @click="$emit('start_polling', $props.window.window_id)" v-if="!$props.window.polling" > <q-item-section> {{ $t("start polling") }} </q-item-section> </q-item> <q-item clickable v-close-popup :disable="$props.disable" @click="$emit('stop_polling', $props.window.window_id)" v-else > <q-item-section> {{ $t("stop polling") }} </q-item-section> </q-item> <q-item v-if="show_pollong_setting_context_menu" clickable v-close-popup :disable="$props.disable || $props.window.polling" @click="$emit('polling_setting', $props.window.window_id)" > <q-item-section> {{ $t("polling setting") }} </q-item-section> </q-item> </div> </q-list> </q-popup-proxy> <div class="row title_bar full-width"> <q-icon size="1.5em" :name=" getItemIcon( $props.window.polling ? $props.window.polling_window_type : signal_source.window_type ) " class="q-mr-xs" /> <span v-if="$props.window.polling">{{ $props.window.polling_title }}</span> <span v-else>{{ signal_source.name }}</span> <q-space /> <div> <q-spinner-box v-if="$props.window.polling" color="primary" size="1.5em" /> <q-tooltip>{{ $t("polling now") }}</q-tooltip> </div> <div> <q-icon v-if=" $props.window.polling ? calc_is_audio_player_window($props.window.polling_window_type) : is_audo_player_window " size="1.5em" :name="$props.window.muted ? 'volume_off' : 'volume_up'" /> <q-tooltip>{{ $t($props.window.muted ? "muted now" : "unmuted now") }}</q-tooltip> </div> </div> </div> </template> <style scoped> .window_class { } .window_flag { } .window_selected { outline-style: dashed; outline-color: #166fab; } .window_normal { border: 1px solid #166fab; } .title_bar { border: 1px solid black; } .top { z-index: 1; } </style> <script lang="ts"> import { Common } from "src/common/Common"; import GlobalData from "src/common/GlobalData"; import { defineComponent, ref, watch, computed, getCurrentInstance } from "vue"; import { useStore } from "src/store"; import { SignalSourceEntity } from "src/entities/SignalSourceEntity"; class _Flags { get up_flag() { return 0x0001; } get down_flag() { return 0x0002; } get left_flag() { return 0x0004; } get right_flag() { return 0x0008; } } export default defineComponent({ name: "ComponentWindow", components: {}, props: { signal_source_table_uuid: { type: String, required: true, }, window: { type: Object, required: true, }, disable: { type: Boolean, }, mouse_area_flag: { type: Boolean, }, plan_running: { type: Boolean, }, show_pollong_setting_context_menu: { type: Boolean, default: false, }, }, emits: [ "close_this_window", "close_other_windows", "close_all_windows", "replace_this_window", "top_window", "lower_window", "edit_volume", "mute_unmute", "stop_polling", "start_polling", "polling_setting", "dbtouch", "edit_rect", ], setup(props, { emit }) { const $store = useStore(); const signal_source = ref(new SignalSourceEntity()); const reload_signal_source = () => { SignalSourceEntity.copy( signal_source.value, GlobalData.getInstance().getSignalSource(props.signal_source_table_uuid) ); }; const calc_is_audio_player_window = (window_type: string) => { return ( window_type == "EwindowType::Multimedia" || window_type == "EwindowType::Rtsp" || window_type == "EwindowType::HdmiIn" ); }; const is_audo_player_window = computed(() => calc_is_audio_player_window(signal_source.value.window_type) ); watch( () => props.window, (n, o) => { reload_signal_source(); } ); reload_signal_source(); const flags = new _Flags(); let ctrl_press_flag = false; let prev_touch_time = 0; const onclick = (evt: UIEvent) => { if (props.plan_running) { return; } if (ctrl_press_flag) { ctrl_press_flag = false; return; } if (!props.mouse_area_flag) { // evt.stopPropagation(); if (props.window.uuid != $store.state.selected_window) { GlobalData.getInstance() .getCurrentClient() ?.focusIn(props.window.window_id); } $store.commit("setSelectedWindow", props.window.uuid); } }; return { signal_source, flags, is_audo_player_window, calc_is_audio_player_window, onMouseDown(evt: MouseEvent) { if (evt.ctrlKey) { ctrl_press_flag = true; } }, onTouchEnd(evt: TouchEvent) { if ((<any>window).touchPriority) { let time = Date.now(); if (time - prev_touch_time < 300) { emit("dbtouch"); } else { onclick(evt); } prev_touch_time = time; } }, onClick(evt: MouseEvent) { if ((<any>window).touchPriority) { return; } onclick(evt); }, getItemIcon(item_type: string) { return Common.getSignalSourceIcon(item_type); }, }; }, }); </script>