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