7
#Copyright (C) 2010-2012 Pierre Tavares
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.
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.
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.
26
from sys import platform
29
from PyQt4 import QtGui
30
from PyQt4 import QtCore
32
from settings import *
34
from exportHTML 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 *
57
import xml.etree.ElementTree as ET
59
class IngDelegate(QtGui.QItemDelegate):
60
def __init__(self, parent=None):
61
QtGui.QItemDelegate.__init__(self, parent)
62
def createEditor(self, parent, option, index) :
65
def setEditorData(self, spinBox, index):
67
def setModelData(self, spinBox, model, index):
69
def updateEditorGeometry(self, editor, option, index):
70
editor.setGeometry(option.rect)
72
class AmountDelegate(QtGui.QItemDelegate):
73
def __init__(self, parent=None):
74
QtGui.QItemDelegate.__init__(self, parent)
77
def createEditor(self, parent, option, index) :
78
self.listeF = AppWindow()
80
h=self.listeF.nbreHops
81
m=self.listeF.nbreDivers
85
editor = QtGui.QLineEdit(parent)
87
#editor.setMaximum(20000)
88
editor.installEventFilter(self)
92
def setEditorData(self, lineEdit, index):
93
value= int(index.model().data(index, QtCore.Qt.DisplayRole))
95
lineEdit.setText(str(value))
96
#spinBox.setSuffix(" g")
98
def setModelData(self, lineEdit, model, index):
99
#spinBox.interpretText()
100
champs =lineEdit.text()
101
a = champs.rfind(" ")
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)
112
value = int(lineEdit.text())
113
#value = int(lineEdit.text())
114
model.setData(index, value)
117
self.emit( QtCore.SIGNAL( "pySig"))
120
def updateEditorGeometry(self, editor, option, index):
121
editor.setGeometry(option.rect)
124
class TimeDelegate(QtGui.QItemDelegate):
125
def __init__(self, parent=None):
126
QtGui.QItemDelegate.__init__(self, parent)
129
def createEditor(self, parent, option, index) :
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
138
if row > i-1 and row < i+h+m:
139
editor = QtGui.QSpinBox(parent)
141
editor.setMaximum(20000)
142
editor.installEventFilter(self)
146
def setEditorData(self, spinBox, index):
147
value= int(index.model().data(index, QtCore.Qt.DisplayRole))
149
spinBox.setValue(value)
150
spinBox.setSuffix(" min")
152
def setModelData(self, spinBox, model, index):
153
spinBox.interpretText()
154
value = spinBox.value()
156
#model.setData(index, QtCore.QVariant(value))
157
model.setData(index, value)
158
self.emit( QtCore.SIGNAL( "pySig"))
160
def updateEditorGeometry(self, editor, option, index):
161
editor.setGeometry(option.rect)
164
class AlphaDelegate(QtGui.QItemDelegate):
165
def __init__(self, parent=None):
166
QtGui.QItemDelegate.__init__(self, parent)
169
def createEditor(self, parent, option, index) :
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
177
if row > i-1 and row < i+h:
179
editor = QtGui.QDoubleSpinBox(parent)
181
editor.setMaximum(20000)
182
editor.installEventFilter(self)
188
def setEditorData(self, spinBox, index):
189
value= float(index.model().data(index, QtCore.Qt.DisplayRole))
191
spinBox.setValue(value)
192
spinBox.setSuffix(" %")
194
def setModelData(self, spinBox, model, index):
195
spinBox.interpretText()
196
value = spinBox.value()
199
model.setData(index, value)
200
self.emit( QtCore.SIGNAL( "pySig"))
202
def updateEditorGeometry(self, editor, option, index):
203
editor.setGeometry(option.rect)
205
class ComboBoxDelegate(QtGui.QItemDelegate):
208
def __init__(self, parent = None):
210
QtGui.QItemDelegate.__init__(self, parent)
213
def createEditor(self, parent, option, index):
214
self.listeF = AppWindow()
217
i=self.listeF.nbreFer
218
h=self.listeF.nbreHops
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'))
227
def setEditorData( self, comboBox, index ):
228
value = index.model().data(index, QtCore.Qt.DisplayRole)
229
if value == self.trUtf8('Pellet') :
231
elif value == self.trUtf8('Cône') :
237
comboBox.setCurrentIndex(value)
239
def setModelData(self, editor, model, index):
241
value = editor.currentText()
243
model.setData( index, value )
244
self.emit( QtCore.SIGNAL( "pySig"))
249
def updateEditorGeometry( self, editor, option, index ):
251
editor.setGeometry(option.rect)
253
class UseDelegate(QtGui.QItemDelegate):
256
def __init__(self, parent = None):
258
QtGui.QItemDelegate.__init__(self, parent)
261
def createEditor(self, parent, option, index):
262
self.listeF = AppWindow()
265
i=self.listeF.nbreFer
266
h=self.listeF.nbreHops
267
m = self.listeF.nbreDivers
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'))
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
292
if row > i-1 and row < i+h :
293
if value == self.trUtf8('Ébullition') :
295
elif value == self.trUtf8('Dry Hop') :
297
elif value == self.trUtf8('Empâtage') :
299
elif value == self.trUtf8('Premier Moût') :
301
elif value == self.trUtf8('Arôme') :
306
elif row >i+h-1 and row < i+h+m :
307
if value == self.trUtf8('Ébullition') :
309
elif value == self.trUtf8('Empâtage') :
311
elif value == self.trUtf8('Primaire') :
313
elif value == self.trUtf8('Secondaire') :
315
elif value == self.trUtf8('Embouteillage') :
322
comboBoxUse.setCurrentIndex(value)
324
def setModelData(self, editor, model, index):
326
value = editor.currentText()
328
model.setData( index, value )
329
self.emit( QtCore.SIGNAL( "pySig"))
334
def updateEditorGeometry( self, editor, option, index ):
336
editor.setGeometry(option.rect)
340
class AppWindow(QtGui.QMainWindow,Ui_MainWindow):
350
def __init__(self, parent = None):
354
QtGui.QMainWindow.__init__(self, parent)
357
#####################################################################################################
358
#####################################################################################################
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)
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)
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)
378
# left_spacer = QtGui.QWidget()
379
# left_spacer.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
381
right_spacer = QtGui.QWidget()
382
right_spacer.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
384
# monLayout=QtGui.QHBoxLayout()
386
self.toolBar.addAction(self.actionVueBibliothequeToolBar)
387
self.toolBar.addAction(self.actionVueEditeurToolBar)
388
self.toolBar.addAction(self.actionBrewdayMode)
389
# self.toolBar.addWidget(left_spacer)
392
# monLayout.addWidget(self.buttonLibrary)
393
# monLayout.addWidget(self.buttonEditor)
394
# monLayout.addWidget(self.buttonBrewday)
396
# self.widgetToolBar=QtGui.QWidget()
398
# self.widgetToolBar.setLayout(monLayout)
400
# self.toolBar.addWidget(self.widgetToolBar)
401
self.toolBar.addWidget(right_spacer)
402
self.toolBar.addWidget(self.buttonSave)
404
self.toolBar.addWidget(self.buttonMenu)
407
generalMenu = QtGui.QMenu()
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)
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)
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)
436
generalMenu.addAction(self.actionPreferences)
437
self.buttonMenu.setMenu(generalMenu)
439
######################################################################################
440
######################################################################################
448
self.settings = Settings()
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()
469
self.base.importBeerXML()
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']
475
self.typesList = ["Tout grain", "Extrait", "Partial mash"]
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)
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)
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)
502
self.spinBoxBoil.valueChanged.connect(self.unlockBrewdayMode)
505
#####################################################################################
506
#####################################################################################
507
self.connect(self.actionVueEditeur, QtCore.SIGNAL("triggered()"), self.switchToEditor)
508
self.connect(self.actionVueBibliotheque, QtCore.SIGNAL("triggered()"), self.switchToLibrary)
510
self.connect(self.actionVueEditeurToolBar, QtCore.SIGNAL("triggered()"), self.switchToEditor)
511
self.connect(self.actionVueBibliothequeToolBar, QtCore.SIGNAL("triggered()"), self.switchToLibrary)
513
self.connect(self.actionBrewdayMode,QtCore.SIGNAL("triggered()"),self.switchToBrewday)
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)
520
#############################################################################################
521
#############################################################################################
524
##########################
526
##########################
527
self.pushButtonRecipeNotes.clicked.connect(self.recipeNotesClicked)
528
self.buttonBoxRecipeNotes.accepted.connect(self.recipeNotesAccepted)
529
self.buttonBoxRecipeNotes.rejected.connect(self.recipeNotesRejected)
532
#############################################################################################
533
self.connect(self.actionImprimer, QtCore.SIGNAL("triggered()"), self.printRecipe)
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)
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)
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)
570
self.comboBoxMashProfiles.setCurrentIndex(-1)
571
self.comboBoxMashProfiles.currentIndexChanged.connect(self.mashComboChanged)
574
self.pushButtonSaveProfile.clicked.connect(self.saveProfile)
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)
587
#Signal pour l'affichage du widget de modif des ingrédients
588
self.pushButtonChangeIngredients.clicked.connect(self.displayIngredients)
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)
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)
600
self.deleg = AmountDelegate(self)
601
self.tableViewF.setItemDelegateForColumn(1,self.deleg)
602
self.connect(self.deleg, QtCore.SIGNAL( "pySig"), self.modeleProportion)
606
self.delegT = TimeDelegate(self)
607
self.tableViewF.setItemDelegateForColumn(2,self.delegT)
608
self.connect(self.delegT, QtCore.SIGNAL( "pySig"), self.modeleProportion)
610
self.delegA = AlphaDelegate(self)
611
self.tableViewF.setItemDelegateForColumn(3,self.delegA)
612
self.connect(self.delegA, QtCore.SIGNAL( "pySig"), self.modeleProportion)
614
self.delegC = ComboBoxDelegate(self)
615
self.tableViewF.setItemDelegateForColumn(4,self.delegC)
616
self.connect(self.delegC, QtCore.SIGNAL( "pySig"), self.modeleProportion)
618
self.delegI = IngDelegate(self)
619
self.tableViewF.setItemDelegateForColumn(0,self.delegI)
620
self.tableViewF.setItemDelegateForColumn(5,self.delegI)
622
self.delegUse = UseDelegate(self)
623
self.tableViewF.setItemDelegateForColumn(6,self.delegUse)
624
self.connect(self.delegUse, QtCore.SIGNAL( "pySig"), self.modeleProportion)
627
self.tableViewF.setModel(self.modele)
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)
637
###################################################################################################################
638
###################################################################################################################
639
self.modeleBiblio = QtGui.QFileSystemModel()
640
self.modeleBiblio.setReadOnly(False)
641
self.modeleBiblio.setRootPath(recettes_dir)
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)
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)
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)
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)
662
self.pushButtonEditCurrentRecipe.clicked.connect(self.editCurrentRecipe)
664
self.pushButtonRemoveRecipeBiblio.clicked.connect(self.supprimerBiblio)
665
self.pushButtonNewFolderBiblio.clicked.connect(self.createFolder)
666
self.pushButtonEditRecipeBiblio.clicked.connect(self.renommerBiblio)
672
############################################################################################################################
673
############################################################################################################################
676
###############################
677
###############################
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)
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
693
self.comboBox.addItems(self.base.liste_ingr)
694
self.comboBox.setCurrentIndex(10)
696
self.comboBoxH.addItems(self.base.liste_houblons)
697
self.comboBoxH.setCurrentIndex(10)
699
self.comboBoxY.addItems(self.base.liste_levuresDetail)
700
self.comboBoxY.setCurrentIndex(10)
702
self.comboBoxM.addItems(self.base.liste_divers)
703
self.comboBoxM.setCurrentIndex(0)
705
self.comboBoxStyle.hide()
706
self.comboBoxStyle.addItems(self.baseStyleListe)
708
self.comboBoxType.addItems(self.typesList)
709
self.comboBoxType.setCurrentIndex(0)
711
self.widgetVol.hide()
715
self.widgetIngredients.hide()
718
# print("argv:",sys.argv)
720
###################################################################################################
721
######## gestion des arguments au lancement du programme #########################################
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
731
recipePath= argumentsList[1]
732
for part in argumentsList[2:] :
733
recipePath= recipePath +" " + part
735
self.openRecipeFile(recipePath)
741
########################################################################################################################
742
####################################################################################################################
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')
750
colorRef= round(self.EBC/1.97)
753
color = "#" + self.colorTuppleSrm[30]
755
color = "#" + self.colorTuppleSrm[0]
757
color = "#" + self.colorTuppleSrm[colorRef-1]
758
self.widgetColor.setStyleSheet("background-color :" + color)
761
def displayIngredients(self) :
762
if self.pushButtonChangeIngredients.isChecked() :
763
self.widgetIngredients.show()
765
self.widgetIngredients.hide()
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()
773
self.comboBox.clear()
774
self.comboBox.addItems(self.base.liste_ingr)
775
self.comboBox.setCurrentIndex(10)
777
self.comboBoxH.clear()
778
self.comboBoxH.addItems(self.base.liste_houblons)
779
self.comboBoxH.setCurrentIndex(10)
781
self.comboBoxY.clear()
782
self.comboBoxY.addItems(self.base.liste_levuresDetail)
783
self.comboBoxY.setCurrentIndex(10)
785
self.comboBoxM.clear()
786
self.comboBoxM.addItems(self.base.liste_divers)
787
self.comboBoxM.setCurrentIndex(0)
789
def selectionRecette(self):
790
selection = self.listViewBiblio.selectionModel()
791
self.indexRecette = selection.currentIndex()
793
if self.modeleBiblio.isDir(self.indexRecette) == True :
798
self.chemin =self.modeleBiblio.filePath (self.indexRecette)
804
self.calculs_recette()
806
self.stackedWidget.setCurrentIndex(0)
807
self.actionVueEditeurToolBar.setChecked(True)
808
self.actionVueBibliothequeToolBar.setChecked(False)
810
def selectionRecette2(self):
811
selection = self.treeViewBiblio.selectionModel()
812
self.indexRecette = selection.currentIndex()
814
self.chemin =self.modeleBiblio.filePath (self.indexRecette)
821
self.calculs_recette()
823
self.stackedWidget.setCurrentIndex(0)
824
self.actionVueEditeurToolBar.setChecked(True)
825
self.actionVueBibliothequeToolBar.setChecked(False)
828
def viewRecipeBiblio(self) :
829
selection = self.treeViewBiblio.selectionModel()
830
self.indexRecette = selection.currentIndex()
832
self.chemin =self.modeleBiblio.filePath (self.indexRecette)
839
self.calculs_recette()
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)
843
print("simple clic !")
844
self.webViewBiblio.setHtml(exp.generatedHtml)
847
def editCurrentRecipe(self):
848
self.switchToEditor()
852
self.calculs_recette()
854
self.stackedWidget.setCurrentIndex(0)
855
self.actionVueEditeurToolBar.setChecked(True)
856
self.actionVueBibliothequeToolBar.setChecked(False)
861
def menuBiblio(self,position) :
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"))
872
# PasteAction.setEnabled(False)
873
# clipboard = app.clipboard()
874
# data = clipboard.mimeData
875
# if clipboard.mimeData().hasUrls() :
876
# PasteAction.setEnabled(True)
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:
887
# if action == UpAction :
889
# if action == CopyAction :
891
# if action == PasteAction :
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)
907
def renommerBiblio (self) :
908
selection = self.treeViewBiblio.selectionModel()
909
self.indexRecette = selection.currentIndex()
910
self.treeViewBiblio.edit(self.indexRecette)
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
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")
927
# def upFolder(self) :
928
# self.listViewBiblio.setRootIndex(self.treeViewBiblio.rootIndex().parent())
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)
937
# data.setUrls(self.lurl)
938
# clipboard = app.clipboard()
939
# clipboard.setMimeData(data)
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
954
home = QtCore.QDir(home_dir)
955
config = QtCore.QDir(config_dir)
957
if not config.exists() :
958
home.mkpath (config_dir)
961
database = QtCore.QFile(database_file)
962
if not database.exists() :
963
database.copy(database_root, database_file)
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)
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)
987
def switchToEditor(self) :
988
self.stackedWidget.setCurrentIndex(0)
989
self.actionVueEditeurToolBar.setChecked(True)
990
self.actionVueBibliothequeToolBar.setChecked(False)
991
self.actionBrewdayMode.setChecked(False)
994
def switchToLibrary(self) :
995
self.stackedWidget.setCurrentIndex(1)
996
self.actionVueEditeurToolBar.setChecked(False)
997
self.actionVueBibliothequeToolBar.setChecked(True)
998
self.actionBrewdayMode.setChecked(False)
1001
def switchToNotes(self) :
1002
self.stackedWidget.setCurrentIndex(2)
1003
self.actionVueEditeurToolBar.setChecked(False)
1004
self.actionVueBibliothequeToolBar.setChecked(False)
1005
self.actionBrewdayMode.setChecked(False)
1008
def switchToMash(self) :
1009
self.stackedWidget.setCurrentIndex(3)
1010
self.actionVueEditeurToolBar.setChecked(False)
1011
self.actionVueBibliothequeToolBar.setChecked(False)
1012
self.actionBrewdayMode.setChecked(False)
1015
def switchToBrewday(self) :
1016
self.stackedWidget.setCurrentIndex(4)
1017
self.actionVueEditeurToolBar.setChecked(False)
1018
self.actionVueBibliothequeToolBar.setChecked(False)
1019
self.actionBrewdayMode.setChecked(True)
1021
if self.brewdayLock == 1 :
1024
self.brewdayModeCalc()
1025
self.tableWidgetStepsBrewday.setCurrentCell(0,0)
1026
print ("lock",self.brewdayLock)
1029
def restoreDataBase(self) :
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)
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.
1051
while i < AppWindow.nbreFer :
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)
1058
while h < AppWindow.nbreHops :
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)
1064
self.displayProfile()
1067
# cette fonction est appelee chaque fois que les donnees du modele changent
1068
def reverseMVC(self) :
1073
while i < AppWindow.nbreFer :
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)
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
1091
while h < AppWindow.nbreHops :
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))
1111
if value == 'None' or value == '' :
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 == '' :
1121
self.liste_hUse[h-1] = str(value)
1127
while m < AppWindow.nbreDivers :
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)
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)
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 == '' :
1145
self.liste_dUse[m-1] = str(value)
1150
self.calculs_recette()
1159
while i < AppWindow.nbreFer :
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)
1179
while h < AppWindow.nbreHops :
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)
1209
while m < AppWindow.nbreDivers :
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)
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)
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)
1230
while l < self.nbreLevures :
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)
1238
def editGrains(self) :
1239
self.dlgEditG.setModal(True)
1240
self.dlgEditG.show()
1242
def editHoublons(self) :
1243
self.dlgEditH.setModal(True)
1244
self.dlgEditH.show()
1246
def editDivers(self) :
1247
self.dlgEditD.setModal(True)
1248
self.dlgEditD.show()
1250
def editLevures(self) :
1251
self.dlgEditY.setModal(True)
1252
self.dlgEditY.show()
1254
def outilDens(self) :
1255
self.dlgOutilDens.setModal(True)
1256
self.dlgOutilDens.show()
1258
def outilAlc(self) :
1259
self.dlgOutilAlc.setModal(True)
1260
self.dlgOutilAlc.show()
1262
def outilDilution(self) :
1263
self.dlgOutilDilution.setModal(True)
1264
self.dlgOutilDilution.show()
1266
def outilEvaporation (self) :
1267
self.dlgOutilEvaporation.setModal(True)
1268
self.dlgOutilEvaporation.show()
1270
def outilPaliers (self) :
1271
self.dlgOutilPaliers.setModal(True)
1272
self.dlgOutilPaliers.show()
1275
def dialogPreferences (self) :
1276
self.dlgPref.setModal(True)
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 )
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
1301
def ajouterF(self) :
1305
f = AppWindow.nbreFer
1306
i=self.comboBox.currentIndex()
1308
# item = QtGui.QStandardItem(self.base.liste_ingr[i])
1309
# item_fAmount = QtGui.QStandardItem(0)
1310
self.modele.insertRow(f)
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()
1322
print (self.liste_fProportion)
1324
def ajouterH(self) :
1326
f = AppWindow.nbreFer
1327
h = AppWindow.nbreHops
1328
i = self.comboBoxH.currentIndex()
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'''))
1337
self.modele.insertRow(f+h)
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'''))
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'''))
1355
AppWindow.nbreHops = h + 1
1356
self.calculs_recette()
1360
def ajouterM(self) :
1362
l = self.nbreLevures
1363
f = AppWindow.nbreFer
1364
h = AppWindow.nbreHops
1365
m = AppWindow.nbreDivers
1367
i = self.comboBoxM.currentIndex()
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'''))
1375
self.modele.insertRow(f+h+m)
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'''))
1383
AppWindow.nbreDivers = m +1
1391
def ajouterY(self) :
1392
l = self.nbreLevures
1393
f = AppWindow.nbreFer
1394
h = AppWindow.nbreHops
1395
m = AppWindow.nbreDivers
1397
i = self.comboBoxY.currentIndex()
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])
1406
self.modele.insertRow(f+h+m+l)
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])
1417
self.nbreLevures = l + 1
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
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
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
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)]
1465
del self.liste_dTime[indexLigne-(f+h)]
1468
del self.liste_dUse[indexLigne-(f+h)]
1469
self.modele.removeRow(indexLigne)
1470
AppWindow.nbreDivers = m-1
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
1488
self.calculs_recette()
1490
print (self.liste_fProportion)
1491
print ("index : " , indexLigne)
1498
def importBeerXML(self) :
1499
fichierBeerXML = self.s
1501
arbre = ET.parse(fichierBeerXML)
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')
1515
#Presentation de la recette
1516
self.styleRecette =''
1517
for nom in presentation :
1518
if nom.tag == "NAME" :
1519
self.nomRecette = nom.text
1522
for brewer in presentation :
1523
if brewer.tag == "BREWER" :
1524
self.brewer = brewer.text
1529
if nom.tag == "NAME" :
1530
self.styleRecette = nom.text
1533
for typeRecette in presentation :
1534
if typeRecette.tag == "TYPE" :
1535
self.typeRecette = typeRecette.text
1537
for batch_size in presentation :
1538
if batch_size.tag == "BATCH_SIZE" :
1539
self.volume = batch_size.text
1541
for efficiency in presentation :
1542
if efficiency.tag == "EFFICIENCY" :
1543
self.rendement= float(efficiency.text)
1545
for boil in presentation :
1546
if boil.tag == 'BOIL_TIME' :
1547
self.boil = boil.text
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)
1556
self.spinBoxBoil.setValue(float(self.boil))
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)
1567
self.comboBoxType.setCurrentIndex(0)
1568
self.lineEditBrewer.setText(self.brewer)
1570
for notes in presentation :
1571
if notes.tag == 'NOTES' :
1572
self.recipeNotes = notes.text
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()
1590
while i < AppWindow.nbreFer :
1593
for nom in fermentables[i-1] :
1594
if nom.tag == 'NAME' :
1595
self.fNom = nom.text
1596
self.liste_ingr.append(self.fNom)
1598
if nom.tag =='AMOUNT' :
1599
self.fAmount = 1000*(float(nom.text))
1600
self.liste_fAmount.append(self.fAmount)
1602
if nom.tag =='TYPE' :
1603
self.fType = nom.text
1604
self.liste_fType.append(self.fType)
1606
if nom.tag == 'YIELD' :
1607
self.fYield = float(nom.text)
1608
self.liste_fYield.append(self.fYield)
1610
if nom.tag == 'RECOMMEND_MASH' :
1611
self.fMashed = nom.text
1612
self.liste_fMashed.append(self.fMashed)
1614
#ATTENTION ! le format BeerXML utilise des unités SRM !
1616
if nom.tag == 'COLOR' :
1617
self.color = float(nom.text)*1.97
1618
self.liste_color.append(self.color)
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()
1636
while h < AppWindow.nbreHops :
1638
for nom in hops [h-1] :
1639
if nom.tag == 'NAME' :
1640
self.hNom = nom.text
1641
self.liste_houblons.append(self.hNom)
1643
if nom.tag =='AMOUNT' :
1644
self.hAmount = 1000*(float(nom.text))
1645
self.liste_hAmount.append(self.hAmount)
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')
1656
self.hForm = self.trUtf8('Feuille')
1658
self.liste_hForm.append(self.hForm)
1660
if nom.tag =='TIME' :
1661
self.hTime = float(nom.text)
1662
self.liste_hTime.append(self.hTime)
1665
if nom.tag =='ALPHA' :
1666
self.hAlpha = float(nom.text)
1667
self.liste_hAlpha.append(self.hAlpha)
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')
1683
self.liste_hUse.append(self.hUse)
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 ()
1702
while l < self.nbreLevures :
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)
1709
if nom.tag == 'FORM' :
1710
self.lForm = str(nom.text)
1711
self.liste_lForm.append(self.lForm)
1713
if nom.tag == 'LABORATORY' :
1714
self.lLabo = str(nom.text)
1715
self.liste_lLabo.append(self.lLabo)
1717
if nom.tag == 'PRODUCT_ID' :
1718
self.lProd = str(nom.text)
1719
self.liste_lProdid.append(self.lProd)
1721
if nom.tag == 'ATTENUATION' :
1722
self.lAtten = float(nom.text)
1723
self.liste_levureAtten.append(self.lAtten)
1727
self.liste_levuresDetail.append (self.lNom+ ' ' + self.lLabo +' ' + self.lProd)
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()
1748
while m < AppWindow.nbreDivers :
1750
for nom in misc [m-1] :
1751
if nom.tag == 'NAME' :
1752
self.dNom = nom.text
1753
self.liste_divers.append(self.dNom)
1755
if nom.tag == 'AMOUNT' :
1756
self.dAmount = float(nom.text)*1000
1757
self.liste_dAmount.append(self.dAmount)
1759
if nom.tag == 'TYPE' :
1760
self.dType = nom.text
1761
self.liste_dType.append(self.dType)
1763
if nom.tag == 'TIME' :
1764
self.dTime = float(nom.text)
1765
self.liste_dTime.append(self.dTime)
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)
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
1800
if self.mashName is not None :
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
1815
mashStep = mash.findall('.//MASH_STEP')
1816
numSteps = len(mashStep)
1818
if self.mashName is not None :
1819
self.currentMash['mashSteps'] = listSteps
1827
while j < numSteps :
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' :
1851
dicStep = listSteps[j-1]
1852
dicStep['stepVol']= stepVol
1854
print(self.currentMash)
1855
if self.mashName is not None :
1856
self.mashProfilesBase.listMash.append(self.currentMash)
1863
if self.mashName is not None :
1864
self.comboBoxMashProfiles.setCurrentIndex(len(self.listMash)-1)
1867
self.comboBoxMashProfiles.setCurrentIndex(-1)
1869
self.comboBoxMashProfiles.setCurrentIndex(-1)
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()
1885
# while p < self.nbrePaliers :
1887
# for nom in paliers [p-1] :
1888
# if nom.tag == 'NAME' :
1889
# self.pNom = nom.text
1890
# self.liste_paliers.append(self.pNom)
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)
1905
# if nom.tag == 'STEP_TIME' :
1906
# self.pTime = float(nom.text)
1907
# self.liste_pTime.append(self.pTime)
1909
# if nom.tag == 'STEP_TEMP' :
1910
# self.pTemp = float(nom.text)
1911
# self.liste_pTemp.append(self.pTemp)
1913
# if nom.tag == 'INFUSE_AMOUNT' :
1914
# self.pQte = float(nom.text)
1915
# self.liste_pVol.append(self.pQte)
1917
# self.lineEditBrewingProfile.setText(self.bNom)
1920
# print(self.liste_paliers)
1921
# print(self.liste_pType)
1923
return AppWindow.nbreFer
1925
def calculs_recette (self) :
1927
#on remet le verrou à 0, il va falloir recalculer en repassant en brewday mode
1928
self.brewdayLock = 0
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
1935
self.liste_equivSucre = list()
1936
self.liste_equivSucreMashed = list()
1937
self.liste_equivSucreNonMashed = list()
1939
self.grainWeight = sum(self.liste_fAmount)
1943
while o < AppWindow.nbreFer :
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)
1952
self.liste_equivSucreMashed.append(self.equivSucre)
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)
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 :
1964
if self.levureAttenDec :
1965
self.atten = self.levureAttenDec[0]/100
1967
self.GUF = self.GU*(1-self.atten)
1968
self.FG = 1 + self.GUF/1000
1971
#calcul des proportions pour les grains
1972
self.liste_fProportion = list()
1973
poidsTot = sum(self.liste_fAmount)
1975
while i < AppWindow.nbreFer :
1977
propGrain = (self.liste_fAmount[i-1] / poidsTot)*100
1978
self.liste_fProportion.append(propGrain)
1984
#calcul de l'amertume : methode de Tinseth
1985
#IBUs = decimal alpha acid utilization * mg/l of added alpha acids
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()
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)
1998
self.bignessFactor = 1.65 * (0.000125**(self.OG - 1))
2000
while i < len(self.liste_btFactor) :
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)
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' :
2007
elif self.liste_hForm[i-1] == 'Pellet' :
2008
self.ibuPart = (self.mgAA * self.aaUtil) + 0.1*(self.mgAA * self.aaUtil)
2010
self.ibuPart = self.mgAA * self.aaUtil
2011
self.liste_ibuPart.append(self.ibuPart)
2013
if self.liste_hForm[i-1] == 'Pellet' :
2014
self.ibuPart = (self.mgAA * self.aaUtil) + 0.1*(self.mgAA * self.aaUtil)
2016
self.ibuPart = self.mgAA * self.aaUtil
2017
self.liste_ibuPart.append(self.ibuPart)
2020
self.ibuTot = sum(self.liste_ibuPart)
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()
2032
while i < AppWindow.nbreFer :
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)
2043
#ABV = 0.130((OG-1)-(FG-1))*1000
2045
self.ABV = 0.130*((self.OG-1) -(self.FG-1))*1000
2047
self.displayProfile()
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)) + '%')
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)
2065
def ouvrir_clicked (self) :
2066
self.s = QtGui.QFileDialog.getOpenFileName(self,
2067
self.trUtf8("Ouvrir un fichier"),
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
2079
self.importBeerXML()
2080
self.calculs_recette()
2082
self.switchToEditor()
2084
def openRecipeFile(self,filePath):
2086
AppWindow.nbreFer = 0
2087
AppWindow.nbreHops = 0
2088
AppWindow.nbreDivers = 0
2090
self.importBeerXML()
2091
self.calculs_recette()
2093
self.switchToEditor()
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>"))
2102
def rendemt_changed(self) :
2103
if self.checkBoxIng.isChecked() :
2104
ratio = self.rendement/self.doubleSpinBoxRendemt.value()
2107
while i < AppWindow.nbreFer :
2109
if self.liste_fType[i-1] == 'Extract' :
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()
2119
self.rendement = self.doubleSpinBoxRendemt.value()
2120
self.calculs_recette()
2122
def volume_changed(self) :
2124
if self.checkBoxIng.isChecked() :
2125
ratio = self.doubleSpinBox_2Volume.value()/float(self.volume)
2128
while i < AppWindow.nbreFer :
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)
2136
while h < AppWindow.nbreHops :
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)
2145
while m < AppWindow.nbreDivers :
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)
2152
self.calculs_recette()
2155
self.volume = self.doubleSpinBox_2Volume.value()
2156
self.calculs_recette()
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"
2166
def enregistrer (self) :
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()
2175
#self.enregistrerSous()
2176
recettes = QtCore.QFile(recettes_dir)
2177
self.s = recettes_dir +"/" + self.nomRecette + ".xml"
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)
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)
2190
def enregistrerSous (self) :
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,
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()
2207
self.h = QtGui.QFileDialog.getSaveFileName (self,
2208
self.trUtf8("Enregistrer dans un fichier"),
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)
2215
exp.enregistrerHtml(self.fileHtml)
2217
def modifierStyle (self) :
2218
if self.pushButtonChangerStyle.isChecked () :
2219
self.comboBoxStyle.show()
2221
self.comboBoxStyle.hide()
2223
def volMore (self) :
2224
if self.pushButtonVolMore.isChecked() :
2225
self.widgetVol.show()
2227
self.widgetVol.hide()
2230
def nouvelle(self) :
2232
self.nomRecette = self.trUtf8('Nouvelle Recette')
2236
self.styleRecette = self.trUtf8('''Générique''')
2237
self.lineEditBrewer.setText('')
2238
self.comboBoxType.setCurrentIndex(0)
2239
self.recipeNotes =''
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()
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()
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 ()
2278
#AppWindow.nbreDivers = 0
2279
self.liste_divers = list ()
2280
self.liste_dAmount = list ()
2281
self.liste_dType = list ()
2285
self.liste_dTime = list()
2286
self.liste_dUse = list()
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)
2293
self.spinBoxBoil.setValue(float(self.boil))
2295
self.spinBoxBoil.setValue (0)
2297
self.listMash = list()
2298
self.currentMash = {}
2299
self.listStepsAll = list()
2300
self.dicMashDetail = {}
2301
self.mashProfilesBase.listMash = list()
2302
self.mashProfilesBase.importBeerXML()
2305
self.comboBoxMashProfiles.setCurrentIndex(-1)
2306
self.brewdayLock = 0
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
2317
self.importBeerXML()
2318
self.calculs_recette()
2321
def addStyle(self) :
2322
self.lineEditGenre.setText(self.comboBoxStyle.currentText())
2324
def recipeNotesClicked (self) :
2325
self.switchToNotes()
2326
self.textEditRecipeNotes.setText(self.recipeNotes)
2328
def recipeNotesAccepted (self) :
2329
self.switchToEditor()
2330
self.recipeNotes = self.textEditRecipeNotes.toPlainText()
2331
print (self.recipeNotes)
2333
def recipeNotesRejected (self) :
2334
self.switchToEditor()
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'])
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()
2351
print(self.currentMash)
2352
print("lock", self.brewdayLock)
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()
2365
self.pushButtonMashEdit.setEnabled(False)
2366
self.pushButtonRemoveProfile.setEnabled(False)
2367
self.pushButtonStepRemove.setEnabled(False)
2368
self.pushButtonStepEdit.setEnabled(False)
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)
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'])
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']))
2393
self.labelMashSpargeTemp.setText("%.1f" %float(self.dicMashDetail['spargeTemp']))
2397
self.listWidgetSteps.setCurrentRow(0)
2400
# print(self.dicMashDetail)
2401
self.pushButtonMashEdit.setEnabled(True)
2402
self.pushButtonRemoveProfile.setEnabled(True)
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)
2412
i = self.comboBoxMashProfiles.currentIndex()
2413
self.listWidgetMashProfiles.setCurrentRow(i)
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']))
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)
2445
def stepEdit(self) :
2446
i = self.listWidgetSteps.currentRow()
2448
self.dlgStep.fields (self.listStepName[i], self.listStepType[i], self.listStepTime[i], self.listStepTemp[i], self.listStepVol[i])
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
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()
2465
self.listWidgetMashProfiles.setCurrentRow(f)
2466
self.listWidgetSteps.setCurrentRow(i)
2469
def removeStep(self) :
2470
i = self.listWidgetSteps.currentRow()
2471
del self.listSteps[i]
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)
2482
self.listWidgetMashProfiles.setCurrentRow(f)
2483
self.listWidgetSteps.setCurrentRow(i-1)
2487
def mashEdit(self) :
2488
i = self.listWidgetMashProfiles.currentRow()
2490
self.dlgMash.fields(self.dicMashDetail['name'],self.dicMashDetail['ph'],self.dicMashDetail['grainTemp'],self.dicMashDetail['tunTemp'],self.dicMashDetail['spargeTemp'])
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
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)
2505
self.listWidgetMashProfiles.setCurrentRow(f)
2507
# print(self.dicMashDetail)
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)
2513
self.listWidgetMashProfiles.setCurrentRow(len(self.listMash)-1)
2515
def removeMash(self) :
2516
i = self.listWidgetMashProfiles.currentRow()
2517
del self.listMash[i]
2519
self.listWidgetSteps.clear()
2521
def mashRejected (self) :
2522
self.mashProfilesBase.importBeerXML()
2523
self.switchToEditor()
2525
def mashAccepted (self) :
2526
i = self.listWidgetMashProfiles.currentRow()
2527
self.currentMash = self.listMash[i]
2529
self.switchToEditor()
2530
self.comboBoxMashProfiles.setCurrentIndex(i)
2531
print(self.currentMash)
2533
def saveProfile(self) :
2534
self.mashProfileExport.export(self.listMash)
2535
self.mashProfileExport.enregistrer(mash_file)
2538
def brewdayModeCalc(self) :
2539
self.labelWarningBiab.hide()
2540
self.brewdayLock = 1
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()
2549
self.labelNoSparge.show()
2550
self.labelSparge1.hide()
2551
self.labelSparge2.hide()
2552
self.labelSpargeTemp.hide()
2553
self.labelSpargeVol.hide()
2555
self.labelNoDecoction.hide()
2557
self.brewCalc.calcPreBoilVolume(self.volume, self.spinBoxBoil.value())
2559
self.brewCalc.calcPreBoilSg(self.GU, self.volume)
2562
self.labelPreBoilVol.setText("%.1f" %(self.brewCalc.volPreBoil) + " " + "L")
2563
self.labelPreBoilGravity.setText("%.3f" %(self.brewCalc.preBoilSg))
2566
listSteps = self.currentMash['mashSteps']
2567
spargeTemp = float(self.currentMash['spargeTemp'])
2568
# print("la liste en breday mode", listSteps)
2570
strikeStep = listSteps[0]
2571
strikeTargetTemp = strikeStep['stepTemp']
2572
strikeName = strikeStep['name']
2573
strikeTime = strikeStep['stepTime']
2575
self.tableWidgetStepsBrewday.setRowCount(len(listSteps))
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)
2591
listVol.append(self.brewCalc.strikeVol)
2592
self.brewdayListTemp = []
2594
#on traite les paliers autres que l'empâtage,
2596
while i < len(listSteps)-1 :
2599
stepName = step['name']
2600
# stepVol = float(step['stepVol'])
2601
stepTemp = float(step['stepTemp'])
2602
stepType= step['type']
2603
stepTime = step['stepTime']
2605
listName.append(stepName)
2606
self.brewdayListTemp.append(stepTemp)
2608
mashTemp = strikeTargetTemp
2610
mashTemp = self.brewdayListTemp[i-2]
2613
self.brewCalc.calcInfusionStep(i, self.grainWeight, listVol, stepTemp, mashTemp, 90, stepType )
2616
listVol.append(self.brewCalc.infuseVol)
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)))
2625
self.labelNoDecoction.show()
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"))
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"))
2638
self.stepsListVol = listVol
2640
self.brewCalc.calcSpargeVol(self.stepsListVol, self.brewCalc.volPreBoil, self.brewCalc.grainRetention)
2641
# print('volume de rinçage :', self.brewCalc.spargeVol)
2643
self.labelSpargeVol.setText("%.1f" %(self.brewCalc.spargeVol))
2644
self.labelSpargeTemp.setText("%.1f" %(spargeTemp))
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)
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)
2658
#on vérifie que le profil est bien compatible avec un BIAB :
2660
while i < len(listSteps)-1 :
2663
stepType= step['type']
2664
if stepType != "Temperature" :
2665
self.labelWarningBiab.show()
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()
2682
stepType= step['type']
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()
2689
self.brewdayCurrentStepTargetTemp = strikeTargetTemp
2691
self.brewdayCurrentStepTargetTemp = self.brewdayListTemp[i-1]
2693
if stepType == 'Infusion' and self.radioButtonClassicBrew.isChecked ():
2694
self.pushButtonAdjustStep.setEnabled(True)
2696
self.pushButtonAdjustStep.setEnabled(False)
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']
2711
while i < len(listSteps) - 1 :
2714
stepType= step['type']
2715
stepTemp = float(step['stepTemp'])
2717
strikeStep = listSteps[0]
2718
strikeTargetTemp = strikeStep['stepTemp']
2719
mashTemp = strikeTargetTemp
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)))
2730
self.tableWidgetStepsBrewday.setItem(i,2,QtGui.QTableWidgetItem("%.1f" %(0)))
2735
# print('température du moût', mashTemp)
2737
self.brewCalc.calcSpargeVol(self.stepsListVol, self.brewCalc.volPreBoil, self.brewCalc.grainRetention)
2738
# print('volume de rinçage :', self.brewCalc.spargeVol)
2740
self.tableWidgetStepsBrewday_currentRowChanged()
2742
def unlockBrewdayMode (self) :
2743
self.brewdayLock = 0
2745
def enableBrewdayMode(self) :
2746
if self.comboBoxMashProfiles.currentIndex() == -1 :
2747
# self.pushButtonBrewdayMode.setEnabled(False)
2750
# self.pushButtonBrewdayMode.setEnabled(True)
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)
2762
grains_texte = "<h3 style =\" text-decoration : underline; \">Grains ou extraits</h3>"
2764
while i < AppWindow.nbreFer :
2766
grains_texte = grains_texte + "<b>"+ self.liste_ingr[i-1] + " : " + "</b>"+ str(self.liste_fAmount[i-1]) + "g" + "<br/>"
2768
houblons_texte = "<h3 style =\" text-decoration : underline; \">Houblons</h3>"
2770
while h < AppWindow.nbreHops :
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/>"
2774
divers_texte = "<h3 style =\" text-decoration : underline; \">Divers</h3>"
2776
while m < AppWindow.nbreDivers :
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/>"
2780
levures_texte = "<h3 style =\" text-decoration : underline; \">Levures</h3>"
2782
while l < self.nbreLevures :
2784
levures_texte = levures_texte + self.liste_levuresDetail[l-1] + "<br/>"
2786
notes_texte = "<h2>Notes</h2>"
2788
notes_texte = notes_texte + self.recipeNotes + "<br/>"
2790
notes_texte = notes_texte + "pas de notes" + "<br/>"
2792
texte = info_texte + grains_texte + houblons_texte + divers_texte + levures_texte + notes_texte
2793
doc=QtGui.QTextDocument()
2799
dialog = QtGui.QPrintDialog(printer)
2800
dialog.setModal(True)
2801
dialog.setWindowTitle("Print Document" )
2802
# dialog.addEnabledOption(QAbstractPrintDialog.PrintSelection)
2803
if dialog.exec_() == True:
2809
if __name__ == "__main__":
2811
QtCore.QTextCodec.setCodecForCStrings(QtCore.QTextCodec.codecForName("utf-8"))
2812
app = QtGui.QApplication(sys.argv)
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)
2820
main_window = AppWindow()