Zzhangcheng修复缺陷
6395c6f8创建于 2024年6月5日历史提交
<template>
  <div class="debug-pane">
    <div class="pane">
      <div class="title-wrapper">
        <div class="title">
          <el-icon><CaretBottom /></el-icon>
          {{ $t('debugPane.callStack') }}
        </div>
      </div>
      <el-table :data="props.stackList" border max-height="200">
        <el-table-column
          prop="frameno"
          align="center"
          :label="$t('debugPane.callHierarchy')"
          width="70"
        />
        <el-table-column
          prop="funcname"
          align="center"
          :label="$t('debugPane.function')"
          min-width="180"
          show-overflow-tooltip
        />
        <el-table-column
          prop="lineno"
          align="center"
          :label="$t('debugPane.currentLineNumber')"
          width="65"
        />
      </el-table>
    </div>
    <div class="pane">
      <div class="title-wrapper">
        <div class="title left">
          <el-icon><CaretBottom /></el-icon>
          {{ $t('debugPane.breakpoint') }}
        </div>
        <div class="right">
          <el-button plain @click="handleChangeStatus(true)">
            {{ $t('button.enabled') }}
          </el-button>
          <el-button type="primary" @click="handleChangeStatus(false)">
            {{ $t('button.disabled') }}
          </el-button>
        </div>
      </div>
      <el-table
        ref="multipleTableRef"
        :data="props.breakPointList"
        border
        max-height="250"
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" align="center" width="35" />
        <el-table-column
          prop="lineno"
          align="center"
          :label="$t('debugPane.lineNumber')"
          width="65"
        />
        <el-table-column
          prop="query"
          align="center"
          :label="$t('debugPane.sentence')"
          min-width="100"
          show-overflow-tooltip
        />
        <el-table-column prop="enable" align="center" :label="$t('button.status')" width="65">
          <template #default="scope">{{
            scope.row.enable ? $t('button.enabled') : $t('button.disabled')
          }}</template>
        </el-table-column>
      </el-table>
    </div>
    <div class="pane">
      <div class="title-wrapper">
        <div class="title">
          <el-icon><CaretBottom /></el-icon>
          {{ $t('debugPane.variable') }}
        </div>
      </div>
      <el-table ref="singleTableRef" :data="variableList" border max-height="290">
        <el-table-column
          prop="varname"
          align="center"
          :label="$t('debugPane.variable')"
          :min-width="100"
          show-overflow-tooltip
        >
          <template #header>
            <FilterTableDataHeaderSlot
              v-model="filterVariableText"
              v-model:show="showVariableInput"
            >
              {{ $t('common.name') }}
            </FilterTableDataHeaderSlot>
          </template>
        </el-table-column>
        <el-table-column
          prop="value"
          align="center"
          :label="$t('debugPane.value')"
          min-width="100"
          show-overflow-tooltip
        />
        <el-table-column
          prop="vartype"
          align="center"
          :label="$t('debugPane.dataType')"
          width="70"
        />
        <el-table-column
          prop="paramType"
          align="center"
          :label="$t('debugPane.paramType')"
          width="70"
        />
      </el-table>
    </div>
  </div>
</template>
<script lang="ts" setup>
  import { ElTable } from 'element-plus';
  import FilterTableDataHeaderSlot from '@/components/FilterTableDataHeaderSlot.vue';

  interface Props {
    stackList: any[];
    breakPointList: any[];
    variableList: any[];
    variableHighLight?: number;
  }
  const props = withDefaults(defineProps<Props>(), {
    stackList: () => [],
    breakPointList: () => [],
    variableList: () => [],
  });
  interface ChangeBreakPoint {
    type: boolean;
    line: number[];
  }
  const emit = defineEmits<{
    (e: 'changeBreakPoint', value: ChangeBreakPoint): void;
  }>();

  const multipleTableRef = ref<InstanceType<typeof ElTable>>();
  interface Table2 {
    id: number;
    lineno: string;
    query: string;
    enable: boolean;
  }
  const multipleSelection = ref<Table2[]>([]);
  const handleSelectionChange = (val: Table2[]) => {
    multipleSelection.value = val;
  };

  // enable / disabled
  const handleChangeStatus = (status: boolean) => {
    const result: ChangeBreakPoint = {
      type: status,
      line: [],
    };
    multipleSelection.value.forEach((item) => {
      if (item.enable !== status) {
        item.enable = status;
        result.line.push(parseInt(item.lineno));
      }
    });
    emit('changeBreakPoint', result);
    multipleTableRef.value!.clearSelection();
  };

  // table3 hightline
  const showVariableInput = ref(false);
  const filterVariableText = ref('');
  const variableList = computed(() => {
    return filterVariableText.value
      ? props.variableList.filter((item) => item.varname.indexOf(filterVariableText.value) > -1)
      : props.variableList;
  });
  const singleTableRef = ref<InstanceType<typeof ElTable>>();
  watch(
    () => props.variableList,
    () => {
      filterVariableText.value == '';
    },
  );
</script>
<style lang="scss" scoped>
  :deep(.el-table) {
    .el-table__body tr:hover > td.el-table__cell {
      background: none;
    }
    .el-table__body tr.current-row > td.el-table__cell {
      background-color: rgba(255, 255, 0, 0.7);
    }
    .el-table__cell {
      padding: 2px 0;
    }
    .cell {
      padding: 0 3px;
      line-height: 20px;
    }
    .el-table-column--selection > .cell {
      height: 20px;
    }
  }
  .debug-pane {
    padding-left: 15px;
  }
  .pane {
    &:not(:last-child) {
      margin-bottom: 15px;
    }
    .title-wrapper {
      display: flex;
      justify-content: space-between;
      margin-bottom: 5px;
    }
    .title {
      font-weight: bold;
      .el-icon {
        margin-right: 5px;
        font-size: 14px;
      }
    }
  }
</style>