Transpiled version (70256L) is out of date.
1 | // TODO: call fullyConfigured in normal constructor |
2 | // (so we don't end up erroneously making EMPTY G22ShapeCollectorPanel's) |
3 | sclass G22ShapeCollectorPanel > MetaWithChangeListeners is Swingable { |
4 | settable G22Utils g22utils; |
5 | settable bool qoiAlways; |
6 | settableWithVar S imageSourceDesc = "Left screen half"; |
7 | |
8 | AnalyzedImage completedImage; |
9 | |
10 | // seconds per gradient color cycle |
11 | settable double gradientCycleTime = 2.0; |
12 | |
13 | settable int maxDrift = 100; |
14 | new MouseInComponentMonitor mouseMonitor; |
15 | PicturesByMD5 pics; |
16 | new JMaxSpeedAnimation anim; |
17 | JCheckBox cbOn = jcheckbox("On", true); |
18 | //JCheckBox cbFreezeOnHover = jcheckbox("Freeze on hover", true); |
19 | JCheckBox cbAnimateGradients = jcheckbox("Animate gradients", false); |
20 | JSpinner colorsSpinner = jListSpinner(itemPlus(2, dropFirst(firstNCubes(16)))); |
21 | JSpinner blurSpinner = jSpinner(0, 0, 99); |
22 | JLabel lblStats = rightAlignedLabel(); |
23 | JSlider driftSlider; |
24 | JCheckBox cbAntiDrift = jcheckbox("Antidrift", true); |
25 | |
26 | class AnalyzedImage extends G22DataWrangler { |
27 | G22DataWrangler wrangler() { this; } |
28 | |
29 | simplyCached byte[] qoiData() { |
30 | ret g22utils.timeFunction("QOI compress", |
31 | -> toQOI(inputImage())); |
32 | } |
33 | |
34 | simplyCached S qoiMD5() { |
35 | ret md5(qoiData()); |
36 | } |
37 | |
38 | S saveImage() { |
39 | pics.put(qoiMD5(), qoiData()); |
40 | ret qoiMD5(); |
41 | } |
42 | } |
43 | |
44 | void init { |
45 | if (pics != null) ret; |
46 | pics = g22utils.picturesByMD5(); |
47 | |
48 | driftSlider = jSlider(-maxDrift, maxDrift, 0); |
49 | componentPopupMenuItem(driftSlider, |
50 | "Reset", r { driftSlider.setValue(0) }); |
51 | |
52 | //looselyBindLiveValueToCheckBox(g22utils.liveProjectVar("Freeze on hover"), cbFreezeOnHover); |
53 | looselyBindLiveValueToCheckBox(g22utils.liveProjectVar("Animate gradients"), cbAnimateGradients); |
54 | looselyBindLiveValueToSpinner(g22utils.liveProjectVar("colors"), colorsSpinner); |
55 | looselyBindLiveValueToSpinner(g22utils.liveProjectVar("blur"), blurSpinner); |
56 | looselyBindLiveValueToSlider(g22utils.liveProjectVar("brightnessDrift"), driftSlider); |
57 | looselyBindLiveValueToCheckBox(g22utils.liveProjectVar("Antidrift"), cbAntiDrift); |
58 | } |
59 | |
60 | swappable BufferedImage nextInputImage() { |
61 | ret shootLeftScreenHalf(); |
62 | } |
63 | |
64 | selfType imageSource(IF0<BufferedImage> imageSource, S imageSourceDesc default str(imageSource)) { |
65 | nextInputImage = imageSource; |
66 | imageSourceDesc = imageSourceDesc; |
67 | this; |
68 | } |
69 | |
70 | bool running() { |
71 | ret isChecked(cbOn) |
72 | /*&& !(isChecked(cbFreezeOnHover) && mouseMonitor!)*/; |
73 | } |
74 | |
75 | BufferedImage nextFrame() { |
76 | if (!running()) { |
77 | sleepSeconds(0.1); |
78 | null; |
79 | } |
80 | |
81 | var inputImage = nextInputImage(); |
82 | new AnalyzedImage ai; |
83 | |
84 | var wrangler = ai.wrangler(); |
85 | wrangler.timings(g22utils.functionTimings()); |
86 | wrangler.inputImage(inputImage); |
87 | wrangler.colors(intFromSpinner(colorsSpinner)); |
88 | wrangler.blur(intFromSpinner(blurSpinner)); |
89 | |
90 | // drift is between -1 and 1 |
91 | var drift = (float) (intFromSlider(driftSlider)/100.0); |
92 | if (isChecked(cbAnimateGradients)) |
93 | drift = (float) transformFromZeroToOne(-1, 1, frac(sysSeconds()/gradientCycleTime)); |
94 | |
95 | wrangler.drift(drift); |
96 | wrangler.antiDrift(isChecked(cbAntiDrift) || isChecked(cbAnimateGradients) ? -drift : 0); |
97 | |
98 | wrangler.stepUntilStage(wrangler.regionsStage); |
99 | g22utils.setTransientProjectVar("Last wrangler", wrangler); |
100 | |
101 | L qoiInfo = !qoiAlways ? null : ll( |
102 | "QOI: " + str_toK(l(ai.qoiData())), |
103 | "Hash: " + takeFirst(3, ai.qoiMD5()), |
104 | "Saved: " + yesNo_short(pics.has(ai.qoiMD5()))); |
105 | |
106 | setText(lblStats, commaCombine( |
107 | anim.fps(), |
108 | nRegions(wrangler.regions), |
109 | qoiInfo, |
110 | nImages(pics.imageCount()) + " saved", |
111 | n2(countConcepts(g22utils.concepts(), G22PointOfInterest), "POI") |
112 | ); |
113 | |
114 | completedImage = ai; |
115 | g22utils.setTransientProjectVar("Last analyzed image", ai); |
116 | ret toBufferedImage(wrangler.posterizedImage); |
117 | } |
118 | |
119 | swappable JComponent watchingUI() { |
120 | ret liveValueLabel(varImageSourceDesc()); |
121 | } |
122 | |
123 | cachedVisualize { |
124 | init(); |
125 | |
126 | anim.renderFrame(l0 nextFrame); |
127 | |
128 | mouseMonitor.init(anim.imageSurface()); |
129 | |
130 | // UI main layout |
131 | |
132 | ret northAndCenterWithMargins( |
133 | northAndCenterWithMargin( |
134 | jcenteredline(withLabel("Watching:", watchingUI())), |
135 | jCenteredSection(" Visual Controls ", |
136 | jHigherScrollPane_borderless_center(withSideMargin( |
137 | jcenteredline( |
138 | cbOn, //cbFreezeOnHover, |
139 | jCenteredSection("Colors", colorsSpinner), |
140 | jCenteredSection("Blur", blurSpinner), |
141 | cbAnimateGradients, |
142 | jCenteredSection("Drift", driftSlider), |
143 | cbAntiDrift, |
144 | ) |
145 | )))), |
146 | centerAndSouthWithMargin( |
147 | jCenteredSection(" What I See ", anim), |
148 | centerAndEastWithMargin(lblStats, |
149 | jThreadedButton("Save image", -> { |
150 | completedImage?.saveImage(); |
151 | }))) |
152 | ); |
153 | } |
154 | |
155 | ImageSurface imageSurface() { |
156 | ret anim.imageSurface(); |
157 | } |
158 | |
159 | static G22ShapeCollectorPanel fullyConfigured(G22Utils g22utils, G22ShapeCollectorPanel collector default new) { |
160 | ret (G22ShapeCollectorPanel) g22utils.leftArrowWithVars([[ |
161 | collector g22utils < g22utils |
162 | collector visualize |
163 | is <- collector imageSurface |
164 | hoveringOverRegion <- new Var<IImageRegion> |
165 | is addOverlay < G2Drawable g -> { |
166 | region <- hoveringOverRegion get |
167 | if notNull region { |
168 | //zoomGraphics g (is zoomY) (is zoomY) |
169 | for outline in g22_allBorderTraces_autoDiagonals region { |
170 | for p in outline { |
171 | p <- scalePt p (is zoomY) (is zoomY) |
172 | //drawPixel g p < Color green |
173 | fillRect g (Color green) (p x) (p y) (iceil < is zoomX) (iceil < is zoomY) |
174 | } |
175 | } |
176 | } |
177 | } |
178 | |
179 | collector anim, displayNewImage <- IVF1 image -> { |
180 | pt <- is mousePosition |
181 | if isNull pt { |
182 | hoveringOverRegion clear |
183 | } else { |
184 | ai <- collector completedImage |
185 | regionMaker <- ai wrangler, regionMaker |
186 | hoveringOverRegion set < |
187 | regionMaker getRegion < regionMaker regionAt pt |
188 | // TODO: doesn't work like this |
189 | // if not < collector running { is repaint } |
190 | } |
191 | //toolTip is hoveringOverRegion |
192 | collector anim, displayNewImage_base image |
193 | } |
194 | |
195 | is imageSurfaceOnLeftClick < IVF1 pt -> { |
196 | region <- hoveringOverRegion get |
197 | if isNull region { ret } |
198 | ai <- collector completedImage |
199 | md5 <- ai saveImage |
200 | poi <- new G22PointOfInterest |
201 | poi imageMD5 <- md5 |
202 | poi pt <- pt |
203 | poi bnpSettings <- ai wrangler, bnpSettings |
204 | poi source <- spaceCombine "Clicked" (byUser) "on" ( ymdWithSlashes) |
205 | registerConcept (concepts) poi |
206 | } |
207 | |
208 | collector |
209 | ]], +collector); |
210 | } |
211 | } |
download show line numbers debug dex old transpilations
Travelled to 2 computer(s): elmgxqgtpvxh, mqqgnosmbjvj
No comments. add comment
Snippet ID: | #1035943 |
Snippet name: | G22ShapeCollectorPanel - latest shape collector version |
Eternal ID of this version: | #1035943/58 |
Text MD5: | 30c8d8a182f74adae710ea229aeb61ec |
Author: | stefan |
Category: | javax / gazelle 22 |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2022-09-15 18:38:35 |
Source code size: | 7138 bytes / 211 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 297 / 569 |
Version history: | 57 change(s) |
Referenced in: | [show references] |