coralnet-toolbox 0.0.66__tar.gz → 0.0.67__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/PKG-INFO +2 -1
  2. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Annotations/QtMultiPolygonAnnotation.py +1 -1
  3. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Annotations/QtPatchAnnotation.py +1 -1
  4. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Annotations/QtPolygonAnnotation.py +1 -1
  5. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Annotations/QtRectangleAnnotation.py +1 -1
  6. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/AutoDistill/QtDeployModel.py +4 -0
  7. coralnet_toolbox-0.0.67/coralnet_toolbox/Explorer/QtAnnotationDataItem.py +97 -0
  8. coralnet_toolbox-0.0.67/coralnet_toolbox/Explorer/QtAnnotationImageWidget.py +183 -0
  9. coralnet_toolbox-0.0.67/coralnet_toolbox/Explorer/QtEmbeddingPointItem.py +30 -0
  10. coralnet_toolbox-0.0.67/coralnet_toolbox/Explorer/QtExplorer.py +2067 -0
  11. coralnet_toolbox-0.0.67/coralnet_toolbox/Explorer/QtSettingsWidgets.py +490 -0
  12. coralnet_toolbox-0.0.67/coralnet_toolbox/Explorer/__init__.py +7 -0
  13. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtImportViscoreAnnotations.py +2 -4
  14. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtOpenProject.py +2 -1
  15. coralnet_toolbox-0.0.67/coralnet_toolbox/Icons/magic.png +0 -0
  16. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/DeployModel/QtDetect.py +4 -0
  17. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/DeployModel/QtSegment.py +4 -0
  18. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TrainModel/QtClassify.py +1 -1
  19. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/QtConfidenceWindow.py +2 -23
  20. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/QtEventFilter.py +2 -2
  21. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/QtLabelWindow.py +23 -8
  22. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/QtMainWindow.py +81 -2
  23. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/QtProgressBar.py +12 -0
  24. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/SAM/QtDeployGenerator.py +4 -0
  25. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/__init__.py +1 -1
  26. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/utilities.py +24 -0
  27. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox.egg-info/PKG-INFO +2 -1
  28. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox.egg-info/SOURCES.txt +7 -0
  29. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox.egg-info/requires.txt +1 -0
  30. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/pyproject.toml +2 -2
  31. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/requirements.txt +1 -0
  32. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.editorconfig +0 -0
  33. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.gitallowed +0 -0
  34. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  35. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  36. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  37. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/ISSUE_TEMPLATE/general_question.md +0 -0
  38. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/workflows/docs-build.yml +0 -0
  39. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/workflows/docs.yml +0 -0
  40. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/workflows/installation.yml +0 -0
  41. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/workflows/macos.yml +0 -0
  42. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/workflows/pypi.yml +0 -0
  43. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/workflows/ubuntu.yml +0 -0
  44. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.github/workflows/windows.yml +0 -0
  45. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/.gitignore +0 -0
  46. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/LICENSE.txt +0 -0
  47. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/MANIFEST.in +0 -0
  48. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/README.md +0 -0
  49. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Annotations/QtAnnotation.py +0 -0
  50. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Annotations/__init__.py +0 -0
  51. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/AutoDistill/Models/GroundingDINO.py +0 -0
  52. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/AutoDistill/Models/OWLViT.py +0 -0
  53. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/AutoDistill/Models/OmDetTurbo.py +0 -0
  54. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/AutoDistill/Models/QtBase.py +0 -0
  55. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/AutoDistill/Models/__init__.py +0 -0
  56. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/AutoDistill/QtBatchInference.py +0 -0
  57. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/AutoDistill/__init__.py +0 -0
  58. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/BreakTime/QtBreakout.py +0 -0
  59. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/BreakTime/QtSnake.py +0 -0
  60. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/BreakTime/__init__.py +0 -0
  61. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Common/QtGraphicsUtility.py +0 -0
  62. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Common/QtMarginInput.py +0 -0
  63. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Common/QtOverlapInput.py +0 -0
  64. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Common/QtTileSizeInput.py +0 -0
  65. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Common/QtUpdateImagePaths.py +0 -0
  66. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/CoralNet/QtAuthenticate.py +0 -0
  67. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/CoralNet/QtDownload.py +0 -0
  68. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/CoralNet/__init__.py +0 -0
  69. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtExportAnnotations.py +0 -0
  70. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtExportCoralNetAnnotations.py +0 -0
  71. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtExportGeoJSONAnnotations.py +0 -0
  72. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtExportLabels.py +0 -0
  73. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtExportMaskAnnotations.py +0 -0
  74. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtExportTagLabAnnotations.py +0 -0
  75. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtExportTagLabLabels.py +0 -0
  76. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtExportViscoreAnnotations.py +0 -0
  77. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtImportAnnotations.py +0 -0
  78. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtImportCoralNetAnnotations.py +0 -0
  79. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtImportCoralNetLabels.py +0 -0
  80. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtImportFrames.py +0 -0
  81. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtImportImages.py +0 -0
  82. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtImportLabels.py +0 -0
  83. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtImportTagLabAnnotations.py +0 -0
  84. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtImportTagLabLabels.py +0 -0
  85. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/QtSaveProject.py +0 -0
  86. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/IO/__init__.py +0 -0
  87. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/1.png +0 -0
  88. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/2.png +0 -0
  89. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/3.png +0 -0
  90. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/4.png +0 -0
  91. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/5.png +0 -0
  92. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/__init__.py +0 -0
  93. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/add.png +0 -0
  94. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/all.png +0 -0
  95. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/apple.png +0 -0
  96. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/breakout.png +0 -0
  97. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/coral.png +0 -0
  98. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/edit.png +0 -0
  99. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/eye.png +0 -0
  100. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/hide.png +0 -0
  101. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/home.png +0 -0
  102. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/lock.png +0 -0
  103. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/machine.png +0 -0
  104. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/opaque.png +0 -0
  105. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/parameters.png +0 -0
  106. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/patch.png +0 -0
  107. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/polygon.png +0 -0
  108. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/rabbit.png +0 -0
  109. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/rectangle.png +0 -0
  110. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/remove.png +0 -0
  111. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/rocket.png +0 -0
  112. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/select.png +0 -0
  113. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/settings.png +0 -0
  114. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/snake.png +0 -0
  115. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/tile.png +0 -0
  116. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/transparent.png +0 -0
  117. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/turtle.png +0 -0
  118. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/unlock.png +0 -0
  119. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/user.png +0 -0
  120. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/wizard.png +0 -0
  121. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/workarea.png +0 -0
  122. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Icons/www.png +0 -0
  123. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/BatchInference/QtBase.py +0 -0
  124. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/BatchInference/QtClassify.py +0 -0
  125. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/BatchInference/QtDetect.py +0 -0
  126. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/BatchInference/QtSegment.py +0 -0
  127. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/BatchInference/__init__.py +0 -0
  128. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/__init__.py +0 -0
  129. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/classify/convnext_tiny.yaml +0 -0
  130. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/classify/efficientnet_b0.yaml +0 -0
  131. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/classify/mobilenet_v3_large.yaml +0 -0
  132. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/classify/swin_t.yaml +0 -0
  133. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/detect/convnext_tiny.yaml +0 -0
  134. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/detect/mobilenet_v3_large-fpn.yaml +0 -0
  135. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/detect/mobilenet_v3_small-fpn.yaml +0 -0
  136. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/detect/resnet101.yaml +0 -0
  137. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/detect/swin_t-fpn.yaml +0 -0
  138. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/detect/swin_t.yaml +0 -0
  139. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/detect/yolo11-p2.yaml +0 -0
  140. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/detect/yolo11-p6.yaml +0 -0
  141. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/segment/convnext_tiny.yaml +0 -0
  142. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/segment/swin_t-fpn.yaml +0 -0
  143. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/segment/swin_t.yaml +0 -0
  144. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/segment/yolo11-p2.yaml +0 -0
  145. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/Community/cfg/segment/yolo11-p6.yaml +0 -0
  146. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/ConfusionMatrix.py +0 -0
  147. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/DeployModel/QtBase.py +0 -0
  148. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/DeployModel/QtClassify.py +0 -0
  149. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/DeployModel/__init__.py +0 -0
  150. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/EvaluateModel/QtBase.py +0 -0
  151. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/EvaluateModel/QtClassify.py +0 -0
  152. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/EvaluateModel/QtDetect.py +0 -0
  153. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/EvaluateModel/QtSegment.py +0 -0
  154. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/EvaluateModel/__init__.py +0 -0
  155. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/ExportDataset/QtBase.py +0 -0
  156. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/ExportDataset/QtClassify.py +0 -0
  157. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/ExportDataset/QtDetect.py +0 -0
  158. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/ExportDataset/QtSegment.py +0 -0
  159. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/ExportDataset/__init__.py +0 -0
  160. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/ImportDataset/QtBase.py +0 -0
  161. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/ImportDataset/QtDetect.py +0 -0
  162. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/ImportDataset/QtSegment.py +0 -0
  163. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/ImportDataset/__init__.py +0 -0
  164. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/MergeDatasets/QtBase.py +0 -0
  165. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/MergeDatasets/QtClassify.py +0 -0
  166. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/MergeDatasets/__init__.py +0 -0
  167. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/OptimizeModel/QtBase.py +0 -0
  168. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/OptimizeModel/__init__.py +0 -0
  169. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TrainModel/QtBase.py +0 -0
  170. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TrainModel/QtDetect.py +0 -0
  171. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TrainModel/QtSegment.py +0 -0
  172. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TrainModel/__init__.py +0 -0
  173. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TuneModel/QtBase.py +0 -0
  174. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TuneModel/QtClassify.py +0 -0
  175. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TuneModel/QtDetect.py +0 -0
  176. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TuneModel/QtSegment.py +0 -0
  177. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TuneModel/__init__.py +0 -0
  178. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/TuneModel/tuner.py +0 -0
  179. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/QtBase.py +0 -0
  180. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/QtClassify.py +0 -0
  181. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/QtDetect.py +0 -0
  182. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/QtInference.py +0 -0
  183. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/QtSegment.py +0 -0
  184. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/QtVideoWidget.py +0 -0
  185. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/__init__.py +0 -0
  186. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/bbox3d_utils.py +0 -0
  187. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/depth_model.py +0 -0
  188. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/detection_model.py +0 -0
  189. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/load_camera_params.py +0 -0
  190. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/YOLO3D/run.py +0 -0
  191. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/__init__.py +0 -0
  192. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/VideoInference/analytics.py +0 -0
  193. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/WeightedDataset.py +0 -0
  194. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/MachineLearning/__init__.py +0 -0
  195. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/QtAnnotationWindow.py +0 -0
  196. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/QtImageWindow.py +0 -0
  197. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/QtPatchSampling.py +0 -0
  198. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/QtWorkArea.py +0 -0
  199. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Rasters/ImageFilter.py +0 -0
  200. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Rasters/QtRaster.py +0 -0
  201. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Rasters/RasterManager.py +0 -0
  202. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Rasters/RasterTableModel.py +0 -0
  203. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Rasters/__init__.py +0 -0
  204. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Results/CombineResults.py +0 -0
  205. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Results/ConvertResults.py +0 -0
  206. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Results/MapResults.py +0 -0
  207. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Results/Masks.py +0 -0
  208. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Results/ResultsProcessor.py +0 -0
  209. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Results/__init__.py +0 -0
  210. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/SAM/QtBatchInference.py +0 -0
  211. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/SAM/QtDeployPredictor.py +0 -0
  212. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/SAM/__init__.py +0 -0
  213. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/SeeAnything/QtBatchInference.py +0 -0
  214. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/SeeAnything/QtDeployPredictor.py +0 -0
  215. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/SeeAnything/QtTrainModel.py +0 -0
  216. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/SeeAnything/__init__.py +0 -0
  217. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tile/QtTileBatchInference.py +0 -0
  218. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tile/QtTileCreation.py +0 -0
  219. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tile/TileDataset/QtBase.py +0 -0
  220. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tile/TileDataset/QtClassify.py +0 -0
  221. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tile/TileDataset/QtDetect.py +0 -0
  222. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tile/TileDataset/QtSegment.py +0 -0
  223. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tile/TileDataset/__init__.py +0 -0
  224. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tile/__init__.py +0 -0
  225. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtCutSubTool.py +0 -0
  226. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtMoveSubTool.py +0 -0
  227. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtPanTool.py +0 -0
  228. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtPatchTool.py +0 -0
  229. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtPolygonTool.py +0 -0
  230. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtRectangleTool.py +0 -0
  231. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtResizeSubTool.py +0 -0
  232. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtSAMTool.py +0 -0
  233. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtSeeAnythingTool.py +0 -0
  234. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtSelectSubTool.py +0 -0
  235. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtSelectTool.py +0 -0
  236. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtSubTool.py +0 -0
  237. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtTool.py +0 -0
  238. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtWorkAreaTool.py +0 -0
  239. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/QtZoomTool.py +0 -0
  240. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/Tools/__init__.py +0 -0
  241. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox/main.py +0 -0
  242. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox.egg-info/dependency_links.txt +0 -0
  243. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox.egg-info/entry_points.txt +0 -0
  244. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/coralnet_toolbox.egg-info/top_level.txt +0 -0
  245. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/mkdocs.yml +0 -0
  246. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/requirements_dev.txt +0 -0
  247. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/setup.cfg +0 -0
  248. {coralnet_toolbox-0.0.66 → coralnet_toolbox-0.0.67}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coralnet-toolbox
3
- Version: 0.0.66
3
+ Version: 0.0.67
4
4
  Summary: Tools for annotating and developing ML models for benthic imagery
5
5
  Author-email: Jordan Pierce <jordan.pierce@noaa.gov>
6
6
  License: MIT License
@@ -21,6 +21,7 @@ Requires-Dist: lap>=0.5.12
21
21
  Requires-Dist: open-clip-torch>=2.20.0
22
22
  Requires-Dist: supervision>=0.24.0
23
23
  Requires-Dist: scikit-learn
24
+ Requires-Dist: umap-learn
24
25
  Requires-Dist: pycocotools
25
26
  Requires-Dist: ujson
26
27
  Requires-Dist: timm==0.9.2
@@ -152,7 +152,7 @@ class MultiPolygonAnnotation(Annotation):
152
152
  result_painter.drawPixmap(0, 0, self.cropped_image)
153
153
 
154
154
  # Draw dashed outline for each polygon
155
- pen = QPen(self.label.color)
155
+ pen = QPen(Qt.black)
156
156
  pen.setStyle(Qt.SolidLine) # Solid line
157
157
  pen.setWidth(1) # Line width
158
158
  result_painter.setPen(pen)
@@ -157,7 +157,7 @@ class PatchAnnotation(Annotation):
157
157
  result_painter.drawPixmap(0, 0, self.cropped_image)
158
158
 
159
159
  # Draw the dotted line outline on top
160
- pen = QPen(self.label.color)
160
+ pen = QPen(Qt.black)
161
161
  pen.setStyle(Qt.SolidLine) # Solid line
162
162
  pen.setWidth(1) # Line width
163
163
  result_painter.setPen(pen)
@@ -178,7 +178,7 @@ class PolygonAnnotation(Annotation):
178
178
  result_painter.drawPixmap(0, 0, self.cropped_image)
179
179
 
180
180
  # Draw the dotted line outline on top
181
- pen = QPen(self.label.color)
181
+ pen = QPen(Qt.black)
182
182
  pen.setStyle(Qt.SolidLine) # Solid line
183
183
  pen.setWidth(1) # Line width
184
184
  result_painter.setPen(pen)
@@ -153,7 +153,7 @@ class RectangleAnnotation(Annotation):
153
153
  result_painter.drawPixmap(0, 0, self.cropped_image)
154
154
 
155
155
  # Draw the dotted line outline on top
156
- pen = QPen(self.label.color)
156
+ pen = QPen(Qt.black)
157
157
  pen.setStyle(Qt.SolidLine) # Solid line
158
158
  pen.setWidth(1) # Line width
159
159
  result_painter.setPen(pen)
@@ -555,6 +555,10 @@ class DeployModelDialog(QDialog):
555
555
  self.update_sam_task_state()
556
556
  if self.task != 'segment':
557
557
  return results_list
558
+
559
+ if not self.sam_dialog or self.use_sam_dropdown.currentText() == "False":
560
+ # If SAM is not deployed or not selected, return the results as is
561
+ return results_list
558
562
 
559
563
  if self.sam_dialog.loaded_model is None:
560
564
  # If SAM is not loaded, ensure we do not use it accidentally
@@ -0,0 +1,97 @@
1
+ import warnings
2
+
3
+ import os
4
+
5
+ warnings.filterwarnings("ignore", category=DeprecationWarning)
6
+
7
+
8
+ # ----------------------------------------------------------------------------------------------------------------------
9
+ # Classes
10
+ # ----------------------------------------------------------------------------------------------------------------------
11
+
12
+
13
+ class AnnotationDataItem:
14
+ """Holds annotation information for consistent display across viewers."""
15
+
16
+ def __init__(self, annotation, embedding_x=None, embedding_y=None, embedding_id=None):
17
+ self.annotation = annotation
18
+ self.embedding_x = embedding_x if embedding_x is not None else 0.0
19
+ self.embedding_y = embedding_y if embedding_y is not None else 0.0
20
+ self.embedding_id = embedding_id if embedding_id is not None else 0
21
+ self._is_selected = False
22
+ self._preview_label = None
23
+ self._original_label = annotation.label
24
+ self._marked_for_deletion = False # Track deletion status
25
+
26
+ @property
27
+ def effective_label(self):
28
+ """Get the current effective label (preview if exists, otherwise original)."""
29
+ return self._preview_label if self._preview_label else self.annotation.label
30
+
31
+ @property
32
+ def effective_color(self):
33
+ """Get the effective color for this annotation."""
34
+ return self.effective_label.color
35
+
36
+ @property
37
+ def is_selected(self):
38
+ """Check if this annotation is selected."""
39
+ return self._is_selected
40
+
41
+ def set_selected(self, selected):
42
+ """Set the selection state."""
43
+ self._is_selected = selected
44
+
45
+ def set_preview_label(self, label):
46
+ """Set a preview label for this annotation."""
47
+ self._preview_label = label
48
+
49
+ def clear_preview_label(self):
50
+ """Clear the preview label and revert to original."""
51
+ self._preview_label = None
52
+
53
+ def has_preview_changes(self):
54
+ """Check if this annotation has preview changes."""
55
+ return self._preview_label is not None
56
+
57
+ def mark_for_deletion(self):
58
+ """Mark this annotation for deletion."""
59
+ self._marked_for_deletion = True
60
+
61
+ def unmark_for_deletion(self):
62
+ """Unmark this annotation for deletion."""
63
+ self._marked_for_deletion = False
64
+
65
+ def is_marked_for_deletion(self):
66
+ """Check if this annotation is marked for deletion."""
67
+ return self._marked_for_deletion
68
+
69
+ def apply_preview_permanently(self):
70
+ """Apply the preview label permanently to the annotation."""
71
+ if self._preview_label:
72
+ self.annotation.update_label(self._preview_label)
73
+ self.annotation.update_user_confidence(self._preview_label)
74
+ self._original_label = self._preview_label
75
+ self._preview_label = None
76
+ return True
77
+ return False
78
+
79
+ def get_display_info(self):
80
+ """Get display information for this annotation."""
81
+ return {
82
+ 'id': self.annotation.id,
83
+ 'label': self.effective_label.short_label_code,
84
+ 'confidence': self.get_effective_confidence(),
85
+ 'type': type(self.annotation).__name__,
86
+ 'image': os.path.basename(self.annotation.image_path),
87
+ 'embedding_id': self.embedding_id,
88
+ 'color': self.effective_color
89
+ }
90
+
91
+ def get_effective_confidence(self):
92
+ """Get the effective confidence value."""
93
+ if self.annotation.verified and hasattr(self.annotation, 'user_confidence') and self.annotation.user_confidence:
94
+ return list(self.annotation.user_confidence.values())[0]
95
+ elif hasattr(self.annotation, 'machine_confidence') and self.annotation.machine_confidence:
96
+ return list(self.annotation.machine_confidence.values())[0]
97
+ return 0.0
@@ -0,0 +1,183 @@
1
+ import warnings
2
+
3
+ from PyQt5.QtGui import QPen, QColor, QPainter
4
+ from PyQt5.QtCore import Qt, QTimer
5
+
6
+ from PyQt5.QtWidgets import (QVBoxLayout, QLabel, QWidget)
7
+
8
+
9
+ warnings.filterwarnings("ignore", category=DeprecationWarning)
10
+
11
+
12
+ # ----------------------------------------------------------------------------------------------------------------------
13
+ # Constants
14
+ # ----------------------------------------------------------------------------------------------------------------------
15
+
16
+ ANNOTATION_WIDTH = 5
17
+
18
+ # ----------------------------------------------------------------------------------------------------------------------
19
+ # Classes
20
+ # ----------------------------------------------------------------------------------------------------------------------
21
+
22
+
23
+ class AnnotationImageWidget(QWidget):
24
+ """Widget to display a single annotation image crop with selection support."""
25
+
26
+ def __init__(self, data_item, widget_height=96, annotation_viewer=None, parent=None):
27
+ super(AnnotationImageWidget, self).__init__(parent)
28
+ self.data_item = data_item
29
+ self.annotation = data_item.annotation
30
+ self.annotation_viewer = annotation_viewer
31
+
32
+ self.widget_height = widget_height
33
+ self.aspect_ratio = 1.0 # Default to a square aspect ratio
34
+ self.pixmap = None # Cache the original, unscaled pixmap
35
+
36
+ self.animation_offset = 0
37
+ self.animation_timer = QTimer(self)
38
+ self.animation_timer.timeout.connect(self._update_animation_frame)
39
+ self.animation_timer.setInterval(75)
40
+
41
+ self.setup_ui()
42
+ self.load_and_set_image() # Changed from load_annotation_image
43
+
44
+ def setup_ui(self):
45
+ """Set up the basic UI with a label for the image."""
46
+ layout = QVBoxLayout(self)
47
+ layout.setContentsMargins(4, 4, 4, 4)
48
+
49
+ self.image_label = QLabel()
50
+ self.image_label.setAlignment(Qt.AlignCenter)
51
+ self.image_label.setScaledContents(True)
52
+ self.image_label.setStyleSheet("border: none;")
53
+
54
+ layout.addWidget(self.image_label)
55
+
56
+ def load_and_set_image(self):
57
+ """Load image, calculate its aspect ratio, and set the widget's initial size."""
58
+ try:
59
+ # Use get_cropped_image_graphic() to get the QPixmap
60
+ cropped_pixmap = self.annotation.get_cropped_image_graphic()
61
+ if cropped_pixmap and not cropped_pixmap.isNull():
62
+ self.pixmap = cropped_pixmap
63
+ # Safely calculate aspect ratio
64
+ if self.pixmap.height() > 0:
65
+ self.aspect_ratio = self.pixmap.width() / self.pixmap.height()
66
+ else:
67
+ self.aspect_ratio = 1.0
68
+ else:
69
+ self.image_label.setText("No Image\nAvailable")
70
+ self.pixmap = None
71
+ self.aspect_ratio = 1.0
72
+ except Exception as e:
73
+ print(f"Error loading annotation image: {e}")
74
+ self.image_label.setText("Error\nLoading Image")
75
+ self.pixmap = None
76
+ self.aspect_ratio = 1.0
77
+
78
+ # Trigger an initial size update
79
+ self.update_height(self.widget_height)
80
+
81
+ def update_height(self, new_height):
82
+ """Updates the widget's height and rescales its width and content accordingly."""
83
+ self.widget_height = new_height
84
+
85
+ # Calculate the new width based on the stored aspect ratio
86
+ new_width = int(self.widget_height * self.aspect_ratio)
87
+
88
+ # Set the new fixed size for the entire widget
89
+ self.setFixedSize(new_width, new_height)
90
+
91
+ if self.pixmap:
92
+ # Scale the cached pixmap to fit the new widget size, leaving room for the border
93
+ # Note: We use the widget's new dimensions directly
94
+ scaled_pixmap = self.pixmap.scaled(
95
+ new_width - 8, # Account for horizontal margins
96
+ new_height - 8, # Account for vertical margins
97
+ Qt.KeepAspectRatio,
98
+ Qt.SmoothTransformation
99
+ )
100
+ self.image_label.setPixmap(scaled_pixmap)
101
+
102
+ self.update() # Schedule a repaint if needed
103
+
104
+ # Replace update_size with update_height
105
+ def update_size(self, new_size):
106
+ """Kept for compatibility, redirects to update_height."""
107
+ self.update_height(new_size)
108
+
109
+ def set_selected(self, selected):
110
+ """Set the selection state and update visual appearance."""
111
+ was_selected = self.is_selected()
112
+
113
+ # Update the shared data item
114
+ self.data_item.set_selected(selected)
115
+
116
+ # Start or stop the animation timer based on the new selection state
117
+ if selected:
118
+ if not self.animation_timer.isActive():
119
+ self.animation_timer.start()
120
+ else:
121
+ if self.animation_timer.isActive():
122
+ self.animation_timer.stop()
123
+ # Reset offset when deselected to ensure a consistent starting look
124
+ self.animation_offset = 0
125
+
126
+ # A repaint is needed if the selection state changed OR if the item remains
127
+ # selected (to keep the animation running).
128
+ if was_selected != selected or selected:
129
+ self.update()
130
+
131
+ def is_selected(self):
132
+ """Return whether this widget is selected via the data item."""
133
+ return self.data_item.is_selected
134
+
135
+ def _update_animation_frame(self):
136
+ """Update the animation offset and schedule a repaint."""
137
+ self.animation_offset = (self.animation_offset + 1) % 20
138
+ self.update()
139
+
140
+ def paintEvent(self, event):
141
+ """Handle custom drawing for the widget, including the border."""
142
+ super().paintEvent(event)
143
+ painter = QPainter(self)
144
+ painter.setRenderHint(QPainter.Antialiasing)
145
+
146
+ # Get the label that is currently active (which could be a preview)
147
+ effective_label = self.data_item.effective_label
148
+
149
+ # Check if the active label is the special "Review" label (id == "-1")
150
+ if effective_label and effective_label.id == "-1":
151
+ # If it is, ALWAYS use a black pen for visibility against the white background.
152
+ pen_color = QColor("black")
153
+ else:
154
+ # Otherwise, use the effective color from the data item.
155
+ pen_color = self.data_item.effective_color
156
+
157
+ if self.is_selected():
158
+ pen = QPen(pen_color, ANNOTATION_WIDTH)
159
+ pen.setStyle(Qt.CustomDashLine)
160
+ pen.setDashPattern([2, 3])
161
+ pen.setDashOffset(self.animation_offset)
162
+ else:
163
+ pen = QPen(pen_color, ANNOTATION_WIDTH)
164
+ pen.setStyle(Qt.SolidLine)
165
+
166
+ painter.setPen(pen)
167
+ painter.setBrush(Qt.NoBrush)
168
+
169
+ width = pen.width()
170
+ half_width = (width - 1) // 2
171
+ rect = self.rect().adjusted(half_width, half_width, -half_width, -half_width)
172
+ painter.drawRect(rect)
173
+
174
+ def mousePressEvent(self, event):
175
+ """Handle mouse press events for selection."""
176
+ if event.button() == Qt.LeftButton:
177
+ if self.annotation_viewer and hasattr(self.annotation_viewer, 'handle_annotation_selection'):
178
+ self.annotation_viewer.handle_annotation_selection(self, event)
179
+ # Ignore right mouse button clicks - don't call super() to prevent any selection
180
+ elif event.button() == Qt.RightButton:
181
+ event.ignore()
182
+ return
183
+ super().mousePressEvent(event)
@@ -0,0 +1,30 @@
1
+ import warnings
2
+
3
+ from PyQt5.QtWidgets import QGraphicsEllipseItem, QStyle
4
+
5
+ warnings.filterwarnings("ignore", category=DeprecationWarning)
6
+
7
+
8
+ # ----------------------------------------------------------------------------------------------------------------------
9
+ # Classes
10
+ # ----------------------------------------------------------------------------------------------------------------------
11
+
12
+
13
+ class EmbeddingPointItem(QGraphicsEllipseItem):
14
+ """
15
+ A custom QGraphicsEllipseItem that prevents the default selection
16
+ rectangle from being drawn, and dynamically gets its color from the
17
+ shared AnnotationDataItem.
18
+ """
19
+
20
+ def paint(self, painter, option, widget):
21
+ # Get the shared data item, which holds the current state
22
+ data_item = self.data(0)
23
+ if data_item:
24
+ # Set the brush color based on the item's effective color
25
+ # This ensures preview colors are reflected instantly.
26
+ self.setBrush(data_item.effective_color)
27
+
28
+ # Remove the 'State_Selected' flag to prevent the default box
29
+ option.state &= ~QStyle.State_Selected
30
+ super(EmbeddingPointItem, self).paint(painter, option, widget)