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