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.

116 lines
3.7 KiB

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