10
10
class GradesPanel (QtWidgets .QWidget ):
11
11
"""A panel to display semesters, and to handle the addition of new semesters."""
12
12
13
+ panel_calculation_changed = QtCore .Signal ()
14
+
13
15
def __init__ (self ):
14
16
"""Initialize base components of the panel."""
15
17
super ().__init__ ()
16
18
17
19
self .semesters = []
18
20
21
+ self .total_points = 0.0
22
+ self .total_credits = 0
23
+
19
24
self .layout = QtWidgets .QVBoxLayout (self )
20
25
21
26
self .scroll_area = QtWidgets .QScrollArea ()
@@ -38,16 +43,31 @@ def __init__(self):
38
43
self .scroll_area .setFixedHeight (500 )
39
44
self .scroll_area .setWidget (self )
40
45
46
+ def calculate_panel (self ) -> None :
47
+ """Calculate the sum of the semesters points and credit units."""
48
+ self .total_points = 0.0
49
+ self .total_credits = 0
50
+
51
+ for semester in self .semesters :
52
+ self .total_points += semester .total_points
53
+ self .total_credits += semester .total_credits
54
+
55
+ # Send a signal with the new points and credits to be displayed.
56
+ self .panel_calculation_changed .emit ()
57
+
41
58
def add_new_semester (self ):
42
59
"""Add new semester widget to the grades panel."""
43
- widget = SemesterWidget (self )
44
- self .semesters .append (widget )
45
- self .layout .insertWidget (len (self .semesters ) - 1 , widget )
60
+ semester = SemesterWidget (self )
61
+ semester .semester_calculation_updated .connect (self .calculate_panel )
62
+ self .semesters .append (semester )
63
+ self .layout .insertWidget (len (self .semesters ) - 1 , semester )
46
64
47
65
48
66
class SemesterWidget (QtWidgets .QWidget ):
49
67
"""A semester that contain a list of corses, to be added to the grades panel."""
50
68
69
+ semester_calculation_updated = QtCore .Signal ()
70
+
51
71
def __init__ (self , parent_panel ):
52
72
"""Initialize a new semester and it's base components."""
53
73
super ().__init__ ()
@@ -56,6 +76,9 @@ def __init__(self, parent_panel):
56
76
self .semester_id : str = uuid4 ().hex
57
77
self .courses = []
58
78
79
+ self .total_points = 0.0
80
+ self .total_credits = 0
81
+
59
82
self .layout = QtWidgets .QVBoxLayout (self )
60
83
61
84
# Create the semester title bar.
@@ -117,6 +140,19 @@ def __init__(self, parent_panel):
117
140
add_course_button .clicked .connect (self .add_new_course )
118
141
self .layout .addWidget (add_course_button )
119
142
143
+ def calculate_semester (self ) -> None :
144
+ """Calculate the sum of points and the sum of credits in the semester."""
145
+ self .total_points = 0.0
146
+ self .total_credits = 0
147
+
148
+ # TODO Display the semester GPA, credit units and points in the GUI.
149
+ for course in self .courses :
150
+ self .total_points += course .points .value ()
151
+ self .total_credits += course .credit .value ()
152
+
153
+ # Send signal to recalculate panel.
154
+ self .semester_calculation_updated .emit ()
155
+
120
156
def delete_semester (self ):
121
157
"""Remove a specified semester from the grades panel."""
122
158
semester_index = self .parent_panel .semesters .index (self )
@@ -126,16 +162,23 @@ def delete_semester(self):
126
162
for i in range (semester_index , len (self .parent_panel .semesters )):
127
163
self .parent_panel .semesters [i ].title .setText (_ ("Semester %d" ) % (i + 1 ))
128
164
165
+ # Send signal to recalculate panel.
166
+ # FIXME When it is the last semester in the panel, results will not be updated.
167
+ self .semester_calculation_updated .emit ()
168
+
129
169
def add_new_course (self ):
130
170
"""Add new course widget to the semester."""
131
- widget = CourseWidget (self )
132
- self .courses .append (widget )
133
- self .layout .insertWidget (len (self .courses ) + 1 , widget )
171
+ course = CourseWidget (self )
172
+ course .points_changed .connect (self .calculate_semester )
173
+ self .courses .append (course )
174
+ self .layout .insertWidget (len (self .courses ) + 1 , course )
134
175
135
176
136
177
class CourseWidget (QtWidgets .QWidget ):
137
178
"""A course that can be added inside a semester."""
138
179
180
+ points_changed = QtCore .Signal ()
181
+
139
182
def __init__ (self , parent_semester ):
140
183
"""Initialize a new course and it's components."""
141
184
super ().__init__ ()
@@ -172,28 +215,15 @@ def __init__(self, parent_semester):
172
215
self .layout .addWidget (self .credit )
173
216
174
217
self .grade = QtWidgets .QComboBox ()
175
- self .grade .addItems (
176
- [
177
- _ ("Undefined" ),
178
- _ ("A+" ),
179
- _ ("A" ),
180
- _ ("B+" ),
181
- _ ("B" ),
182
- _ ("C+" ),
183
- _ ("C" ),
184
- _ ("D+" ),
185
- _ ("D" ),
186
- _ ("F" ),
187
- ]
188
- )
218
+ self .grade .addItems (common_conversions .grades )
189
219
self .grade .currentIndexChanged .connect (self .grade_changed )
190
220
self .layout .addWidget (self .grade )
191
221
192
222
self .points = QtWidgets .QDoubleSpinBox ()
193
223
self .points .setReadOnly (True )
194
224
self .points .setFocusPolicy (QtCore .Qt .FocusPolicy .NoFocus )
195
225
self .points .setButtonSymbols (QtWidgets .QAbstractSpinBox .NoButtons )
196
- self .points .setMaximum (1000 )
226
+ self .points .setMaximum (10000 )
197
227
self .layout .addWidget (self .points )
198
228
199
229
self .delete_course_button = QtWidgets .QPushButton (
@@ -210,6 +240,9 @@ def update_points(self) -> None:
210
240
* self .credit .value ()
211
241
)
212
242
243
+ # Send signal to recalculate semester.
244
+ self .points_changed .emit ()
245
+
213
246
def score_changed (self ) -> None :
214
247
"""Change the grade when the score is changed."""
215
248
try :
@@ -245,3 +278,7 @@ def delete_course(self):
245
278
246
279
for i in range (course_index , len (self .parent_semester .courses )):
247
280
self .parent_semester .courses [i ].title .setText (_ ("Course %d" ) % (i + 1 ))
281
+
282
+ # Send signal to recalculate semester.
283
+ # FIXME When it is the last course in the semester, results will not be updated.
284
+ self .points_changed .emit ()
0 commit comments