1 /***************************************************************************
2 addconstraintthreeactivitiesgroupedform.cpp - description
3 -------------------
4 begin : Aug 14, 2009
5 copyright : (C) 2009 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 "addconstraintthreeactivitiesgroupedform.h"
23 #include "timeconstraint.h"
24
AddConstraintThreeActivitiesGroupedForm(QWidget * parent)25 AddConstraintThreeActivitiesGroupedForm::AddConstraintThreeActivitiesGroupedForm(QWidget* parent): QDialog(parent)
26 {
27 setupUi(this);
28
29 addConstraintPushButton->setDefault(true);
30
31 connect(addConstraintPushButton, SIGNAL(clicked()), this, SLOT(addCurrentConstraint()));
32 connect(closePushButton, SIGNAL(clicked()), this, SLOT(close()));
33
34 centerWidgetOnScreen(this);
35 restoreFETDialogGeometry(this);
36
37 QSize tmp1=teachersComboBox->minimumSizeHint();
38 Q_UNUSED(tmp1);
39 QSize tmp2=studentsComboBox->minimumSizeHint();
40 Q_UNUSED(tmp2);
41 QSize tmp3=subjectsComboBox->minimumSizeHint();
42 Q_UNUSED(tmp3);
43 QSize tmp4=activityTagsComboBox->minimumSizeHint();
44 Q_UNUSED(tmp4);
45
46 QSize tmp5=firstActivitiesComboBox->minimumSizeHint();
47 Q_UNUSED(tmp5);
48 QSize tmp6=secondActivitiesComboBox->minimumSizeHint();
49 Q_UNUSED(tmp6);
50 QSize tmp7=thirdActivitiesComboBox->minimumSizeHint();
51 Q_UNUSED(tmp7);
52
53 firstActivitiesComboBox->setMaximumWidth(maxRecommendedWidth(this));
54 secondActivitiesComboBox->setMaximumWidth(maxRecommendedWidth(this));
55 thirdActivitiesComboBox->setMaximumWidth(maxRecommendedWidth(this));
56
57 teachersComboBox->addItem("");
58 for(int i=0; i<gt.rules.teachersList.size(); i++){
59 Teacher* tch=gt.rules.teachersList[i];
60 teachersComboBox->addItem(tch->name);
61 }
62 teachersComboBox->setCurrentIndex(0);
63
64 subjectsComboBox->addItem("");
65 for(int i=0; i<gt.rules.subjectsList.size(); i++){
66 Subject* sb=gt.rules.subjectsList[i];
67 subjectsComboBox->addItem(sb->name);
68 }
69 subjectsComboBox->setCurrentIndex(0);
70
71 activityTagsComboBox->addItem("");
72 for(int i=0; i<gt.rules.activityTagsList.size(); i++){
73 ActivityTag* st=gt.rules.activityTagsList[i];
74 activityTagsComboBox->addItem(st->name);
75 }
76 activityTagsComboBox->setCurrentIndex(0);
77
78 populateStudentsComboBox(studentsComboBox, QString(""), true);
79 studentsComboBox->setCurrentIndex(0);
80
81 filterChanged();
82
83 connect(teachersComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterChanged()));
84 connect(studentsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterChanged()));
85 connect(subjectsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterChanged()));
86 connect(activityTagsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterChanged()));
87 }
88
~AddConstraintThreeActivitiesGroupedForm()89 AddConstraintThreeActivitiesGroupedForm::~AddConstraintThreeActivitiesGroupedForm()
90 {
91 saveFETDialogGeometry(this);
92 }
93
filterOk(Activity * act)94 bool AddConstraintThreeActivitiesGroupedForm::filterOk(Activity* act)
95 {
96 QString tn=teachersComboBox->currentText();
97 QString stn=studentsComboBox->currentText();
98 QString sbn=subjectsComboBox->currentText();
99 QString atn=activityTagsComboBox->currentText();
100 int ok=true;
101
102 //teacher
103 if(tn!=""){
104 bool ok2=false;
105 for(QStringList::const_iterator it=act->teachersNames.constBegin(); it!=act->teachersNames.constEnd(); it++)
106 if(*it == tn){
107 ok2=true;
108 break;
109 }
110 if(!ok2)
111 ok=false;
112 }
113
114 //subject
115 if(sbn!="" && sbn!=act->subjectName)
116 ok=false;
117
118 //activity tag
119 if(atn!="" && !act->activityTagsNames.contains(atn))
120 ok=false;
121
122 //students
123 if(stn!=""){
124 bool ok2=false;
125 for(QStringList::const_iterator it=act->studentsNames.constBegin(); it!=act->studentsNames.constEnd(); it++)
126 if(*it == stn){
127 ok2=true;
128 break;
129 }
130 if(!ok2)
131 ok=false;
132 }
133
134 return ok;
135 }
136
filterChanged()137 void AddConstraintThreeActivitiesGroupedForm::filterChanged(){
138 firstActivitiesComboBox->clear();
139 firstActivitiesList.clear();
140
141 secondActivitiesComboBox->clear();
142 secondActivitiesList.clear();
143
144 thirdActivitiesComboBox->clear();
145 thirdActivitiesList.clear();
146
147 for(int i=0; i<gt.rules.activitiesList.size(); i++){
148 Activity* act=gt.rules.activitiesList[i];
149
150 if(filterOk(act)){
151 firstActivitiesComboBox->addItem(act->getDescription(gt.rules));
152 this->firstActivitiesList.append(act->id);
153
154 secondActivitiesComboBox->addItem(act->getDescription(gt.rules));
155 this->secondActivitiesList.append(act->id);
156
157 thirdActivitiesComboBox->addItem(act->getDescription(gt.rules));
158 this->thirdActivitiesList.append(act->id);
159 }
160 }
161
162 if(firstActivitiesComboBox->count()>=1)
163 firstActivitiesComboBox->setCurrentIndex(0);
164
165 if(secondActivitiesComboBox->count()>=2)
166 secondActivitiesComboBox->setCurrentIndex(1);
167 else if(secondActivitiesComboBox->count()>=1)
168 secondActivitiesComboBox->setCurrentIndex(0);
169
170 if(thirdActivitiesComboBox->count()>=3)
171 thirdActivitiesComboBox->setCurrentIndex(2);
172 else if(thirdActivitiesComboBox->count()>=2)
173 thirdActivitiesComboBox->setCurrentIndex(1);
174 else if(thirdActivitiesComboBox->count()>=1)
175 thirdActivitiesComboBox->setCurrentIndex(0);
176 }
177
addCurrentConstraint()178 void AddConstraintThreeActivitiesGroupedForm::addCurrentConstraint()
179 {
180 TimeConstraint *ctr=nullptr;
181
182 double weight;
183 QString tmp=weightLineEdit->text();
184 weight_sscanf(tmp, "%lf", &weight);
185 if(weight<0.0 || weight>100.0){
186 QMessageBox::warning(this, tr("FET information"),
187 tr("Invalid weight (percentage)"));
188 return;
189 }
190
191 int fid;
192 int tmp2=firstActivitiesComboBox->currentIndex();
193 assert(tmp2<gt.rules.activitiesList.size());
194 assert(tmp2<firstActivitiesList.size());
195 if(tmp2<0){
196 QMessageBox::warning(this, tr("FET information"),
197 tr("Invalid activity"));
198 return;
199 }
200 else
201 fid=firstActivitiesList.at(tmp2);
202
203 int sid;
204 int tmp3=secondActivitiesComboBox->currentIndex();
205 assert(tmp3<gt.rules.activitiesList.size());
206 assert(tmp3<secondActivitiesList.size());
207 if(tmp3<0){
208 QMessageBox::warning(this, tr("FET information"),
209 tr("Invalid activity"));
210 return;
211 }
212 else
213 sid=secondActivitiesList.at(tmp3);
214
215 int tid;
216 int tmp4=thirdActivitiesComboBox->currentIndex();
217 assert(tmp4<gt.rules.activitiesList.size());
218 assert(tmp4<thirdActivitiesList.size());
219 if(tmp4<0){
220 QMessageBox::warning(this, tr("FET information"),
221 tr("Invalid activity"));
222 return;
223 }
224 else
225 tid=thirdActivitiesList.at(tmp4);
226
227 if(sid==fid || sid==tid || fid==tid){
228 QMessageBox::warning(this, tr("FET information"),
229 tr("Same activities - impossible"));
230 return;
231 }
232
233 ctr=new ConstraintThreeActivitiesGrouped(weight, fid, sid, tid);
234
235 bool tmp5=gt.rules.addTimeConstraint(ctr);
236 if(tmp5)
237 LongTextMessageBox::information(this, tr("FET information"),
238 tr("Constraint added:")+"\n\n"+ctr->getDetailedDescription(gt.rules));
239 else{
240 QMessageBox::warning(this, tr("FET information"),
241 tr("Constraint NOT added - error?"));
242 delete ctr;
243 }
244 }
245