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