1 /***************************************************************************
2 addconstraintactivitiesmaxinatermform.cpp - description
3 -------------------
4 begin : 2020
5 copyright : (C) 2020 by Lalescu Liviu
6 email : Please see https://lalescu.ro/liviu/ for details about contacting Liviu Lalescu (in particular, you can find here the e-mail address)
7 ***************************************************************************/
8
9 /***************************************************************************
10 * *
11 * This program is free software: you can redistribute it and/or modify *
12 * it under the terms of the GNU Affero General Public License as *
13 * published by the Free Software Foundation, either version 3 of the *
14 * License, or (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
18 #include <QMessageBox>
19
20 #include "longtextmessagebox.h"
21
22 #include "addconstraintactivitiesmaxinatermform.h"
23 #include "timeconstraint.h"
24
25 #include <QListWidget>
26 #include <QAbstractItemView>
27 #include <QScrollBar>
28
AddConstraintActivitiesMaxInATermForm(QWidget * parent)29 AddConstraintActivitiesMaxInATermForm::AddConstraintActivitiesMaxInATermForm(QWidget* parent): QDialog(parent)
30 {
31 setupUi(this);
32
33 addConstraintPushButton->setDefault(true);
34
35 allActivitiesListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
36 selectedActivitiesListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
37
38 connect(addConstraintPushButton, SIGNAL(clicked()), this, SLOT(addCurrentConstraint()));
39 connect(closePushButton, SIGNAL(clicked()), this, SLOT(close()));
40 connect(allActivitiesListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(addActivity()));
41 connect(addAllActivitiesPushButton, SIGNAL(clicked()), this, SLOT(addAllActivities()));
42 connect(selectedActivitiesListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(removeActivity()));
43 connect(clearPushButton, SIGNAL(clicked()), this, SLOT(clear()));
44
45 centerWidgetOnScreen(this);
46 restoreFETDialogGeometry(this);
47
48 maxActivitiesInATermSpinBox->setMinimum(1);
49 maxActivitiesInATermSpinBox->setMaximum(MAX_ACTIVITIES);
50 maxActivitiesInATermSpinBox->setValue(1);
51
52 //activities
53 QSize tmp1=teachersComboBox->minimumSizeHint();
54 Q_UNUSED(tmp1);
55 QSize tmp2=studentsComboBox->minimumSizeHint();
56 Q_UNUSED(tmp2);
57 QSize tmp3=subjectsComboBox->minimumSizeHint();
58 Q_UNUSED(tmp3);
59 QSize tmp4=activityTagsComboBox->minimumSizeHint();
60 Q_UNUSED(tmp4);
61
62 teachersComboBox->addItem("");
63 for(int i=0; i<gt.rules.teachersList.size(); i++){
64 Teacher* tch=gt.rules.teachersList[i];
65 teachersComboBox->addItem(tch->name);
66 }
67 teachersComboBox->setCurrentIndex(0);
68
69 subjectsComboBox->addItem("");
70 for(int i=0; i<gt.rules.subjectsList.size(); i++){
71 Subject* sb=gt.rules.subjectsList[i];
72 subjectsComboBox->addItem(sb->name);
73 }
74 subjectsComboBox->setCurrentIndex(0);
75
76 activityTagsComboBox->addItem("");
77 for(int i=0; i<gt.rules.activityTagsList.size(); i++){
78 ActivityTag* st=gt.rules.activityTagsList[i];
79 activityTagsComboBox->addItem(st->name);
80 }
81 activityTagsComboBox->setCurrentIndex(0);
82
83 populateStudentsComboBox(studentsComboBox, QString(""), true);
84 studentsComboBox->setCurrentIndex(0);
85
86 selectedActivitiesListWidget->clear();
87 selectedActivitiesList.clear();
88
89 filterChanged();
90
91 connect(teachersComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterChanged()));
92 connect(studentsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterChanged()));
93 connect(subjectsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterChanged()));
94 connect(activityTagsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterChanged()));
95 }
96
~AddConstraintActivitiesMaxInATermForm()97 AddConstraintActivitiesMaxInATermForm::~AddConstraintActivitiesMaxInATermForm()
98 {
99 saveFETDialogGeometry(this);
100 }
101
addCurrentConstraint()102 void AddConstraintActivitiesMaxInATermForm::addCurrentConstraint()
103 {
104 TimeConstraint *ctr=nullptr;
105
106 double weight;
107 QString tmp=weightLineEdit->text();
108 weight_sscanf(tmp, "%lf", &weight);
109 if(weight<100.0 || weight>100.0){
110 QMessageBox::warning(this, tr("FET information"),
111 tr("Invalid weight (percentage). It has to be 100"));
112 return;
113 }
114
115 int maxActivitiesInATerm=maxActivitiesInATermSpinBox->value();
116
117 if(this->selectedActivitiesList.count()==0){
118 QMessageBox::warning(this, tr("FET information"),
119 tr("Empty list of activities"));
120 return;
121 }
122 //we allow even only one activity
123 /*if(this->selectedActivitiesList.count()==1){
124 QMessageBox::warning(this, tr("FET information"),
125 tr("Only one selected activity"));
126 return;
127 }*/
128
129 ctr=new ConstraintActivitiesMaxInATerm(weight, selectedActivitiesList, maxActivitiesInATerm);
130
131 bool tmp2=gt.rules.addTimeConstraint(ctr);
132 if(tmp2)
133 LongTextMessageBox::information(this, tr("FET information"),
134 tr("Constraint added:")+"\n\n"+ctr->getDetailedDescription(gt.rules));
135 else{
136 QMessageBox::warning(this, tr("FET information"),
137 tr("Constraint NOT added - please report error"));
138 delete ctr;
139 }
140 }
141
142 //activities
filterOk(Activity * act)143 bool AddConstraintActivitiesMaxInATermForm::filterOk(Activity* act)
144 {
145 QString tn=teachersComboBox->currentText();
146 QString stn=studentsComboBox->currentText();
147 QString sbn=subjectsComboBox->currentText();
148 QString sbtn=activityTagsComboBox->currentText();
149 int ok=true;
150
151 //teacher
152 if(tn!=""){
153 bool ok2=false;
154 for(QStringList::Iterator it=act->teachersNames.begin(); it!=act->teachersNames.end(); it++)
155 if(*it == tn){
156 ok2=true;
157 break;
158 }
159 if(!ok2)
160 ok=false;
161 }
162
163 //subject
164 if(sbn!="" && sbn!=act->subjectName)
165 ok=false;
166
167 //activity tag
168 if(sbtn!="" && !act->activityTagsNames.contains(sbtn))
169 ok=false;
170
171 //students
172 if(stn!=""){
173 bool ok2=false;
174 for(QStringList::Iterator it=act->studentsNames.begin(); it!=act->studentsNames.end(); it++)
175 if(*it == stn){
176 ok2=true;
177 break;
178 }
179 if(!ok2)
180 ok=false;
181 }
182
183 return ok;
184 }
185
filterChanged()186 void AddConstraintActivitiesMaxInATermForm::filterChanged()
187 {
188 this->updateActivitiesListWidget();
189 }
190
updateActivitiesListWidget()191 void AddConstraintActivitiesMaxInATermForm::updateActivitiesListWidget()
192 {
193 allActivitiesListWidget->clear();
194 this->activitiesList.clear();
195
196 for(int i=0; i<gt.rules.activitiesList.size(); i++){
197 Activity* ac=gt.rules.activitiesList[i];
198 if(filterOk(ac)){
199 allActivitiesListWidget->addItem(ac->getDescription(gt.rules));
200 this->activitiesList.append(ac->id);
201 }
202 }
203
204 int q=allActivitiesListWidget->verticalScrollBar()->minimum();
205 allActivitiesListWidget->verticalScrollBar()->setValue(q);
206 }
207
addActivity()208 void AddConstraintActivitiesMaxInATermForm::addActivity()
209 {
210 if(allActivitiesListWidget->currentRow()<0)
211 return;
212 int tmp=allActivitiesListWidget->currentRow();
213 int _id=this->activitiesList.at(tmp);
214
215 QString actName=allActivitiesListWidget->currentItem()->text();
216 assert(actName!="");
217 int i;
218 //duplicate?
219 for(i=0; i<selectedActivitiesListWidget->count(); i++)
220 if(actName==selectedActivitiesListWidget->item(i)->text())
221 break;
222 if(i<selectedActivitiesListWidget->count())
223 return;
224 selectedActivitiesListWidget->addItem(actName);
225 selectedActivitiesListWidget->setCurrentRow(selectedActivitiesListWidget->count()-1);
226
227 this->selectedActivitiesList.append(_id);
228 }
229
addAllActivities()230 void AddConstraintActivitiesMaxInATermForm::addAllActivities()
231 {
232 for(int tmp=0; tmp<allActivitiesListWidget->count(); tmp++){
233 //int tmp=allActivitiesListWidget->currentRow();
234 int _id=this->activitiesList.at(tmp);
235
236 QString actName=allActivitiesListWidget->item(tmp)->text();
237 assert(actName!="");
238 int i;
239 //duplicate?
240 for(i=0; i<selectedActivitiesList.count(); i++)
241 if(selectedActivitiesList.at(i)==_id)
242 break;
243 if(i<selectedActivitiesList.count())
244 continue;
245
246 /*for(i=0; i<selectedActivitiesListWidget->count(); i++)
247 if(actName==selectedActivitiesListWidget->item(i)->text())
248 break;
249 if(i<selectedActivitiesListWidget->count())
250 continue;*/
251
252 selectedActivitiesListWidget->addItem(actName);
253 this->selectedActivitiesList.append(_id);
254 }
255
256 selectedActivitiesListWidget->setCurrentRow(selectedActivitiesListWidget->count()-1);
257 }
258
removeActivity()259 void AddConstraintActivitiesMaxInATermForm::removeActivity()
260 {
261 if(selectedActivitiesListWidget->currentRow()<0 || selectedActivitiesListWidget->count()<=0)
262 return;
263 int tmp=selectedActivitiesListWidget->currentRow();
264
265 selectedActivitiesList.removeAt(tmp);
266
267 selectedActivitiesListWidget->setCurrentRow(-1);
268 QListWidgetItem* item=selectedActivitiesListWidget->takeItem(tmp);
269 delete item;
270 if(tmp<selectedActivitiesListWidget->count())
271 selectedActivitiesListWidget->setCurrentRow(tmp);
272 else
273 selectedActivitiesListWidget->setCurrentRow(selectedActivitiesListWidget->count()-1);
274 }
275
clear()276 void AddConstraintActivitiesMaxInATermForm::clear()
277 {
278 selectedActivitiesListWidget->clear();
279 selectedActivitiesList.clear();
280 }
281