@searpent/react-image-annotate 2.0.4 → 2.0.7

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 (195) hide show
  1. package/Annotator/examplePhotos.js +6976 -0
  2. package/Annotator/index.js +262 -0
  3. package/Annotator/reducers/combine-reducers.js +14 -0
  4. package/Annotator/reducers/convert-expanding-line-to-polygon.js +73 -0
  5. package/{src/Annotator → Annotator}/reducers/fix-twisted.js +3 -5
  6. package/Annotator/reducers/general-reducer.js +1152 -0
  7. package/Annotator/reducers/get-active-image.js +27 -0
  8. package/Annotator/reducers/get-implied-video-regions.js +180 -0
  9. package/Annotator/reducers/history-handler.js +38 -0
  10. package/Annotator/reducers/image-reducer.js +20 -0
  11. package/Annotator/reducers/video-reducer.js +88 -0
  12. package/ClassSelectionMenu/index.js +135 -0
  13. package/Crosshairs/index.js +53 -0
  14. package/DebugSidebarBox/index.js +20 -0
  15. package/DemoSite/Editor.js +194 -0
  16. package/DemoSite/ErrorBoundaryDialog.js +64 -0
  17. package/DemoSite/index.js +40 -0
  18. package/{src/Editor → Editor}/annotation-plugin/annotation.css +0 -0
  19. package/Editor/annotation-plugin/annotation.js +613 -0
  20. package/Editor/index.js +57 -0
  21. package/{src/Editor → Editor}/tools.js +2 -3
  22. package/FullImageSegmentationAnnotator/index.js +7 -0
  23. package/GroupSelectorSidebarBox/index.js +63 -0
  24. package/HighlightBox/index.js +99 -0
  25. package/HistorySidebarBox/index.js +71 -0
  26. package/ImageCanvas/index.js +429 -0
  27. package/ImageCanvas/region-tools.js +165 -0
  28. package/{src/ImageCanvas → ImageCanvas}/styles.js +12 -8
  29. package/ImageCanvas/use-mouse.js +180 -0
  30. package/ImageCanvas/use-project-box.js +27 -0
  31. package/ImageCanvas/use-wasd-mode.js +62 -0
  32. package/ImageMask/index.js +133 -0
  33. package/ImageMask/load-image.js +25 -0
  34. package/ImageSelectorSidebarBox/index.js +60 -0
  35. package/KeyframeTimeline/get-time-string.js +27 -0
  36. package/KeyframeTimeline/index.js +233 -0
  37. package/KeyframesSelectorSidebarBox/index.js +93 -0
  38. package/LandingPage/index.js +159 -0
  39. package/MainLayout/icon-dictionary.js +104 -0
  40. package/MainLayout/index.js +469 -0
  41. package/{src/MainLayout → MainLayout}/styles.js +6 -7
  42. package/MainLayout/types.js +0 -0
  43. package/MainLayout/use-implied-video-regions.js +13 -0
  44. package/MetadataEditorSidebarBox/index.js +126 -0
  45. package/PageSelector/index.js +67 -0
  46. package/{src/PageSelector → PageSelector}/page-selector.css +0 -0
  47. package/PointDistances/index.js +73 -0
  48. package/PreventScrollToParents/index.js +51 -0
  49. package/RegionLabel/index.js +205 -0
  50. package/{src/RegionLabel → RegionLabel}/styles.js +12 -15
  51. package/RegionSelectAndTransformBoxes/index.js +167 -0
  52. package/RegionSelectorSidebarBox/index.js +248 -0
  53. package/{src/RegionSelectorSidebarBox → RegionSelectorSidebarBox}/styles.js +13 -14
  54. package/RegionShapes/index.js +294 -0
  55. package/RegionTags/index.js +142 -0
  56. package/SettingsDialog/index.js +52 -0
  57. package/SettingsProvider/index.js +58 -0
  58. package/Shortcuts/ShortcutField.js +46 -0
  59. package/Shortcuts/index.js +133 -0
  60. package/ShortcutsManager/index.js +155 -0
  61. package/Sidebar/index.js +69 -0
  62. package/SidebarBoxContainer/index.js +93 -0
  63. package/SmallToolButton/index.js +42 -0
  64. package/TagsSidebarBox/index.js +105 -0
  65. package/TaskDescriptionSidebarBox/index.js +58 -0
  66. package/Theme/index.js +30 -0
  67. package/VideoOrImageCanvasBackground/index.js +151 -0
  68. package/colors.js +14 -0
  69. package/hooks/use-colors.js +101 -0
  70. package/hooks/use-event-callback.js +10 -0
  71. package/hooks/use-exclude-pattern.js +24 -0
  72. package/hooks/use-load-image.js +26 -0
  73. package/hooks/use-window-size.js +46 -0
  74. package/{src/hooks → hooks}/xpattern.js +1 -1
  75. package/index.js +3 -0
  76. package/lib.js +3 -0
  77. package/package.json +1 -1
  78. package/stories.js +5 -0
  79. package/{src/utils → utils}/filter-only-unique.js +1 -1
  80. package/utils/get-from-local-storage.js +7 -0
  81. package/utils/get-hotkey-help-text.js +9 -0
  82. package/utils/get-landmarks-with-transform.js +40 -0
  83. package/utils/photosToImages.js +53 -0
  84. package/utils/regions-to-blocks.js +16 -0
  85. package/utils/set-in-local-storage.js +3 -0
  86. package/.babelrc +0 -6
  87. package/.env +0 -1
  88. package/.flowconfig +0 -2
  89. package/.github/workflows/release-on-master.yml +0 -32
  90. package/.github/workflows/test.yml +0 -16
  91. package/.prettierrc +0 -3
  92. package/.releaserc.js +0 -18
  93. package/.storybook/addons.js +0 -2
  94. package/.storybook/config.js +0 -16
  95. package/LICENSE +0 -21
  96. package/public/favicon.ico +0 -0
  97. package/public/index.html +0 -38
  98. package/src/Annotator/bike-pic.png +0 -0
  99. package/src/Annotator/bike-pic2.png +0 -0
  100. package/src/Annotator/dab-keyframes.story.json +0 -1
  101. package/src/Annotator/examplePhotos.js +0 -7601
  102. package/src/Annotator/index.js +0 -291
  103. package/src/Annotator/index.story.js +0 -807
  104. package/src/Annotator/poses.story.js +0 -150
  105. package/src/Annotator/reducers/combine-reducers.js +0 -7
  106. package/src/Annotator/reducers/convert-expanding-line-to-polygon.js +0 -53
  107. package/src/Annotator/reducers/general-reducer.js +0 -996
  108. package/src/Annotator/reducers/get-active-image.js +0 -21
  109. package/src/Annotator/reducers/get-implied-video-regions.js +0 -115
  110. package/src/Annotator/reducers/history-handler.js +0 -60
  111. package/src/Annotator/reducers/image-reducer.js +0 -23
  112. package/src/Annotator/reducers/video-reducer.js +0 -85
  113. package/src/Annotator/video.story.js +0 -51
  114. package/src/ClassSelectionMenu/index.js +0 -108
  115. package/src/Crosshairs/index.js +0 -64
  116. package/src/DebugSidebarBox/index.js +0 -36
  117. package/src/DemoSite/Editor.js +0 -235
  118. package/src/DemoSite/ErrorBoundaryDialog.js +0 -34
  119. package/src/DemoSite/index.js +0 -41
  120. package/src/DemoSite/index.story.js +0 -10
  121. package/src/DemoSite/simple-segmentation-example.json +0 -572
  122. package/src/Editor/annotation-plugin/annotation.js +0 -515
  123. package/src/Editor/index.js +0 -24
  124. package/src/FullImageSegmentationAnnotator/hard1.story.jpg +0 -0
  125. package/src/FullImageSegmentationAnnotator/hard2.story.jpg +0 -0
  126. package/src/FullImageSegmentationAnnotator/hard3.story.jpg +0 -0
  127. package/src/FullImageSegmentationAnnotator/index.js +0 -7
  128. package/src/FullImageSegmentationAnnotator/index.story.js +0 -177
  129. package/src/FullImageSegmentationAnnotator/orange.story.png +0 -0
  130. package/src/GroupSelectorSidebarBox/index.js +0 -48
  131. package/src/HighlightBox/index.js +0 -143
  132. package/src/HistorySidebarBox/index.js +0 -78
  133. package/src/ImageCanvas/dancing-man.story.jpg +0 -0
  134. package/src/ImageCanvas/index.js +0 -494
  135. package/src/ImageCanvas/index.story.js +0 -314
  136. package/src/ImageCanvas/mouse_mask.story.png +0 -0
  137. package/src/ImageCanvas/region-tools.js +0 -171
  138. package/src/ImageCanvas/seves_desk.story.jpg +0 -0
  139. package/src/ImageCanvas/use-mouse.js +0 -168
  140. package/src/ImageCanvas/use-project-box.js +0 -23
  141. package/src/ImageCanvas/use-wasd-mode.js +0 -50
  142. package/src/ImageMask/index.js +0 -127
  143. package/src/ImageMask/load-image.js +0 -32
  144. package/src/ImageSelectorSidebarBox/index.js +0 -54
  145. package/src/KeyframeTimeline/get-time-string.js +0 -25
  146. package/src/KeyframeTimeline/index.js +0 -223
  147. package/src/KeyframesSelectorSidebarBox/index.js +0 -93
  148. package/src/LandingPage/content.md +0 -57
  149. package/src/LandingPage/github-markdown.css +0 -964
  150. package/src/LandingPage/index.js +0 -147
  151. package/src/MainLayout/icon-dictionary.js +0 -79
  152. package/src/MainLayout/index.js +0 -510
  153. package/src/MainLayout/index.story.js +0 -240
  154. package/src/MainLayout/types.js +0 -164
  155. package/src/MainLayout/use-implied-video-regions.js +0 -17
  156. package/src/MetadataEditorSidebarBox/index.js +0 -98
  157. package/src/PageSelector/index.js +0 -76
  158. package/src/PointDistances/index.js +0 -90
  159. package/src/PreventScrollToParents/index.js +0 -48
  160. package/src/PreventScrollToParents/index.story.js +0 -23
  161. package/src/RegionLabel/index.js +0 -222
  162. package/src/RegionSelectAndTransformBoxes/index.js +0 -234
  163. package/src/RegionSelectorSidebarBox/index.js +0 -216
  164. package/src/RegionShapes/index.js +0 -254
  165. package/src/RegionTags/index.js +0 -134
  166. package/src/SettingsDialog/index.js +0 -58
  167. package/src/SettingsProvider/index.js +0 -48
  168. package/src/Shortcuts/ShortcutField.js +0 -44
  169. package/src/Shortcuts/index.js +0 -129
  170. package/src/ShortcutsManager/index.js +0 -162
  171. package/src/Sidebar/index.js +0 -117
  172. package/src/SidebarBoxContainer/index.js +0 -93
  173. package/src/SmallToolButton/index.js +0 -57
  174. package/src/TagsSidebarBox/index.js +0 -93
  175. package/src/TaskDescriptionSidebarBox/index.js +0 -43
  176. package/src/Theme/index.js +0 -36
  177. package/src/VideoOrImageCanvasBackground/index.js +0 -170
  178. package/src/colors.js +0 -32
  179. package/src/hooks/use-colors.js +0 -74
  180. package/src/hooks/use-event-callback.js +0 -11
  181. package/src/hooks/use-exclude-pattern.js +0 -27
  182. package/src/hooks/use-load-image.js +0 -21
  183. package/src/hooks/use-window-size.js +0 -46
  184. package/src/hooks/xpattern.png +0 -0
  185. package/src/index.js +0 -18
  186. package/src/lib.js +0 -7
  187. package/src/screenshot.png +0 -0
  188. package/src/site.css +0 -5
  189. package/src/stories.js +0 -2
  190. package/src/utils/get-from-local-storage.js +0 -7
  191. package/src/utils/get-hotkey-help-text.js +0 -11
  192. package/src/utils/get-landmarks-with-transform.js +0 -23
  193. package/src/utils/photosToImages.js +0 -40
  194. package/src/utils/regions-to-blocks.js +0 -14
  195. package/src/utils/set-in-local-storage.js +0 -6
@@ -1,240 +0,0 @@
1
- // @flow
2
-
3
- import React from "react"
4
-
5
- import { storiesOf } from "@storybook/react"
6
- import { action } from "@storybook/addon-actions"
7
- import { testRegions } from "../ImageCanvas/index.story"
8
-
9
- import exampleImage from "../ImageCanvas/seves_desk.story.jpg"
10
- import moment from "moment"
11
-
12
- import MainLayout from "./"
13
-
14
- storiesOf("MainLayout", module)
15
- .add("Basic", () => (
16
- <MainLayout
17
- state={{
18
- showTags: true,
19
- selectedImage: exampleImage,
20
- selectedTool: "select",
21
- taskDescription: "## Example Task Description\n\nPlease work hard.",
22
- labelImages: true,
23
- imageClsList: ["alpha image", "beta image", "charlie image"],
24
- imageTagList: ["tag1", "tag2", "tag3"],
25
- regionClsList: ["alpha region", "beta region", "charlie region"],
26
- regionTagList: ["tag1", "tag2", "tag3"],
27
- images: [
28
- {
29
- src: exampleImage,
30
- name: "Seve's Desk",
31
- regions: testRegions,
32
- },
33
- {
34
- src: "https://loremflickr.com/100/100/cars?lock=1",
35
- name: "Frame 0036",
36
- },
37
- {
38
- src: "https://loremflickr.com/100/100/cars?lock=2",
39
- name: "Frame 0037",
40
- },
41
- {
42
- src: "https://loremflickr.com/100/100/cars?lock=3",
43
- name: "Frame 0038",
44
- },
45
- ],
46
- mode: null,
47
- enabledTools: ["create-point", "create-polygon", "modify-allowed-area"],
48
- history: [{ name: "Reset Stuff", state: null, time: moment() }],
49
- }}
50
- dispatch={(a) => action(a.type)(a)}
51
- />
52
- ))
53
- .add("Completing a Polygon", () => (
54
- <MainLayout
55
- state={{
56
- showTags: false,
57
- selectedImage: exampleImage,
58
- selectedTool: "create-polygon",
59
- taskDescription: "",
60
- mode: {
61
- mode: "DRAW_POLYGON",
62
- regionId: "p1",
63
- },
64
- images: [
65
- {
66
- src: exampleImage,
67
- name: "Seve's Desk",
68
- regions: [
69
- {
70
- type: "polygon",
71
- points: [
72
- [0.25, 0.25],
73
- [0.25, 0.5],
74
- [0.5, 0.5],
75
- ],
76
- highlighted: true,
77
- open: true,
78
- color: "#00f",
79
- id: "p1",
80
- },
81
- ],
82
- },
83
- ],
84
- enabledTools: [],
85
- history: [],
86
- }}
87
- dispatch={(a) => action(a.type)(a)}
88
- />
89
- ))
90
- .add("Region Overlap Clicking", () => (
91
- <MainLayout
92
- state={{
93
- showTags: false,
94
- selectedImage: exampleImage,
95
- selectedTool: "create-box",
96
- taskDescription: "",
97
- showTags: true,
98
- mode: {
99
- mode: "DRAW_POLYGON",
100
- regionId: "p1",
101
- },
102
- images: [
103
- {
104
- src: exampleImage,
105
- name: "Seve's Desk",
106
- regions: [
107
- {
108
- type: "box",
109
- cls: "Pants",
110
- x: 0.25,
111
- y: 0.25,
112
- w: 0.5,
113
- h: 0.5,
114
- color: "#00f",
115
- id: "p1",
116
- },
117
- {
118
- type: "box",
119
- cls: "Shirt",
120
- x: 0.8,
121
- y: 0.25,
122
- w: 0.1,
123
- h: 0.1,
124
- highlighted: true,
125
- color: "#00f",
126
- id: "p1",
127
- },
128
- ],
129
- },
130
- ],
131
- clsList: [],
132
- tagList: [],
133
- enabledTools: [],
134
- history: [],
135
- }}
136
- dispatch={(a) => !a.type.includes("MOUSE_MOVE") && action(a.type)(a)}
137
- />
138
- ))
139
- .add("Point Distances", () => (
140
- <MainLayout
141
- state={{
142
- showTags: false,
143
- showPointDistances: true,
144
- selectedImage: exampleImage,
145
- selectedTool: "create-point",
146
- taskDescription: "",
147
- showTags: true,
148
- mode: null,
149
- images: [
150
- {
151
- src: exampleImage,
152
- name: "Point Distance Check",
153
- regions: [
154
- {
155
- type: "point",
156
- cls: "P",
157
- x: 0.25,
158
- y: 0.25,
159
- color: "#f00",
160
- id: "p1",
161
- },
162
- {
163
- type: "point",
164
- cls: "P",
165
- x: 0.5,
166
- y: 0.25,
167
- color: "#0f0",
168
- id: "p2",
169
- },
170
- {
171
- type: "point",
172
- cls: "P",
173
- x: 0.5,
174
- y: 0.5,
175
- color: "#00f",
176
- id: "p3",
177
- },
178
- ],
179
- },
180
- ],
181
- clsList: [],
182
- tagList: [],
183
- enabledTools: [],
184
- history: [],
185
- }}
186
- dispatch={(a) => !a.type.includes("MOUSE_MOVE") && action(a.type)(a)}
187
- />
188
- ))
189
- .add("Point distances real units", () => (
190
- <MainLayout
191
- state={{
192
- showTags: false,
193
- showPointDistances: true,
194
- pointDistancePrecision: 2,
195
- selectedImage: exampleImage,
196
- selectedTool: "create-point",
197
- taskDescription: "",
198
- showTags: true,
199
- mode: null,
200
- images: [
201
- {
202
- src: exampleImage,
203
- name: "Point Distance Check",
204
- realSize: { w: 200, h: 1000, unitName: "cm" },
205
- regions: [
206
- {
207
- type: "point",
208
- cls: "P",
209
- x: 0.25,
210
- y: 0.25,
211
- color: "#f00",
212
- id: "p1",
213
- },
214
- {
215
- type: "point",
216
- cls: "P",
217
- x: 0.5,
218
- y: 0.25,
219
- color: "#0f0",
220
- id: "p2",
221
- },
222
- {
223
- type: "point",
224
- cls: "P",
225
- x: 0.5,
226
- y: 0.5,
227
- color: "#00f",
228
- id: "p3",
229
- },
230
- ],
231
- },
232
- ],
233
- clsList: [],
234
- tagList: [],
235
- enabledTools: [],
236
- history: [],
237
- }}
238
- dispatch={(a) => !a.type.includes("MOUSE_MOVE") && action(a.type)(a)}
239
- />
240
- ))
@@ -1,164 +0,0 @@
1
- // @flow
2
-
3
- import type {
4
- Region,
5
- Polygon,
6
- Box,
7
- Point,
8
- KeypointsDefinition,
9
- Keypoints,
10
- KeypointDefinition,
11
- } from "../ImageCanvas/region-tools.js"
12
-
13
- import type { Node } from "react"
14
-
15
- export type ToolEnum =
16
- | "select"
17
- | "pan"
18
- | "zoom"
19
- | "create-point"
20
- | "create-box"
21
- | "create-polygon"
22
- | "create-pixel"
23
- | "create-expanding-line"
24
- | "create-keypoints"
25
-
26
- export type Metadata = {
27
- key: string,
28
- value: string
29
- }
30
-
31
- export type Image = {
32
- src: string,
33
- thumbnailSrc?: string,
34
- name: string,
35
- regions?: Array<Region>,
36
- pixelSize?: { w: number, h: number },
37
- realSize?: { w: number, h: number, unitName: string },
38
- frameTime?: number,
39
- metadata?: Array<Metadata>
40
- }
41
-
42
- export type Mode =
43
- | null
44
- | {| mode: "DRAW_POLYGON", regionId: string |}
45
- | {| mode: "MOVE_POLYGON_POINT", regionId: string, pointIndex: number |}
46
- | {|
47
- mode: "RESIZE_BOX",
48
- editLabelEditorAfter ?: boolean,
49
- regionId: string,
50
- freedom: [number, number],
51
- original: { x: number, y: number, w: number, h: number },
52
- isNew ?: boolean,
53
- |}
54
- | {| mode: "MOVE_REGION" |}
55
- | {| mode: "MOVE_KEYPOINT", regionId: string, keypointId: string |}
56
- | {|
57
- mode: "RESIZE_KEYPOINTS",
58
- landmarks: {
59
- [string]: KeypointDefinition,
60
- },
61
- centerX: number,
62
- centerY: number,
63
- regionId: string,
64
- isNew: boolean,
65
- |}
66
-
67
- export type MainLayoutStateBase = {|
68
- annotationType: "video" | "image",
69
- mouseDownAt ?: ? { x: number, y: number },
70
- fullScreen ?: boolean,
71
- settingsOpen ?: boolean,
72
- minRegionSize ?: number,
73
- showTags: boolean,
74
- showMask: boolean,
75
- showPointDistances ?: boolean,
76
- pointDistancePrecision ?: number,
77
- selectedTool: ToolEnum,
78
- selectedCls ?: string,
79
- mode: Mode,
80
- taskDescription: string,
81
- allowedArea ?: { x: number, y: number, w: number, h: number },
82
- regionClsList ?: Array < string >,
83
- regionTagList ?: Array < string >,
84
- imageClsList ?: Array < string >,
85
- imageTagList ?: Array < string >,
86
- enabledTools: Array < string >,
87
- history: Array < { time: Date, state: MainLayoutState, name: string } >,
88
- keypointDefinitions: KeypointsDefinition,
89
- |}
90
-
91
- export type MainLayoutImageAnnotationState = {|
92
- ...MainLayoutStateBase,
93
- annotationType: "image",
94
-
95
- selectedImage ?: string,
96
- images: Array < Image >,
97
- labelImages ?: boolean,
98
-
99
- // If the selectedImage corresponds to a frame of a video
100
- selectedImageFrameTime ?: number,
101
- |}
102
-
103
- export type MainLayoutVideoAnnotationState = {|
104
- ...MainLayoutStateBase,
105
- annotationType: "video",
106
-
107
- videoSrc: string,
108
- currentVideoTime: number,
109
- videoName ?: string,
110
- videoPlaying: boolean,
111
- videoDuration ?: number,
112
- keyframes: {
113
- [time: number]: {|
114
- time: number,
115
- regions: Array < Region >,
116
- |},
117
- },
118
- pixelSize ?: { w: number, h: number },
119
- realSize ?: { w: number, h: number, unitName: string },
120
- |}
121
-
122
- export type MainLayoutState =
123
- | MainLayoutImageAnnotationState
124
- | MainLayoutVideoAnnotationState
125
-
126
- export type Action =
127
- | {| type: "@@INIT" |}
128
- | {| type: "SELECT_IMAGE", image: Image, imageIndex: number |}
129
- | {|
130
- type: "IMAGE_OR_VIDEO_LOADED",
131
- metadata: {
132
- naturalWidth: number,
133
- naturalHeight: number,
134
- duration ?: number,
135
- },
136
- |}
137
- | {| type: "CHANGE_REGION", region: Region |}
138
- | {| type: "RESTORE_HISTORY" |}
139
- | {| type: "CLOSE_POLYGON", polygon: Polygon |}
140
- | {| type: "SELECT_REGION", region: Region |}
141
- | {| type: "BEGIN_MOVE_POINT", point: Point |}
142
- | {| type: "BEGIN_BOX_TRANSFORM", box: Box, directions: [number, number] |}
143
- | {| type: "BEGIN_MOVE_POLYGON_POINT", polygon: Polygon, pointIndex: number |}
144
- | {| type: "BEGIN_MOVE_KEYPOINT", region: Keypoints, keypointId: string |}
145
- | {|
146
- type: "ADD_POLYGON_POINT",
147
- polygon: Polygon,
148
- point: { x: number, y: number },
149
- pointIndex: number,
150
- |}
151
- | {| type: "MOUSE_MOVE", x: number, y: number |}
152
- | {| type: "MOUSE_DOWN", x: number, y: number |}
153
- | {| type: "MOUSE_UP", x: number, y: number |}
154
- | {| type: "CHANGE_REGION", region: Region |}
155
- | {| type: "OPEN_REGION_EDITOR", region: Region |}
156
- | {| type: "CLOSE_REGION_EDITOR", region: Region |}
157
- | {| type: "DELETE_REGION", region: Region |}
158
- | {| type: "DELETE_SELECTED_REGION" |}
159
- | {| type: "HEADER_BUTTON_CLICKED", buttonName: string |}
160
- | {| type: "SELECT_TOOL", selectedTool: ToolEnum |}
161
- | {| type: "CANCEL" |}
162
- | {| type: "SELECT_CLASSIFICATION", cls: string |}
163
- | {| type: "UPDATE_REGIONS", imageId: string, regions: Arrat < Region >}
164
- | {| type: "IMAGES_CHANGED", updatedAt: Date |}
@@ -1,17 +0,0 @@
1
- // @flow
2
-
3
- import { useMemo } from "react"
4
- import type { MainLayoutVideoAnnotationState } from "../Annotator/types"
5
- import getImpliedVideoRegions from "../Annotator/reducers/get-implied-video-regions.js"
6
-
7
- const emptyArr = []
8
-
9
- export default (state: MainLayoutVideoAnnotationState) => {
10
- if (state.annotationType !== "video") return emptyArr
11
- const { keyframes, currentVideoTime = 0 } = state
12
- // TODO memoize
13
- return useMemo(
14
- () => getImpliedVideoRegions(keyframes, currentVideoTime),
15
- [keyframes, currentVideoTime]
16
- )
17
- }
@@ -1,98 +0,0 @@
1
- // @flow
2
-
3
- import React, { memo } from "react"
4
- import SidebarBoxContainer from "../SidebarBoxContainer"
5
- import DescriptionIcon from "@mui/icons-material/Description"
6
- import { styled } from "@mui/material/styles"
7
- import { createTheme, ThemeProvider } from "@mui/material/styles"
8
- import { grey } from "@mui/material/colors"
9
-
10
- type MetadataItemProps = {
11
- name: string,
12
- value: string,
13
- imageIndex: number,
14
- onChange: ({ name: string, value: String, imageIndex: number }) => void
15
- }
16
-
17
- const MetadataItemDiv = styled("div")(({ theme }) => ({
18
- display: "flex",
19
- flexDirection: "column",
20
- marginBottom: "1rem",
21
- "& > label": {
22
- fontSize: "1rem",
23
- marginBottom: ".5rem",
24
- textTransform: "capitalize"
25
- }
26
- }))
27
-
28
- const MetadataItem = ({ name, value, imageIndex, onChange }: MetadataItemProps) => {
29
- const handleChange = e => {
30
- e.preventDefault()
31
- const { name, value } = e.target
32
- onChange({
33
- name,
34
- value,
35
- imageIndex
36
- })
37
- }
38
-
39
- return (
40
- <MetadataItemDiv>
41
- <label for={name}>{name}</label>
42
- <input type="text" value={value} name={name} onChange={handleChange} />
43
- </MetadataItemDiv>
44
- )
45
- }
46
-
47
- const MetadataList = ({ title, metadata, imageIndex, onMetadataChange }) => (
48
- <div>
49
- <h2>{title}</h2>
50
- {
51
- metadata.map(({ key, value }) => (
52
- <MetadataItem name={key} value={value} imageIndex={imageIndex} onChange={onMetadataChange} />
53
- ))
54
- }
55
- </div>
56
- )
57
-
58
- const theme = createTheme()
59
- const DivContainer = styled("div")(({ theme }) => ({
60
- paddingLeft: 16,
61
- paddingRight: 16,
62
- fontSize: 12,
63
- "& h1": { fontSize: 18 },
64
- "& h2": { fontSize: 14 },
65
- "& h3": { fontSize: 12 },
66
- "& h4": { fontSize: 12 },
67
- "& h5": { fontSize: 12 },
68
- "& h6": { fontSize: 12 },
69
- "& p": { fontSize: 12 },
70
- "& a": {},
71
- "& img": { width: "100%" },
72
- }))
73
-
74
- export const MetadataEditorSidebarBox = ({ state, onMetadataChange }) => {
75
-
76
-
77
- return (
78
- <ThemeProvider theme={theme}>
79
- <SidebarBoxContainer
80
- title="Metadata"
81
- icon={<DescriptionIcon style={{ color: grey[700] }} />}
82
- expandedByDefault={true}
83
- >
84
- <DivContainer>
85
- <MetadataList title="Global" metadata={state.metadata} onMetadataChange={onMetadataChange} />
86
- {
87
- state?.images[state.selectedImage]?.metadata && (
88
- <MetadataList title="Local" metadata={state.images[state.selectedImage].metadata} imageIndex={state.selectedImage} onMetadataChange={onMetadataChange} />
89
- )
90
- }
91
-
92
- </DivContainer>
93
- </SidebarBoxContainer>
94
- </ThemeProvider>
95
- )
96
- }
97
-
98
- export default memo(MetadataEditorSidebarBox)
@@ -1,76 +0,0 @@
1
- import React from 'react';
2
- import PropTypes from 'prop-types';
3
- import classnames from "classnames"
4
- require('./page-selector.css').toString();
5
-
6
- function PageThumbnail({ src, isActive, onClick, pageNumber }) {
7
- return (
8
- <div
9
- role="button"
10
- tabIndex={0}
11
- className={classnames('page-thumbnail', {
12
- 'page-thumbnail-is-active': isActive
13
- })}
14
- onClick={onClick}
15
- >
16
- <img src={src} alt="" />
17
- {
18
- (pageNumber !== undefined) && (
19
- <div className="page-number-wrapper">
20
- <span className="page-number">{pageNumber}</span>
21
- </div>
22
- )
23
- }
24
-
25
- </div >
26
- );
27
- }
28
-
29
- function PagesSelector({ pages, onPageClick, onRecalc, onSave, recalcActive, saveActive }) {
30
- return (
31
- <div className="page-selector">
32
- <div className="bottom-buttons">
33
- <button onClick={onRecalc} disabled={!recalcActive}>Recalc</button>
34
- <button onClick={onSave} disabled={!saveActive}>Save</button>
35
- </div>
36
- <div className="pages">
37
- {pages.map((page, idx) => (
38
- <PageThumbnail
39
- key={page.id}
40
- src={page.src}
41
- isActive={page.isActive}
42
- onClick={() => onPageClick(idx)}
43
- />
44
- ))}
45
- </div>
46
- </div>
47
- );
48
- }
49
-
50
- PagesSelector.propTypes = {
51
- pages: PropTypes.arrayOf(
52
- PropTypes.shape({
53
- id: PropTypes.string.isRequired,
54
- src: PropTypes.string.isRequired,
55
- isActive: PropTypes.string.isRequired,
56
- pageNumber: PropTypes.string
57
- })
58
- ).isRequired,
59
- onPageClick: PropTypes.func,
60
- onRecalc: PropTypes.func,
61
- onSave: PropTypes.func,
62
- recalcActive: PropTypes.bool,
63
- saveActive: PropTypes.bool,
64
- pageNumber: PropTypes.string
65
- };
66
-
67
- PagesSelector.defaultProps = {
68
- onPageClick: () => { },
69
- onRecalc: () => { },
70
- onSave: () => { },
71
- recalcActive: false,
72
- saveActive: false,
73
- pageNumber: undefined
74
- };
75
-
76
- export default PagesSelector;
@@ -1,90 +0,0 @@
1
- // @flow weak
2
-
3
- import React, { Fragment } from "react"
4
- import { styled } from "@mui/material/styles"
5
- import { createTheme, ThemeProvider } from "@mui/material/styles"
6
-
7
- const theme = createTheme()
8
- const Svg = styled("svg")(({ theme }) => ({
9
- pointerEvents: "none",
10
- position: "absolute",
11
- zIndex: 1,
12
- left: 0,
13
- top: 0,
14
- width: "100%",
15
- height: "100%",
16
- "& text": {
17
- fill: "#fff",
18
- },
19
- "& path": {
20
- vectorEffect: "non-scaling-stroke",
21
- strokeWidth: 2,
22
- opacity: 0.5,
23
- stroke: "#FFF",
24
- fill: "none",
25
- strokeDasharray: 5,
26
- animationDuration: "4s",
27
- animationTimingFunction: "linear",
28
- animationIterationCount: "infinite",
29
- animationPlayState: "running",
30
- },
31
- }))
32
-
33
- export const PointDistances = ({
34
- projectRegionBox,
35
- regions,
36
- pointDistancePrecision,
37
- realSize,
38
- }) => {
39
- return (
40
- <ThemeProvider theme={theme}>
41
- <Svg>
42
- {regions
43
- .filter((r1) => r1.type === "point")
44
- .flatMap((r1, i1) =>
45
- regions
46
- .filter((r2, i2) => i2 > i1)
47
- .filter((r2) => r2.type === "point")
48
- .map((r2) => {
49
- const pr1 = projectRegionBox(r1)
50
- const pr2 = projectRegionBox(r2)
51
- const prm = {
52
- x: (pr1.x + pr1.w / 2 + pr2.x + pr2.w / 2) / 2,
53
- y: (pr1.y + pr1.h / 2 + pr2.y + pr2.h / 2) / 2,
54
- }
55
- let displayDistance
56
- if (realSize) {
57
- const { w, h, unitName } = realSize
58
- displayDistance =
59
- Math.sqrt(
60
- Math.pow(r1.x * w - r2.x * w, 2) +
61
- Math.pow(r1.y * h - r2.y * h, 2)
62
- ).toFixed(pointDistancePrecision) + unitName
63
- } else {
64
- displayDistance =
65
- (
66
- Math.sqrt(
67
- Math.pow(r1.x - r2.x, 2) + Math.pow(r1.y - r2.y, 2)
68
- ) * 100
69
- ).toFixed(pointDistancePrecision) + "%"
70
- }
71
- return (
72
- <Fragment>
73
- <path
74
- d={`M${pr1.x + pr1.w / 2},${pr1.y + pr1.h / 2} L${
75
- pr2.x + pr2.w / 2
76
- },${pr2.y + pr2.h / 2}`}
77
- />
78
- <text x={prm.x} y={prm.y}>
79
- {displayDistance}
80
- </text>
81
- </Fragment>
82
- )
83
- })
84
- )}
85
- </Svg>
86
- </ThemeProvider>
87
- )
88
- }
89
-
90
- export default PointDistances