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(>.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