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