1 /*
2 File lockunlock.cpp
3 */
4 
5 /***************************************************************************
6                                 FET
7                           -------------------
8    copyright            : (C) by Lalescu Liviu
9     email                : Please see https://lalescu.ro/liviu/ for details about contacting Liviu Lalescu (in particular, you can find here the e-mail address)
10  ***************************************************************************
11                           lockunlock.cpp  -  description
12                              -------------------
13     begin                : Dec 2008
14     copyright            : (C) by Liviu Lalescu (https://lalescu.ro/liviu/) and Volker Dirr (https://www.timetabling.de/)
15  ***************************************************************************
16  *                                                                         *
17  *   This program is free software: you can redistribute it and/or modify  *
18  *   it under the terms of the GNU Affero General Public License as        *
19  *   published by the Free Software Foundation, either version 3 of the    *
20  *   License, or (at your option) any later version.                       *
21  *                                                                         *
22  ***************************************************************************/
23 
24 //#include <QSpinBox>
25 
26 //extern QSpinBox* pcommunicationSpinBox;
27 
28 #include "lockunlock.h"
29 #include "timetable_defs.h"
30 #include "timetable.h"
31 #include "solution.h"
32 
33 //extern bool students_schedule_ready;
34 //extern bool teachers_schedule_ready;
35 //extern bool rooms_schedule_ready;
36 
37 //extern Solution best_solution;
38 
39 extern Timetable gt;
40 
41 QSet<int> idsOfLockedTime;
42 QSet<int> idsOfLockedSpace;
43 QSet<int> idsOfPermanentlyLockedTime;
44 QSet<int> idsOfPermanentlyLockedSpace;
45 
46 CommunicationSpinBox communicationSpinBox;
47 
48 
CommunicationSpinBox()49 CommunicationSpinBox::CommunicationSpinBox()
50 {
51 	minValue=0;
52 	maxValue=9;
53 	value=0;
54 }
55 
~CommunicationSpinBox()56 CommunicationSpinBox::~CommunicationSpinBox()
57 {
58 }
59 
increaseValue()60 void CommunicationSpinBox::increaseValue()
61 {
62 	assert(maxValue>minValue);
63 	assert(value>=minValue && value<=maxValue);
64 	value++;
65 	if(value>maxValue)
66 		value=minValue;
67 
68 	//cout<<"comm. spin box: increased value, crt value=="<<value<<endl;
69 
70 	emit(valueChanged(value));
71 }
72 
73 
computeLockedUnlockedActivitiesTimeSpace()74 void LockUnlock::computeLockedUnlockedActivitiesTimeSpace()
75 {
76 	//by Volker Dirr
77 	idsOfLockedTime.clear();
78 	idsOfLockedSpace.clear();
79 	idsOfPermanentlyLockedTime.clear();
80 	idsOfPermanentlyLockedSpace.clear();
81 
82 	QSet<QString> virtualRooms;
83 	for(Room* rm : qAsConst(gt.rules.roomsList))
84 		if(rm->isVirtual==true)
85 			virtualRooms.insert(rm->name);
86 
87 	for(TimeConstraint* tc : qAsConst(gt.rules.timeConstraintsList)){
88 		if(tc->type==CONSTRAINT_ACTIVITY_PREFERRED_STARTING_TIME && tc->weightPercentage==100.0 && tc->active){
89 			ConstraintActivityPreferredStartingTime* c=(ConstraintActivityPreferredStartingTime*) tc;
90 			if(c->day >= 0  &&  c->hour >= 0) {
91 				if(c->permanentlyLocked)
92 					idsOfPermanentlyLockedTime.insert(c->activityId);
93 				else
94 					idsOfLockedTime.insert(c->activityId);
95 			}
96 		}
97 	}
98 
99 	for(SpaceConstraint* sc : qAsConst(gt.rules.spaceConstraintsList)){
100 		if(sc->type==CONSTRAINT_ACTIVITY_PREFERRED_ROOM && sc->weightPercentage==100.0 && sc->active){
101 			ConstraintActivityPreferredRoom* c=(ConstraintActivityPreferredRoom*) sc;
102 
103 			if(!virtualRooms.contains(c->roomName) || (virtualRooms.contains(c->roomName) && !c->preferredRealRoomsNames.isEmpty())){
104 				if(c->permanentlyLocked){
105 					idsOfPermanentlyLockedSpace.insert(c->activityId);
106 				}
107 				else{
108 					idsOfLockedSpace.insert(c->activityId);
109 				}
110 			}
111 		}
112 	}
113 }
114 
computeLockedUnlockedActivitiesOnlyTime()115 void LockUnlock::computeLockedUnlockedActivitiesOnlyTime()
116 {
117 	//by Volker Dirr
118 	idsOfLockedTime.clear();
119 	idsOfPermanentlyLockedTime.clear();
120 
121 	for(TimeConstraint* tc : qAsConst(gt.rules.timeConstraintsList)){
122 		if(tc->type==CONSTRAINT_ACTIVITY_PREFERRED_STARTING_TIME && tc->weightPercentage==100.0 && tc->active){
123 			ConstraintActivityPreferredStartingTime* c=(ConstraintActivityPreferredStartingTime*) tc;
124 			if(c->day >= 0  &&  c->hour >= 0) {
125 				if(c->permanentlyLocked)
126 					idsOfPermanentlyLockedTime.insert(c->activityId);
127 				else
128 					idsOfLockedTime.insert(c->activityId);
129 			}
130 		}
131 	}
132 }
133 
computeLockedUnlockedActivitiesOnlySpace()134 void LockUnlock::computeLockedUnlockedActivitiesOnlySpace()
135 {
136 	//by Volker Dirr
137 	idsOfLockedSpace.clear();
138 	idsOfPermanentlyLockedSpace.clear();
139 
140 	QSet<QString> virtualRooms;
141 	for(Room* rm : qAsConst(gt.rules.roomsList))
142 		if(rm->isVirtual==true)
143 			virtualRooms.insert(rm->name);
144 
145 	for(SpaceConstraint* sc : qAsConst(gt.rules.spaceConstraintsList)){
146 		if(sc->type==CONSTRAINT_ACTIVITY_PREFERRED_ROOM && sc->weightPercentage==100.0 && sc->active){
147 			ConstraintActivityPreferredRoom* c=(ConstraintActivityPreferredRoom*) sc;
148 			if(!virtualRooms.contains(c->roomName) || (virtualRooms.contains(c->roomName) && !c->preferredRealRoomsNames.isEmpty())){
149 				if(c->permanentlyLocked){
150 					idsOfPermanentlyLockedSpace.insert(c->activityId);
151 				}
152 				else{
153 					idsOfLockedSpace.insert(c->activityId);
154 				}
155 			}
156 		}
157 	}
158 }
159 
increaseCommunicationSpinBox()160 void LockUnlock::increaseCommunicationSpinBox()
161 {
162 /*	assert(pcommunicationSpinBox!=nullptr);
163 
164 	int q=pcommunicationSpinBox->value();	//needed to display locked and unlocked times and rooms
165 	//cout<<"communication spin box old value: "<<pcommunicationSpinBox->value()<<", ";
166 	q++;
167 	assert(pcommunicationSpinBox->maximum()>pcommunicationSpinBox->minimum());
168 	if(q > pcommunicationSpinBox->maximum())
169 		q=pcommunicationSpinBox->minimum();
170 	pcommunicationSpinBox->setValue(q);*/
171 	//cout<<"changed to new value: "<<pcommunicationSpinBox->value()<<endl;
172 
173 	communicationSpinBox.increaseValue();
174 }
175