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