diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..668d3a0 Binary files /dev/null and b/icon.png differ diff --git a/panel.py b/panel.py new file mode 100644 index 0000000..1a80e87 --- /dev/null +++ b/panel.py @@ -0,0 +1,91 @@ +from random import random +import wx + +from slic.gui.widgets import LabeledMathEntry +from slic.gui.widgets import make_filled_hbox, make_filled_vbox +from slic.gui.widgets.plotting import PlotPanel + + +class MainPanel(wx.Panel): + + def __init__(self, parent): + super().__init__(parent) + + self.beans = [] + self.spilled = [] + + btn_minus = wx.Button(self, label="-") + btn_plus = wx.Button(self, label="+") + btn_check = wx.Button(self, label="?") + + btns = (btn_minus, btn_plus, btn_check) + hb_btns = make_filled_hbox(btns) + + self.le_beans = le_beans = LabeledMathEntry(self, label="How many beans?", value=0) + self.le_spilled = le_spilled = LabeledMathEntry(self, label="Spilled beans:", value=0) + le_spilled.Disable() + + self.plot_beans = plot_beans = PlotPanel(self) + self.plot_spilled = plot_spilled = PlotPanel(self) + + plots = (plot_beans, plot_spilled) + hb_plots = make_filled_hbox(plots) + + widgets = (hb_btns, le_beans, le_spilled, hb_plots) + box = make_filled_vbox(widgets, border=10) + self.SetSizerAndFit(box) + + btn_minus.Bind(wx.EVT_BUTTON, self.on_click_minus) + btn_plus.Bind(wx.EVT_BUTTON, self.on_click_plus) + btn_check.Bind(wx.EVT_BUTTON, self.on_click_check) + + + + def on_click_minus(self, _event): + le = self.le_beans + current = le.GetValue() + le.SetValue(current - 1) + self.update_plot() + + def on_click_plus(self, _event): + if random() < 0.9: + le = self.le_beans + else: + le = self.le_spilled + current = le.GetValue() or 0 + le.SetValue(current + 1) + self.update_plot() + + def on_click_check(self, _event): + percent = self.get_percentage() + msg = f"You spilled {percent:.2}% of the beans." + self.le_beans.SetValue(0) + self.le_spilled.SetValue(0) + wx.MessageBox(msg, "Spillage Stats", wx.OK|wx.ICON_WARNING) + + def get_percentage(self): + b = self.le_beans.GetValue() or 0 + s = self.le_spilled.GetValue() or 0 + return s / b * 100 + + + def update_plot(self): + self.store_values() + self.draw_plot() + + def store_values(self): + b = self.le_beans.GetValue() or 0 + s = self.le_spilled.GetValue() or 0 + self.beans.append(b) + self.spilled.append(s) + + def draw_plot(self): + self.plot_beans.clear() + self.plot_spilled.clear() + self.plot_beans.plot(self.beans) + self.plot_spilled.plot(self.spilled) + self.plot_beans.draw() + self.plot_spilled.draw() + + + diff --git a/start.py b/start.py new file mode 100755 index 0000000..5cef6d7 --- /dev/null +++ b/start.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python + +import os +import wx + +from slic.gui.persist import Persistence + +from panel import MainPanel + + +def run(*args, **kwargs): + app = wx.App() + frame = MainFrame(*args, **kwargs) + frame.Show() + app.MainLoop() + app.Yield() #TODO: without this, wxPython segfaults locking a mutex + + +def get_wx_icon(fname="icon.png"): + iname = os.path.dirname(__file__) + iname = os.path.join(iname, fname) + return wx.Icon(iname) + + + +class MainFrame(wx.Frame): + + def __init__(self, title="Coffee 365"): + super().__init__(None, title=title) + self.SetIcon(get_wx_icon()) + + main = MainPanel(self) + + # make sure the window is large enough + sizer = wx.BoxSizer(wx.VERTICAL) + sizer.Add(main, proportion=1, flag=wx.EXPAND) + self.SetSizerAndFit(sizer) + + self.persist = persist = Persistence(".coffee365", self) + persist.load() + + self.Bind(wx.EVT_CLOSE, self.on_close) + + + def on_close(self, event): + self.persist.save() + event.Skip() # forward the close event + + + +if __name__ == "__main__": + run() + + +