@flexem/fc-gui 3.0.0-alpha.18 → 3.0.0-alpha.180

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/CHANGELOG.md +419 -1
  2. package/assets/img/black_first_page.png +0 -0
  3. package/assets/img/black_last_page.png +0 -0
  4. package/assets/img/black_next_page.png +0 -0
  5. package/assets/img/black_previous_page.png +0 -0
  6. package/assets/img/exclamation-outline-circle.png +0 -0
  7. package/bundles/@flexem/fc-gui.umd.js +39377 -34650
  8. package/bundles/@flexem/fc-gui.umd.js.map +1 -1
  9. package/bundles/@flexem/fc-gui.umd.min.js +5 -5
  10. package/bundles/@flexem/fc-gui.umd.min.js.map +1 -1
  11. package/communication/variable/variable-communicator.d.ts +5 -0
  12. package/communication/variable/variable-state-enum.d.ts +1 -0
  13. package/communication/variable/variable-state-enum.js +1 -0
  14. package/communication/variable/variable-state-enum.metadata.json +1 -1
  15. package/communication/variable/variable-value.d.ts +4 -1
  16. package/communication/variable/variable-value.js +4 -1
  17. package/communication/variable/variable-value.metadata.json +1 -1
  18. package/config/alarm/alarm.store.d.ts +6 -0
  19. package/config/alarm/alarm.store.js +0 -0
  20. package/config/alarm/alarm.store.metadata.json +1 -0
  21. package/config/alarm/get-alarms-args.d.ts +12 -0
  22. package/config/alarm/get-alarms-args.js +13 -0
  23. package/config/alarm/get-alarms-args.metadata.json +1 -0
  24. package/config/alarm/index.d.ts +2 -0
  25. package/config/alarm/index.js +1 -0
  26. package/config/alarm/index.metadata.json +1 -0
  27. package/config/config-store.d.ts +2 -0
  28. package/config/gui-feature-config.d.ts +3 -0
  29. package/config/gui-feature-config.js +3 -0
  30. package/config/gui-feature-config.metadata.json +1 -0
  31. package/config/index.d.ts +2 -0
  32. package/config/index.js +2 -0
  33. package/config/index.metadata.json +1 -1
  34. package/config/variable/variable-store.d.ts +1 -0
  35. package/elements/air-quality/air-quality-element.js +3 -4
  36. package/elements/alarm/alarm-element.d.ts +69 -0
  37. package/elements/alarm/alarm-element.js +497 -0
  38. package/elements/alarm/alarm-element.metadata.json +1 -0
  39. package/elements/bar-graph-element.d.ts +10 -2
  40. package/elements/bar-graph-element.js +135 -5
  41. package/elements/bar-graph-element.metadata.json +1 -1
  42. package/elements/base/readable-element.d.ts +6 -1
  43. package/elements/base/readable-element.js +69 -2
  44. package/elements/base/readable-element.metadata.json +1 -1
  45. package/elements/base/state-control-element.d.ts +3 -1
  46. package/elements/base/state-control-element.js +21 -5
  47. package/elements/character-display/character-display-element.js +3 -2
  48. package/elements/character-display/character-display-element.metadata.json +1 -1
  49. package/elements/datetime-display/datetime-display-element.d.ts +1 -0
  50. package/elements/datetime-display/datetime-display-element.js +10 -2
  51. package/elements/datetime-display/datetime-display-element.metadata.json +1 -1
  52. package/elements/datetime-display/time-zone-select-json.d.ts +8 -0
  53. package/elements/datetime-display/time-zone-select-json.js +558 -0
  54. package/elements/historical-curve/historical-curve.element.d.ts +44 -3
  55. package/elements/historical-curve/historical-curve.element.js +696 -32
  56. package/elements/historical-curve/historical-curve.element.metadata.json +1 -1
  57. package/elements/main-element.d.ts +1 -0
  58. package/elements/main-element.js +70 -9
  59. package/elements/main-element.metadata.json +1 -1
  60. package/elements/meter-element.d.ts +7 -1
  61. package/elements/meter-element.js +76 -7
  62. package/elements/meter-element.metadata.json +1 -1
  63. package/elements/numerical-display/numerical-display-element.d.ts +22 -3
  64. package/elements/numerical-display/numerical-display-element.js +145 -12
  65. package/elements/numerical-display/numerical-display-element.metadata.json +1 -1
  66. package/elements/per-view-variable-communicator.d.ts +4 -0
  67. package/elements/per-view-variable-communicator.js +21 -1
  68. package/elements/per-view-variable-communicator.metadata.json +1 -1
  69. package/elements/ring-graph/ring-graph-element.d.ts +13 -1
  70. package/elements/ring-graph/ring-graph-element.js +164 -3
  71. package/elements/ring-graph/ring-graph-element.metadata.json +1 -1
  72. package/elements/scroll-alarm/scroll-alarm-element.d.ts +79 -0
  73. package/elements/scroll-alarm/scroll-alarm-element.js +845 -0
  74. package/elements/scroll-alarm/scroll-alarm-element.metadata.json +1 -0
  75. package/elements/shared/graph/graph-state-element.d.ts +1 -0
  76. package/elements/shared/graph/graph-state-element.js +30 -1
  77. package/elements/shared/graph/graph-state-element.metadata.json +1 -1
  78. package/elements/shared/text/text-element.d.ts +14 -0
  79. package/elements/shared/text/text-element.js +42 -4
  80. package/elements/shared/text/text-element.metadata.json +1 -1
  81. package/elements/shared/text/text-state-element.d.ts +39 -2
  82. package/elements/shared/text/text-state-element.js +242 -67
  83. package/elements/shared/text/text-state-element.metadata.json +1 -1
  84. package/elements/static-elements/hyperlink-element.d.ts +28 -2
  85. package/elements/static-elements/hyperlink-element.js +153 -4
  86. package/elements/static-elements/hyperlink-element.metadata.json +1 -1
  87. package/elements/static-elements/text-element.d.ts +28 -2
  88. package/elements/static-elements/text-element.js +162 -12
  89. package/elements/static-elements/text-element.metadata.json +1 -1
  90. package/elements/switch-indicator-light/bit-indicator-light-operator.d.ts +1 -0
  91. package/elements/switch-indicator-light/bit-indicator-light-operator.js +10 -3
  92. package/elements/switch-indicator-light/bit-indicator-light-operator.metadata.json +1 -1
  93. package/elements/switch-indicator-light/switch-indicator-light-element.d.ts +11 -2
  94. package/elements/switch-indicator-light/switch-indicator-light-element.js +70 -12
  95. package/elements/switch-indicator-light/switch-indicator-light-element.metadata.json +1 -1
  96. package/elements/switch-indicator-light/word-indicator-light-operator.d.ts +1 -0
  97. package/elements/switch-indicator-light/word-indicator-light-operator.js +10 -3
  98. package/elements/switch-indicator-light/word-indicator-light-operator.metadata.json +1 -1
  99. package/elements/video/video-element.d.ts +10 -0
  100. package/elements/video/video-element.js +139 -21
  101. package/elements/video/video-element.metadata.json +1 -1
  102. package/elements/view-operation/view-operation.element.d.ts +28 -2
  103. package/elements/view-operation/view-operation.element.js +163 -4
  104. package/elements/view-operation/view-operation.element.metadata.json +1 -1
  105. package/elements/weather/weater-element.js +0 -1
  106. package/gui/gui-context.d.ts +25 -2
  107. package/gui/gui-host.d.ts +1 -1
  108. package/gui/gui-view.d.ts +4 -1
  109. package/gui/gui-view.js +69 -8
  110. package/gui/gui-view.metadata.json +1 -1
  111. package/gui/gui.component.d.ts +3 -0
  112. package/gui/gui.component.js +15 -2
  113. package/gui/gui.component.metadata.json +1 -1
  114. package/localization/localization.service.d.ts +11 -0
  115. package/localization/localization.service.js +16 -5
  116. package/localization/localization.service.metadata.json +1 -1
  117. package/localization/localization.service.zh_CN.js +12 -1
  118. package/localization/localization.service.zh_CN.metadata.json +1 -1
  119. package/modal/write-character/write-character-modal.component.d.ts +3 -2
  120. package/modal/write-character/write-character-modal.component.html +4 -4
  121. package/modal/write-character/write-character-modal.component.js +7 -5
  122. package/modal/write-character/write-character-modal.component.less +15 -0
  123. package/modal/write-character/write-character-modal.component.metadata.json +1 -1
  124. package/modal/write-value/write-value-modal-args.d.ts +5 -1
  125. package/modal/write-value/write-value-modal-args.js +3 -1
  126. package/modal/write-value/write-value-modal-args.metadata.json +1 -1
  127. package/modal/write-value/write-value-modal.component.d.ts +15 -8
  128. package/modal/write-value/write-value-modal.component.html +10 -5
  129. package/modal/write-value/write-value-modal.component.js +99 -21
  130. package/modal/write-value/write-value-modal.component.less +16 -1
  131. package/modal/write-value/write-value-modal.component.metadata.json +1 -1
  132. package/model/alarm/alarm.model.d.ts +13 -0
  133. package/model/alarm/alarm.model.js +0 -0
  134. package/model/alarm/alarm.model.metadata.json +1 -0
  135. package/model/bar-graph/bar-graph.d.ts +4 -0
  136. package/model/base/font-setting-model.d.ts +22 -1
  137. package/model/base/font-setting-model.metadata.json +1 -1
  138. package/model/base/readable-model.d.ts +4 -0
  139. package/model/datetime-display/datetime-display.d.ts +1 -0
  140. package/model/historical-curve/historical-curve-axis-settings.d.ts +11 -0
  141. package/model/historical-curve/historical-curve-axis-settings.js +5 -0
  142. package/model/historical-curve/historical-curve-axis-settings.metadata.json +1 -1
  143. package/model/historical-curve/historical-curve-chanel.model.d.ts +8 -0
  144. package/model/meter/meter.d.ts +4 -0
  145. package/model/numerical-display/numerical-operation.d.ts +10 -2
  146. package/model/ring-graph/ring-graph.model.d.ts +8 -0
  147. package/model/scroll-alarm/scroll-alarm.model.d.ts +21 -0
  148. package/model/scroll-alarm/scroll-alarm.model.js +0 -0
  149. package/model/scroll-alarm/scroll-alarm.model.metadata.json +1 -0
  150. package/model/shared/state/state.d.ts +1 -0
  151. package/model/shared/state/state.js +1 -0
  152. package/model/shared/state/state.metadata.json +1 -1
  153. package/model/shared/text/font.d.ts +1 -1
  154. package/model/shared/text/text.d.ts +3 -0
  155. package/model/switch-indicator-light/switch-indicator-light.d.ts +2 -0
  156. package/model/view-operation/view-operation-element.model.d.ts +7 -1
  157. package/package.json +1 -1
  158. package/public_api.js +1 -0
  159. package/remote/communication/variable/remote-variable-communicator.d.ts +30 -0
  160. package/remote/communication/variable/remote-variable-communicator.js +193 -3
  161. package/remote/communication/variable/remote-variable-communicator.metadata.json +1 -1
  162. package/remote/communication/variable/remote-variable-protocol.d.ts +8 -0
  163. package/service/index.d.ts +4 -0
  164. package/service/index.js +1 -0
  165. package/service/index.metadata.json +1 -1
  166. package/service/language.service.d.ts +37 -0
  167. package/service/language.service.js +0 -0
  168. package/service/language.service.metadata.json +1 -0
  169. package/service/released-variable/index.d.ts +1 -0
  170. package/service/released-variable/index.js +0 -0
  171. package/service/released-variable/index.metadata.json +1 -0
  172. package/service/released-variable/released-variable.service.d.ts +4 -0
  173. package/service/released-variable/released-variable.service.js +0 -0
  174. package/service/released-variable/released-variable.service.metadata.json +1 -0
  175. package/service/system-text-library.service.d.ts +77 -0
  176. package/service/system-text-library.service.js +29 -0
  177. package/service/system-text-library.service.metadata.json +1 -0
  178. package/service/text-library.service.d.ts +49 -0
  179. package/service/text-library.service.js +0 -0
  180. package/service/text-library.service.metadata.json +1 -0
  181. package/shared/gui-consts.d.ts +2 -0
  182. package/shared/gui-consts.js +3 -1
  183. package/shared/gui-consts.metadata.json +1 -1
  184. package/utils/data-type/fbox-data-type.service.js +40 -0
  185. package/utils/numerical-operation.service.js +28 -4
@@ -2,7 +2,7 @@ import { LOGGER_SERVICE_TOKEN } from '../../logger';
2
2
  import * as d3 from 'd3-selection';
3
3
  import { isUndefined } from 'lodash';
4
4
  import { IndicatorLightType, SwitchType, State, BitSwitchOperation } from '../../model';
5
- import { VariableState } from '../../communication';
5
+ import { VariableState, VariableStateEnum } from '../../communication';
6
6
  import { ConditionalEnableElement } from '../base/conditional-enable-element';
7
7
  import { GraphStateElement } from '../shared/graph/graph-state-element';
8
8
  import { TextStateElement } from '../shared/text/text-state-element';
@@ -17,12 +17,15 @@ import { DisplayMode, GlobalSettings } from '../../settings';
17
17
  import { VariableUtil } from '../../utils/variable-util';
18
18
  import { VariableDefinition } from '../../communication/variable/variable-definition';
19
19
  export class SwitchIndicatorLightElement extends ConditionalEnableElement {
20
- constructor(element, injector, modalService, variableCommunicator, graphStore, permissionChecker, operationRecordService, securityChecker, variableStore, localization, signalRAppId) {
20
+ constructor(element, injector, modalService, variableCommunicator, graphStore, permissionChecker, operationRecordService, securityChecker, variableStore, localization, signalRAppId, textLibraryService, languageService, guiContext) {
21
21
  super(element, permissionChecker, variableCommunicator, variableStore, localization, signalRAppId);
22
22
  this.modalService = modalService;
23
23
  this.graphStore = graphStore;
24
24
  this.operationRecordService = operationRecordService;
25
25
  this.securityChecker = securityChecker;
26
+ this.textLibraryService = textLibraryService;
27
+ this.languageService = languageService;
28
+ this.guiContext = guiContext;
26
29
  this.isBitRestoration = false; // 是否是 位设定且执行设置是复位
27
30
  this.isVerifiedForRestoration = false; // 位设定且执行设置是复位情况下,是否已经完成了验证
28
31
  this.isWriteRestorationDownValue = false;
@@ -32,7 +35,8 @@ export class SwitchIndicatorLightElement extends ConditionalEnableElement {
32
35
  if (this.model.useSwitch) {
33
36
  this.initSwitchOperator();
34
37
  this.rootElement.style('cursor', 'hand');
35
- this.rootElement.on(this.isMobileMode ? 'touchstart' : 'mousedown', () => {
38
+ const isMobile = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i);
39
+ this.rootElement.on(this.isMobileMode && isMobile ? 'touchstart' : 'mousedown', () => {
36
40
  if (!this.isInitialized) {
37
41
  return;
38
42
  }
@@ -59,7 +63,7 @@ export class SwitchIndicatorLightElement extends ConditionalEnableElement {
59
63
  }
60
64
  else {
61
65
  this.checkElementPassword(false);
62
- if (!this.model.useIndicatorLight && !this.isMobileMode) {
66
+ if (!this.model.useIndicatorLight) {
63
67
  this.switchToState(1);
64
68
  }
65
69
  }
@@ -74,7 +78,7 @@ export class SwitchIndicatorLightElement extends ConditionalEnableElement {
74
78
  d3.event.preventDefault();
75
79
  }
76
80
  });
77
- this.rootElement.on(this.isMobileMode ? 'touchend' : 'mouseup', () => {
81
+ this.rootElement.on(this.isMobileMode && isMobile ? 'touchend' : 'mouseup', () => {
78
82
  this.handleMouseUp();
79
83
  d3.event.stopPropagation();
80
84
  });
@@ -99,7 +103,7 @@ export class SwitchIndicatorLightElement extends ConditionalEnableElement {
99
103
  document.removeEventListener(this.isMobileMode ? 'touchend' : 'mouseup', this.onDocMouseUp);
100
104
  this.isVerifiedForRestoration = false;
101
105
  this.isWriteRestorationDownValue = false;
102
- if (!this.model.useIndicatorLight && !this.isMobileMode) {
106
+ if (!this.model.useIndicatorLight) {
103
107
  this.switchToState(0);
104
108
  if (d3.event) {
105
109
  d3.event.preventDefault();
@@ -191,11 +195,21 @@ export class SwitchIndicatorLightElement extends ConditionalEnableElement {
191
195
  }
192
196
  }
193
197
  initIndictorLightOperator() {
198
+ var _a, _b, _c, _d, _e, _f;
194
199
  const settings = this.model.indicatorLightSettings;
195
200
  if (settings.settings.variableName) {
196
201
  const variable = new VariableDefinition(settings.settings.variableName, settings.settings.variableGroupName, settings.settings.dataSourceCode, settings.settings.variableVersion);
197
- this.addElementState(new VariableState(VariableUtil.getConvertedVariableName(this.variableStore, variable), undefined));
202
+ const convertedName = VariableUtil.getConvertedVariableName(this.variableStore, variable);
203
+ this.addElementState(new VariableState(convertedName, undefined));
198
204
  this.initState();
205
+ // 模拟模式下优先用后端 GetVariablesForDesigner 查出的有效变量(绑定了 manager);
206
+ // 运行模式不填充 validVariableNames,回退到 variableStore.getAllVariableNames()
207
+ const validNames = (_b = (_a = this.guiContext) === null || _a === void 0 ? void 0 : _a.validVariableNames) !== null && _b !== void 0 ? _b : (_f = (_e = (_d = (_c = this.guiContext) === null || _c === void 0 ? void 0 : _c.configStore) === null || _d === void 0 ? void 0 : _d.variableStore) === null || _e === void 0 ? void 0 : _e.getAllVariableNames) === null || _f === void 0 ? void 0 : _f.call(_e);
208
+ if (validNames && !validNames.includes(convertedName)) {
209
+ this.updateElementStates([new VariableState(convertedName, VariableStateEnum.InvalidMonitor)]);
210
+ this.switchToState(0);
211
+ return;
212
+ }
199
213
  }
200
214
  switch (settings.type) {
201
215
  case IndicatorLightType.Bit:
@@ -207,17 +221,26 @@ export class SwitchIndicatorLightElement extends ConditionalEnableElement {
207
221
  default:
208
222
  throw new Error(`Unknown switchType:${settings.type}`);
209
223
  }
210
- this.indicatorLightOperator.currentStateIdChanged.subscribe(statusIdValue => {
224
+ this.indicatorLightSubscription = this.indicatorLightOperator.currentStateIdChanged.subscribe(statusIdValue => {
211
225
  this.currentStateIdChange(statusIdValue);
212
226
  });
213
227
  this.indicatorLightOperator.requestData(this.signalRAppId);
214
228
  }
215
229
  currentStateIdChange(statusIdValue) {
216
- if (!isUndefined(statusIdValue.value)) {
217
- this.switchToState(statusIdValue.value);
218
- }
219
230
  this.updateElementStates([statusIdValue.state]);
220
231
  if (this.state === State.Unbind || this.state === State.Offline) {
232
+ if (!isUndefined(statusIdValue.value)) {
233
+ this.switchToState(statusIdValue.value);
234
+ }
235
+ else {
236
+ this.switchToState(0);
237
+ }
238
+ }
239
+ else if (!isUndefined(statusIdValue.value)) {
240
+ this.switchToState(statusIdValue.value);
241
+ }
242
+ else {
243
+ // 变量值为 null/undefined(含无效变量)时,显示第一个状态样式
221
244
  this.switchToState(0);
222
245
  }
223
246
  }
@@ -237,9 +260,44 @@ export class SwitchIndicatorLightElement extends ConditionalEnableElement {
237
260
  this.graphStateElement = new GraphStateElement(this.model.graphSetting, width, height, this.graphStore, this.logger, this.model.version, this.model.states);
238
261
  this.$element.append(this.graphStateElement.Element);
239
262
  }
240
- this.textStateElement = new TextStateElement(this.model.states, width, height, this.logger, this.model.version, this.model.states);
263
+ this.textStateElement = new TextStateElement(this.model.states, width, height, this.logger, this.model.version, this.model.states, this.model.textLibrary, this.textLibraryService, this.languageService, this.guiContext, true, this.model.fontStyleCultures);
241
264
  this.$element.append(this.textStateElement.Element);
242
265
  }
266
+ /**
267
+ * 释放资源
268
+ */
269
+ dispose() {
270
+ // 释放文本元素资源(取消语种变化订阅等)
271
+ if (this.textStateElement) {
272
+ this.textStateElement.dispose();
273
+ }
274
+ // 释放指示灯操作器资源
275
+ if (this.indicatorLightOperator) {
276
+ // indicatorLightOperator 可能有自己的dispose方法
277
+ }
278
+ // 清除定时器
279
+ if (this.restorationTimer) {
280
+ clearTimeout(this.restorationTimer);
281
+ this.restorationTimer = undefined;
282
+ }
283
+ // 移除事件监听
284
+ if (this.onDocMouseUp) {
285
+ document.removeEventListener(this.isMobileMode ? 'touchend' : 'mouseup', this.onDocMouseUp);
286
+ }
287
+ // 清理 indicatorLightOperator 订阅
288
+ if (this.indicatorLightSubscription) {
289
+ this.indicatorLightSubscription.unsubscribe();
290
+ }
291
+ // 清理图形元素(释放 SVG 内存)
292
+ if (this.graphStateElement) {
293
+ this.graphStateElement.dispose();
294
+ }
295
+ // 清理文本元素
296
+ if (this.textStateElement) {
297
+ // TextStateElement 可能也需要 dispose,暂时先清理引用
298
+ this.textStateElement = null;
299
+ }
300
+ }
243
301
  checkState() {
244
302
  if (!this.model.states) {
245
303
  throw new Error('The switch indicator light\'s states is undefined.');
@@ -1 +1 @@
1
- [{"__symbolic":"module","version":4,"metadata":{"SwitchIndicatorLightElement":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"../base/conditional-enable-element","name":"ConditionalEnableElement","line":32,"character":49},"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"error","message":"Could not resolve type","line":50,"character":25,"context":{"typeName":"HTMLElement"}},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":51,"character":18},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":52,"character":39},{"__symbolic":"reference","module":"../../communication","name":"VariableCommunicator","line":53,"character":30},{"__symbolic":"reference","module":"../../config","name":"GraphStore","line":54,"character":37},{"__symbolic":"reference","module":"../../service","name":"PermissionChecker","line":55,"character":27},{"__symbolic":"reference","module":"../../service","name":"OperationRecordService","line":56,"character":49},{"__symbolic":"reference","module":"../../security","name":"SecurityChecker","line":57,"character":42},{"__symbolic":"reference","module":"../../config","name":"VariableStore","line":58,"character":23},{"__symbolic":"reference","module":"../../localization","name":"Localization","line":59,"character":22},{"__symbolic":"reference","name":"string"}]}],"handleMouseUp":[{"__symbolic":"method"}],"initOnDocMouseUpEvent":[{"__symbolic":"method"}],"checkElementPassword":[{"__symbolic":"method"}],"doSwitchOperator":[{"__symbolic":"method"}],"writeValue":[{"__symbolic":"method"}],"initSwitchOperator":[{"__symbolic":"method"}],"initIndictorLightOperator":[{"__symbolic":"method"}],"currentStateIdChange":[{"__symbolic":"method"}],"switchToState":[{"__symbolic":"method"}],"initGraphAndText":[{"__symbolic":"method"}],"checkState":[{"__symbolic":"method"}]}}}}]
1
+ [{"__symbolic":"module","version":4,"metadata":{"SwitchIndicatorLightElement":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"../base/conditional-enable-element","name":"ConditionalEnableElement","line":33,"character":49},"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"error","message":"Could not resolve type","line":52,"character":25,"context":{"typeName":"HTMLElement"}},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":53,"character":18},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":54,"character":39},{"__symbolic":"reference","module":"../../communication","name":"VariableCommunicator","line":55,"character":30},{"__symbolic":"reference","module":"../../config","name":"GraphStore","line":56,"character":37},{"__symbolic":"reference","module":"../../service","name":"PermissionChecker","line":57,"character":27},{"__symbolic":"reference","module":"../../service","name":"OperationRecordService","line":58,"character":49},{"__symbolic":"reference","module":"../../security","name":"SecurityChecker","line":59,"character":42},{"__symbolic":"reference","module":"../../config","name":"VariableStore","line":60,"character":23},{"__symbolic":"reference","module":"../../localization","name":"Localization","line":61,"character":22},{"__symbolic":"reference","name":"string"},{"__symbolic":"reference","module":"../../service","name":"TextLibraryService","line":63,"character":46},{"__symbolic":"reference","module":"../../service","name":"LanguageService","line":64,"character":43},{"__symbolic":"reference","module":"../../gui/gui-context","name":"GuiContext","line":65,"character":38}]}],"handleMouseUp":[{"__symbolic":"method"}],"initOnDocMouseUpEvent":[{"__symbolic":"method"}],"checkElementPassword":[{"__symbolic":"method"}],"doSwitchOperator":[{"__symbolic":"method"}],"writeValue":[{"__symbolic":"method"}],"initSwitchOperator":[{"__symbolic":"method"}],"initIndictorLightOperator":[{"__symbolic":"method"}],"currentStateIdChange":[{"__symbolic":"method"}],"switchToState":[{"__symbolic":"method"}],"initGraphAndText":[{"__symbolic":"method"}],"dispose":[{"__symbolic":"method"}],"checkState":[{"__symbolic":"method"}]}}}}]
@@ -10,6 +10,7 @@ export declare class WordIndicatorLightOperator implements IndicatorLightOperato
10
10
  private readonly variableStore;
11
11
  currentStateId?: number;
12
12
  currentStateIdChanged: EventEmitter<CurrentStateIdValue>;
13
+ private valueSubscription;
13
14
  private sortedStates;
14
15
  get variableName(): string;
15
16
  constructor(settings: WordIndicatorLightSettings, states: SwitchIndicatorState[], variableCommunicator: VariableCommunicator, variableStore: VariableStore);
@@ -5,6 +5,7 @@ import { VariableStateEnum, VariableState } from '../../communication';
5
5
  import { CurrentStateIdValue } from './current-stateId-value';
6
6
  import { VariableUtil } from '../../utils/variable-util';
7
7
  import { VariableDefinition } from '../../communication/variable/variable-definition';
8
+ import { GuiFeatureConfig } from '../../config';
8
9
  export class WordIndicatorLightOperator {
9
10
  constructor(settings, states, variableCommunicator, variableStore) {
10
11
  this.settings = settings;
@@ -26,8 +27,11 @@ export class WordIndicatorLightOperator {
26
27
  if (variableValue.state === VariableStateEnum.Normal) {
27
28
  this.requestCurrentSateIdValue(this.variableCommunicator, appId);
28
29
  }
30
+ else if (GuiFeatureConfig.isOfflineDisplayEnabled && variableValue.state === VariableStateEnum.Offline && !this.valueSubscription) {
31
+ this.requestCurrentSateIdValue(this.variableCommunicator, appId);
32
+ }
29
33
  else {
30
- this.currentStateIdChanged.emit(new CurrentStateIdValue(new VariableState(this.variableName, variableValue.state)));
34
+ this.currentStateIdChanged.emit(new CurrentStateIdValue(new VariableState(this.variableName, variableValue.state), this.currentStateId));
31
35
  }
32
36
  });
33
37
  }
@@ -36,9 +40,12 @@ export class WordIndicatorLightOperator {
36
40
  }
37
41
  }
38
42
  requestCurrentSateIdValue(variableCommunicator, appId = '') {
43
+ if (this.valueSubscription) {
44
+ return;
45
+ }
39
46
  // TODO 检查状态id是从0-n连续编号的。
40
- variableCommunicator.openVariable(this.variableName, appId).subscribe(value => {
41
- if (value.state === VariableStateEnum.DataNormal) {
47
+ this.valueSubscription = variableCommunicator.openVariable(this.variableName, appId).subscribe(value => {
48
+ if (value.state === VariableStateEnum.DataNormal || (GuiFeatureConfig.isOfflineDisplayEnabled && value.state === VariableStateEnum.Offline)) {
42
49
  let stateId = 0;
43
50
  for (let index = 0; index < this.sortedStates.length - 1; index++) {
44
51
  const element = this.sortedStates[index];
@@ -1 +1 @@
1
- [{"__symbolic":"module","version":4,"metadata":{"WordIndicatorLightOperator":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"../../model","name":"WordIndicatorLightSettings","line":23,"character":43},{"__symbolic":"reference","name":"Array","arguments":[{"__symbolic":"reference","module":"../../model","name":"SwitchIndicatorState","line":24,"character":16}]},{"__symbolic":"reference","module":"../../communication","name":"VariableCommunicator","line":25,"character":47},{"__symbolic":"reference","module":"../../config","name":"VariableStore","line":26,"character":40}]}],"requestData":[{"__symbolic":"method"}],"requestCurrentSateIdValue":[{"__symbolic":"method"}]}}}}]
1
+ [{"__symbolic":"module","version":4,"metadata":{"WordIndicatorLightOperator":{"__symbolic":"class","members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"../../model","name":"WordIndicatorLightSettings","line":25,"character":43},{"__symbolic":"reference","name":"Array","arguments":[{"__symbolic":"reference","module":"../../model","name":"SwitchIndicatorState","line":26,"character":16}]},{"__symbolic":"reference","module":"../../communication","name":"VariableCommunicator","line":27,"character":47},{"__symbolic":"reference","module":"../../config","name":"VariableStore","line":28,"character":40}]}],"requestData":[{"__symbolic":"method"}],"requestCurrentSateIdValue":[{"__symbolic":"method"}]}}}}]
@@ -16,6 +16,12 @@ export declare class VideoElement extends ConditionalDisplayElement {
16
16
  private videoId;
17
17
  private isShow;
18
18
  private videoPlayer;
19
+ private refreshTimer;
20
+ private isFullscreen;
21
+ private videoUrl;
22
+ private visibilityChangeHandler;
23
+ private timeUpdateWatchdog;
24
+ private lastTimeUpdate;
19
25
  constructor(element: HTMLElement, injector: Injector, permissionChecker: PermissionChecker, variableCommunicator: VariableCommunicator, variableStore: VariableStore, videoService: VideoService, guiSize: Size, svgRootClass: string, signalRAppId: string);
20
26
  dispose(): void;
21
27
  hide(): void;
@@ -24,4 +30,8 @@ export declare class VideoElement extends ConditionalDisplayElement {
24
30
  private initVideo;
25
31
  private addVideoAddressToolTip;
26
32
  private setAndroidVideo;
33
+ private initVisibilityHandler;
34
+ private startTimeUpdateWatchdog;
35
+ private clearTimeUpdateWatchdog;
36
+ private setIosVideo;
27
37
  }
@@ -11,8 +11,11 @@ export class VideoElement extends ConditionalDisplayElement {
11
11
  this.guiSize = guiSize;
12
12
  this.svgRootClass = svgRootClass;
13
13
  this.videoId = '';
14
+ this.isFullscreen = false;
15
+ this.lastTimeUpdate = 0;
14
16
  this.isMobileMode = DisplayMode.Mobile === injector.get(GlobalSettings).displayMode;
15
17
  this.localization = injector.get(LOCALIZATION);
18
+ this.initVisibilityHandler();
16
19
  this.init();
17
20
  }
18
21
  dispose() {
@@ -22,6 +25,10 @@ export class VideoElement extends ConditionalDisplayElement {
22
25
  $('div.' + this.svgRootClass + ' video').each(function () {
23
26
  $(this).remove();
24
27
  });
28
+ if (this.visibilityChangeHandler) {
29
+ document.removeEventListener('visibilitychange', this.visibilityChangeHandler);
30
+ }
31
+ this.clearTimeUpdateWatchdog();
25
32
  }
26
33
  hide() {
27
34
  super.hide();
@@ -50,12 +57,20 @@ export class VideoElement extends ConditionalDisplayElement {
50
57
  .attr('width', this.model.size.width)
51
58
  .attr('height', this.model.size.height);
52
59
  this.videoService.getVideoUrl(this.model.videoTag).then(result => {
53
- this.initVideo(result.url, result.isMobileType, this.videoId);
60
+ this.videoUrl = result.url;
61
+ this.initVideo(result.url, this.videoId);
54
62
  }).catch(() => {
55
63
  throw new Error('Failure of the videoService');
56
64
  });
57
65
  }
58
- initVideo(videoUrl, isMobileType, videoId) {
66
+ initVideo(videoUrl, videoId) {
67
+ // FLEXCLOUD-4155: 诊断日志,排查"长时间放置后卡死"问题,记录每次重建播放器的时间点
68
+ console.log(`[FLEXCLOUD-4155] initVideo called at ${new Date().toISOString()}, videoId=${videoId}, videoUrl=${videoUrl}`);
69
+ // FLEXCLOUD-4155: 强制清理旧的 video 元素,避免残留元素的错误蒙层
70
+ const oldVideoElement = document.getElementById(videoId);
71
+ if (oldVideoElement) {
72
+ oldVideoElement.remove();
73
+ }
59
74
  const patt = /https:.+.m3u8/;
60
75
  if (videoUrl.indexOf('http:') !== -1) {
61
76
  videoUrl = videoUrl.replace('http:', 'https:');
@@ -68,6 +83,8 @@ export class VideoElement extends ConditionalDisplayElement {
68
83
  this.addVideoAddressToolTip(videoToolTip);
69
84
  return;
70
85
  }
86
+ const isAndroid = !!navigator.userAgent.match(/(Android)/i);
87
+ const isIos = !!navigator.userAgent.match(/(Mac)/i);
71
88
  const currentRect = this.$element.find('rect#rect' + videoId).first();
72
89
  if (!currentRect.length) {
73
90
  return;
@@ -77,17 +94,19 @@ export class VideoElement extends ConditionalDisplayElement {
77
94
  const chartHeight = clientRect.height;
78
95
  const left = this.model.location.x / this.guiSize.width * $('.' + this.svgRootClass).find('.svg-content').width();
79
96
  const top = this.model.location.y / this.guiSize.height * $('.' + this.svgRootClass).find('.svg-content').height();
80
- let videoHtml = `<video scareX="${this.model.location.x / this.guiSize.width}"
81
- scareY="${this.model.location.y / this.guiSize.height}" id="${videoId}" src="${videoUrl}" style="
82
- position: absolute;top:${top}px;left:${left}px;width:${chartWidth}px;height:${chartHeight}px;object-fit:fill;z-index:0"
83
- playsInline webkit-playsinline `;
84
- const isAndroid = !!navigator.userAgent.match(/(Android)/i);
97
+ const scareX = this.model.location.x / this.guiSize.width;
98
+ const scareY = this.model.location.y / this.guiSize.height;
99
+ if (isIos) {
100
+ videoUrl = videoUrl + '#t=1';
101
+ }
102
+ const preload = isIos ? ' preload=\'metadata\'' : '';
103
+ let videoHtml = `<video scareX="${scareX}"
104
+ scareY="${scareY}" id="${videoId}" ${preload} src="${videoUrl}" width="${chartWidth}" height="${chartHeight}"
105
+ style="position: absolute;top:${top}px;left:${left}px;object-fit:fill;z-index:0;"
106
+ playsInline webkit-playsinline `;
85
107
  if (this.isMobileMode) {
86
108
  if (isAndroid) {
87
- if (isMobileType) {
88
- videoHtml += ' controls ';
89
- }
90
- videoHtml += ' autoplay muted></video>';
109
+ videoHtml += ' muted></video>';
91
110
  }
92
111
  else {
93
112
  videoHtml += ' controls muted></video>';
@@ -100,10 +119,39 @@ export class VideoElement extends ConditionalDisplayElement {
100
119
  if (this.isShow === false) {
101
120
  $('#' + this.videoId).hide();
102
121
  }
103
- this.videoPlayer = new EZUIPlayer(videoId);
104
- if (isAndroid && !isMobileType) {
105
- this.setAndroidVideo(videoId);
106
- }
122
+ setTimeout(() => {
123
+ if (isAndroid) {
124
+ this.setAndroidVideo(videoId);
125
+ }
126
+ else if (isIos) {
127
+ this.setIosVideo(this.videoUrl, videoId);
128
+ }
129
+ try {
130
+ this.videoPlayer = new EZUIPlayer(videoId);
131
+ if (isAndroid) {
132
+ // 确保在 EZUIPlayer 初始化后才调用 play 方法
133
+ this.videoPlayer.on('canplay', () => {
134
+ this.videoPlayer.play();
135
+ });
136
+ }
137
+ }
138
+ catch (err) {
139
+ // FLEXCLOUD-4155: EZUIPlayer 内部对 opt.width 做 .replace 时可能因类型不是字符串而抛错,
140
+ // 但此时 hls.js/video 实际播放不受影响,不应因此中断 watchdog 的启动
141
+ console.error(`[FLEXCLOUD-4155] initVideo setTimeout callback error at ${new Date().toISOString()}, videoId=${videoId}:`, err);
142
+ }
143
+ finally {
144
+ // FLEXCLOUD-4155: 无论 EZUIPlayer 初始化是否抛错,watchdog 都必须启动,
145
+ // 否则后续真正的播放卡死(currentTime 停止推进)将无法被检测和自愈
146
+ this.startTimeUpdateWatchdog(videoId);
147
+ console.log(`[FLEXCLOUD-4155] watchdog started at ${new Date().toISOString()}, videoId=${videoId}`);
148
+ }
149
+ }, 1000);
150
+ const style = document.createElement('style');
151
+ style.innerHTML = `#${videoId}::-webkit-media-controls-enclosure {
152
+ display: none;
153
+ }`;
154
+ document.head.append();
107
155
  }
108
156
  addVideoAddressToolTip(videoToolTip) {
109
157
  const size = this.model.size;
@@ -126,35 +174,105 @@ export class VideoElement extends ConditionalDisplayElement {
126
174
  this.$element.append(textElement.Element);
127
175
  }
128
176
  setAndroidVideo(videoId) {
129
- let isFullscreen = false;
130
177
  const videoElement = $('#' + videoId);
131
178
  let preHeight = videoElement.height();
132
179
  let preWidth = videoElement.width();
133
180
  let preTop = videoElement.css('top');
134
181
  let preLeft = videoElement.css('left');
182
+ const { StatusBar } = window;
135
183
  videoElement.on('click', () => {
136
- if (!isFullscreen) {
184
+ if (!this.isFullscreen) {
185
+ if (StatusBar) {
186
+ StatusBar.hide();
187
+ }
137
188
  preHeight = videoElement.height();
138
189
  preWidth = videoElement.width();
139
190
  preTop = videoElement.css('top');
140
191
  preLeft = videoElement.css('left');
141
- const width = document.body.clientWidth;
142
- const height = width * 9 / 16;
192
+ const width = document.documentElement.clientWidth;
193
+ const height = document.documentElement.clientHeight;
194
+ videoElement.css('object-fit', 'contain');
195
+ videoElement.css('background', '#000000');
143
196
  videoElement.css('width', width + 'px');
144
197
  videoElement.css('height', height + 'px');
145
198
  videoElement.css('left', '0px');
146
199
  videoElement.css('top', '0px');
147
200
  videoElement.css('z-index', '99');
148
- isFullscreen = true;
201
+ videoElement.css('position', 'fixed');
202
+ this.isFullscreen = true;
203
+ try {
204
+ screen.orientation.lock(screen.orientation.type);
205
+ }
206
+ catch (error) {
207
+ console.error(error);
208
+ }
149
209
  }
150
210
  else {
211
+ videoElement.css('object-fit', 'fill');
151
212
  videoElement.css('width', preWidth + 'px');
152
213
  videoElement.css('height', preHeight + 'px');
153
214
  videoElement.css('left', preLeft);
154
215
  videoElement.css('top', preTop);
155
216
  videoElement.css('z-index', '0');
156
- isFullscreen = false;
217
+ videoElement.css('position', 'absolute');
218
+ this.isFullscreen = false;
219
+ try {
220
+ if (screen.orientation.type.includes('portrait')) {
221
+ StatusBar.show();
222
+ }
223
+ }
224
+ catch (error) {
225
+ console.error(error);
226
+ }
227
+ }
228
+ });
229
+ }
230
+ initVisibilityHandler() {
231
+ this.visibilityChangeHandler = () => {
232
+ // FLEXCLOUD-4155: 诊断日志,记录每次 visibilitychange 触发时的状态
233
+ console.log(`[FLEXCLOUD-4155] visibilitychange fired at ${new Date().toISOString()}, hidden=${document.hidden}, videoId=${this.videoId}`);
234
+ if (!document.hidden && this.videoUrl && this.videoId) {
235
+ this.initVideo(this.videoUrl, this.videoId);
157
236
  }
237
+ };
238
+ document.addEventListener('visibilitychange', this.visibilityChangeHandler);
239
+ }
240
+ startTimeUpdateWatchdog(videoId) {
241
+ this.clearTimeUpdateWatchdog();
242
+ this.lastTimeUpdate = Date.now();
243
+ const videoEl = document.getElementById(videoId);
244
+ if (videoEl && videoEl.tagName === 'VIDEO') {
245
+ videoEl.addEventListener('timeupdate', () => {
246
+ this.lastTimeUpdate = Date.now();
247
+ });
248
+ }
249
+ this.timeUpdateWatchdog = setInterval(() => {
250
+ const idleMs = Date.now() - this.lastTimeUpdate;
251
+ if (document.hidden)
252
+ return;
253
+ if (idleMs > 30000) {
254
+ console.warn(`[FLEXCLOUD-4155] watchdog detected stall (idleMs=${idleMs}), triggering initVideo at ${new Date().toISOString()}, videoId=${videoId}`);
255
+ this.initVideo(this.videoUrl, this.videoId);
256
+ }
257
+ }, 30000);
258
+ }
259
+ clearTimeUpdateWatchdog() {
260
+ if (this.timeUpdateWatchdog) {
261
+ // FLEXCLOUD-4155: 诊断日志,记录 watchdog 何时被清除,排查是否有清除后未重建的空窗期
262
+ console.log(`[FLEXCLOUD-4155] watchdog cleared at ${new Date().toISOString()}`);
263
+ clearInterval(this.timeUpdateWatchdog);
264
+ this.timeUpdateWatchdog = null;
265
+ }
266
+ }
267
+ setIosVideo(videoUrl, videoId) {
268
+ const video = $('#' + this.videoId);
269
+ video.on('webkitendfullscreen', () => {
270
+ video.remove();
271
+ clearTimeout(this.refreshTimer);
272
+ this.refreshTimer = null;
273
+ this.refreshTimer = setTimeout(() => {
274
+ this.initVideo(videoUrl, videoId);
275
+ }, 500);
158
276
  });
159
277
  }
160
278
  }
@@ -1 +1 @@
1
- [{"__symbolic":"module","version":4,"metadata":{"VideoElement":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"../base/conditional-display-element","name":"ConditionalDisplayElement","line":15,"character":34},"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"error","message":"Could not resolve type","line":23,"character":25,"context":{"typeName":"HTMLElement"}},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":24,"character":18},{"__symbolic":"reference","module":"../../service","name":"PermissionChecker","line":25,"character":27},{"__symbolic":"reference","module":"../../communication","name":"VariableCommunicator","line":26,"character":30},{"__symbolic":"reference","module":"../../config","name":"VariableStore","line":27,"character":23},{"__symbolic":"reference","module":"../../service","name":"VideoService","line":28,"character":39},{"__symbolic":"reference","module":"../../model","name":"Size","line":29,"character":34},{"__symbolic":"reference","name":"string"},{"__symbolic":"reference","name":"string"}]}],"dispose":[{"__symbolic":"method"}],"hide":[{"__symbolic":"method"}],"show":[{"__symbolic":"method"}],"init":[{"__symbolic":"method"}],"initVideo":[{"__symbolic":"method"}],"addVideoAddressToolTip":[{"__symbolic":"method"}],"setAndroidVideo":[{"__symbolic":"method"}]}}}}]
1
+ [{"__symbolic":"module","version":4,"metadata":{"VideoElement":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"../base/conditional-display-element","name":"ConditionalDisplayElement","line":15,"character":34},"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"error","message":"Could not resolve type","line":30,"character":25,"context":{"typeName":"HTMLElement"}},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":31,"character":18},{"__symbolic":"reference","module":"../../service","name":"PermissionChecker","line":32,"character":27},{"__symbolic":"reference","module":"../../communication","name":"VariableCommunicator","line":33,"character":30},{"__symbolic":"reference","module":"../../config","name":"VariableStore","line":34,"character":23},{"__symbolic":"reference","module":"../../service","name":"VideoService","line":35,"character":39},{"__symbolic":"reference","module":"../../model","name":"Size","line":36,"character":34},{"__symbolic":"reference","name":"string"},{"__symbolic":"reference","name":"string"}]}],"dispose":[{"__symbolic":"method"}],"hide":[{"__symbolic":"method"}],"show":[{"__symbolic":"method"}],"init":[{"__symbolic":"method"}],"initVideo":[{"__symbolic":"method"}],"addVideoAddressToolTip":[{"__symbolic":"method"}],"setAndroidVideo":[{"__symbolic":"method"}],"initVisibilityHandler":[{"__symbolic":"method"}],"startTimeUpdateWatchdog":[{"__symbolic":"method"}],"clearTimeUpdateWatchdog":[{"__symbolic":"method"}],"setIosVideo":[{"__symbolic":"method"}]}}}}]
@@ -3,11 +3,12 @@ import { BsModalService } from 'ngx-bootstrap/modal';
3
3
  import { Localization } from '../../localization';
4
4
  import { GraphStore, VariableStore } from '../../config';
5
5
  import { ViewOperationElementModel } from '../../model';
6
- import { PermissionChecker, OperationRecordService } from '../../service';
6
+ import { PermissionChecker, OperationRecordService, TextLibraryService, LanguageService } from '../../service';
7
7
  import { VariableCommunicator } from '../../communication';
8
8
  import { ConditionalEnableElement } from '../base/conditional-enable-element';
9
9
  import { PopupViewService } from '../../view/popup-view.service';
10
10
  import { SecurityChecker } from '../../security';
11
+ import { GuiContext } from '../../gui/gui-context';
11
12
  export declare class ViewOperationElement extends ConditionalEnableElement {
12
13
  private readonly modalService;
13
14
  private readonly graphStore;
@@ -16,13 +17,18 @@ export declare class ViewOperationElement extends ConditionalEnableElement {
16
17
  private readonly popupViewService;
17
18
  private readonly hostContainerId;
18
19
  private readonly el;
20
+ private readonly textLibraryService?;
21
+ private readonly languageService?;
22
+ private readonly guiContext?;
19
23
  protected model: ViewOperationElementModel;
20
24
  private readonly logger;
21
25
  private readonly viewService;
22
26
  private graphStateElement?;
27
+ private textElementModal?;
28
+ private languageChangeSubscription?;
23
29
  private touchedScreenX;
24
30
  private touchedScreenY;
25
- constructor(element: HTMLElement, injector: Injector, modalService: BsModalService, variableCommunicator: VariableCommunicator, variableStore: VariableStore, graphStore: GraphStore, permissionChecker: PermissionChecker, operationRecordService: OperationRecordService, securityChecker: SecurityChecker, localization: Localization, popupViewService: PopupViewService, hostContainerId: string, el: ElementRef, signalRAppId: string);
31
+ constructor(element: HTMLElement, injector: Injector, modalService: BsModalService, variableCommunicator: VariableCommunicator, variableStore: VariableStore, graphStore: GraphStore, permissionChecker: PermissionChecker, operationRecordService: OperationRecordService, securityChecker: SecurityChecker, localization: Localization, popupViewService: PopupViewService, hostContainerId: string, el: ElementRef, signalRAppId: string, textLibraryService?: TextLibraryService, languageService?: LanguageService, guiContext?: GuiContext);
26
32
  private initElement;
27
33
  private switchToState;
28
34
  private initGraph;
@@ -33,4 +39,24 @@ export declare class ViewOperationElement extends ConditionalEnableElement {
33
39
  private closeView;
34
40
  private moveView;
35
41
  private recordViewOperation;
42
+ /**
43
+ * 订阅语种变化事件
44
+ */
45
+ private subscribeLanguageChange;
46
+ /**
47
+ * 获取当前语种的字体样式
48
+ */
49
+ private getFontStyle;
50
+ /**
51
+ * 更新文本内容(支持文本库和语种切换)
52
+ */
53
+ private updateTextContent;
54
+ /**
55
+ * 获取显示文本
56
+ */
57
+ private getDisplayText;
58
+ /**
59
+ * 释放资源
60
+ */
61
+ dispose(): void;
36
62
  }