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