From e4f30afbe8063fb18ad1bc21ca92c4e7e5e64f7b Mon Sep 17 00:00:00 2001 From: Amandine Tournay <amandine.tournay@pasteur.fr> Date: Tue, 9 Mar 2021 19:13:48 +0100 Subject: [PATCH] Added project --- .gitignore | 6 + pom.xml | 83 ++++++++ .../TimeStampOverlay$DisplayStyle.class | Bin 0 -> 1243 bytes .../fab/timestamp/TimeStampOverlay.class | Bin 0 -> 5735 bytes .../fab/timestamp/TimeStampOverlay.java | 178 ++++++++++++++++++ .../plugins/fab/timestamp/Timestamp.class | Bin 0 -> 1124 bytes .../java/plugins/fab/timestamp/Timestamp.java | 26 +++ 7 files changed, 293 insertions(+) create mode 100644 .gitignore create mode 100644 pom.xml create mode 100644 src/main/java/plugins/fab/timestamp/TimeStampOverlay$DisplayStyle.class create mode 100644 src/main/java/plugins/fab/timestamp/TimeStampOverlay.class create mode 100644 src/main/java/plugins/fab/timestamp/TimeStampOverlay.java create mode 100644 src/main/java/plugins/fab/timestamp/Timestamp.class create mode 100644 src/main/java/plugins/fab/timestamp/Timestamp.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3d47f98 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.idea/ +target/ +.settings/ +*.iml +.project +.classpath \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..4a6defa --- /dev/null +++ b/pom.xml @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <!-- Inherited Icy Parent POM --> + <parent> + <groupId>org.bioimageanalysis.icy</groupId> + <artifactId>parent-pom-plugin</artifactId> + <version>1.0.3</version> + </parent> + + <!-- Project Information --> + <artifactId>timestamp-overlay</artifactId> + <version>1.0.6</version> + + <packaging>jar</packaging> + + <name>Timestamp Overlay</name> + <description>Displays a customizable time stamp over a 2D sequence.</description> + <url>http://icy.bioimageanalysis.org/plugin/timestamp-overlay/</url> + <inceptionYear>2020</inceptionYear> + + <organization> + <name>Institut Pasteur</name> + <url>https://pasteur.fr</url> + </organization> + + <licenses> + <license> + <name>GNU GPLv3</name> + <url>https://www.gnu.org/licenses/gpl-3.0.en.html</url> + <distribution>repo</distribution> + </license> + </licenses> + + <developers> + <developer> + <id>sdallongeville</id> + <name>Stéphane Dallongeville</name> + <url>https://research.pasteur.fr/fr/member/stephane-dallongeville/</url> + <roles> + <role>founder</role> + <role>lead</role> + <role>architect</role> + <role>developer</role> + <role>debugger</role> + <role>tester</role> + <role>maintainer</role> + <role>support</role> + </roles> + </developer> + </developers> + + <!-- Project properties --> + <properties> + + </properties> + + <!-- Project build configuration --> + <build> + + </build> + + <!-- List of project's dependencies --> + <dependencies> + <!-- The core of Icy --> + <dependency> + <groupId>org.bioimageanalysis.icy</groupId> + <artifactId>icy-kernel</artifactId> + </dependency> + </dependencies> + + <!-- Icy Maven repository (to find parent POM) --> + <repositories> + <repository> + <id>icy</id> + <name>Icy's Nexus</name> + <url>https://icy-nexus.pasteur.fr/repository/Icy/</url> + </repository> + </repositories> +</project> diff --git a/src/main/java/plugins/fab/timestamp/TimeStampOverlay$DisplayStyle.class b/src/main/java/plugins/fab/timestamp/TimeStampOverlay$DisplayStyle.class new file mode 100644 index 0000000000000000000000000000000000000000..dfca7e9ba05cd8567731af1d9f74b4c160bbee1b GIT binary patch literal 1243 zcmbVL?@!uL6g|%Zh1#iO1M$axGY9BEXJ(c_jK<+Y2AWtTA^Y@TPgYY3X^RQ})rKE5 zTW0oof7G)3D${1kl7%Miz4yI)&O5g~{rT(b6@X2=QZdD_*|!EA({>9dyjAebu5dlx z?HB5l88SOO6OP4)>9?lar)YRXOQ;Aj%$)KwUa+{`DU|I&mm$1=v|B4Pysl0_S!4*+ zD-u3kJ~*zW8@tuxvca(RVM4ZOsco6I>1{J8nQVjT_j(^i6k!bvvpVK*mmyLbw<I&w z+i?ufG3`#Vl5NDO_nwY0B2lQaNa|1#ky%Pd6fvTznzlF?bX&ry^OhwT;?-W8TMh1* zvi27>D3~P)-Y3(gQ_r|H5R|;hWG5R>!(%*E@q}S6AbaR~qO0Q>(hM=~IDFXd^@j|( z;BbenQ_=Q{mB74zmS|uG)fabo!cYmq#_uFM(btgUXLLMAmfR6!-Ltss76Vdlj=3F6 znv2|_8NGqi7W<}r#fiV|nV0=EwPAK_?hPF3c^9CS9Hoh*Z`09w#kPgxYZb1Fb%vGy zb2veRzs=4%`9`6CPuW?Jo&qS6oq)MTX(rkUQPeO^eL7V~RLd*>4Xhczqg-I-9C5$6 zAM%St_&aSWBgBnnXoQ4uj`=Tyn8E@*HHttAi%8NfSLIF4AM<aJ8mULktu9|+=@uBF z28=<vpQ~7wLP_KUJRHNfXb1^UjxgVRujH<pC8?&SEM4N!+GpCimT}F-ZY0FW2`gic l9QDYvv^dLM;>8cJf8!M7e9l#@`SB(45=nT50ycJ1zX4a!Fq{AY literal 0 HcmV?d00001 diff --git a/src/main/java/plugins/fab/timestamp/TimeStampOverlay.class b/src/main/java/plugins/fab/timestamp/TimeStampOverlay.class new file mode 100644 index 0000000000000000000000000000000000000000..a3e9ba1400212327f34cf891c077f373e2dac685 GIT binary patch literal 5735 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 b1q#F>v6#;is-2Fv#S+>(i3P~ghVu6T;7P@w literal 0 HcmV?d00001 diff --git a/src/main/java/plugins/fab/timestamp/TimeStampOverlay.java b/src/main/java/plugins/fab/timestamp/TimeStampOverlay.java new file mode 100644 index 0000000..0d3ea62 --- /dev/null +++ b/src/main/java/plugins/fab/timestamp/TimeStampOverlay.java @@ -0,0 +1,178 @@ +package plugins.fab.timestamp; + +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.event.KeyEvent; +import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; +import java.util.concurrent.TimeUnit; + +import icy.canvas.IcyCanvas; +import icy.gui.frame.progress.AnnounceFrame; +import icy.math.MathUtil; +import icy.math.UnitUtil; +import icy.painter.Overlay; +import icy.sequence.Sequence; +import icy.util.GraphicsUtil; +import icy.util.StringUtil; + +public class TimeStampOverlay extends Overlay +{ + enum DisplayStyle + { + FRAME, TIME + }; + + String timeStampText; + int x; + int y; + Font font; + DisplayStyle displayStyle = DisplayStyle.FRAME; + Rectangle2D textBound = new Rectangle2D.Double(0, 0, 0, 0); + int fontSize = 20; + int displaySelectionIndex = 0; + + public TimeStampOverlay(Sequence sequence) + { + super("Timestamp"); + + x = 20; + y = sequence.getHeight() - 20; + font = new Font("Arial", Font.BOLD, fontSize); + } + + /** + * Display the time with all the units. + * + * @param valueInMs + * : value in milliseconds + * @param displayMs : Even if a unit is not relevant (equals to zero), it will be displayed. + * @return <b>Example:</b> "2h 3min 40sec 350ms". + */ + public static String getTimeAsString(double valueInMs, boolean displayMs) + { + double v = Math.abs(valueInMs); + + final int day = (int) (v / (24d * 60d * 60d * 1000d)); + v %= 24d * 60d * 60d * 1000d; + final int hour = (int) (v / (60d * 60d * 1000d)); + v %= 60d * 60d * 1000d; + final int minute = (int) (v / (60d * 1000d)); + v %= 60d * 1000d; + final int second = (int) (v / 1000d); + v %= 1000d; + final double ms = MathUtil.round(v, 1); + + String result = ""; + + if (day > 0) + result += day + "d "; + if (hour > 0) + result += String.format("%2dh ", Integer.valueOf(hour)); + else if (!StringUtil.isEmpty(result)) + result += "00h "; + if (minute > 0) + result += String.format("%2dmin ", Integer.valueOf(minute)); + else if (!StringUtil.isEmpty(result)) + result += "00min "; + if (second > 0) + result += String.format("%2dsec ", Integer.valueOf(second)); + else if (!StringUtil.isEmpty(result)) + result += "00sec "; + if (ms > 0d) + result += String.format("%05.1fms", Double.valueOf(ms)); + else if (displayMs && !StringUtil.isEmpty(result)) + result += String.format("%05.1fms", Double.valueOf(0)); + + return result; + } + + @Override + public void paint(Graphics2D g, Sequence sequence, IcyCanvas canvas) + { + + if (g == null) + return; + + g.setColor(Color.white); + g.setFont(font); + + switch (displayStyle) + { + case FRAME: + timeStampText = "Current frame: " + canvas.getPositionT(); + break; + + case TIME: + final double timeIntervalMs = sequence.getTimeInterval() * 1000d; + final TimeUnit unit = UnitUtil.getBestTimeUnit(timeIntervalMs * 10); + double ms = canvas.getPositionT() * timeIntervalMs; + + // minute or "higher" time unit ? + if (unit.ordinal() >= TimeUnit.MINUTES.ordinal()) + timeStampText = getTimeAsString(ms, (timeIntervalMs % 1000d) != 0d); + else + timeStampText = UnitUtil.displayTimeAsStringWithComma(ms, 3, unit); + break; + } + + g.drawString(timeStampText, x, y); + + Rectangle2D r = GraphicsUtil.getStringBounds(g, font, timeStampText); + r.setRect(r.getX() + x, r.getY() + y, r.getWidth(), r.getHeight()); + textBound = r; + } + + @Override + public void keyPressed(KeyEvent e, Point2D imagePoint, IcyCanvas canvas) + { + if (e.isConsumed()) + return; + + if (e.getKeyChar() == 'm') + { + x = (int) imagePoint.getX(); + y = (int) imagePoint.getY(); + canvas.getSequence().painterChanged(this); + return; + } + + // if ( !isPointInTextArea( imagePoint ) ) return; + + if (e.getKeyChar() == 't') + { + displaySelectionIndex++; + if (displaySelectionIndex >= DisplayStyle.values().length) + { + displaySelectionIndex = 0; + } + + displayStyle = DisplayStyle.values()[displaySelectionIndex]; + + } + + if (e.getKeyChar() == '+') + { + fontSize++; + } + + if (e.getKeyChar() == '-') + { + fontSize--; + if (fontSize < 2) + fontSize = 2; + } + + if (e.getKeyChar() == 'k') + { + canvas.getSequence().removePainter(this); + new AnnounceFrame("Time Stamp removed", 2); + } + + font = new Font("Arial", Font.BOLD, fontSize); + canvas.getSequence().painterChanged(this); + + e.consume(); + } +} diff --git a/src/main/java/plugins/fab/timestamp/Timestamp.class b/src/main/java/plugins/fab/timestamp/Timestamp.class new file mode 100644 index 0000000000000000000000000000000000000000..09638ce64d13ceab40237f6f438d4c8e12bb17ef GIT binary patch literal 1124 zcmah|O;1xn6g@)=t+fbL`BY&LftE&Q;f^*<)Pz-4k~SFKnCa`Z9eI84F>eaif8_=e zNnE<{HyPud*9QwDaWUWbo_p>+cYgl<_8q`;?By`Uuo3yAz7As1lO198P{mdbBhkLz z<&b6A*4|i542A5()=1BO6i12Y3(x8>kR4w!%+z(DZG$0Gt{gLDUxi&&Kn8b;n8pml zTvG??&1l$Brakc}HA7GO$I@tbPA{`|pks#3=6|@=D3BQiIm|O`Ig0&}7Cj?}N<=2? z8x_Z*9fp2eM~Ch<j}l`q>jOLV8}&}Z<=ArBa@p;w?tWc#=-MRX$d{ht<8WlSH!^W( zczC7^w*$p*+;(Gb)o06P(B*a<DINwidWlgl^!@N$2Yv1<Yn36>kb46e^i}fS)p6v@ z@j(*L*9~s@0gunM^#;6W!XZsW*f}{(czF~%tYjZk!BmB(2zBRN70<|B2cA(fR$TC| zO1Hf*usqgZRAM(It05(l0wuXSUXu)clEP`3n4XZSQGXfNMN+#0=J3Ety2!9tZhn$y zQuvgbXjwxvYn9^y7?z7z!79T-Us=~AXR4)6M=J2BQC7>9rV}hqZ^ZReEr*8;JGTp; z2=<n=pz0N{hR2S_I>TD|7C=Xa<4F#iME0LCi`c?bh5~g#3e2!Ffs3RLNIj9>*D4<v z^4Fv(#am)B%o0!U<h6{_mM*lYl{|H*-8Z@CS}1na-*>gcCRHm#e-fCY9sLxVb9554 zGFqqiE|LG5JQrwo&me=lG#4iZw9e9rpl_T{ktH}_;|g=7g-hJuyTDSj`UCUTE3Cb* zUgFUOHr_ed3>@qdMFuIG$0C6(V}ayb$7&L0X#$monMDcP*r9N{<dFyah4ma2nW0SQ HDOCOd63#F@ literal 0 HcmV?d00001 diff --git a/src/main/java/plugins/fab/timestamp/Timestamp.java b/src/main/java/plugins/fab/timestamp/Timestamp.java new file mode 100644 index 0000000..e6d10a7 --- /dev/null +++ b/src/main/java/plugins/fab/timestamp/Timestamp.java @@ -0,0 +1,26 @@ +package plugins.fab.timestamp; + +import icy.gui.frame.progress.ToolTipFrame; +import icy.plugin.abstract_.PluginActionable; +import icy.sequence.Sequence; + +public class Timestamp extends PluginActionable +{ + + // IcyFrame mainFrame ; + + @Override + public void run() + { + new ToolTipFrame("<html>" + "<b>TimeStamp added.</b>" + "<br>" + + "<br>Place your cursor over the TimeStamp's text and type one of the following letters to change the display:" + + "<br>" + "<li> t : switch from frame to time (using time scale) display" + + "<li> +/- : increase / decrease font size" + "<li> m : move time stamp to cursor location" + + "<li> k : remove time stamp" + "</html>"); + + final Sequence sequence = getActiveSequence(); + + if (sequence != null) + sequence.addOverlay(new TimeStampOverlay(sequence)); + } +} -- GitLab