diff --git a/src/main/java/qupath/ext/instanseg/ui/InstanSegController.java b/src/main/java/qupath/ext/instanseg/ui/InstanSegController.java index e737fd7..8b4e866 100644 --- a/src/main/java/qupath/ext/instanseg/ui/InstanSegController.java +++ b/src/main/java/qupath/ext/instanseg/ui/InstanSegController.java @@ -23,6 +23,7 @@ import javafx.scene.control.SpinnerValueFactory; import javafx.scene.control.TextField; import javafx.scene.control.ToggleButton; +import javafx.scene.input.MouseEvent; import javafx.scene.layout.BorderPane; import org.controlsfx.control.CheckComboBox; import org.controlsfx.control.SearchableComboBox; @@ -30,10 +31,12 @@ import org.slf4j.LoggerFactory; import qupath.ext.instanseg.core.InstanSegModel; import qupath.ext.instanseg.core.InstanSegTask; +import qupath.fx.dialogs.FileChoosers; import qupath.fx.utils.FXUtils; import qupath.lib.common.ThreadTools; import qupath.lib.display.ChannelDisplayInfo; import qupath.lib.gui.QuPathGUI; +import qupath.lib.gui.tools.GuiTools; import qupath.lib.images.ImageData; import qupath.lib.images.servers.ColorTransforms; import qupath.lib.images.servers.ImageServer; @@ -43,6 +46,7 @@ import qupath.lib.scripting.QP; import java.awt.image.BufferedImage; +import java.io.File; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.Files; @@ -204,7 +208,6 @@ private static Collection getAvailableUniqueChannelNames(ImageServer } - private static String getTitle(CheckComboBox comboBox) { int n = comboBox.getCheckModel().getCheckedItems().size(); if (n == 0) @@ -298,7 +301,6 @@ private void configureDeviceChoices() { // changed elsewhere deviceChoices.getSelectionModel().selectedItemProperty().addListener( (value, oldValue, newValue) -> InstanSegPreferences.preferredDeviceProperty().set(newValue)); - } private void configureMessageLabel() { @@ -317,7 +319,6 @@ private void configureMessageLabel() { }); } - static void addModelsFromPath(String dir, ComboBox box) { if (dir == null || dir.isEmpty()) return; box.getItems().clear(); @@ -650,5 +651,44 @@ private void updateSelectedObjectCounts() { } + /** + * Open the model directory in the system file browser when double-clicked. + * @param event + */ + @FXML + public void handleModelDirectoryLabelClick(MouseEvent event) { + if (event.getClickCount() != 2) + return; + var path = InstanSegPreferences.modelDirectoryProperty().get(); + if (path == null || path.isEmpty()) + return; + var file = new File(path); + if (file.exists()) + GuiTools.browseDirectory(file); + else + logger.debug("Can't browse directory for {}", file); + } + + @FXML + public void promptForModelDirectory() { + promptToUpdateDirectory(InstanSegPreferences.modelDirectoryProperty()); + } + private void promptToUpdateDirectory(StringProperty dirPath) { + var modelDirPath = dirPath.get(); + var dir = modelDirPath == null || modelDirPath.isEmpty() ? null : new File(modelDirPath); + if (dir != null) { + if (dir.isFile()) + dir = dir.getParentFile(); + else if (!dir.exists()) + dir = null; + } + var newDir = FileChoosers.promptForDirectory( + FXUtils.getWindow(tfModelDirectory), // Get window from any node here + resources.getString("ui.model-directory.choose-directory"), + dir); + if (newDir == null) + return; + dirPath.set(newDir.getAbsolutePath()); + } } diff --git a/src/main/resources/qupath/ext/instanseg/ui/instanseg_control.fxml b/src/main/resources/qupath/ext/instanseg/ui/instanseg_control.fxml index c0c2429..a22bd0c 100644 --- a/src/main/resources/qupath/ext/instanseg/ui/instanseg_control.fxml +++ b/src/main/resources/qupath/ext/instanseg/ui/instanseg_control.fxml @@ -136,7 +136,7 @@ -