Skip to content

Commit 7ae4d87

Browse files
authored
Merge pull request #3649 from ControlSystemStudio/CSSTUDIO-3538
CSSTUDIO-3538 Bugfix: Redraw Linear Meter widget when the range or alarm limits are updated
2 parents e7c8343 + c37e695 commit 7ae4d87

File tree

2 files changed

+19
-10
lines changed

2 files changed

+19
-10
lines changed

app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterRepresentation.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ protected void registerListeners()
170170
boolean validRange = Double.isFinite(new_value) && Double.isFinite(model_widget.propMaximum().getValue());
171171
meter.setRange(new_value, model_widget.propMaximum().getValue(), validRange);
172172
if (toolkit.isEditMode() && validRange) {
173-
meter.setCurrentValue((new_value + model_widget.propMaximum().getValue()) / 2.0);
173+
meter.setCurrentValue((new_value + model_widget.propMaximum().getValue()) / 2.0, true);
174174
}
175175
});
176176

@@ -183,7 +183,7 @@ protected void registerListeners()
183183
boolean validRange = Double.isFinite(new_value) && Double.isFinite(model_widget.propMinimum().getValue());
184184
meter.setRange(model_widget.propMinimum().getValue(), new_value, validRange);
185185
if (toolkit.isEditMode() && validRange) {
186-
meter.setCurrentValue((new_value + model_widget.propMinimum().getValue()) / 2.0);
186+
meter.setCurrentValue((new_value + model_widget.propMinimum().getValue()) / 2.0, true);
187187
}
188188
});
189189

@@ -295,6 +295,7 @@ private void layoutChanged(WidgetProperty<?> property, Object old_value, Object
295295
private void valueChanged(WidgetProperty<?> property, Object old_value, Object new_value) {
296296
if (new_value instanceof VDouble) {
297297
meter.withWriteLock(() -> {
298+
boolean linearMeterScaleHasChanged = false;
298299
VDouble vDouble = ((VDouble) new_value);
299300
double newValue = vDouble.getValue();
300301

@@ -327,6 +328,7 @@ private void valueChanged(WidgetProperty<?> property, Object old_value, Object n
327328
&& displayRange.getMaximum() - displayRange.getMinimum() > 0.0) {
328329
if (meter.linearMeterScale.getValueRange().getLow() != displayRange.getMinimum() || meter.linearMeterScale.getValueRange().getHigh() != displayRange.getMaximum() || !meter.getValidRange()) {
329330
meter.setRange(displayRange.getMinimum(), displayRange.getMaximum(), true);
331+
linearMeterScaleHasChanged = true;
330332
}
331333
} else {
332334
Range controlRange = display.getControlRange();
@@ -336,12 +338,15 @@ private void valueChanged(WidgetProperty<?> property, Object old_value, Object n
336338
&& controlRange.getMaximum() - controlRange.getMinimum() > 0.0) {
337339
if (meter.linearMeterScale.getValueRange().getLow() != controlRange.getMinimum() || meter.linearMeterScale.getValueRange().getHigh() != controlRange.getMaximum() || !meter.getValidRange()) {
338340
meter.setRange(controlRange.getMinimum(), controlRange.getMaximum(), true);
341+
linearMeterScaleHasChanged = true;
339342
}
340343
} else if (newObservedMinAndMaxValues && !Double.isNaN(observedMin) && !Double.isNaN(observedMax)) {
341344
meter.setRange(observedMin - 1, observedMax + 1, false);
342345
newObservedMinAndMaxValues = false;
346+
linearMeterScaleHasChanged = true;
343347
} else if (meter.linearMeterScale.getValueRange().getLow() != 0.0 || meter.linearMeterScale.getValueRange().getHigh() != 100) {
344348
meter.setRange(0.0, 100.0, false);
349+
linearMeterScaleHasChanged = true;
345350
}
346351
}
347352
}
@@ -352,10 +357,12 @@ private void valueChanged(WidgetProperty<?> property, Object old_value, Object n
352357
if (warningRange != null) {
353358
if (!Double.isNaN(warningRange.getMinimum()) && meter.getLow() != warningRange.getMinimum()) {
354359
meter.setLow(warningRange.getMinimum());
360+
linearMeterScaleHasChanged = true;
355361
}
356362

357363
if (!Double.isNaN(warningRange.getMaximum()) && meter.getHigh() != warningRange.getMaximum()) {
358364
meter.setHigh(warningRange.getMaximum());
365+
linearMeterScaleHasChanged = true;
359366
}
360367
}
361368
}
@@ -365,16 +372,18 @@ private void valueChanged(WidgetProperty<?> property, Object old_value, Object n
365372
if (alarmRange != null) {
366373
if (!Double.isNaN(alarmRange.getMinimum()) && meter.getLoLo() != alarmRange.getMinimum()) {
367374
meter.setLoLo(alarmRange.getMinimum());
375+
linearMeterScaleHasChanged = true;
368376
}
369377

370378
if (!Double.isNaN(alarmRange.getMaximum()) && meter.getHiHi() != alarmRange.getMaximum()) {
371379
meter.setHiHi(alarmRange.getMaximum());
380+
linearMeterScaleHasChanged = true;
372381
}
373382
}
374383
}
375384
}
376385
}
377-
meter.setCurrentValue(newValue);
386+
meter.setCurrentValue(newValue, linearMeterScaleHasChanged);
378387
});
379388
}
380389
}

app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -735,7 +735,7 @@ public void setShowWarnings(boolean showWarnings) {
735735
private boolean isValueWaitingToBeDrawn = false;
736736
private double valueWaitingToBeDrawn = Double.NaN;
737737
/** @param newValue Current value */
738-
public void setCurrentValue(double newValue)
738+
public void setCurrentValue(double newValue, boolean forceRedraw)
739739
{
740740
withWriteLock(() -> {
741741
valueWaitingToBeDrawn = newValue;
@@ -746,7 +746,7 @@ public void setCurrentValue(double newValue)
746746
else {
747747
isValueWaitingToBeDrawn = true;
748748

749-
drawNewValue(valueWaitingToBeDrawn);
749+
drawNewValue(valueWaitingToBeDrawn, forceRedraw);
750750
isValueWaitingToBeDrawn = false;
751751
lag = false;
752752
}
@@ -777,7 +777,7 @@ private Optional<Integer> computeIndicatorPosition(double value) {
777777
});
778778
}
779779

780-
private void drawNewValue(double newValue) {
780+
private void drawNewValue(double newValue, boolean forceRedraw) {
781781
withWriteLock(() -> {
782782
WARNING oldWarning = determineWarning();
783783
AtomicReference<Double> newValueAtomicReference = new AtomicReference<>(newValue); // Workaround, since captured variables need to be effectively final in Java.
@@ -795,15 +795,15 @@ private void drawNewValue(double newValue) {
795795
WARNING newWarning = determineWarning();
796796
logNewWarningIfDifferent(oldWarning, newWarning);
797797

798-
if (oldValue != newValueAtomicReference.get()) {
799-
if (!Double.isNaN(newValueAtomicReference.get())){
798+
if (forceRedraw || oldValue != newValueAtomicReference.get()) {
799+
if (forceRedraw || !Double.isNaN(newValueAtomicReference.get())){
800800
Optional<Integer> maybeNewIndicatorPosition = computeIndicatorPosition(newValue);
801801
boolean indicatorPositionHasChanged = maybeNewIndicatorPosition.isPresent() != maybeOldIndicatorPosition.isPresent() || maybeOldIndicatorPosition.isPresent() && maybeNewIndicatorPosition.isPresent() && maybeOldIndicatorPosition.get() != maybeNewIndicatorPosition.get();
802-
if (indicatorPositionHasChanged || determineWarning() != newWarning) {
802+
if (forceRedraw || indicatorPositionHasChanged || determineWarning() != newWarning) {
803803
redrawIndicator(newValueAtomicReference.get(), newWarning);
804804
}
805805
}
806-
else if (!Double.isNaN(oldValue)) {
806+
else if (forceRedraw || !Double.isNaN(oldValue)) {
807807
redrawIndicator(newValueAtomicReference.get(), newWarning);
808808
}
809809
}

0 commit comments

Comments
 (0)