1 /***************************************************************************
2                           modifyactivityform.cpp  -  description
3                              -------------------
4     begin                : Feb 9, 2005
5     copyright            : (C) 2005 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 "modifyactivityform.h"
19 #include "teacher.h"
20 #include "subject.h"
21 #include "studentsset.h"
22 
23 #include "activityplanningform.h"
24 
25 #include <QMessageBox>
26 
27 #include <QPlainTextEdit>
28 
29 #include <QList>
30 
31 #include <QListWidget>
32 #include <QAbstractItemView>
33 #include <QScrollBar>
34 
35 #include <QSettings>
36 #include <QObject>
37 #include <QMetaObject>
38 
39 extern const QString COMPANY;
40 extern const QString PROGRAM;
41 
dur(int i)42 QSpinBox* ModifyActivityForm::dur(int i)
43 {
44 	assert(i>=0 && i<durList.count());
45 	assert(i<MAX_SPLIT_OF_AN_ACTIVITY);
46 	return durList.at(i);
47 }
48 
activ(int i)49 QCheckBox* ModifyActivityForm::activ(int i)
50 {
51 	assert(i>=0 && i<activList.count());
52 	assert(i<MAX_SPLIT_OF_AN_ACTIVITY);
53 	return activList.at(i);
54 }
55 
ModifyActivityForm(QWidget * parent,int id,int activityGroupId)56 ModifyActivityForm::ModifyActivityForm(QWidget* parent, int id, int activityGroupId): QDialog(parent)
57 {
58 	setupUi(this);
59 
60 	for(Teacher* tch : qAsConst(gt.rules.teachersList))
61 		teacherNamesSet.insert(tch->name);
62 	for(Subject* sbj : qAsConst(gt.rules.subjectsList))
63 		subjectNamesSet.insert(sbj->name);
64 	for(ActivityTag* at : qAsConst(gt.rules.activityTagsList))
65 		activityTagNamesSet.insert(at->name);
66 
67 	allTeachersListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
68 	selectedTeachersListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
69 	allStudentsListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
70 	selectedStudentsListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
71 	allActivityTagsListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
72 	selectedActivityTagsListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
73 
74 	QSettings settings(COMPANY, PROGRAM);
75 
76 	showSubgroupsCheckBox->setChecked(settings.value(this->metaObject()->className()+QString("/show-subgroups-check-box-state"), "false").toBool());
77 	showGroupsCheckBox->setChecked(settings.value(this->metaObject()->className()+QString("/show-groups-check-box-state"), "true").toBool());
78 	showYearsCheckBox->setChecked(settings.value(this->metaObject()->className()+QString("/show-years-check-box-state"), "true").toBool());
79 
80 	allTeachersRadioButton->setChecked(settings.value(this->metaObject()->className()+QString("/all-teachers-radio-button-state"), "true").toBool());
81 	qualifiedTeachersRadioButton->setChecked(settings.value(this->metaObject()->className()+QString("/qualified-teachers-radio-button-state"), "false").toBool());
82 
83 	connect(cancelPushButton, SIGNAL(clicked()), this, SLOT(cancel()));
84 	connect(okPushButton, SIGNAL(clicked()), this, SLOT(ok()));
85 	connect(clearTeacherPushButton, SIGNAL(clicked()), this, SLOT(clearTeachers()));
86 	connect(clearStudentsPushButton, SIGNAL(clicked()), this, SLOT(clearStudents()));
87 	connect(allTeachersListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(addTeacher()));
88 	connect(selectedTeachersListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(removeTeacher()));
89 	connect(allStudentsListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(addStudents()));
90 	connect(selectedStudentsListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(removeStudents()));
91 	connect(clearActivityTagPushButton, SIGNAL(clicked()), this, SLOT(clearActivityTags()));
92 	connect(allActivityTagsListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(addActivityTag()));
93 	connect(selectedActivityTagsListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(removeActivityTag()));
94 	connect(showYearsCheckBox, SIGNAL(toggled(bool)), this, SLOT(showYearsChanged()));
95 	connect(showGroupsCheckBox, SIGNAL(toggled(bool)), this, SLOT(showGroupsChanged()));
96 	connect(showSubgroupsCheckBox, SIGNAL(toggled(bool)), this, SLOT(showSubgroupsChanged()));
97 	connect(helpPushButton, SIGNAL(clicked()), this, SLOT(help()));
98 
99 	centerWidgetOnScreen(this);
100 	restoreFETDialogGeometry(this);
101 
102 	QSize tmp3=subjectsComboBox->minimumSizeHint();
103 	Q_UNUSED(tmp3);
104 
105 	this->_id=id;
106 	this->_activityGroupId=activityGroupId;
107 	for(int i=0; i<gt.rules.activitiesList.size(); i++){
108 		Activity* act=gt.rules.activitiesList[i];
109 		if(act->activityGroupId==this->_activityGroupId && act->id==this->_id)
110 			this->_activity=act;
111 	}
112 
113 	this->_teachers=this->_activity->teachersNames;
114 	this->_subject = this->_activity->subjectName;
115 	this->_activityTags = this->_activity->activityTagsNames;
116 	this->_students=this->_activity->studentsNames;
117 
118 	int nSplit=0;
119 	QList<int> durations;
120 	QList<bool> actives;
121 	int crtIndex=-1;
122 
123 	durations.clear();
124 	actives.clear();
125 	if(this->_activityGroupId!=0){
126 		for(int i=0; i<gt.rules.activitiesList.size(); i++){
127 			Activity* act=gt.rules.activitiesList[i];
128 			if(act->activityGroupId==this->_activityGroupId){
129 				if(nSplit>=MAX_SPLIT_OF_AN_ACTIVITY){
130 					assert(0);
131 				}
132 				else{
133 					durations.append(act->duration);
134 					actives.append(act->active);
135 					if(this->_id==act->id)
136 						crtIndex=nSplit;
137 					nSplit++;
138 				}
139 			}
140 		}
141 	}
142 	else{
143 		durations.append(this->_activity->duration);
144 		actives.append(this->_activity->active);
145 		crtIndex=nSplit;
146 		nSplit++;
147 	}
148 	assert(crtIndex>=0);
149 
150 	splitSpinBox->setMinimum(nSplit);
151 	splitSpinBox->setMaximum(nSplit);
152 	splitSpinBox->setValue(nSplit);
153 
154 	durList.clear();
155 	activList.clear();
156 
157 	populateSubactivitiesTabWidget(splitSpinBox->value());
158 
159 	for(int i=0; i<durations.count(); i++){
160 		dur(i)->setValue(durations.at(i));
161 		activ(i)->setChecked(actives.at(i));
162 	}
163 	subactivitiesTabWidget->setCurrentIndex(crtIndex);
164 
165 	nStudentsSpinBox->setMinimum(-1);
166 	nStudentsSpinBox->setMaximum(MAX_ROOM_CAPACITY);
167 	nStudentsSpinBox->setValue(-1);
168 
169 	if(this->_activity->computeNTotalStudents==false)
170 		nStudentsSpinBox->setValue(this->_activity->nTotalStudents);
171 
172 	updateStudentsListWidget();
173 	updateSubjectsComboBox();
174 	updateActivityTagsListWidget();
175 
176 	//after updateSubjectsComboBox
177 	connect(subjectsComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updateAllTeachersListWidget()));
178 	connect(allTeachersRadioButton, SIGNAL(toggled(bool)), this, SLOT(allTeachersRadioButtonToggled(bool)));
179 	connect(qualifiedTeachersRadioButton, SIGNAL(toggled(bool)), this, SLOT(qualifiedTeachersRadioButtonToggled(bool)));
180 	updateAllTeachersListWidget();
181 
182 	selectedTeachersListWidget->clear();
183 	for(QStringList::const_iterator it=this->_teachers.constBegin(); it!=this->_teachers.constEnd(); it++)
184 		selectedTeachersListWidget->addItem(*it);
185 
186 	selectedStudentsListWidget->clear();
187 	for(QStringList::const_iterator it=this->_students.constBegin(); it!=this->_students.constEnd(); it++)
188 		selectedStudentsListWidget->addItem(*it);
189 
190 	okPushButton->setDefault(true);
191 	okPushButton->setFocus();
192 }
193 
~ModifyActivityForm()194 ModifyActivityForm::~ModifyActivityForm()
195 {
196 	saveFETDialogGeometry(this);
197 
198 	QSettings settings(COMPANY, PROGRAM);
199 
200 	settings.setValue(this->metaObject()->className()+QString("/show-subgroups-check-box-state"), showSubgroupsCheckBox->isChecked());
201 	settings.setValue(this->metaObject()->className()+QString("/show-groups-check-box-state"), showGroupsCheckBox->isChecked());
202 	settings.setValue(this->metaObject()->className()+QString("/show-years-check-box-state"), showYearsCheckBox->isChecked());
203 
204 	settings.setValue(this->metaObject()->className()+QString("/qualified-teachers-radio-button-state"), qualifiedTeachersRadioButton->isChecked());
205 	settings.setValue(this->metaObject()->className()+QString("/all-teachers-radio-button-state"), allTeachersRadioButton->isChecked());
206 }
207 
populateSubactivitiesTabWidget(int n)208 void ModifyActivityForm::populateSubactivitiesTabWidget(int n)
209 {
210 	int oldN=subactivitiesTabWidget->count();
211 	if(oldN>n){
212 		for(int i=oldN-1; i>=n; i--){
213 			QWidget* wd=subactivitiesTabWidget->widget(i);
214 			subactivitiesTabWidget->removeTab(i);
215 			assert(durList.count()>0);
216 			durList.removeLast();
217 			assert(activList.count()>0);
218 			activList.removeLast();
219 			delete wd;
220 		}
221 	}
222 	else if(oldN<n){
223 		for(int i=oldN; i<n; i++){
224 			QWidget* wd=new QWidget(subactivitiesTabWidget);
225 
226 			QCheckBox* cb=new QCheckBox(tr("Active"), wd);
227 			cb->setChecked(true);
228 			QSpinBox* sb=new QSpinBox(wd);
229 			sb->setMinimum(1);
230 			sb->setMaximum(MAX_HOURS_PER_DAY);
231 			sb->setValue(1);
232 			QLabel* ld=new QLabel(tr("Duration"), wd);
233 
234 			QHBoxLayout* hld=new QHBoxLayout();
235 			hld->addWidget(ld);
236 			hld->addWidget(sb);
237 
238 			QHBoxLayout* hla=new QHBoxLayout();
239 			hla->addStretch();
240 			hla->addWidget(cb);
241 
242 			QVBoxLayout* vl=new QVBoxLayout(wd);
243 			vl->addLayout(hld);
244 			vl->addLayout(hla);
245 
246 			subactivitiesTabWidget->addTab(wd, QString::number(i+1));
247 
248 			durList.append(sb);
249 			activList.append(cb);
250 		}
251 	}
252 }
253 
allTeachersRadioButtonToggled(bool toggled)254 void ModifyActivityForm::allTeachersRadioButtonToggled(bool toggled)
255 {
256 	if(toggled)
257 		updateAllTeachersListWidget();
258 }
259 
qualifiedTeachersRadioButtonToggled(bool toggled)260 void ModifyActivityForm::qualifiedTeachersRadioButtonToggled(bool toggled)
261 {
262 	if(toggled)
263 		updateAllTeachersListWidget();
264 }
265 
updateAllTeachersListWidget()266 void ModifyActivityForm::updateAllTeachersListWidget()
267 {
268 	allTeachersListWidget->clear();
269 
270 	for(int i=0; i<gt.rules.teachersList.size(); i++){
271 		Teacher* tch=gt.rules.teachersList[i];
272 		if(allTeachersRadioButton->isChecked() || subjectsComboBox->currentIndex()==-1){
273 			allTeachersListWidget->addItem(tch->name);
274 		}
275 		else{
276 			assert(qualifiedTeachersRadioButton->isChecked());
277 			assert(subjectsComboBox->currentText()!="");
278 			assert(subjectNamesSet.contains(subjectsComboBox->currentText()));
279 			if(tch->qualifiedSubjectsHash.contains(subjectsComboBox->currentText())){
280 				allTeachersListWidget->addItem(tch->name);
281 			}
282 		}
283 	}
284 }
285 
addTeacher()286 void ModifyActivityForm::addTeacher()
287 {
288 	if(allTeachersListWidget->currentRow()<0 || allTeachersListWidget->currentRow()>=allTeachersListWidget->count())
289 		return;
290 
291 	for(int i=0; i<selectedTeachersListWidget->count(); i++)
292 		if(selectedTeachersListWidget->item(i)->text()==allTeachersListWidget->currentItem()->text())
293 			return;
294 
295 	selectedTeachersListWidget->addItem(allTeachersListWidget->currentItem()->text());
296 	selectedTeachersListWidget->setCurrentRow(selectedTeachersListWidget->count()-1);
297 }
298 
removeTeacher()299 void ModifyActivityForm::removeTeacher()
300 {
301 	if(selectedTeachersListWidget->count()<=0 || selectedTeachersListWidget->currentRow()<0 ||
302 	 selectedTeachersListWidget->currentRow()>=selectedTeachersListWidget->count())
303 		return;
304 
305 	int i=selectedTeachersListWidget->currentRow();
306 	selectedTeachersListWidget->setCurrentRow(-1);
307 	QListWidgetItem* item=selectedTeachersListWidget->takeItem(i);
308 	delete item;
309 	if(i<selectedTeachersListWidget->count())
310 		selectedTeachersListWidget->setCurrentRow(i);
311 	else
312 		selectedTeachersListWidget->setCurrentRow(selectedTeachersListWidget->count()-1);
313 }
314 
addStudents()315 void ModifyActivityForm::addStudents()
316 {
317 	if(allStudentsListWidget->currentRow()<0 || allStudentsListWidget->currentRow()>=allStudentsListWidget->count())
318 		return;
319 
320 	assert(canonicalStudentsSetsNames.count()==allStudentsListWidget->count());
321 	QString sn=canonicalStudentsSetsNames.at(allStudentsListWidget->currentRow());
322 
323 	for(int i=0; i<selectedStudentsListWidget->count(); i++)
324 		if(selectedStudentsListWidget->item(i)->text()==sn)
325 			return;
326 
327 	selectedStudentsListWidget->addItem(sn);
328 	selectedStudentsListWidget->setCurrentRow(selectedStudentsListWidget->count()-1);
329 }
330 
removeStudents()331 void ModifyActivityForm::removeStudents()
332 {
333 	if(selectedStudentsListWidget->count()<=0 || selectedStudentsListWidget->currentRow()<0 ||
334 	 selectedStudentsListWidget->currentRow()>=selectedStudentsListWidget->count())
335 		return;
336 
337 	int i=selectedStudentsListWidget->currentRow();
338 	selectedStudentsListWidget->setCurrentRow(-1);
339 	QListWidgetItem* item=selectedStudentsListWidget->takeItem(i);
340 	delete item;
341 	if(i<selectedStudentsListWidget->count())
342 		selectedStudentsListWidget->setCurrentRow(i);
343 	else
344 		selectedStudentsListWidget->setCurrentRow(selectedStudentsListWidget->count()-1);
345 }
346 
addActivityTag()347 void ModifyActivityForm::addActivityTag()
348 {
349 	if(allActivityTagsListWidget->currentRow()<0 || allActivityTagsListWidget->currentRow()>=allActivityTagsListWidget->count())
350 		return;
351 
352 	for(int i=0; i<selectedActivityTagsListWidget->count(); i++)
353 		if(selectedActivityTagsListWidget->item(i)->text()==allActivityTagsListWidget->currentItem()->text())
354 			return;
355 
356 	selectedActivityTagsListWidget->addItem(allActivityTagsListWidget->currentItem()->text());
357 	selectedActivityTagsListWidget->setCurrentRow(selectedActivityTagsListWidget->count()-1);
358 }
359 
removeActivityTag()360 void ModifyActivityForm::removeActivityTag()
361 {
362 	if(selectedActivityTagsListWidget->count()<=0 || selectedActivityTagsListWidget->currentRow()<0 ||
363 	 selectedActivityTagsListWidget->currentRow()>=selectedActivityTagsListWidget->count())
364 		return;
365 
366 	int i=selectedActivityTagsListWidget->currentRow();
367 	selectedActivityTagsListWidget->setCurrentRow(-1);
368 	QListWidgetItem* item=selectedActivityTagsListWidget->takeItem(i);
369 	delete item;
370 	if(i<selectedActivityTagsListWidget->count())
371 		selectedActivityTagsListWidget->setCurrentRow(i);
372 	else
373 		selectedActivityTagsListWidget->setCurrentRow(selectedActivityTagsListWidget->count()-1);
374 }
375 
updateSubjectsComboBox()376 void ModifyActivityForm::updateSubjectsComboBox()
377 {
378 	int i=0, j=-1;
379 	subjectsComboBox->clear();
380 	for(int k=0; k<gt.rules.subjectsList.size(); k++, i++){
381 		Subject* sbj=gt.rules.subjectsList[k];
382 		subjectsComboBox->addItem(sbj->name);
383 		if(sbj->name==this->_subject)
384 			j=i;
385 	}
386 	assert(j!=-1);
387 	subjectsComboBox->setCurrentIndex(j);
388 }
389 
updateActivityTagsListWidget()390 void ModifyActivityForm::updateActivityTagsListWidget()
391 {
392 	allActivityTagsListWidget->clear();
393 	for(int i=0; i<gt.rules.activityTagsList.size(); i++){
394 		ActivityTag* at=gt.rules.activityTagsList[i];
395 		allActivityTagsListWidget->addItem(at->name);
396 	}
397 
398 	selectedActivityTagsListWidget->clear();
399 	for(QStringList::const_iterator it=this->_activityTags.constBegin(); it!=this->_activityTags.constEnd(); it++)
400 		selectedActivityTagsListWidget->addItem(*it);
401 }
402 
showYearsChanged()403 void ModifyActivityForm::showYearsChanged()
404 {
405 	updateStudentsListWidget();
406 }
407 
showGroupsChanged()408 void ModifyActivityForm::showGroupsChanged()
409 {
410 	updateStudentsListWidget();
411 }
412 
showSubgroupsChanged()413 void ModifyActivityForm::showSubgroupsChanged()
414 {
415 	updateStudentsListWidget();
416 }
417 
updateStudentsListWidget()418 void ModifyActivityForm::updateStudentsListWidget()
419 {
420 	const int INDENT=2;
421 
422 	bool showYears=showYearsCheckBox->isChecked();
423 	bool showGroups=showGroupsCheckBox->isChecked();
424 	bool showSubgroups=showSubgroupsCheckBox->isChecked();
425 
426 	allStudentsListWidget->clear();
427 	canonicalStudentsSetsNames.clear();
428 	for(int i=0; i<gt.rules.yearsList.size(); i++){
429 		StudentsYear* sty=gt.rules.yearsList[i];
430 		if(showYears){
431 			allStudentsListWidget->addItem(sty->name);
432 			canonicalStudentsSetsNames.append(sty->name);
433 		}
434 		for(int j=0; j<sty->groupsList.size(); j++){
435 			StudentsGroup* stg=sty->groupsList[j];
436 			if(showGroups){
437 				QString begin=QString("");
438 				QString end=QString("");
439 				begin=QString(INDENT, ' ');
440 				allStudentsListWidget->addItem(begin+stg->name+end);
441 				canonicalStudentsSetsNames.append(stg->name);
442 			}
443 			if(showSubgroups) for(int k=0; k<stg->subgroupsList.size(); k++){
444 				StudentsSubgroup* sts=stg->subgroupsList[k];
445 
446 				QString begin=QString("");
447 				QString end=QString("");
448 				begin=QString(2*INDENT, ' ');
449 				allStudentsListWidget->addItem(begin+sts->name+end);
450 				canonicalStudentsSetsNames.append(sts->name);
451 			}
452 		}
453 	}
454 
455 	int q=allStudentsListWidget->verticalScrollBar()->minimum();
456 	allStudentsListWidget->verticalScrollBar()->setValue(q);
457 }
458 
cancel()459 void ModifyActivityForm::cancel()
460 {
461 	this->reject();
462 }
463 
ok()464 void ModifyActivityForm::ok()
465 {
466 	//subject
467 	QString subject_name=subjectsComboBox->currentText();
468 	/*int subject_index=gt.rules.searchSubject(subject_name);
469 	if(subject_index<0){*/
470 	bool found=subjectNamesSet.contains(subject_name);
471 	if(!found){
472 		QMessageBox::warning(this, tr("FET information"),
473 			tr("Invalid subject"));
474 		return;
475 	}
476 
477 	//activity tag
478 	QStringList activity_tags_names;
479 	for(int i=0; i<selectedActivityTagsListWidget->count(); i++){
480 		//assert(gt.rules.searchActivityTag(selectedActivityTagsListWidget->item(i)->text())>=0);
481 		assert(activityTagNamesSet.contains(selectedActivityTagsListWidget->item(i)->text()));
482 		activity_tags_names.append(selectedActivityTagsListWidget->item(i)->text());
483 	}
484 
485 	//teachers
486 	QStringList teachers_names;
487 	if(selectedTeachersListWidget->count()<=0){
488 		int t=QMessageBox::question(this, tr("FET question"),
489 		 tr("Do you really want to have the activity without teacher(s)?"),
490 		 QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes);
491 
492 		if(t==QMessageBox::No)
493 			return;
494 	}
495 	else{
496 		for(int i=0; i<selectedTeachersListWidget->count(); i++){
497 			//assert(gt.rules.searchTeacher(selectedTeachersListWidget->item(i)->text())>=0);
498 			assert(teacherNamesSet.contains(selectedTeachersListWidget->item(i)->text()));
499 			teachers_names.append(selectedTeachersListWidget->item(i)->text());
500 		}
501 	}
502 
503 	//students
504 	int numberOfStudents=0;
505 	QStringList students_names;
506 	if(selectedStudentsListWidget->count()<=0){
507 		int t=QMessageBox::question(this, tr("FET question"),
508 		 tr("Do you really want to have the activity without student set(s)?"),
509 		 QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes);
510 
511 		if(t==QMessageBox::No)
512 			return;
513 	}
514 	else{
515 		for(int i=0; i<selectedStudentsListWidget->count(); i++){
516 			//assert(gt.rules.searchStudentsSet(selectedStudentsListWidget->item(i)->text())!=nullptr);
517 			/*assert(numberOfStudentsHash.contains(selectedStudentsListWidget->item(i)->text()));
518 			numberOfStudents+=numberOfStudentsHash.value(selectedStudentsListWidget->item(i)->text());*/
519 			assert(gt.rules.permanentStudentsHash.contains(selectedStudentsListWidget->item(i)->text()));
520 			numberOfStudents+=gt.rules.permanentStudentsHash.value(selectedStudentsListWidget->item(i)->text())->numberOfStudents;
521 			students_names.append(selectedStudentsListWidget->item(i)->text());
522 		}
523 	}
524 
525 	/*int total_number_of_students=0;
526 	for(QStringList::Iterator it=students_names.begin(); it!=students_names.end(); it++){
527 		StudentsSet* ss=gt.rules.searchStudentsSet(*it);
528 		assert(ss!=nullptr);
529 		total_number_of_students+=ss->numberOfStudents;
530 	}*/
531 	int total_number_of_students=numberOfStudents;
532 
533 	int totalduration;
534 	QList<int> durations;
535 	QList<bool> active;
536 	int nsplit=splitSpinBox->value();
537 
538 	totalduration=0;
539 	for(int i=0; i<nsplit; i++){
540 		durations.append(dur(i)->value());
541 		active.append(activ(i)->isChecked());
542 
543 		totalduration+=durations[i];
544 	}
545 
546 	if(nStudentsSpinBox->value()==-1){
547 		gt.rules.modifyActivity(this->_id, this->_activityGroupId, teachers_names, subject_name,
548 		 activity_tags_names,students_names, nsplit, totalduration, durations, active,
549 		 (nStudentsSpinBox->value()==-1), total_number_of_students);
550 	}
551 	else{
552 		gt.rules.modifyActivity(this->_id, this->_activityGroupId, teachers_names, subject_name,
553 		 activity_tags_names,students_names, nsplit, totalduration, durations, active,
554 		 (nStudentsSpinBox->value()==-1), nStudentsSpinBox->value());
555 	}
556 
557 	PlanningChanged::increasePlanningCommunicationSpinBox();
558 
559 	this->accept();
560 }
561 
clearTeachers()562 void ModifyActivityForm::clearTeachers()
563 {
564 	selectedTeachersListWidget->clear();
565 }
566 
clearStudents()567 void ModifyActivityForm::clearStudents()
568 {
569 	selectedStudentsListWidget->clear();
570 }
571 
clearActivityTags()572 void ModifyActivityForm::clearActivityTags()
573 {
574 	selectedActivityTagsListWidget->clear();
575 }
576 
help()577 void ModifyActivityForm::help()
578 {
579 	QString s;
580 
581 	s+=tr("Abbreviations in this dialog:");
582 	s+="\n\n";
583 	s+=tr("'Students' (the text near the spin box), means 'Number of students (-1 for automatic)'");
584 	s+="\n";
585 	s+=tr("'Split' means 'Is split into ... activities per week'. This value cannot be changed."
586 	 " If you need to modify it, please remove the corresponding activities and add a new split activity.");
587 	s+="\n";
588 	s+=tr("The 'Duration' spin box and the 'Active' check box refer to each component of current activity, you can change "
589 	 "them for each component, separately, by selecting the corresponding tab in the tab widget.");
590 	s+="\n";
591 	s+=tr("'Qualified' means that only the teachers who are qualified to teach the selected subject will be shown in the 'Teachers' list.",
592 	 "Qualified refers to teachers");
593 
594 	//show the message in a dialog
595 	QDialog dialog(this);
596 
597 	dialog.setWindowTitle(tr("FET - help on modifying activity(ies)"));
598 
599 	QVBoxLayout* vl=new QVBoxLayout(&dialog);
600 	QPlainTextEdit* te=new QPlainTextEdit();
601 	te->setPlainText(s);
602 	te->setReadOnly(true);
603 	QPushButton* pb=new QPushButton(tr("OK"));
604 
605 	QHBoxLayout* hl=new QHBoxLayout(0);
606 	hl->addStretch(1);
607 	hl->addWidget(pb);
608 
609 	vl->addWidget(te);
610 	vl->addLayout(hl);
611 	connect(pb, SIGNAL(clicked()), &dialog, SLOT(close()));
612 
613 	dialog.resize(600,470);
614 	centerWidgetOnScreen(&dialog);
615 
616 	setParentAndOtherThings(&dialog, this);
617 	dialog.exec();
618 }
619