void BuildingsForm::moveBuildingDown() { if(buildingsListWidget->count()<=1) return; int i=buildingsListWidget->currentRow(); if(i<0 || i>=buildingsListWidget->count()) return; if(i==buildingsListWidget->count()-1) return; QString s1=buildingsListWidget->item(i)->text(); QString s2=buildingsListWidget->item(i+1)->text(); Building* bu1=gt.rules.buildingsList.at(i); Building* bu2=gt.rules.buildingsList.at(i+1); gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); buildingsListWidget->item(i)->setText(s2); buildingsListWidget->item(i+1)->setText(s1); gt.rules.buildingsList[i]=bu2; gt.rules.buildingsList[i+1]=bu1; //Begin bug fix on 2017-08-29 Building* vb1=visibleBuildingsList[i]; Building* vb2=visibleBuildingsList[i+1]; visibleBuildingsList[i]=vb2; visibleBuildingsList[i+1]=vb1; //End bug fix buildingsListWidget->setCurrentRow(i+1); buildingChanged(i+1); }
void ModifyConstraintTeacherMaxBuildingChangesPerWeekForm::ok() { double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<100.0 || weight>100.0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight (percentage). It has to be 100")); return; } QString teacher_name=teachersComboBox->currentText(); int t=gt.rules.searchTeacher(teacher_name); if(t==-1){ QMessageBox::warning(this, tr("FET information"), tr("Invalid teacher")); return; } this->_ctr->weightPercentage=weight; this->_ctr->teacherName=teacher_name; this->_ctr->maxBuildingChangesPerWeek=maxChangesSpinBox->value(); gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }
void ModifyConstraintStudentsMaxDaysPerWeekForm::ok() { double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<0.0 || weight>100.0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight (percentage)")); return; } if(weight!=100.0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight (percentage) - it has to be 100%")); return; } int max_days=maxDaysSpinBox->value(); this->_ctr->weightPercentage=weight; this->_ctr->maxDaysPerWeek=max_days; gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }
void ModifyConstraintStudentsSetMaxHoursContinuouslyForm::ok() { if(studentsComboBox->currentIndex()<0){ showWarningCannotModifyConstraintInvisibleSubgroupConstraint(this, this->_ctr->students); return; } double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<0.0 || weight>100.0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight (percentage)")); return; } QString students_name=studentsComboBox->currentText(); StudentsSet* s=gt.rules.searchStudentsSet(students_name); if(s==NULL){ QMessageBox::warning(this, tr("FET information"), tr("Invalid students set")); return; } this->_ctr->weightPercentage=weight; this->_ctr->students=students_name; this->_ctr->maxHoursContinuously=maxHoursSpinBox->value(); gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }
void ModifyConstraintTeacherMaxHoursContinuouslyForm::ok() { double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<0.0 || weight>100.0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight (percentage)")); return; } int max_hours=maxHoursSpinBox->value(); QString teacher_name=teachersComboBox->currentText(); int teacher_ID=gt.rules.searchTeacher(teacher_name); if(teacher_ID<0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid teacher")); return; } this->_ctr->weightPercentage=weight; this->_ctr->maxHoursContinuously=max_hours; this->_ctr->teacherName=teacher_name; gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }
void ModifyConstraintStudentsSetMaxGapsPerDayForm::ok() { double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<0.0 || weight>100.0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight (percentage)")); return; } if(weight!=100.0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight (percentage) - it must be 100%")); return; } QString students_name=studentsComboBox->currentText(); StudentsSet* s=gt.rules.searchStudentsSet(students_name); if(s==NULL){ QMessageBox::warning(this, tr("FET information"), tr("Invalid students set")); return; } this->_ctr->weightPercentage=weight; this->_ctr->maxGaps=maxGapsSpinBox->value(); this->_ctr->students=students_name; gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }
void ModifyConstraintActivityEndsStudentsDayForm::ok() { double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<0.0 || weight>100.0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight (percentage)")); return; } if(weight!=100.0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight (percentage) - it must be 100%")); return; } int tmp2=activitiesComboBox->currentIndex(); assert(tmp2<gt.rules.activitiesList.size()); assert(tmp2<activitiesList.size()); if(tmp2<0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid activity")); return; } int id=activitiesList.at(tmp2); this->_ctr->weightPercentage=weight; this->_ctr->activityId=id; gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }
void SubjectsForm::moveSubjectDown() { if(subjectsListWidget->count()<=1) return; int i=subjectsListWidget->currentRow(); if(i<0 || i>=subjectsListWidget->count()) return; if(i==subjectsListWidget->count()-1) return; QString s1=subjectsListWidget->item(i)->text(); QString s2=subjectsListWidget->item(i+1)->text(); Subject* sbj1=gt.rules.subjectsList.at(i); Subject* sbj2=gt.rules.subjectsList.at(i+1); gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); subjectsListWidget->item(i)->setText(s2); subjectsListWidget->item(i+1)->setText(s1); gt.rules.subjectsList[i]=sbj2; gt.rules.subjectsList[i+1]=sbj1; subjectsListWidget->setCurrentRow(i+1); subjectChanged(i+1); }
void ModifyConstraintStudentsSetHomeRoomForm::ok() { double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<0.0 || weight>100){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight")); return; } QString students=studentsComboBox->currentText(); assert(gt.rules.searchStudentsSet(students)!=NULL); int i=roomsComboBox->currentIndex(); if(i<0 || roomsComboBox->count()<=0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid room")); return; } QString room=roomsComboBox->currentText(); this->_ctr->weightPercentage=weight; this->_ctr->roomName=room; this->_ctr->studentsName=students; gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }
void ModifyConstraintActivityPreferredRoomForm::ok() { double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<0.0 || weight>100){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight")); return; } int i=activitiesComboBox->currentIndex(); if(i<0 || activitiesComboBox->count()<=0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid activity")); return; } Activity* act=gt.rules.activitiesList.at(i); i=roomsComboBox->currentIndex(); if(i<0 || roomsComboBox->count()<=0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid room")); return; } QString room=roomsComboBox->currentText(); this->_ctr->weightPercentage=weight; this->_ctr->roomName=room; if(_ctr->activityId!=act->id){ int oldId=_ctr->activityId; int newId=act->id; QSet<ConstraintActivityPreferredRoom*> cs=gt.rules.aprHash.value(oldId, QSet<ConstraintActivityPreferredRoom*>()); assert(cs.contains(_ctr)); cs.remove(_ctr); gt.rules.aprHash.insert(oldId, cs); cs=gt.rules.aprHash.value(newId, QSet<ConstraintActivityPreferredRoom*>()); assert(!cs.contains(_ctr)); cs.insert(_ctr); gt.rules.aprHash.insert(newId, cs); this->_ctr->activityId=act->id; } this->_ctr->permanentlyLocked=permLockedCheckBox->isChecked(); gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); LockUnlock::computeLockedUnlockedActivitiesOnlySpace(); LockUnlock::increaseCommunicationSpinBox(); this->close(); }
void SubjectsForm::comments() { int ind=subjectsListWidget->currentRow(); if(ind<0){ QMessageBox::information(this, tr("FET information"), tr("Invalid selected subject")); return; } Subject* sbj=gt.rules.subjectsList[ind]; assert(sbj!=NULL); QDialog getCommentsDialog(this); getCommentsDialog.setWindowTitle(tr("Subject comments")); QPushButton* okPB=new QPushButton(tr("OK")); okPB->setDefault(true); QPushButton* cancelPB=new QPushButton(tr("Cancel")); connect(okPB, SIGNAL(clicked()), &getCommentsDialog, SLOT(accept())); connect(cancelPB, SIGNAL(clicked()), &getCommentsDialog, SLOT(reject())); QHBoxLayout* hl=new QHBoxLayout(); hl->addStretch(); hl->addWidget(okPB); hl->addWidget(cancelPB); QVBoxLayout* vl=new QVBoxLayout(); QPlainTextEdit* commentsPT=new QPlainTextEdit(); commentsPT->setPlainText(sbj->comments); commentsPT->selectAll(); commentsPT->setFocus(); vl->addWidget(commentsPT); vl->addLayout(hl); getCommentsDialog.setLayout(vl); const QString settingsName=QString("SubjectCommentsDialog"); getCommentsDialog.resize(500, 320); centerWidgetOnScreen(&getCommentsDialog); restoreFETDialogGeometry(&getCommentsDialog, settingsName); int t=getCommentsDialog.exec(); saveFETDialogGeometry(&getCommentsDialog, settingsName); if(t==QDialog::Accepted){ sbj->comments=commentsPT->toPlainText(); gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); subjectChanged(ind); } }
void ModifyConstraintTeacherIntervalMaxDaysPerWeekForm::ok() { double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<0.0 || weight>100.0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight (percentage)")); return; } if(weight!=100.0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight (percentage) - it has to be 100%")); return; } int max_days=maxDaysSpinBox->value(); QString teacher_name=teachersComboBox->currentText(); int teacher_ID=gt.rules.searchTeacher(teacher_name); if(teacher_ID<0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid teacher")); return; } int startHour=startHourComboBox->currentIndex(); int endHour=endHourComboBox->currentIndex(); if(startHour<0 || startHour>=gt.rules.nHoursPerDay){ QMessageBox::warning(this, tr("FET information"), tr("Start hour invalid")); return; } if(endHour<0 || endHour>gt.rules.nHoursPerDay){ QMessageBox::warning(this, tr("FET information"), tr("End hour invalid")); return; } if(endHour<=startHour){ QMessageBox::warning(this, tr("FET information"), tr("Start hour cannot be greater or equal than end hour")); return; } this->_ctr->weightPercentage=weight; this->_ctr->maxDaysPerWeek=max_days; this->_ctr->teacherName=teacher_name; this->_ctr->startHour=startHour; this->_ctr->endHour=endHour; gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }
void ModifyConstraintActivitiesMaxSimultaneousInSelectedTimeSlotsForm::ok() { double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<100.0 || weight>100.0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight (percentage). It has to be 100")); return; } this->_ctr->weightPercentage=weight; QList<int> days; QList<int> hours; for(int j=0; j<gt.rules.nDaysPerWeek; j++) for(int i=0; i<gt.rules.nHoursPerDay; i++) if(selectedTimesTable->item(i, j)->text()==YES){ days.append(j); hours.append(i); } this->_ctr->selectedDays=days; this->_ctr->selectedHours=hours; int maxSimultaneous=maxSimultaneousSpinBox->value(); if(maxSimultaneous==0){ QMessageBox::warning(this, tr("FET information"), tr("You specified max simultaneous activities to be 0. This is " "not perfect from efficiency point of view, because you can use instead constraint activity(ies) preferred time slots, " "and help FET to find a timetable easier and faster, with an equivalent result. Please correct.")); return; } this->_ctr->maxSimultaneous=maxSimultaneous; if(this->selectedActivitiesList.count()==0){ QMessageBox::warning(this, tr("FET information"), tr("Empty list of activities")); return; } //we allow even only one activity /*if(this->selectedActivitiesList.count()==1){ QMessageBox::warning(this, tr("FET information"), tr("Only one selected activity")); return; }*/ this->_ctr->activitiesIds=selectedActivitiesList; gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }
void ModifyConstraintActivityPreferredTimeSlotsForm::ok() { double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<0.0 || weight>100.0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight (percentage)")); return; } int i=activitiesComboBox->currentIndex(); assert(i<activitiesList.size()); if(i<0 || activitiesComboBox->count()<=0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid activity")); return; } int id=activitiesList.at(i); QList<int> days_L; QList<int> hours_L; //int days[MAX_N_CONSTRAINT_ACTIVITY_PREFERRED_TIME_SLOTS]; //int hours[MAX_N_CONSTRAINT_ACTIVITY_PREFERRED_TIME_SLOTS]; int n=0; for(int j=0; j<gt.rules.nDaysPerWeek; j++) for(i=0; i<gt.rules.nHoursPerDay; i++) if(preferredTimesTable->item(i, j)->text()==YES){ days_L.append(j); hours_L.append(i); n++; } if(n<=0){ int t=QMessageBox::question(this, tr("FET question"), tr("Warning: 0 slots selected. Are you sure?"), QMessageBox::Yes, QMessageBox::Cancel); if(t==QMessageBox::Cancel) return; } this->_ctr->weightPercentage=weight; this->_ctr->p_activityId=id; this->_ctr->p_nPreferredTimeSlots_L=n; this->_ctr->p_days_L=days_L; this->_ctr->p_hours_L=hours_L; gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }
void ModifyConstraintSubjectActivityTagPreferredRoomsForm::ok() { double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<0.0 || weight>100){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight")); return; } if(selectedRoomsListWidget->count()==0){ QMessageBox::warning(this, tr("FET information"), tr("Empty list of selected rooms")); return; } /*if(selectedRoomsListWidget->count()==1){ QMessageBox::warning(this, tr("FET information"), tr("Only one selected room - please use constraint subject activity tag preferred room if you want a single room")); return; }*/ if(subjectsComboBox->currentIndex()<0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid selected subject")); return; } QString subject=subjectsComboBox->currentText(); if(activityTagsComboBox->currentIndex()<0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid selected activity tag")); return; } QString activityTag=activityTagsComboBox->currentText(); QStringList roomsList; for(int i=0; i<selectedRoomsListWidget->count(); i++) roomsList.append(selectedRoomsListWidget->item(i)->text()); this->_ctr->weightPercentage=weight; this->_ctr->subjectName=subject; this->_ctr->activityTagName=activityTag; this->_ctr->roomsNames=roomsList; gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }
void ModifyConstraintTwoActivitiesConsecutiveForm::ok() { double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<0.0 || weight>100.0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight (percentage)")); return; } int tmp2=firstActivitiesComboBox->currentIndex(); assert(tmp2<gt.rules.activitiesList.size()); assert(tmp2<firstActivitiesList.size()); if(tmp2<0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid first activity")); return; } int fid=firstActivitiesList.at(tmp2); int tmp3=secondActivitiesComboBox->currentIndex(); assert(tmp3<gt.rules.activitiesList.size()); assert(tmp3<secondActivitiesList.size()); if(tmp3<0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid second activity")); return; } int sid=secondActivitiesList.at(tmp3); if(sid==fid){ QMessageBox::warning(this, tr("FET information"), tr("Same activities - impossible")); return; } this->_ctr->weightPercentage=weight; this->_ctr->firstActivityId=fid; this->_ctr->secondActivityId=sid; gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }
void ModifyConstraintSubjectActivityTagPreferredRoomForm::ok() { double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<0.0 || weight>100) { QMessageBox::warning(this, tr("FET information"), tr("Invalid weight")); return; } int i=subjectsComboBox->currentIndex(); if(i<0 || subjectsComboBox->count()<=0) { QMessageBox::warning(this, tr("FET information"), tr("Invalid subject")); return; } QString subject=subjectsComboBox->currentText(); i=activityTagsComboBox->currentIndex(); if(i<0 || activityTagsComboBox->count()<=0) { QMessageBox::warning(this, tr("FET information"), tr("Invalid activity tag")); return; } QString activityTag=activityTagsComboBox->currentText(); i=roomsComboBox->currentIndex(); if(i<0 || roomsComboBox->count()<=0) { QMessageBox::warning(this, tr("FET information"), tr("Invalid room")); return; } QString room=roomsComboBox->currentText(); this->_ctr->weightPercentage=weight; this->_ctr->roomName=room; this->_ctr->subjectName=subject; this->_ctr->activityTagName=activityTag; gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }
void ModifyGroupActivitiesInInitialOrderItemForm::ok() { if(this->selectedActivitiesList.size()==0){ QMessageBox::warning(this, tr("FET information"), tr("Empty list of selected activities")); return; } if(this->selectedActivitiesList.size()==1){ QMessageBox::warning(this, tr("FET information"), tr("Only one selected activity")); return; } QList<int> ids=selectedActivitiesList; /* QSet<int> used; foreach(const GroupActivitiesInInitialOrderItem& item, gt.rules.groupActivitiesInInitialOrderList){ if(&item!=_item){ foreach(int id, item.ids){ assert(!used.contains(id)); used.insert(id); } } } foreach(int id, ids) if(used.contains(id)){ QMessageBox::warning(this, tr("FET information"), tr("Activity id %1 is already used in another 'group activities in initial order' item." " Each activity id must appear at most once in all items.").arg(id)); return; } */ _item->ids=ids; gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }
void ModifyConstraintTeacherHomeRoomsForm::ok() { double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<0.0 || weight>100){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight")); return; } if(selectedRoomsListWidget->count()==0){ QMessageBox::warning(this, tr("FET information"), tr("Empty list of selected rooms")); return; } /*if(selectedRoomsListWidget->count()==1){ QMessageBox::warning(this, tr("FET information"), tr("Only one selected room - please use constraint teacher home room if you want a single room")); return; }*/ QString teacher=teachersComboBox->currentText(); assert(gt.rules.searchTeacher(teacher)>=0); QStringList roomsList; for(int i=0; i<selectedRoomsListWidget->count(); i++) roomsList.append(selectedRoomsListWidget->item(i)->text()); this->_ctr->weightPercentage=weight; this->_ctr->teacherName=teacher; this->_ctr->roomsNames=roomsList; gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }
void ModifyConstraintRoomNotAvailableTimesForm::ok() { double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<=0.0 || weight>100){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight")); return; } int i=roomsComboBox->currentIndex(); if(i<0 || roomsComboBox->count()<=0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid room")); return; } Room* room=gt.rules.roomsList.at(i); this->_ctr->weightPercentage=weight; this->_ctr->room=room->name; QList<int> days; QList<int> hours; for(int j=0; j<gt.rules.nDaysPerWeek; j++) for(int i=0; i<gt.rules.nHoursPerDay; i++) if(notAllowedTimesTable->item(i, j)->text()==YES){ days.append(j); hours.append(i); } this->_ctr->days=days; this->_ctr->hours=hours; gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }
void ModifyConstraintActivitiesNotOverlappingForm::ok() { double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<0.0 || weight>100.0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight (percentage)")); return; } if(this->notOverlappingActivitiesList.count()==0){ QMessageBox::warning(this, tr("FET information"), tr("Empty list of not overlapping activities")); return; } if(this->notOverlappingActivitiesList.count()==1){ QMessageBox::warning(this, tr("FET information"), tr("Only one selected activity")); return; } int i; QList<int>::iterator it; this->_ctr->activitiesId.clear(); for(i=0, it=this->notOverlappingActivitiesList.begin(); it!=this->notOverlappingActivitiesList.end(); it++, i++){ this->_ctr->activitiesId.append(*it); } this->_ctr->n_activities=i; this->_ctr->weightPercentage=weight; gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }
void ModifyConstraintStudentsSetActivityTagMaxHoursDailyForm::ok() { double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<0.0 || weight>100.0){ QMessageBox::warning(this, tr("FET warning"), tr("Invalid weight (percentage)")); return; } QString students_name=studentsComboBox->currentText(); StudentsSet* s=gt.rules.searchStudentsSet(students_name); if(s==NULL){ QMessageBox::warning(this, tr("FET warning"), tr("Invalid students set")); return; } QString activityTagName=activityTagsComboBox->currentText(); int ati=gt.rules.searchActivityTag(activityTagName); if(ati<0){ QMessageBox::warning(this, tr("FET warning"), tr("Invalid activity tag")); return; } this->_ctr->weightPercentage=weight; this->_ctr->students=students_name; this->_ctr->activityTagName=activityTagName; this->_ctr->maxHoursDaily=maxHoursSpinBox->value(); gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }
void ModifyConstraintBasicCompulsorySpaceForm::ok() { double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<0.0 || weight>100){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight")); return; } if(weight!=100.0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight (percentage) - it has to be 100%")); return; } this->_ctr->weightPercentage=weight; gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }
void ModifyConstraintTeacherNotAvailableTimesForm::ok() { double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<100.0 || weight>100.0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight (percentage). It has to be 100")); return; } QString teacher_name=teachersComboBox->currentText(); int teacher_ID=gt.rules.searchTeacher(teacher_name); if(teacher_ID<0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid teacher")); return; } foreach(TimeConstraint* c, gt.rules.timeConstraintsList) if(c!=this->_ctr && c->type==CONSTRAINT_TEACHER_NOT_AVAILABLE_TIMES){ ConstraintTeacherNotAvailableTimes* cc=(ConstraintTeacherNotAvailableTimes*)c; if(cc->teacher==teacher_name){ QMessageBox::warning(this, tr("FET information"), tr("A constraint of this type exists for the same teacher - cannot proceed")); return; } } this->_ctr->weightPercentage=weight; if(_ctr->teacher!=teacher_name){ QString oldName=_ctr->teacher; QString newName=teacher_name; QSet<ConstraintTeacherNotAvailableTimes*> cs=gt.rules.tnatHash.value(oldName, QSet<ConstraintTeacherNotAvailableTimes*>()); assert(cs.contains(_ctr)); cs.remove(_ctr); gt.rules.tnatHash.insert(oldName, cs); cs=gt.rules.tnatHash.value(newName, QSet<ConstraintTeacherNotAvailableTimes*>()); assert(!cs.contains(_ctr)); cs.insert(_ctr); gt.rules.tnatHash.insert(newName, cs); this->_ctr->teacher=teacher_name; } QList<int> days; QList<int> hours; for(int j=0; j<gt.rules.nDaysPerWeek; j++) for(int i=0; i<gt.rules.nHoursPerDay; i++) if(notAllowedTimesTable->item(i, j)->text()==YES){ days.append(j); hours.append(i); } this->_ctr->days=days; this->_ctr->hours=hours; gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }
void ModifyConstraintSubactivitiesPreferredStartingTimesForm::ok() { if(studentsComboBox->currentIndex()<0){ showWarningCannotModifyConstraintInvisibleSubgroupConstraint(this, this->_ctr->studentsName); return; } double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<0.0 || weight>100.0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight (percentage)")); return; } QString teacher=teachersComboBox->currentText(); if(teacher!="") assert(gt.rules.searchTeacher(teacher)>=0); QString students=studentsComboBox->currentText(); if(students!="") assert(gt.rules.searchStudentsSet(students)!=NULL); QString subject=subjectsComboBox->currentText(); if(subject!="") assert(gt.rules.searchSubject(subject)>=0); QString activityTag=activityTagsComboBox->currentText(); if(activityTag!="") assert(gt.rules.searchActivityTag(activityTag)>=0); QList<int> days_L; QList<int> hours_L; //int days[MAX_N_CONSTRAINT_SUBACTIVITIES_PREFERRED_STARTING_TIMES]; //int hours[MAX_N_CONSTRAINT_SUBACTIVITIES_PREFERRED_STARTING_TIMES]; int n=0; for(int j=0; j<gt.rules.nDaysPerWeek; j++) for(int i=0; i<gt.rules.nHoursPerDay; i++) if(preferredTimesTable->item(i, j)->text()==YES){ days_L.append(j); hours_L.append(i); n++; } if(n<=0){ int t=QMessageBox::question(this, tr("FET question"), tr("Warning: 0 slots selected. Are you sure?"), QMessageBox::Yes, QMessageBox::Cancel); if(t==QMessageBox::Cancel) return; } this->_ctr->weightPercentage=weight; this->_ctr->componentNumber=componentNumberSpinBox->value(); this->_ctr->teacherName=teacher; this->_ctr->studentsName=students; this->_ctr->subjectName=subject; this->_ctr->activityTagName=activityTag; this->_ctr->nPreferredStartingTimes_L=n; this->_ctr->days_L=days_L; this->_ctr->hours_L=hours_L; gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }
void ModifyConstraintActivitiesPreferredStartingTimesForm::ok() { int duration=-1; if(durationCheckBox->isChecked()){ assert(durationSpinBox->isEnabled()); duration=durationSpinBox->value(); } if(studentsComboBox->currentIndex()<0){ showWarningCannotModifyConstraintInvisibleSubgroupConstraint(this, this->_ctr->studentsName); return; } double weight; QString tmp=weightLineEdit->text(); weight_sscanf(tmp, "%lf", &weight); if(weight<0.0 || weight>100.0){ QMessageBox::warning(this, tr("FET information"), tr("Invalid weight (percentage)")); return; } QString teacher=teachersComboBox->currentText(); if(teacher!="") assert(gt.rules.searchTeacher(teacher)>=0); QString students=studentsComboBox->currentText(); if(students!="") assert(gt.rules.searchStudentsSet(students)!=NULL); QString subject=subjectsComboBox->currentText(); if(subject!="") assert(gt.rules.searchSubject(subject)>=0); QString activityTag=activityTagsComboBox->currentText(); if(activityTag!="") assert(gt.rules.searchActivityTag(activityTag)>=0); if(duration==-1 && teacher=="" && students=="" && subject=="" && activityTag==""){ int t=QMessageBox::question(this, tr("FET question"), tr("You specified all the activities. This might be a small problem: if you specify" " a not allowed slot between two allowed slots, this not allowed slot will" " be counted as a gap in the teachers' and students' timetable.\n\n" " The best practice would be to use constraint break times.\n\n" " If you need weight under 100%, then you can use this constraint, but be careful" " not to obtain an impossible timetable (if your teachers/students are constrained on gaps" " or early gaps and if you leave a not allowed slot between 2 allowed slots or" " a not allowed slot early in the day and more allowed slots after it," " this possible gap might be counted in teachers' and students' timetable)") +"\n\n"+tr("Do you want to add current constraint?"), QMessageBox::Yes, QMessageBox::Cancel); if(t==QMessageBox::Cancel) return; } if(duration==-1 && teacher!="" && students=="" && subject=="" && activityTag==""){ int t=QMessageBox::question(this, tr("FET question"), tr("You specified only the teacher. This might be a small problem: if you specify" " a not allowed slot between two allowed slots, this not allowed slot will" " be counted as a gap in the teacher's timetable.\n\n" " The best practice would be to use constraint teacher not available times.\n\n" " If you need weight under 100%, then you can use this constraint, but be careful" " not to obtain an impossible timetable (if your teacher is constrained on gaps" " and if you leave a not allowed slot between 2 allowed slots, this possible" " gap might be counted in teacher's timetable)") +"\n\n"+tr("Do you want to add current constraint?"), QMessageBox::Yes, QMessageBox::Cancel); if(t==QMessageBox::Cancel) return; } if(duration==-1 && teacher=="" && students!="" && subject=="" && activityTag==""){ int t=QMessageBox::question(this, tr("FET question"), tr("You specified only the students set. This might be a small problem: if you specify" " a not allowed slot between two allowed slots (or a not allowed slot before allowed slots)," " this not allowed slot will" " be counted as a gap (or early gap) in the students' timetable.\n\n" " The best practice would be to use constraint students set not available times.\n\n" " If you need weight under 100%, then you can use this constraint, but be careful" " not to obtain an impossible timetable (if your students set is constrained on gaps or early gaps" " and if you leave a not allowed slot between 2 allowed slots (or a not allowed slot before allowed slots), this possible" " gap might be counted in students' timetable)") +"\n\n"+tr("Do you want to add current constraint?"), QMessageBox::Yes, QMessageBox::Cancel); if(t==QMessageBox::Cancel) return; } QList<int> days_L; QList<int> hours_L; //int days[MAX_N_CONSTRAINT_ACTIVITIES_PREFERRED_STARTING_TIMES]; //int hours[MAX_N_CONSTRAINT_ACTIVITIES_PREFERRED_STARTING_TIMES]; int n=0; for(int j=0; j<gt.rules.nDaysPerWeek; j++) for(int i=0; i<gt.rules.nHoursPerDay; i++) if(preferredTimesTable->item(i, j)->text()==YES){ days_L.append(j); hours_L.append(i); n++; } if(n<=0){ int t=QMessageBox::question(this, tr("FET question"), tr("Warning: 0 slots selected. Are you sure?"), QMessageBox::Yes, QMessageBox::Cancel); if(t==QMessageBox::Cancel) return; } this->_ctr->weightPercentage=weight; this->_ctr->teacherName=teacher; this->_ctr->studentsName=students; this->_ctr->subjectName=subject; this->_ctr->activityTagName=activityTag; this->_ctr->nPreferredStartingTimes_L=n; this->_ctr->days_L=days_L; this->_ctr->hours_L=hours_L; this->_ctr->duration=duration; gt.rules.internalStructureComputed=false; setRulesModifiedAndOtherThings(>.rules); this->close(); }