Search in sources :

Example 1 with TMACoreObject

use of qupath.lib.objects.TMACoreObject in project qupath by qupath.

the class QP method clearTMAGrid.

/**
 * Remove the TMA grid from the current {@code PathObjectHierarchy}.
 *
 * @see #getCurrentHierarchy
 */
public static void clearTMAGrid() {
    PathObjectHierarchy hierarchy = getCurrentHierarchy();
    if (hierarchy == null)
        return;
    hierarchy.setTMAGrid(null);
    PathObject selected = hierarchy.getSelectionModel().getSelectedObject();
    if (selected instanceof TMACoreObject)
        hierarchy.getSelectionModel().setSelectedObject(null);
}
Also used : PathObjectHierarchy(qupath.lib.objects.hierarchy.PathObjectHierarchy) PathObject(qupath.lib.objects.PathObject) TMACoreObject(qupath.lib.objects.TMACoreObject)

Example 2 with TMACoreObject

use of qupath.lib.objects.TMACoreObject in project qupath by qupath.

the class Commands method promptToDeleteObjects.

/**
 * Prompt to delete objects of a specified type, or all objects.
 * @param imageData
 * @param cls
 */
public static void promptToDeleteObjects(ImageData<?> imageData, Class<? extends PathObject> cls) {
    if (imageData == null)
        return;
    PathObjectHierarchy hierarchy = imageData.getHierarchy();
    // Handle no specified class - indicates all objects of all types should be cleared
    if (cls == null) {
        int n = hierarchy.nObjects();
        if (n == 0)
            return;
        String message;
        if (n == 1)
            message = "Delete object?";
        else
            message = "Delete all " + n + " objects?";
        if (Dialogs.showYesNoDialog("Delete objects", message)) {
            hierarchy.clearAll();
            hierarchy.getSelectionModel().setSelectedObject(null);
            imageData.getHistoryWorkflow().addStep(new DefaultScriptableWorkflowStep("Clear all objects", "clearAllObjects();"));
        }
        return;
    }
    // Handle clearing TMA grid
    if (TMACoreObject.class.equals(cls)) {
        if (hierarchy.getTMAGrid() != null) {
            if (Dialogs.showYesNoDialog("Delete objects", "Clear TMA grid?")) {
                hierarchy.setTMAGrid(null);
                PathObject selected = hierarchy.getSelectionModel().getSelectedObject();
                if (selected instanceof TMACoreObject)
                    hierarchy.getSelectionModel().setSelectedObject(null);
                imageData.getHistoryWorkflow().addStep(new DefaultScriptableWorkflowStep("Clear TMA Grid", "clearTMAGrid();"));
            }
            return;
        }
    }
    // Handle clearing objects of another specified type
    Collection<PathObject> pathObjects = hierarchy.getObjects(null, cls);
    if (pathObjects.isEmpty())
        return;
    int n = pathObjects.size();
    String message = n == 1 ? "Delete 1 object?" : "Delete " + n + " objects?";
    if (Dialogs.showYesNoDialog("Delete objects", message)) {
        hierarchy.removeObjects(pathObjects, true);
        PathObject selected = hierarchy.getSelectionModel().getSelectedObject();
        if (selected != null && selected.getClass().isAssignableFrom(cls))
            hierarchy.getSelectionModel().setSelectedObject(null);
        if (selected != null && selected.getClass().isAssignableFrom(cls))
            hierarchy.getSelectionModel().setSelectedObject(null);
        if (cls == PathDetectionObject.class)
            imageData.getHistoryWorkflow().addStep(new DefaultScriptableWorkflowStep("Clear detections", "clearDetections();"));
        else if (cls == PathAnnotationObject.class)
            imageData.getHistoryWorkflow().addStep(new DefaultScriptableWorkflowStep("Clear annotations", "clearAnnotations();"));
        else if (cls == TMACoreObject.class)
            imageData.getHistoryWorkflow().addStep(new DefaultScriptableWorkflowStep("Clear TMA grid", "clearTMAGrid();"));
        else
            logger.warn("Cannot clear all objects for class {}", cls);
    }
}
Also used : DefaultScriptableWorkflowStep(qupath.lib.plugins.workflow.DefaultScriptableWorkflowStep) PathObjectHierarchy(qupath.lib.objects.hierarchy.PathObjectHierarchy) PathAnnotationObject(qupath.lib.objects.PathAnnotationObject) PathObject(qupath.lib.objects.PathObject) TMACoreObject(qupath.lib.objects.TMACoreObject)

Example 3 with TMACoreObject

use of qupath.lib.objects.TMACoreObject in project qupath by qupath.

the class TMACommands method promptToDeleteTMAGridRowOrColumn.

private static boolean promptToDeleteTMAGridRowOrColumn(ImageData<?> imageData, TMARemoveType type) {
    String typeString = type.toString();
    String title = "Delete TMA " + typeString;
    boolean removeRow = type == TMARemoveType.ROW;
    if (imageData == null) {
        Dialogs.showNoImageError(title);
        return false;
    }
    if (imageData.getHierarchy().getTMAGrid() == null) {
        Dialogs.showErrorMessage(title, "No image with dearrayed TMA cores selected!");
        return false;
    }
    PathObjectHierarchy hierarchy = imageData.getHierarchy();
    PathObject selected = hierarchy.getSelectionModel().getSelectedObject();
    TMACoreObject selectedCore = null;
    if (selected != null)
        selectedCore = PathObjectTools.getAncestorTMACore(selected);
    // Try to identify the row/column that we want
    TMAGrid grid = hierarchy.getTMAGrid();
    int row = -1;
    int col = -1;
    if (selectedCore != null) {
        for (int y = 0; y < grid.getGridHeight(); y++) {
            for (int x = 0; x < grid.getGridWidth(); x++) {
                if (grid.getTMACore(y, x) == selectedCore) {
                    row = y;
                    col = x;
                    break;
                }
            }
        }
    }
    // We need a selected core to know what to remove
    if (row < 0 || col < 0) {
        Dialogs.showErrorMessage(title, "Please select a TMA core to indicate which " + typeString + " to remove");
        return false;
    }
    // Check we have enough rows/columns - if not, this is just a clear operation
    if ((removeRow && grid.getGridHeight() <= 1) || (!removeRow && grid.getGridWidth() <= 1)) {
        if (Dialogs.showConfirmDialog(title, "Are you sure you want to delete the entire TMA grid?"))
            hierarchy.setTMAGrid(null);
        return false;
    }
    // Confirm the removal - add 1 due to 'base 0' probably not being expected by most users...
    int num = removeRow ? row : col;
    if (!Dialogs.showConfirmDialog(title, "Are you sure you want to delete " + typeString + " " + (num + 1) + " from TMA grid?"))
        return false;
    // Create a new grid
    List<TMACoreObject> coresNew = new ArrayList<>();
    for (int r = 0; r < grid.getGridHeight(); r++) {
        if (removeRow && row == r)
            continue;
        for (int c = 0; c < grid.getGridWidth(); c++) {
            if (!removeRow && col == c)
                continue;
            coresNew.add(grid.getTMACore(r, c));
        }
    }
    int newWidth = removeRow ? grid.getGridWidth() : grid.getGridWidth() - 1;
    TMAGrid gridNew = DefaultTMAGrid.create(coresNew, newWidth);
    hierarchy.setTMAGrid(gridNew);
    hierarchy.getSelectionModel().clearSelection();
    // Request new labels
    promptToRelabelTMAGrid(imageData);
    return true;
}
Also used : PathObjectHierarchy(qupath.lib.objects.hierarchy.PathObjectHierarchy) PathObject(qupath.lib.objects.PathObject) TMACoreObject(qupath.lib.objects.TMACoreObject) DefaultTMAGrid(qupath.lib.objects.hierarchy.DefaultTMAGrid) TMAGrid(qupath.lib.objects.hierarchy.TMAGrid) ArrayList(java.util.ArrayList)

Example 4 with TMACoreObject

use of qupath.lib.objects.TMACoreObject in project qupath by qupath.

the class TMAGridView method initializeData.

private void initializeData(ImageData<BufferedImage> imageData) {
    if (this.imageData != imageData) {
        if (this.imageData != null)
            this.imageData.getHierarchy().removePathObjectListener(this);
        this.imageData = imageData;
        if (imageData != null) {
            imageData.getHierarchy().addPathObjectListener(this);
        }
    }
    if (imageData == null || imageData.getHierarchy().getTMAGrid() == null) {
        model.setImageData(null, Collections.emptyList());
        grid.getItems().clear();
        return;
    }
    // Request all core thumbnails now
    List<TMACoreObject> cores = imageData.getHierarchy().getTMAGrid().getTMACoreList();
    ImageServer<BufferedImage> server = imageData.getServer();
    CountDownLatch latch = new CountDownLatch(cores.size());
    for (TMACoreObject core : cores) {
        ROI roi = core.getROI();
        if (roi != null) {
            qupath.submitShortTask(() -> {
                RegionRequest request = createRegionRequest(core);
                if (cache.containsKey(request)) {
                    latch.countDown();
                    return;
                }
                BufferedImage img;
                try {
                    img = server.readBufferedImage(request);
                } catch (IOException e) {
                    logger.debug("Unable to get tile for " + request, e);
                    latch.countDown();
                    return;
                }
                Image imageNew = SwingFXUtils.toFXImage(img, null);
                if (imageNew != null) {
                    cache.put(request, imageNew);
                // Platform.runLater(() -> updateGridDisplay());
                }
                latch.countDown();
            });
        } else
            latch.countDown();
    }
    long startTime = System.currentTimeMillis();
    try {
        latch.await(10, TimeUnit.SECONDS);
    } catch (InterruptedException e1) {
        if (latch.getCount() > 0)
            logger.warn("Loaded {} cores in 10 seconds", cores.size() - latch.getCount());
    }
    logger.info("Countdown complete in {} seconds", (System.currentTimeMillis() - startTime) / 1000.0);
    model.setImageData(imageData, cores);
    backingList.setAll(cores);
    String m = measurement.getValue();
    sortCores(backingList, model, m, descending.get());
    filteredList.setPredicate(p -> {
        return !(p.isMissing() || Double.isNaN(model.getNumericValue(p, m)));
    });
    grid.getItems().setAll(filteredList);
}
Also used : TMACoreObject(qupath.lib.objects.TMACoreObject) IOException(java.io.IOException) CountDownLatch(java.util.concurrent.CountDownLatch) BufferedImage(java.awt.image.BufferedImage) Image(javafx.scene.image.Image) ROI(qupath.lib.roi.interfaces.ROI) RegionRequest(qupath.lib.regions.RegionRequest) BufferedImage(java.awt.image.BufferedImage)

Example 5 with TMACoreObject

use of qupath.lib.objects.TMACoreObject in project qupath by qupath.

the class QuPathGUI method setViewerPopupMenu.

private void setViewerPopupMenu(final QuPathViewerPlus viewer) {
    final ContextMenu popup = new ContextMenu();
    MenuItem miAddRow = new MenuItem("Add row");
    miAddRow.setOnAction(e -> viewerManager.addRow(viewer));
    MenuItem miAddColumn = new MenuItem("Add column");
    miAddColumn.setOnAction(e -> viewerManager.addColumn(viewer));
    MenuItem miRemoveRow = new MenuItem("Remove row");
    miRemoveRow.setOnAction(e -> viewerManager.removeViewerRow(viewer));
    MenuItem miRemoveColumn = new MenuItem("Remove column");
    miRemoveColumn.setOnAction(e -> viewerManager.removeViewerColumn(viewer));
    MenuItem miCloseViewer = new MenuItem("Close viewer");
    miCloseViewer.setOnAction(e -> {
        viewerManager.closeViewer(viewer);
    // viewerManager.removeViewer(viewer);
    });
    MenuItem miResizeGrid = new MenuItem("Reset grid size");
    miResizeGrid.setOnAction(e -> {
        viewerManager.resetGridSize();
    });
    MenuItem miToggleSync = ActionTools.createCheckMenuItem(defaultActions.TOGGLE_SYNCHRONIZE_VIEWERS, null);
    MenuItem miMatchResolutions = ActionTools.createMenuItem(defaultActions.MATCH_VIEWER_RESOLUTIONS);
    Menu menuMultiview = MenuTools.createMenu("Multi-view", miToggleSync, miMatchResolutions, miCloseViewer, null, miResizeGrid, null, // null,
    miAddRow, miAddColumn, null, miRemoveRow, miRemoveColumn);
    Menu menuView = MenuTools.createMenu("Display", ActionTools.createCheckMenuItem(defaultActions.SHOW_ANALYSIS_PANE, null), defaultActions.BRIGHTNESS_CONTRAST, null, ActionTools.createAction(() -> Commands.setViewerDownsample(viewer, 0.25), "400%"), ActionTools.createAction(() -> Commands.setViewerDownsample(viewer, 1), "100%"), ActionTools.createAction(() -> Commands.setViewerDownsample(viewer, 2), "50%"), ActionTools.createAction(() -> Commands.setViewerDownsample(viewer, 10), "10%"), ActionTools.createAction(() -> Commands.setViewerDownsample(viewer, 100), "1%"));
    ToggleGroup groupTools = new ToggleGroup();
    Menu menuTools = MenuTools.createMenu("Set tool", ActionTools.createCheckMenuItem(defaultActions.MOVE_TOOL, groupTools), ActionTools.createCheckMenuItem(defaultActions.RECTANGLE_TOOL, groupTools), ActionTools.createCheckMenuItem(defaultActions.ELLIPSE_TOOL, groupTools), ActionTools.createCheckMenuItem(defaultActions.LINE_TOOL, groupTools), ActionTools.createCheckMenuItem(defaultActions.POLYGON_TOOL, groupTools), ActionTools.createCheckMenuItem(defaultActions.POLYLINE_TOOL, groupTools), ActionTools.createCheckMenuItem(defaultActions.BRUSH_TOOL, groupTools), ActionTools.createCheckMenuItem(defaultActions.POINTS_TOOL, groupTools), null, ActionTools.createCheckMenuItem(defaultActions.SELECTION_MODE));
    // Handle awkward 'TMA core missing' option
    CheckMenuItem miTMAValid = new CheckMenuItem("Set core valid");
    miTMAValid.setOnAction(e -> setTMACoreMissing(viewer.getHierarchy(), false));
    CheckMenuItem miTMAMissing = new CheckMenuItem("Set core missing");
    miTMAMissing.setOnAction(e -> setTMACoreMissing(viewer.getHierarchy(), true));
    Menu menuTMA = new Menu("TMA");
    MenuTools.addMenuItems(menuTMA, miTMAValid, miTMAMissing, null, defaultActions.TMA_ADD_NOTE, null, MenuTools.createMenu("Add", createImageDataAction(imageData -> TMACommands.promptToAddRowBeforeSelected(imageData), "Add TMA row before"), createImageDataAction(imageData -> TMACommands.promptToAddRowAfterSelected(imageData), "Add TMA row after"), createImageDataAction(imageData -> TMACommands.promptToAddColumnBeforeSelected(imageData), "Add TMA column before"), createImageDataAction(imageData -> TMACommands.promptToAddColumnAfterSelected(imageData), "Add TMA column after")), MenuTools.createMenu("Remove", createImageDataAction(imageData -> TMACommands.promptToDeleteTMAGridRow(imageData), "Remove TMA row"), createImageDataAction(imageData -> TMACommands.promptToDeleteTMAGridColumn(imageData), "column")));
    // Create an empty placeholder menu
    Menu menuSetClass = MenuTools.createMenu("Set class");
    // CheckMenuItem miTMAValid = new CheckMenuItem("Set core valid");
    // miTMAValid.setOnAction(e -> setTMACoreMissing(viewer.getHierarchy(), false));
    // CheckMenuItem miTMAMissing = new CheckMenuItem("Set core missing");
    // miTMAMissing.setOnAction(e -> setTMACoreMissing(viewer.getHierarchy(), true));
    Menu menuCells = MenuTools.createMenu("Cells", ActionTools.createCheckMenuItem(defaultActions.SHOW_CELL_BOUNDARIES_AND_NUCLEI, null), ActionTools.createCheckMenuItem(defaultActions.SHOW_CELL_NUCLEI, null), ActionTools.createCheckMenuItem(defaultActions.SHOW_CELL_BOUNDARIES, null), ActionTools.createCheckMenuItem(defaultActions.SHOW_CELL_CENTROIDS, null));
    MenuItem miClearSelectedObjects = new MenuItem("Delete object");
    miClearSelectedObjects.setOnAction(e -> {
        PathObjectHierarchy hierarchy = viewer.getHierarchy();
        if (hierarchy == null)
            return;
        if (hierarchy.getSelectionModel().singleSelection()) {
            GuiTools.promptToRemoveSelectedObject(hierarchy.getSelectionModel().getSelectedObject(), hierarchy);
        } else {
            GuiTools.promptToClearAllSelectedObjects(viewer.getImageData());
        }
    });
    // Create a standard annotations menu
    Menu menuAnnotations = GuiTools.populateAnnotationsMenu(this, new Menu("Annotations"));
    SeparatorMenuItem topSeparator = new SeparatorMenuItem();
    popup.setOnShowing(e -> {
        // Check if we have any cells
        ImageData<?> imageData = viewer.getImageData();
        if (imageData == null)
            menuCells.setVisible(false);
        else
            menuCells.setVisible(!imageData.getHierarchy().getDetectionObjects().isEmpty());
        // Check what to show for TMA cores or annotations
        Collection<PathObject> selectedObjects = viewer.getAllSelectedObjects();
        PathObject pathObject = viewer.getSelectedObject();
        menuTMA.setVisible(false);
        if (pathObject instanceof TMACoreObject) {
            boolean isMissing = ((TMACoreObject) pathObject).isMissing();
            miTMAValid.setSelected(!isMissing);
            miTMAMissing.setSelected(isMissing);
            menuTMA.setVisible(true);
        }
        // Add clear objects option if we have more than one non-TMA object
        if (imageData == null || imageData.getHierarchy().getSelectionModel().noSelection() || imageData.getHierarchy().getSelectionModel().getSelectedObject() instanceof TMACoreObject)
            miClearSelectedObjects.setVisible(false);
        else {
            if (imageData.getHierarchy().getSelectionModel().singleSelection()) {
                miClearSelectedObjects.setText("Delete object");
                miClearSelectedObjects.setVisible(true);
            } else {
                miClearSelectedObjects.setText("Delete objects");
                miClearSelectedObjects.setVisible(true);
            }
        }
        boolean hasAnnotations = pathObject instanceof PathAnnotationObject || (!selectedObjects.isEmpty() && selectedObjects.stream().allMatch(p -> p.isAnnotation()));
        updateSetAnnotationPathClassMenu(menuSetClass, viewer);
        menuAnnotations.setVisible(hasAnnotations);
        topSeparator.setVisible(hasAnnotations || pathObject instanceof TMACoreObject);
        // Occasionally, the newly-visible top part of a popup menu can have the wrong size?
        popup.setWidth(popup.getPrefWidth());
    });
    // popup.add(menuClassify);
    popup.getItems().addAll(miClearSelectedObjects, menuTMA, menuSetClass, menuAnnotations, topSeparator, menuMultiview, menuCells, menuView, menuTools);
    popup.setAutoHide(true);
    // Enable circle pop-up for quick classification on right-click
    CirclePopupMenu circlePopup = new CirclePopupMenu(viewer.getView(), null);
    viewer.getView().addEventHandler(MouseEvent.MOUSE_PRESSED, e -> {
        if ((e.isPopupTrigger() || e.isSecondaryButtonDown()) && e.isShiftDown() && !getAvailablePathClasses().isEmpty()) {
            circlePopup.setAnimationDuration(Duration.millis(200));
            updateSetAnnotationPathClassMenu(circlePopup, viewer);
            circlePopup.show(e.getScreenX(), e.getScreenY());
            e.consume();
            return;
        } else if (circlePopup.isShown())
            circlePopup.hide();
        if (e.isPopupTrigger() || e.isSecondaryButtonDown()) {
            popup.show(viewer.getView().getScene().getWindow(), e.getScreenX(), e.getScreenY());
            e.consume();
        }
    });
// // It's necessary to make the Window the owner, since otherwise the context menu does not disappear when clicking elsewhere on the viewer
// viewer.getView().setOnContextMenuRequested(e -> {
// popup.show(viewer.getView().getScene().getWindow(), e.getScreenX(), e.getScreenY());
// //			popup.show(viewer.getView(), e.getScreenX(), e.getScreenY());
// });
}
Also used : Change(javafx.collections.ListChangeListener.Change) PathObjectHierarchyView(qupath.lib.gui.panes.PathObjectHierarchyView) SelectedMeasurementTableView(qupath.lib.gui.panes.SelectedMeasurementTableView) Version(qupath.lib.common.Version) ProjectBrowser(qupath.lib.gui.panes.ProjectBrowser) ListChangeListener(javafx.collections.ListChangeListener) Map(java.util.Map) Path(java.nio.file.Path) ReleaseVersion(qupath.lib.gui.extensions.UpdateChecker.ReleaseVersion) Rectangle2D(javafx.geometry.Rectangle2D) PathObjects(qupath.lib.objects.PathObjects) Rectangle(javafx.scene.shape.Rectangle) BooleanProperty(javafx.beans.property.BooleanProperty) Project(qupath.lib.projects.Project) ObservableList(javafx.collections.ObservableList) Divider(javafx.scene.control.SplitPane.Divider) QuPathExtension(qupath.lib.gui.extensions.QuPathExtension) ByteArrayOutputStream(java.io.ByteArrayOutputStream) FXCollections(javafx.collections.FXCollections) PathIcons(qupath.lib.gui.tools.IconFactory.PathIcons) PathObjectHierarchy(qupath.lib.objects.hierarchy.PathObjectHierarchy) Bindings(javafx.beans.binding.Bindings) LinkedHashMap(java.util.LinkedHashMap) TreeTableView(javafx.scene.control.TreeTableView) PreferencePane(qupath.lib.gui.panes.PreferencePane) Commands(qupath.lib.gui.commands.Commands) QuPathStyleManager(qupath.lib.gui.prefs.QuPathStyleManager) IOException(java.io.IOException) OverlayOptions(qupath.lib.gui.viewer.OverlayOptions) Preferences(java.util.prefs.Preferences) ROI(qupath.lib.roi.interfaces.ROI) PathTools(qupath.lib.gui.viewer.tools.PathTools) ParameterPanelFX(qupath.lib.gui.dialogs.ParameterPanelFX) DragDropImportListener(qupath.lib.gui.viewer.DragDropImportListener) ImageView(javafx.scene.image.ImageView) TMAGrid(qupath.lib.objects.hierarchy.TMAGrid) Image(javafx.scene.image.Image) PathIO(qupath.lib.io.PathIO) EventHandler(javafx.event.EventHandler) ImageServer(qupath.lib.images.servers.ImageServer) BooleanBinding(javafx.beans.binding.BooleanBinding) TextInputControl(javafx.scene.control.TextInputControl) URLDecoder(java.net.URLDecoder) UncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler) Date(java.util.Date) URISyntaxException(java.net.URISyntaxException) ObjectInputStream(java.io.ObjectInputStream) KeyCombination(javafx.scene.input.KeyCombination) DefaultImageRegionStore(qupath.lib.gui.images.stores.DefaultImageRegionStore) ByteArrayInputStream(java.io.ByteArrayInputStream) Locale(java.util.Locale) GitHubProject(qupath.lib.gui.extensions.GitHubProject) ImageIO(javax.imageio.ImageIO) RotateEvent(javafx.scene.input.RotateEvent) WindowEvent(javafx.stage.WindowEvent) PathInteractivePlugin(qupath.lib.plugins.PathInteractivePlugin) Orientation(javafx.geometry.Orientation) MenuItem(javafx.scene.control.MenuItem) Ellipse(javafx.scene.shape.Ellipse) ImageServerProvider(qupath.lib.images.servers.ImageServerProvider) Collection(java.util.Collection) Font(javafx.scene.text.Font) ServiceLoader(java.util.ServiceLoader) Collectors(java.util.stream.Collectors) BorderStroke(javafx.scene.layout.BorderStroke) PathObject(qupath.lib.objects.PathObject) Objects(java.util.Objects) ImageTypeSetting(qupath.lib.gui.prefs.PathPrefs.ImageTypeSetting) ProjectIO(qupath.lib.projects.ProjectIO) GuiTools(qupath.lib.gui.tools.GuiTools) ExecutorCompletionService(java.util.concurrent.ExecutorCompletionService) Scene(javafx.scene.Scene) ListView(javafx.scene.control.ListView) ReadOnlyObjectProperty(javafx.beans.property.ReadOnlyObjectProperty) SimpleStringProperty(javafx.beans.property.SimpleStringProperty) Action(org.controlsfx.control.action.Action) PathClassFactory(qupath.lib.objects.classes.PathClassFactory) ScriptEditor(qupath.lib.gui.scripting.ScriptEditor) TableColumn(javafx.scene.control.TableColumn) HashSet(java.util.HashSet) Insets(javafx.geometry.Insets) DetectionDisplayMode(qupath.lib.gui.viewer.OverlayOptions.DetectionDisplayMode) ExecutorService(java.util.concurrent.ExecutorService) KeyCode(javafx.scene.input.KeyCode) ActionAccelerator(qupath.lib.gui.ActionTools.ActionAccelerator) Logger(org.slf4j.Logger) Dialog(javafx.scene.control.Dialog) Label(javafx.scene.control.Label) MenuBar(javafx.scene.control.MenuBar) ActionIcon(qupath.lib.gui.ActionTools.ActionIcon) ServerBuilder(qupath.lib.images.servers.ImageServerBuilder.ServerBuilder) ScrollEvent(javafx.scene.input.ScrollEvent) Consumer(java.util.function.Consumer) SimpleBooleanProperty(javafx.beans.property.SimpleBooleanProperty) Stage(javafx.stage.Stage) ViewerPlusDisplayOptions(qupath.lib.gui.viewer.ViewerPlusDisplayOptions) Comparator(java.util.Comparator) PathTool(qupath.lib.gui.viewer.tools.PathTool) Arrays(java.util.Arrays) ServerTools(qupath.lib.images.servers.ServerTools) ActionUtils(org.controlsfx.control.action.ActionUtils) ActionDescription(qupath.lib.gui.ActionTools.ActionDescription) ReadOnlyBooleanProperty(javafx.beans.property.ReadOnlyBooleanProperty) StackPane(javafx.scene.layout.StackPane) AnnotationPane(qupath.lib.gui.panes.AnnotationPane) JFXPanel(javafx.embed.swing.JFXPanel) Category(java.util.Locale.Category) ParameterList(qupath.lib.plugins.parameters.ParameterList) TabPane(javafx.scene.control.TabPane) ScriptException(javax.script.ScriptException) CountingPanelCommand(qupath.lib.gui.commands.CountingPanelCommand) SplitPane(javafx.scene.control.SplitPane) Border(javafx.scene.layout.Border) Event(javafx.event.Event) Set(java.util.Set) KeyEvent(javafx.scene.input.KeyEvent) Screen(javafx.stage.Screen) AffineTransform(java.awt.geom.AffineTransform) QuPathViewerListener(qupath.lib.gui.viewer.QuPathViewerListener) StandardCharsets(java.nio.charset.StandardCharsets) Executors(java.util.concurrent.Executors) PathAnnotationObject(qupath.lib.objects.PathAnnotationObject) Platform(javafx.application.Platform) Region(javafx.scene.layout.Region) CommandFinderTools(qupath.lib.gui.tools.CommandFinderTools) InputDisplayCommand(qupath.lib.gui.commands.InputDisplayCommand) ImageRegionStoreFactory(qupath.lib.gui.images.stores.ImageRegionStoreFactory) ThreadTools(qupath.lib.common.ThreadTools) DefaultScriptEditor(qupath.lib.gui.scripting.DefaultScriptEditor) GitHubRepo(qupath.lib.gui.extensions.GitHubProject.GitHubRepo) BorderPane(javafx.scene.layout.BorderPane) ButtonData(javafx.scene.control.ButtonBar.ButtonData) SimpleDateFormat(java.text.SimpleDateFormat) PathPlugin(qupath.lib.plugins.PathPlugin) Projects(qupath.lib.projects.Projects) StandardCopyOption(java.nio.file.StandardCopyOption) ArrayList(java.util.ArrayList) TabClosingPolicy(javafx.scene.control.TabPane.TabClosingPolicy) QuPathViewerPlus(qupath.lib.gui.viewer.QuPathViewerPlus) ObjectOutputStream(java.io.ObjectOutputStream) LinkedHashSet(java.util.LinkedHashSet) Color(javafx.scene.paint.Color) CirclePopupMenu(jfxtras.scene.menu.CirclePopupMenu) TitledPane(javafx.scene.control.TitledPane) Files(java.nio.file.Files) ToolBar(javafx.scene.control.ToolBar) GeneralTools(qupath.lib.common.GeneralTools) Node(javafx.scene.Node) CheckBox(javafx.scene.control.CheckBox) ProjectCommands(qupath.lib.gui.commands.ProjectCommands) File(java.io.File) PathObjectTools(qupath.lib.objects.PathObjectTools) Menu(javafx.scene.control.Menu) Cursor(javafx.scene.Cursor) KeyCodeCombination(javafx.scene.input.KeyCodeCombination) Paths(java.nio.file.Paths) SimpleObjectProperty(javafx.beans.property.SimpleObjectProperty) Tab(javafx.scene.control.Tab) PathPrefs(qupath.lib.gui.prefs.PathPrefs) StringBinding(javafx.beans.binding.StringBinding) Pos(javafx.geometry.Pos) Area(java.awt.geom.Area) CheckMenuItem(javafx.scene.control.CheckMenuItem) LoggerFactory(org.slf4j.LoggerFactory) UpdateChecker(qupath.lib.gui.extensions.UpdateChecker) Parent(javafx.scene.Parent) ContextMenu(javafx.scene.control.ContextMenu) URI(java.net.URI) ImageServers(qupath.lib.images.servers.ImageServers) TableView(javafx.scene.control.TableView) ImageType(qupath.lib.images.ImageData.ImageType) Shape(java.awt.Shape) BufferedImage(java.awt.image.BufferedImage) GroovyLanguage(qupath.lib.gui.scripting.languages.GroovyLanguage) ImageServerBuilder(qupath.lib.images.servers.ImageServerBuilder) FileNotFoundException(java.io.FileNotFoundException) TreeView(javafx.scene.control.TreeView) SeparatorMenuItem(javafx.scene.control.SeparatorMenuItem) QuPathViewer(qupath.lib.gui.viewer.QuPathViewer) List(java.util.List) Duration(javafx.util.Duration) ColorToolsFX(qupath.lib.gui.tools.ColorToolsFX) Optional(java.util.Optional) LogManager(qupath.lib.gui.logging.LogManager) RadioMenuItem(javafx.scene.control.RadioMenuItem) WorkflowCommandLogView(qupath.lib.gui.panes.WorkflowCommandLogView) TextArea(javafx.scene.control.TextArea) ButtonType(javafx.scene.control.ButtonType) MouseEvent(javafx.scene.input.MouseEvent) HashMap(java.util.HashMap) BrightnessContrastCommand(qupath.lib.gui.commands.BrightnessContrastCommand) UriImageSupport(qupath.lib.images.servers.ImageServerBuilder.UriImageSupport) Dialogs(qupath.lib.gui.dialogs.Dialogs) SwingUtilities(javax.swing.SwingUtilities) HostServices(javafx.application.HostServices) ZoomEvent(javafx.scene.input.ZoomEvent) TMACommands(qupath.lib.gui.commands.TMACommands) Tooltip(javafx.scene.control.Tooltip) ImageDetailsPane(qupath.lib.gui.panes.ImageDetailsPane) ImageData(qupath.lib.images.ImageData) Desktop(java.awt.Desktop) RoiTools(qupath.lib.roi.RoiTools) ObjectProperty(javafx.beans.property.ObjectProperty) Iterator(java.util.Iterator) ProjectImageEntry(qupath.lib.projects.ProjectImageEntry) TableRow(javafx.scene.control.TableRow) PathClass(qupath.lib.objects.classes.PathClass) TMACoreObject(qupath.lib.objects.TMACoreObject) DropShadow(javafx.scene.effect.DropShadow) MenuTools(qupath.lib.gui.tools.MenuTools) BorderStrokeStyle(javafx.scene.layout.BorderStrokeStyle) ActionEvent(javafx.event.ActionEvent) ToggleGroup(javafx.scene.control.ToggleGroup) LogViewerCommand(qupath.lib.gui.commands.LogViewerCommand) SwingFXUtils(javafx.embed.swing.SwingFXUtils) Collections(java.util.Collections) InputStream(java.io.InputStream) DialogButton(qupath.lib.gui.dialogs.Dialogs.DialogButton) PathObjectHierarchy(qupath.lib.objects.hierarchy.PathObjectHierarchy) CirclePopupMenu(jfxtras.scene.menu.CirclePopupMenu) TMACoreObject(qupath.lib.objects.TMACoreObject) ContextMenu(javafx.scene.control.ContextMenu) MenuItem(javafx.scene.control.MenuItem) CheckMenuItem(javafx.scene.control.CheckMenuItem) SeparatorMenuItem(javafx.scene.control.SeparatorMenuItem) RadioMenuItem(javafx.scene.control.RadioMenuItem) SeparatorMenuItem(javafx.scene.control.SeparatorMenuItem) CheckMenuItem(javafx.scene.control.CheckMenuItem) PathAnnotationObject(qupath.lib.objects.PathAnnotationObject) PathObject(qupath.lib.objects.PathObject) ToggleGroup(javafx.scene.control.ToggleGroup) CirclePopupMenu(jfxtras.scene.menu.CirclePopupMenu) Menu(javafx.scene.control.Menu) ContextMenu(javafx.scene.control.ContextMenu)

Aggregations

TMACoreObject (qupath.lib.objects.TMACoreObject)35 PathObject (qupath.lib.objects.PathObject)20 ArrayList (java.util.ArrayList)17 PathObjectHierarchy (qupath.lib.objects.hierarchy.PathObjectHierarchy)15 TMAGrid (qupath.lib.objects.hierarchy.TMAGrid)13 BufferedImage (java.awt.image.BufferedImage)12 PathAnnotationObject (qupath.lib.objects.PathAnnotationObject)12 ROI (qupath.lib.roi.interfaces.ROI)12 IOException (java.io.IOException)9 List (java.util.List)9 RegionRequest (qupath.lib.regions.RegionRequest)9 File (java.io.File)6 ImageServer (qupath.lib.images.servers.ImageServer)6 PathDetectionObject (qupath.lib.objects.PathDetectionObject)6 Collection (java.util.Collection)5 LinkedHashMap (java.util.LinkedHashMap)5 Collectors (java.util.stream.Collectors)5 HashSet (java.util.HashSet)4 Insets (javafx.geometry.Insets)4 Scene (javafx.scene.Scene)4