|
7 | 7 | import javafx.beans.property.SimpleDoubleProperty; |
8 | 8 | import javafx.scene.Group; |
9 | 9 | import javafx.scene.Node; |
| 10 | +import javafx.scene.control.Tooltip; |
10 | 11 | import javafx.scene.effect.BlurType; |
11 | 12 | import javafx.scene.effect.InnerShadow; |
12 | 13 | import javafx.scene.image.PixelFormat; |
13 | 14 | import javafx.scene.image.PixelWriter; |
14 | 15 | import javafx.scene.image.WritableImage; |
15 | 16 | import javafx.scene.paint.Color; |
16 | 17 | import javafx.util.Duration; |
| 18 | +import me.coley.recaf.Recaf; |
17 | 19 | import me.coley.recaf.ui.controls.IconView; |
18 | 20 | import me.coley.recaf.workspace.*; |
19 | 21 |
|
|
23 | 25 | import java.io.ByteArrayInputStream; |
24 | 26 | import java.lang.reflect.Method; |
25 | 27 | import java.util.Arrays; |
| 28 | +import java.util.Set; |
| 29 | +import java.util.stream.Collectors; |
26 | 30 |
|
27 | 31 | import static me.coley.recaf.util.ClasspathUtil.resource; |
28 | 32 |
|
@@ -116,6 +120,7 @@ else if(AccessFlag.isInterface(access)) |
116 | 120 | g.getChildren().add(new IconView("icons/modifier/abstract.png")); |
117 | 121 | if(AccessFlag.isBridge(access) || AccessFlag.isSynthetic(access)) |
118 | 122 | g.getChildren().add(new IconView("icons/modifier/synthetic.png")); |
| 123 | + createAccessToolTips(g, AccessFlag.Type.CLASS, access); |
119 | 124 | return g; |
120 | 125 | } |
121 | 126 |
|
@@ -145,6 +150,7 @@ else if(AccessFlag.isPrivate(access)) |
145 | 150 | g.getChildren().add(new IconView("icons/modifier/final.png")); |
146 | 151 | if(AccessFlag.isBridge(access) || AccessFlag.isSynthetic(access)) |
147 | 152 | g.getChildren().add(new IconView("icons/modifier/synthetic.png")); |
| 153 | + createAccessToolTips(g, AccessFlag.Type.FIELD, access); |
148 | 154 | return g; |
149 | 155 | } |
150 | 156 |
|
@@ -178,9 +184,24 @@ else if(AccessFlag.isAbstract(access)) |
178 | 184 | g.getChildren().add(new IconView("icons/modifier/final.png")); |
179 | 185 | if(AccessFlag.isBridge(access) || AccessFlag.isSynthetic(access)) |
180 | 186 | g.getChildren().add(new IconView("icons/modifier/synthetic.png")); |
| 187 | + createAccessToolTips(g, AccessFlag.Type.METHOD, access); |
181 | 188 | return g; |
182 | 189 | } |
183 | 190 |
|
| 191 | + private static void createAccessToolTips(Node node, AccessFlag.Type type, int access) { |
| 192 | + Set<String> accessFlags = AccessFlag.getApplicableFlags(type, access).stream() |
| 193 | + .map(AccessFlag::getName).collect(Collectors.toSet()); |
| 194 | + Tooltip tooltip = new Tooltip(String.join(", ", accessFlags)); |
| 195 | + node.setOnMouseEntered(event -> { |
| 196 | + if (!tooltip.getText().isEmpty() && Recaf.getController().config().display().accessFlagsTooltip) { |
| 197 | + tooltip.show(node, event.getScreenX(), event.getScreenY() + 15); |
| 198 | + } |
| 199 | + }); |
| 200 | + node.setOnMouseExited(event -> tooltip.hide()); |
| 201 | + // This has a weird delay |
| 202 | + // Tooltip.install(node, tooltip); |
| 203 | + } |
| 204 | + |
184 | 205 | /** |
185 | 206 | * Convert raw bytes to an image. |
186 | 207 | * |
|
0 commit comments