1 /***************************************************************************
2                           modifyconstraintactivitiesoccupymaxdifferentroomsform.cpp  -  description
3                              -------------------
4     begin                : Apr 29, 2012
5     copyright            : (C) 2012 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 "modifyconstraintactivitiesoccupymaxdifferentroomsform.h"
23 #include "spaceconstraint.h"
24 
25 #include <QListWidget>
26 #include <QAbstractItemView>
27 #include <QScrollBar>
28 
ModifyConstraintActivitiesOccupyMaxDifferentRoomsForm(QWidget * parent,ConstraintActivitiesOccupyMaxDifferentRooms * ctr)29 ModifyConstraintActivitiesOccupyMaxDifferentRoomsForm::ModifyConstraintActivitiesOccupyMaxDifferentRoomsForm(QWidget* parent, ConstraintActivitiesOccupyMaxDifferentRooms* ctr): QDialog(parent)
30 {
31 	setupUi(this);
32 
33 	okPushButton->setDefault(true);
34 
35 	allActivitiesListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
36 	selectedActivitiesListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
37 
38 	connect(okPushButton, SIGNAL(clicked()), this, SLOT(ok()));
39 	connect(cancelPushButton, SIGNAL(clicked()), this, SLOT(cancel()));
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 	this->_ctr=ctr;
49 
50 	weightLineEdit->setText(CustomFETString::number(ctr->weightPercentage));
51 
52 	maxDifferentRoomsSpinBox->setMinimum(1);
53 	maxDifferentRoomsSpinBox->setMaximum(MAX_ROOMS);
54 	maxDifferentRoomsSpinBox->setValue(ctr->maxDifferentRooms);
55 
56 	//activities
57 	QSize tmp1=teachersComboBox->minimumSizeHint();
58 	Q_UNUSED(tmp1);
59 	QSize tmp2=studentsComboBox->minimumSizeHint();
60 	Q_UNUSED(tmp2);
61 	QSize tmp3=subjectsComboBox->minimumSizeHint();
62 	Q_UNUSED(tmp3);
63 	QSize tmp4=activityTagsComboBox->minimumSizeHint();
64 	Q_UNUSED(tmp4);
65 
66 	selectedActivitiesList.clear();
67 	selectedActivitiesListWidget->clear();
68 	for(int i=0; i<ctr->activitiesIds.count(); i++){
69 		int actId=ctr->activitiesIds.at(i);
70 		this->selectedActivitiesList.append(actId);
71 		Activity *act=gt.rules.activitiesPointerHash.value(actId, nullptr);
72 		assert(act!=nullptr);
73 		this->selectedActivitiesListWidget->addItem(act->getDescription(gt.rules));
74 	}
75 
76 	teachersComboBox->addItem("");
77 	for(int i=0; i<gt.rules.teachersList.size(); i++){
78 		Teacher* tch=gt.rules.teachersList[i];
79 		teachersComboBox->addItem(tch->name);
80 	}
81 	teachersComboBox->setCurrentIndex(0);
82 
83 	subjectsComboBox->addItem("");
84 	for(int i=0; i<gt.rules.subjectsList.size(); i++){
85 		Subject* sb=gt.rules.subjectsList[i];
86 		subjectsComboBox->addItem(sb->name);
87 	}
88 	subjectsComboBox->setCurrentIndex(0);
89 
90 	activityTagsComboBox->addItem("");
91 	for(int i=0; i<gt.rules.activityTagsList.size(); i++){
92 		ActivityTag* st=gt.rules.activityTagsList[i];
93 		activityTagsComboBox->addItem(st->name);
94 	}
95 	activityTagsComboBox->setCurrentIndex(0);
96 
97 	populateStudentsComboBox(studentsComboBox, QString(""), true);
98 	studentsComboBox->setCurrentIndex(0);
99 
100 	filterChanged();
101 
102 	connect(teachersComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterChanged()));
103 	connect(studentsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterChanged()));
104 	connect(subjectsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterChanged()));
105 	connect(activityTagsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterChanged()));
106 }
107 
~ModifyConstraintActivitiesOccupyMaxDifferentRoomsForm()108 ModifyConstraintActivitiesOccupyMaxDifferentRoomsForm::~ModifyConstraintActivitiesOccupyMaxDifferentRoomsForm()
109 {
110 	saveFETDialogGeometry(this);
111 }
112 
ok()113 void ModifyConstraintActivitiesOccupyMaxDifferentRoomsForm::ok()
114 {
115 	double weight;
116 	QString tmp=weightLineEdit->text();
117 	weight_sscanf(tmp, "%lf", &weight);
118 	if(weight<100.0 || weight>100.0){
119 		QMessageBox::warning(this, tr("FET information"),
120 			tr("Invalid weight (percentage). It has to be 100"));
121 		return;
122 	}
123 
124 	this->_ctr->weightPercentage=weight;
125 
126 	int maxDifferentRooms=maxDifferentRoomsSpinBox->value();
127 
128 	this->_ctr->maxDifferentRooms=maxDifferentRooms;
129 
130 	if(this->selectedActivitiesList.count()==0){
131 		QMessageBox::warning(this, tr("FET information"),
132 		 tr("Empty list of activities"));
133 		return;
134 	}
135 	if(this->selectedActivitiesList.count()==1){
136 		QMessageBox::warning(this, tr("FET information"),
137 		 tr("Only one selected activity"));
138 		return;
139 	}
140 
141 	this->_ctr->activitiesIds=selectedActivitiesList;
142 
143 	gt.rules.internalStructureComputed=false;
144 	setRulesModifiedAndOtherThings(&gt.rules);
145 
146 	this->close();
147 }
148 
cancel()149 void ModifyConstraintActivitiesOccupyMaxDifferentRoomsForm::cancel()
150 {
151 	this->close();
152 }
153 
154 //activities
filterOk(Activity * act)155 bool ModifyConstraintActivitiesOccupyMaxDifferentRoomsForm::filterOk(Activity* act)
156 {
157 	QString tn=teachersComboBox->currentText();
158 	QString stn=studentsComboBox->currentText();
159 	QString sbn=subjectsComboBox->currentText();
160 	QString atn=activityTagsComboBox->currentText();
161 	int ok=true;
162 
163 	//teacher
164 	if(tn!=""){
165 		bool ok2=false;
166 		for(QStringList::const_iterator it=act->teachersNames.constBegin(); it!=act->teachersNames.constEnd(); it++)
167 			if(*it == tn){
168 				ok2=true;
169 				break;
170 			}
171 		if(!ok2)
172 			ok=false;
173 	}
174 
175 	//subject
176 	if(sbn!="" && sbn!=act->subjectName)
177 		ok=false;
178 
179 	//activity tag
180 	if(atn!="" && !act->activityTagsNames.contains(atn))
181 		ok=false;
182 
183 	//students
184 	if(stn!=""){
185 		bool ok2=false;
186 		for(QStringList::const_iterator it=act->studentsNames.constBegin(); it!=act->studentsNames.constEnd(); it++)
187 			if(*it == stn){
188 				ok2=true;
189 				break;
190 			}
191 		if(!ok2)
192 			ok=false;
193 	}
194 
195 	return ok;
196 }
197 
filterChanged()198 void ModifyConstraintActivitiesOccupyMaxDifferentRoomsForm::filterChanged()
199 {
200 	allActivitiesListWidget->clear();
201 	this->activitiesList.clear();
202 
203 	for(int i=0; i<gt.rules.activitiesList.size(); i++){
204 		Activity* ac=gt.rules.activitiesList[i];
205 		if(filterOk(ac)){
206 			allActivitiesListWidget->addItem(ac->getDescription(gt.rules));
207 			this->activitiesList.append(ac->id);
208 		}
209 	}
210 
211 	int q=allActivitiesListWidget->verticalScrollBar()->minimum();
212 	allActivitiesListWidget->verticalScrollBar()->setValue(q);
213 }
214 
addActivity()215 void ModifyConstraintActivitiesOccupyMaxDifferentRoomsForm::addActivity()
216 {
217 	if(allActivitiesListWidget->currentRow()<0)
218 		return;
219 	int tmp=allActivitiesListWidget->currentRow();
220 	int _id=this->activitiesList.at(tmp);
221 
222 	QString actName=allActivitiesListWidget->currentItem()->text();
223 	assert(actName!="");
224 
225 	//duplicate?
226 	if(this->selectedActivitiesList.contains(_id))
227 		return;
228 
229 	selectedActivitiesListWidget->addItem(actName);
230 	selectedActivitiesListWidget->setCurrentRow(selectedActivitiesListWidget->count()-1);
231 
232 	this->selectedActivitiesList.append(_id);
233 }
234 
addAllActivities()235 void ModifyConstraintActivitiesOccupyMaxDifferentRoomsForm::addAllActivities()
236 {
237 	for(int tmp=0; tmp<allActivitiesListWidget->count(); tmp++){
238 		int _id=this->activitiesList.at(tmp);
239 
240 		QString actName=allActivitiesListWidget->item(tmp)->text();
241 		assert(actName!="");
242 
243 		if(this->selectedActivitiesList.contains(_id))
244 			continue;
245 
246 		selectedActivitiesListWidget->addItem(actName);
247 		this->selectedActivitiesList.append(_id);
248 	}
249 
250 	selectedActivitiesListWidget->setCurrentRow(selectedActivitiesListWidget->count()-1);
251 }
252 
removeActivity()253 void ModifyConstraintActivitiesOccupyMaxDifferentRoomsForm::removeActivity()
254 {
255 	if(selectedActivitiesListWidget->currentRow()<0 || selectedActivitiesListWidget->count()<=0)
256 		return;
257 	int tmp=selectedActivitiesListWidget->currentRow();
258 
259 	selectedActivitiesList.removeAt(tmp);
260 
261 	selectedActivitiesListWidget->setCurrentRow(-1);
262 	QListWidgetItem* item=selectedActivitiesListWidget->takeItem(tmp);
263 	delete item;
264 	if(tmp<selectedActivitiesListWidget->count())
265 		selectedActivitiesListWidget->setCurrentRow(tmp);
266 	else
267 		selectedActivitiesListWidget->setCurrentRow(selectedActivitiesListWidget->count()-1);
268 }
269 
clear()270 void ModifyConstraintActivitiesOccupyMaxDifferentRoomsForm::clear()
271 {
272 	selectedActivitiesListWidget->clear();
273 	selectedActivitiesList.clear();
274 }
275