1 from db import Database
2 from PySide2 import QtWidgets as qtw
3 from PySide2 import QtCore as qtc
4 from PySide2 import QtGui as qtg
6 from utils import resource_path
10 def __init__(self, parent, ui, trial_id):
12 self.num_treatments = None
13 self.num_levels = None
15 self.grid = ui.freqGridLayout
16 self.trial_id = trial_id
17 self.database = Database.get_instance(parent)
19 def on_save_preload(self):
21 if self.ui.frequenciesCheckBox.isChecked():
23 if not self.ui.preloadCheckBox.isChecked():
25 if not self.ui.editPreloadCheckBox.isChecked():
28 qtw.QMessageBox.information(
29 self.parent, self.parent.tr('Save not available!'),
30 self.parent.tr('Select only preload and edit')
33 preload = self.extract_counts()
34 if self.valid_counts(preload):
35 pixmap = qtg.QPixmap(resource_path("images/tick_mark.png"))
36 self.database.clear_preload(self.trial_id)
37 self.database.save_preload(self.trial_id, preload)
39 pixmap = qtg.QPixmap(resource_path("images/error.png"))
40 self.valid_preload_image.setPixmap(pixmap)
42 def add_to_preload(self):
43 preload = self.database.get_preload(self.trial_id)
44 freq = self.extract_counts()
46 freq[key] += preload[key]
47 self.database.clear_preload(self.trial_id)
48 self.database.save_preload(self.trial_id, freq)
50 def extract_counts(self):
52 for r in range(2, self.num_treatments + 2):
53 for c in range(1, self.num_levels + 1):
54 item = self.grid.itemAtPosition(r, c)
56 key = self.left_top_key[(r, c)]
57 count[key] = int(entry.text().strip())
60 def valid_counts(self, count):
61 treatments = self.database.read_treatments(self.trial_id)
62 factors = self.database.read_factors(self.trial_id)
65 for factor in factors:
66 levels = self.database.factor_levels(factor[0])
67 fl = [[] for i in range(len(levels))]
70 for treatment in treatments:
73 for i, factor in enumerate(factors):
74 t, f = treatment[0], factor[0]
75 levels = self.database.factor_levels(f)
77 for j, level in enumerate(levels):
79 cnt = count[(t, f, lv)]
80 f_total[i][j].append(cnt)
88 for i in range(len(self.total_treatment_buttons)):
90 self.total_treatment_buttons[i].setText(str(sm))
92 self.grand_total_button.setText(str(gt))
93 for i, f_t in enumerate(f_total):
95 for j, f_l in enumerate(f_t):
97 self.total_level_button[i][j].setText(str(sm))
99 self.total_factorButtons[i].setText(str(sum(s)))
102 def on_clear_preload(self):
104 if self.ui.frequenciesCheckBox.isChecked():
106 if not self.ui.preloadCheckBox.isChecked():
108 if not self.ui.editPreloadCheckBox.isChecked():
111 qtw.QMessageBox.warning(self.parent, self.parent.tr('Clear preload'),
112 self.parent.tr('To clear preload, select preload and check edit'))
114 button = qtw.QMessageBox.question(self.parent, self.parent.tr("Confirm clear"),
115 self.parent.tr('Are you sure you want to clear preload'),
116 qtw.QMessageBox.Yes | qtw.QMessageBox.No)
117 if button != qtw.QMessageBox.Yes:
119 for r in range(2, self.num_treatments + 2):
120 for c in range(1, self.num_levels + 1):
121 item = self.grid.itemAtPosition(r, c)
122 item.widget().setText('0')
123 self.database.clear_preload(self.trial_id)
125 def toggleReadOnly(self):
126 readOnly = not self.ui.editPreloadCheckBox.isChecked()
127 if self.num_treatments is None or self.num_levels is None:
129 for r in range(2, self.num_treatments + 2):
130 for c in range(1, self.num_levels + 1):
131 item = self.grid.itemAtPosition(r, c)
132 item.widget().setReadOnly(readOnly)
133 style = self.entryCountReadOnly if readOnly else self.entryCount
134 item.widget().setStyleSheet(style)
136 def set_counts(self, cur_count):
137 if self.num_treatments is None or self.num_levels is None:
139 for r in range(2, self.num_treatments + 2):
140 for c in range(1, self.num_levels + 1):
141 item = self.grid.itemAtPosition(r, c)
142 key = self.left_top_key[(r, c)]
143 item.widget().setText(str(cur_count[key]))
144 self.valid_counts(self.extract_counts())
147 for i in reversed(range(self.grid.count())):
148 self.grid.itemAt(i).widget().setParent(None)
149 factors = self.database.read_factors(self.trial_id)
152 treatments = self.database.read_treatments(self.trial_id)
153 self.num_treatments = len(treatments)
154 if len(treatments) < 2:
156 flc = self.database.get_factor_level(self.trial_id)
160 self.left_top_key = {}
162 self.total_factorButtons = []
163 self.total_level_button = []
164 fixedStyle = 'background-color: #EEEEEE; color: #000000; border: 1px solid #000000;'
165 self.entryCountReadOnly = 'color: #999999; border: 1px solid #000000;'
166 self.entryCount = 'color: blue; border: 1px solid #000000;'
167 for i in range(len(factors)):
169 factor_button = qtw.QLabel(factor[1])
170 factor_button.setStyleSheet(fixedStyle)
171 factor_button.setAlignment(qtc.Qt.AlignCenter)
173 offset += len(flc[i - 1])
174 self.grid.addWidget(factor_button, 0, offset, 1, len(flc[i]))
175 total_factorButton = qtw.QLabel('0')
176 total_factorButton.setAlignment(qtc.Qt.AlignCenter)
177 self.total_factorButtons.append(total_factorButton)
178 total_factorButton.setStyleSheet(fixedStyle)
179 self.grid.addWidget(total_factorButton, len(treatments) + 3, offset, 1, len(flc[i]))
180 level_button_list = []
181 for j in range(len(flc[i])):
183 level_button = qtw.QLabel(level[1])
184 level_button.setAlignment(qtc.Qt.AlignCenter)
185 level_button.setStyleSheet(fixedStyle)
186 self.grid.addWidget(level_button, 1, offset + j, 1, 1)
187 total_level_button = qtw.QLabel('0')
188 total_level_button.setAlignment(qtc.Qt.AlignCenter)
189 level_button_list.append(total_level_button)
190 total_level_button.setStyleSheet(fixedStyle)
191 self.grid.addWidget(total_level_button, len(treatments) + 2, offset + j, 1, 1)
192 for x in range(len(treatments)):
193 treatment = treatments[x]
194 cell_entry = qtw.QLineEdit()
195 cell_entry.setMinimumHeight(50)
196 cell_entry.setStyleSheet(self.entryCountReadOnly)
197 cell_entry.setText('0')
198 cell_entry.setAlignment(qtc.Qt.AlignCenter)
199 cell_entry.setReadOnly(True)
200 self.grid.addWidget(cell_entry, x + 2, offset + j, 1, 1)
201 self.left_top_key[(x + 2, offset + j)] = (treatment[0], factor[0], level[0])
202 self.total_level_button.append(level_button_list)
203 total_button = qtw.QLabel(self.parent.tr('Total'))
204 total_button.setAlignment(qtc.Qt.AlignCenter)
205 total_button.setStyleSheet(fixedStyle)
206 offset += len(flc[-1])
207 self.num_levels = offset - 1
208 self.grid.addWidget(total_button, 0, offset + 2, 2, 1)
209 self.total_treatment_buttons = []
210 for i in range(len(treatments)):
211 treatment = treatments[i]
212 treatment_button = qtw.QLabel(treatment[1])
213 treatment_button.setStyleSheet(fixedStyle)
214 self.grid.addWidget(treatment_button, i + 2, 0, 1, 1)
215 total_treatment_button = qtw.QLabel('0')
216 total_treatment_button.setAlignment(qtc.Qt.AlignCenter)
217 self.total_treatment_buttons.append(total_treatment_button)
218 total_treatment_button.setStyleSheet(fixedStyle)
219 total_treatment_button.setMinimumWidth(100)
220 self.grid.addWidget(total_treatment_button, i + 2, offset + 2, 1, 1)
221 total_button = qtw.QLabel(self.parent.tr('Total'))
222 total_button.setStyleSheet(fixedStyle)
223 self.grid.addWidget(total_button, len(treatments) + 2, 0, 2, 1)
224 self.grand_total_button = qtw.QLabel('0')
225 self.grand_total_button.setAlignment(qtc.Qt.AlignCenter)
226 self.grand_total_button.setStyleSheet(fixedStyle)
227 self.grid.addWidget(self.grand_total_button, len(treatments) + 2, offset + 2, 2, 1)
228 self.valid_preload_image = qtw.QLabel()
229 self.grid.addWidget(self.valid_preload_image, 0, 0, 2, 1)