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