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