Implémentation plus propre avec une sous-classe de Sprite.
[minwii.git] / src / minwii / logapp.py
index 950a478..e03f451 100755 (executable)
@@ -6,15 +6,17 @@ $Id$
 $URL$
 """
 
 $URL$
 """
 
+import os
+os.environ['WINWII_NO_LOG'] = '1'
 from Tkinter import *
 import tkFileDialog
 from glob import glob
 from Tkinter import *
 import tkFileDialog
 from glob import glob
-import os
 from os.path import join as pjoin
 from os.path import basename
 from os.path import getsize
 import os.path
 from minwii.loganalyse import LogFileAnalyser
 from os.path import join as pjoin
 from os.path import basename
 from os.path import getsize
 import os.path
 from minwii.loganalyse import LogFileAnalyser
+from minwii.config import LOGS_DIR
 from pprint import pprint
 
 class Application(Frame) :
 from pprint import pprint
 
 class Application(Frame) :
@@ -24,10 +26,11 @@ class Application(Frame) :
         self.createWidgets()
         self.logDir = ''
         self.logFiles = []
         self.createWidgets()
         self.logDir = ''
         self.logFiles = []
+        self.currentFilePath = ''
         self.resultsFrame = None
         
         self.resultsFrame = None
         
-        # debug
-        #self.chooseDirDialog(dir='/Users/pinbe/minwii_logs')
+        if os.path.exists(LOGS_DIR) :
+            self.chooseDirDialog(dir=LOGS_DIR)
     
     def configureStretching(self) :
         top=self.winfo_toplevel()
     
     def configureStretching(self) :
         top=self.winfo_toplevel()
@@ -100,12 +103,14 @@ class Application(Frame) :
     def loadLogFile(self, nav) :
         index = nav.index - 1
         filepath = self.logFiles[index]
     def loadLogFile(self, nav) :
         index = nav.index - 1
         filepath = self.logFiles[index]
-        filename = basename(filepath)
-        self.identFrame.setFileName(filename)
+        self.currentFilePath = filepath
+        lfa = LogFileAnalyser(self.currentFilePath)
+        self.identFrame.refresh(lfa)
         if self.resultsFrame :
             self.resultsFrame.destroy()
         if self.resultsFrame :
             self.resultsFrame.destroy()
-        self.resultsFrame = ResultsFrame(self.dataFrame, filepath)
-        self.resultsFrame.layResults()
+        self.resultsFrame = ResultsFrame(self.dataFrame)
+        self.resultsFrame.layResults(lfa)
+        lfa.close()
         self.resultsFrame.grid()
 
 
         self.resultsFrame.grid()
 
 
@@ -169,10 +174,18 @@ class Identification(Frame) :
     def __init__(self, master=None) :
         Frame.__init__(self, master)
         self.fileName = StringVar()
     def __init__(self, master=None) :
         Frame.__init__(self, master)
         self.fileName = StringVar()
+        self.hid = StringVar()
+        self.patientName = StringVar()
         self.createWidgets()
     
         self.createWidgets()
     
-    def setFileName(self, name) :
-        self.fileName.set(name)
+    def refresh(self, lfa) :
+        filename = basename(lfa.logfile.name)
+        self.fileName.set(filename)
+        self.hid.set(lfa.getHID())
+        metadata = lfa.getMetadata()
+        self.patientName.set(metadata.get('PatientName', ''))
+        self.commentsText.delete(1.0, END)
+        self.commentsText.insert(1.0, metadata.get('Comments', ''))
     
     def createWidgets(self) :
         fileLbl = Label(self, text='Fichier :')
     
     def createWidgets(self) :
         fileLbl = Label(self, text='Fichier :')
@@ -181,40 +194,79 @@ class Identification(Frame) :
         fileNameLbl = Label(self, textvariable=self.fileName)
         fileNameLbl.grid(row=0, column=1, sticky=W)
         
         fileNameLbl = Label(self, textvariable=self.fileName)
         fileNameLbl.grid(row=0, column=1, sticky=W)
         
+        hidLbl = Label(self, text='HID :')
+        hidLbl.grid(row=1, column=0, sticky=E)
+        
+        hidNameLbl = Label(self, textvariable=self.hid)
+        hidNameLbl.grid(row=1, column=1, sticky=W)
+        
         nameLbl = Label(self, text='Patient :')
         nameLbl = Label(self, text='Patient :')
-        nameLbl.grid(row=1, column=0, sticky=E)
+        nameLbl.grid(row=2, column=0, sticky=E)
         
         
-        self.nameEntry = Entry(self, width=40)
-        self.nameEntry.grid(row=1, column=1, sticky=W)
+        self.nameEntry = Entry(self, width=40, textvariable=self.patientName)
+        self.nameEntry.grid(row=2, column=1, sticky=W)
         
         commentsLbl = Label(self, text='Commentaires :')
         
         commentsLbl = Label(self, text='Commentaires :')
-        commentsLbl.grid(row=2, column=0, sticky=E)
+        commentsLbl.grid(row=3, column=0, sticky=E)
         
         self.commentsText = Text(self, width=40, height=4, undo=True, wrap=WORD)
         
         self.commentsText = Text(self, width=40, height=4, undo=True, wrap=WORD)
-        self.commentsText.grid(row=2, column=1, sticky=W)
+        self.commentsText.grid(row=3, column=1, sticky=W)
+        
+        self.saveBtn = Button(self, text='Enregistrer', command=self.saveMetadata)
+        self.saveBtn.grid(row=4, column=1, sticky=E)
+    
+    def saveMetadata(self):
+        app = self.master.master
+        filepath = app.currentFilePath
+        lfa = LogFileAnalyser(filepath, mode='r+')
+        patientName = '%s\n' % self.nameEntry.get().replace('\n', ' ').strip()
+        comments = '%s\n' % self.commentsText.get(1.0, END).replace('\n', ' ').strip()
+        metadata = (('PatientName', self.nameEntry.get()),
+                    ('Comments', comments))
+        lfa.setMetadata(metadata)
+
 
 class ResultsFrame(Frame) :
 
 class ResultsFrame(Frame) :
-    def __init__(self, master, logFilePath) :
-        Frame.__init__(self, master)
-        self.logFilePath = logFilePath
     
     
-    def layResults(self) :
-        lfa = LogFileAnalyser(self.logFilePath)
+    def layResults(self, lfa) :
         results = lfa.analyse()
         if results :
         results = lfa.analyse()
         if results :
-            for i, kv in enumerate(results) :
-                k, v = kv
+            for i, kvt in enumerate(results) :
+                k, v, timeBased = kvt
                 kl = Label(self, text='%s :' % k)
                 kl.grid(row=i, column=0, sticky=E)
                 kl = Label(self, text='%s :' % k)
                 kl.grid(row=i, column=0, sticky=E)
-            
-                vl = Label(self, text=v)
-                vl.grid(row=i, column=1, sticky=W)
+
+                if not timeBased :
+                    vl = Label(self, text=v)
+                    vl.grid(row=i, column=1, sticky=W)
+                else :
+                    maxv = max(v)
+                    if maxv :
+                        cw, ch = 200, 100
+                        c = Canvas(self, background='#fff', width=cw, height=ch)
+                        rectW = int(float(cw) / len(v))
+                        unitRectH = float(ch) / maxv
+                        for j, fv in enumerate(v) :
+                            if not fv : continue
+                            x0 = j * rectW
+                            y0 = ch - int(unitRectH * fv)
+                            x1 = (j + 1) * rectW
+                            y1 = ch
+                            c.create_rectangle(x0, y0, x1, y1, fill="#9085ba")
+                        c.grid(row=i, column=1, sticky=W)
+                            
+                    else :
+                        vl = Label(self, text='—')
+                        vl.grid(row=i, column=1, sticky=W)
         else :
             msg = Label(self, text="Pas de données exploitables.")
             msg.grid()
             
         
         else :
             msg = Label(self, text="Pas de données exploitables.")
             msg.grid()
             
         
+def main() :
+    app = Application()
+    app.master.title("Analyseur des sessions MINDs")
+    app.mainloop()
 
 
-app = Application()
-app.master.title("Analyseur des sessions MINWii")
-app.mainloop()
+if __name__ == '__main__' :
+    main()
\ No newline at end of file