Skip to content

Commit 1cd3232

Browse files
authored
feat: support expressions for most internal action fields #2345 (#3617)
1 parent 5d6e000 commit 1cd3232

39 files changed

+1909
-1196
lines changed

companion/lib/Controls/Controller.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import { createActionSetsTrpcRouter } from './ActionSetsTrpcRouter.js'
3030
import { createControlsTrpcRouter } from './ControlsTrpcRouter.js'
3131
import z from 'zod'
3232
import type { SomeControlModel, UIControlUpdate } from '@companion-app/shared/Model/Controls.js'
33-
import type { VariableValues } from '@companion-app/shared/Model/Variables.js'
33+
import type { VariableValue, VariableValues } from '@companion-app/shared/Model/Variables.js'
3434
import type { VariablesAndExpressionParser } from '../Variables/VariablesAndExpressionParser.js'
3535
import { ControlExpressionVariable } from './ControlTypes/ExpressionVariable.js'
3636
import type {
@@ -41,6 +41,7 @@ import { ExpressionVariableCollections } from './ExpressionVariableCollections.j
4141
import { createExpressionVariableTrpcRouter } from './ExpressionVariableTrpcRouter.js'
4242
import { ExpressionVariableNameMap } from './ExpressionVariableNameMap.js'
4343
import { ControlButtonPreset } from './ControlTypes/Button/Preset.js'
44+
import type { CompanionFeedbackButtonStyleResult } from '@companion-module/host'
4445

4546
/**
4647
* The class that manages the controls
@@ -766,5 +767,5 @@ export class ControlsController {
766767
export interface NewFeedbackValue {
767768
id: string
768769
controlId: string
769-
value: any
770+
value: CompanionFeedbackButtonStyleResult | VariableValue
770771
}

companion/lib/Instance/Connection/ChildHandlerLegacy.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,7 @@ export class ConnectionChildHandlerLegacy implements ChildProcessHandlerBase, Co
753753

754754
feedbackType: null,
755755
feedbackStyle: undefined,
756+
optionsSupportExpressions: false, // Expressions not supported from 1.x modules
756757
} satisfies Complete<ClientEntityDefinition>
757758
}
758759

@@ -789,6 +790,7 @@ export class ConnectionChildHandlerLegacy implements ChildProcessHandlerBase, Co
789790

790791
showButtonPreview: false,
791792
supportsChildGroups: [],
793+
optionsSupportExpressions: false, // Expressions not supported from 1.x modules
792794
} satisfies Complete<ClientEntityDefinition>
793795
}
794796

companion/lib/Instance/Connection/ConfigFieldsLegacy.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,11 @@ function translateTextInputField(
146146
usesInternalVariableParsing: boolean
147147
): Complete<CompanionInputFieldTextInputExtended> {
148148
let useVariables: CompanionFieldVariablesSupport | undefined
149-
if (field.useVariables) {
149+
if (usesInternalVariableParsing) {
150+
useVariables = { local: true }
151+
} else if (field.useVariables) {
150152
useVariables = {
151-
local: usesInternalVariableParsing || (typeof field.useVariables === 'object' && field.useVariables.local),
153+
local: typeof field.useVariables === 'object' && field.useVariables.local,
152154
}
153155
}
154156

@@ -254,13 +256,18 @@ function translateCustomVariableField(
254256

255257
function translateCommonFields(
256258
field: EncodeIsVisible<CompanionInputFieldBase>
257-
): Pick<Complete<CompanionInputFieldBaseExtended>, 'id' | 'label' | 'tooltip' | 'description' | 'isVisibleUi'> {
259+
): Pick<
260+
Complete<CompanionInputFieldBaseExtended>,
261+
'id' | 'label' | 'tooltip' | 'description' | 'expressionDescription' | 'isVisibleUi' | 'disableAutoExpression'
262+
> {
258263
return {
259264
id: field.id,
260265
label: field.label,
261266
tooltip: field.tooltip,
262267
description: field.description,
268+
expressionDescription: undefined, // Expressions not supported from 1.x modules
263269
isVisibleUi: translateIsVisibleFn(field),
270+
disableAutoExpression: true, // Expressions not supported from 1.x modules
264271
}
265272
}
266273

companion/lib/Instance/Connection/Thread/ConfigFields.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,18 +240,23 @@ function translateCustomVariableField(
240240

241241
function translateCommonFields(
242242
field: CompanionInputFieldBase
243-
): Pick<Complete<CompanionInputFieldBaseExtended>, 'id' | 'label' | 'tooltip' | 'description' | 'isVisibleUi'> {
243+
): Pick<
244+
Complete<CompanionInputFieldBaseExtended>,
245+
'id' | 'label' | 'tooltip' | 'description' | 'expressionDescription' | 'isVisibleUi' | 'disableAutoExpression'
246+
> {
244247
return {
245248
id: field.id,
246249
label: field.label,
247250
tooltip: field.tooltip,
248251
description: field.description,
252+
expressionDescription: undefined, // Temporary until #2345
249253
isVisibleUi: field.isVisibleExpression
250254
? {
251255
type: 'expression',
252256
fn: field.isVisibleExpression,
253257
data: undefined,
254258
}
255259
: undefined,
260+
disableAutoExpression: true, // Temporary until #2345
256261
}
257262
}

companion/lib/Instance/Connection/Thread/HostContext.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ export class HostContext<TConfig, TSecrets> implements ModuleHostContext<TConfig
7070

7171
feedbackType: null,
7272
feedbackStyle: undefined,
73+
74+
optionsSupportExpressions: false, // Future: follow up to enable for modules!
7375
} satisfies Complete<ClientEntityDefinition>
7476
}
7577

@@ -97,6 +99,8 @@ export class HostContext<TConfig, TSecrets> implements ModuleHostContext<TConfig
9799

98100
showButtonPreview: false,
99101
supportsChildGroups: [],
102+
103+
optionsSupportExpressions: false, // Future: follow up to enable for modules!
100104
} satisfies Complete<ClientEntityDefinition>
101105
}
102106

companion/lib/Instance/Definitions.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { EventEmitter } from 'node:events'
2828
import type { InstanceConfigStore } from './ConfigStore.js'
2929
import { ModuleInstanceType } from '@companion-app/shared/Model/Instance.js'
3030
import { ConvertPresetStyleToDrawStyle } from './Connection/Thread/Presets.js'
31+
import type { ExpressionOrValue } from '@companion-app/shared/Model/Options.js'
3132

3233
type InstanceDefinitionsEvents = {
3334
readonly updatePresets: [connectionId: string]
@@ -151,7 +152,15 @@ export class InstanceDefinitions extends EventEmitter<InstanceDefinitionsEvents>
151152

152153
if (definition.options !== undefined && definition.options.length > 0) {
153154
for (const opt of definition.options) {
154-
entity.options[opt.id] = structuredClone((opt as any).default)
155+
const defaultValue = structuredClone((opt as any).default)
156+
if (definition.optionsSupportExpressions && !opt.disableAutoExpression) {
157+
entity.options[opt.id] = {
158+
isExpression: false,
159+
value: defaultValue,
160+
} satisfies ExpressionOrValue<any>
161+
} else {
162+
entity.options[opt.id] = defaultValue
163+
}
155164
}
156165
}
157166

companion/lib/Instance/Surface/Thread/ConfigFields.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,14 @@ function translateCommonFields(
113113
field: CompanionInputFieldBase
114114
): Pick<
115115
Complete<CompanionInputFieldBaseExtended>,
116-
'id' | 'label' | 'tooltip' | 'description' | 'isVisibleUi' | 'width'
116+
| 'id'
117+
| 'label'
118+
| 'tooltip'
119+
| 'description'
120+
| 'expressionDescription'
121+
| 'isVisibleUi'
122+
| 'width'
123+
| 'disableAutoExpression'
117124
> {
118125
return {
119126
id: field.id,
@@ -127,6 +134,9 @@ function translateCommonFields(
127134
data: undefined,
128135
}
129136
: undefined,
137+
// Note valid for surface configs:
138+
expressionDescription: undefined,
130139
width: undefined,
140+
disableAutoExpression: true,
131141
}
132142
}

0 commit comments

Comments
 (0)