74 FXIMPLEMENT(
GUIDialog_ViewSettings, FXDialogBox, GUIDialog_ViewSettingsMap, ARRAYNUMBER(GUIDialog_ViewSettingsMap))
82 myParent(parent), mySettings(settings),
83 myDecals(decals), myDecalsLock(decalsLock),
84 myDecalsTable(
nullptr) {
85 myBackup = (*mySettings);
93 for (std::vector<std::string>::const_iterator i = names.begin(); i != names.end(); ++i) {
94 int index = mySchemeName->appendItem((*i).c_str());
95 if ((*i) == mySettings->name) {
96 mySchemeName->setCurrentItem((FXint) index);
99 mySchemeName->setNumVisible(5);
106 new FXVerticalSeparator(frame0);
108 mySaveViewPort =
new FXCheckButton(frame0,
"Viewport");
109 mySaveDelay =
new FXCheckButton(frame0,
"Delay");
110 mySaveDecals =
new FXCheckButton(frame0,
"Decals");
111 mySaveBreakpoints =
new FXCheckButton(frame0,
"Breakpoints");
112 if (settings->netedit) {
113 mySaveBreakpoints->disable();
121 FXScrollWindow* genScroll =
new FXScrollWindow(tabbook);
131 new FXLabel(frame11,
"Decals:");
132 myDecalsFrame =
new FXVerticalFrame(frame11);
141 myShowGrid->setCheck(mySettings->showGrid);
142 new FXLabel(m12,
"");
146 myGridXSizeDialer->setRange(1, 10000);
147 myGridXSizeDialer->setValue(mySettings->gridXSize);
151 myGridYSizeDialer->setRange(1, 10000);
152 myGridYSizeDialer->setValue(mySettings->gridXSize);
157 FXScrollWindow* genScroll =
new FXScrollWindow(tabbook);
167 myParamKey->disable();
172 (BUTTON_DEFAULT | FRAME_RAISED | FRAME_THICK | LAYOUT_TOP | LAYOUT_LEFT), 0, 0, 0, 0, 20, 20, 4, 4);
186 mySettings->edgeColorer.fill(*myLaneEdgeColorMode);
187 mySettings->edgeScaler.fill(*myLaneEdgeScaleMode);
188 myLaneEdgeColorMode->setNumVisible((
int)mySettings->edgeColorer.size());
189 myLaneEdgeScaleMode->setNumVisible((
int)mySettings->edgeScaler.size());
191 mySettings->laneColorer.fill(*myLaneEdgeColorMode);
192 mySettings->laneScaler.fill(*myLaneEdgeScaleMode);
193 myLaneEdgeColorMode->setNumVisible((
int)mySettings->laneColorer.size());
194 myLaneEdgeScaleMode->setNumVisible((
int)mySettings->laneScaler.size());
200 myShowLaneBorders->setCheck(mySettings->laneShowBorders);
202 myShowBikeMarkings->setCheck(mySettings->showBikeMarkings);
204 myShowLaneDecals->setCheck(mySettings->showLinkDecals);
207 myShowLinkRules->setCheck(mySettings->showLinkRules);
210 myShowRails->setCheck(mySettings->showRails);
213 myHideMacroConnectors->setCheck(mySettings->hideConnectors);
216 myShowLaneDirection->setCheck(mySettings->showLaneDirection);
219 myShowSublanes->setCheck(mySettings->showSublanes);
220 mySpreadSuperposed =
new FXCheckButton(m22,
"Spread bidirectional railway\t\tMake both directional edges for a bidirectional railway visible",
this,
MID_SIMPLE_VIEW_COLORCHANGE);
221 mySpreadSuperposed->setCheck(mySettings->spreadSuperposed);
224 myLaneWidthUpscaleDialer->setRange(0, 10000);
225 myLaneWidthUpscaleDialer->setValue(mySettings->laneWidthExaggeration);
229 myLaneMinWidthDialer->setRange(0, 10000);
230 myLaneMinWidthDialer->setValue(mySettings->laneMinSize);
233 myEdgeNamePanel =
new NamePanel(m22,
this,
"Show edge name", mySettings->edgeName);
234 myStreetNamePanel =
new NamePanel(m22,
this,
"Show street name", mySettings->streetName);
235 myEdgeValuePanel =
new NamePanel(m22,
this,
"Show edge color value", mySettings->edgeValue);
240 FXScrollWindow* genScroll =
new FXScrollWindow(tabbook);
246 myVehicleShapeDetail->appendItem(
"'triangles'");
247 myVehicleShapeDetail->appendItem(
"'boxes'");
248 myVehicleShapeDetail->appendItem(
"'simple shapes'");
249 myVehicleShapeDetail->appendItem(
"'raster images'");
250 myVehicleShapeDetail->setNumVisible(4);
251 myVehicleShapeDetail->setCurrentItem(settings->vehicleQuality);
258 mySettings->vehicleColorer.fill(*myVehicleColorMode);
259 myVehicleColorMode->setNumVisible((
int)mySettings->vehicleColorer.size());
268 myShowBlinker->setCheck(mySettings->showBlinker);
271 myShowMinGap->setCheck(mySettings->drawMinGap);
274 myShowBrakeGap->setCheck(mySettings->drawBrakeGap);
277 myShowBTRange->setCheck(mySettings->showBTRange);
284 myVehicleNamePanel =
new NamePanel(m33,
this,
"Show vehicle name", mySettings->vehicleName);
285 myVehicleValuePanel =
new NamePanel(m33,
this,
"Show vehicle color value", mySettings->vehicleValue);
296 myVehicleSizePanel =
new SizePanel(m34,
this, mySettings->vehicleSize);
301 FXScrollWindow* genScroll =
new FXScrollWindow(tabbook);
307 myPersonShapeDetail->appendItem(
"'triangles'");
308 myPersonShapeDetail->appendItem(
"'circles'");
309 myPersonShapeDetail->appendItem(
"'simple shapes'");
310 myPersonShapeDetail->appendItem(
"'raster images'");
311 myPersonShapeDetail->setNumVisible(4);
312 myPersonShapeDetail->setCurrentItem(settings->personQuality);
319 mySettings->personColorer.fill(*myPersonColorMode);
320 myPersonColorMode->setNumVisible(10);
328 myPersonNamePanel =
new NamePanel(m103,
this,
"Show person name", mySettings->personName);
329 myPersonValuePanel =
new NamePanel(m103,
this,
"Show person color value", mySettings->personValue);
334 myPersonSizePanel =
new SizePanel(m104,
this, mySettings->personSize);
339 FXScrollWindow* genScroll =
new FXScrollWindow(tabbook);
345 myContainerShapeDetail->appendItem(
"'triangles'");
346 myContainerShapeDetail->appendItem(
"'boxes'");
347 myContainerShapeDetail->appendItem(
"'simple shapes'");
348 myContainerShapeDetail->appendItem(
"'raster images'");
349 myContainerShapeDetail->setNumVisible(4);
350 myContainerShapeDetail->setCurrentItem(settings->containerQuality);
357 mySettings->containerColorer.fill(*myContainerColorMode);
358 myContainerColorMode->setNumVisible(9);
366 myContainerNamePanel =
new NamePanel(m103,
this,
"Show container name", mySettings->containerName);
371 myContainerSizePanel =
new SizePanel(m104,
this, mySettings->containerSize);
376 FXScrollWindow* genScroll =
new FXScrollWindow(tabbook);
381 mySettings->junctionColorer.fill(*myJunctionColorMode);
382 myJunctionColorMode->setNumVisible(4);
387 (BUTTON_DEFAULT | FRAME_RAISED | FRAME_THICK | LAYOUT_TOP | LAYOUT_LEFT), 0, 0, 0, 0, 20, 20, 4, 4);
391 myJunctionSizePanel =
new SizePanel(m42,
this, mySettings->junctionSize);
393 myDrawJunctionShape->setCheck(mySettings->drawJunctionShape);
395 myDrawCrossingsAndWalkingAreas->setCheck(mySettings->drawCrossingsAndWalkingareas);
397 myShowLane2Lane->setCheck(mySettings->showLane2Lane);
400 myTLIndexPanel =
new NamePanel(m42,
this,
"Show link tls index", mySettings->drawLinkTLIndex);
401 myJunctionIndexPanel =
new NamePanel(m42,
this,
"Show link junction index", mySettings->drawLinkJunctionIndex);
402 myJunctionNamePanel =
new NamePanel(m42,
this,
"Show junction name", mySettings->junctionName);
403 myInternalJunctionNamePanel =
new NamePanel(m42,
this,
"Show internal junction name", mySettings->internalJunctionName);
404 myInternalEdgeNamePanel =
new NamePanel(m42,
this,
"Show internal edge name", mySettings->internalEdgeName);
405 myCwaEdgeNamePanel =
new NamePanel(m42,
this,
"Show crossing and walkingarea name", mySettings->cwaEdgeName);
406 myTLSPhaseIndexPanel =
new NamePanel(m42,
this,
"Show traffic light phase", mySettings->tlsPhaseIndex);
411 FXScrollWindow* genScroll =
new FXScrollWindow(tabbook);
415 myAddNamePanel =
new NamePanel(m51,
this,
"Show object name", mySettings->addName);
416 myAddFullNamePanel =
new NamePanel(m51,
this,
"Show full name", mySettings->addFullName);
420 myAddSizePanel =
new SizePanel(m52,
this, mySettings->addSize);
430 FXScrollWindow* genScroll =
new FXScrollWindow(tabbook);
436 mySettings->poiColorer.fill(*myPOIColorMode);
437 myPOIColorMode->setNumVisible(3);
444 myPOINamePanel =
new NamePanel(m61,
this,
"Show poi names", mySettings->poiName);
445 myPOITypePanel =
new NamePanel(m61,
this,
"Show poi types", mySettings->poiType);
449 myPOISizePanel =
new SizePanel(m62,
this, mySettings->poiSize);
455 FXScrollWindow* genScroll =
new FXScrollWindow(tabbook);
461 mySettings->polyColorer.fill(*myPolyColorMode);
462 myPolyColorMode->setNumVisible(3);
469 myPolyNamePanel =
new NamePanel(m91,
this,
"Show polygon names", mySettings->polyName);
470 myPolyTypePanel =
new NamePanel(m91,
this,
"Show polygon types", mySettings->polyType);
473 myPolySizePanel =
new SizePanel(m91,
this, mySettings->polySize);
475 if (settings->netedit) {
478 FXScrollWindow* genScroll =
new FXScrollWindow(tabbook);
511 FXScrollWindow* genScroll =
new FXScrollWindow(tabbook);
516 myShowSizeLegend->setCheck(mySettings->showSizeLegend);
517 new FXLabel(m72,
"");
519 myShowColorLegend->setCheck(mySettings->showColorLegend);
520 new FXLabel(m72,
"");
525 FXScrollWindow* genScroll =
new FXScrollWindow(tabbook);
530 myDither->setCheck(mySettings->dither);
533 myFPS->setCheck(mySettings->fps);
536 myDrawBoundaries->setCheck(mySettings->drawBoundaries);
539 myForceDrawForSelecting->setCheck(mySettings->forceDrawForSelecting);
546 rebuildColorMatrices(
false);
620 if (data !=
nullptr) {
621 FXString dataS = (
char*) data;
624 for (
int i = 0; i <
mySchemeName->getNumItems() - 1; ++i) {
732 std::vector<FXColorWell*>::const_iterator colEnd,
733 std::vector<FXRealSpinner*>::const_iterator threshIt,
734 std::vector<FXRealSpinner*>::const_iterator threshEnd,
735 std::vector<FXButton*>::const_iterator buttonIt,
738 while (colIt != colEnd) {
740 if (sender == *colIt) {
744 if (sender == *threshIt) {
745 const double val = (*threshIt)->getValue();
749 (*threshIt)->getRange(lo, hi);
750 (*threshIt)->setRange(lo, val);
754 if (threshIt != threshEnd) {
755 (*threshIt)->getRange(lo, hi);
756 (*threshIt)->setRange(val, hi);
761 if (sender == *colIt) {
765 if (sender == *buttonIt) {
768 }
else if (sender == *(buttonIt + 1)) {
785 std::vector<FXRealSpinner*>::const_iterator scaleEnd,
786 std::vector<FXRealSpinner*>::const_iterator threshIt,
787 std::vector<FXRealSpinner*>::const_iterator threshEnd,
788 std::vector<FXButton*>::const_iterator buttonIt,
791 while (scaleIt != scaleEnd) {
793 if (sender == *scaleIt) {
794 scheme.
setColor(pos, (*scaleIt)->getValue());
797 if (sender == *threshIt) {
798 const double val = (*threshIt)->getValue();
802 (*threshIt)->getRange(lo, hi);
803 (*threshIt)->setRange(lo, val);
807 if (threshIt != threshEnd) {
808 (*threshIt)->getRange(lo, hi);
809 (*threshIt)->setRange(val, hi);
814 if (sender == *scaleIt) {
815 scheme.
setColor(pos, (*scaleIt)->getValue());
818 if (sender == *buttonIt) {
819 scheme.
addColor((*scaleIt)->getValue(), (*threshIt)->getValue());
821 }
else if (sender == *(buttonIt + 1)) {
846 bool doRebuildColorMatrices =
false;
952 tmpSettings.
fps = (
myFPS->getCheck() != FALSE);
962 doRebuildColorMatrices =
true;
966 doRebuildColorMatrices =
true;
972 doRebuildColorMatrices =
true;
976 doRebuildColorMatrices =
true;
979 doRebuildColorMatrices =
true;
986 doRebuildColorMatrices =
true;
990 doRebuildColorMatrices =
true;
993 doRebuildColorMatrices =
true;
1000 doRebuildColorMatrices =
true;
1004 doRebuildColorMatrices =
true;
1007 doRebuildColorMatrices =
true;
1014 doRebuildColorMatrices =
true;
1018 doRebuildColorMatrices =
true;
1021 doRebuildColorMatrices =
true;
1028 doRebuildColorMatrices =
true;
1032 doRebuildColorMatrices =
true;
1035 doRebuildColorMatrices =
true;
1042 doRebuildColorMatrices =
true;
1046 doRebuildColorMatrices =
true;
1049 doRebuildColorMatrices =
true;
1056 doRebuildColorMatrices =
true;
1060 doRebuildColorMatrices =
true;
1063 doRebuildColorMatrices =
true;
1070 doRebuildColorMatrices =
true;
1074 doRebuildColorMatrices =
true;
1077 doRebuildColorMatrices =
true;
1107 if (doRebuildColorMatrices) {
1111 getApp()->forceRefresh();
1120 if (settingsName !=
"") {
1121 FXint index =
mySchemeName->appendItem(settingsName.c_str());
1145 std::vector<GUISUMOAbstractView::Decal>::iterator j;
1186 std::string name =
"";
1187 while (name.length() == 0) {
1198 if (!dialog.execute()) {
1201 name = text->getText().text();
1202 for (
int i = 0; i < (int)name.length(); ++i) {
1203 if (name[i] !=
'_' && (name[i] <
'a' || name[i] >
'z') && (name[i] <
'A' || name[i] >
'Z') && (name[i] <
'0' || name[i] >
'9')) {
1211 tmpSettings.
name = name;
1225 sender->handle(
this,
1227 ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
1239 std::string name =
mySchemeName->getItem(index).text();
1250 sender->handle(
this,
1252 ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
1289 FXMessageBox::error(
this, MBOX_OK,
"Storing failed!",
"%s", e.what());
1297 sender->handle(
this,
1300 FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE),
1308 FXFileDialog opendialog(
this,
"Import view settings");
1310 opendialog.setSelectMode(SELECTFILE_ANY);
1311 opendialog.setPatternList(
"*.xml");
1315 if (opendialog.execute()) {
1325 FXFileDialog opendialog(
this,
"Load Decals");
1327 opendialog.setSelectMode(SELECTFILE_ANY);
1328 opendialog.setPatternList(
"*.xml");
1332 if (opendialog.execute()) {
1353 FXMessageBox::error(
myParent, MBOX_OK,
"Storing failed!",
"%s", e.what());
1363 sender->handle(
this, FXSEL(SEL_COMMAND, ID_ENABLE), ptr);
1373 const int numRows =
MAX2((
int)10, (
int)
myDecals->size() + 1);
1384 header->setHeight(getApp()->getNormalFont()->getFontHeight() + getApp()->getNormalFont()->getFontAscent());
1386 for (k = 0; k < cols; k++) {
1388 header->setItemSize(k, 60);
1390 header->setItemSize(0, 150);
1393 std::vector<GUISUMOAbstractView::Decal>::iterator j;
1407 for (k = 0; k < 7; k++) {
1415 std::vector<FXColorWell*>& colors,
1416 std::vector<FXRealSpinner*>& thresholds,
1417 std::vector<FXButton*>& buttons,
1418 FXCheckButton* interpolation,
1425 const bool fixed = scheme.
isFixed();
1426 std::vector<RGBColor>::const_iterator colIt = scheme.
getColors().begin();
1427 std::vector<double>::const_iterator threshIt = scheme.
getThresholds().begin();
1428 std::vector<std::string>::const_iterator nameIt = scheme.
getNames().begin();
1429 while (colIt != scheme.
getColors().end()) {
1432 new FXLabel(m, nameIt->c_str());
1438 threshDialer->setValue(*threshIt);
1439 thresholds.push_back(threshDialer);
1449 interpolation->disable();
1451 if (colors.size() > 1) {
1452 interpolation->enable();
1453 if (interpolation->getCheck() != FALSE) {
1454 thresholds.front()->enable();
1456 thresholds.front()->disable();
1459 interpolation->disable();
1460 thresholds.front()->disable();
1469 std::vector<FXRealSpinner*>& scales,
1470 std::vector<FXRealSpinner*>& thresholds,
1471 std::vector<FXButton*>& buttons,
1472 FXCheckButton* interpolation,
1479 const bool fixed = scheme.
isFixed();
1480 std::vector<double>::const_iterator scaleIt = scheme.
getColors().begin();
1481 std::vector<double>::const_iterator threshIt = scheme.
getThresholds().begin();
1482 std::vector<std::string>::const_iterator nameIt = scheme.
getNames().begin();
1483 while (scaleIt != scheme.
getColors().end()) {
1485 scaleDialer->setValue(*scaleIt);
1486 scales.push_back(scaleDialer);
1488 new FXLabel(m, nameIt->c_str());
1494 threshDialer->setValue(*threshIt);
1495 thresholds.push_back(threshDialer);
1505 interpolation->disable();
1507 if (scales.size() > 1) {
1508 interpolation->enable();
1509 if (interpolation->getCheck() != FALSE) {
1510 thresholds.front()->enable();
1512 thresholds.front()->disable();
1515 interpolation->disable();
1516 thresholds.front()->disable();
1533 for (
int i = 1; i <= 5; ++i) {
1637 std::string value = i->
item->getText().text();
1639 if (value.find_first_not_of(
" ") == std::string::npos) {
1645 if (row == static_cast<int>(
myDecals->size())) {
1658 }
else if (row > static_cast<int>(
myDecals->size())) {
1662 d = (*myDecals)[row];
1676 std::string msg =
"The value must be a float, is:" + value;
1677 FXMessageBox::error(
this, MBOX_OK,
"Number format error",
"%s", msg.c_str());
1684 std::string msg =
"The value must be a float, is:" + value;
1685 FXMessageBox::error(
this, MBOX_OK,
"Number format error",
"%s", msg.c_str());
1692 std::string msg =
"The value must be a float, is:" + value;
1693 FXMessageBox::error(
this, MBOX_OK,
"Number format error",
"%s", msg.c_str());
1700 std::string msg =
"The value must be a float, is:" + value;
1701 FXMessageBox::error(
this, MBOX_OK,
"Number format error",
"%s", msg.c_str());
1708 std::string msg =
"The value must be a float, is:" + value;
1709 FXMessageBox::error(
this, MBOX_OK,
"Number format error",
"%s", msg.c_str());
1716 std::string msg =
"The value must be a float, is:" + value;
1717 FXMessageBox::error(
this, MBOX_OK,
"Number format error",
"%s", msg.c_str());
1724 std::string msg =
"The value must be a bool, is:" + value;
1725 FXMessageBox::error(
this, MBOX_OK,
"Number format error",
"%s", msg.c_str());
1731 (*myDecals)[row] = d;
1751 for (
int i = 0; i <
mySchemeName->getNumItems(); ++i) {
1763 const std::string& title,
1785 mySizeDial->getValue(),
1788 myConstSizeCheck->getCheck() != FALSE);
1794 myCheck->setCheck(settings.
show);
1795 mySizeDial->setValue(settings.
size);
1798 myConstSizeCheck->setCheck(settings.
constSize);
1813 myMinSizeDial->setValue(settings.
minSize);
1817 myExaggerateDial->setRange(0, 10000);
1825 myMinSizeDial->getValue(), myExaggerateDial->getValue(),
1826 myCheck->getCheck() != FALSE,
1827 myCheckSelected->getCheck() != FALSE);
1835 myMinSizeDial->setValue(settings.
minSize);
1842 getApp()->reg().writeIntEntry(
"VIEWSETTINGS",
"x", getX());
1843 getApp()->reg().writeIntEntry(
"VIEWSETTINGS",
"y", getY());
1844 getApp()->reg().writeIntEntry(
"VIEWSETTINGS",
"width", getWidth());
1845 getApp()->reg().writeIntEntry(
"VIEWSETTINGS",
"height", getHeight());
1851 const FXint minSize = 400;
1852 const FXint minTitlebarHeight = 20;
1853 setX(
MAX2(0,
MIN2(getApp()->reg().readIntEntry(
"VIEWSETTINGS",
"x", 150),
1854 getApp()->getRootWindow()->getWidth() - minSize)));
1855 setY(
MAX2(minTitlebarHeight,
1856 MIN2(getApp()->reg().readIntEntry(
"VIEWSETTINGS",
"y", 150),
1857 getApp()->getRootWindow()->getHeight() - minSize)));
1858 setWidth(
MAX2(getApp()->reg().readIntEntry(
"VIEWSETTINGS",
"width", 700), minSize));
1859 setHeight(
MAX2(getApp()->reg().readIntEntry(
"VIEWSETTINGS",
"height", 500), minSize));