1 /***************************************************************************
2 constraintteachermaxgapsperweekforrealdaysform.cpp - description
3 -------------------
4 begin : 2020
5 copyright : (C) 2020 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 "helponimperfectconstraints.h"
21
22 #include "longtextmessagebox.h"
23
24 #include "constraintteachermaxgapsperweekforrealdaysform.h"
25 #include "addconstraintteachermaxgapsperweekforrealdaysform.h"
26 #include "modifyconstraintteachermaxgapsperweekforrealdaysform.h"
27
28 #include <QListWidget>
29 #include <QScrollBar>
30 #include <QAbstractItemView>
31
ConstraintTeacherMaxGapsPerWeekForRealDaysForm(QWidget * parent)32 ConstraintTeacherMaxGapsPerWeekForRealDaysForm::ConstraintTeacherMaxGapsPerWeekForRealDaysForm(QWidget* parent): QDialog(parent)
33 {
34 setupUi(this);
35
36 currentConstraintTextEdit->setReadOnly(true);
37
38 modifyConstraintPushButton->setDefault(true);
39
40 constraintsListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
41
42 connect(constraintsListWidget, SIGNAL(currentRowChanged(int)), this, SLOT(constraintChanged(int)));
43 connect(addConstraintPushButton, SIGNAL(clicked()), this, SLOT(addConstraint()));
44 connect(closePushButton, SIGNAL(clicked()), this, SLOT(close()));
45 connect(removeConstraintPushButton, SIGNAL(clicked()), this, SLOT(removeConstraint()));
46 connect(modifyConstraintPushButton, SIGNAL(clicked()), this, SLOT(modifyConstraint()));
47 connect(constraintsListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(modifyConstraint()));
48 connect(helpPushButton, SIGNAL(clicked()), this, SLOT(help()));
49
50 centerWidgetOnScreen(this);
51 restoreFETDialogGeometry(this);
52
53 QSize tmp1=teachersComboBox->minimumSizeHint();
54 Q_UNUSED(tmp1);
55
56 teachersComboBox->addItem("");
57 for(int i=0; i<gt.rules.teachersList.size(); i++){
58 Teacher* tch=gt.rules.teachersList[i];
59 teachersComboBox->addItem(tch->name);
60 }
61
62 this->filterChanged();
63
64 connect(teachersComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterChanged()));
65 }
66
~ConstraintTeacherMaxGapsPerWeekForRealDaysForm()67 ConstraintTeacherMaxGapsPerWeekForRealDaysForm::~ConstraintTeacherMaxGapsPerWeekForRealDaysForm()
68 {
69 saveFETDialogGeometry(this);
70 }
71
filterOk(TimeConstraint * ctr)72 bool ConstraintTeacherMaxGapsPerWeekForRealDaysForm::filterOk(TimeConstraint* ctr)
73 {
74 if(ctr->type==CONSTRAINT_TEACHER_MAX_GAPS_PER_WEEK_FOR_REAL_DAYS){
75 ConstraintTeacherMaxGapsPerWeekForRealDays* ctna=(ConstraintTeacherMaxGapsPerWeekForRealDays*) ctr;
76 return ctna->teacherName==teachersComboBox->currentText() || teachersComboBox->currentText()=="";
77 }
78 else
79 return false;
80 }
81
filterChanged()82 void ConstraintTeacherMaxGapsPerWeekForRealDaysForm::filterChanged()
83 {
84 this->visibleConstraintsList.clear();
85 constraintsListWidget->clear();
86 for(int i=0; i<gt.rules.timeConstraintsList.size(); i++){
87 TimeConstraint* ctr=gt.rules.timeConstraintsList[i];
88 if(filterOk(ctr)){
89 visibleConstraintsList.append(ctr);
90 constraintsListWidget->addItem(ctr->getDescription(gt.rules));
91 }
92 }
93
94 if(constraintsListWidget->count()>0)
95 constraintsListWidget->setCurrentRow(0);
96 else
97 constraintChanged(-1);
98 }
99
constraintChanged(int index)100 void ConstraintTeacherMaxGapsPerWeekForRealDaysForm::constraintChanged(int index)
101 {
102 if(index<0){
103 currentConstraintTextEdit->setPlainText("");
104 return;
105 }
106 assert(index<this->visibleConstraintsList.size());
107 TimeConstraint* ctr=this->visibleConstraintsList.at(index);
108 assert(ctr!=nullptr);
109 currentConstraintTextEdit->setPlainText(ctr->getDetailedDescription(gt.rules));
110 }
111
addConstraint()112 void ConstraintTeacherMaxGapsPerWeekForRealDaysForm::addConstraint()
113 {
114 AddConstraintTeacherMaxGapsPerWeekForRealDaysForm form(this);
115 setParentAndOtherThings(&form, this);
116 form.exec();
117
118 filterChanged();
119
120 constraintsListWidget->setCurrentRow(constraintsListWidget->count()-1);
121 }
122
modifyConstraint()123 void ConstraintTeacherMaxGapsPerWeekForRealDaysForm::modifyConstraint()
124 {
125 int valv=constraintsListWidget->verticalScrollBar()->value();
126 int valh=constraintsListWidget->horizontalScrollBar()->value();
127
128 int i=constraintsListWidget->currentRow();
129 if(i<0){
130 QMessageBox::information(this, tr("FET information"), tr("Invalid selected constraint"));
131 return;
132 }
133 TimeConstraint* ctr=this->visibleConstraintsList.at(i);
134
135 ModifyConstraintTeacherMaxGapsPerWeekForRealDaysForm form(this, (ConstraintTeacherMaxGapsPerWeekForRealDays*)ctr);
136 setParentAndOtherThings(&form, this);
137 form.exec();
138
139 filterChanged();
140
141 constraintsListWidget->verticalScrollBar()->setValue(valv);
142 constraintsListWidget->horizontalScrollBar()->setValue(valh);
143
144 if(i>=constraintsListWidget->count())
145 i=constraintsListWidget->count()-1;
146
147 if(i>=0)
148 constraintsListWidget->setCurrentRow(i);
149 else
150 this->constraintChanged(-1);
151 }
152
removeConstraint()153 void ConstraintTeacherMaxGapsPerWeekForRealDaysForm::removeConstraint()
154 {
155 int i=constraintsListWidget->currentRow();
156 if(i<0){
157 QMessageBox::information(this, tr("FET information"), tr("Invalid selected constraint"));
158 return;
159 }
160 TimeConstraint* ctr=this->visibleConstraintsList.at(i);
161 QString s;
162 s=tr("Remove constraint?");
163 s+="\n\n";
164 s+=ctr->getDetailedDescription(gt.rules);
165
166 QListWidgetItem* item;
167
168 switch( LongTextMessageBox::confirmation( this, tr("FET confirmation"),
169 s, tr("Yes"), tr("No"), 0, 0, 1 ) ){
170 case 0: // The user clicked the OK button or pressed Enter
171 gt.rules.removeTimeConstraint(ctr);
172
173 visibleConstraintsList.removeAt(i);
174 constraintsListWidget->setCurrentRow(-1);
175 item=constraintsListWidget->takeItem(i);
176 delete item;
177
178 break;
179 case 1: // The user clicked the Cancel button or pressed Escape
180 break;
181 }
182
183 if(i>=constraintsListWidget->count())
184 i=constraintsListWidget->count()-1;
185 if(i>=0)
186 constraintsListWidget->setCurrentRow(i);
187 else
188 this->constraintChanged(-1);
189 }
190
help()191 void ConstraintTeacherMaxGapsPerWeekForRealDaysForm::help()
192 {
193 HelpOnImperfectConstraints::help(this);
194 }
195