Skip to content

Commit

Permalink
Merge pull request #2756 from ControlSystemStudio/CSSTUDIO-1995
Browse files Browse the repository at this point in the history
CSSTUDIO-1995 New Widget Property "Run Actions on Mouse Click" for the Symbol widget
  • Loading branch information
abrahamwolk authored Aug 8, 2023
2 parents 18ca8ef + 6408ca5 commit c14b18b
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@ public class Messages
WidgetProperties_RingWidth,
WidgetProperties_Rotation,
WidgetProperties_Rules,
WidgetProperties_RunActionsOnMouseClick,
WidgetProperties_Running,
WidgetProperties_ScaleFactor,
WidgetProperties_ScaleFormat,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ public Widget createWidget ( ) {
public static final WidgetPropertyDescriptor<Boolean> propPreserveRatio = newBooleanPropertyDescriptor (WidgetPropertyCategory.BEHAVIOR, "preserve_ratio", Messages.WidgetProperties_PreserveRatio);
/** Property */
public static final WidgetPropertyDescriptor<String> propFallbackSymbol = newFilenamePropertyDescriptor (WidgetPropertyCategory.BEHAVIOR, "fallback_symbol", Messages.WidgetProperties_FallbackSymbol);

public static final WidgetPropertyDescriptor<Boolean> propRunActionsOnMouseClick = newBooleanPropertyDescriptor (WidgetPropertyCategory.BEHAVIOR, "run_actions_on_mouse_click", Messages.WidgetProperties_RunActionsOnMouseClick);

/** 'items' property: list of items (string properties) for combo box */
public static final ArrayWidgetProperty.Descriptor<WidgetProperty<String> > propSymbols = new ArrayWidgetProperty.Descriptor< >(
Expand Down Expand Up @@ -120,6 +120,7 @@ public Widget createWidget ( ) {
private volatile String importedFrom = null;
private volatile WidgetProperty<String> fallbackSymbol;
private volatile WidgetProperty<WidgetColor> disconnectOverlayColor;
private volatile WidgetProperty<Boolean> run_actions_on_mouse_click;

/** Returns 'symbol' property: element for list of 'symbols' property */
private static WidgetPropertyDescriptor<String> propSymbol( int index ) {
Expand Down Expand Up @@ -219,6 +220,11 @@ public WidgetProperty<WidgetColor> propDiconnectOverlayColor(){
return disconnectOverlayColor;
}

/** @return property */
public WidgetProperty<Boolean> propRunActionsOnMouseClick() {
return run_actions_on_mouse_click;
}

@Override
protected void defineProperties ( final List<WidgetProperty<?>> properties ) {

Expand All @@ -242,6 +248,12 @@ protected void defineProperties ( final List<WidgetProperty<?>> properties ) {
WidgetColor defaultDisconnectedOverlayColor =
new WidgetColor(alarmInvalidColor.getRed(), alarmInvalidColor.getGreen(), alarmInvalidColor.getBlue(), 128);
properties.add(disconnectOverlayColor = propDisconnectOverlayColor.createProperty(this, defaultDisconnectedOverlayColor));
{
int indexOfPropActions = properties.indexOf(propActions());
run_actions_on_mouse_click = propRunActionsOnMouseClick.createProperty(this, false);
properties.add(indexOfPropActions + 1, run_actions_on_mouse_click);
}

}

/**
Expand Down Expand Up @@ -292,4 +304,9 @@ public boolean configureFromXML ( final ModelReader reader, final Widget widget,

}

@Override
protected String getInitialTooltip()
{
return "$(pv_name)\\n$(pv_value)\\n$(actions)";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,7 @@ WidgetProperties_RingColor=Ring Color
WidgetProperties_RingWidth=Ring Width
WidgetProperties_Rotation=Rotation
WidgetProperties_Rules=Rules
WidgetProperties_RunActionsOnMouseClick=Run Actions on Mouse Click
WidgetProperties_Running=Running
WidgetProperties_ScaleFactor=Scale Factor
WidgetProperties_ScaleFormat=Scale Format
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@
import java.util.logging.Level;
import java.util.stream.Collectors;

import javafx.scene.effect.ColorAdjust;
import javafx.scene.effect.DropShadow;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
import org.csstudio.display.builder.model.ArrayWidgetProperty;
import org.csstudio.display.builder.model.DirtyFlag;
import org.csstudio.display.builder.model.DisplayModel;
Expand Down Expand Up @@ -459,10 +464,100 @@ protected StackPane createJFXNode ( ) throws Exception {

symbolChanged(null, null, null);

if (!toolkit.isEditMode() && model_widget.propEnabled().getValue() && model_widget.propRunActionsOnMouseClick().getValue()) {
enableRunActionsOnMouseClick();
}

return symbolPane;

}

private void enableRunActionsOnMouseClick() {
imageView.focusTraversableProperty().set(true);
imageView.setStyle("-fx-cursor: hand;");

ColorAdjust[] clickEffect = { null }; // Values are wrapped in arrays as a workaround of the fact that Java doesn't allow non-final variables to be captured by closures.
DropShadow[] focusEffect = { null };
Runnable setEffect = () -> {
if (focusEffect[0] != null) {
focusEffect[0].setInput(clickEffect[0]);
imageView.setEffect(focusEffect[0]);
}
else {
imageView.setEffect(clickEffect[0]);
}
};

Runnable runActions = () -> {
model_widget.propActions().getValue().getActions().forEach(actionInfo -> toolkit.fireAction(model_widget, actionInfo));
};

ColorAdjust increaseBrightness = new ColorAdjust(0, 0, 0.3, 0);
ColorAdjust decreaseBrightness = new ColorAdjust(0, 0, -0.3, 0);

imageView.addEventFilter(MouseEvent.MOUSE_ENTERED, mouseEvent -> {
clickEffect[0] = increaseBrightness;
setEffect.run();
mouseEvent.consume();
});

imageView.addEventFilter(MouseEvent.MOUSE_EXITED, mouseEvent -> {
clickEffect[0] = null;
setEffect.run();
mouseEvent.consume();
});

imageView.addEventFilter(MouseEvent.MOUSE_PRESSED, mouseEvent -> {
clickEffect[0] = decreaseBrightness;
setEffect.run();
mouseEvent.consume();
});

imageView.addEventFilter(MouseEvent.MOUSE_RELEASED, mouseEvent -> {
clickEffect[0] = increaseBrightness;
setEffect.run();
mouseEvent.consume();
});

imageView.addEventFilter(MouseEvent.MOUSE_CLICKED, mouseEvent -> {
runActions.run();
imageView.requestFocus();
mouseEvent.consume();
});

Color focusColor = Color.web("rgba(3,158,211,1)");
DropShadow dropShadow = new DropShadow(5, focusColor);
imageView.focusedProperty().addListener((observable, old_value, new_value) -> {
if (new_value) {
focusEffect[0] = dropShadow;
setEffect.run();
}
else {
focusEffect[0] = null;
setEffect.run();
}
});

imageView.addEventFilter(KeyEvent.KEY_PRESSED, keyEvent -> {
if (keyEvent.getCode() == KeyCode.ENTER || keyEvent.getCode() == KeyCode.SPACE) {
clickEffect[0] = decreaseBrightness;
setEffect.run();
keyEvent.consume();
}
});

imageView.addEventFilter(KeyEvent.KEY_RELEASED, keyEvent -> {
if (keyEvent.getCode() == KeyCode.ENTER || keyEvent.getCode() == KeyCode.SPACE) {

runActions.run();

clickEffect[0] = null;
setEffect.run();
keyEvent.consume();
}
});
}

@Override
protected void registerListeners()
{
Expand Down

0 comments on commit c14b18b

Please sign in to comment.