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