You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
3.9 KiB

  1. package com.sothr.imagetools.ui.component
  2. import java.io.{File, FileInputStream}
  3. import javafx.event.EventHandler
  4. import javafx.geometry.{Orientation, Pos}
  5. import javafx.scene.control.{Label, Separator, Tooltip}
  6. import javafx.scene.image.ImageView
  7. import javafx.scene.input.{ContextMenuEvent, MouseEvent, PickResult}
  8. import javafx.scene.layout.VBox
  9. import com.sothr.imagetools.ui.util.FileUtil
  10. import grizzled.slf4j.Logging
  11. import resource._
  12. /**
  13. * ImageTile class that is a special VBox
  14. *
  15. * Created by drew on 8/22/14.
  16. */
  17. class ImageTile(thumbnailWidth: Integer,
  18. image: com.sothr.imagetools.engine.image.Image,
  19. imageTilePane: ImageTilePane) extends VBox with Logging {
  20. val thisTile = this
  21. val imageData = image
  22. val preferedTileWidth = (thumbnailWidth + 8).toDouble
  23. val preferedTileHeight = (thumbnailWidth + 32).toDouble
  24. //set tile size
  25. this.setPrefSize(preferedTileWidth, preferedTileHeight)
  26. this.setMinSize(preferedTileWidth, preferedTileHeight)
  27. this.setMaxSize(preferedTileWidth, preferedTileHeight)
  28. //set padding on the tiles
  29. //this.setPadding(new Insets(10.0d,0.0d,10.0d,0.0d))
  30. this.setAlignment(Pos.CENTER)
  31. this.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler[MouseEvent] {
  32. override def handle(event: MouseEvent): Unit = {
  33. if (event.isShiftDown) {
  34. //multiple selection
  35. imageTilePane.addImageSelected(thisTile)
  36. //remove individual images with control
  37. } else if (event.isControlDown) {
  38. imageTilePane.removeImageSelected(thisTile)
  39. }
  40. else {
  41. if (event.isPrimaryButtonDown) {
  42. imageTilePane.imageSelected(thisTile)
  43. //double click
  44. if (event.getClickCount == 2) {
  45. // Look into http://stackoverflow.com/questions/228477/how-do-i-programmatically-determine-operating-system-in-java
  46. // for proper multi-platform opening support
  47. FileUtil.openInEditor(new File(image.getImagePath))
  48. } else {
  49. }
  50. } else if (event.isSecondaryButtonDown) {
  51. //right click context menu
  52. debug("Requesting Context Menu")
  53. imageTilePane.addImageSelected(thisTile)
  54. val contextMenuEvent = new ContextMenuEvent(
  55. thisTile,
  56. thisTile,
  57. ContextMenuEvent.CONTEXT_MENU_REQUESTED,
  58. event.getX, event.getY,
  59. event.getScreenX, event.getScreenY,
  60. false,
  61. new PickResult(thisTile, event.getSceneX, event.getSceneY))
  62. imageTilePane.handleContextMenu(contextMenuEvent)
  63. }
  64. }
  65. }
  66. })
  67. //Separator
  68. val separator = new Separator()
  69. separator.setOrientation(Orientation.HORIZONTAL)
  70. separator.setMaxHeight(5.0d)
  71. separator.setVisible(false)
  72. this.getChildren.add(separator)
  73. // Image
  74. val genImageView = new ImageView()
  75. debug(s"Getting thumbnail from: ${image.getThumbnailPath}")
  76. managed(new FileInputStream(image.getThumbnailPath)) acquireAndGet {
  77. thumbSource =>
  78. val thumbnail = new javafx.scene.image.Image(thumbSource)
  79. genImageView.setImage(thumbnail)
  80. if (thumbnail.getHeight > thumbnail.getWidth) {
  81. genImageView.setFitHeight(128.0)
  82. } else {
  83. genImageView.setFitWidth(128.0)
  84. }
  85. }
  86. genImageView.setPreserveRatio(true)
  87. this.getChildren.add(genImageView)
  88. //Label
  89. val imageLabel = new Label()
  90. imageLabel.setText(s"${image.getHeight}x${image.getWidth}")
  91. imageLabel.setWrapText(true)
  92. imageLabel.setMaxHeight(32d)
  93. imageLabel.setMaxWidth(preferedTileWidth-2)
  94. imageLabel.setAlignment(Pos.BOTTOM_CENTER)
  95. //Tooltip
  96. val tooltip = new Tooltip()
  97. tooltip.setText(s"${image.getName}")
  98. imageLabel.setTooltip(tooltip)
  99. this.getChildren.add(imageLabel)
  100. //this.setOnContextMenuRequested(new EventHandler[ContextMenuEvent] {
  101. // override def handle(event: ContextMenuEvent): Unit = {
  102. // imageTilePane.handleContextMenu(event)
  103. // }
  104. //})
  105. def getImageData: com.sothr.imagetools.engine.image.Image = {
  106. imageData
  107. }
  108. }