OSDN Git Service

File system path for statndalone version
[minimpy2/mp2.git] / freq_table.py
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
5
6 from utils import resource_path
7
8
9 class FreqTable:
10     def __init__(self, parent, ui, trial_id):
11         self.parent = parent
12         self.num_treatments = None
13         self.num_levels = None
14         self.ui = ui
15         self.grid = ui.freqGridLayout
16         self.trial_id = trial_id
17         self.database = Database.get_instance(parent)
18
19     def on_save_preload(self):
20         can_save = True
21         if self.ui.frequenciesCheckBox.isChecked():
22             can_save = False
23         if not self.ui.preloadCheckBox.isChecked():
24             can_save = False
25         if not self.ui.editPreloadCheckBox.isChecked():
26             can_save = False
27         if not can_save:
28             qtw.QMessageBox.information(
29                 self.parent, self.parent.tr('Save not available!'),
30                 self.parent.tr('Select only preload and edit')
31             )
32             return
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)
38         else:
39             pixmap = qtg.QPixmap(resource_path("images/error.png"))
40         self.valid_preload_image.setPixmap(pixmap)
41
42     def add_to_preload(self):
43         preload = self.database.get_preload(self.trial_id)
44         freq = self.extract_counts()
45         for key in freq:
46             freq[key] += preload[key]
47         self.database.clear_preload(self.trial_id)
48         self.database.save_preload(self.trial_id, freq)
49
50     def extract_counts(self):
51         count = {}
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)
55                 entry = item.widget()
56                 key = self.left_top_key[(r, c)]
57                 count[key] = int(entry.text().strip())
58         return count
59
60     def valid_counts(self, count):
61         treatments = self.database.read_treatments(self.trial_id)
62         factors = self.database.read_factors(self.trial_id)
63         tfl = []
64         f_total = []
65         for factor in factors:
66             levels = self.database.factor_levels(factor[0])
67             fl = [[] for i in range(len(levels))]
68             f_total.append(fl)
69         valid = True
70         for treatment in treatments:
71             s = set()
72             row = []
73             for i, factor in enumerate(factors):
74                 t, f = treatment[0], factor[0]
75                 levels = self.database.factor_levels(f)
76                 lst = []
77                 for j, level in enumerate(levels):
78                     lv = level[0]
79                     cnt = count[(t, f, lv)]
80                     f_total[i][j].append(cnt)
81                     lst.append(cnt)
82                 row.append(lst)
83                 s.add(sum(lst))
84                 if len(s) > 1:
85                     valid = False
86             tfl.append(row)
87         gt = 0
88         for i in range(len(self.total_treatment_buttons)):
89             sm = sum(tfl[i][0])
90             self.total_treatment_buttons[i].setText(str(sm))
91             gt += sm
92         self.grand_total_button.setText(str(gt))
93         for i, f_t in enumerate(f_total):
94             s = []
95             for j, f_l in enumerate(f_t):
96                 sm = sum(f_l)
97                 self.total_level_button[i][j].setText(str(sm))
98                 s.append(sm)
99             self.total_factorButtons[i].setText(str(sum(s)))
100         return valid
101
102     def on_clear_preload(self):
103         err = False
104         if self.ui.frequenciesCheckBox.isChecked():
105             err = True
106         if not self.ui.preloadCheckBox.isChecked():
107             err = True
108         if not self.ui.editPreloadCheckBox.isChecked():
109             err = True
110         if err:
111             qtw.QMessageBox.warning(self.parent, self.parent.tr('Clear preload'),
112                                     self.parent.tr('To clear preload, select preload and check edit'))
113             return
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:
118             return
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)
124
125     def toggleReadOnly(self):
126         readOnly = not self.ui.editPreloadCheckBox.isChecked()
127         if self.num_treatments is None or self.num_levels is None:
128             return
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)
135
136     def set_counts(self, cur_count):
137         if self.num_treatments is None or self.num_levels is None:
138             return
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())
145
146     def build(self):
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)
150         if len(factors) < 1:
151             return
152         treatments = self.database.read_treatments(self.trial_id)
153         self.num_treatments = len(treatments)
154         if len(treatments) < 2:
155             return
156         flc = self.database.get_factor_level(self.trial_id)
157         for lvs in flc:
158             if len(lvs) < 2:
159                 return
160         self.left_top_key = {}
161         offset = 1
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)):
168             factor = factors[i]
169             factor_button = qtw.QLabel(factor[1])
170             factor_button.setStyleSheet(fixedStyle)
171             factor_button.setAlignment(qtc.Qt.AlignCenter)
172             if i > 0:
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])):
182                 level = flc[i][j]
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)