1 | // please include #1005686 [PIF Classes v2] |
2 | |
3 | sclass SingleObjectFinder { |
4 | S obj = "start button"; |
5 | |
6 | *() {} |
7 | *(S *obj) {} |
8 | |
9 | int maxTotal = 10; |
10 | bool fullSearch = true; |
11 | JComponent form; |
12 | JLabel lFound, lSearchTime, lScreenshots; |
13 | volatile L<Found> found; |
14 | |
15 | void showGUI() { |
16 | form = showForm( |
17 | "Number of \*obj*/ pictures stored:", jConceptCountLabel(Clip), |
18 | "Number of screenshots stored:", lScreenshots = jConceptDependentLabel(func { |
19 | int n = countConcepts(Screenshot); |
20 | int t = countConcepts(TransientScreenshot); |
21 | ret n + " (" + (n-t) + " with image)"; |
22 | }), |
23 | "Currently found:", lFound = jlabel(), |
24 | "Search time:", lSearchTime = jlabel(), |
25 | "", jbutton("Show pictures", r { showClips() }), |
26 | "", jbutton("Grab picture of \*obj*/", r { addClip(false) }), |
27 | "", jbutton("Grab picture with delay", r { addClip(true) }) |
28 | ); |
29 | |
30 | onDoubleClick(lFound, r { |
31 | Found f = first(found); |
32 | if (f == null) ret; |
33 | moveMouseTo(centerOfRect(f.fi.r)); |
34 | }); |
35 | |
36 | componentPopupMenu(lFound, voidfunc(JPopupMenu menu) { |
37 | menu.add(jmenuItem("Show all", r { |
38 | for (Found f: unnull(found)) |
39 | pointArrowsToArea(f.fi.r); |
40 | })); |
41 | }); |
42 | |
43 | componentPopupMenu(lScreenshots, voidfunc(JPopupMenu menu) { |
44 | menu.add(jmenuItem("Delete older screenshots", r { |
45 | deleteOlderScreenshots() |
46 | })); |
47 | }); |
48 | |
49 | final new MonoThread thread; |
50 | installTimer(form, 5000, 0, r { |
51 | thread.runIfNotRunning(r { |
52 | BufferedImage img = shootScreen2(); |
53 | long start = now(); |
54 | found = continuousFind_step(goodClips(), img, maxTotal, fullSearch); |
55 | final long time = now()-start; |
56 | awt { |
57 | lSearchTime.setText(time + " ms"); |
58 | S s = "no"; |
59 | if (nempty(found)) |
60 | s = "at " + first(found).fi.r + " [clip " + first(found).clip->id + "]"; |
61 | if (l(found) > 1) |
62 | s += " +" + (l(found)-1); |
63 | lFound.setText(s); |
64 | } |
65 | }); |
66 | }); |
67 | } |
68 | |
69 | void addClip(bool delay) { |
70 | letUserMarkScreenArea(delay ? null : shootScreen2(), voidfunc(final Rectangle r, BufferedImage img) { |
71 | if (r == null) print("Cancelled!"); |
72 | else { |
73 | Screenshot screenshot = new Screenshot(img); |
74 | |
75 | showAnimation("#1005611", "You marked " + r, 3); |
76 | uniq(MarkedClip, +screenshot, positionInScreenshot := new Rect(r), |
77 | description := obj, |
78 | img := new BWImage(img).clip(r)); |
79 | darkenScreenArea(r, 5); |
80 | swingLater(250, r { |
81 | pointArrowsToArea(r, 5-0.25); |
82 | }); |
83 | } |
84 | }); |
85 | } |
86 | |
87 | void showClips { |
88 | new L<L> data; |
89 | for (MarkedClip clip) pcall { |
90 | data.add(ll(clip.id, clip.img == null ? null : clip.img.getBufferedImage(), clip.description)); |
91 | } |
92 | final JTable table = showTableWithImages("Clips", splitAtSpace("ID Picture Description"), data); |
93 | tablePopupMenu(table, voidfunc(JPopupMenu menu, int row) { |
94 | L line = getTableLine(table, row); |
95 | long id = parseLong(line.get(0)); |
96 | final Clip clip = cast getConcept(id); |
97 | if (neq(clip.description, "bad")) |
98 | menu.add(jmenuItem("Mark bad", r { |
99 | cset(clip, description := "bad"); |
100 | disposeFrame(table); |
101 | showClips(); |
102 | })); |
103 | }); |
104 | } |
105 | |
106 | L<Clip> goodClips() { |
107 | ret [Clip c in list(Clip) | swic(c.description, obj)]; |
108 | } |
109 | |
110 | void deleteOlderScreenshots() { |
111 | for (Screenshot s : dropLast(list(Screenshot))) { |
112 | if (hasBackRef(s, Clip)) continue; |
113 | print("Backrefs to screenshot:"); |
114 | L<Concept> backRefs = findBackRefs(s, Concept); |
115 | printIndent(renderConcepts(backRefs)); |
116 | deleteConcepts(backRefs); |
117 | s.delete(); |
118 | } |
119 | } |
120 | } |
Began life as a copy of #1005676
download show line numbers debug dex old transpilations
Travelled to 13 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
Snippet ID: | #1005714 |
Snippet name: | SingleObjectFinder [with GUI] |
Eternal ID of this version: | #1005714/1 |
Text MD5: | 137c35930f5b77c038b3551e6245a922 |
Author: | stefan |
Category: | javax / gui / a.i. |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2016-12-05 22:44:57 |
Source code size: | 3840 bytes / 120 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 467 / 830 |
Referenced in: | [show references] |