|
7 | 7 | import static com.ss.editor.util.EditorUtil.getAssetFile; |
8 | 8 | import static com.ss.editor.util.EditorUtil.toAssetPath; |
9 | 9 | import static java.util.Objects.requireNonNull; |
| 10 | +import static rlib.util.ClassUtils.unsafeCast; |
10 | 11 |
|
11 | 12 | import com.jme3.asset.AssetManager; |
12 | 13 | import com.jme3.asset.TextureKey; |
|
35 | 36 |
|
36 | 37 | import org.jetbrains.annotations.NotNull; |
37 | 38 |
|
| 39 | +import java.io.File; |
38 | 40 | import java.nio.file.Path; |
| 41 | +import java.util.List; |
| 42 | +import java.util.Set; |
39 | 43 | import java.util.function.Consumer; |
40 | 44 | import java.util.function.Predicate; |
41 | 45 |
|
|
44 | 48 | import javafx.scene.control.CheckBox; |
45 | 49 | import javafx.scene.control.Tooltip; |
46 | 50 | import javafx.scene.image.ImageView; |
| 51 | +import javafx.scene.input.DataFormat; |
| 52 | +import javafx.scene.input.DragEvent; |
| 53 | +import javafx.scene.input.Dragboard; |
| 54 | +import javafx.scene.input.TransferMode; |
47 | 55 | import javafx.scene.layout.VBox; |
48 | 56 | import rlib.ui.util.FXUtils; |
| 57 | +import rlib.util.FileUtils; |
49 | 58 | import rlib.util.array.Array; |
50 | 59 | import rlib.util.array.ArrayFactory; |
51 | 60 |
|
@@ -97,6 +106,9 @@ public class Texture2DMaterialParamControl extends MaterialParamControl { |
97 | 106 | public Texture2DMaterialParamControl(@NotNull final Consumer<EditorOperation> changeHandler, |
98 | 107 | @NotNull final Material material, @NotNull final String parameterName) { |
99 | 108 | super(changeHandler, material, parameterName); |
| 109 | + setOnDragOver(this::dragOver); |
| 110 | + setOnDragDropped(this::dragDropped); |
| 111 | + setOnDragExited(this::dragExited); |
100 | 112 | } |
101 | 113 |
|
102 | 114 | @Override |
@@ -153,6 +165,61 @@ protected void createComponents() { |
153 | 165 | flipButton.disableProperty().bind(texturePreview.imageProperty().isNull()); |
154 | 166 | } |
155 | 167 |
|
| 168 | + /** |
| 169 | + * Handle grad exiting. |
| 170 | + */ |
| 171 | + private void dragExited(@NotNull final DragEvent dragEvent) { |
| 172 | + |
| 173 | + } |
| 174 | + |
| 175 | + /** |
| 176 | + * Handle dropped files to editor. |
| 177 | + */ |
| 178 | + private void dragDropped(@NotNull final DragEvent dragEvent) { |
| 179 | + |
| 180 | + final Dragboard dragboard = dragEvent.getDragboard(); |
| 181 | + final List<File> files = unsafeCast(dragboard.getContent(DataFormat.FILES)); |
| 182 | + |
| 183 | + if (files == null || files.size() != 1) { |
| 184 | + return; |
| 185 | + } |
| 186 | + |
| 187 | + final File file = files.get(0); |
| 188 | + final String extension = FileUtils.getExtension(file.getName()); |
| 189 | + |
| 190 | + if (!TEXTURE_EXTENSIONS.contains(extension)) { |
| 191 | + return; |
| 192 | + } |
| 193 | + |
| 194 | + addTexture(file.toPath()); |
| 195 | + } |
| 196 | + |
| 197 | + /** |
| 198 | + * Handle drag over. |
| 199 | + */ |
| 200 | + private void dragOver(@NotNull final DragEvent dragEvent) { |
| 201 | + |
| 202 | + final Dragboard dragboard = dragEvent.getDragboard(); |
| 203 | + final List<File> files = unsafeCast(dragboard.getContent(DataFormat.FILES)); |
| 204 | + |
| 205 | + if (files == null || files.size() != 1) { |
| 206 | + return; |
| 207 | + } |
| 208 | + |
| 209 | + final File file = files.get(0); |
| 210 | + final String extension = FileUtils.getExtension(file.getName()); |
| 211 | + |
| 212 | + if (!TEXTURE_EXTENSIONS.contains(extension)) { |
| 213 | + return; |
| 214 | + } |
| 215 | + |
| 216 | + final Set<TransferMode> transferModes = dragboard.getTransferModes(); |
| 217 | + final boolean isCopy = transferModes.contains(TransferMode.COPY); |
| 218 | + |
| 219 | + dragEvent.acceptTransferModes(isCopy ? TransferMode.COPY : TransferMode.MOVE); |
| 220 | + dragEvent.consume(); |
| 221 | + } |
| 222 | + |
156 | 223 | @Override |
157 | 224 | protected double getLabelPercentWidth() { |
158 | 225 | return 0.9; |
|
0 commit comments