# HG changeset patch # User Laman # Date 2018-12-07 16:58:56 # Node ID 5a1d87ee0f8ae36bd0fb98e898e67b3758ec05b1 # Parent f4097dbb37577fc91463137b1ee4182963d91e69 splitting setup mode and recording mode diff --git a/src/core.py b/src/core.py --- a/src/core.py +++ b/src/core.py @@ -47,8 +47,12 @@ class Core: self._imgIndex=(self._imgIndex+step)%len(self._imgs) imgPath=os.path.join(cfg.misc.imgDir,self._imgs[self._imgIndex]) self._frame=PIL.Image.open(imgPath) - self._guiMessages.send("setCurrentFrame",(self._frame.copy(),)) - self.analyze() + self._guiMessages.send("setCurrentFrame",(self._frame.copy(),gui.PREVIEW)) + self.preview() + + def preview(self): + if self.detector.analyze(self._frame): + self._guiMessages.send("setGameState", (self.detector.board,[])) def analyze(self): if self.detector.analyze(self._frame): diff --git a/src/gui/__init__.py b/src/gui/__init__.py --- a/src/gui/__init__.py +++ b/src/gui/__init__.py @@ -8,6 +8,9 @@ from .settings import Settings class GUI: + SETUP=PREVIEW=0 + RECORDING=REAL=1 + def __init__(self): self.root = tk.Tk() self.root.title("OneEye {0}.{1}.{2}".format(*config.misc.version)) @@ -16,16 +19,20 @@ class GUI: self._ownMessages=None self._coreMessages=None + self._state=GUI.SETUP + self.mainWindow = MainWindow(self, master=self.root) self.root.columnconfigure(0,weight=1) self.root.rowconfigure(0,weight=1) self.root.bind("<>", lambda e: self.mainWindow.redrawImgView()) - self.root.bind("",lambda e: self.sendMsg("prevFrame")) - self.root.bind("",lambda e: self.sendMsg("nextFrame")) + self.root.bind("<>", lambda e: self.setUp()) + self.root.bind("<>", lambda e: self.setRecording()) self.root.bind("",lambda e: Settings(self)) self.mainWindow.bind("",lambda e: self._ownMessages.send("!kill",("gui",))) + self.setUp() + def __call__(self,ownMessages,coreMessages): self._ownMessages=ownMessages self._coreMessages=coreMessages @@ -38,13 +45,24 @@ class GUI: def sendMsg(self,actionName,args=tuple(),kwargs=None): self._coreMessages.send(actionName,args,kwargs) + def setUp(self): + self.mainWindow.setUp() + self.root.bind("",lambda e: self.sendMsg("prevFrame")) + self.root.bind("",lambda e: self.sendMsg("nextFrame")) + + def setRecording(self): + self.mainWindow.setRecording() + self.root.bind("",lambda e: None) + self.root.bind("",lambda e: None) + def _handleEvent(self,e): actions={"setCurrentFrame":self._frameHandler, "setGameState":self._stateHandler} (actionName,args,kwargs)=e return actions[actionName](*args,**kwargs) - def _frameHandler(self,newFrame): + def _frameHandler(self,newFrame,type): + if self._state!=type: return self.mainWindow.setCurrentFrame(newFrame) self.root.event_generate("<>") @@ -53,3 +71,18 @@ class GUI: self.mainWindow.boardView.redrawState(gameState,labels) gui=GUI() + +""" +# setup # +* we can click around the ImgView +* we can walk through the frames back and forth +* BoardView is showing what the reading of ImgView _would_ be +* core is reading and analyzing frames, pushing results to StateBag, but not showing them + +# recording # +* ImgView is showing the current picture, is not clickable +* BoardView is showing last detected position +* on switch to recording (if parameters have changed): + * feed analyzer new parameters and start using them + * in the background reanalyze cached frames with the new parameters and merge them into StateBag +""" diff --git a/src/gui/imgview.py b/src/gui/imgview.py --- a/src/gui/imgview.py +++ b/src/gui/imgview.py @@ -75,6 +75,12 @@ class ImgView(ResizableCanvas): self.create_line(x-3,y-3,x+4,y+4,fill="#00ff00") self.create_line(x-3,y+3,x+4,y-4,fill="#00ff00") + def setUp(self): + self.bind('<1>',lambda e: self.addCorner(e.x,e.y)) + + def setRecording(self): + self.bind('<1>',lambda e: None) + def _onResize(self,event): w=self._width super()._onResize(event) diff --git a/src/gui/mainwindow.py b/src/gui/mainwindow.py --- a/src/gui/mainwindow.py +++ b/src/gui/mainwindow.py @@ -5,6 +5,7 @@ from .util import MsgMixin from .menu import MainMenu from .boardview import BoardView from .imgview import ImgView +from .statusbar import StatusBar class MainWindow(tk.Frame,MsgMixin): @@ -38,9 +39,22 @@ class MainWindow(tk.Frame,MsgMixin): self.columnconfigure(1,weight=1) self.rowconfigure(0,weight=1) + self._statusBar=StatusBar(self) + self._statusBar.grid(column=0,row=1,columnspan=2,sticky=(S,E,W)) + + self.rowconfigure(1,weight=0) + # render everything self.imgView.redraw() ## Redraws the current image and its overlay. def redrawImgView(self): self.imgView.redraw() + + def setUp(self): + self._statusBar.setUp() + self.imgView.setUp() + + def setRecording(self): + self._statusBar.setRecording() + self.imgView.setRecording() diff --git a/src/gui/statusbar.py b/src/gui/statusbar.py new file mode 100644 --- /dev/null +++ b/src/gui/statusbar.py @@ -0,0 +1,24 @@ +import tkinter as tk +from tkinter import LEFT,DISABLED,NORMAL + + +class StatusBar(tk.Frame): + def __init__(self,parent): + super().__init__(parent,width=480,height=20,borderwidth=1,relief="sunken") + self._parent=parent + self._createWidgets() + + def _createWidgets(self): + self._setupButton=tk.Button(self,text="[] Set up",command=lambda: self.event_generate("<>"),state=DISABLED) + self._setupButton.pack(side=LEFT) + + self._recordButton=tk.Button(self,text="> Record",command=lambda: self.event_generate("<>")) + self._recordButton.pack(side=LEFT) + + def setUp(self): + self._setupButton.config(state=DISABLED) + self._recordButton.config(state=NORMAL) + + def setRecording(self): + self._setupButton.config(state=NORMAL) + self._recordButton.config(state=DISABLED)