From c57c985ff65ab8b4b52d2731ecce976e8f19bd3b Mon Sep 17 00:00:00 2001 From: Drew Short Date: Fri, 29 Aug 2014 21:46:30 -0500 Subject: [PATCH] Working example xontext menus\! --- .../imagetools/ui/component/ImageTile.scala | 20 ++++- .../ui/component/ImageTilePane.scala | 75 ++++++++++++++++++- 2 files changed, 89 insertions(+), 6 deletions(-) diff --git a/gui/src/main/scala/com/sothr/imagetools/ui/component/ImageTile.scala b/gui/src/main/scala/com/sothr/imagetools/ui/component/ImageTile.scala index 55d3c0a..f64061d 100644 --- a/gui/src/main/scala/com/sothr/imagetools/ui/component/ImageTile.scala +++ b/gui/src/main/scala/com/sothr/imagetools/ui/component/ImageTile.scala @@ -1,11 +1,11 @@ package com.sothr.imagetools.ui.component import java.io.FileInputStream -import javafx.event.EventHandler +import javafx.event.{EventType, EventHandler} import javafx.geometry.{Orientation, Insets, Pos} import javafx.scene.control.{Separator, Tooltip, Label} import javafx.scene.image.{ImageView} -import javafx.scene.input.MouseEvent +import javafx.scene.input.{PickResult, ContextMenuEvent, MouseEvent} import javafx.scene.layout.VBox import grizzled.slf4j.Logging @@ -51,6 +51,16 @@ class ImageTile(thumbnailWidth: Integer, } } else if (event.isSecondaryButtonDown) { //right click context menu + debug("Requesting Context Menu") + val contextMenuEvent = new ContextMenuEvent( + thisTile, + thisTile, + ContextMenuEvent.CONTEXT_MENU_REQUESTED, + event.getX, event.getY, + event.getScreenX, event.getScreenY, + false, + new PickResult(thisTile, event.getSceneX, event.getSceneY)) + imageTilePane.handleContextMenu(contextMenuEvent) } } } @@ -94,6 +104,12 @@ class ImageTile(thumbnailWidth: Integer, imageLabel.setTooltip(tooltip) this.getChildren.add(imageLabel) + //this.setOnContextMenuRequested(new EventHandler[ContextMenuEvent] { + // override def handle(event: ContextMenuEvent): Unit = { + // imageTilePane.handleContextMenu(event) + // } + //}) + def getImageData: com.sothr.imagetools.engine.image.Image = { imageData } diff --git a/gui/src/main/scala/com/sothr/imagetools/ui/component/ImageTilePane.scala b/gui/src/main/scala/com/sothr/imagetools/ui/component/ImageTilePane.scala index 465b27b..b4e01ae 100644 --- a/gui/src/main/scala/com/sothr/imagetools/ui/component/ImageTilePane.scala +++ b/gui/src/main/scala/com/sothr/imagetools/ui/component/ImageTilePane.scala @@ -2,18 +2,85 @@ package com.sothr.imagetools.ui.component import java.util import javafx.collections.{ModifiableObservableListBase, ObservableList} -import javafx.scene.control.MultipleSelectionModel +import javafx.event.{ActionEvent, EventHandler} +import javafx.geometry.Side +import javafx.scene.control.{MenuItem, ContextMenu, MultipleSelectionModel} +import javafx.scene.input.ContextMenuEvent import javafx.scene.layout._ -import javafx.scene.paint.{Color, Paint} +import javafx.scene.paint.Color +import javafx.scene.Node + +import grizzled.slf4j.Logging /** * Custom Tile Pane with a multi selection model * * Created by drew on 8/29/14. */ -class ImageTilePane extends TilePane { +class ImageTilePane extends TilePane with Logging { val selectionModel = new ImageTilePaneSelectionModel(this) + //this.setOnContextMenuRequested(new EventHandler[ContextMenuEvent] { + // override def handle(event: ContextMenuEvent): Unit = { + // handleContextMenu(event) + // } + //}) + + def handleContextMenu(event: ContextMenuEvent) = { + //Build and show a context menu + debug("Context Menu Request Received") + val numSelected = this.selectionModel.getSelectedIndices.size() + if (numSelected > 0) { + if (numSelected == 1) { + val contextMenu = getSingleSelectionContextMenu + debug("Showing context menu") + contextMenu.show(event.getTarget.asInstanceOf[Node],Side.RIGHT,0d,0d) + } else { + val contextMenu = getMulipleSelectionContextMenu + debug("Showing context menu") + contextMenu.show(event.getTarget.asInstanceOf[Node],Side.RIGHT,0d,0d) + } + } + } + + def getSingleSelectionContextMenu : ContextMenu = { + debug("Building single-selection context menu") + val contextMenu = new ContextMenu() + val item1 = new MenuItem("Single Selection") + item1.setOnAction(new EventHandler[ActionEvent]() { + def handle(e: ActionEvent) = { + debug("Single Selection") + } + }) + val item2 = new MenuItem("BlahBlah") + item2.setOnAction(new EventHandler[ActionEvent]() { + def handle(e: ActionEvent) = { + debug("BlahBlah") + } + }) + contextMenu.getItems.addAll(item1, item2) + contextMenu + } + + def getMulipleSelectionContextMenu : ContextMenu = { + debug("Building multi-selection context menu") + val contextMenu = new ContextMenu() + val item1 = new MenuItem("Multi Selection") + item1.setOnAction(new EventHandler[ActionEvent]() { + def handle(e: ActionEvent) = { + debug("Multi Selection") + } + }) + val item2 = new MenuItem("BlahBlah") + item2.setOnAction(new EventHandler[ActionEvent]() { + def handle(e: ActionEvent) = { + debug("BlahBlah") + } + }) + contextMenu.getItems.addAll(item1, item2) + contextMenu + } + def imageSelected(imageTile: ImageTile) = { this.selectionModel.clearAndSelect(this.getChildren.indexOf(imageTile)) } @@ -132,7 +199,7 @@ class ImageTilePaneSelectionModel[ImageTile](parentTilePane: ImageTilePane) exte this.selectedIndexes.contains(index) } - private def clearSelectionFormatting = { + private def clearSelectionFormatting() = { val iterator = this.parentTilePane.getChildren.iterator() while (iterator.hasNext) { //remove the selection styling