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