~lesuisse-dev/joliebulle/outil-alcool

« back to all changes in this revision

Viewing changes to dist/joliebulle-2.6/main.py

  • Committer: 314r
  • Date: 2012-09-07 16:52:04 UTC
  • Revision ID: contact.314r@gmail.com-20120907165204-8ipxnnwcw7hmjayy
correction setup.py

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/python3
2
 
#­*­coding: utf­8 -­*­
3
 
 
4
 
 
5
 
 
6
 
#JolieBulle 2.6
7
 
#Copyright (C) 2010-2012 Pierre Tavares
8
 
 
9
 
#This program is free software; you can redistribute it and/or
10
 
#modify it under the terms of the GNU General Public License
11
 
#as published by the Free Software Foundation; either version 3        
12
 
#of the License, or (at your option) any later version.
13
 
 
14
 
#This program is distributed in the hope that it will be useful,
15
 
#but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 
#GNU General Public License for more details.
18
 
 
19
 
#You should have received a copy of the GNU General Public License
20
 
#along with this program; if not, write to the Free Software
21
 
#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
 
 
23
 
 
24
 
 
25
 
import os
26
 
from sys import platform
27
 
import PyQt4
28
 
import sys
29
 
from PyQt4 import QtGui
30
 
from PyQt4 import QtCore
31
 
from reader import *
32
 
from settings import *
33
 
from export import *
34
 
from exportHTML import *
35
 
from base import *
36
 
from importMashXml import *
37
 
from editgrain import *
38
 
from edithoublon import *
39
 
from editdivers import * 
40
 
from editlevures import *
41
 
from outilDens import *
42
 
from outilAlc import *
43
 
from outilDilution import *
44
 
from outilEvaporation import *
45
 
from outilPaliers import * 
46
 
from stepEditWindow import *
47
 
from mashEditWindow import *
48
 
from exportMash import *
49
 
from preferences import *
50
 
from brewCalc import *
51
 
from stepAdjustWindow import *
52
 
from globals import *
53
 
 
54
 
 
55
 
 
56
 
 
57
 
import xml.etree.ElementTree as ET
58
 
 
59
 
class IngDelegate(QtGui.QItemDelegate):
60
 
    def __init__(self, parent=None):
61
 
        QtGui.QItemDelegate.__init__(self, parent)
62
 
    def createEditor(self, parent, option, index) :  
63
 
        #return editor
64
 
        pass
65
 
    def setEditorData(self, spinBox, index):
66
 
        pass
67
 
    def setModelData(self, spinBox, model, index):
68
 
        pass
69
 
    def updateEditorGeometry(self, editor, option, index):
70
 
        editor.setGeometry(option.rect)
71
 
 
72
 
class AmountDelegate(QtGui.QItemDelegate):
73
 
    def __init__(self, parent=None):
74
 
            QtGui.QItemDelegate.__init__(self, parent)
75
 
 
76
 
 
77
 
    def createEditor(self, parent, option, index) :
78
 
        self.listeF = AppWindow()
79
 
        i=self.listeF.nbreFer
80
 
        h=self.listeF.nbreHops
81
 
        m=self.listeF.nbreDivers
82
 
 
83
 
        row=index.row()
84
 
        if row < i+h+m:
85
 
            editor = QtGui.QLineEdit(parent)
86
 
            #editor.setMinimum(0)
87
 
            #editor.setMaximum(20000)
88
 
            editor.installEventFilter(self)
89
 
 
90
 
            return editor
91
 
 
92
 
    def setEditorData(self, lineEdit, index):
93
 
        value= int(index.model().data(index, QtCore.Qt.DisplayRole))
94
 
 
95
 
        lineEdit.setText(str(value))
96
 
        #spinBox.setSuffix(" g")
97
 
 
98
 
    def setModelData(self, lineEdit, model, index):
99
 
        #spinBox.interpretText()
100
 
        champs =lineEdit.text()
101
 
        a = champs.rfind(" ")
102
 
        if a > 0 :
103
 
            if champs[a+1:] == "g" :
104
 
                value = int(champs[:a])
105
 
            if champs[a+1:] == "kg" :
106
 
                value = (float(champs[:a])) * 1000
107
 
            if champs[a+1:] == "oz" : 
108
 
                value = int((float(champs[:a])) * 28.349)
109
 
            if champs[a+1:] == "lb" : 
110
 
                value = int((float(champs[:a])) * 453.59237)             
111
 
        else :
112
 
            value = int(lineEdit.text())        
113
 
        #value = int(lineEdit.text())
114
 
        model.setData(index, value)
115
 
        
116
 
 
117
 
        self.emit( QtCore.SIGNAL( "pySig"))
118
 
        
119
 
        
120
 
    def updateEditorGeometry(self, editor, option, index):
121
 
        editor.setGeometry(option.rect)
122
 
        
123
 
        
124
 
class TimeDelegate(QtGui.QItemDelegate):
125
 
    def __init__(self, parent=None):
126
 
            QtGui.QItemDelegate.__init__(self, parent)
127
 
            
128
 
 
129
 
    def createEditor(self, parent, option, index) :
130
 
 
131
 
        #le nombre d'ingredients fermentescibles pour lesquels on ne prend pas en compte le temps d'ebullition
132
 
        self.listeF = AppWindow()
133
 
        i=self.listeF.nbreFer
134
 
        h=self.listeF.nbreHops
135
 
        m=self.listeF.nbreDivers
136
 
 
137
 
        row=index.row()
138
 
        if row > i-1 and row < i+h+m:
139
 
            editor = QtGui.QSpinBox(parent)
140
 
            editor.setMinimum(0)
141
 
            editor.setMaximum(20000)
142
 
            editor.installEventFilter(self)
143
 
 
144
 
            return editor
145
 
 
146
 
    def setEditorData(self, spinBox, index):
147
 
        value= int(index.model().data(index, QtCore.Qt.DisplayRole))
148
 
        
149
 
        spinBox.setValue(value)
150
 
        spinBox.setSuffix(" min")
151
 
 
152
 
    def setModelData(self, spinBox, model, index):
153
 
        spinBox.interpretText()
154
 
        value = spinBox.value()
155
 
        
156
 
        #model.setData(index, QtCore.QVariant(value))
157
 
        model.setData(index, value)
158
 
        self.emit( QtCore.SIGNAL( "pySig"))
159
 
                            
160
 
    def updateEditorGeometry(self, editor, option, index):
161
 
        editor.setGeometry(option.rect)
162
 
    
163
 
 
164
 
class AlphaDelegate(QtGui.QItemDelegate):
165
 
    def __init__(self, parent=None):
166
 
            QtGui.QItemDelegate.__init__(self, parent)
167
 
            
168
 
 
169
 
    def createEditor(self, parent, option, index) :
170
 
        
171
 
        #le nombre d'ingredients fermentescibles pour lesquels on ne prend pas en compte les acides alpha
172
 
        self.listeF = AppWindow()
173
 
        i=self.listeF.nbreFer
174
 
        h=self.listeF.nbreHops
175
 
 
176
 
        row=index.row()
177
 
        if row > i-1 and row < i+h:
178
 
        
179
 
            editor = QtGui.QDoubleSpinBox(parent)
180
 
            editor.setMinimum(0)
181
 
            editor.setMaximum(20000)
182
 
            editor.installEventFilter(self)
183
 
            return editor
184
 
        else :
185
 
            pass
186
 
        
187
 
 
188
 
    def setEditorData(self, spinBox, index):
189
 
        value= float(index.model().data(index, QtCore.Qt.DisplayRole))
190
 
 
191
 
        spinBox.setValue(value)
192
 
        spinBox.setSuffix(" %")
193
 
 
194
 
    def setModelData(self, spinBox, model, index):
195
 
        spinBox.interpretText()
196
 
        value = spinBox.value()
197
 
        
198
 
        
199
 
        model.setData(index, value)
200
 
        self.emit( QtCore.SIGNAL( "pySig"))
201
 
                            
202
 
    def updateEditorGeometry(self, editor, option, index):
203
 
        editor.setGeometry(option.rect)
204
 
 
205
 
class ComboBoxDelegate(QtGui.QItemDelegate):
206
 
 
207
 
 
208
 
    def __init__(self, parent = None):
209
 
 
210
 
        QtGui.QItemDelegate.__init__(self, parent)
211
 
        
212
 
 
213
 
    def createEditor(self, parent, option, index):
214
 
        self.listeF = AppWindow()
215
 
        
216
 
 
217
 
        i=self.listeF.nbreFer
218
 
        h=self.listeF.nbreHops
219
 
        row=index.row()
220
 
        if row > i-1 and row < i+h :
221
 
            editor = QtGui.QComboBox( parent )
222
 
            editor.insertItem(0,self.trUtf8('Pellet'))
223
 
            editor.insertItem(1,self.trUtf8('Feuille'))
224
 
            editor.insertItem(2,self.trUtf8('Cône'))
225
 
        return editor
226
 
 
227
 
    def setEditorData( self, comboBox, index ):
228
 
        value = index.model().data(index, QtCore.Qt.DisplayRole)
229
 
        if value == self.trUtf8('Pellet') : 
230
 
            value = 0
231
 
        elif value == self.trUtf8('Cône') :
232
 
            value = 2
233
 
        else : 
234
 
            value = 1
235
 
    
236
 
        
237
 
        comboBox.setCurrentIndex(value)
238
 
        
239
 
    def setModelData(self, editor, model, index):
240
 
        
241
 
        value = editor.currentText()
242
 
        
243
 
        model.setData( index, value )
244
 
        self.emit( QtCore.SIGNAL( "pySig"))
245
 
    
246
 
 
247
 
    
248
 
 
249
 
    def updateEditorGeometry( self, editor, option, index ):
250
 
 
251
 
        editor.setGeometry(option.rect)
252
 
        
253
 
class UseDelegate(QtGui.QItemDelegate):
254
 
 
255
 
 
256
 
    def __init__(self, parent = None):
257
 
 
258
 
        QtGui.QItemDelegate.__init__(self, parent)
259
 
        
260
 
 
261
 
    def createEditor(self, parent, option, index):
262
 
        self.listeF = AppWindow()
263
 
        
264
 
 
265
 
        i=self.listeF.nbreFer
266
 
        h=self.listeF.nbreHops
267
 
        m = self.listeF.nbreDivers
268
 
        row=index.row()
269
 
        if row > i-1 and row < i+h :
270
 
            editor = QtGui.QComboBox( parent )
271
 
            editor.insertItem(0,self.trUtf8('Ébullition'))
272
 
            editor.insertItem(1,self.trUtf8('Dry Hop'))
273
 
            editor.insertItem(2,self.trUtf8('Empâtage'))
274
 
            editor.insertItem(3,self.trUtf8('Premier Moût'))
275
 
            editor.insertItem(4,self.trUtf8('Arôme'))
276
 
        if row >i+h-1 and row < i+h+m:
277
 
            editor = QtGui.QComboBox( parent )
278
 
            editor.insertItem(0,self.trUtf8('Ébullition'))
279
 
            editor.insertItem(1,self.trUtf8('Empâtage'))
280
 
            editor.insertItem(2,self.trUtf8('Primaire'))
281
 
            editor.insertItem(3,self.trUtf8('Secondaire'))
282
 
            editor.insertItem(4,self.trUtf8('Embouteillage'))
283
 
 
284
 
        return editor
285
 
 
286
 
    def setEditorData( self, comboBoxUse, index ):
287
 
        value = index.model().data(index, QtCore.Qt.DisplayRole)
288
 
        i=self.listeF.nbreFer
289
 
        h=self.listeF.nbreHops
290
 
        m = self.listeF.nbreDivers
291
 
        row=index.row()
292
 
        if row > i-1 and row < i+h :  
293
 
            if value == self.trUtf8('Ébullition') : 
294
 
                value = 0
295
 
            elif value == self.trUtf8('Dry Hop') :
296
 
                value = 1
297
 
            elif value == self.trUtf8('Empâtage') :
298
 
                value = 2        
299
 
            elif value == self.trUtf8('Premier Moût') :
300
 
                value = 3    
301
 
            elif value == self.trUtf8('Arôme') :
302
 
                value = 4
303
 
            else :
304
 
                value = 0 
305
 
                 
306
 
        elif row >i+h-1 and row < i+h+m : 
307
 
            if value == self.trUtf8('Ébullition') : 
308
 
                value = 0
309
 
            elif value == self.trUtf8('Empâtage') :
310
 
                value = 1
311
 
            elif value == self.trUtf8('Primaire') :
312
 
                value = 2        
313
 
            elif value == self.trUtf8('Secondaire') :
314
 
                value = 3    
315
 
            elif value == self.trUtf8('Embouteillage') :
316
 
                value = 4
317
 
            else :
318
 
                value = 0      
319
 
         
320
 
    
321
 
        
322
 
        comboBoxUse.setCurrentIndex(value)
323
 
        
324
 
    def setModelData(self, editor, model, index):
325
 
        
326
 
        value = editor.currentText()
327
 
        
328
 
        model.setData( index, value )
329
 
        self.emit( QtCore.SIGNAL( "pySig"))
330
 
    
331
 
 
332
 
    
333
 
 
334
 
    def updateEditorGeometry( self, editor, option, index ):
335
 
 
336
 
        editor.setGeometry(option.rect)
337
 
        
338
 
 
339
 
 
340
 
class AppWindow(QtGui.QMainWindow,Ui_MainWindow):
341
 
 
342
 
    nbreFer=0
343
 
    nbreHops=0
344
 
    nbreDivers=0
345
 
    
346
 
    
347
 
        
348
 
        
349
 
 
350
 
    def __init__(self, parent = None):
351
 
 
352
 
        
353
 
 
354
 
        QtGui.QMainWindow.__init__(self, parent)
355
 
        self.setupUi(self)
356
 
 
357
 
#####################################################################################################
358
 
#####################################################################################################
359
 
 
360
 
        # self.buttonLibrary=QtGui.QPushButton("Bibliothèque")
361
 
        # self.buttonLibrary.setCheckable(True)
362
 
        # self.buttonEditor=QtGui.QPushButton("Editeur")
363
 
        # self.buttonEditor.setCheckable(True)
364
 
        # self.buttonBrewday=QtGui.QPushButton("Brassage")
365
 
        # self.buttonBrewday.setCheckable(True)
366
 
 
367
 
        self.buttonMenu=QtGui.QPushButton("")
368
 
        self.buttonMenu.setIcon(QtGui.QIcon("Images/config.png"))
369
 
        self.buttonMenu.setIconSize(QtCore.QSize(24,24))
370
 
        self.buttonMenu.setFlat(True)
371
 
 
372
 
        self.buttonSave=QtGui.QPushButton("")
373
 
        self.buttonSave.setIcon(QtGui.QIcon("Images/save.png"))
374
 
        self.buttonSave.setIconSize(QtCore.QSize(24,24))
375
 
        self.buttonSave.setFlat(True)
376
 
        
377
 
 
378
 
        # left_spacer = QtGui.QWidget()
379
 
        # left_spacer.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
380
 
 
381
 
        right_spacer = QtGui.QWidget()
382
 
        right_spacer.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
383
 
 
384
 
        # monLayout=QtGui.QHBoxLayout()
385
 
 
386
 
        self.toolBar.addAction(self.actionVueBibliothequeToolBar)
387
 
        self.toolBar.addAction(self.actionVueEditeurToolBar)
388
 
        self.toolBar.addAction(self.actionBrewdayMode)
389
 
        # self.toolBar.addWidget(left_spacer)
390
 
        
391
 
        
392
 
        # monLayout.addWidget(self.buttonLibrary)
393
 
        # monLayout.addWidget(self.buttonEditor)
394
 
        # monLayout.addWidget(self.buttonBrewday)
395
 
 
396
 
        # self.widgetToolBar=QtGui.QWidget()
397
 
 
398
 
        # self.widgetToolBar.setLayout(monLayout)
399
 
 
400
 
        # self.toolBar.addWidget(self.widgetToolBar)
401
 
        self.toolBar.addWidget(right_spacer)
402
 
        self.toolBar.addWidget(self.buttonSave)
403
 
 
404
 
        self.toolBar.addWidget(self.buttonMenu)
405
 
 
406
 
       
407
 
        generalMenu = QtGui.QMenu()
408
 
        # le menu fichier
409
 
        menuFile=generalMenu.addMenu('''Fichier''')
410
 
        menuFile.addAction(self.actionOuvrir_2)
411
 
        menuFile.addAction(self.actionNouvelle_recette)
412
 
        menuFile.addAction(self.actionRecharger)
413
 
        menuFile.addAction(self.actionImprimer)
414
 
        menuFile.addAction(self.actionEnregistrer)
415
 
        menuFile.addAction(self.actionEnregistrer_Sous)
416
 
        menuFile.addAction(self.actionExporterHtml)
417
 
        menuFile.addAction(self.actionQuitter_2)
418
 
 
419
 
        # le menu ingredients
420
 
        menuIngredients=generalMenu.addMenu('''Ingrédients''')
421
 
        menuIngredients.addAction(self.actionEditGrains)
422
 
        menuIngredients.addAction(self.actionEditHoublons)
423
 
        menuIngredients.addAction(self.actionEditDivers)
424
 
        menuIngredients.addAction(self.actionEditLevures)
425
 
        menuIngredients.addAction(self.actionRestaurerIngredients)
426
 
 
427
 
        # le menu outils
428
 
        menuTools=generalMenu.addMenu('''Outils''')
429
 
        menuTools.addAction(self.actionCorrectionDens)
430
 
        menuTools.addAction(self.actionCalculAlc)
431
 
        menuTools.addAction(self.actionDilution)
432
 
        menuTools.addAction(self.actionEvaporation)
433
 
        menuTools.addAction(self.actionPaliers)
434
 
 
435
 
 
436
 
        generalMenu.addAction(self.actionPreferences)
437
 
        self.buttonMenu.setMenu(generalMenu)
438
 
 
439
 
######################################################################################
440
 
######################################################################################
441
 
 
442
 
 
443
 
 
444
 
 
445
 
 
446
 
 
447
 
 
448
 
        self.settings = Settings()
449
 
        self.initRep()
450
 
        self.dlgEditG = Dialog(self)
451
 
        self.dlgEditH = DialogH(self)
452
 
        self.dlgEditD = DialogD(self)
453
 
        self.dlgEditY = DialogL(self)
454
 
        self.dlgOutilDens = DialogOutilDens(self)
455
 
        self.dlgOutilAlc = DialogAlc(self)
456
 
        self.dlgOutilDilution = DialogDilution(self)
457
 
        self.dlgOutilEvaporation = DialogEvaporation(self)
458
 
        self.dlgOutilPaliers = DialogPaliers(self)
459
 
        self.dlgPref = DialogPref(self)
460
 
        self.dlgStep = DialogStep(self)
461
 
        self.dlgMash = DialogMash(self)
462
 
        self.dlgStepBrewday = DialogStepAdjust(self)
463
 
        self.base = ImportBase()
464
 
        self.mashProfilesBase = ImportMash()
465
 
        self.mashProfilesBase.importBeerXML()
466
 
        self.mashProfileExport = ExportMash()
467
 
        self.brewCalc = CalcBrewday()
468
 
        
469
 
        self.base.importBeerXML()
470
 
        self.s=0
471
 
        self.nbreLevures = 0
472
 
        
473
 
        self.baseStyleListe = [self.trUtf8('Générique'), '1A. Lite American Lager', '1B. Standard American Lager', '1C. Premium American Lager', '1D. Munich Helles', '1E. Dortmunder Export', '2A. German Pilsner (Pils)', '2B. Bohemian Pilsener', '2C. Classic American Pilsner', '3A. Vienna Lager', '3B. Oktoberfest/Märzen', '4A. Dark American Lager', '4B. Munich Dunkel', '4C. Schwarzbier (Black Beer)', '5A. Maibock/Helles Bock', '5B. Traditional Bock', '5C. Doppelbock', '5D. Eisbock', '6A. Cream Ale', '6B. Blonde Ale', '6C. Kölsch', '6D. American Wheat or Rye Beer', '7A. Northern German Altbier', '7B. California Common Beer', '7C. Düsseldorf Altbier', '8A. Standard/Ordinary Bitter', '8B. Special/Best/Premium Bitter', '8C. Extra Special/Strong Bitter (English Pale Ale)', '9A. Scottish Light 60/-', '9B. Scottish Heavy 70/-', '9C. Scottish Export 80/- ', '9D. Irish Red Ale', '9E. Strong Scotch Ale', '10A. American Pale Ale', '10B. American Amber Ale', '10C. American Brown Ale', '11A. Mild','11B. Southern English Brown', '11C. Northern English Brown Ale', '12A. Brown Porter', '12B. Robust Porter', '12C. Baltic Porter', '13A. Dry Stout', '13B. Sweet Stout', '13C. Oatmeal Stout', '13D. Foreign Extra Stout', '13E. American Stout', '13F. Russian Imperial Stout', '14A. English IPA', '14B. American IPA', '14C. Imperial IPA','15A. Weizen/Weissbier', '15B. Dunkelweizen', '15C. Weizenbock', '15D. Roggenbier (German Rye Beer)','16A. Witbier', '16B. Belgian Pale Ale', '16C. Saison', '16D. Bière de Garde', '16E. Belgian Specialty Ale', '17A. Berliner Weisse', '17B. Flanders Red Ale', '17C. Flanders Brown Ale/Oud Bruin', '17D. Straight (Unblended) Lambic', '17E. Gueuze', '17F. Fruit Lambic', '18A. Belgian Blond Ale', '18B. Belgian Dubbel', '18C. Belgian Tripel', '18D. Belgian Golden Strong Ale', '18E. Belgian Dark Strong Ale', '19A. Old Ale', '19B. English Barleywine', '19C. American Barleywine', '20. Fruit Beer', '21A. Spice, Herb, or Vegetable Beer', '21B. Christmas/Winter Specialty Spiced Beer', '22A. Classic Rauchbier', '22B. Other Smoked Beer', '22C. Wood-Aged Beer', '23. Specialty Beer', '24A. Dry Mead', '24B. Semi-sweet Mead', '24C. Sweet Mead', '25A. Cyser', '25B. Pyment', '25C. Other Fruit Melomel', '26A. Metheglin', '26B. Braggot', '26C. Open Category Mead', '27A. Common Cider', '27B. English Cider', '27C. French Cider', '27D. Common Perry', '27E. Traditional Perry', '28A. New England Cider', '28B. Fruit Cider', '28C. Applewine', '28D. Other Specialty Cider/Perry']
474
 
       
475
 
        self.typesList = ["Tout grain", "Extrait", "Partial mash"]
476
 
        #Les connections
477
 
        self.connect(self.actionOuvrir, QtCore.SIGNAL("triggered()"), self.ouvrir_clicked)
478
 
        self.connect(self.actionOuvrir_2, QtCore.SIGNAL("triggered()"), self.ouvrir_clicked)
479
 
        self.connect(self.actionNouvelle_recette, QtCore.SIGNAL("triggered()"), self.purge)
480
 
        self.connect(self.actionEnregistrer, QtCore.SIGNAL("triggered()"), self.enregistrer)
481
 
        self.connect(self.actionEnregistrerToolBar, QtCore.SIGNAL("triggered()"), self.enregistrer)
482
 
        self.connect(self.actionEnregistrer_Sous, QtCore.SIGNAL("triggered()"), self.enregistrerSous)
483
 
        self.connect(self.actionExporterHtml, QtCore.SIGNAL("triggered()"), self.exporterHtml)
484
 
        self.connect(self.actionRecharger, QtCore.SIGNAL("triggered()"), self.recharger)
485
 
        #self.connect(self.actionSwitch, QtCore.SIGNAL("triggered()"), self.switch)
486
 
        
487
 
        
488
 
        self.connect(self.actionEditGrains, QtCore.SIGNAL("triggered()"), self.editGrains)
489
 
        self.connect(self.actionEditHoublons, QtCore.SIGNAL("triggered()"), self.editHoublons)
490
 
        self.connect(self.actionEditDivers, QtCore.SIGNAL("triggered()"), self.editDivers)
491
 
        self.connect(self.actionEditLevures, QtCore.SIGNAL("triggered()"), self.editLevures)
492
 
        self.connect(self.actionRestaurerIngredients, QtCore.SIGNAL("triggered()"), self.restoreDataBase)
493
 
        
494
 
        self.connect(self.actionAbout, QtCore.SIGNAL("triggered()"), self.about)
495
 
        self.connect(self.actionCorrectionDens, QtCore.SIGNAL("triggered()"), self.outilDens)
496
 
        self.connect(self.actionCalculAlc, QtCore.SIGNAL("triggered()"), self.outilAlc)
497
 
        self.connect(self.actionDilution, QtCore.SIGNAL("triggered()"), self.outilDilution)
498
 
        self.connect(self.actionEvaporation, QtCore.SIGNAL("triggered()"), self.outilEvaporation)
499
 
        self.connect(self.actionPaliers, QtCore.SIGNAL("triggered()"), self.outilPaliers)
500
 
        self.connect(self.actionPreferences, QtCore.SIGNAL("triggered()"), self.dialogPreferences)
501
 
        
502
 
        self.spinBoxBoil.valueChanged.connect(self.unlockBrewdayMode)
503
 
        
504
 
        #Les vues
505
 
        #####################################################################################
506
 
        #####################################################################################
507
 
        self.connect(self.actionVueEditeur, QtCore.SIGNAL("triggered()"), self.switchToEditor)
508
 
        self.connect(self.actionVueBibliotheque, QtCore.SIGNAL("triggered()"), self.switchToLibrary)
509
 
        
510
 
        self.connect(self.actionVueEditeurToolBar, QtCore.SIGNAL("triggered()"), self.switchToEditor)
511
 
        self.connect(self.actionVueBibliothequeToolBar, QtCore.SIGNAL("triggered()"), self.switchToLibrary)
512
 
 
513
 
        self.connect(self.actionBrewdayMode,QtCore.SIGNAL("triggered()"),self.switchToBrewday)
514
 
 
515
 
        # self.connect(self.buttonEditor, QtCore.SIGNAL("clicked()"),self.switchToEditor)
516
 
        # self.connect(self.buttonLibrary, QtCore.SIGNAL("clicked()"), self.switchToLibrary)
517
 
        # self.connect(self.buttonBrewday, QtCore.SIGNAL("clicked()"), self.switchToBrewday)
518
 
 
519
 
        
520
 
        #############################################################################################
521
 
        #############################################################################################
522
 
        
523
 
        
524
 
        ##########################
525
 
        #Boutons notes
526
 
        ##########################
527
 
        self.pushButtonRecipeNotes.clicked.connect(self.recipeNotesClicked)
528
 
        self.buttonBoxRecipeNotes.accepted.connect(self.recipeNotesAccepted)
529
 
        self.buttonBoxRecipeNotes.rejected.connect(self.recipeNotesRejected)
530
 
        
531
 
        
532
 
        #############################################################################################
533
 
        self.connect(self.actionImprimer, QtCore.SIGNAL("triggered()"), self.printRecipe)
534
 
        
535
 
        self.connect(self.doubleSpinBoxRendemt, QtCore.SIGNAL("valueChanged(QString)"), self.rendemt_changed)
536
 
        self.connect(self.doubleSpinBox_2Volume, QtCore.SIGNAL("valueChanged(QString)"), self.volume_changed)
537
 
        self.connect(self.pushButtonAjouter_2, QtCore.SIGNAL("clicked()"), self.ajouterF)
538
 
        self.connect(self.pushButtonAjouterH, QtCore.SIGNAL("clicked()"), self.ajouterH)
539
 
        self.connect(self.pushButtonAjouterY, QtCore.SIGNAL("clicked()"), self.ajouterY)
540
 
        self.connect(self.pushButtonAjouterM, QtCore.SIGNAL("clicked()"), self.ajouterM)
541
 
        self.connect(self.pushButtonEnlever, QtCore.SIGNAL("clicked()"), self.enlever)
542
 
        self.connect(self.pushButtonChangerStyle, QtCore.SIGNAL("clicked()"), self.modifierStyle)
543
 
        self.connect(self.pushButtonVolMore, QtCore.SIGNAL("clicked()"), self.volMore)
544
 
        self.connect(self.doubleSpinBoxVolPre, QtCore.SIGNAL("valueChanged(QString)"), self.volPreCalc)
545
 
        
546
 
        
547
 
        self.connect(self.comboBoxStyle, QtCore.SIGNAL("currentIndexChanged(QString)"), self.addStyle)
548
 
        #self.connect(self.pushButtonEssai, QtCore.SIGNAL("clicked()"), self.essai)
549
 
        self.connect(self.comboBoxType, QtCore.SIGNAL("currentIndexChanged(QString)"), self.typeChanged)
550
 
        
551
 
        #######################################################################################################
552
 
        # Profil de brassage       #########################################################################################################
553
 
        self.pushButtonMashDetails.clicked.connect(self.mashDetails)
554
 
        self.listWidgetSteps.itemSelectionChanged.connect (self.stepDetails)
555
 
        self.listWidgetMashProfiles.itemSelectionChanged.connect (self.mashClicked)
556
 
        self.buttonBoxMashDetails.rejected.connect(self.mashRejected)
557
 
        self.buttonBoxMashDetails.accepted.connect(self.mashAccepted)
558
 
#        self.comboBoxStepType.addItems(["Infusion", "Température", "Décoction"])
559
 
        self.pushButtonStepEdit.clicked.connect(self.stepEdit)
560
 
        self.dlgStep.stepChanged.connect(self.stepReload)
561
 
        self.pushButtonStepRemove.clicked.connect(self.removeStep)
562
 
        self.pushButtonNewStep.clicked.connect(self.addStep)
563
 
        self.pushButtonMashEdit.clicked.connect(self.mashEdit)
564
 
        self.dlgMash.mashChanged.connect(self.mashReload)
565
 
        self.pushButtonNewProfile.clicked.connect(self.addMash)
566
 
        self.pushButtonRemoveProfile.clicked.connect(self.removeMash)
567
 
        
568
 
        
569
 
        self.popMashCombo()
570
 
        self.comboBoxMashProfiles.setCurrentIndex(-1)
571
 
        self.comboBoxMashProfiles.currentIndexChanged.connect(self.mashComboChanged)
572
 
 
573
 
        
574
 
        self.pushButtonSaveProfile.clicked.connect(self.saveProfile)
575
 
 
576
 
 
577
 
        
578
 
        #On connecte ici les signaux émits à la fermeture des fenêtres d'édition de la base
579
 
        #########################################################################################
580
 
        ##########################################################################################
581
 
        #self.connect(self.dlgEditG, QtCore.SIGNAL( "baseChanged"), self.baseReload)
582
 
        self.dlgEditG.baseChanged.connect(self.baseReload)
583
 
        self.dlgEditH.baseChanged.connect(self.baseReload)
584
 
        self.dlgEditD.baseChanged.connect(self.baseReload)
585
 
        self.dlgEditY.baseChanged.connect(self.baseReload)
586
 
        
587
 
        #Signal pour l'affichage du widget de modif des ingrédients
588
 
        self.pushButtonChangeIngredients.clicked.connect(self.displayIngredients) 
589
 
        
590
 
        
591
 
        #Les modeles et vues du widget central
592
 
        self.modele = QtGui.QStandardItemModel(0, 7)
593
 
        self.connect(self.modele, QtCore.SIGNAL("dataChanged(QModelIndex,QModelIndex)"), self.reverseMVC)
594
 
        
595
 
        liste_headers = [self.trUtf8("Ingrédients"),self.trUtf8("Quantité (g)"),self.trUtf8("Temps (min)"),self.trUtf8("Acide Alpha (%)"),self.trUtf8("Type"),self.trUtf8("Proportion"), self.trUtf8("Étape")]
596
 
        self.modele.setHorizontalHeaderLabels(liste_headers)
597
 
        
598
 
        
599
 
        
600
 
        self.deleg = AmountDelegate(self)
601
 
        self.tableViewF.setItemDelegateForColumn(1,self.deleg)
602
 
        self.connect(self.deleg, QtCore.SIGNAL( "pySig"), self.modeleProportion)
603
 
        
604
 
        
605
 
        
606
 
        self.delegT = TimeDelegate(self)
607
 
        self.tableViewF.setItemDelegateForColumn(2,self.delegT)
608
 
        self.connect(self.delegT, QtCore.SIGNAL( "pySig"), self.modeleProportion)
609
 
 
610
 
        self.delegA = AlphaDelegate(self)
611
 
        self.tableViewF.setItemDelegateForColumn(3,self.delegA)
612
 
        self.connect(self.delegA, QtCore.SIGNAL( "pySig"), self.modeleProportion)
613
 
        
614
 
        self.delegC = ComboBoxDelegate(self)
615
 
        self.tableViewF.setItemDelegateForColumn(4,self.delegC)  
616
 
        self.connect(self.delegC, QtCore.SIGNAL( "pySig"), self.modeleProportion)
617
 
        
618
 
        self.delegI = IngDelegate(self)
619
 
        self.tableViewF.setItemDelegateForColumn(0,self.delegI)
620
 
        self.tableViewF.setItemDelegateForColumn(5,self.delegI)
621
 
        
622
 
        self.delegUse = UseDelegate(self)
623
 
        self.tableViewF.setItemDelegateForColumn(6,self.delegUse)
624
 
        self.connect(self.delegUse, QtCore.SIGNAL( "pySig"), self.modeleProportion)
625
 
        
626
 
 
627
 
        self.tableViewF.setModel(self.modele)
628
 
        
629
 
        self.tableViewF.resizeColumnsToContents()
630
 
        self.tableViewF.setColumnWidth(0,250)
631
 
        self.tableViewF.setColumnWidth(1,150)
632
 
        self.tableViewF.setColumnWidth(3,150)
633
 
        self.tableViewF.setColumnWidth(4,150)
634
 
        self.tableViewF.setColumnWidth(6,150)
635
 
        
636
 
        #La bibliotheque
637
 
        ###################################################################################################################
638
 
        ###################################################################################################################
639
 
        self.modeleBiblio = QtGui.QFileSystemModel()
640
 
        self.modeleBiblio.setReadOnly(False)
641
 
        self.modeleBiblio.setRootPath(recettes_dir)
642
 
        
643
 
        # self.listViewBiblio.setModel(self.modeleBiblio)
644
 
        # self.listViewBiblio.setRootIndex(self.modeleBiblio.index(recettes_dir))
645
 
        # self.connect(self.listViewBiblio, QtCore.SIGNAL("doubleClicked(const QModelIndex &)"), self.selectionRecette)
646
 
        
647
 
        self.treeViewBiblio.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) 
648
 
        self.connect(self.treeViewBiblio, QtCore.SIGNAL("customContextMenuRequested(const QPoint &)"), self.menuBiblio)
649
 
        #self.listViewBiblio.setEditTriggers(QtGui.QAbstractItemView.SelectedClicked | QtGui.QAbstractItemView.AnyKeyPressed) 
650
 
 
651
 
 
652
 
        self.treeViewBiblio.setModel(self.modeleBiblio)
653
 
        self.treeViewBiblio.setRootIndex(self.modeleBiblio.index(recettes_dir))
654
 
        self.treeViewBiblio.setColumnHidden(1,True)
655
 
        self.treeViewBiblio.setColumnHidden(2,True)
656
 
        self.treeViewBiblio.setColumnHidden(3,True)
657
 
 
658
 
        # self.webViewBiblio.setHtml('''<html><p>hello world</p></html>''')
659
 
        self.connect(self.treeViewBiblio, QtCore.SIGNAL("doubleClicked(const QModelIndex &)"), self.selectionRecette2)
660
 
        self.connect(self.treeViewBiblio, QtCore.SIGNAL("clicked(const QModelIndex &)"), self.viewRecipeBiblio)
661
 
 
662
 
        self.pushButtonEditCurrentRecipe.clicked.connect(self.editCurrentRecipe)
663
 
 
664
 
        self.pushButtonRemoveRecipeBiblio.clicked.connect(self.supprimerBiblio)
665
 
        self.pushButtonNewFolderBiblio.clicked.connect(self.createFolder)
666
 
        self.pushButtonEditRecipeBiblio.clicked.connect(self.renommerBiblio)
667
 
 
668
 
 
669
 
 
670
 
 
671
 
 
672
 
        ############################################################################################################################
673
 
        ############################################################################################################################
674
 
        
675
 
        #Brewday Mode
676
 
        ###############################
677
 
        ###############################
678
 
              
679
 
        self.pushButtonAdjustStep.clicked.connect(self.stepAdjustBrewday)
680
 
        self.tableWidgetStepsBrewday.itemSelectionChanged.connect(self.tableWidgetStepsBrewday_currentRowChanged)
681
 
        self.dlgStepBrewday.stepAdjustBrewdayClosed.connect(self.stepAdjustBrewday_closed)
682
 
        self.radioButtonClassicBrew.toggled.connect(self.brewdayModeCalc)
683
 
 
684
 
 
685
 
 
686
 
        
687
 
        ##on cree un modele pour les ingredients dispo dans la base
688
 
        #self.modeleIngBase = QtGui.QStandardItemModel()
689
 
        ##la vue correspondante
690
 
        #self.treeViewIng.setModel(self.modeleIngBase)
691
 
        ##on va remplir tout ça... avec une autre fonction
692
 
        #self.listeIng()
693
 
        self.comboBox.addItems(self.base.liste_ingr)
694
 
        self.comboBox.setCurrentIndex(10)
695
 
        
696
 
        self.comboBoxH.addItems(self.base.liste_houblons)
697
 
        self.comboBoxH.setCurrentIndex(10)
698
 
        
699
 
        self.comboBoxY.addItems(self.base.liste_levuresDetail)
700
 
        self.comboBoxY.setCurrentIndex(10)
701
 
        
702
 
        self.comboBoxM.addItems(self.base.liste_divers)
703
 
        self.comboBoxM.setCurrentIndex(0)
704
 
        
705
 
        self.comboBoxStyle.hide()
706
 
        self.comboBoxStyle.addItems(self.baseStyleListe)
707
 
        
708
 
        self.comboBoxType.addItems(self.typesList)
709
 
        self.comboBoxType.setCurrentIndex(0)
710
 
 
711
 
        self.widgetVol.hide()
712
 
        
713
 
        self.nouvelle()
714
 
 
715
 
        self.widgetIngredients.hide()
716
 
 
717
 
 
718
 
        # print("argv:",sys.argv)
719
 
 
720
 
###################################################################################################
721
 
######## gestion des arguments au lancement du programme  #########################################
722
 
 
723
 
 
724
 
        argumentsList=QtGui.QApplication.arguments()
725
 
        if len(argumentsList) > 1 :
726
 
            print("la liste d'arguments:",argumentsList)
727
 
            print("le chemin:",argumentsList[1])
728
 
            # for part in argumentsList :
729
 
            #     recipePath=recipePath + " " + part
730
 
            try:
731
 
                recipePath= argumentsList[1]
732
 
                for part in argumentsList[2:] :
733
 
                    recipePath= recipePath +" " + part
734
 
                
735
 
                self.openRecipeFile(recipePath)
736
 
            except :
737
 
                pass
738
 
        else:
739
 
            pass
740
 
            
741
 
########################################################################################################################
742
 
####################################################################################################################
743
 
        
744
 
    #Une fonction qui gère l'aperçu des couleurs. 
745
 
    #Contient un tupple avec plusieurs références de couleurs, classées par rang selon la valeur SRM.
746
 
    #################################################################################################
747
 
    def colorPreview (self) :
748
 
        self.colorTuppleSrm = ('FFE699', 'FFD878', 'FFCA5A', 'FFBF42', 'FBB123', 'F8A600', 'F39C00', 'EA8F00', 'E58500', 'DE7C00', 'D77200', 'CF6900', 'CB6200', 'C35900','BB5100', 'B54C00', 'B04500', 'A63E00', 'A13700', '9B3200', '952D00', '8E2900', '882300', '821E00', '7B1A00', '771900', '701400', '6A0E00', '660D00','5E0B00','5A0A02','600903', '520907', '4C0505', '470606', '440607', '3F0708', '3B0607', '3A070B', '36080A')
749
 
        
750
 
        colorRef= round(self.EBC/1.97)
751
 
        
752
 
        if colorRef >= 30 :
753
 
            color = "#" + self.colorTuppleSrm[30]
754
 
        elif colorRef <= 1 :
755
 
            color = "#" + self.colorTuppleSrm[0]
756
 
        else :
757
 
            color = "#" + self.colorTuppleSrm[colorRef-1]
758
 
        self.widgetColor.setStyleSheet("background-color :" + color)
759
 
        
760
 
        
761
 
    def displayIngredients(self) :
762
 
        if self.pushButtonChangeIngredients.isChecked() :
763
 
            self.widgetIngredients.show()
764
 
        else :
765
 
            self.widgetIngredients.hide()
766
 
        
767
 
        
768
 
    #Une fonction qui recharge les combobox qd la base d'ingrédients a été modifiée. Pratique.
769
 
    #############################################################################################   
770
 
    def baseReload (self): 
771
 
        self.base.importBeerXML()
772
 
        
773
 
        self.comboBox.clear()
774
 
        self.comboBox.addItems(self.base.liste_ingr)
775
 
        self.comboBox.setCurrentIndex(10)
776
 
        
777
 
        self.comboBoxH.clear()
778
 
        self.comboBoxH.addItems(self.base.liste_houblons)
779
 
        self.comboBoxH.setCurrentIndex(10)
780
 
        
781
 
        self.comboBoxY.clear()
782
 
        self.comboBoxY.addItems(self.base.liste_levuresDetail)
783
 
        self.comboBoxY.setCurrentIndex(10)
784
 
        
785
 
        self.comboBoxM.clear()
786
 
        self.comboBoxM.addItems(self.base.liste_divers)
787
 
        self.comboBoxM.setCurrentIndex(0)
788
 
        
789
 
    def selectionRecette(self):
790
 
        selection = self.listViewBiblio.selectionModel()
791
 
        self.indexRecette = selection.currentIndex()
792
 
 
793
 
        if self.modeleBiblio.isDir(self.indexRecette) == True :
794
 
            self.navFolder()
795
 
        
796
 
        else :
797
 
 
798
 
            self.chemin =self.modeleBiblio.filePath (self.indexRecette)
799
 
            self.purge()
800
 
            
801
 
            self.s = self.chemin
802
 
            
803
 
            self.importBeerXML()
804
 
            self.calculs_recette()
805
 
            self.MVC()
806
 
            self.stackedWidget.setCurrentIndex(0)
807
 
            self.actionVueEditeurToolBar.setChecked(True)
808
 
            self.actionVueBibliothequeToolBar.setChecked(False)
809
 
 
810
 
    def selectionRecette2(self):
811
 
        selection = self.treeViewBiblio.selectionModel()
812
 
        self.indexRecette = selection.currentIndex()
813
 
 
814
 
        self.chemin =self.modeleBiblio.filePath (self.indexRecette)
815
 
        
816
 
        self.purge()
817
 
        
818
 
        self.s = self.chemin
819
 
        
820
 
        self.importBeerXML()
821
 
        self.calculs_recette()
822
 
        self.MVC()
823
 
        self.stackedWidget.setCurrentIndex(0)
824
 
        self.actionVueEditeurToolBar.setChecked(True)
825
 
        self.actionVueBibliothequeToolBar.setChecked(False) 
826
 
 
827
 
 
828
 
    def viewRecipeBiblio(self) :
829
 
        selection = self.treeViewBiblio.selectionModel()
830
 
        self.indexRecette = selection.currentIndex()
831
 
 
832
 
        self.chemin =self.modeleBiblio.filePath (self.indexRecette)
833
 
        
834
 
        self.purge()
835
 
        
836
 
        self.s = self.chemin
837
 
        
838
 
        self.importBeerXML()
839
 
        self.calculs_recette()
840
 
        exp = ExportHTML()
841
 
        exp.exportHtml(self.nomRecette,self.styleRecette, self.volume, self.boil, AppWindow.nbreFer, self.liste_ingr, self.liste_fAmount, AppWindow.nbreHops, self.liste_houblons, self.liste_hAlpha, self.liste_hForm, self.liste_hAmount, self.liste_hTime, AppWindow.nbreDivers, self.liste_divers, self.liste_dType, self.liste_dAmount, self.liste_dTime, self.nbreLevures, self.liste_levuresDetail,self.rendement, self.OG, self.FG, self.EBC, self.ibuTot ,self.ABV, self.recipeNotes)
842
 
        exp.generateHtml()
843
 
        print("simple clic !")
844
 
        self.webViewBiblio.setHtml(exp.generatedHtml)
845
 
        self.MVC()
846
 
 
847
 
    def editCurrentRecipe(self):
848
 
        self.switchToEditor()
849
 
        self.s = self.chemin
850
 
        
851
 
        self.importBeerXML()
852
 
        self.calculs_recette()
853
 
        self.MVC()
854
 
        self.stackedWidget.setCurrentIndex(0)
855
 
        self.actionVueEditeurToolBar.setChecked(True)
856
 
        self.actionVueBibliothequeToolBar.setChecked(False) 
857
 
 
858
 
 
859
 
 
860
 
        
861
 
    def menuBiblio(self,position) :
862
 
        menu = QtGui.QMenu()
863
 
        #EditeurAction = menu.addAction("Editeur de recette")
864
 
        RenommerAction  = menu.addAction(self.trUtf8("Renommer"))
865
 
        SupprimerAction = menu.addAction(self.trUtf8("Supprimer"))        
866
 
        # CopyAction = menu.addAction(self.trUtf8("Copier"))
867
 
        # PasteAction = menu.addAction(self.trUtf8("Coller"))
868
 
        FolderAction = menu.addAction(self.trUtf8("Créer un dossier"))
869
 
        # UpAction = menu.addAction(self.trUtf8("Remonter"))
870
 
 
871
 
        
872
 
        # PasteAction.setEnabled(False)
873
 
        # clipboard = app.clipboard()
874
 
        # data = clipboard.mimeData
875
 
        # if clipboard.mimeData().hasUrls() :
876
 
        #     PasteAction.setEnabled(True)
877
 
               
878
 
        action = menu.exec_(self.listViewBiblio.mapToGlobal(position))
879
 
        #if action == EditeurAction:
880
 
          #  self.switchToEditor()
881
 
        if action == SupprimerAction:
882
 
            self.supprimerBiblio()  
883
 
        if action == RenommerAction:
884
 
            self.renommerBiblio() 
885
 
        if action == FolderAction:
886
 
            self.createFolder()   
887
 
        # if action == UpAction :
888
 
        #     self.upFolder()
889
 
        # if action == CopyAction :
890
 
        #     self.copy()
891
 
        # if action == PasteAction :
892
 
        #     self.paste()
893
 
            
894
 
                        
895
 
    def supprimerBiblio (self) :
896
 
        selection = self.treeViewBiblio.selectionModel()
897
 
        self.indexRecette = selection.currentIndex()
898
 
        confirmation = QtGui.QMessageBox.question(self,
899
 
                            self.trUtf8("Supprimer"),
900
 
                            self.trUtf8("La recette sera définitivement supprimée <br/> Continuer ?"),
901
 
                            QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
902
 
        if (confirmation == QtGui.QMessageBox.Yes):
903
 
            self.modeleBiblio.remove(self.indexRecette)
904
 
        else :      
905
 
            pass
906
 
    
907
 
    def renommerBiblio (self) :
908
 
        selection = self.treeViewBiblio.selectionModel()
909
 
        self.indexRecette = selection.currentIndex()
910
 
        self.treeViewBiblio.edit(self.indexRecette)
911
 
        
912
 
    def createFolder(self) :
913
 
        selection = self.treeViewBiblio.selectionModel()
914
 
        self.indexRecette = selection.currentIndex()
915
 
        text = self.trUtf8("nouveau dossier")
916
 
       # recettes = QtCore.QFile(recettes_dir)
917
 
        path = self.modeleBiblio.filePath(self.treeViewBiblio.rootIndex()) + "/" + text
918
 
        os.mkdir(path)
919
 
        
920
 
        
921
 
    # def navFolder(self) :
922
 
    #     selection = self.treeViewBiblio.selectionModel()
923
 
    #     self.indexRecette = selection.currentIndex()        
924
 
    #     self.listViewBiblio.setRootIndex(self.indexRecette)
925
 
        #self.modeleBiblio.setRootPath("/home/pierre/.config/joliebulle/recettes/nouveau dossier")
926
 
        
927
 
    # def upFolder(self) :
928
 
    #     self.listViewBiblio.setRootIndex(self.treeViewBiblio.rootIndex().parent())
929
 
        
930
 
    # def copy (self) :
931
 
    #     data = QtCore.QMimeData()
932
 
    #     selection = self.treeViewBiblio.selectionModel()
933
 
    #     self.indexRecette = selection.currentIndex()  
934
 
    #     path = self.modeleBiblio.filePath(self.indexRecette)
935
 
    #     url = QtCore.QUrl.fromLocalFile(path)
936
 
    #     self.lurl = [url]
937
 
    #     data.setUrls(self.lurl)
938
 
    #     clipboard = app.clipboard()
939
 
    #     clipboard.setMimeData(data)
940
 
              
941
 
    # def paste (self) :
942
 
    #     clipboard = app.clipboard()
943
 
    #     data = clipboard.mimeData()
944
 
    #     file = QtCore.QFile()
945
 
    #     file.setFileName(self.lurl[0].toLocalFile())
946
 
    #     info = QtCore.QFileInfo(file.fileName())
947
 
    #     name= info.fileName()
948
 
    #     path = self.modeleBiblio.filePath(self.treeViewBiblio.rootIndex()) + "/" + name
949
 
    #     file.copy(path)
950
 
    #     clipboard.clear()
951
 
        
952
 
              
953
 
    def initRep(self) :   
954
 
        home = QtCore.QDir(home_dir)
955
 
        config = QtCore.QDir(config_dir)
956
 
        print (config)
957
 
        if not config.exists() :
958
 
            home.mkpath (config_dir)
959
 
        else :
960
 
            pass
961
 
        database = QtCore.QFile(database_file)
962
 
        if not database.exists() :
963
 
            database.copy(database_root, database_file)
964
 
        else :
965
 
            pass
966
 
        recettes = QtCore.QFile(recettes_dir)
967
 
        if not recettes.exists() :
968
 
            home.mkpath(recettes_dir)
969
 
        mash  = QtCore.QFile(mash_file)
970
 
        if not mash.exists() :
971
 
            mash.copy(mash_root, mash_file)
972
 
        else :
973
 
            pass
974
 
        # on configure des valeurs par défaut
975
 
        if not settings.conf.contains("BoilOffRate") :
976
 
            settings.conf.setValue("BoilOffRate", 10)
977
 
        if not settings.conf.contains("CoolingLoss") :
978
 
            settings.conf.setValue("CoolingLoss", 5)
979
 
        if not settings.conf.contains("GrainTemp") :
980
 
            settings.conf.setValue("GrainTemp", 20)
981
 
        if not settings.conf.contains("FudgeFactor") :
982
 
            settings.conf.setValue("FudgeFactor", 1.7)
983
 
        if not settings.conf.contains("GrainRetention") :
984
 
            settings.conf.setValue("GrainRetention", 1)
985
 
    
986
 
        
987
 
    def switchToEditor(self) :
988
 
        self.stackedWidget.setCurrentIndex(0)
989
 
        self.actionVueEditeurToolBar.setChecked(True)
990
 
        self.actionVueBibliothequeToolBar.setChecked(False)
991
 
        self.actionBrewdayMode.setChecked(False)
992
 
 
993
 
        
994
 
    def switchToLibrary(self) :
995
 
        self.stackedWidget.setCurrentIndex(1)        
996
 
        self.actionVueEditeurToolBar.setChecked(False)
997
 
        self.actionVueBibliothequeToolBar.setChecked(True)
998
 
        self.actionBrewdayMode.setChecked(False)
999
 
 
1000
 
        
1001
 
    def switchToNotes(self) :
1002
 
        self.stackedWidget.setCurrentIndex(2)        
1003
 
        self.actionVueEditeurToolBar.setChecked(False)
1004
 
        self.actionVueBibliothequeToolBar.setChecked(False)
1005
 
        self.actionBrewdayMode.setChecked(False)
1006
 
 
1007
 
        
1008
 
    def switchToMash(self) :
1009
 
        self.stackedWidget.setCurrentIndex(3)        
1010
 
        self.actionVueEditeurToolBar.setChecked(False)
1011
 
        self.actionVueBibliothequeToolBar.setChecked(False)
1012
 
        self.actionBrewdayMode.setChecked(False)
1013
 
 
1014
 
        
1015
 
    def switchToBrewday(self) :
1016
 
        self.stackedWidget.setCurrentIndex(4)        
1017
 
        self.actionVueEditeurToolBar.setChecked(False)
1018
 
        self.actionVueBibliothequeToolBar.setChecked(False)
1019
 
        self.actionBrewdayMode.setChecked(True)
1020
 
 
1021
 
        if self.brewdayLock == 1 :
1022
 
            pass
1023
 
        else :
1024
 
            self.brewdayModeCalc()
1025
 
        self.tableWidgetStepsBrewday.setCurrentCell(0,0)
1026
 
        print ("lock",self.brewdayLock)
1027
 
        
1028
 
        
1029
 
    def restoreDataBase(self) :
1030
 
        
1031
 
        home = QtCore.QDir(home_dir)
1032
 
        config = QtCore.QDir(config_dir)
1033
 
        database = QtCore.QFile(database_file)
1034
 
        confirmation = QtGui.QMessageBox.question(self,
1035
 
                                    self.trUtf8("Remplacer la base ?"),
1036
 
                                    self.trUtf8("La base des ingrédients actuelle va être effacée et remplacée par la base originale. Toutes vos modifications vont être effacées. Un redémarrage de l'application sera nécessaire.<br> Continuer ?"),
1037
 
                                    QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
1038
 
        if (confirmation == QtGui.QMessageBox.Yes):
1039
 
            database.remove(database_file)
1040
 
            database.copy(database_root, database_file)
1041
 
        else :
1042
 
            
1043
 
            pass
1044
 
                
1045
 
        
1046
 
    def modeleProportion (self) :
1047
 
        #Cette fonction est appelée chaque fois que la quantité, les AA ou les temps sont modifiés, via un signal émit par les classes Delegate.
1048
 
        #Cette fonction inclut les données calculées dans le modèle.
1049
 
        
1050
 
        i=0
1051
 
        while i < AppWindow.nbreFer :
1052
 
            i=i+1
1053
 
            for prop in self.liste_fProportion :
1054
 
                prop = QtGui.QStandardItem("%.0f" %(self.liste_fProportion[i-1]) + "%")
1055
 
                self.modele.setItem(i-1,5,prop)
1056
 
                
1057
 
        h=0
1058
 
        while h < AppWindow.nbreHops :
1059
 
            h = h+1
1060
 
            for prop in self.liste_ibuPart :
1061
 
                prop = QtGui.QStandardItem("%.1f" %(self.liste_ibuPart[h-1]) + " IBU")
1062
 
                self.modele.setItem(i+h-1,5,prop)
1063
 
                
1064
 
        self.displayProfile()
1065
 
                
1066
 
        
1067
 
    # cette fonction est appelee chaque fois que les donnees du modele changent
1068
 
    def reverseMVC(self) : 
1069
 
    
1070
 
        
1071
 
        
1072
 
        i = 0
1073
 
        while i < AppWindow.nbreFer :
1074
 
            i = i+1
1075
 
            
1076
 
            index = self.modele.index(i-1,1)
1077
 
            value = self.modele.data(index, QtCore.Qt.DisplayRole)
1078
 
            self.liste_fAmount[i-1] = float(value)
1079
 
            
1080
 
            
1081
 
            index_fIngr = self.modele.index(i-1,0)
1082
 
            value_fIngr = self.modele.data(index_fIngr, QtCore.Qt.DisplayRole)
1083
 
            self.liste_ingr[i-1] = value_fIngr
1084
 
            
1085
 
            
1086
 
            
1087
 
            
1088
 
 
1089
 
            
1090
 
        h = 0
1091
 
        while h < AppWindow.nbreHops :
1092
 
            h = h+1
1093
 
            
1094
 
 
1095
 
            for index in self.liste_hAmount :
1096
 
                index = self.modele.index(i+h-1,1)
1097
 
                value = self.modele.data(index, QtCore.Qt.DisplayRole)
1098
 
                self.liste_hAmount[h-1] = float(value)
1099
 
            for index in self.liste_hTime :
1100
 
                index = self.modele.index(i+h-1,2)
1101
 
                value = self.modele.data(index, QtCore.Qt.DisplayRole)  
1102
 
                self.liste_hTime[h-1] = float(value)
1103
 
            for index in self.liste_hAlpha :
1104
 
                index = self.modele.index(i+h-1,3)
1105
 
                value = self.modele.data(index, QtCore.Qt.DisplayRole)  
1106
 
                self.liste_hAlpha[h-1] = float(value)  
1107
 
            for index in self.liste_hForm :
1108
 
                index = self.modele.index(i+h-1,4)
1109
 
                value = str(self.modele.data(index, QtCore.Qt.DisplayRole))
1110
 
                
1111
 
                if value == 'None' or value == '' :
1112
 
                    pass
1113
 
                else :
1114
 
                    self.liste_hForm[h-1] = str(value)
1115
 
            for index in self.liste_hUse :
1116
 
                index = self.modele.index(i+h-1,6)
1117
 
                value = str(self.modele.data(index, QtCore.Qt.DisplayRole))
1118
 
                if value == 'None' or value == '' :
1119
 
                    pass
1120
 
                else :
1121
 
                    self.liste_hUse[h-1] = str(value)
1122
 
 
1123
 
 
1124
 
        
1125
 
        
1126
 
        m = 0 
1127
 
        while m < AppWindow.nbreDivers : 
1128
 
            m = m+1
1129
 
            for index in self.liste_dAmount :
1130
 
                index = self.modele.index(i+h+m-1,1)
1131
 
                value = self.modele.data(index, QtCore.Qt.DisplayRole)
1132
 
                self.liste_dAmount[m-1] = float(value)
1133
 
                
1134
 
            for index in self.liste_dTime :
1135
 
                index = self.modele.index(i+h+m-1,2)
1136
 
                value = self.modele.data(index, QtCore.Qt.DisplayRole)  
1137
 
                self.liste_dTime[m-1] = float(value)
1138
 
                
1139
 
            for index in self.liste_dUse :
1140
 
                index = self.modele.index(i+h+m-1,6)
1141
 
                value = str(self.modele.data(index, QtCore.Qt.DisplayRole))
1142
 
                if value == 'None' or value == '' :
1143
 
                    pass
1144
 
                else :
1145
 
                    self.liste_dUse[m-1] = str(value)            
1146
 
    
1147
 
        
1148
 
        
1149
 
    
1150
 
        self.calculs_recette()  
1151
 
       
1152
 
        
1153
 
 
1154
 
    
1155
 
    def MVC(self) :      
1156
 
 
1157
 
        
1158
 
        i=0
1159
 
        while i < AppWindow.nbreFer :
1160
 
            i=i+1
1161
 
            for item in self.liste_ingr : 
1162
 
                item = QtGui.QStandardItem(self.liste_ingr[i-1])
1163
 
                self.modele.setItem(i-1,0,item)
1164
 
            for amount in self.liste_fAmount : 
1165
 
                amount = QtGui.QStandardItem("%.0f" %(self.liste_fAmount[i-1]))
1166
 
                self.modele.setItem(i-1,1,amount)
1167
 
            for ftype in self.liste_fType :
1168
 
                ftype = QtGui.QStandardItem(self.liste_fType[i-1])
1169
 
                self.modele.setItem(i-1,4,ftype)
1170
 
            for prop in self.liste_fProportion :
1171
 
                prop = QtGui.QStandardItem("%.0f" %(self.liste_fProportion[i-1]) + "%")
1172
 
                self.modele.setItem(i-1,5,prop)
1173
 
 
1174
 
 
1175
 
        
1176
 
        
1177
 
 
1178
 
        h=0
1179
 
        while h < AppWindow.nbreHops :
1180
 
            h = h+1
1181
 
            for item in self.liste_houblons : 
1182
 
                item = QtGui.QStandardItem(self.liste_houblons[h-1])
1183
 
                self.modele.setItem(i+h-1,0,item)
1184
 
            for amount in self.liste_hAmount : 
1185
 
                amount = QtGui.QStandardItem("%.0f" %(self.liste_hAmount[h-1]) )
1186
 
                self.modele.setItem(i+h-1,1,amount)
1187
 
            for time in self.liste_hTime :
1188
 
                time = QtGui.QStandardItem("%.0f" %(self.liste_hTime[h-1]) )
1189
 
                self.modele.setItem(i+h-1,2,time)                   
1190
 
            for alpha in self.liste_hAlpha :
1191
 
                alpha = QtGui.QStandardItem("%.1f" %(self.liste_hAlpha[h-1]) )
1192
 
                self.modele.setItem(i+h-1,3,alpha)  
1193
 
            for form in self.liste_hForm :
1194
 
                form = QtGui.QStandardItem(str(self.liste_hForm[h-1]))
1195
 
                self.modele.setItem(i+h-1,4,form)
1196
 
            for use in self.liste_hUse :
1197
 
                use = QtGui.QStandardItem(str(self.liste_hUse[h-1]))
1198
 
                self.modele.setItem(i+h-1,6,use)
1199
 
            for prop in self.liste_ibuPart :
1200
 
                prop = QtGui.QStandardItem("%.1f" %(self.liste_ibuPart[h-1]) + " IBU")
1201
 
                self.modele.setItem(i+h-1,5,prop)
1202
 
 
1203
 
                 
1204
 
 
1205
 
 
1206
 
 
1207
 
                
1208
 
        m = 0
1209
 
        while m < AppWindow.nbreDivers :
1210
 
            m = m+1
1211
 
            for item in self.liste_divers :
1212
 
                item = QtGui.QStandardItem(self.liste_divers[m-1] + ' [' +self.liste_dType[m-1] + ']')
1213
 
                self.modele.setItem(i+h+m-1, 0, item)
1214
 
                
1215
 
            for amount in self.liste_dAmount : 
1216
 
                amount = QtGui.QStandardItem("%.0f" %(self.liste_dAmount[m-1]) )
1217
 
                self.modele.setItem(i+h+m-1, 1, amount)
1218
 
                
1219
 
            for time in self.liste_dTime :
1220
 
                time = QtGui.QStandardItem("%.0f" %(self.liste_dTime[m-1]) )
1221
 
                self.modele.setItem(i+h+m-1, 2, time)
1222
 
            for use in self.liste_dUse :
1223
 
                use = QtGui.QStandardItem(str(self.liste_dUse[m-1]) )
1224
 
                self.modele.setItem(i+h+m-1, 6, use)               
1225
 
             
1226
 
 
1227
 
 
1228
 
 
1229
 
        l=0
1230
 
        while l < self.nbreLevures : 
1231
 
            l=l+1
1232
 
            for item in self.liste_levuresDetail : 
1233
 
                item = QtGui.QStandardItem(self.liste_levuresDetail[l-1])
1234
 
                self.modele.setItem( i+h+m+l-1,0,item)
1235
 
                
1236
 
                
1237
 
 
1238
 
    def editGrains(self) :
1239
 
        self.dlgEditG.setModal(True)
1240
 
        self.dlgEditG.show()
1241
 
        
1242
 
    def editHoublons(self) :
1243
 
        self.dlgEditH.setModal(True)
1244
 
        self.dlgEditH.show()
1245
 
        
1246
 
    def editDivers(self) :
1247
 
        self.dlgEditD.setModal(True)
1248
 
        self.dlgEditD.show()   
1249
 
    
1250
 
    def editLevures(self) :
1251
 
        self.dlgEditY.setModal(True)
1252
 
        self.dlgEditY.show()     
1253
 
        
1254
 
    def outilDens(self) : 
1255
 
        self.dlgOutilDens.setModal(True)
1256
 
        self.dlgOutilDens.show()
1257
 
        
1258
 
    def outilAlc(self) :
1259
 
        self.dlgOutilAlc.setModal(True)
1260
 
        self.dlgOutilAlc.show()
1261
 
        
1262
 
    def outilDilution(self) :
1263
 
        self.dlgOutilDilution.setModal(True)
1264
 
        self.dlgOutilDilution.show()
1265
 
    
1266
 
    def outilEvaporation (self) :
1267
 
        self.dlgOutilEvaporation.setModal(True)
1268
 
        self.dlgOutilEvaporation.show()
1269
 
        
1270
 
    def outilPaliers (self) :
1271
 
        self.dlgOutilPaliers.setModal(True)
1272
 
        self.dlgOutilPaliers.show()
1273
 
        
1274
 
        
1275
 
    def dialogPreferences (self) :
1276
 
        self.dlgPref.setModal(True)
1277
 
        self.dlgPref.show()
1278
 
        
1279
 
    def stepAdjustBrewday(self) :
1280
 
        self.tableWidgetStepsBrewday_currentRowChanged()
1281
 
        self.dlgStepBrewday.setModal(True)
1282
 
        self.dlgStepBrewday.show()
1283
 
        self.dlgStepBrewday.setFields(self.brewdayCurrentStepTargetTemp, self.brewdayCurrentStepRatio, self.brewdayCurrentStepInfuseAmount, self.brewdayCurrentStepWaterTemp, self.grainWeight, self.stepsListVol, self.brewdayCurrentRow, self.brewdayListTemp, self.strikeTargetTemp)
1284
 
        print("envoyé !",self.brewdayCurrentStepTargetTemp,self.strikeTargetTemp )
1285
 
        
1286
 
    
1287
 
        
1288
 
    def purge (self) :
1289
 
        i = (AppWindow.nbreFer + AppWindow.nbreDivers + AppWindow.nbreHops + self.nbreLevures)
1290
 
        self.modele.removeRows(0,i)
1291
 
        AppWindow.nbreFer = 0
1292
 
        AppWindow.nbreHops = 0
1293
 
        AppWindow.nbreDivers = 0
1294
 
        self.s = 0
1295
 
        self.nouvelle()
1296
 
        
1297
 
        
1298
 
        
1299
 
 
1300
 
    
1301
 
    def ajouterF(self) :
1302
 
 
1303
 
        
1304
 
        
1305
 
        f = AppWindow.nbreFer
1306
 
        i=self.comboBox.currentIndex()
1307
 
        
1308
 
        # item = QtGui.QStandardItem(self.base.liste_ingr[i])
1309
 
        # item_fAmount = QtGui.QStandardItem(0)
1310
 
        self.modele.insertRow(f)
1311
 
 
1312
 
        self.liste_ingr.append(self.base.liste_ingr[i])
1313
 
        self.liste_fAmount.append(1000)
1314
 
        self.liste_fYield.append(self.base.liste_fYield[i])
1315
 
        self.liste_fType.append(self.base.liste_fType[i])
1316
 
        self.liste_color.append(self.base.liste_color[i])
1317
 
        self.liste_fMashed.append(self.base.liste_fMashed[i])       
1318
 
        AppWindow.nbreFer = f + 1
1319
 
        self.calculs_recette()
1320
 
        self.MVC()
1321
 
        
1322
 
        print (self.liste_fProportion)
1323
 
        
1324
 
    def ajouterH(self) : 
1325
 
        
1326
 
        f = AppWindow.nbreFer
1327
 
        h = AppWindow.nbreHops
1328
 
        i = self.comboBoxH.currentIndex()
1329
 
        
1330
 
        # itemH = QtGui.QStandardItem(self.base.liste_houblons[i])
1331
 
        # item_hAmount = QtGui.QStandardItem(0)
1332
 
        # item_hForm = QtGui.QStandardItem(self.base.liste_hForm[i])
1333
 
        # item_hTime = QtGui.QStandardItem(0)
1334
 
        # item_hAlpha = QtGui.QStandardItem(self.base.liste_hAlpha[i])
1335
 
        # item_hUse = QtGui.QStandardItem(self.trUtf8('''Ébullition'''))
1336
 
        
1337
 
        self.modele.insertRow(f+h)
1338
 
        
1339
 
 
1340
 
        
1341
 
        self.liste_houblons.append(self.base.liste_houblons[i])
1342
 
        self.liste_hAmount.append(0)
1343
 
        if self.base.liste_hForm[i] == "Plug" :
1344
 
            self.liste_hForm.append(self.trUtf8('''Cône'''))
1345
 
        elif self.base.liste_hForm[i] == "Leaf" :
1346
 
            self.liste_hForm.append(self.trUtf8('''Feuille'''))
1347
 
        elif self.base.liste_hForm[i] == "Pellet" :
1348
 
            self.liste_hForm.append(self.trUtf8('''Pellet'''))
1349
 
        else :
1350
 
            self.liste_hForm.append(self.trUtf8('''Cône'''))
1351
 
        self.liste_hTime.append(0)
1352
 
        self.liste_hAlpha.append(self.base.liste_hAlpha[i])
1353
 
        self.liste_hUse.append(self.trUtf8('''Ébullition'''))
1354
 
        
1355
 
        AppWindow.nbreHops = h + 1
1356
 
        self.calculs_recette()
1357
 
        self.MVC()
1358
 
        
1359
 
    
1360
 
    def ajouterM(self) :
1361
 
        
1362
 
        l = self.nbreLevures
1363
 
        f = AppWindow.nbreFer
1364
 
        h = AppWindow.nbreHops
1365
 
        m = AppWindow.nbreDivers
1366
 
        
1367
 
        i = self.comboBoxM.currentIndex()
1368
 
        
1369
 
        # itemD = QtGui.QStandardItem(self.base.liste_divers[i])
1370
 
        # item_dAmount = QtGui.QStandardItem(0)
1371
 
        # item_dType = QtGui.QStandardItem(self.base.liste_dType[i])
1372
 
        # item_dTime = QtGui.QStandardItem(0)
1373
 
        # item_dUse = QtGui.QStandardItem(self.trUtf8('''Ébullition'''))
1374
 
        
1375
 
        self.modele.insertRow(f+h+m)
1376
 
        
1377
 
        self.liste_divers.append(self.base.liste_divers[i])
1378
 
        self.liste_dAmount.append(0)
1379
 
        self.liste_dType.append(self.base.liste_dType[i])
1380
 
        self.liste_dTime.append(0)
1381
 
        self.liste_dUse.append(self.trUtf8('''Ébullition'''))
1382
 
        
1383
 
        AppWindow.nbreDivers = m +1
1384
 
        self.MVC()
1385
 
        
1386
 
    
1387
 
 
1388
 
    
1389
 
    
1390
 
    
1391
 
    def ajouterY(self) :
1392
 
        l = self.nbreLevures
1393
 
        f = AppWindow.nbreFer
1394
 
        h = AppWindow.nbreHops
1395
 
        m = AppWindow.nbreDivers
1396
 
        
1397
 
        i = self.comboBoxY.currentIndex()
1398
 
        
1399
 
        # itemY = QtGui.QStandardItem(self.base.liste_levures[i])
1400
 
        # item_lForm = QtGui.QStandardItem(self.base.liste_lForm[i])
1401
 
        # item_lLabo = QtGui.QStandardItem(self.base.liste_lLabo[i])
1402
 
        # item_lProdid = QtGui.QStandardItem(self.base.liste_lProdid[i])
1403
 
        # item_levureAtten = QtGui.QStandardItem(self.base.liste_levureAtten[i])
1404
 
        # item_levuresDetail =QtGui.QStandardItem(self.base.liste_levuresDetail[i])
1405
 
        
1406
 
        self.modele.insertRow(f+h+m+l)
1407
 
        
1408
 
    
1409
 
        
1410
 
        self.liste_levures.append(self.base.liste_levures[i])
1411
 
        self.liste_lForm.append(self.base.liste_lForm[i])
1412
 
        self.liste_lLabo.append(self.base.liste_lLabo[i])
1413
 
        self.liste_lProdid.append(self.base.liste_lProdid[i])
1414
 
        self.liste_levureAtten.append(self.base.liste_levureAtten[i])
1415
 
        self.liste_levuresDetail.append(self.base.liste_levuresDetail[i])
1416
 
        
1417
 
        self.nbreLevures = l + 1
1418
 
        self.MVC()
1419
 
        
1420
 
        
1421
 
        
1422
 
        
1423
 
        
1424
 
    
1425
 
    def enlever(self) :
1426
 
        selection = self.tableViewF.selectionModel()
1427
 
        indexLigne = selection.currentIndex().row()
1428
 
        f = AppWindow.nbreFer
1429
 
        h = AppWindow.nbreHops
1430
 
        l = self.nbreLevures
1431
 
        m = AppWindow.nbreDivers
1432
 
        
1433
 
        
1434
 
        if indexLigne < 0 :
1435
 
            pass
1436
 
        else :
1437
 
            if indexLigne < f :
1438
 
                del self.liste_ingr[indexLigne]
1439
 
                del self.liste_fAmount[indexLigne]
1440
 
                del self.liste_fType[indexLigne]
1441
 
                del self.liste_fYield[indexLigne]
1442
 
                del self.liste_fMashed[indexLigne]
1443
 
                del self.liste_color[indexLigne]
1444
 
                self.modele.removeRow(indexLigne)
1445
 
                AppWindow.nbreFer = f - 1
1446
 
                self.reverseMVC()
1447
 
                
1448
 
            if indexLigne > f-1 and indexLigne < f+h :      
1449
 
                del self.liste_houblons[indexLigne-f]
1450
 
                del self.liste_hAmount[indexLigne-f]
1451
 
                del self.liste_hForm[indexLigne-f]
1452
 
                del self.liste_hTime[indexLigne-f]
1453
 
                del self.liste_hAlpha[indexLigne-f]
1454
 
                del self.liste_hUse[indexLigne-f]
1455
 
                self.modele.removeRow(indexLigne)
1456
 
                AppWindow.nbreHops = h - 1
1457
 
                self.reverseMVC()   
1458
 
 
1459
 
                
1460
 
            if indexLigne > f+h-1 and indexLigne < f+h+m :
1461
 
                del self.liste_divers[indexLigne-(f+h)]
1462
 
                del self.liste_dAmount[indexLigne-(f+h)]
1463
 
                del self.liste_dType[indexLigne-(f+h)]
1464
 
                try :
1465
 
                    del self.liste_dTime[indexLigne-(f+h)]
1466
 
                except :
1467
 
                    pass
1468
 
                del self.liste_dUse[indexLigne-(f+h)]
1469
 
                self.modele.removeRow(indexLigne)
1470
 
                AppWindow.nbreDivers = m-1
1471
 
                self.reverseMVC()
1472
 
                
1473
 
                
1474
 
            if indexLigne > f+h+m-1 and indexLigne < f+h+m+l :
1475
 
                del self.liste_levures[indexLigne-(f+h+m)]
1476
 
                del self.liste_lForm[indexLigne-(f+h+m)]
1477
 
                del self.liste_lLabo[indexLigne-(f+h+m)]
1478
 
                del self.liste_lProdid[indexLigne-(f+h+m)]
1479
 
                del self.liste_levureAtten[indexLigne-(f+h+m)]
1480
 
                del self.liste_levuresDetail[indexLigne-(f+h+m)]
1481
 
                self.modele.removeRow(indexLigne)
1482
 
                self.nbreLevures = l-1
1483
 
                
1484
 
                self.reverseMVC()
1485
 
                
1486
 
            else :
1487
 
                pass
1488
 
            self.calculs_recette()
1489
 
            self.MVC()
1490
 
            print (self.liste_fProportion)
1491
 
            print ("index : " , indexLigne)
1492
 
 
1493
 
        
1494
 
 
1495
 
 
1496
 
    
1497
 
    
1498
 
    def importBeerXML(self) :
1499
 
        fichierBeerXML = self.s
1500
 
 
1501
 
        arbre = ET.parse(fichierBeerXML)
1502
 
 
1503
 
        presentation=arbre.find('.//RECIPE')
1504
 
        style=arbre.find('.//STYLE')
1505
 
        fermentables=arbre.findall('.//FERMENTABLE')
1506
 
        hops = arbre.findall('.//HOP')
1507
 
        levures = arbre.findall('.//YEAST')
1508
 
        misc = arbre.findall('.//MISC')
1509
 
        mash = arbre.find('.//MASH')
1510
 
        
1511
 
        
1512
 
        
1513
 
        
1514
 
        
1515
 
        #Presentation de la recette
1516
 
        self.styleRecette =''
1517
 
        for nom in presentation :
1518
 
            if nom.tag == "NAME" : 
1519
 
                    self.nomRecette = nom.text
1520
 
            
1521
 
        self.brewer =''
1522
 
        for brewer in presentation :
1523
 
            if brewer.tag == "BREWER" :
1524
 
                self.brewer = brewer.text
1525
 
               
1526
 
        
1527
 
            
1528
 
        for nom in style :
1529
 
            if nom.tag == "NAME" : 
1530
 
                self.styleRecette = nom.text
1531
 
        
1532
 
        self.typeRecette=''
1533
 
        for typeRecette in presentation :
1534
 
            if typeRecette.tag == "TYPE" : 
1535
 
                self.typeRecette = typeRecette.text
1536
 
                
1537
 
        for batch_size in presentation :
1538
 
            if batch_size.tag == "BATCH_SIZE" : 
1539
 
                self.volume = batch_size.text
1540
 
                
1541
 
        for efficiency in presentation :
1542
 
            if efficiency.tag == "EFFICIENCY" : 
1543
 
                self.rendement= float(efficiency.text)  
1544
 
        
1545
 
        for boil in presentation :
1546
 
            if boil.tag == 'BOIL_TIME' :
1547
 
                self.boil = boil.text
1548
 
 
1549
 
 
1550
 
    
1551
 
        self.lineEditRecette.setText(self.nomRecette)
1552
 
        self.lineEditGenre.setText(self.styleRecette)
1553
 
        self.doubleSpinBox_2Volume.setValue(float(self.volume))
1554
 
        self.doubleSpinBoxRendemt.setValue(self.rendement)
1555
 
        try : 
1556
 
            self.spinBoxBoil.setValue(float(self.boil))
1557
 
        except :
1558
 
            self.spinBoxBoil.setValue (0)
1559
 
        self.doubleSpinBoxVolPre.setValue(float(self.volume))
1560
 
        if self.typeRecette == "All Grain" :
1561
 
            self.comboBoxType.setCurrentIndex(0)
1562
 
        elif self.typeRecette == "Partial Mash" :
1563
 
            self.comboBoxType.setCurrentIndex(2)
1564
 
        elif self.typeRecette == "Extract" :
1565
 
            self.comboBoxType.setCurrentIndex(1)
1566
 
        else :
1567
 
            self.comboBoxType.setCurrentIndex(0)
1568
 
        self.lineEditBrewer.setText(self.brewer)
1569
 
        
1570
 
        for notes in presentation :
1571
 
            if notes.tag == 'NOTES' :
1572
 
                self.recipeNotes = notes.text
1573
 
       
1574
 
            
1575
 
        
1576
 
    
1577
 
    
1578
 
        #Ingredient fermentescibles
1579
 
        AppWindow.nbreFer = len(fermentables)
1580
 
        self.liste_ingr = list()
1581
 
        self.liste_fAmount = list()
1582
 
        self.liste_fType = list()
1583
 
        self.liste_fYield = list()
1584
 
        self.liste_fMashed = list()
1585
 
        self.liste_color = list()
1586
 
        self.fMashed = ''
1587
 
        
1588
 
        
1589
 
        i = 0
1590
 
        while i < AppWindow.nbreFer :
1591
 
 
1592
 
            i=i+1
1593
 
            for nom in fermentables[i-1] :
1594
 
                if nom.tag == 'NAME' :
1595
 
                    self.fNom = nom.text
1596
 
                    self.liste_ingr.append(self.fNom)
1597
 
                    
1598
 
                if nom.tag =='AMOUNT' :
1599
 
                    self.fAmount = 1000*(float(nom.text)) 
1600
 
                    self.liste_fAmount.append(self.fAmount)
1601
 
                    
1602
 
                if nom.tag =='TYPE' :
1603
 
                    self.fType = nom.text 
1604
 
                    self.liste_fType.append(self.fType)
1605
 
                    
1606
 
                if nom.tag == 'YIELD' :
1607
 
                    self.fYield = float(nom.text)
1608
 
                    self.liste_fYield.append(self.fYield)
1609
 
                    
1610
 
                if nom.tag == 'RECOMMEND_MASH' :
1611
 
                    self.fMashed = nom.text
1612
 
                    self.liste_fMashed.append(self.fMashed)
1613
 
                    
1614
 
                #ATTENTION ! le format BeerXML utilise des unités SRM ! 
1615
 
                #srm*1.97 =ebc
1616
 
                if nom.tag == 'COLOR' :
1617
 
                    self.color = float(nom.text)*1.97
1618
 
                    self.liste_color.append(self.color)
1619
 
                    
1620
 
 
1621
 
        
1622
 
        
1623
 
        #Houblons
1624
 
        
1625
 
        AppWindow.nbreHops = len(hops)
1626
 
        self.liste_houblons = list()
1627
 
        self.liste_hAmount = list()
1628
 
        self.liste_hForm = list()
1629
 
        self.liste_hTime = list()
1630
 
        self.liste_hAlpha = list()
1631
 
        self.liste_hUse = list()
1632
 
        
1633
 
        
1634
 
        
1635
 
        h = 0
1636
 
        while h < AppWindow.nbreHops : 
1637
 
            h = h+1
1638
 
            for nom in hops [h-1] :
1639
 
                if nom.tag == 'NAME' :
1640
 
                    self.hNom = nom.text
1641
 
                    self.liste_houblons.append(self.hNom)
1642
 
                    
1643
 
                if nom.tag =='AMOUNT' :
1644
 
                    self.hAmount = 1000*(float(nom.text)) 
1645
 
                    self.liste_hAmount.append(self.hAmount)
1646
 
                    
1647
 
                if nom.tag =='FORM' :
1648
 
                    self.hForm = nom.text
1649
 
                    if self.hForm == 'Pellet' :
1650
 
                        self.hForm = self.trUtf8('Pellet')
1651
 
                    elif self.hForm == 'Leaf' :
1652
 
                        self.hForm = self.trUtf8('Feuille')  
1653
 
                    elif self.hForm == 'Plug' :
1654
 
                        self.hForm = self.trUtf8('Cône')   
1655
 
                    else :
1656
 
                        self.hForm = self.trUtf8('Feuille')
1657
 
                                         
1658
 
                    self.liste_hForm.append(self.hForm)
1659
 
                    
1660
 
                if nom.tag =='TIME' :
1661
 
                    self.hTime = float(nom.text)
1662
 
                    self.liste_hTime.append(self.hTime)
1663
 
                    
1664
 
                
1665
 
                if nom.tag =='ALPHA' :
1666
 
                    self.hAlpha = float(nom.text)
1667
 
                    self.liste_hAlpha.append(self.hAlpha)  
1668
 
                
1669
 
                if nom.tag == 'USE' :
1670
 
                    self.hUse = nom.text     
1671
 
                    if self.hUse == 'Boil' :
1672
 
                        self.hUse = self.trUtf8('''Ébullition''')          
1673
 
                    elif self.hUse == 'Dry Hop' or self.hUse == 'Dry Hopping':
1674
 
                        self.hUse = self.trUtf8('Dry Hop')           
1675
 
                    elif self.hUse == 'Mash' :
1676
 
                        self.hUse = self.trUtf8('Empâtage')             
1677
 
                    elif self.hUse == 'First Wort' :
1678
 
                        self.hUse = self.trUtf8('Premier Moût')             
1679
 
                    elif self.hUse == 'Aroma' :
1680
 
                        self.hUse = self.trUtf8('Arôme') 
1681
 
                    else :
1682
 
                        self.hUse = 'Boil'             
1683
 
                    self.liste_hUse.append(self.hUse) 
1684
 
                                        
1685
 
                                                            
1686
 
        
1687
 
        #Levure 
1688
 
        self.nbreLevures = len(levures)
1689
 
        self.liste_levures = list()
1690
 
        self.liste_lForm = list()
1691
 
        self.liste_lLabo = list()
1692
 
        self.liste_lProdid = list()
1693
 
        self.liste_levuresDetail = list()
1694
 
        self.liste_levureAtten = list ()
1695
 
        self.lNom = ""
1696
 
        self.lLabo =""
1697
 
        self.lProd =""
1698
 
        self.lForm = ""
1699
 
        self.lAtten=""
1700
 
        
1701
 
        l = 0
1702
 
        while l < self.nbreLevures : 
1703
 
            l = l+1
1704
 
            for nom in levures [l-1] :
1705
 
                if nom.tag == 'NAME' :
1706
 
                    self.lNom = str(nom.text)
1707
 
                    self.liste_levures.append(self.lNom)    
1708
 
                    
1709
 
                if nom.tag == 'FORM' :
1710
 
                    self.lForm = str(nom.text)
1711
 
                    self.liste_lForm.append(self.lForm)
1712
 
                    
1713
 
                if nom.tag == 'LABORATORY' :
1714
 
                    self.lLabo = str(nom.text)
1715
 
                    self.liste_lLabo.append(self.lLabo)
1716
 
                    
1717
 
                if nom.tag == 'PRODUCT_ID' :
1718
 
                    self.lProd = str(nom.text)
1719
 
                    self.liste_lProdid.append(self.lProd)
1720
 
                
1721
 
                if nom.tag == 'ATTENUATION' :
1722
 
                    self.lAtten = float(nom.text)
1723
 
                    self.liste_levureAtten.append(self.lAtten)
1724
 
                    
1725
 
                    
1726
 
                    
1727
 
            self.liste_levuresDetail.append (self.lNom+ ' ' + self.lLabo +' ' + self.lProd)
1728
 
                    
1729
 
                    
1730
 
                    
1731
 
        
1732
 
        
1733
 
        
1734
 
        #Ingredients divers
1735
 
        AppWindow.nbreDivers = len(misc)
1736
 
        self.liste_divers = list ()
1737
 
        self.liste_dAmount = list ()
1738
 
        self.liste_dType = list ()
1739
 
        self.liste_dTime = list()
1740
 
        self.liste_dUse = list()
1741
 
        self.dNom = ''
1742
 
        self.dAmount = 0
1743
 
        self.dType = ''
1744
 
        self.dTime = 0
1745
 
        
1746
 
        
1747
 
        m = 0
1748
 
        while  m < AppWindow.nbreDivers :
1749
 
            m = m+1
1750
 
            for nom in misc [m-1] : 
1751
 
                if nom.tag == 'NAME' :
1752
 
                    self.dNom = nom.text
1753
 
                    self.liste_divers.append(self.dNom)
1754
 
                    
1755
 
                if nom.tag == 'AMOUNT' :
1756
 
                    self.dAmount = float(nom.text)*1000
1757
 
                    self.liste_dAmount.append(self.dAmount)
1758
 
                    
1759
 
                if nom.tag == 'TYPE' :
1760
 
                    self.dType = nom.text
1761
 
                    self.liste_dType.append(self.dType)
1762
 
                  
1763
 
                if nom.tag == 'TIME' :
1764
 
                    self.dTime = float(nom.text)
1765
 
                    self.liste_dTime.append(self.dTime)
1766
 
                  
1767
 
                if nom.tag == 'USE' :
1768
 
                    self.dUse = (nom.text)
1769
 
                    if self.dUse == 'Boil' :
1770
 
                        self.dUse = self.trUtf8('Ébullition')
1771
 
                        self.liste_dUse.append(self.dUse)
1772
 
                    if self.dUse == 'Mash' :
1773
 
                        self.dUse = self.trUtf8('Empâtage')
1774
 
                        self.liste_dUse.append(self.dUse)
1775
 
                    if self.dUse == 'Primary' :
1776
 
                        self.dUse = self.trUtf8('Primaire')
1777
 
                        self.liste_dUse.append(self.dUse)
1778
 
                    if self.dUse == 'Secondary' :
1779
 
                        self.dUse = self.trUtf8('Secondaire')
1780
 
                        self.liste_dUse.append(self.dUse)
1781
 
                    if self.dUse == 'Bottling' :
1782
 
                        self.dUse = self.trUtf8('Embouteillage')
1783
 
                        self.liste_dUse.append(self.dUse)      
1784
 
        
1785
 
        #Brassin
1786
 
        
1787
 
        try :
1788
 
            for nom in mash :
1789
 
                if nom.tag == 'NAME' :
1790
 
                    self.mashName = nom.text
1791
 
                if nom.tag == 'GRAIN_TEMP' :
1792
 
                    self.mashGrainTemp = nom.text
1793
 
                if nom.tag == 'TUN_TEMP' :
1794
 
                    self.mashTunTemp = nom.text
1795
 
                if nom.tag == 'SPARGE_TEMP' :
1796
 
                    self.spargeTemp = nom.text
1797
 
                if nom.tag == 'PH' :
1798
 
                    self.mashPh = nom.text
1799
 
                    
1800
 
            if self.mashName is not None :       
1801
 
                self.currentMash={}
1802
 
                print('ouhouh !!!!!')
1803
 
                self.currentMash['name'] = self.mashName
1804
 
                self.currentMash['ph'] = self.mashPh   
1805
 
                self.currentMash['grainTemp'] = self.mashGrainTemp
1806
 
                self.currentMash['tunTemp'] = self.mashTunTemp
1807
 
                self.currentMash['spargeTemp'] = self.spargeTemp
1808
 
            else :
1809
 
                pass
1810
 
        except :
1811
 
            pass
1812
 
           
1813
 
        #Paliers
1814
 
        try :
1815
 
            mashStep = mash.findall('.//MASH_STEP')
1816
 
            numSteps = len(mashStep)
1817
 
            listSteps =[]
1818
 
            if self.mashName is not None :
1819
 
                self.currentMash['mashSteps'] = listSteps
1820
 
            else :
1821
 
                pass
1822
 
        except :
1823
 
            pass
1824
 
 
1825
 
        try :
1826
 
            j=0
1827
 
            while j < numSteps :
1828
 
                j=j+1
1829
 
                for item in mashStep[j-1]:
1830
 
                    if item.tag == 'NAME' :
1831
 
                        stepName = item.text
1832
 
                        listSteps.append({'name' : stepName})
1833
 
                for item in mashStep[j-1]: 
1834
 
                    if item.tag == 'TYPE' :
1835
 
                        stepType = item.text
1836
 
                        dicStep = listSteps[j-1]
1837
 
                        dicStep['type']= stepType  
1838
 
                for item in mashStep[j-1]: 
1839
 
                    if item.tag == 'STEP_TIME' :
1840
 
                        stepTime = item.text
1841
 
                        dicStep = listSteps[j-1]
1842
 
                        dicStep['stepTime']= stepTime        
1843
 
                for item in mashStep[j-1]: 
1844
 
                    if item.tag == 'STEP_TEMP' :
1845
 
                        stepTemp = item.text
1846
 
                        dicStep = listSteps[j-1]
1847
 
                        dicStep['stepTemp']= stepTemp
1848
 
                for item in mashStep[j-1]: 
1849
 
                    if item.tag == 'INFUSE_AMOUNT' :
1850
 
                        stepVol = item.text
1851
 
                        dicStep = listSteps[j-1]
1852
 
                        dicStep['stepVol']= stepVol
1853
 
                                            
1854
 
            print(self.currentMash)
1855
 
            if self.mashName is not None :
1856
 
                self.mashProfilesBase.listMash.append(self.currentMash)
1857
 
            else :
1858
 
                pass
1859
 
        except :
1860
 
            pass
1861
 
        try :  
1862
 
            self.popMashCombo()
1863
 
            if self.mashName is not None :
1864
 
                self.comboBoxMashProfiles.setCurrentIndex(len(self.listMash)-1)
1865
 
                
1866
 
            else :
1867
 
                self.comboBoxMashProfiles.setCurrentIndex(-1)
1868
 
        except :
1869
 
            self.comboBoxMashProfiles.setCurrentIndex(-1)
1870
 
            
1871
 
 
1872
 
 
1873
 
 
1874
 
#        self.nbrePaliers = len(paliers)
1875
 
#        self.liste_paliers = list()
1876
 
#        self.liste_pType = list()
1877
 
#        self.liste_pTime = list()
1878
 
#        self.liste_pTemp = list()
1879
 
#        self.liste_pVol = list()
1880
 
#        
1881
 
#        
1882
 
#        
1883
 
#        
1884
 
#        p = 0
1885
 
#        while p < self.nbrePaliers : 
1886
 
#            p = p+1
1887
 
#            for nom in paliers [p-1] :
1888
 
#                if nom.tag == 'NAME' :
1889
 
#                    self.pNom = nom.text
1890
 
#                    self.liste_paliers.append(self.pNom)
1891
 
#                    
1892
 
#                if nom.tag == 'TYPE' :
1893
 
#                    self.pType = nom.text
1894
 
#                    if self.pType == 'Infusion' :
1895
 
#                        self.pType = self.trUtf8('''Infusion''')
1896
 
#                        self.liste_pType.append(self.pType)
1897
 
#                    if self.pType == '''Temperature''' :
1898
 
#                        self.pType = self.trUtf8('''Température''')
1899
 
#                        self.liste_pType.append(self.pType)
1900
 
#                    if self.pType == '''Decoction''' :
1901
 
#                        self.pType = self.trUtf8('''Décoction''')
1902
 
#                        self.liste_pType.append(self.pType)  
1903
 
#                    
1904
 
#                    
1905
 
#                if nom.tag == 'STEP_TIME' :
1906
 
#                    self.pTime = float(nom.text)
1907
 
#                    self.liste_pTime.append(self.pTime)
1908
 
#                    
1909
 
#                if nom.tag == 'STEP_TEMP' :
1910
 
#                    self.pTemp = float(nom.text)
1911
 
#                    self.liste_pTemp.append(self.pTemp)
1912
 
#                     
1913
 
#                if nom.tag == 'INFUSE_AMOUNT' :
1914
 
#                    self.pQte = float(nom.text)
1915
 
#                    self.liste_pVol.append(self.pQte)
1916
 
#                    
1917
 
#        self.lineEditBrewingProfile.setText(self.bNom)
1918
 
#        
1919
 
#        
1920
 
#        print(self.liste_paliers)
1921
 
#        print(self.liste_pType)
1922
 
        
1923
 
        return AppWindow.nbreFer
1924
 
                    
1925
 
    def calculs_recette (self) :
1926
 
        
1927
 
        #on remet le verrou à 0, il va falloir recalculer en repassant en brewday mode
1928
 
        self.brewdayLock = 0
1929
 
    
1930
 
        #Calculs sur les ingredients fermentescibles
1931
 
        #GU = 383.89*equivSucre/volFinal *rendement
1932
 
        #si extrait ou sucre ne pas tenir compte du rendement du brassage
1933
 
        #OG = 1 + (GU/1000)
1934
 
        
1935
 
        self.liste_equivSucre = list()
1936
 
        self.liste_equivSucreMashed = list()
1937
 
        self.liste_equivSucreNonMashed = list()
1938
 
        
1939
 
        self.grainWeight = sum(self.liste_fAmount)
1940
 
        
1941
 
        
1942
 
        o = 0
1943
 
        while o < AppWindow.nbreFer :
1944
 
            o = o+1
1945
 
            self.equivSucre = (self.liste_fAmount[o-1]/1000)*(self.liste_fYield[o-1]/100)
1946
 
            #division par 1000 et 100 pour passer des g aux kg et parce que le rendement est un pourcentage
1947
 
            self.liste_equivSucre.append(self.equivSucre)
1948
 
            #for type in self.liste_fType [o-1] :
1949
 
            if self.liste_fType [o-1] == 'Extract' or self.liste_fType [o-1] == 'Dry Extract' or self.liste_fType [o-1] == 'Sugar':
1950
 
                self.liste_equivSucreNonMashed.append(self.equivSucre)
1951
 
            else :
1952
 
                self.liste_equivSucreMashed.append(self.equivSucre)
1953
 
        
1954
 
        self.GU= (383.89*sum(self.liste_equivSucreMashed)/float(self.volume))*((self.rendement)/100) + (383.89*sum(self.liste_equivSucreNonMashed)/float(self.volume))
1955
 
        self.OG = 1+ (self.GU/1000)     
1956
 
            
1957
 
 
1958
 
 
1959
 
        
1960
 
        #calcul de la FG. Si il y a plusieurs levures, on recupere l'attenuation la plus elevee.
1961
 
        self.levureAttenDec = sorted (self.liste_levureAtten, reverse = True)
1962
 
        if not self.levureAttenDec : 
1963
 
            self.atten = 0.75
1964
 
        if self.levureAttenDec :
1965
 
            self.atten = self.levureAttenDec[0]/100
1966
 
        
1967
 
        self.GUF = self.GU*(1-self.atten)
1968
 
        self.FG = 1 + self.GUF/1000
1969
 
        
1970
 
        
1971
 
        #calcul des proportions pour les grains
1972
 
        self.liste_fProportion = list()
1973
 
        poidsTot = sum(self.liste_fAmount)  
1974
 
        i = 0
1975
 
        while i < AppWindow.nbreFer :
1976
 
            i=i+1
1977
 
            propGrain = (self.liste_fAmount[i-1] / poidsTot)*100
1978
 
            self.liste_fProportion.append(propGrain)
1979
 
 
1980
 
 
1981
 
 
1982
 
        
1983
 
        
1984
 
        #calcul de l'amertume : methode de Tinseth
1985
 
        #IBUs = decimal alpha acid utilization * mg/l of added alpha acids
1986
 
        
1987
 
        #mg/l of added alpha acids = decimal AA rating * grams hops * 1000 / liters of wort
1988
 
        #Decimal Alpha Acid Utilization = Bigness Factor * Boil Time Factor
1989
 
        #Bigness factor = 1.65 * 0.000125^(wort gravity - 1)
1990
 
        #Boil Time factor = 1 - e^(-0.04 * time in mins) / 4.15
1991
 
        self.liste_btFactor = list()
1992
 
        self.liste_ibuPart = list()
1993
 
        
1994
 
        for time in self.liste_hTime :
1995
 
            self.btFactor = (1 - 2.71828182845904523536**(-0.04 * time)) / 4.15
1996
 
            self.liste_btFactor.append(self.btFactor)
1997
 
            
1998
 
        self.bignessFactor = 1.65 * (0.000125**(self.OG - 1))
1999
 
        i = 0
2000
 
        while i < len(self.liste_btFactor) :
2001
 
            i = i+1
2002
 
            self.aaUtil = self.liste_btFactor[i-1]*self.bignessFactor
2003
 
            self.mgAA = (self.liste_hAlpha[i-1]/100)*self.liste_hAmount[i-1]*1000 / float(self.volume)
2004
 
            try :
2005
 
                if self.liste_hUse[i-1] == 'Dry Hop' or self.liste_hUse[i-1] == 'Aroma' or self.liste_hUse[i-1] == 'Arôme' or self.liste_hUse[i-1] == 'Dry Hopping' :
2006
 
                    self.ibuPart = 0
2007
 
                elif self.liste_hForm[i-1] == 'Pellet' :
2008
 
                    self.ibuPart = (self.mgAA * self.aaUtil) + 0.1*(self.mgAA * self.aaUtil)
2009
 
                else :
2010
 
                    self.ibuPart = self.mgAA * self.aaUtil 
2011
 
                self.liste_ibuPart.append(self.ibuPart)
2012
 
            except:
2013
 
                if self.liste_hForm[i-1] == 'Pellet' :
2014
 
                    self.ibuPart = (self.mgAA * self.aaUtil) + 0.1*(self.mgAA * self.aaUtil)
2015
 
                else :
2016
 
                    self.ibuPart = self.mgAA * self.aaUtil 
2017
 
                self.liste_ibuPart.append(self.ibuPart)
2018
 
            
2019
 
 
2020
 
        self.ibuTot = sum(self.liste_ibuPart)
2021
 
 
2022
 
        
2023
 
        
2024
 
        #calcul de la couleur
2025
 
        #calcul du MCU pour chaque grain :
2026
 
        #MCU=4.23*EBC(grain)*Poids grain(Kg)/Volume(L)
2027
 
        #puis addition de tous les MCU
2028
 
        #puis calcul EBC total :
2029
 
        #EBC=2.939*MCU^0.6859
2030
 
        self.liste_mcuPart = list()
2031
 
        i = 0
2032
 
        while i < AppWindow.nbreFer :
2033
 
            i = i + 1
2034
 
            self.mcuPart  = 4.23*self.liste_color[i-1]*(self.liste_fAmount[i-1]/1000)/float(self.volume)
2035
 
            self.liste_mcuPart.append(self.mcuPart)
2036
 
        self.mcuTot = sum(self.liste_mcuPart) 
2037
 
        self.EBC = 2.939*(self.mcuTot**0.6859)
2038
 
        
2039
 
        self.colorPreview()
2040
 
 
2041
 
        
2042
 
        #calcul ABV
2043
 
        #ABV = 0.130((OG-1)-(FG-1))*1000
2044
 
        
2045
 
        self.ABV = 0.130*((self.OG-1) -(self.FG-1))*1000
2046
 
 
2047
 
        self.displayProfile()
2048
 
        
2049
 
    def displayProfile(self) :     
2050
 
        self.labelOGV.setText(str("%.3f" %(self.OG)))
2051
 
        self.labelFGV.setText(str("%.3f" %(self.FG)))
2052
 
        self.labelEBCV.setText(str("%.0f" %(self.EBC)))
2053
 
        self.labelIBUV.setText(str("%.0f" %(self.ibuTot)))
2054
 
        self.labelAlcv.setText(str("%.1f" %(self.ABV)) + '%')
2055
 
        
2056
 
        
2057
 
                        
2058
 
    def volPreCalc(self) :
2059
 
        indice = float(self.volume) / self.doubleSpinBoxVolPre.value()       
2060
 
        self.GUS = self.GU * indice
2061
 
        self.SG = 1+ (self.GUS/1000) 
2062
 
        self.labelSG.setText("%.3f" %self.SG)
2063
 
        
2064
 
        
2065
 
    def ouvrir_clicked (self) :    
2066
 
        self.s = QtGui.QFileDialog.getOpenFileName(self,
2067
 
            self.trUtf8("Ouvrir un fichier"),
2068
 
            home_dir,
2069
 
            )
2070
 
        if not self.s :
2071
 
            pass
2072
 
        else :
2073
 
            i = (AppWindow.nbreFer + AppWindow.nbreDivers + AppWindow.nbreHops + self.nbreLevures)
2074
 
            self.modele.removeRows(0,i)
2075
 
            AppWindow.nbreFer = 0
2076
 
            AppWindow.nbreHops = 0
2077
 
            AppWindow.nbreDivers = 0
2078
 
            self.nouvelle()
2079
 
            self.importBeerXML()
2080
 
            self.calculs_recette()
2081
 
            self.MVC()
2082
 
            self.switchToEditor()
2083
 
       
2084
 
    def openRecipeFile(self,filePath):
2085
 
        self.s = filePath
2086
 
        AppWindow.nbreFer = 0
2087
 
        AppWindow.nbreHops = 0
2088
 
        AppWindow.nbreDivers = 0
2089
 
        self.nouvelle()
2090
 
        self.importBeerXML()
2091
 
        self.calculs_recette()
2092
 
        self.MVC()
2093
 
        self.switchToEditor()
2094
 
 
2095
 
    
2096
 
    def about(self) : 
2097
 
        QtGui.QMessageBox.about(self,
2098
 
                self.trUtf8("A propos"),
2099
 
                self.trUtf8("<h1>JolieBulle</h1> <b>version 2.6</b><br/>copyright (c) 2010-2012 Pierre Tavares<p> JolieBulle est un logiciel de lecture et de formulation de recettes de brassage.</p><p><a href =http://www.gnu.org/licenses/gpl-3.0.html>Licence : Version 3 de la Licence Générale Publique GNU</a></p><p>Certaines icônes proviennent du pack Faenza par Tiheum (Matthieu James), également distribué sous licence GPL.</p>"))
2100
 
        
2101
 
            
2102
 
    def rendemt_changed(self) :
2103
 
        if self.checkBoxIng.isChecked() :
2104
 
            ratio = self.rendement/self.doubleSpinBoxRendemt.value()
2105
 
            
2106
 
            i = 0
2107
 
            while i < AppWindow.nbreFer :
2108
 
                i = i +1 
2109
 
                if self.liste_fType[i-1] == 'Extract' :
2110
 
                    pass
2111
 
                else :
2112
 
                    self.liste_fAmount[i-1] = self.liste_fAmount[i-1] * ratio
2113
 
                    amount = QtGui.QStandardItem("%.0f" %(self.liste_fAmount[i-1]))
2114
 
                    self.modele.setItem(i-1,1,amount)
2115
 
            self.rendement = self.doubleSpinBoxRendemt.value()
2116
 
            self.calculs_recette()      
2117
 
                    
2118
 
        else :
2119
 
            self.rendement = self.doubleSpinBoxRendemt.value()
2120
 
            self.calculs_recette()
2121
 
            
2122
 
    def volume_changed(self) :
2123
 
    
2124
 
        if self.checkBoxIng.isChecked() :
2125
 
            ratio = self.doubleSpinBox_2Volume.value()/float(self.volume)
2126
 
            
2127
 
            i = 0
2128
 
            while i < AppWindow.nbreFer :
2129
 
                i=i+1
2130
 
                self.liste_fAmount[i-1] = self.liste_fAmount[i-1] * ratio
2131
 
                self.volume = self.doubleSpinBox_2Volume.value()
2132
 
                amount = QtGui.QStandardItem("%.0f" %(self.liste_fAmount[i-1]))
2133
 
                self.modele.setItem(i-1,1,amount)
2134
 
            
2135
 
            h = 0
2136
 
            while h < AppWindow.nbreHops :
2137
 
                h = h + 1
2138
 
                self.liste_hAmount[h-1] = self.liste_hAmount[h-1] * ratio
2139
 
                self.volume = self.doubleSpinBox_2Volume.value()
2140
 
                amount = QtGui.QStandardItem("%.3f" %(self.liste_hAmount[h-1]) )
2141
 
                self.modele.setItem(i+h-1,1,amount)
2142
 
            
2143
 
            
2144
 
            m = 0
2145
 
            while m < AppWindow.nbreDivers :
2146
 
                m = m + 1
2147
 
                self.liste_dAmount[m-1] = self.liste_dAmount[m-1] * ratio
2148
 
                self.volume = self.doubleSpinBox_2Volume.value()
2149
 
                amount = QtGui.QStandardItem("%.0f" %(self.liste_dAmount[m-1]) )
2150
 
                self.modele.setItem(i+h+m-1, 1, amount)
2151
 
            
2152
 
            self.calculs_recette()
2153
 
 
2154
 
        else :
2155
 
            self.volume = self.doubleSpinBox_2Volume.value()
2156
 
            self.calculs_recette()
2157
 
            
2158
 
    def typeChanged (self) :
2159
 
        if self.comboBoxType.currentIndex() == 0 :
2160
 
            self.typeRecette = "All Grain"
2161
 
        if self.comboBoxType.currentIndex() == 1 :   
2162
 
            self.typeRecette = "Extract"
2163
 
        if self.comboBoxType.currentIndex() == 2 :
2164
 
            self.typeRecette = "Partial Mash"
2165
 
 
2166
 
    def enregistrer (self) :
2167
 
        exp=Export()
2168
 
        print ('''la liste des usages :''' , self.liste_hUse)
2169
 
        print("liste des formes :", self.liste_hForm)
2170
 
        self.nomRecette = self.lineEditRecette.text()
2171
 
        self.styleRecette = self.lineEditGenre.text()   
2172
 
        self.brewer = self.lineEditBrewer.text()        
2173
 
        self.boil = self.spinBoxBoil.value()
2174
 
        if not self.s : 
2175
 
            #self.enregistrerSous()
2176
 
            recettes = QtCore.QFile(recettes_dir)
2177
 
            self.s =  recettes_dir +"/" + self.nomRecette + ".xml"
2178
 
            
2179
 
 
2180
 
 
2181
 
            exp.exportXML(self.nomRecette, self.styleRecette, self.typeRecette, self.brewer, self.volume, self.boil, self.rendement,self.OG, self.FG, AppWindow.nbreHops, self.liste_houblons, self.liste_hAmount, self.liste_hForm, self.liste_hTime, self.liste_hAlpha,self.liste_hUse, AppWindow.nbreFer, self.fNom, self.fAmount ,self.fType, self.fYield, self.fMashed, self.color, self.liste_ingr, self.liste_fAmount, self.liste_fType, self.liste_fYield, self.liste_fMashed, self.liste_color, self.dNom, self.dAmount, self.dType, AppWindow.nbreDivers, self.liste_divers, self.liste_dAmount, self.liste_dType, self.liste_dTime,self.liste_dUse, self.nbreLevures, self.lNom, self.lForm, self.lLabo, self.lProd, self.lAtten, self.liste_levures, self.liste_lForm, self.liste_lLabo, self.liste_lProdid, self.liste_levureAtten, self.recipeNotes,self.currentMash)
2182
 
            exp.enregistrer(self.s)
2183
 
        else :
2184
 
 
2185
 
            
2186
 
            exp.exportXML(self.nomRecette, self.styleRecette, self.typeRecette, self.brewer, self.volume, self.boil, self.rendement, self.OG, self.FG,AppWindow.nbreHops, self.liste_houblons, self.liste_hAmount, self.liste_hForm, self.liste_hTime, self.liste_hAlpha,self.liste_hUse, AppWindow.nbreFer, self.fNom, self.fAmount ,self.fType, self.fYield, self.fMashed, self.color, self.liste_ingr, self.liste_fAmount, self.liste_fType, self.liste_fYield, self.liste_fMashed, self.liste_color, self.dNom, self.dAmount, self.dType, AppWindow.nbreDivers, self.liste_divers, self.liste_dAmount, self.liste_dType, self.liste_dTime,self.liste_dUse, self.nbreLevures, self.lNom, self.lForm, self.lLabo, self.lProd, self.lAtten, self.liste_levures, self.liste_lForm, self.liste_lLabo, self.liste_lProdid, self.liste_levureAtten, self.recipeNotes,self.currentMash)
2187
 
            exp.enregistrer(self.s)
2188
 
    
2189
 
        
2190
 
    def enregistrerSous (self) :
2191
 
        exp=Export()
2192
 
        self.nomRecette = self.lineEditRecette.text()  
2193
 
        self.styleRecette = self.lineEditGenre.text()
2194
 
        self.brewer = self.lineEditBrewer.text()  
2195
 
        self.boil = self.spinBoxBoil.value()
2196
 
        self.s = QtGui.QFileDialog.getSaveFileName (self,
2197
 
                                                    self.trUtf8("Enregistrer dans un fichier"),
2198
 
                                                    recettes_dir + "/" + self.nomRecette,
2199
 
                                                    "BeerXML (*.xml)")
2200
 
        exp.exportXML(self.nomRecette, self.styleRecette, self.typeRecette, self.brewer, self.volume, self.boil, self.rendement,self.OG, self.FG, AppWindow.nbreHops, self.liste_houblons, self.liste_hAmount, self.liste_hForm, self.liste_hTime, self.liste_hAlpha, self.liste_hUse, AppWindow.nbreFer, self.fNom, self.fAmount ,self.fType, self.fYield, self.fMashed, self.color, self.liste_ingr, self.liste_fAmount, self.liste_fType, self.liste_fYield, self.liste_fMashed, self.liste_color, self.dNom, self.dAmount, self.dType, AppWindow.nbreDivers, self.liste_divers, self.liste_dAmount, self.liste_dType, self.liste_dTime, self.liste_dUse, self.nbreLevures, self.lNom, self.lForm, self.lLabo, self.lProd, self.lAtten, self.liste_levures, self.liste_lForm, self.liste_lLabo, self.liste_lProdid, self.liste_levureAtten, self.recipeNotes,self.currentMash)
2201
 
        exp.enregistrer(self.s)  
2202
 
    def exporterHtml (self) :
2203
 
        self.nomRecette = self.lineEditRecette.text()
2204
 
        self.styleRecette = self.lineEditGenre.text()
2205
 
        
2206
 
        exp = ExportHTML()
2207
 
        self.h = QtGui.QFileDialog.getSaveFileName (self,
2208
 
                                                    self.trUtf8("Enregistrer dans un fichier"),
2209
 
                                                    self.nomRecette,
2210
 
                                                    "HTML (*.html)")    
2211
 
        
2212
 
        self.fileHtml = QtCore.QFile(self.h)
2213
 
        exp.exportHtml(self.nomRecette,self.styleRecette, self.volume, self.boil, AppWindow.nbreFer, self.liste_ingr, self.liste_fAmount, AppWindow.nbreHops, self.liste_houblons, self.liste_hAlpha, self.liste_hForm, self.liste_hAmount, self.liste_hTime, AppWindow.nbreDivers, self.liste_divers, self.liste_dType, self.liste_dAmount, self.liste_dTime, self.nbreLevures, self.liste_levuresDetail,self.rendement, self.OG, self.FG, self.EBC, self.ibuTot ,self.ABV, self.recipeNotes)
2214
 
        
2215
 
        exp.enregistrerHtml(self.fileHtml)
2216
 
    
2217
 
    def modifierStyle (self) :
2218
 
        if self.pushButtonChangerStyle.isChecked () :
2219
 
            self.comboBoxStyle.show()
2220
 
        else :
2221
 
            self.comboBoxStyle.hide()   
2222
 
 
2223
 
    def volMore (self) :
2224
 
        if self.pushButtonVolMore.isChecked() :
2225
 
            self.widgetVol.show()
2226
 
        else :
2227
 
            self.widgetVol.hide()
2228
 
 
2229
 
            
2230
 
    def nouvelle(self) :
2231
 
        
2232
 
        self.nomRecette = self.trUtf8('Nouvelle Recette')
2233
 
        self.rendement = 75
2234
 
        self.volume = '10'
2235
 
        self.boil = '60'
2236
 
        self.styleRecette = self.trUtf8('''Générique''')
2237
 
        self.lineEditBrewer.setText('')
2238
 
        self.comboBoxType.setCurrentIndex(0)
2239
 
        self.recipeNotes =''
2240
 
        
2241
 
        
2242
 
        
2243
 
        #AppWindow.nbreFer = 0
2244
 
        self.liste_ingr = list()
2245
 
        self.liste_fAmount = list()
2246
 
        self.liste_fType = list()
2247
 
        self.liste_fYield = list()
2248
 
        self.liste_fMashed = list()
2249
 
        self.liste_color = list()
2250
 
        self.fMashed = ''
2251
 
        self.fNom = ''
2252
 
        self.fAmount = 0
2253
 
        self.fType = ''
2254
 
        self.fYield = 0
2255
 
        self.color = 0
2256
 
        
2257
 
        #AppWindow.nbreHops = 0
2258
 
        self.liste_houblons = list()
2259
 
        self.liste_hAmount = list()
2260
 
        self.liste_hForm = list()
2261
 
        self.liste_hTime = list()
2262
 
        self.liste_hAlpha = list()
2263
 
        self.liste_hUse = list()
2264
 
        
2265
 
        self.nbreLevures = 0
2266
 
        self.liste_levures = list()
2267
 
        self.liste_lForm = list()
2268
 
        self.liste_lLabo = list()
2269
 
        self.liste_lProdid = list()
2270
 
        self.liste_levuresDetail = list()
2271
 
        self.liste_levureAtten = list ()
2272
 
        self.lNom = ""
2273
 
        self.lLabo =""
2274
 
        self.lProd =""
2275
 
        self.lForm = ""
2276
 
        self.lAtten=""
2277
 
        
2278
 
        #AppWindow.nbreDivers = 0
2279
 
        self.liste_divers = list ()
2280
 
        self.liste_dAmount = list ()
2281
 
        self.liste_dType = list ()
2282
 
        self.dNom = ''
2283
 
        self.dAmount = 0
2284
 
        self.dType = ''
2285
 
        self.liste_dTime = list()
2286
 
        self.liste_dUse = list()
2287
 
        
2288
 
        self.lineEditRecette.setText(self.nomRecette)
2289
 
        self.lineEditGenre.setText(self.styleRecette)
2290
 
        self.doubleSpinBox_2Volume.setValue(float(self.volume))
2291
 
        self.doubleSpinBoxRendemt.setValue(self.rendement)
2292
 
        try : 
2293
 
            self.spinBoxBoil.setValue(float(self.boil))
2294
 
        except :
2295
 
            self.spinBoxBoil.setValue (0)
2296
 
            
2297
 
        self.listMash = list()
2298
 
        self.currentMash = {}
2299
 
        self.listStepsAll = list()
2300
 
        self.dicMashDetail = {}
2301
 
        self.mashProfilesBase.listMash = list()
2302
 
        self.mashProfilesBase.importBeerXML()
2303
 
        self.mashName=None
2304
 
        self.popMashCombo()
2305
 
        self.comboBoxMashProfiles.setCurrentIndex(-1)
2306
 
        self.brewdayLock = 0
2307
 
 
2308
 
        
2309
 
        
2310
 
    def recharger(self) :
2311
 
        i = (AppWindow.nbreFer + AppWindow.nbreDivers + AppWindow.nbreHops + self.nbreLevures)
2312
 
        self.modele.removeRows(0,i)
2313
 
        AppWindow.nbreFer = 0
2314
 
        AppWindow.nbreHops = 0
2315
 
        AppWindow.nbreDivers = 0
2316
 
        self.nouvelle()
2317
 
        self.importBeerXML()
2318
 
        self.calculs_recette()
2319
 
        self.MVC()
2320
 
                        
2321
 
    def addStyle(self) :
2322
 
        self.lineEditGenre.setText(self.comboBoxStyle.currentText())
2323
 
        
2324
 
    def recipeNotesClicked (self) :
2325
 
        self.switchToNotes()
2326
 
        self.textEditRecipeNotes.setText(self.recipeNotes)
2327
 
    
2328
 
    def recipeNotesAccepted (self) :
2329
 
        self.switchToEditor()
2330
 
        self.recipeNotes = self.textEditRecipeNotes.toPlainText()
2331
 
        print (self.recipeNotes)
2332
 
        
2333
 
    def recipeNotesRejected (self) :
2334
 
        self.switchToEditor()
2335
 
        
2336
 
    def popMashCombo (self):
2337
 
        self.listMash = self.mashProfilesBase.listMash
2338
 
        self.comboBoxMashProfiles.clear() 
2339
 
        for name in self.listMash :
2340
 
           self.comboBoxMashProfiles.addItem(name['name'])
2341
 
           
2342
 
    def mashComboChanged (self) :
2343
 
        #on remet le verrou à 0, il va falloir recalculer en repassant en brewday mode
2344
 
        self.brewdayLock = 0
2345
 
        self.enableBrewdayMode()
2346
 
        i =self.comboBoxMashProfiles.currentIndex()
2347
 
        self.currentMash = self.mashProfilesBase.listMash[i]
2348
 
        self.tableWidgetStepsBrewday_currentRowChanged()
2349
 
        
2350
 
        
2351
 
        print(self.currentMash)
2352
 
        print("lock", self.brewdayLock)
2353
 
        
2354
 
        
2355
 
        
2356
 
    def seeMash(self) :
2357
 
        self.switchToMash()
2358
 
        self.listWidgetMashProfiles.clear() 
2359
 
#        print(self.mashProfilesBase.listMash)
2360
 
        self.numMash = self.mashProfilesBase.numMash
2361
 
        self.numSteps = self.mashProfilesBase.numSteps
2362
 
        self.listMash = self.mashProfilesBase.listMash
2363
 
        self.listStepsAll = list()
2364
 
        self.popMashList()
2365
 
        self.pushButtonMashEdit.setEnabled(False)
2366
 
        self.pushButtonRemoveProfile.setEnabled(False)
2367
 
        self.pushButtonStepRemove.setEnabled(False)
2368
 
        self.pushButtonStepEdit.setEnabled(False)
2369
 
        
2370
 
    def popMashList(self) :
2371
 
        self.listWidgetMashProfiles.clear() 
2372
 
        for name in self.listMash :
2373
 
           self.listWidgetMashProfiles.addItem(name['name'])    
2374
 
        for steps in self.listMash :
2375
 
            dicStep = steps['mashSteps']
2376
 
            self.listStepsAll.append(dicStep)
2377
 
            
2378
 
            
2379
 
    def mashClicked(self) :
2380
 
        self.listWidgetSteps.clear()         
2381
 
        index = self.listWidgetMashProfiles.currentRow()
2382
 
        self.listSteps = self.listStepsAll[index]
2383
 
        self.dicMashDetail = self.listMash[index]
2384
 
        for stepName in self.listSteps :
2385
 
            self.listWidgetSteps.addItem(stepName['name'])
2386
 
            
2387
 
        self.labelStepName.setTextFormat(QtCore.Qt.RichText)   
2388
 
        self.labelMashName.setText("<b>" + self.dicMashDetail['name'] + "</b>")
2389
 
        self.labelMashPh.setText("%.1f" %float(self.dicMashDetail['ph']))
2390
 
#        self.labelMashGrainTemp.setText("%.1f" %float(self.dicMashDetail['grainTemp']))
2391
 
#        self.labelMashTunTemp.setText("%.1f" %float(self.dicMashDetail['tunTemp']))
2392
 
        try :
2393
 
            self.labelMashSpargeTemp.setText("%.1f" %float(self.dicMashDetail['spargeTemp']))
2394
 
        except :
2395
 
            pass
2396
 
        try :
2397
 
            self.listWidgetSteps.setCurrentRow(0)
2398
 
        except :
2399
 
            pass
2400
 
#        print(self.dicMashDetail)
2401
 
        self.pushButtonMashEdit.setEnabled(True)
2402
 
        self.pushButtonRemoveProfile.setEnabled(True)
2403
 
            
2404
 
                
2405
 
    def mashDetails(self) :
2406
 
#        self.switchToMash()
2407
 
#        self.listWidgetMashProfiles.clear()
2408
 
#        self.listWidgetMashProfiles.addItem(self.bNom)
2409
 
#        self.listWidgetSteps.clear()
2410
 
#        self.listWidgetSteps.addItems(self.liste_paliers)
2411
 
        self.seeMash()
2412
 
        i = self.comboBoxMashProfiles.currentIndex()
2413
 
        self.listWidgetMashProfiles.setCurrentRow(i)
2414
 
        
2415
 
        
2416
 
    def stepDetails(self) :
2417
 
        i = self.listWidgetSteps.currentRow()
2418
 
        self.listStepName = list()
2419
 
        self.listStepType = list()
2420
 
        self.listStepTemp = list()
2421
 
        self.listStepTime = list()
2422
 
        self.listStepVol = list()  
2423
 
        for stepName in self.listSteps :
2424
 
            self.listStepName.append(stepName['name'])
2425
 
        for stepType in self.listSteps :
2426
 
            self.listStepType.append(stepType['type'])
2427
 
        for stepTime in self.listSteps :
2428
 
            self.listStepTime.append(float(stepTime['stepTime']))
2429
 
        for stepTemp in self.listSteps :
2430
 
            self.listStepTemp.append(float(stepTemp['stepTemp']))
2431
 
        for stepVol in self.listSteps :
2432
 
            self.listStepVol.append(float(stepVol['stepVol']))
2433
 
            
2434
 
        self.labelStepName.setTextFormat(QtCore.Qt.RichText)
2435
 
        self.labelStepName.setText("<b>" + self.listStepName[i] +"</b>")            
2436
 
        self.labelStepType.setText(self.listStepType[i])
2437
 
        self.labelStepTemp.setText("%.1f" %(self.listStepTemp[i]))
2438
 
        self.labelStepTime.setText("%.0f" %(self.listStepTime[i]))  
2439
 
#        self.labelStepVol.setText("%.1f" %(self.listStepVol[i]))   
2440
 
        self.pushButtonStepRemove.setEnabled(True)
2441
 
        self.pushButtonStepEdit.setEnabled(True)
2442
 
            
2443
 
        
2444
 
        
2445
 
    def stepEdit(self) :
2446
 
        i = self.listWidgetSteps.currentRow()
2447
 
        self.dlgStep.show()
2448
 
        self.dlgStep.fields (self.listStepName[i], self.listStepType[i], self.listStepTime[i], self.listStepTemp[i], self.listStepVol[i])
2449
 
    
2450
 
    def stepReload(self, stepName, stepType, stepTime, stepTemp ,stepVol) :
2451
 
        f = self.listWidgetMashProfiles.currentRow()
2452
 
        i = self.listWidgetSteps.currentRow()
2453
 
        self.listStepName[i] = stepName
2454
 
        self.listStepType[i] = stepType
2455
 
        self.listStepTemp[i] = stepTemp
2456
 
        self.listStepTime[i] = stepTime
2457
 
        self.listStepVol[i] = stepVol
2458
 
        dicCurrentStep = {}
2459
 
        dicCurrentStep = {'name' : stepName, 'type' : stepType, 'stepTime' : stepTime, 'stepTemp' : stepTemp, 'stepVol' : stepVol}
2460
 
        del self.listSteps[i]
2461
 
        self.listSteps.insert(i, dicCurrentStep) 
2462
 
        self.listWidgetSteps.clear() 
2463
 
        self.seeMash()
2464
 
        self.stepDetails()
2465
 
        self.listWidgetMashProfiles.setCurrentRow(f)
2466
 
        self.listWidgetSteps.setCurrentRow(i)
2467
 
        
2468
 
        
2469
 
    def removeStep(self) :
2470
 
        i = self.listWidgetSteps.currentRow()
2471
 
        del self.listSteps[i]
2472
 
        self.seeMash()
2473
 
        
2474
 
    def addStep(self) :
2475
 
        f = self.listWidgetMashProfiles.currentRow()
2476
 
        dicNewStep = {'name' : 'Nouveau Palier', 'type' : 'Infusion', 'stepTime' : '0', 'stepTemp' : '0', 'stepVol' : '0'}
2477
 
        self.listSteps.append(dicNewStep)
2478
 
        i = len(self.listSteps)
2479
 
        self.listWidgetMashProfiles.setCurrentRow(f)
2480
 
        self.seeMash()
2481
 
        self.stepDetails()      
2482
 
        self.listWidgetMashProfiles.setCurrentRow(f)
2483
 
        self.listWidgetSteps.setCurrentRow(i-1)
2484
 
        self.stepEdit()
2485
 
        
2486
 
        
2487
 
    def mashEdit(self) :
2488
 
        i = self.listWidgetMashProfiles.currentRow()
2489
 
        self.dlgMash.show()
2490
 
        self.dlgMash.fields(self.dicMashDetail['name'],self.dicMashDetail['ph'],self.dicMashDetail['grainTemp'],self.dicMashDetail['tunTemp'],self.dicMashDetail['spargeTemp'])
2491
 
        
2492
 
    def mashReload(self,name,ph,grainT,tunT,spargeT) :
2493
 
        #on remet le verrou à 0, il va falloir recalculer en repassant en brewday mode
2494
 
        self.brewdayLock = 0
2495
 
        
2496
 
        f = self.listWidgetMashProfiles.currentRow()
2497
 
        self.dicMashDetail['name'] = name
2498
 
        self.dicMashDetail['ph'] = ph
2499
 
        self.dicMashDetail['grainTemp'] = 20
2500
 
        self.dicMashDetail['tunTemp'] = 20
2501
 
        self.dicMashDetail['spargeTemp'] = spargeT
2502
 
        del self.listMash[f]
2503
 
        self.listMash.insert(f, self.dicMashDetail)
2504
 
        self.popMashList()
2505
 
        self.listWidgetMashProfiles.setCurrentRow(f)
2506
 
        
2507
 
#        print(self.dicMashDetail)
2508
 
 
2509
 
    def addMash(self) :
2510
 
        dicNewMash = {'name' : 'Nouveau profil', 'grainTemp' : '0', 'tunTemp' : '0', 'spargeTemp' : '78', 'ph' : '5.4', 'mashSteps' : [{'name' : 'Nouveau Palier', 'type' : 'Infusion', 'stepTime' : '0', 'stepTemp' : '0', 'stepVol' : '0'}]}
2511
 
        self.listMash.append(dicNewMash)
2512
 
        self.seeMash()
2513
 
        self.listWidgetMashProfiles.setCurrentRow(len(self.listMash)-1)
2514
 
        
2515
 
    def removeMash(self) :
2516
 
        i = self.listWidgetMashProfiles.currentRow()
2517
 
        del self.listMash[i]
2518
 
        self.seeMash()
2519
 
        self.listWidgetSteps.clear() 
2520
 
        
2521
 
    def mashRejected (self) :
2522
 
        self.mashProfilesBase.importBeerXML()
2523
 
        self.switchToEditor()
2524
 
        
2525
 
    def mashAccepted (self) :
2526
 
        i = self.listWidgetMashProfiles.currentRow()
2527
 
        self.currentMash = self.listMash[i]
2528
 
        self.popMashCombo()
2529
 
        self.switchToEditor()
2530
 
        self.comboBoxMashProfiles.setCurrentIndex(i)
2531
 
        print(self.currentMash)
2532
 
        
2533
 
    def saveProfile(self) : 
2534
 
        self.mashProfileExport.export(self.listMash)
2535
 
        self.mashProfileExport.enregistrer(mash_file)
2536
 
        
2537
 
        
2538
 
    def brewdayModeCalc(self) :
2539
 
        self.labelWarningBiab.hide() 
2540
 
        self.brewdayLock = 1
2541
 
    
2542
 
        if self.radioButtonClassicBrew.isChecked() :
2543
 
            self.labelNoSparge.hide()
2544
 
            self.labelSparge1.show()
2545
 
            self.labelSparge2.show()
2546
 
            self.labelSpargeTemp.show()
2547
 
            self.labelSpargeVol.show()            
2548
 
        else :
2549
 
            self.labelNoSparge.show()
2550
 
            self.labelSparge1.hide()
2551
 
            self.labelSparge2.hide()
2552
 
            self.labelSpargeTemp.hide()
2553
 
            self.labelSpargeVol.hide()
2554
 
            
2555
 
        self.labelNoDecoction.hide()
2556
 
                
2557
 
        self.brewCalc.calcPreBoilVolume(self.volume, self.spinBoxBoil.value())
2558
 
        
2559
 
        self.brewCalc.calcPreBoilSg(self.GU, self.volume)
2560
 
       
2561
 
        
2562
 
        self.labelPreBoilVol.setText("%.1f" %(self.brewCalc.volPreBoil) + " " + "L")
2563
 
        self.labelPreBoilGravity.setText("%.3f" %(self.brewCalc.preBoilSg))
2564
 
        
2565
 
        
2566
 
        listSteps = self.currentMash['mashSteps']
2567
 
        spargeTemp = float(self.currentMash['spargeTemp'])
2568
 
#        print("la liste en breday mode", listSteps)
2569
 
        
2570
 
        strikeStep = listSteps[0]
2571
 
        strikeTargetTemp = strikeStep['stepTemp']
2572
 
        strikeName = strikeStep['name']
2573
 
        strikeTime = strikeStep['stepTime']
2574
 
        
2575
 
        self.tableWidgetStepsBrewday.setRowCount(len(listSteps))
2576
 
        
2577
 
#       si on n'est pas dans le cas d'un BIAB
2578
 
        if self.radioButtonClassicBrew.isChecked() :
2579
 
            self.brewCalc.calcStrikeTemp(strikeTargetTemp, 3)
2580
 
            print("la tempet envoyée ", strikeTargetTemp)
2581
 
            print(self.brewCalc.strikeTemp)
2582
 
            self.brewCalc.calcStrikeVol(self.grainWeight, 3)
2583
 
            print(self.brewCalc.strikeVol)
2584
 
            self.brewCalc.calcMashVolume(self.grainWeight)
2585
 
            print(self.brewCalc.grainVolume, self.brewCalc.mashVolumeStrike)
2586
 
            self.brewCalc.calcGrainRetention(self.grainWeight)
2587
 
        
2588
 
        
2589
 
        
2590
 
            listVol = []
2591
 
            listVol.append(self.brewCalc.strikeVol)
2592
 
            self.brewdayListTemp = []
2593
 
            listName = []
2594
 
            #on traite les paliers autres que l'empâtage,
2595
 
            i = 0
2596
 
            while i < len(listSteps)-1 :
2597
 
                i = i+1 
2598
 
                step = listSteps[i]
2599
 
                stepName = step['name']
2600
 
    #            stepVol =  float(step['stepVol'])
2601
 
                stepTemp = float(step['stepTemp'])
2602
 
                stepType= step['type']  
2603
 
                stepTime = step['stepTime']          
2604
 
                
2605
 
                listName.append(stepName)
2606
 
                self.brewdayListTemp.append(stepTemp)
2607
 
                if i == 1 :
2608
 
                    mashTemp = strikeTargetTemp
2609
 
                elif i != 1 :
2610
 
                    mashTemp = self.brewdayListTemp[i-2]
2611
 
                
2612
 
 
2613
 
                self.brewCalc.calcInfusionStep(i, self.grainWeight, listVol, stepTemp, mashTemp, 90, stepType )
2614
 
 
2615
 
 
2616
 
                listVol.append(self.brewCalc.infuseVol)
2617
 
                
2618
 
                self.tableWidgetStepsBrewday.setItem(i,0,QtGui.QTableWidgetItem(stepName))
2619
 
                self.tableWidgetStepsBrewday.setItem(i,1,QtGui.QTableWidgetItem("%.1f" %(self.brewCalc.infuseVol)))
2620
 
                if stepType == 'Infusion' :
2621
 
                    self.tableWidgetStepsBrewday.setItem(i,2,QtGui.QTableWidgetItem(str(90)))
2622
 
                elif stepType == 'Temperature' :
2623
 
                    self.tableWidgetStepsBrewday.setItem(i,2,QtGui.QTableWidgetItem(str(0)))
2624
 
                else : 
2625
 
                    self.labelNoDecoction.show()
2626
 
                    
2627
 
                self.tableWidgetStepsBrewday.setItem(i,3,QtGui.QTableWidgetItem("%.1f" %(self.brewCalc.newRatio))) 
2628
 
                self.tableWidgetStepsBrewday.setItem(i,4,QtGui.QTableWidgetItem("%.1f" %(stepTemp) + "°C, " + stepTime +" min"))         
2629
 
 
2630
 
            
2631
 
              
2632
 
            self.tableWidgetStepsBrewday.setItem(0,0,QtGui.QTableWidgetItem(strikeName))
2633
 
            self.tableWidgetStepsBrewday.setItem(0,1,QtGui.QTableWidgetItem(str(self.brewCalc.strikeVol)))
2634
 
            self.tableWidgetStepsBrewday.setItem(0,2,QtGui.QTableWidgetItem("%.1f" %(self.brewCalc.strikeTemp)))
2635
 
            self.tableWidgetStepsBrewday.setItem(0,3,QtGui.QTableWidgetItem("%.1f" %(self.brewCalc.strikeVol/(self.grainWeight/1000))))
2636
 
            self.tableWidgetStepsBrewday.setItem(0,4,QtGui.QTableWidgetItem(str(strikeTargetTemp) + "°C, " + str(strikeTime) +" min"))
2637
 
            
2638
 
            self.stepsListVol = listVol
2639
 
            
2640
 
            self.brewCalc.calcSpargeVol(self.stepsListVol, self.brewCalc.volPreBoil, self.brewCalc.grainRetention)
2641
 
    #        print('volume de rinçage :', self.brewCalc.spargeVol)
2642
 
    
2643
 
            self.labelSpargeVol.setText("%.1f" %(self.brewCalc.spargeVol))
2644
 
            self.labelSpargeTemp.setText("%.1f" %(spargeTemp))
2645
 
    
2646
 
        else :
2647
 
            self.brewCalc.calcGrainRetention(self.grainWeight)
2648
 
            self.strikeVol = self.brewCalc.volPreBoil + self.brewCalc.grainRetention
2649
 
            ratio = self.strikeVol / (self.grainWeight / 1000)
2650
 
            self.brewCalc.calcStrikeTemp(strikeTargetTemp,ratio)
2651
 
                
2652
 
            self.tableWidgetStepsBrewday.setItem(0,0,QtGui.QTableWidgetItem(strikeName))
2653
 
            self.tableWidgetStepsBrewday.setItem(0,1,QtGui.QTableWidgetItem("%.1f" %(self.strikeVol)))
2654
 
            self.tableWidgetStepsBrewday.setItem(0,2,QtGui.QTableWidgetItem("%.1f" %(self.brewCalc.strikeTemp)))
2655
 
            self.tableWidgetStepsBrewday.setItem(0,3,QtGui.QTableWidgetItem("%.1f" %(ratio)))
2656
 
            self.pushButtonAdjustStep.setEnabled(False)
2657
 
            
2658
 
            #on vérifie que le profil est bien compatible avec un BIAB :
2659
 
            i = 0
2660
 
            while i < len(listSteps)-1 :
2661
 
                i = i+1 
2662
 
                step = listSteps[i]
2663
 
                stepType= step['type']
2664
 
                if stepType != "Temperature" :
2665
 
                    self.labelWarningBiab.show()
2666
 
                else :
2667
 
                    pass
2668
 
                    
2669
 
        
2670
 
                      
2671
 
                
2672
 
            
2673
 
        
2674
 
    def tableWidgetStepsBrewday_currentRowChanged (self) :
2675
 
        listSteps = self.currentMash['mashSteps']
2676
 
        strikeStep = listSteps[0]
2677
 
        strikeTargetTemp = strikeStep['stepTemp']
2678
 
        self.strikeTargetTemp = strikeTargetTemp
2679
 
        self.brewdayCurrentRow = self.tableWidgetStepsBrewday.currentRow()
2680
 
        i = self.tableWidgetStepsBrewday.currentRow()
2681
 
        step = listSteps[i]
2682
 
        stepType= step['type']
2683
 
        
2684
 
        self.brewdayCurrentStepName = self.tableWidgetStepsBrewday.item(i,0).text()
2685
 
        self.brewdayCurrentStepInfuseAmount = self.tableWidgetStepsBrewday.item(i,1).text()
2686
 
        self.brewdayCurrentStepWaterTemp = self.tableWidgetStepsBrewday.item(i,2).text()
2687
 
        self.brewdayCurrentStepRatio = self.tableWidgetStepsBrewday.item(i,3).text()
2688
 
        if i == 0 :
2689
 
            self.brewdayCurrentStepTargetTemp = strikeTargetTemp
2690
 
        else :
2691
 
            self.brewdayCurrentStepTargetTemp = self.brewdayListTemp[i-1]
2692
 
            
2693
 
        if stepType == 'Infusion' and self.radioButtonClassicBrew.isChecked ():
2694
 
            self.pushButtonAdjustStep.setEnabled(True)
2695
 
        else :
2696
 
            self.pushButtonAdjustStep.setEnabled(False)
2697
 
            
2698
 
            
2699
 
    def stepAdjustBrewday_closed (self, targetRatio, infuseAmount, waterTemp,listVol, currentRow, listTemp) :
2700
 
        print('liste :', targetRatio, infuseAmount, waterTemp,listVol, currentRow, listTemp)
2701
 
        #on insère les nouvelles données dans la table
2702
 
        self.tableWidgetStepsBrewday.setItem(currentRow,1,QtGui.QTableWidgetItem(str(infuseAmount)))
2703
 
        self.tableWidgetStepsBrewday.setItem(currentRow,2,QtGui.QTableWidgetItem("%.1f" %(waterTemp)))
2704
 
        self.tableWidgetStepsBrewday.setItem(currentRow,3,QtGui.QTableWidgetItem("%.1f" %(targetRatio)))
2705
 
        #il faut tout recalculer après la ligne modifiée
2706
 
        listSteps = self.currentMash['mashSteps']
2707
 
        
2708
 
        i = currentRow
2709
 
        
2710
 
 
2711
 
        while i < len(listSteps) - 1 :
2712
 
            i = i+1
2713
 
            step = listSteps[i]
2714
 
            stepType= step['type'] 
2715
 
            stepTemp = float(step['stepTemp'])
2716
 
            if i == 1 :
2717
 
                strikeStep = listSteps[0]
2718
 
                strikeTargetTemp = strikeStep['stepTemp']
2719
 
                mashTemp = strikeTargetTemp
2720
 
            else :
2721
 
                mashTemp = self.brewdayListTemp[i-2]
2722
 
            self.brewCalc.calcInfusionStep(i-1, self.grainWeight, listVol, stepTemp, mashTemp, 90, stepType )
2723
 
#            listVol.append(self.brewCalc.infuseVol)
2724
 
            listVol[i] = self.brewCalc.infuseVol
2725
 
            self.tableWidgetStepsBrewday.setItem(i,1,QtGui.QTableWidgetItem("%.1f" %(self.brewCalc.infuseVol)))
2726
 
            self.tableWidgetStepsBrewday.setItem(i,3,QtGui.QTableWidgetItem("%.1f" %(self.brewCalc.newRatio)))
2727
 
            if stepType == 'Infusion' :
2728
 
                self.tableWidgetStepsBrewday.setItem(i,2,QtGui.QTableWidgetItem("%.1f" %(90)))
2729
 
            else :
2730
 
                self.tableWidgetStepsBrewday.setItem(i,2,QtGui.QTableWidgetItem("%.1f" %(0)))
2731
 
            
2732
 
            
2733
 
 
2734
 
            
2735
 
#            print('température du moût', mashTemp)
2736
 
            
2737
 
        self.brewCalc.calcSpargeVol(self.stepsListVol, self.brewCalc.volPreBoil, self.brewCalc.grainRetention)
2738
 
#        print('volume de rinçage :', self.brewCalc.spargeVol)
2739
 
 
2740
 
        self.tableWidgetStepsBrewday_currentRowChanged()
2741
 
        
2742
 
    def unlockBrewdayMode (self) :  
2743
 
        self.brewdayLock = 0 
2744
 
 
2745
 
    def enableBrewdayMode(self) :
2746
 
        if self.comboBoxMashProfiles.currentIndex() == -1 :
2747
 
            # self.pushButtonBrewdayMode.setEnabled(False)
2748
 
            pass
2749
 
        else :
2750
 
            # self.pushButtonBrewdayMode.setEnabled(True)
2751
 
            pass
2752
 
        
2753
 
        
2754
 
    def printRecipe (self) :
2755
 
        printer=QtGui.QPrinter()
2756
 
        info_texte = "<h1 style=\"font-family : Arial ;\">%s</h1> <br/>\
2757
 
                    <b>Style :</b> %s <br/> \
2758
 
                    <b>Volume :</b> %sL<b> ; Rendement :</b> %s%% <br/>\
2759
 
                    <h2>Liste des ingrédients</h2> "  \
2760
 
                    %(self.nomRecette, self.styleRecette, self.volume, self.rendement)
2761
 
        
2762
 
        grains_texte = "<h3 style =\" text-decoration : underline; \">Grains ou extraits</h3>"           
2763
 
        i = 0
2764
 
        while i < AppWindow.nbreFer :
2765
 
            i=i+1
2766
 
            grains_texte = grains_texte + "<b>"+ self.liste_ingr[i-1] + " : " + "</b>"+ str(self.liste_fAmount[i-1]) + "g" + "<br/>"
2767
 
        
2768
 
        houblons_texte = "<h3 style =\" text-decoration : underline; \">Houblons</h3>"
2769
 
        h = 0
2770
 
        while h < AppWindow.nbreHops : 
2771
 
            h = h+1        
2772
 
            houblons_texte = houblons_texte + "<b>" + self.liste_houblons[h-1] + "</b>" +  " (" +  str(self.liste_hAlpha[h-1]) +"%" + ", " + self.liste_hForm[h-1] +")" + " : " +"<b>"+ str(self.liste_hAmount[h-1]) + "g"+"</b>" +" pendant " +"<b>" +str(self.liste_hTime[h-1]) +"</b>"+ " minutes" + "<br/>"
2773
 
        
2774
 
        divers_texte = "<h3 style =\" text-decoration : underline; \">Divers</h3>"
2775
 
        m = 0
2776
 
        while  m < AppWindow.nbreDivers :
2777
 
            m = m + 1    
2778
 
            divers_texte = divers_texte +"<b>" +self.liste_divers[m-1] +"</b>"+" (" +self.liste_dType[m-1] +")" + " : " +"<b>" +str(self.liste_dAmount[m-1]) + "g" +"</b>"+"<br/>"
2779
 
        
2780
 
        levures_texte = "<h3 style =\" text-decoration : underline; \">Levures</h3>" 
2781
 
        l = 0
2782
 
        while l < self.nbreLevures : 
2783
 
            l = l+1
2784
 
            levures_texte = levures_texte + self.liste_levuresDetail[l-1] + "<br/>"
2785
 
        
2786
 
        notes_texte = "<h2>Notes</h2>"
2787
 
        try :
2788
 
            notes_texte = notes_texte + self.recipeNotes + "<br/>"
2789
 
        except :
2790
 
            notes_texte = notes_texte + "pas de notes" + "<br/>"
2791
 
                
2792
 
        texte = info_texte + grains_texte + houblons_texte + divers_texte + levures_texte + notes_texte
2793
 
        doc=QtGui.QTextDocument()
2794
 
 
2795
 
        doc.setHtml(texte)
2796
 
 
2797
 
            
2798
 
        
2799
 
        dialog = QtGui.QPrintDialog(printer)
2800
 
        dialog.setModal(True)
2801
 
        dialog.setWindowTitle("Print Document" )
2802
 
        # dialog.addEnabledOption(QAbstractPrintDialog.PrintSelection)
2803
 
        if dialog.exec_() == True:
2804
 
            doc.print_(printer)
2805
 
    
2806
 
    
2807
 
        
2808
 
 
2809
 
if __name__ == "__main__":
2810
 
 
2811
 
    QtCore.QTextCodec.setCodecForCStrings(QtCore.QTextCodec.codecForName("utf-8"))
2812
 
    app = QtGui.QApplication(sys.argv)
2813
 
    
2814
 
    locale = QtCore.QLocale.system().name()
2815
 
    translator=QtCore.QTranslator ()
2816
 
    #~ translator.load(("qt_") +locale, QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath))
2817
 
    translator.load('joliebulle_' + locale)
2818
 
    app.installTranslator(translator)
2819
 
 
2820
 
    main_window = AppWindow()
2821
 
    main_window.show()
2822
 
 
2823
 
    app.exec_()