Initial revision
diff --git a/Lib/lib-stdwin/StripChart.py b/Lib/lib-stdwin/StripChart.py
new file mode 100644
index 0000000..2021cc4
--- /dev/null
+++ b/Lib/lib-stdwin/StripChart.py
@@ -0,0 +1,67 @@
+# Module 'StripChart'
+
+
+import rect
+from Buttons import *
+from Resize import *
+
+
+class StripChart() = LabelAppearance(), NoReactivity(), NoResize():
+ #
+ def define(self, (win, bounds, scale)):
+ self.init_appearance(win, bounds)
+ self.init_reactivity()
+ self.init_resize()
+ self.ydata = []
+ self.scale = scale
+ self.resetbounds()
+ return self
+ #
+ def setbounds(self, bounds):
+ LabelAppearance.setbounds(self, bounds)
+ self.resetbounds()
+ #
+ def resetbounds(self):
+ (left, top), (right, bottom) = self.bounds
+ self.width = right-left
+ self.height = bottom-top
+ excess = len(self.ydata) - self.width
+ if excess > 0:
+ del self.ydata[:excess]
+ elif excess < 0:
+ while len(self.ydata) < self.width:
+ self.ydata.insert(0, 0)
+ #
+ def append(self, y):
+ self.ydata.append(y)
+ excess = len(self.ydata) - self.width
+ if excess > 0:
+ del self.ydata[:excess]
+ if not self.limbo:
+ self.win.scroll(self.bounds, (-excess, 0))
+ if not self.limbo:
+ (left, top), (right, bottom) = self.bounds
+ i = len(self.ydata)
+ area = (left+i-1, top), (left+i, bottom)
+ self.draw(self.win.begindrawing(), area)
+ #
+ def draw(self, (d, area)):
+ self.limbo = 0
+ area = rect.intersect(area, self.bounds)
+ if area = rect.empty:
+ return
+ d.cliprect(area)
+ d.erase(self.bounds)
+ (a_left, a_top), (a_right, a_bottom) = area
+ (left, top), (right, bottom) = self.bounds
+ height = bottom - top
+ i1 = a_left - left
+ i2 = a_right - left
+ for i in range(max(0, i1), min(len(self.ydata), i2)):
+ split = bottom-self.ydata[i]*height/self.scale
+ d.paint((left+i, split), (left+i+1, bottom))
+ if not self.enabled:
+ self.flipenable(d)
+ if self.hilited:
+ self.fliphilite(d)
+ d.noclip()