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