变量选择支持enterData.type和enterData.payload

This commit is contained in:
fofolee 2025-02-21 18:36:17 +08:00
parent ded2a546a5
commit 89a493e626
6 changed files with 126 additions and 32 deletions

View File

@ -93,6 +93,7 @@
@update-flow="updateFlows(flow)" @update-flow="updateFlows(flow)"
:is-main-flow="flow.id === 'main'" :is-main-flow="flow.id === 'main'"
:output-variables="outputVariables" :output-variables="outputVariables"
:global-variables="pluginGlobalVariables"
class="variable-panel" class="variable-panel"
/> />
</div> </div>
@ -101,6 +102,7 @@
<script> <script>
import { defineComponent, provide, ref, computed } from "vue"; import { defineComponent, provide, ref, computed } from "vue";
import { useRoute } from "vue-router";
import draggable from "vuedraggable"; import draggable from "vuedraggable";
import ComposerFlow from "components/composer/ComposerFlow.vue"; import ComposerFlow from "components/composer/ComposerFlow.vue";
import ComposerButtons from "components/composer/flow/ComposerButtons.vue"; import ComposerButtons from "components/composer/flow/ComposerButtons.vue";
@ -197,6 +199,49 @@ export default defineComponent({
return flows.value.find((flow) => flow.id === activeTab.value); return flows.value.find((flow) => flow.id === activeTab.value);
}; };
const route = useRoute();
const isRunComposerPage = computed(() => {
return route.name === "composer";
});
const pluginGlobalVariables = computed(() => {
if (isRunComposerPage.value) return [];
return [
{
name: "quickcommand.enterData.type",
sourceCommand: {
label: "匹配模式",
},
description:
"以什么模式进入插件,可能的值:\n" +
"关键字text\n" +
"正则匹配regex\n" +
"所有文本over\n" +
"图片匹配img\n" +
"文件匹配files\n" +
"窗口匹配window",
type: "global",
},
{
name: "quickcommand.enterData.payload",
sourceCommand: {
label: "匹配内容",
},
description:
"根据不同的匹配模式,返回不同的内容:\n" +
"关键字(text):返回进入插件的关键字\n" +
"正则(regex):返回匹配的文本\n" +
"所有文本(over):返回匹配的文本\n" +
"窗口(window):返回匹配的窗口信息(对象)\n" +
"文件(files):返回匹配的文件信息(数组)\n" +
"图片(img):返回匹配的图片信息(dataURL)",
type: "global",
},
];
});
// //
const getOutputVariables = (flow = getCurrentFlow()) => { const getOutputVariables = (flow = getCurrentFlow()) => {
const variables = []; const variables = [];
@ -251,7 +296,7 @@ export default defineComponent({
label: v.type === "param" ? "函数参数" : "局部变量", label: v.type === "param" ? "函数参数" : "局部变量",
}, },
})); }));
return [...customVariables, ...variables]; return [...pluginGlobalVariables.value, ...customVariables, ...variables];
}; };
provide("getCurrentVariables", getCurrentVariables); provide("getCurrentVariables", getCurrentVariables);
@ -263,8 +308,10 @@ export default defineComponent({
commandConfig, commandConfig,
activeTab, activeTab,
getOutputVariables, getOutputVariables,
pluginGlobalVariables,
updateFlows, updateFlows,
clearFlows, clearFlows,
isRunComposerPage,
}; };
}, },
data() { data() {
@ -275,9 +322,6 @@ export default defineComponent({
}; };
}, },
computed: { computed: {
isRunComposerPage() {
return this.$route.name === "composer";
},
showCommandConfig() { showCommandConfig() {
return !this.isRunComposerPage && this.commandConfig.features; return !this.isRunComposerPage && this.commandConfig.features;
}, },

View File

@ -31,6 +31,7 @@
<VariableList <VariableList
:show-variable-list="showVariableList" :show-variable-list="showVariableList"
:show-function-list="showFunctionList" :show-function-list="showFunctionList"
:show-global-variables="false"
@emit-value="updateValBySelect" @emit-value="updateValBySelect"
class="variable-list-btn" class="variable-list-btn"
/> />

View File

@ -51,6 +51,7 @@
@emit-value="updateValBySelect" @emit-value="updateValBySelect"
:show-variable-list="true" :show-variable-list="true"
:show-function-list="true" :show-function-list="true"
:show-global-variables="true"
class="prepend-btn variable-list-btn" class="prepend-btn variable-list-btn"
/> />
</template> </template>

View File

@ -30,10 +30,27 @@
<q-item-label class="variable-name"> <q-item-label class="variable-name">
{{ variable.name }} {{ variable.name }}
</q-item-label> </q-item-label>
<q-item-label caption class="variable-source"> <q-item-label
来自: {{ variable.sourceCommand.label }} caption
class="variable-source"
v-if="variable.sourceCommand"
>
<span>
{{ variable.type === "global" ? "全局变量:" : "来自:" }}
</span>
<span>{{ variable.sourceCommand.label }}</span>
</q-item-label> </q-item-label>
</q-item-section> </q-item-section>
<q-tooltip
anchor="center left"
self="center end"
v-if="variable.description"
>
<div
v-text="variable.description"
class="variable-description"
></div>
</q-tooltip>
</q-item> </q-item>
</div> </div>
<div v-if="functions.length && showFunctionList"> <div v-if="functions.length && showFunctionList">
@ -56,7 +73,7 @@
<q-item-label class="variable-name"> <q-item-label class="variable-name">
{{ func.name }} {{ func.name }}
</q-item-label> </q-item-label>
<q-item-label caption class="variable-source"> <q-item-label caption class="row item">
{{ func.label }} {{ func.label }}
</q-item-label> </q-item-label>
</q-item-section> </q-item-section>
@ -138,12 +155,15 @@ import { defineComponent, inject } from "vue";
export default defineComponent({ export default defineComponent({
name: "VariableList", name: "VariableList",
emits: ["emitValue"], emits: ["emitValue"],
setup() { setup(props) {
const getCurrentVariables = inject("getCurrentVariables"); const getCurrentVariables = inject("getCurrentVariables");
const commandIndex = inject("commandIndex", null); const commandIndex = inject("commandIndex", null);
const getAvailableVariables = () => { const getAvailableVariables = () => {
const variables = getCurrentVariables(); let variables = getCurrentVariables();
if (!props.showGlobalVariables) {
variables = variables.filter((variable) => variable.type !== "global");
}
const usableVariables = variables.filter((variable) => const usableVariables = variables.filter((variable) =>
// //
variable.type === "output" variable.type === "output"
@ -192,6 +212,10 @@ export default defineComponent({
}, },
}, },
props: { props: {
showGlobalVariables: {
type: Boolean,
default: true,
},
showVariableList: { showVariableList: {
type: Boolean, type: Boolean,
default: true, default: true,
@ -321,4 +345,10 @@ export default defineComponent({
.empty-tip .q-separator { .empty-tip .q-separator {
opacity: 0.2; opacity: 0.2;
} }
.variable-description {
word-break: break-all;
white-space: pre-wrap;
font-size: 11px;
}
</style> </style>

View File

@ -92,6 +92,31 @@
</div> </div>
</div> </div>
<div class="section">
<div class="section-header">
<div class="section-title">
<q-icon name="data_object" size="16px" class="text-primary" />
<span>全局变量</span>
</div>
</div>
<div class="var-list">
<div
v-for="(variable, index) in globalVariables"
:key="index"
class="var-item"
>
<div class="global-var-name">{{ variable.name }}</div>
<q-tooltip
v-if="variable.description"
anchor="center left"
self="center end"
>
<div class="var-description">{{ variable.description }}</div>
</q-tooltip>
</div>
</div>
</div>
<!-- 手动变量管理部分 --> <!-- 手动变量管理部分 -->
<div class="section"> <div class="section">
<div class="section-header"> <div class="section-header">
@ -203,6 +228,11 @@ export default defineComponent({
required: true, required: true,
default: () => [], default: () => [],
}, },
globalVariables: {
type: Array,
required: true,
default: () => [],
},
}, },
emits: ["update:modelValue", "update:flow"], emits: ["update:modelValue", "update:flow"],
computed: { computed: {
@ -410,12 +440,23 @@ export default defineComponent({
font-weight: 500; font-weight: 500;
} }
.global-var-name {
font-size: 11px;
opacity: 0.7;
}
.var-source { .var-source {
margin-left: auto; margin-left: auto;
font-size: 11px; font-size: 11px;
opacity: 0.7; opacity: 0.7;
} }
.var-description {
word-break: break-all;
white-space: pre-wrap;
font-size: 11px;
}
.section-content { .section-content {
padding: 8px; padding: 8px;
} }

View File

@ -4,29 +4,6 @@ export const utoolsCommands = {
label: "uTools功能", label: "uTools功能",
icon: "insights", icon: "insights",
commands: [ commands: [
{
value: "quickcommand.enterData.valueOf",
label: "获取匹配数据",
icon: "visibility_off",
outputs: {
label: "匹配数据",
suggestName: "enterData",
placeholder: "返回 {code, type, payload, from}",
structure: {
type: {
label: "匹配类型",
suggestName: "enterType",
placeholder:
'返回 "text" | "img" | "file" | "regex" | "over" | "window"',
},
payload: {
label: "匹配的数据",
suggestName: "enterPayload",
placeholder: "返回 string | MatchFile[] | MatchWindow",
},
},
},
},
{ {
value: "utools.hideMainWindow", value: "utools.hideMainWindow",
label: "隐藏主窗口", label: "隐藏主窗口",