Simulation can now be slowed and paused
[Mograsim.git] / plugins / net.mograsim.logic.core / src / net / mograsim / logic / core / timeline / PauseableTimeFunction.java
1 package net.mograsim.logic.core.timeline;
2
3 import java.util.function.LongSupplier;
4
5 public class PauseableTimeFunction implements LongSupplier
6 {
7         private boolean paused = false;
8         private long unpausedSysTime = 0, lastPausedInternalTime = 0;
9         private int speedPercentage = 100;
10
11         public void pause()
12         {
13                 if (!paused)
14                 {
15                         lastPausedInternalTime = getAsLong();
16                         paused = true;
17                 }
18         }
19
20         public void unpause()
21         {
22                 if (paused)
23                 {
24                         paused = false;
25                         unpausedSysTime = System.currentTimeMillis();
26                 }
27         }
28
29         @Override
30         public long getAsLong()
31         {
32                 return paused ? lastPausedInternalTime
33                                 : lastPausedInternalTime + ((System.currentTimeMillis() - unpausedSysTime) * speedPercentage) / 100;
34         }
35
36         public void setSpeedPercentage(int percentage)
37         {
38                 if (!paused)
39                 {
40                         pause();
41                         unpause();
42                 }
43                 this.speedPercentage = Integer.min(100, Integer.max(percentage, 1));
44         }
45
46         public boolean isPaused()
47         {
48                 return paused;
49         }
50
51         public void toggle()
52         {
53                 if (paused)
54                         unpause();
55                 else
56                         pause();
57         }
58 }