Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/utils/gui/div/GUISelectedStorage.cpp
169684 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.
4
// This program and the accompanying materials are made available under the
5
// terms of the Eclipse Public License 2.0 which is available at
6
// https://www.eclipse.org/legal/epl-2.0/
7
// This Source Code may also be made available under the following Secondary
8
// Licenses when the conditions for such availability set forth in the Eclipse
9
// Public License 2.0 are satisfied: GNU General Public License, version 2
10
// or later which is available at
11
// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13
/****************************************************************************/
14
/// @file GUISelectedStorage.cpp
15
/// @author Daniel Krajzewicz
16
/// @author Jakob Erdmann
17
/// @author Michael Behrisch
18
/// @date Jun 2004
19
///
20
// Storage for "selected" objects
21
/****************************************************************************/
22
#include <config.h>
23
24
#include <algorithm>
25
#include <utils/gui/globjects/GUIGlObject.h>
26
#include <utils/gui/globjects/GUIGlObjectStorage.h>
27
#include <utils/iodevices/OutputDevice.h>
28
#include <utils/common/ToString.h>
29
30
#include "GUISelectedStorage.h"
31
#include "GUIDialog_GLChosenEditor.h"
32
33
34
// ===========================================================================
35
// member method definitions
36
// ===========================================================================
37
38
/* -------------------------------------------------------------------------
39
* for GUISelectedStorage::SingleTypeSelections
40
* ----------------------------------------------------------------------- */
41
42
GUISelectedStorage::SingleTypeSelections::SingleTypeSelections() {}
43
44
45
GUISelectedStorage::SingleTypeSelections::~SingleTypeSelections() {}
46
47
48
bool
49
GUISelectedStorage::SingleTypeSelections::isSelected(GUIGlID id) {
50
return mySelected.count(id) > 0;
51
}
52
53
54
void
55
GUISelectedStorage::SingleTypeSelections::select(GUIGlID id) {
56
mySelected.insert(id);
57
}
58
59
60
void
61
GUISelectedStorage::SingleTypeSelections::deselect(GUIGlID id) {
62
mySelected.erase(id);
63
}
64
65
66
void
67
GUISelectedStorage::SingleTypeSelections::clear() {
68
mySelected.clear();
69
}
70
71
72
void
73
GUISelectedStorage::SingleTypeSelections::save(const std::string& filename) {
74
GUISelectedStorage::save(filename, mySelected);
75
}
76
77
78
const std::unordered_set<GUIGlID>&
79
GUISelectedStorage::SingleTypeSelections::getSelected() const {
80
return mySelected;
81
}
82
83
/* -------------------------------------------------------------------------
84
* for GUISelectedStorage
85
* ----------------------------------------------------------------------- */
86
87
GUISelectedStorage::GUISelectedStorage() {}
88
89
90
GUISelectedStorage::~GUISelectedStorage() {}
91
92
93
bool
94
GUISelectedStorage::isSelected(GUIGlObjectType type, GUIGlID id) {
95
switch (type) {
96
case GLO_NETWORK:
97
return false;
98
default:
99
return mySelections[type].isSelected(id);
100
}
101
}
102
103
bool
104
GUISelectedStorage::isSelected(const GUIGlObject* o) {
105
if (o == nullptr) {
106
return false;
107
} else {
108
return isSelected(o->getType(), o->getGlID());
109
}
110
}
111
112
void
113
GUISelectedStorage::select(GUIGlID id, bool update) {
114
GUIGlObject* object = GUIGlObjectStorage::gIDStorage.getObjectBlocking(id);
115
if (!object) {
116
throw ProcessError("Unknown object in GUISelectedStorage::select (id=" + toString(id) + ").");
117
}
118
GUIGlObjectType type = object->getType();
119
GUIGlObjectStorage::gIDStorage.unblockObject(id);
120
121
mySelections[type].select(id);
122
myAllSelected.insert(id);
123
if (update && myUpdateTarget) {
124
myUpdateTarget->selectionUpdated();
125
}
126
}
127
128
129
void
130
GUISelectedStorage::deselect(GUIGlID id) {
131
GUIGlObject* object = GUIGlObjectStorage::gIDStorage.getObjectBlocking(id);
132
if (!object) {
133
throw ProcessError("Unknown object in GUISelectedStorage::deselect (id=" + toString(id) + ").");
134
}
135
GUIGlObjectType type = object->getType();
136
GUIGlObjectStorage::gIDStorage.unblockObject(id);
137
138
mySelections[type].deselect(id);
139
myAllSelected.erase(id);
140
if (myUpdateTarget) {
141
myUpdateTarget->selectionUpdated();
142
}
143
}
144
145
146
void
147
GUISelectedStorage::deselect(GUIGlObjectType type, GUIGlID id) {
148
mySelections[type].deselect(id);
149
myAllSelected.erase(id);
150
}
151
152
153
void
154
GUISelectedStorage::toggleSelection(GUIGlID id) {
155
GUIGlObject* object = GUIGlObjectStorage::gIDStorage.getObjectBlocking(id);
156
if (!object) {
157
throw ProcessError("Unknown object in GUISelectedStorage::toggleSelection (id=" + toString(id) + ").");
158
}
159
160
bool selected = isSelected(object->getType(), id);
161
if (!selected) {
162
select(id);
163
} else {
164
deselect(id);
165
}
166
GUIGlObjectStorage::gIDStorage.unblockObject(id);
167
}
168
169
170
const std::unordered_set<GUIGlID>&
171
GUISelectedStorage::getSelected() const {
172
return myAllSelected;
173
}
174
175
176
const std::unordered_set<GUIGlID>&
177
GUISelectedStorage::getSelected(GUIGlObjectType type) {
178
return mySelections[type].getSelected();
179
}
180
181
182
void
183
GUISelectedStorage::clear() {
184
for (auto& selection : mySelections) {
185
selection.second.clear();
186
}
187
myAllSelected.clear();
188
if (myUpdateTarget) {
189
myUpdateTarget->selectionUpdated();
190
}
191
}
192
193
194
void
195
GUISelectedStorage::notifyChanged() {
196
if (myUpdateTarget) {
197
myUpdateTarget->selectionUpdated();
198
}
199
}
200
201
202
std::set<GUIGlID>
203
GUISelectedStorage::loadIDs(std::istream& strm, std::string& msgOut, GUIGlObjectType type, std::ostream* dynamicNotFound, int maxErrors) {
204
std::set<GUIGlID> result;
205
std::ostringstream msg;
206
int numIgnored = 0;
207
int numMissing = 0;
208
while (strm.good()) {
209
std::string line;
210
strm >> line;
211
if (line.length() == 0) {
212
continue;
213
}
214
if (StringUtils::startsWith(line, "node:")) {
215
line = StringUtils::replace(line, "node:", "junction:");
216
}
217
218
GUIGlObject* object = GUIGlObjectStorage::gIDStorage.getObjectBlocking(line);
219
if (object) {
220
if (type != GLO_MAX && (object->getType() != type)) {
221
numIgnored++;
222
if (numIgnored + numMissing <= maxErrors) {
223
msg << TLF("Ignoring item '%' because of invalid type %\n", line, toString(object->getType()));
224
}
225
} else {
226
result.insert(object->getGlID());
227
}
228
} else {
229
numMissing++;
230
if (dynamicNotFound != nullptr && (
231
StringUtils::startsWith(line, "vehicle:") ||
232
StringUtils::startsWith(line, "person:") ||
233
StringUtils::startsWith(line, "container:"))) {
234
(*dynamicNotFound) << line << "\n";
235
} else {
236
if (numIgnored + numMissing <= maxErrors) {
237
msg << TLF("Item '%' not found\n", line);
238
}
239
}
240
continue;
241
}
242
}
243
if (numIgnored + numMissing > maxErrors) {
244
msg << "...\n" << TLF("% objects ignored, % objects not found\n", numIgnored, numMissing);
245
}
246
msgOut = msg.str();
247
return result;
248
}
249
250
251
std::string
252
GUISelectedStorage::load(const std::string& filename, GUIGlObjectType type, std::ostream* dynamicNotFound) {
253
std::ifstream strm(filename.c_str());
254
if (!strm.good()) {
255
return TLF("Could not open '%'.\n", filename);
256
}
257
std::string errors = load(strm, type, dynamicNotFound);
258
strm.close();
259
return errors;
260
}
261
262
263
std::string
264
GUISelectedStorage::load(std::istream& strm, GUIGlObjectType type, std::ostream* dynamicNotFound) {
265
std::string errors;
266
const std::set<GUIGlID> ids = loadIDs(strm, errors, type, dynamicNotFound);
267
for (const auto glID : ids) {
268
select(glID, false);
269
}
270
if (myUpdateTarget) {
271
myUpdateTarget->selectionUpdated();
272
}
273
return errors;
274
}
275
276
277
void
278
GUISelectedStorage::save(GUIGlObjectType type, const std::string& filename) {
279
mySelections[type].save(filename);
280
}
281
282
283
void
284
GUISelectedStorage::save(const std::string& filename) const {
285
save(filename, myAllSelected);
286
}
287
288
289
void
290
GUISelectedStorage::add2Update(UpdateTarget* updateTarget) {
291
myUpdateTarget = updateTarget;
292
}
293
294
295
void
296
GUISelectedStorage::remove2Update() {
297
myUpdateTarget = nullptr;
298
}
299
300
301
void
302
GUISelectedStorage::save(const std::string& filename, const std::unordered_set<GUIGlID>& ids) {
303
OutputDevice& dev = OutputDevice::getDevice(filename);
304
for (const auto glID : ids) {
305
GUIGlObject* object = GUIGlObjectStorage::gIDStorage.getObjectBlocking(glID);
306
if (object != nullptr) {
307
std::string name = object->getFullName();
308
dev << name << "\n";
309
GUIGlObjectStorage::gIDStorage.unblockObject(glID);
310
}
311
}
312
dev.close();
313
}
314
315
316
/****************************************************************************/
317
318