// please include #1005686 [PIF Classes v2] sclass SingleObjectFinder { S obj = "start button"; *() {} *(S *obj) {} int maxTotal = 10; bool fullSearch = true; JComponent form; JLabel lFound, lSearchTime, lScreenshots; volatile L<Found> found; void showGUI() { form = showForm( "Number of \*obj*/ pictures stored:", jConceptCountLabel(Clip), "Number of screenshots stored:", lScreenshots = jConceptDependentLabel(func { int n = countConcepts(Screenshot); int t = countConcepts(TransientScreenshot); ret n + " (" + (n-t) + " with image)"; }), "Currently found:", lFound = jlabel(), "Search time:", lSearchTime = jlabel(), "", jbutton("Show pictures", r { showClips() }), "", jbutton("Grab picture of \*obj*/", r { addClip(false) }), "", jbutton("Grab picture with delay", r { addClip(true) }) ); onDoubleClick(lFound, r { Found f = first(found); if (f == null) ret; moveMouseTo(centerOfRect(f.fi.r)); }); componentPopupMenu(lFound, voidfunc(JPopupMenu menu) { menu.add(jmenuItem("Show all", r { for (Found f: unnull(found)) pointArrowsToArea(f.fi.r); })); }); componentPopupMenu(lScreenshots, voidfunc(JPopupMenu menu) { menu.add(jmenuItem("Delete older screenshots", r { deleteOlderScreenshots() })); }); final new MonoThread thread; installTimer(form, 5000, 0, r { thread.runIfNotRunning(r { BufferedImage img = shootScreen2(); long start = now(); found = continuousFind_step(goodClips(), img, maxTotal, fullSearch); final long time = now()-start; awt { lSearchTime.setText(time + " ms"); S s = "no"; if (nempty(found)) s = "at " + first(found).fi.r + " [clip " + first(found).clip->id + "]"; if (l(found) > 1) s += " +" + (l(found)-1); lFound.setText(s); } }); }); } void addClip(bool delay) { letUserMarkScreenArea(delay ? null : shootScreen2(), voidfunc(final Rectangle r, BufferedImage img) { if (r == null) print("Cancelled!"); else { Screenshot screenshot = new Screenshot(img); showAnimation("#1005611", "You marked " + r, 3); uniq(MarkedClip, +screenshot, positionInScreenshot := new Rect(r), description := obj, img := new BWImage(img).clip(r)); darkenScreenArea(r, 5); swingLater(250, r { pointArrowsToArea(r, 5-0.25); }); } }); } void showClips { new L<L> data; for (MarkedClip clip) pcall { data.add(ll(clip.id, clip.img == null ? null : clip.img.getBufferedImage(), clip.description)); } final JTable table = showTableWithImages("Clips", splitAtSpace("ID Picture Description"), data); tablePopupMenu(table, voidfunc(JPopupMenu menu, int row) { L line = getTableLine(table, row); long id = parseLong(line.get(0)); final Clip clip = cast getConcept(id); if (neq(clip.description, "bad")) menu.add(jmenuItem("Mark bad", r { cset(clip, description := "bad"); disposeFrame(table); showClips(); })); }); } L<Clip> goodClips() { ret [Clip c in list(Clip) | swic(c.description, obj)]; } void deleteOlderScreenshots() { for (Screenshot s : dropLast(list(Screenshot))) { if (hasBackRef(s, Clip)) continue; print("Backrefs to screenshot:"); L<Concept> backRefs = findBackRefs(s, Concept); printIndent(renderConcepts(backRefs)); deleteConcepts(backRefs); s.delete(); } } }
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: | 466 / 829 |
Referenced in: | #1005715 - Find JavaX console's "kill" button #1005721 - Find JavaX console's "duplicate" button |