1 /***************************************************************************
2                           addconstraintactivitiessamestartingdayform.cpp  -  description
3                              -------------------
4     begin                : Wed June 23 2004
5     copyright            : (C) 2004 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 "addconstraintactivitiessamestartingdayform.h"
23 
24 #include <QListWidget>
25 #include <QAbstractItemView>
26 #include <QScrollBar>
27 
AddConstraintActivitiesSameStartingDayForm(QWidget * parent)28 AddConstraintActivitiesSameStartingDayForm::AddConstraintActivitiesSameStartingDayForm(QWidget* parent): QDialog(parent)
29 {
30 	setupUi(this);
31 
32 	addConstraintPushButton->setDefault(true);
33 
34 	allActivitiesListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
35 	selectedActivitiesListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
36 
37 	connect(closePushButton, SIGNAL(clicked()), this, SLOT(close()));
38 	connect(addConstraintPushButton, SIGNAL(clicked()), this, SLOT(addConstraint()));
39 	connect(clearPushButton, SIGNAL(clicked()), this, SLOT(clear()));
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 
44 	centerWidgetOnScreen(this);
45 	restoreFETDialogGeometry(this);
46 
47 	QSize tmp1=teachersComboBox->minimumSizeHint();
48 	Q_UNUSED(tmp1);
49 	QSize tmp2=studentsComboBox->minimumSizeHint();
50 	Q_UNUSED(tmp2);
51 	QSize tmp3=subjectsComboBox->minimumSizeHint();
52 	Q_UNUSED(tmp3);
53 	QSize tmp4=activityTagsComboBox->minimumSizeHint();
54 	Q_UNUSED(tmp4);
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 	selectedActivitiesListWidget->clear();
81 	this->selectedActivitiesList.clear();
82 
83 	filterChanged();
84 
85 	connect(teachersComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterChanged()));
86 	connect(studentsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterChanged()));
87 	connect(subjectsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterChanged()));
88 	connect(activityTagsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterChanged()));
89 }
90 
~AddConstraintActivitiesSameStartingDayForm()91 AddConstraintActivitiesSameStartingDayForm::~AddConstraintActivitiesSameStartingDayForm()
92 {
93 	saveFETDialogGeometry(this);
94 }
95 
filterOk(Activity * act)96 bool AddConstraintActivitiesSameStartingDayForm::filterOk(Activity* act)
97 {
98 	QString tn=teachersComboBox->currentText();
99 	QString stn=studentsComboBox->currentText();
100 	QString sbn=subjectsComboBox->currentText();
101 	QString atn=activityTagsComboBox->currentText();
102 	int ok=true;
103 
104 	//teacher
105 	if(tn!=""){
106 		bool ok2=false;
107 		for(QStringList::const_iterator it=act->teachersNames.constBegin(); it!=act->teachersNames.constEnd(); it++)
108 			if(*it == tn){
109 				ok2=true;
110 				break;
111 			}
112 		if(!ok2)
113 			ok=false;
114 	}
115 
116 	//subject
117 	if(sbn!="" && sbn!=act->subjectName)
118 		ok=false;
119 
120 	//activity tag
121 	if(atn!="" && !act->activityTagsNames.contains(atn))
122 		ok=false;
123 
124 	//students
125 	if(stn!=""){
126 		bool ok2=false;
127 		for(QStringList::const_iterator it=act->studentsNames.constBegin(); it!=act->studentsNames.constEnd(); it++)
128 			if(*it == stn){
129 				ok2=true;
130 				break;
131 			}
132 		if(!ok2)
133 			ok=false;
134 	}
135 
136 	return ok;
137 }
138 
filterChanged()139 void AddConstraintActivitiesSameStartingDayForm::filterChanged()
140 {
141 	allActivitiesListWidget->clear();
142 	this->activitiesList.clear();
143 
144 	for(int i=0; i<gt.rules.activitiesList.size(); i++){
145 		Activity* ac=gt.rules.activitiesList[i];
146 		if(filterOk(ac)){
147 			allActivitiesListWidget->addItem(ac->getDescription(gt.rules));
148 			this->activitiesList.append(ac->id);
149 		}
150 	}
151 
152 	int q=allActivitiesListWidget->verticalScrollBar()->minimum();
153 	allActivitiesListWidget->verticalScrollBar()->setValue(q);
154 }
155 
addConstraint()156 void AddConstraintActivitiesSameStartingDayForm::addConstraint()
157 {
158 	TimeConstraint *ctr=nullptr;
159 
160 	double weight;
161 	QString tmp=weightLineEdit->text();
162 	weight_sscanf(tmp, "%lf", &weight);
163 	if(weight<0.0 || weight>100.0){
164 		QMessageBox::warning(this, tr("FET information"),
165 			tr("Invalid weight (percentage)"));
166 		return;
167 	}
168 
169 	if(this->selectedActivitiesList.count()==0){
170 		QMessageBox::warning(this, tr("FET information"),
171 			tr("Empty list of selected activities"));
172 		return;
173 	}
174 	if(this->selectedActivitiesList.count()==1){
175 		QMessageBox::warning(this, tr("FET information"),
176 			tr("Only one selected activity - impossible"));
177 		return;
178 	}
179 
180 	QList<int> ids;
181 	QList<int>::const_iterator it;
182 	ids.clear();
183 	for(it=this->selectedActivitiesList.constBegin(); it!=this->selectedActivitiesList.constEnd(); it++){
184 		ids.append(*it);
185 	}
186 	ctr=new ConstraintActivitiesSameStartingDay(weight, this->selectedActivitiesList.count(), ids);
187 
188 	bool tmp2=gt.rules.addTimeConstraint(ctr);
189 
190 	if(tmp2){
191 		QString s;
192 
193 		s+=tr("Constraint added:");
194 		s+="\n\n";
195 		s+=ctr->getDetailedDescription(gt.rules);
196 		LongTextMessageBox::information(this, tr("FET information"), s);
197 	}
198 	else{
199 		QMessageBox::warning(this, tr("FET information"),
200 			tr("Constraint NOT added - please report error"));
201 		delete ctr;
202 	}
203 }
204 
addActivity()205 void AddConstraintActivitiesSameStartingDayForm::addActivity()
206 {
207 	if(allActivitiesListWidget->currentRow()<0)
208 		return;
209 	int tmp=allActivitiesListWidget->currentRow();
210 	int _id=this->activitiesList.at(tmp);
211 
212 	QString actName=allActivitiesListWidget->currentItem()->text();
213 	assert(actName!="");
214 
215 	//duplicate?
216 	if(this->selectedActivitiesList.contains(_id))
217 		return;
218 
219 	selectedActivitiesListWidget->addItem(actName);
220 	selectedActivitiesListWidget->setCurrentRow(selectedActivitiesListWidget->count()-1);
221 
222 	this->selectedActivitiesList.append(_id);
223 }
224 
addAllActivities()225 void AddConstraintActivitiesSameStartingDayForm::addAllActivities()
226 {
227 	for(int tmp=0; tmp<allActivitiesListWidget->count(); tmp++){
228 		int _id=this->activitiesList.at(tmp);
229 
230 		QString actName=allActivitiesListWidget->item(tmp)->text();
231 		assert(actName!="");
232 
233 		if(this->selectedActivitiesList.contains(_id))
234 			continue;
235 
236 		selectedActivitiesListWidget->addItem(actName);
237 		this->selectedActivitiesList.append(_id);
238 	}
239 
240 	selectedActivitiesListWidget->setCurrentRow(selectedActivitiesListWidget->count()-1);
241 }
242 
removeActivity()243 void AddConstraintActivitiesSameStartingDayForm::removeActivity()
244 {
245 	if(selectedActivitiesListWidget->currentRow()<0 || selectedActivitiesListWidget->count()<=0)
246 		return;
247 	int tmp=selectedActivitiesListWidget->currentRow();
248 
249 	this->selectedActivitiesList.removeAt(tmp);
250 
251 	selectedActivitiesListWidget->setCurrentRow(-1);
252 	QListWidgetItem* item=selectedActivitiesListWidget->takeItem(tmp);
253 	delete item;
254 	if(tmp<selectedActivitiesListWidget->count())
255 		selectedActivitiesListWidget->setCurrentRow(tmp);
256 	else
257 		selectedActivitiesListWidget->setCurrentRow(selectedActivitiesListWidget->count()-1);
258 }
259 
clear()260 void AddConstraintActivitiesSameStartingDayForm::clear()
261 {
262 	selectedActivitiesListWidget->clear();
263 	selectedActivitiesList.clear();
264 }
265