Ajout d'une option pour afficher / masquer les noms de notes en bas du clavier.
[minwii.git] / src / minwii / logapp.py
index 950a478..eb59267 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 MINWii")
+    app.mainloop()
 
 
-app = Application()
-app.master.title("Analyseur des sessions MINWii")
-app.mainloop()
+if __name__ == '__main__' :
+    main()
\ No newline at end of file