#include <netedit/GNETagProperties.h>
#include <netedit/elements/additional/GNEPOI.h>
#include <netedit/elements/additional/GNEPoly.h>
#include <netedit/elements/additional/GNETAZ.h>
#include <netedit/elements/data/GNEDataInterval.h>
#include <netedit/elements/data/GNEEdgeData.h>
#include <netedit/elements/data/GNEEdgeRelData.h>
#include <netedit/elements/data/GNETAZRelData.h>
#include <netedit/elements/network/GNEConnection.h>
#include <netedit/elements/network/GNECrossing.h>
#include <netedit/elements/network/GNEInternalLane.h>
#include <netedit/elements/network/GNEWalkingArea.h>
#include <netedit/frames/common/GNESelectorFrame.h>
#include <netedit/frames/network/GNETLSEditorFrame.h>
#include <utils/foxtools/MFXMenuCheckIcon.h>
#include <utils/gui/div/GLHelper.h>
#include <utils/gui/div/GUIDesigns.h>
#include <utils/gui/div/GUIGlobalViewObjectsHandler.h>
#include <utils/options/OptionsCont.h>
#include "GNEViewNetHelper.h"
#include "GNEViewNet.h"
#include "GNENet.h"
#include "GNEUndoList.h"
#include "GNEViewParent.h"
#include "GNEApplicationWindow.h"
std::vector<RGBColor> GNEViewNetHelper::myRainbowScaledColors;
GNEViewNetHelper::LockManager::LockManager(GNEViewNet* viewNet) :
myViewNet(viewNet) {
myLockedElements[GLO_JUNCTION] = OperationLocked(Supermode::NETWORK);
myLockedElements[GLO_EDGE] = OperationLocked(Supermode::NETWORK);
myLockedElements[GLO_LANE] = OperationLocked(Supermode::NETWORK);
myLockedElements[GLO_CONNECTION] = OperationLocked(Supermode::NETWORK);
myLockedElements[GLO_CROSSING] = OperationLocked(Supermode::NETWORK);
myLockedElements[GLO_WALKINGAREA] = OperationLocked(Supermode::NETWORK);
myLockedElements[GLO_ADDITIONALELEMENT] = OperationLocked(Supermode::NETWORK);
myLockedElements[GLO_WIRE] = OperationLocked(Supermode::NETWORK);
myLockedElements[GLO_TAZ] = OperationLocked(Supermode::NETWORK);
myLockedElements[GLO_WIRE] = OperationLocked(Supermode::NETWORK);
myLockedElements[GLO_POLYGON] = OperationLocked(Supermode::NETWORK);
myLockedElements[GLO_POI] = OperationLocked(Supermode::NETWORK);
myLockedElements[GLO_JPS_WALKABLEAREA] = OperationLocked(Supermode::NETWORK);
myLockedElements[GLO_JPS_OBSTACLE] = OperationLocked(Supermode::NETWORK);
myLockedElements[GLO_ROUTE] = OperationLocked(Supermode::DEMAND);
myLockedElements[GLO_VEHICLE] = OperationLocked(Supermode::DEMAND);
myLockedElements[GLO_PERSON] = OperationLocked(Supermode::DEMAND);
myLockedElements[GLO_PERSONTRIP] = OperationLocked(Supermode::DEMAND);
myLockedElements[GLO_RIDE] = OperationLocked(Supermode::DEMAND);
myLockedElements[GLO_WALK] = OperationLocked(Supermode::DEMAND);
myLockedElements[GLO_CONTAINER] = OperationLocked(Supermode::DEMAND);
myLockedElements[GLO_TRANSPORT] = OperationLocked(Supermode::DEMAND);
myLockedElements[GLO_TRANSHIP] = OperationLocked(Supermode::DEMAND);
myLockedElements[GLO_STOP] = OperationLocked(Supermode::DEMAND);
myLockedElements[GLO_EDGEDATA] = OperationLocked(Supermode::DATA);
myLockedElements[GLO_EDGERELDATA] = OperationLocked(Supermode::DATA);
myLockedElements[GLO_TAZRELDATA] = OperationLocked(Supermode::DATA);
}
GNEViewNetHelper::LockManager::~LockManager() {}
bool
GNEViewNetHelper::LockManager::isObjectLocked(GUIGlObjectType objectType, const bool selected) const {
if (selected && (myViewNet->getViewParent()->getGNEAppWindows()->getLockMenuCommands().menuCheckLockSelectedElements->getCheck() == TRUE)) {
return true;
} else if ((objectType >= GLO_ADDITIONALELEMENT) && (objectType <= GLO_ACCESS)) {
return myLockedElements.at(GLO_ADDITIONALELEMENT).lock;
} else if ((objectType >= GLO_WIRE) && (objectType <= GLO_TRACTIONSUBSTATION)) {
return myLockedElements.at(GLO_WIRE).lock;
} else if ((objectType == GLO_ROUTE) || (objectType == GLO_ROUTE_EMBEDDED)) {
return myLockedElements.at(GLO_ROUTE).lock;
} else if ((objectType >= GLO_VEHICLE) && (objectType <= GLO_ROUTEFLOW)) {
return myLockedElements.at(GLO_VEHICLE).lock;
} else if ((objectType == GLO_PERSON) || (objectType == GLO_PERSONFLOW)) {
return myLockedElements.at(GLO_PERSON).lock;
} else if ((objectType == GLO_CONTAINER) || (objectType == GLO_CONTAINERFLOW)) {
return myLockedElements.at(GLO_CONTAINER).lock;
} else if ((objectType >= GLO_STOP) && (objectType <= GLO_STOP_PLAN)) {
return myLockedElements.at(GLO_STOP).lock;
} else {
return myLockedElements.at(objectType).lock;
}
}
void
GNEViewNetHelper::LockManager::updateFlags() {
GNEApplicationWindowHelper::LockMenuCommands& lockMenuCommands = myViewNet->getViewParent()->getGNEAppWindows()->getLockMenuCommands();
myLockedElements[GLO_JUNCTION].lock = lockMenuCommands.menuCheckLockJunctions->getCheck() == TRUE;
myLockedElements[GLO_EDGE].lock = lockMenuCommands.menuCheckLockEdges->getCheck() == TRUE;
myLockedElements[GLO_LANE].lock = lockMenuCommands.menuCheckLockLanes->getCheck() == TRUE;
myLockedElements[GLO_CONNECTION].lock = lockMenuCommands.menuCheckLockConnections->getCheck() == TRUE;
myLockedElements[GLO_CROSSING].lock = lockMenuCommands.menuCheckLockCrossings->getCheck() == TRUE;
myLockedElements[GLO_WALKINGAREA].lock = lockMenuCommands.menuCheckLockWalkingAreas->getCheck() == TRUE;
myLockedElements[GLO_ADDITIONALELEMENT].lock = lockMenuCommands.menuCheckLockAdditionals->getCheck() == TRUE;
myLockedElements[GLO_WIRE].lock = lockMenuCommands.menuCheckLockWires->getCheck() == TRUE;
myLockedElements[GLO_TAZ].lock = lockMenuCommands.menuCheckLockTAZs->getCheck() == TRUE;
myLockedElements[GLO_POLYGON].lock = lockMenuCommands.menuCheckLockPolygons->getCheck() == TRUE;
myLockedElements[GLO_POI].lock = lockMenuCommands.menuCheckLockPOIs->getCheck() == TRUE;
myLockedElements[GLO_JPS_WALKABLEAREA].lock = lockMenuCommands.menuCheckLockJpsWalkableAreas->getCheck() == TRUE;
myLockedElements[GLO_JPS_OBSTACLE].lock = lockMenuCommands.menuCheckLockJpsObstacles->getCheck() == TRUE;
myLockedElements[GLO_ROUTE].lock = lockMenuCommands.menuCheckLockRoutes->getCheck() == TRUE;
myLockedElements[GLO_VEHICLE].lock = lockMenuCommands.menuCheckLockVehicles->getCheck() == TRUE;
myLockedElements[GLO_PERSON].lock = lockMenuCommands.menuCheckLockPersons->getCheck() == TRUE;
myLockedElements[GLO_PERSONTRIP].lock = lockMenuCommands.menuCheckLockPersonTrips->getCheck() == TRUE;
myLockedElements[GLO_WALK].lock = lockMenuCommands.menuCheckLockWalks->getCheck() == TRUE;
myLockedElements[GLO_RIDE].lock = lockMenuCommands.menuCheckLockRides->getCheck() == TRUE;
myLockedElements[GLO_CONTAINER].lock = lockMenuCommands.menuCheckLockContainers->getCheck() == TRUE;
myLockedElements[GLO_TRANSPORT].lock = lockMenuCommands.menuCheckLockTransports->getCheck() == TRUE;
myLockedElements[GLO_TRANSHIP].lock = lockMenuCommands.menuCheckLockTranships->getCheck() == TRUE;
myLockedElements[GLO_STOP].lock = lockMenuCommands.menuCheckLockStops->getCheck() == TRUE;
myLockedElements[GLO_EDGEDATA].lock = lockMenuCommands.menuCheckLockEdgeDatas->getCheck() == TRUE;
myLockedElements[GLO_EDGERELDATA].lock = lockMenuCommands.menuCheckLockEdgeRelDatas->getCheck() == TRUE;
myLockedElements[GLO_TAZRELDATA].lock = lockMenuCommands.menuCheckLockEdgeTAZRels->getCheck() == TRUE;
}
void
GNEViewNetHelper::LockManager::updateLockMenuBar() {
GNEApplicationWindowHelper::LockMenuCommands& lockMenuCommands = myViewNet->getViewParent()->getGNEAppWindows()->getLockMenuCommands();
lockMenuCommands.menuCheckLockJunctions->setCheck(myLockedElements[GLO_JUNCTION].lock);
lockMenuCommands.menuCheckLockEdges->setCheck(myLockedElements[GLO_EDGE].lock);
lockMenuCommands.menuCheckLockLanes->setCheck(myLockedElements[GLO_LANE].lock);
lockMenuCommands.menuCheckLockConnections->setCheck(myLockedElements[GLO_CONNECTION].lock);
lockMenuCommands.menuCheckLockCrossings->setCheck(myLockedElements[GLO_CROSSING].lock);
lockMenuCommands.menuCheckLockWalkingAreas->setCheck(myLockedElements[GLO_WALKINGAREA].lock);
lockMenuCommands.menuCheckLockAdditionals->setCheck(myLockedElements[GLO_ADDITIONALELEMENT].lock);
lockMenuCommands.menuCheckLockWires->setCheck(myLockedElements[GLO_WIRE].lock);
lockMenuCommands.menuCheckLockTAZs->setCheck(myLockedElements[GLO_TAZ].lock);
lockMenuCommands.menuCheckLockPolygons->setCheck(myLockedElements[GLO_POLYGON].lock);
lockMenuCommands.menuCheckLockPOIs->setCheck(myLockedElements[GLO_POI].lock);
lockMenuCommands.menuCheckLockJpsWalkableAreas->setCheck(myLockedElements[GLO_JPS_WALKABLEAREA].lock);
lockMenuCommands.menuCheckLockJpsObstacles->setCheck(myLockedElements[GLO_JPS_OBSTACLE].lock);
lockMenuCommands.menuCheckLockRoutes->setCheck(myLockedElements[GLO_ROUTE].lock);
lockMenuCommands.menuCheckLockVehicles->setCheck(myLockedElements[GLO_VEHICLE].lock);
lockMenuCommands.menuCheckLockPersons->setCheck(myLockedElements[GLO_PERSON].lock);
lockMenuCommands.menuCheckLockPersonTrips->setCheck(myLockedElements[GLO_PERSONTRIP].lock);
lockMenuCommands.menuCheckLockWalks->setCheck(myLockedElements[GLO_WALK].lock);
lockMenuCommands.menuCheckLockRides->setCheck(myLockedElements[GLO_RIDE].lock);
lockMenuCommands.menuCheckLockContainers->setCheck(myLockedElements[GLO_CONTAINER].lock);
lockMenuCommands.menuCheckLockTransports->setCheck(myLockedElements[GLO_TRANSPORT].lock);
lockMenuCommands.menuCheckLockTranships->setCheck(myLockedElements[GLO_TRANSHIP].lock);
lockMenuCommands.menuCheckLockStops->setCheck(myLockedElements[GLO_STOP].lock);
lockMenuCommands.menuCheckLockEdgeDatas->setCheck(myLockedElements[GLO_EDGEDATA].lock);
lockMenuCommands.menuCheckLockEdgeRelDatas->setCheck(myLockedElements[GLO_EDGERELDATA].lock);
lockMenuCommands.menuCheckLockEdgeTAZRels->setCheck(myLockedElements[GLO_TAZRELDATA].lock);
}
GNEViewNetHelper::LockManager::OperationLocked::OperationLocked():
mySupermode(Supermode::NETWORK) {
}
GNEViewNetHelper::LockManager::OperationLocked::OperationLocked(Supermode supermode) :
mySupermode(supermode) {
}
GNEViewNetHelper::LockManager::OperationLocked::~OperationLocked() {}
Supermode
GNEViewNetHelper::LockManager::OperationLocked::getSupermode() const {
return mySupermode;
}
GNEViewNetHelper::InspectedElements::InspectedElements() {}
void
GNEViewNetHelper::InspectedElements::inspectAC(GNEAttributeCarrier* AC) {
myInspectedACs.clear();
if (AC) {
myFirstInspectedAC = AC;
myInspectedACs.insert(AC);
} else {
myFirstInspectedAC = nullptr;
}
}
void
GNEViewNetHelper::InspectedElements::inspectACs(const std::vector<GNEAttributeCarrier*>& ACs) {
myInspectedACs.clear();
if (ACs.size() > 0) {
myFirstInspectedAC = ACs.front();
for (const auto& AC : ACs) {
myInspectedACs.insert(AC);
}
} else {
myFirstInspectedAC = nullptr;
}
}
void
GNEViewNetHelper::InspectedElements::uninspectAC(GNEAttributeCarrier* AC) {
auto it = myInspectedACs.find(AC);
if (it != myInspectedACs.end()) {
myInspectedACs.erase(it);
if (myInspectedACs.size() == 0) {
myInspectedACs.clear();
myFirstInspectedAC = nullptr;
} else if (myFirstInspectedAC == AC) {
myFirstInspectedAC = (*myInspectedACs.begin());
}
}
}
void
GNEViewNetHelper::InspectedElements::clearInspectedElements() {
myFirstInspectedAC = nullptr;
myInspectedACs.clear();
}
GNEAttributeCarrier*
GNEViewNetHelper::InspectedElements::getFirstAC() const {
return myFirstInspectedAC;
}
const std::unordered_set<GNEAttributeCarrier*>&
GNEViewNetHelper::InspectedElements::getACs() const {
return myInspectedACs;
}
bool
GNEViewNetHelper::InspectedElements::isACInspected(GNEAttributeCarrier* AC) const {
if (myInspectedACs.empty()) {
return false;
} else if (myFirstInspectedAC == AC) {
return true;
} else {
return myInspectedACs.find(AC) != myInspectedACs.end();
}
}
bool
GNEViewNetHelper::InspectedElements::isACInspected(const GNEAttributeCarrier* AC) const {
if (myInspectedACs.empty()) {
return false;
} else if (myFirstInspectedAC == AC) {
return true;
} else {
return myInspectedACs.find(const_cast<GNEAttributeCarrier*>(AC)) != myInspectedACs.end();
}
}
bool
GNEViewNetHelper::InspectedElements::isInspectingElements() const {
return myInspectedACs.size() > 0;
}
bool
GNEViewNetHelper::InspectedElements::isInspectingSingleElement() const {
return myInspectedACs.size() == 1;
}
bool
GNEViewNetHelper::InspectedElements::isInspectingMultipleElements() const {
return myInspectedACs.size() > 1;
}
GNEViewNetHelper::MarkFrontElements::MarkFrontElements() {}
void
GNEViewNetHelper::MarkFrontElements::markAC(GNEAttributeCarrier* AC) {
myMarkedACs.insert(AC);
}
void
GNEViewNetHelper::MarkFrontElements::unmarkAC(GNEAttributeCarrier* AC) {
if (myMarkedACs.size() > 0) {
auto it = myMarkedACs.find(AC);
if (it != myMarkedACs.end()) {
myMarkedACs.erase(it);
}
}
}
void
GNEViewNetHelper::MarkFrontElements::unmarkAll() {
const auto copy = myMarkedACs;
for (auto& AC : copy) {
AC->unmarkForDrawingFront();
}
}
const std::unordered_set<GNEAttributeCarrier*>&
GNEViewNetHelper::MarkFrontElements::getACs() const {
return myMarkedACs;
}
GNEViewNetHelper::ViewObjectsSelector::ViewObjectsSelector(GNEViewNet* viewNet) :
myViewNet(viewNet) {
}
void
GNEViewNetHelper::ViewObjectsSelector::updateObjects() {
myViewObjects.clearElements();
myViewObjects.reserve(gViewObjectsHandler.getNumberOfSelectedObjects());
processGUIGlObjects(gViewObjectsHandler.getSelectedObjects());
}
void
GNEViewNetHelper::ViewObjectsSelector::updateMergingJunctions() {
myMergingJunctions = gViewObjectsHandler.getMergingJunctions();
}
void
GNEViewNetHelper::ViewObjectsSelector::fillSumoBaseObject(CommonXMLStructure::SumoBaseObject* baseObjet) const {
if (myViewObjects.junctions.size() > 0) {
baseObjet->addParentID(SUMO_TAG_JUNCTION, myViewObjects.junctions.front()->getID());
}
if (myViewObjects.edges.size() > 0) {
baseObjet->addParentID(SUMO_TAG_EDGE, myViewObjects.edges.front()->getID());
}
if (myViewObjects.lanes.size() > 0) {
baseObjet->addParentID(SUMO_TAG_LANE, myViewObjects.lanes.front()->getID());
}
if (myViewObjects.crossings.size() > 0) {
baseObjet->addParentID(SUMO_TAG_CROSSING, myViewObjects.crossings.front()->getID());
}
if (myViewObjects.connections.size() > 0) {
baseObjet->addParentID(SUMO_TAG_CONNECTION, myViewObjects.connections.front()->getID());
}
if (myViewObjects.walkingAreas.size() > 0) {
baseObjet->addParentID(SUMO_TAG_WALKINGAREA, myViewObjects.walkingAreas.front()->getID());
}
if (myViewObjects.lanes.size() > 0) {
baseObjet->addParentID(SUMO_TAG_LANE, myViewObjects.lanes.front()->getID());
}
if (myViewObjects.additionals.size() > 0) {
baseObjet->addParentID(myViewObjects.additionals.front()->getTagProperty()->getTag(), myViewObjects.additionals.front()->getID());
}
if (myViewObjects.demandElements.size() > 0) {
baseObjet->addParentID(myViewObjects.demandElements.front()->getTagProperty()->getTag(), myViewObjects.demandElements.front()->getID());
}
if (myViewObjects.genericDatas.size() > 0) {
baseObjet->addParentID(myViewObjects.genericDatas.front()->getTagProperty()->getTag(), myViewObjects.genericDatas.front()->getID());
}
}
void
GNEViewNetHelper::ViewObjectsSelector::filterAllExcept(GUIGlObjectType exception) {
std::vector<const GUIGlObject*> glElements;
for (const auto& glElement : myViewObjects.GUIGlObjects) {
if (glElement->getType() != exception) {
glElements.push_back(glElement);
}
}
myViewObjects.filterElements(glElements);
}
void
GNEViewNetHelper::ViewObjectsSelector::filterBySuperMode() {
if (myViewNet->getEditModes().isCurrentSupermodeNetwork()) {
filterDemandElements(true);
filterDataElements();
} else if (myViewNet->getEditModes().isCurrentSupermodeDemand()) {
filterNetworkElements();
filterAdditionals(true, true);
filterDataElements();
} else if (myViewNet->getEditModes().isCurrentSupermodeData()) {
filterNetworkElements();
filterDemandElements(true);
}
}
void
GNEViewNetHelper::ViewObjectsSelector::filterJunctions() {
std::vector<const GUIGlObject*> junctions;
for (const auto& junction : myViewObjects.junctions) {
junctions.push_back(junction);
}
myViewObjects.filterElements(junctions);
}
void
GNEViewNetHelper::ViewObjectsSelector::filterEdges() {
std::vector<const GUIGlObject*> edges;
for (const auto& edge : myViewObjects.edges) {
edges.push_back(edge);
}
myViewObjects.filterElements(edges);
}
void
GNEViewNetHelper::ViewObjectsSelector::filterLanes() {
std::vector<const GUIGlObject*> lanes;
for (const auto& lane : myViewObjects.lanes) {
lanes.push_back(lane);
}
myViewObjects.filterElements(lanes);
}
void
GNEViewNetHelper::ViewObjectsSelector::filterConnections() {
std::vector<const GUIGlObject*> connections;
for (const auto& connection : myViewObjects.connections) {
connections.push_back(connection);
}
myViewObjects.filterElements(connections);
}
void
GNEViewNetHelper::ViewObjectsSelector::filterCrossings() {
std::vector<const GUIGlObject*> crossings;
for (const auto& crossing : myViewObjects.crossings) {
crossings.push_back(crossing);
}
myViewObjects.filterElements(crossings);
}
void
GNEViewNetHelper::ViewObjectsSelector::filterWalkingAreas() {
std::vector<const GUIGlObject*> walkingAreas;
for (const auto& walkingArea : myViewObjects.walkingAreas) {
walkingAreas.push_back(walkingArea);
}
myViewObjects.filterElements(walkingAreas);
}
void
GNEViewNetHelper::ViewObjectsSelector::filterShapes() {
std::vector<const GUIGlObject*> shapes;
for (const auto& poly : myViewObjects.polys) {
shapes.push_back(poly);
}
for (const auto& POI : myViewObjects.POIs) {
shapes.push_back(POI);
}
myViewObjects.filterElements(shapes);
}
void
GNEViewNetHelper::ViewObjectsSelector::filterAdditionals(const bool includeStoppigPlaces, const bool includeTAZs) {
std::vector<const GUIGlObject*> additionals;
for (const auto& additional : myViewObjects.additionals) {
if (!includeStoppigPlaces && (additional->getType() > GLO_STOPPING_PLACE) && (additional->getType() < GLO_STOPPING_PLACE_LAST)) {
continue;
} else if (!includeTAZs && (additional->getType() == GLO_TAZ)) {
continue;
} else {
additionals.push_back(additional);
}
}
myViewObjects.filterElements(additionals);
}
void
GNEViewNetHelper::ViewObjectsSelector::filterNetworkElements() {
std::vector<const GUIGlObject*> networkElements;
for (const auto& networkElement : myViewObjects.networkElements) {
networkElements.push_back(networkElement);
}
myViewObjects.filterElements(networkElements);
}
void
GNEViewNetHelper::ViewObjectsSelector::filterDemandElements(const bool includeRoutes) {
std::vector<const GUIGlObject*> demandElements;
for (const auto& demandElement : myViewObjects.demandElements) {
if (!includeRoutes && (demandElement->getType() == GLO_ROUTE)) {
continue;
} else {
demandElements.push_back(demandElement);
}
}
myViewObjects.filterElements(demandElements);
}
void
GNEViewNetHelper::ViewObjectsSelector::filterDataElements() {
std::vector<const GUIGlObject*> datadElements;
for (const auto& datadElement : myViewObjects.edgeDatas) {
datadElements.push_back(datadElement);
}
for (const auto& datadElement : myViewObjects.edgeRelDatas) {
datadElements.push_back(datadElement);
}
for (const auto& datadElement : myViewObjects.TAZRelDatas) {
datadElements.push_back(datadElement);
}
myViewObjects.filterElements(datadElements);
}
void
GNEViewNetHelper::ViewObjectsSelector::filterLockedElements(const std::vector<GUIGlObjectType> ignoreFilter) {
std::vector<const GUIGlObject*> GUIGlObjects;
for (const auto& GUIGlObject : myViewObjects.GUIGlObjects) {
if (GUIGlObject->isGLObjectLocked()) {
GUIGlObjects.push_back(GUIGlObject);
}
}
for (const auto& ignoredType : ignoreFilter) {
auto it = GUIGlObjects.begin();
while (it != GUIGlObjects.end()) {
if ((*it)->getType() == ignoredType) {
it = GUIGlObjects.erase(it);
} else {
it++;
}
}
}
myViewObjects.filterElements(GUIGlObjects);
}
const GUIGlObject*
GNEViewNetHelper::ViewObjectsSelector::getGUIGlObjectFront() const {
if (myViewObjects.GUIGlObjects.size() > 0) {
return myViewObjects.GUIGlObjects.front();
} else {
return nullptr;
}
}
GNEAttributeCarrier*
GNEViewNetHelper::ViewObjectsSelector::getAttributeCarrierFront() const {
if (myViewObjects.attributeCarriers.size() > 0) {
return myViewObjects.attributeCarriers.front();
} else {
return nullptr;
}
}
GNENetworkElement*
GNEViewNetHelper::ViewObjectsSelector::getNetworkElementFront() const {
if (myViewObjects.networkElements.size() > 0) {
return myViewObjects.networkElements.front();
} else {
return nullptr;
}
}
GNEAdditional*
GNEViewNetHelper::ViewObjectsSelector::getAdditionalFront() const {
if (myViewObjects.additionals.size() > 0) {
return myViewObjects.additionals.front();
} else {
return nullptr;
}
}
GNEDemandElement*
GNEViewNetHelper::ViewObjectsSelector::getDemandElementFront() const {
if (myViewObjects.demandElements.size() > 0) {
return myViewObjects.demandElements.front();
} else {
return nullptr;
}
}
GNEGenericData*
GNEViewNetHelper::ViewObjectsSelector::getGenericDataElementFront() const {
if (myViewObjects.genericDatas.size() > 0) {
return myViewObjects.genericDatas.front();
} else {
return nullptr;
}
}
GNEJunction*
GNEViewNetHelper::ViewObjectsSelector::getJunctionFront() const {
if (myViewObjects.junctions.size() > 0) {
return myViewObjects.junctions.front();
} else {
return nullptr;
}
}
GNEEdge*
GNEViewNetHelper::ViewObjectsSelector::getEdgeFront() const {
if (myViewObjects.edges.size() > 0) {
return myViewObjects.edges.front();
} else {
return nullptr;
}
}
GNELane*
GNEViewNetHelper::ViewObjectsSelector::getLaneFront() const {
if (myViewObjects.lanes.size() > 0) {
return myViewObjects.lanes.front();
} else {
return nullptr;
}
}
GNELane*
GNEViewNetHelper::ViewObjectsSelector::getLaneFrontNonLocked() const {
if (myViewObjects.lanes.size() > 0) {
for (auto& lane : myViewObjects.lanes) {
if (!(lane->isAttributeCarrierSelected() || lane->getParentEdge()->isAttributeCarrierSelected()) ||
!myViewNet->getViewParent()->getGNEAppWindows()->getLockMenuCommands().menuCheckLockSelectedElements->getCheck()) {
return lane;
}
}
return nullptr;
} else {
return nullptr;
}
}
const std::vector<GNELane*>&
GNEViewNetHelper::ViewObjectsSelector::getLanes() const {
return myViewObjects.lanes;
}
GNECrossing*
GNEViewNetHelper::ViewObjectsSelector::getCrossingFront() const {
if (myViewObjects.crossings.size() > 0) {
return myViewObjects.crossings.front();
} else {
return nullptr;
}
}
GNEWalkingArea*
GNEViewNetHelper::ViewObjectsSelector::getWalkingAreaFront() const {
if (myViewObjects.walkingAreas.size() > 0) {
return myViewObjects.walkingAreas.front();
} else {
return nullptr;
}
}
GNEConnection*
GNEViewNetHelper::ViewObjectsSelector::getConnectionFront() const {
if (myViewObjects.connections.size() > 0) {
return myViewObjects.connections.front();
} else {
return nullptr;
}
}
GNEInternalLane*
GNEViewNetHelper::ViewObjectsSelector::getInternalLaneFront() const {
if (myViewObjects.internalLanes.size() > 0) {
return myViewObjects.internalLanes.front();
} else {
return nullptr;
}
}
GNEPOI*
GNEViewNetHelper::ViewObjectsSelector::getPOIFront() const {
if (myViewObjects.POIs.size() > 0) {
return myViewObjects.POIs.front();
} else {
return nullptr;
}
}
GNEPoly*
GNEViewNetHelper::ViewObjectsSelector::getPolyFront() const {
if (myViewObjects.polys.size() > 0) {
return myViewObjects.polys.front();
} else {
return nullptr;
}
}
GNETAZ*
GNEViewNetHelper::ViewObjectsSelector::getTAZFront() const {
if (myViewObjects.TAZs.size() > 0) {
return myViewObjects.TAZs.front();
} else {
return nullptr;
}
}
GNEEdgeData*
GNEViewNetHelper::ViewObjectsSelector::getEdgeDataElementFront() const {
if (myViewObjects.edgeDatas.size() > 0) {
return myViewObjects.edgeDatas.front();
} else {
return nullptr;
}
}
GNEEdgeRelData*
GNEViewNetHelper::ViewObjectsSelector::getEdgeRelDataElementFront() const {
if (myViewObjects.edgeRelDatas.size() > 0) {
return myViewObjects.edgeRelDatas.front();
} else {
return nullptr;
}
}
GNETAZRelData*
GNEViewNetHelper::ViewObjectsSelector::getTAZRelDataElementFront() const {
if (myViewObjects.TAZRelDatas.size() > 0) {
return myViewObjects.TAZRelDatas.front();
} else {
return nullptr;
}
}
const std::vector<GUIGlObject*>&
GNEViewNetHelper::ViewObjectsSelector::getGLObjects() const {
return myViewObjects.GUIGlObjects;
}
const std::vector<GNEAttributeCarrier*>&
GNEViewNetHelper::ViewObjectsSelector::getAttributeCarriers() const {
return myViewObjects.attributeCarriers;
}
const std::vector<GNEJunction*>&
GNEViewNetHelper::ViewObjectsSelector::getJunctions() const {
return myViewObjects.junctions;
}
const std::vector<GNEEdge*>&
GNEViewNetHelper::ViewObjectsSelector::getEdges() const {
return myViewObjects.edges;
}
const std::vector<GNETAZ*>&
GNEViewNetHelper::ViewObjectsSelector::getTAZs() const {
return myViewObjects.TAZs;
}
const std::vector<GNEAdditional*>&
GNEViewNetHelper::ViewObjectsSelector::getAdditionals() const {
return myViewObjects.additionals;
}
const std::vector<GNEDemandElement*>&
GNEViewNetHelper::ViewObjectsSelector::getDemandElements() const {
return myViewObjects.demandElements;
}
const std::vector<const GNEJunction*>&
GNEViewNetHelper::ViewObjectsSelector::getMergingJunctions() const {
return myMergingJunctions;
}
GNEViewNetHelper::ViewObjectsSelector::ViewObjectsContainer::ViewObjectsContainer() {}
void
GNEViewNetHelper::ViewObjectsSelector::ViewObjectsContainer::clearElements() {
GUIGlObjects.clear();
attributeCarriers.clear();
networkElements.clear();
additionals.clear();
demandElements.clear();
junctions.clear();
edges.clear();
lanes.clear();
crossings.clear();
walkingAreas.clear();
connections.clear();
internalLanes.clear();
TAZs.clear();
POIs.clear();
polys.clear();
genericDatas.clear();
edgeDatas.clear();
edgeRelDatas.clear();
TAZRelDatas.clear();
}
void
GNEViewNetHelper::ViewObjectsSelector::ViewObjectsContainer::reserve(int size) {
GUIGlObjects.reserve(size);
attributeCarriers.reserve(size);
networkElements.reserve(size);
additionals.reserve(size);
demandElements.reserve(size);
junctions.reserve(size);
edges.reserve(size);
lanes.reserve(size);
crossings.reserve(size);
walkingAreas.reserve(size);
connections.reserve(size);
internalLanes.reserve(size);
TAZs.reserve(size);
POIs.reserve(size);
polys.reserve(size);
genericDatas.reserve(size);
edgeDatas.reserve(size);
edgeRelDatas.reserve(size);
TAZRelDatas.reserve(size);
}
void
GNEViewNetHelper::ViewObjectsSelector::ViewObjectsContainer::filterElements(const std::vector<const GUIGlObject*>& objects) {
for (const auto& object : objects) {
auto itGlObjects = GUIGlObjects.begin();
while (itGlObjects != GUIGlObjects.end()) {
if (*itGlObjects == object) {
itGlObjects = GUIGlObjects.erase(itGlObjects);
} else {
itGlObjects++;
}
}
auto itACs = attributeCarriers.begin();
while (itACs != attributeCarriers.end()) {
if ((*itACs)->getGUIGlObject() == object) {
itACs = attributeCarriers.erase(itACs);
} else {
itACs++;
}
}
auto itNetworkElements = networkElements.begin();
while (itNetworkElements != networkElements.end()) {
if ((*itNetworkElements)->getGUIGlObject() == object) {
itNetworkElements = networkElements.erase(itNetworkElements);
} else {
itNetworkElements++;
}
}
auto itAdditionals = additionals.begin();
while (itAdditionals != additionals.end()) {
if ((*itAdditionals)->getGUIGlObject() == object) {
itAdditionals = additionals.erase(itAdditionals);
} else {
itAdditionals++;
}
}
auto itDemandElements = demandElements.begin();
while (itDemandElements != demandElements.end()) {
if ((*itDemandElements)->getGUIGlObject() == object) {
itDemandElements = demandElements.erase(itDemandElements);
} else {
itDemandElements++;
}
}
auto itGenericDatas = genericDatas.begin();
while (itGenericDatas != genericDatas.end()) {
if ((*itGenericDatas)->getGUIGlObject() == object) {
itGenericDatas = genericDatas.erase(itGenericDatas);
} else {
itGenericDatas++;
}
}
auto itJunctions = junctions.begin();
while (itJunctions != junctions.end()) {
if ((*itJunctions)->getGUIGlObject() == object) {
itJunctions = junctions.erase(itJunctions);
} else {
itJunctions++;
}
}
auto itEdges = edges.begin();
while (itEdges != edges.end()) {
if ((*itEdges)->getGUIGlObject() == object) {
itEdges = edges.erase(itEdges);
} else {
itEdges++;
}
}
auto itLanes = lanes.begin();
while (itLanes != lanes.end()) {
if ((*itLanes)->getGUIGlObject() == object) {
itLanes = lanes.erase(itLanes);
} else {
itLanes++;
}
}
auto itCrossings = crossings.begin();
while (itCrossings != crossings.end()) {
if ((*itCrossings)->getGUIGlObject() == object) {
itCrossings = crossings.erase(itCrossings);
} else {
itCrossings++;
}
}
auto itWalkingAreas = walkingAreas.begin();
while (itWalkingAreas != walkingAreas.end()) {
if ((*itWalkingAreas)->getGUIGlObject() == object) {
itWalkingAreas = walkingAreas.erase(itWalkingAreas);
} else {
itWalkingAreas++;
}
}
auto itConnections = connections.begin();
while (itConnections != connections.end()) {
if ((*itConnections)->getGUIGlObject() == object) {
itConnections = connections.erase(itConnections);
} else {
itConnections++;
}
}
auto itInternalLanes = internalLanes.begin();
while (itInternalLanes != internalLanes.end()) {
if ((*itInternalLanes)->getGUIGlObject() == object) {
itInternalLanes = internalLanes.erase(itInternalLanes);
} else {
itInternalLanes++;
}
}
auto itTAZs = TAZs.begin();
while (itTAZs != TAZs.end()) {
if ((*itTAZs)->getGUIGlObject() == object) {
itTAZs = TAZs.erase(itTAZs);
} else {
itTAZs++;
}
}
auto itPOIs = POIs.begin();
while (itPOIs != POIs.end()) {
if ((*itPOIs)->getGUIGlObject() == object) {
itPOIs = POIs.erase(itPOIs);
} else {
itPOIs++;
}
}
auto itPolys = polys.begin();
while (itPolys != polys.end()) {
if ((*itPolys)->getGUIGlObject() == object) {
itPolys = polys.erase(itPolys);
} else {
itPolys++;
}
}
auto itEdgeDatas = edgeDatas.begin();
while (itEdgeDatas != edgeDatas.end()) {
if ((*itEdgeDatas)->getGUIGlObject() == object) {
itEdgeDatas = edgeDatas.erase(itEdgeDatas);
} else {
itEdgeDatas++;
}
}
auto itEdgeRelDatas = edgeRelDatas.begin();
while (itEdgeRelDatas != edgeRelDatas.end()) {
if ((*itEdgeRelDatas)->getGUIGlObject() == object) {
itEdgeRelDatas = edgeRelDatas.erase(itEdgeRelDatas);
} else {
itEdgeRelDatas++;
}
}
auto itTAZRelDatas = TAZRelDatas.begin();
while (itTAZRelDatas != TAZRelDatas.end()) {
if ((*itTAZRelDatas)->getGUIGlObject() == object) {
itTAZRelDatas = TAZRelDatas.erase(itTAZRelDatas);
} else {
itTAZRelDatas++;
}
}
}
}
void
GNEViewNetHelper::ViewObjectsSelector::updateNetworkElements(ViewObjectsContainer& container, const GUIGlObject* glObject) {
switch (glObject->getType()) {
case GLO_JUNCTION: {
auto junction = myViewNet->getNet()->getAttributeCarriers()->retrieveJunction(glObject->getMicrosimID());
if (junction->isMarkedForDrawingFront()) {
container.junctions.insert(container.junctions.begin(), junction);
container.networkElements.insert(container.networkElements.begin(), junction);
container.attributeCarriers.insert(container.attributeCarriers.begin(), junction);
container.GUIGlObjects.insert(container.GUIGlObjects.begin(), junction);
} else {
container.junctions.push_back(junction);
container.networkElements.push_back(junction);
container.attributeCarriers.push_back(junction);
container.GUIGlObjects.push_back(junction);
}
break;
}
case GLO_EDGE: {
auto edge = myViewNet->getNet()->getAttributeCarriers()->retrieveEdge(glObject->getMicrosimID());
if (edge->isMarkedForDrawingFront()) {
container.edges.insert(container.edges.begin(), edge);
container.networkElements.insert(container.networkElements.begin(), edge);
container.attributeCarriers.insert(container.attributeCarriers.begin(), edge);
container.GUIGlObjects.insert(container.GUIGlObjects.begin(), edge);
} else {
container.edges.push_back(edge);
container.networkElements.push_back(edge);
container.attributeCarriers.push_back(edge);
container.GUIGlObjects.push_back(edge);
}
break;
}
case GLO_LANE: {
auto lane = myViewNet->getNet()->getAttributeCarriers()->retrieveLane(glObject);
if (lane->isMarkedForDrawingFront()) {
container.lanes.insert(container.lanes.begin(), lane);
container.networkElements.insert(container.networkElements.begin(), lane);
container.attributeCarriers.insert(container.attributeCarriers.begin(), lane);
container.GUIGlObjects.insert(container.GUIGlObjects.begin(), lane);
} else {
container.lanes.push_back(lane);
container.networkElements.push_back(lane);
container.attributeCarriers.push_back(lane);
container.GUIGlObjects.push_back(lane);
}
break;
}
case GLO_CROSSING: {
auto crossing = myViewNet->getNet()->getAttributeCarriers()->retrieveCrossing(glObject);
if (crossing->isMarkedForDrawingFront()) {
container.crossings.insert(container.crossings.begin(), crossing);
container.networkElements.insert(container.networkElements.begin(), crossing);
container.attributeCarriers.insert(container.attributeCarriers.begin(), crossing);
container.GUIGlObjects.insert(container.GUIGlObjects.begin(), crossing);
} else {
container.crossings.push_back(crossing);
container.networkElements.push_back(crossing);
container.attributeCarriers.push_back(crossing);
container.GUIGlObjects.push_back(crossing);
}
break;
}
case GLO_WALKINGAREA: {
auto walkingArea = myViewNet->getNet()->getAttributeCarriers()->retrieveWalkingArea(glObject);
if (walkingArea->isMarkedForDrawingFront()) {
container.walkingAreas.insert(container.walkingAreas.begin(), walkingArea);
container.networkElements.insert(container.networkElements.begin(), walkingArea);
container.attributeCarriers.insert(container.attributeCarriers.begin(), walkingArea);
container.GUIGlObjects.insert(container.GUIGlObjects.begin(), walkingArea);
} else {
container.walkingAreas.push_back(walkingArea);
container.networkElements.push_back(walkingArea);
container.attributeCarriers.push_back(walkingArea);
container.GUIGlObjects.push_back(walkingArea);
}
break;
}
case GLO_CONNECTION: {
auto connection = myViewNet->getNet()->getAttributeCarriers()->retrieveConnection(glObject);
if (connection->isMarkedForDrawingFront()) {
container.connections.insert(container.connections.begin(), connection);
container.networkElements.insert(container.networkElements.begin(), connection);
container.attributeCarriers.insert(container.attributeCarriers.begin(), connection);
container.GUIGlObjects.insert(container.GUIGlObjects.begin(), connection);
} else {
container.connections.push_back(connection);
container.networkElements.push_back(connection);
container.attributeCarriers.push_back(connection);
container.GUIGlObjects.push_back(connection);
}
break;
}
case GLO_TLLOGIC: {
auto internalLane = myViewNet->getNet()->getAttributeCarriers()->retrieveInternalLane(glObject);
if (internalLane->isMarkedForDrawingFront()) {
container.internalLanes.insert(container.internalLanes.begin(), internalLane);
container.attributeCarriers.insert(container.attributeCarriers.begin(), internalLane);
container.GUIGlObjects.insert(container.GUIGlObjects.begin(), internalLane);
} else {
container.internalLanes.push_back(internalLane);
container.attributeCarriers.push_back(internalLane);
container.GUIGlObjects.push_back(internalLane);
}
break;
}
default:
break;
}
}
void
GNEViewNetHelper::ViewObjectsSelector::updateAdditionalElements(ViewObjectsContainer& container, const GUIGlObject* glObject) {
auto additionalElement = myViewNet->getNet()->getAttributeCarriers()->retrieveAdditional(glObject, false);
if (additionalElement) {
if (additionalElement->isMarkedForDrawingFront()) {
container.additionals.insert(container.additionals.begin(), additionalElement);
container.attributeCarriers.insert(container.attributeCarriers.begin(), additionalElement);
container.GUIGlObjects.insert(container.GUIGlObjects.begin(), additionalElement);
} else {
container.additionals.push_back(additionalElement);
container.attributeCarriers.push_back(additionalElement);
container.GUIGlObjects.push_back(additionalElement);
}
}
}
void
GNEViewNetHelper::ViewObjectsSelector::updateShapeElements(ViewObjectsContainer& container, const GUIGlObject* glObject) {
if (glObject->getType() == GLO_POI) {
auto POI = dynamic_cast<GNEPOI*>(myViewNet->getNet()->getAttributeCarriers()->retrieveAdditional(glObject));
if (POI->isMarkedForDrawingFront()) {
container.POIs.insert(container.POIs.begin(), POI);
} else {
container.POIs.push_back(POI);
}
} else if ((glObject->getType() == GLO_POLYGON) || (glObject->getType() == GLO_JPS_WALKABLEAREA) || (glObject->getType() == GLO_JPS_OBSTACLE)) {
auto poly = dynamic_cast<GNEPoly*>(myViewNet->getNet()->getAttributeCarriers()->retrieveAdditional(glObject));
if (poly->isMarkedForDrawingFront()) {
container.polys.insert(container.polys.begin(), poly);
} else {
container.polys.push_back(poly);
}
}
}
void
GNEViewNetHelper::ViewObjectsSelector::updateTAZElements(ViewObjectsContainer& container, const GUIGlObject* glObject) {
if (glObject->getType() == GLO_TAZ) {
auto TAZ = dynamic_cast<GNETAZ*>(myViewNet->getNet()->getAttributeCarriers()->retrieveAdditional(glObject));
if (TAZ->isMarkedForDrawingFront()) {
container.TAZs.insert(container.TAZs.begin(), TAZ);
} else {
container.TAZs.push_back(TAZ);
}
}
}
void
GNEViewNetHelper::ViewObjectsSelector::updateDemandElements(ViewObjectsContainer& container, const GUIGlObject* glObject) {
GNEDemandElement* demandElement = myViewNet->getNet()->getAttributeCarriers()->retrieveDemandElement(glObject, false);
if (demandElement) {
if (demandElement->isMarkedForDrawingFront()) {
container.demandElements.insert(container.demandElements.begin(), demandElement);
container.attributeCarriers.insert(container.attributeCarriers.begin(), demandElement);
container.GUIGlObjects.insert(container.GUIGlObjects.begin(), demandElement);
} else {
container.demandElements.push_back(demandElement);
container.attributeCarriers.push_back(demandElement);
container.GUIGlObjects.push_back(demandElement);
}
}
}
void
GNEViewNetHelper::ViewObjectsSelector::updateGenericDataElements(ViewObjectsContainer& container, const GUIGlObject* glObject) {
switch (glObject->getType()) {
case GLO_EDGEDATA: {
auto edgeData = dynamic_cast<GNEEdgeData*>(myViewNet->getNet()->getAttributeCarriers()->retrieveGenericData(glObject));
if (edgeData->isMarkedForDrawingFront()) {
container.edgeDatas.insert(container.edgeDatas.begin(), edgeData);
container.genericDatas.insert(container.genericDatas.begin(), edgeData);
container.attributeCarriers.insert(container.attributeCarriers.begin(), edgeData);
container.GUIGlObjects.insert(container.GUIGlObjects.begin(), edgeData);
} else {
container.edgeDatas.push_back(edgeData);
container.genericDatas.push_back(edgeData);
container.attributeCarriers.push_back(edgeData);
container.GUIGlObjects.push_back(edgeData);
}
break;
}
case GLO_EDGERELDATA: {
auto edgeRelData = dynamic_cast<GNEEdgeRelData*>(myViewNet->getNet()->getAttributeCarriers()->retrieveGenericData(glObject));
if (edgeRelData->isMarkedForDrawingFront()) {
container.edgeRelDatas.insert(container.edgeRelDatas.begin(), edgeRelData);
container.genericDatas.insert(container.genericDatas.begin(), edgeRelData);
container.attributeCarriers.insert(container.attributeCarriers.begin(), edgeRelData);
container.GUIGlObjects.insert(container.GUIGlObjects.begin(), edgeRelData);
} else {
container.edgeRelDatas.push_back(edgeRelData);
container.genericDatas.push_back(edgeRelData);
container.attributeCarriers.push_back(edgeRelData);
container.GUIGlObjects.push_back(edgeRelData);
}
break;
}
case GLO_TAZRELDATA: {
auto TAZRelData = dynamic_cast<GNETAZRelData*>(myViewNet->getNet()->getAttributeCarriers()->retrieveGenericData(glObject));
if (TAZRelData->isMarkedForDrawingFront()) {
container.TAZRelDatas.insert(container.TAZRelDatas.begin(), TAZRelData);
container.genericDatas.insert(container.genericDatas.begin(), TAZRelData);
container.attributeCarriers.insert(container.attributeCarriers.begin(), TAZRelData);
container.GUIGlObjects.insert(container.GUIGlObjects.begin(), TAZRelData);
} else {
container.TAZRelDatas.push_back(TAZRelData);
container.genericDatas.push_back(TAZRelData);
container.attributeCarriers.push_back(TAZRelData);
container.GUIGlObjects.push_back(TAZRelData);
}
break;
}
default:
break;
}
}
void
GNEViewNetHelper::ViewObjectsSelector::processGUIGlObjects(const GUIViewObjectsHandler::GLObjectsSortedContainer& objectsContainer) {
for (const auto& glObjectLayer : objectsContainer) {
for (const auto& glObject : glObjectLayer.second) {
updateNetworkElements(myViewObjects, glObject.object);
updateAdditionalElements(myViewObjects, glObject.object);
updateShapeElements(myViewObjects, glObject.object);
updateTAZElements(myViewObjects, glObject.object);
updateDemandElements(myViewObjects, glObject.object);
updateGenericDataElements(myViewObjects, glObject.object);
}
}
}
GNEViewNetHelper::ViewObjectsSelector::ViewObjectsSelector() :
myViewNet(nullptr) {
}
GNEViewNetHelper::MouseButtonKeyPressed::MouseButtonKeyPressed() :
myEventInfo(nullptr) {
}
void
GNEViewNetHelper::MouseButtonKeyPressed::update(void* eventData) {
myEventInfo = (FXEvent*) eventData;
}
bool
GNEViewNetHelper::MouseButtonKeyPressed::shiftKeyPressed() const {
if (myEventInfo) {
return (myEventInfo->state & SHIFTMASK) != 0;
} else {
return false;
}
}
bool
GNEViewNetHelper::MouseButtonKeyPressed::controlKeyPressed() const {
if (myEventInfo) {
return (myEventInfo->state & CONTROLMASK) != 0;
} else {
return false;
}
}
bool
GNEViewNetHelper::MouseButtonKeyPressed::altKeyPressed() const {
if (myEventInfo) {
return (myEventInfo->state & ALTMASK) != 0;
} else {
return false;
}
}
bool
GNEViewNetHelper::MouseButtonKeyPressed::mouseLeftButtonPressed() const {
if (myEventInfo) {
return (myEventInfo->state & LEFTBUTTONMASK) != 0;
} else {
return false;
}
}
bool
GNEViewNetHelper::MouseButtonKeyPressed::mouseRightButtonPressed() const {
if (myEventInfo) {
return (myEventInfo->state & RIGHTBUTTONMASK) != 0;
} else {
return false;
}
}
GNEViewNetHelper::MoveSingleElementModul::MoveSingleElementModul(GNEViewNet* viewNet) :
myViewNet(viewNet) {
}
bool
GNEViewNetHelper::MoveSingleElementModul::beginMoveNetworkElementShape() {
myRelativeClickedPosition = myViewNet->getPositionInformation();
const GNENetworkElement* editedElement = myViewNet->myEditNetworkElementShapes.getEditedNetworkElement();
if (myViewNet->myViewObjectsSelector.getJunctionFront() && (myViewNet->myViewObjectsSelector.getJunctionFront() == editedElement)) {
GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getJunctionFront()->getMoveOperation();
if (moveOperation) {
myMoveOperation = moveOperation;
return true;
} else {
return false;
}
} else if (myViewNet->myViewObjectsSelector.getLaneFront() && (myViewNet->myViewObjectsSelector.getLaneFront() == editedElement)) {
GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getLaneFront()->getMoveOperation();
if (moveOperation) {
myMoveOperation = moveOperation;
return true;
} else {
return false;
}
} else if (myViewNet->myViewObjectsSelector.getCrossingFront() && (myViewNet->myViewObjectsSelector.getCrossingFront() == editedElement)) {
GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getCrossingFront()->getMoveOperation();
if (moveOperation) {
myMoveOperation = moveOperation;
return true;
} else {
return false;
}
} else if (myViewNet->myViewObjectsSelector.getConnectionFront() && (myViewNet->myViewObjectsSelector.getConnectionFront() == editedElement)) {
GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getConnectionFront()->getMoveOperation();
if (moveOperation) {
myMoveOperation = moveOperation;
return true;
} else {
return false;
}
} else if (myViewNet->myViewObjectsSelector.getWalkingAreaFront() && (myViewNet->myViewObjectsSelector.getWalkingAreaFront() == editedElement)) {
GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getWalkingAreaFront()->getMoveOperation();
if (moveOperation) {
myMoveOperation = moveOperation;
return true;
} else {
return false;
}
} else {
return false;
}
}
bool
GNEViewNetHelper::MoveSingleElementModul::beginMoveSingleElementNetworkMode() {
myRelativeClickedPosition = myViewNet->getPositionInformation();
const GNEAttributeCarrier* markAC = myViewNet->myViewObjectsSelector.getAttributeCarrierFront();
if (myViewNet->myViewObjectsSelector.getPolyFront() && (markAC == myViewNet->myViewObjectsSelector.getPolyFront())) {
GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getPolyFront()->getMoveOperation();
if (moveOperation) {
myMoveOperation = moveOperation;
return true;
} else {
return false;
}
} else if (myViewNet->myViewObjectsSelector.getPOIFront() && (markAC == myViewNet->myViewObjectsSelector.getPOIFront())) {
GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getPOIFront()->getMoveOperation();
if (moveOperation) {
myMoveOperation = moveOperation;
return true;
} else {
return false;
}
} else if (myViewNet->myViewObjectsSelector.getAdditionalFront() && (markAC == myViewNet->myViewObjectsSelector.getAdditionalFront())) {
GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getAdditionalFront()->getMoveOperation();
if (moveOperation) {
myMoveOperation = moveOperation;
return true;
} else {
return false;
}
} else if (myViewNet->myViewObjectsSelector.getJunctionFront() && (markAC == myViewNet->myViewObjectsSelector.getJunctionFront())) {
if (myViewNet->myViewObjectsSelector.getEdgeFront() && (myViewNet->myViewObjectsSelector.getEdgeFront()->clickedOverGeometryPoint(myRelativeClickedPosition))) {
GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getEdgeFront()->getMoveOperation();
if (moveOperation) {
myMoveOperation = moveOperation;
return true;
} else {
return false;
}
} else {
GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getJunctionFront()->getMoveOperation();
if (moveOperation) {
myMoveOperation = moveOperation;
return true;
} else {
return false;
}
}
} else if (myViewNet->myViewObjectsSelector.getEdgeFront() && (markAC == myViewNet->myViewObjectsSelector.getEdgeFront())) {
if (myViewNet->myMouseButtonKeyPressed.shiftKeyPressed()) {
myViewNet->myViewObjectsSelector.getEdgeFront()->editEndpoint(myViewNet->getPositionInformation(), myViewNet->myUndoList);
return false;
} else {
GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getEdgeFront()->getMoveOperation();
if (moveOperation) {
myMoveOperation = moveOperation;
return true;
} else {
return false;
}
}
} else if (myViewNet->myViewObjectsSelector.getLaneFront() && (markAC == myViewNet->myViewObjectsSelector.getLaneFront())) {
GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getLaneFront()->getMoveOperation();
if (moveOperation) {
myMoveOperation = moveOperation;
return true;
} else {
return false;
}
} else {
return false;
}
}
bool
GNEViewNetHelper::MoveSingleElementModul::beginMoveSingleElementDemandMode() {
myRelativeClickedPosition = myViewNet->getPositionInformation();
const GNEAttributeCarrier* markAC = myViewNet->myViewObjectsSelector.getAttributeCarrierFront();
if (myViewNet->myViewObjectsSelector.getDemandElementFront() && (markAC == myViewNet->myViewObjectsSelector.getDemandElementFront())) {
GNEMoveOperation* moveOperation = myViewNet->myViewObjectsSelector.getDemandElementFront()->getMoveOperation();
if (moveOperation) {
myMoveOperation = moveOperation;
return true;
} else {
return false;
}
} else {
return false;
}
}
void
GNEViewNetHelper::MoveSingleElementModul::moveSingleElement(const bool mouseLeftButtonPressed) {
if (myMoveOperation) {
const GNEMoveOffset moveOffset = calculateMoveOffset();
if (mouseLeftButtonPressed) {
GNEMoveElement::moveElement(myViewNet, myMoveOperation, moveOffset);
} else {
GNEMoveElement::commitMove(myViewNet, myMoveOperation, moveOffset, myViewNet->getUndoList());
delete myMoveOperation;
myMoveOperation = nullptr;
}
}
}
void
GNEViewNetHelper::MoveSingleElementModul::finishMoveSingleElement() {
if (myMoveOperation) {
const GNEMoveOffset moveOffset = calculateMoveOffset();
GNEMoveElement::commitMove(myViewNet, myMoveOperation, moveOffset, myViewNet->getUndoList());
delete myMoveOperation;
myMoveOperation = nullptr;
}
}
bool
GNEViewNetHelper::MoveSingleElementModul::isCurrentlyMovingSingleElement() const {
return myMoveOperation != nullptr;
}
GNEMoveElement*
GNEViewNetHelper::MoveSingleElementModul::getMovedElement() const {
if (myMoveOperation) {
return myMoveOperation->moveElement;
} else {
return nullptr;
}
}
const GNEMoveOffset
GNEViewNetHelper::MoveSingleElementModul::calculateMoveOffset() const {
Position moveOffset = (myViewNet->getPositionInformation() - myViewNet->myMoveSingleElement.myRelativeClickedPosition);
if (myViewNet->myNetworkViewOptions.menuCheckMoveElevation->shown() && myViewNet->myNetworkViewOptions.menuCheckMoveElevation->amChecked() == TRUE) {
return GNEMoveOffset(moveOffset.y());
} else {
return GNEMoveOffset(moveOffset.x(), moveOffset.y());
}
}
GNEViewNetHelper::MoveMultipleElementModul::MoveMultipleElementModul(GNEViewNet* viewNet) :
myViewNet(viewNet),
myMovingSelectedEdge(false),
myEdgeOffset(0) {
}
void
GNEViewNetHelper::MoveMultipleElementModul::beginMoveSelection() {
myClickedPosition = myViewNet->getPositionInformation();
if (myViewNet->myViewObjectsSelector.getJunctionFront()) {
calculateJunctionSelection();
} else if (myViewNet->myViewObjectsSelector.getEdgeFront()) {
calculateEdgeSelection(myViewNet->myViewObjectsSelector.getEdgeFront());
}
myViewNet->updateViewNet();
}
void
GNEViewNetHelper::MoveMultipleElementModul::moveSelection(const bool mouseLeftButtonPressed) {
const GNEMoveOffset moveOffset = calculateMoveOffset();
if (mouseLeftButtonPressed) {
for (const auto& moveOperation : myMoveOperations) {
GNEMoveElement::moveElement(myViewNet, moveOperation, moveOffset);
}
} else if (myMoveOperations.size() > 0) {
myViewNet->getUndoList()->begin(GUIIcon::MODEMOVE, TL("moving selection"));
for (const auto& moveOperation : myMoveOperations) {
GNEMoveElement::commitMove(myViewNet, moveOperation, moveOffset, myViewNet->getUndoList());
delete moveOperation;
}
myViewNet->getUndoList()->end();
myMoveOperations.clear();
}
}
void
GNEViewNetHelper::MoveMultipleElementModul::finishMoveSelection() {
const GNEMoveOffset moveOffset = calculateMoveOffset();
myViewNet->getUndoList()->begin(GUIIcon::MODEMOVE, TL("moving selection"));
for (const auto& moveOperation : myMoveOperations) {
GNEMoveElement::commitMove(myViewNet, moveOperation, moveOffset, myViewNet->getUndoList());
delete moveOperation;
}
myViewNet->getUndoList()->end();
myMoveOperations.clear();
}
bool
GNEViewNetHelper::MoveMultipleElementModul::isMovingSelection() const {
return (myMoveOperations.size() > 0);
}
bool
GNEViewNetHelper::MoveMultipleElementModul::isMovingSelectedEdge() const {
return myMovingSelectedEdge;
}
void
GNEViewNetHelper::MoveMultipleElementModul::resetMovingSelectedEdge() {
myMovingSelectedEdge = false;
}
double
GNEViewNetHelper::MoveMultipleElementModul::getEdgeOffset() const {
return myEdgeOffset;
}
bool
GNEViewNetHelper::MoveMultipleElementModul::isCurrentlyMovingMultipleElements() const {
return myMoveOperations.size() > 0;
}
const GNEMoveOffset
GNEViewNetHelper::MoveMultipleElementModul::calculateMoveOffset() const {
Position moveOffset = (myViewNet->getPositionInformation() - myClickedPosition);
if (myViewNet->myNetworkViewOptions.menuCheckMoveElevation->shown() && myViewNet->myNetworkViewOptions.menuCheckMoveElevation->amChecked() == TRUE) {
return GNEMoveOffset(moveOffset.y());
} else {
return GNEMoveOffset(moveOffset.x(), moveOffset.y());
}
}
void
GNEViewNetHelper::MoveMultipleElementModul::calculateJunctionSelection() {
GNEMoveOperation* moveOperation = nullptr;
const auto selectedJunctions = myViewNet->getNet()->getAttributeCarriers()->getSelectedJunctions();
for (const auto& junction : selectedJunctions) {
moveOperation = junction->getMoveOperation();
if (moveOperation) {
myMoveOperations.push_back(moveOperation);
}
}
const auto selectedEdges = myViewNet->getNet()->getAttributeCarriers()->getSelectedEdges();
for (const auto& edge : selectedEdges) {
moveOperation = edge->getMoveOperation();
if (moveOperation) {
myMoveOperations.push_back(moveOperation);
}
}
}
void
GNEViewNetHelper::MoveMultipleElementModul::calculateEdgeSelection(const GNEEdge* clickedEdge) {
const auto selectedJunctions = myViewNet->getNet()->getAttributeCarriers()->getSelectedJunctions();
for (const auto& junction : selectedJunctions) {
GNEMoveOperation* moveOperation = junction->getMoveOperation();
if (moveOperation) {
myMoveOperations.push_back(moveOperation);
}
}
myMovingSelectedEdge = true;
const auto& shape = clickedEdge->getNBEdge()->getGeometry();
if (clickedEdge->isConvexAngle()) {
myEdgeOffset = shape.nearest_offset_to_point2D(myViewNet->getPositionInformation());
} else {
myEdgeOffset = shape.length2D() - shape.nearest_offset_to_point2D(myViewNet->getPositionInformation());
}
const auto selectedEdges = myViewNet->getNet()->getAttributeCarriers()->getSelectedEdges();
for (const auto& edge : selectedEdges) {
GNEMoveOperation* moveOperation = edge->getMoveOperation();
if (moveOperation) {
myMoveOperations.push_back(moveOperation);
}
}
}
GNEViewNetHelper::VehicleOptions::VehicleOptions(GNEViewNet* viewNet) :
myViewNet(viewNet) {
}
void
GNEViewNetHelper::VehicleOptions::buildVehicleOptionsMenuChecks() {
UNUSED_PARAMETER(myViewNet);
}
void
GNEViewNetHelper::VehicleOptions::hideVehicleOptionsMenuChecks() {
}
GNEViewNetHelper::VehicleTypeOptions::VehicleTypeOptions(GNEViewNet* viewNet) :
myViewNet(viewNet) {
}
void
GNEViewNetHelper::VehicleTypeOptions::buildVehicleTypeOptionsMenuChecks() {
UNUSED_PARAMETER(myViewNet);
}
void
GNEViewNetHelper::VehicleTypeOptions::hideVehicleTypeOptionsMenuChecks() {
}
GNEViewNetHelper::SelectingArea::SelectingArea(GNEViewNet* viewNet) :
selectingUsingRectangle(false),
startDrawing(false),
myViewNet(viewNet) {
}
void
GNEViewNetHelper::SelectingArea::beginRectangleSelection() {
selectingUsingRectangle = true;
selectionCorner1 = myViewNet->getPositionInformation();
selectionCorner2 = selectionCorner1;
}
void
GNEViewNetHelper::SelectingArea::moveRectangleSelection() {
startDrawing = true;
selectionCorner2 = myViewNet->getPositionInformation();
myViewNet->setStatusBarText(TL("Selection width:") + toString(fabs(selectionCorner1.x() - selectionCorner2.x()))
+ TL(" height:") + toString(fabs(selectionCorner1.y() - selectionCorner2.y()))
+ TL(" diagonal:") + toString(selectionCorner1.distanceTo2D(selectionCorner2)));
}
void
GNEViewNetHelper::SelectingArea::finishRectangleSelection() {
selectingUsingRectangle = false;
startDrawing = false;
myViewNet->setStatusBarText("");
}
void
GNEViewNetHelper::SelectingArea::processRectangleSelection() {
if ((abs(selectionCorner1.x() - selectionCorner2.x()) > 0.01) &&
(abs(selectionCorner1.y() - selectionCorner2.y()) > 0.01) &&
myViewNet->myMouseButtonKeyPressed.shiftKeyPressed()) {
Boundary rectangleBoundary;
rectangleBoundary.add(selectionCorner1);
rectangleBoundary.add(selectionCorner2);
processBoundarySelection(rectangleBoundary);
}
}
std::vector<GNEEdge*>
GNEViewNetHelper::SelectingArea::processEdgeRectangleSelection() {
if ((abs(selectionCorner1.x() - selectionCorner2.x()) > 0.01) &&
(abs(selectionCorner1.y() - selectionCorner2.y()) > 0.01) &&
myViewNet->myMouseButtonKeyPressed.shiftKeyPressed()) {
Boundary rectangleBoundary;
rectangleBoundary.add(selectionCorner1);
rectangleBoundary.add(selectionCorner2);
myViewNet->updateObjectsInShape(rectangleBoundary.getShape(false));
return myViewNet->getViewObjectsSelector().getEdges();
} else {
return {};
}
}
void
GNEViewNetHelper::SelectingArea::drawRectangleSelection(const RGBColor& color) const {
if (selectingUsingRectangle) {
GLHelper::pushMatrix();
glTranslated(0, 0, GLO_RECTANGLESELECTION);
GLHelper::setColor(color);
glLineWidth(2);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glBegin(GL_QUADS);
glVertex2d(selectionCorner1.x(), selectionCorner1.y());
glVertex2d(selectionCorner1.x(), selectionCorner2.y());
glVertex2d(selectionCorner2.x(), selectionCorner2.y());
glVertex2d(selectionCorner2.x(), selectionCorner1.y());
glEnd();
GLHelper::popMatrix();
}
}
void
GNEViewNetHelper::SelectingArea::processBoundarySelection(const Boundary& boundary) {
const bool selEdges = myViewNet->myNetworkViewOptions.selectEdges();
myViewNet->updateObjectsInShape(boundary.getShape(false));
std::vector<GNEAttributeCarrier*> ACsFiltered;
ACsFiltered.reserve(myViewNet->getViewObjectsSelector().getAttributeCarriers().size());
for (const auto& AC : myViewNet->getViewObjectsSelector().getAttributeCarriers()) {
if (!AC->getGUIGlObject()->isGLObjectLocked()) {
const auto tagProperty = AC->getTagProperty();
if (tagProperty->isNetworkElement() || tagProperty->isAdditionalElement()) {
if (((tagProperty->getTag() == SUMO_TAG_EDGE) && !selEdges) ||
((tagProperty->getTag() == SUMO_TAG_LANE) && selEdges)) {
continue;
} else {
ACsFiltered.push_back(AC);
}
} else if (tagProperty->isDemandElement()) {
ACsFiltered.push_back(AC);
} else if (tagProperty->isGenericData()) {
ACsFiltered.push_back(AC);
}
}
}
std::vector<GNEAttributeCarrier*> ACToSelect;
std::vector<GNEAttributeCarrier*> ACToUnselect;
ACToSelect.reserve(ACsFiltered.size());
ACToUnselect.reserve(ACsFiltered.size());
const auto modificationMode = myViewNet->myViewParent->getSelectorFrame()->getModificationModeModul()->getModificationMode();
if ((modificationMode == GNESelectorFrame::ModificationMode::Operation::RESTRICT) || (modificationMode == GNESelectorFrame::ModificationMode::Operation::REPLACE)) {
const auto selectedAC = myViewNet->getNet()->getAttributeCarriers()->getSelectedAttributeCarriers(false);
for (const auto& AC : selectedAC) {
ACToUnselect.push_back(AC);
}
}
for (const auto& AC : ACsFiltered) {
switch (myViewNet->myViewParent->getSelectorFrame()->getModificationModeModul()->getModificationMode()) {
case GNESelectorFrame::ModificationMode::Operation::SUB:
ACToUnselect.push_back(AC);
break;
case GNESelectorFrame::ModificationMode::Operation::RESTRICT:
if (std::find(ACToUnselect.begin(), ACToUnselect.end(), AC) != ACToUnselect.end()) {
ACToSelect.push_back(AC);
}
break;
default:
ACToSelect.push_back(AC);
break;
}
}
if (myViewNet->autoSelectNodes() && (myViewNet->myViewParent->getSelectorFrame()->getModificationModeModul()->getModificationMode() == GNESelectorFrame::ModificationMode::Operation::ADD)) {
std::vector<GNEEdge*> edgesToSelect;
for (const auto& AC : ACToSelect) {
if (AC->getTagProperty()->getTag() == SUMO_TAG_EDGE) {
edgesToSelect.push_back(dynamic_cast<GNEEdge*>(AC));
}
}
for (const auto& edge : edgesToSelect) {
ACToSelect.push_back(edge->getFromJunction());
for (const auto& connection : edge->getFromJunction()->getGNEConnections()) {
ACToSelect.push_back(connection);
}
for (const auto& crossing : edge->getFromJunction()->getGNECrossings()) {
ACToSelect.push_back(crossing);
}
ACToSelect.push_back(edge->getToJunction());
for (const auto& connection : edge->getToJunction()->getGNEConnections()) {
ACToSelect.push_back(connection);
}
for (const auto& crossing : edge->getToJunction()->getGNECrossings()) {
ACToSelect.push_back(crossing);
}
}
}
if ((ACToSelect.size() + ACToUnselect.size()) > 0) {
myViewNet->myUndoList->begin(GUIIcon::MODESELECT, TL("selection using rectangle"));
for (const auto& AC : ACToUnselect) {
AC->setAttribute(GNE_ATTR_SELECTED, "0", myViewNet->myUndoList);
}
for (const auto& AC : ACToSelect) {
if (AC->getTagProperty()->isSelectable()) {
AC->setAttribute(GNE_ATTR_SELECTED, "1", myViewNet->myUndoList);
}
}
myViewNet->myUndoList->end();
}
myViewNet->makeNonCurrent();
}
GNEViewNetHelper::TestingMode::TestingMode(GNEViewNet* viewNet) :
myViewNet(viewNet) {
}
void
GNEViewNetHelper::TestingMode::initTestingMode() {
if (OptionsCont::getOptions().getBool("gui-testing") && OptionsCont::getOptions().isSet("window-size")) {
std::vector<std::string> windowSize = OptionsCont::getOptions().getStringVector("window-size");
if ((windowSize.size() == 2) && GNEAttributeCarrier::canParse<int>(windowSize[0]) && GNEAttributeCarrier::canParse<int>(windowSize[1])) {
myTestingWidth = GNEAttributeCarrier::parse<int>(windowSize[0]);
myTestingHeight = GNEAttributeCarrier::parse<int>(windowSize[1]);
} else {
WRITE_ERRORF(TL("Invalid windows size-format: %for option 'window-size'"), toString(windowSize));
}
}
}
void
GNEViewNetHelper::TestingMode::drawTestingElements(GUIMainWindow* mainWindow) {
if (OptionsCont::getOptions().getBool("gui-testing")) {
if (myTestingWidth > 0) {
mainWindow->resize(myTestingWidth, myTestingHeight);
}
const double size = myViewNet->p2m(32);
Position center = myViewNet->screenPos2NetPos(8, 8);
GLHelper::pushMatrix();
GLHelper::setColor(RGBColor::MAGENTA);
glTranslated(center.x(), center.y(), GLO_TESTELEMENT);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glBegin(GL_QUADS);
glVertex2d(0, 0);
glVertex2d(0, -size);
glVertex2d(size, -size);
glVertex2d(size, 0);
glEnd();
GLHelper::popMatrix();
GLHelper::pushMatrix();
GLHelper::setColor(RGBColor::BLUE);
glTranslated(center.x(), center.y(), GLO_TESTELEMENT + 1);
glScaled(0.7, 0.7, 0);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glBegin(GL_QUADS);
glVertex2d(0, 0);
glVertex2d(0, -size);
glVertex2d(size, -size);
glVertex2d(size, 0);
glEnd();
GLHelper::popMatrix();
GLHelper::pushMatrix();
GLHelper::setColor(RGBColor::YELLOW);
glTranslated(center.x(), center.y(), GLO_TESTELEMENT + 2);
glScaled(0.4, 0.4, 0);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glBegin(GL_QUADS);
glVertex2d(0, 0);
glVertex2d(0, -size);
glVertex2d(size, -size);
glVertex2d(size, 0);
glEnd();
GLHelper::popMatrix();
}
}
GNEViewNetHelper::SaveElements::SaveElements(GNEViewNet* viewNet) :
myViewNet(viewNet) {
}
GNEViewNetHelper::SaveElements::~SaveElements() {
delete mySaveIndividualFilesPopup;
}
void
GNEViewNetHelper::SaveElements::buildSaveElementsButtons() {
auto gripSaveElements = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().saveElements;
auto tooltipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
mySaveNeteditConfig = new MFXButtonTooltip(gripSaveElements, tooltipMenu,
std::string("\t") + TL("Save Netedit Config") + std::string("\t") + TL("Save Netedit Config. (Ctrl+Shift+E)"), GUIIconSubSys::getIcon(GUIIcon::SAVE_NETEDITCONFIG),
myViewNet->getViewParent()->getGNEAppWindows(), MID_HOTKEY_CTRL_SHIFT_E_SAVENETEDITCONFIG, GUIDesignButtonToolbar);
mySaveNeteditConfig->create();
mySaveSumoConfig = new MFXButtonTooltip(gripSaveElements, tooltipMenu,
std::string("\t") + TL("Save Sumo Config") + std::string("\t") + TL("Save Sumo Config. (Ctrl+Shift+S)"), GUIIconSubSys::getIcon(GUIIcon::SAVE_SUMOCONFIG),
myViewNet->getViewParent()->getGNEAppWindows(), MID_HOTKEY_CTRL_SHIFT_S_SAVESUMOCONFIG, GUIDesignButtonToolbar);
mySaveSumoConfig->create();
mySaveNetwork = new MFXButtonTooltip(gripSaveElements, tooltipMenu,
std::string("\t") + TL("Save network") + std::string("\t") + TL("Save network. (Ctrl+S)"), GUIIconSubSys::getIcon(GUIIcon::SAVE_NETWORKELEMENTS),
myViewNet->getViewParent()->getGNEAppWindows(), MID_HOTKEY_CTRL_S_STOPSIMULATION_SAVENETWORK, GUIDesignButtonToolbar);
mySaveNetwork->create();
mySaveIndividualFilesPopup = new FXPopup(gripSaveElements, POPUP_VERTICAL);
mySaveIndividualFilesPopup->create();
mySaveIndividualFiles = new MFXMenuButtonTooltip(gripSaveElements, tooltipMenu,
std::string("\t") + TL("Save individual files") + std::string("\t") + TL("Save individual files."),
GUIIconSubSys::getIcon(GUIIcon::SAVE_MULTIPLE), mySaveIndividualFilesPopup, nullptr, GUIDesignButtonToolbarLocator);
mySaveIndividualFiles->create();
mySaveAdditionalElements = new MFXButtonTooltip(mySaveIndividualFilesPopup, tooltipMenu,
std::string("\t") + TL("Save additional elements") + std::string("\t") + TL("Save additional elements. (Ctrl+Shift+A)"), GUIIconSubSys::getIcon(GUIIcon::SAVE_ADDITIONALELEMENTS),
myViewNet->getViewParent()->getGNEAppWindows(), MID_HOTKEY_CTRL_SHIFT_A_SAVEADDITIONALELEMENTS, GUIDesignButtonPopup);
mySaveAdditionalElements->create();
mySaveDemandElements = new MFXButtonTooltip(mySaveIndividualFilesPopup, tooltipMenu,
std::string("\t") + TL("Save demand elements") + std::string("\t") + TL("Save demand elements. (Ctrl+Shift+D)"), GUIIconSubSys::getIcon(GUIIcon::SAVE_DEMANDELEMENTS),
myViewNet->getViewParent()->getGNEAppWindows(), MID_HOTKEY_CTRL_SHIFT_D_SAVEDEMANDELEMENTS, GUIDesignButtonPopup);
mySaveDemandElements->create();
mySaveDataElements = new MFXButtonTooltip(mySaveIndividualFilesPopup, tooltipMenu,
std::string("\t") + TL("Save data elements") + std::string("\t") + TL("Save data elements. (Ctrl+Shift+B)"), GUIIconSubSys::getIcon(GUIIcon::SAVE_DATAELEMENTS),
myViewNet->getViewParent()->getGNEAppWindows(), MID_HOTKEY_CTRL_SHIFT_B_SAVEDATAELEMENTS, GUIDesignButtonPopup);
mySaveDataElements->create();
mySaveMeanDataElements = new MFXButtonTooltip(mySaveIndividualFilesPopup, tooltipMenu,
std::string("\t") + TL("Save mean data elements") + std::string("\t") + TL("Save mean data elements. (Ctrl+Shift+M)"), GUIIconSubSys::getIcon(GUIIcon::SAVE_MEANDATAELEMENTS),
myViewNet->getViewParent()->getGNEAppWindows(), MID_HOTKEY_CTRL_SHIFT_M_SAVEMEANDATAELEMENTS, GUIDesignButtonPopup);
mySaveMeanDataElements->create();
gripSaveElements->recalc();
gripSaveElements->show();
}
void
GNEViewNetHelper::SaveElements::setSaveIndividualFiles(bool value) {
if (value) {
mySaveIndividualFiles->enable();
} else {
mySaveIndividualFiles->disable();
}
}
GNEViewNetHelper::TimeFormat::TimeFormat(GNEViewNet* viewNet) :
myViewNet(viewNet) {
}
void
GNEViewNetHelper::TimeFormat::buildTimeFormatButtons() {
mySwitchButton = new MFXButtonTooltip(myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().timeSwitch,
myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu(),
gHumanReadableTime ? "H" : "S" + std::string("\t") + TL("Switch between seconds and HH:MM:SS") + std::string("\t") + TL("Switch between seconds and HH:MM:SS"), nullptr,
myViewNet->getViewParent()->getGNEAppWindows(), MID_GNE_TOGGLE_TIMEFORMAT, GUIDesignButtonToolbar);
mySwitchButton->create();
}
void
GNEViewNetHelper::TimeFormat::switchTimeFormat() {
if (gHumanReadableTime) {
gHumanReadableTime = false;
} else {
gHumanReadableTime = true;
}
OptionsCont::getOptions().resetWritable();
OptionsCont::getOptions().set("human-readable-time", toString(gHumanReadableTime));
}
void
GNEViewNetHelper::TimeFormat::updateButtonLabel() {
if (gHumanReadableTime) {
mySwitchButton->setText("H");
} else {
mySwitchButton->setText("S");
}
}
GNEViewNetHelper::EditModes::EditModes(GNEViewNet* viewNet) :
currentSupermode(Supermode::NETWORK),
networkEditMode(NetworkEditMode::NETWORK_INSPECT),
demandEditMode(DemandEditMode::DEMAND_INSPECT),
dataEditMode(DataEditMode::DATA_INSPECT),
myViewNet(viewNet) {
auto& neteditOptions = OptionsCont::getOptions();
if (neteditOptions.getBool("new")) {
networkEditMode = NetworkEditMode::NETWORK_CREATE_EDGE;
neteditOptions.resetWritable();
neteditOptions.set("new", "false");
}
}
GNEViewNetHelper::EditModes::~EditModes() {
delete myNeteditViewsPopup;
}
void
GNEViewNetHelper::EditModes::buildSuperModeButtons() {
auto gripSupermodes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().superModes;
auto toolTipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
networkButton = new MFXCheckableButton(false, gripSupermodes, toolTipMenu,
TL("Network") + std::string("\t") + TL("Edit network elements") + std::string("\t") + TL("Set mode for editing network elements. (F2)"),
GUIIconSubSys::getIcon(GUIIcon::SUPERMODENETWORK), myViewNet, MID_HOTKEY_F2_SUPERMODE_NETWORK, GUIDesignMFXCheckableButtonSupermode);
networkButton->create();
demandButton = new MFXCheckableButton(false, gripSupermodes, toolTipMenu,
TL("Demand") + std::string("\t") + TL("Edit traffic demand elements") + std::string("\t") + TL("Set mode for editing traffic demand. (F3)"),
GUIIconSubSys::getIcon(GUIIcon::SUPERMODEDEMAND), myViewNet, MID_HOTKEY_F3_SUPERMODE_DEMAND, GUIDesignMFXCheckableButtonSupermode);
demandButton->create();
dataButton = new MFXCheckableButton(false, gripSupermodes, toolTipMenu,
TL("Data") + std::string("\t") + TL("Edit data elements") + std::string("\t") + TL("Set mode for editing data demand. (F4)"),
GUIIconSubSys::getIcon(GUIIcon::SUPERMODEDATA), myViewNet, MID_HOTKEY_F4_SUPERMODE_DATA, GUIDesignMFXCheckableButtonSupermode);
dataButton->create();
myNeteditViewsPopup = new FXPopup(gripSupermodes, POPUP_VERTICAL);
myNeteditViewsPopup->create();
myNeteditViewsButton = new MFXMenuButtonTooltip(gripSupermodes, toolTipMenu,
(std::string("\t") + TL("Change netedit view") + std::string("\t") + TL("Change netedit view.")).c_str(),
GUIIconSubSys::getIcon(GUIIcon::VIEWDEFAULT), myNeteditViewsPopup, nullptr, GUIDesignTLSTableCheckableButtonIcon);
myNeteditViewsButton->create();
myDefaultViewButton = new MFXButtonTooltip(myNeteditViewsPopup, toolTipMenu,
(std::string("Default\t") + TL("Set default view") + std::string("\t") + TL("Set default view.")).c_str(),
GUIIconSubSys::getIcon(GUIIcon::VIEWDEFAULT), myViewNet, MID_GNE_VIEW_DEFAULT, GUIDesignButtonLeft);
myDefaultViewButton->create();
myJuPedSimViewButton = new MFXButtonTooltip(myNeteditViewsPopup, toolTipMenu,
(std::string("JuPedSim\t") + TL("Set JuPedSim view") + std::string("\t") + TL("Set JuPedSim view.")).c_str(),
GUIIconSubSys::getIcon(GUIIcon::VIEWJUPEDSIM), myViewNet, MID_GNE_VIEW_JUPEDSIM, GUIDesignButtonLeft);
myJuPedSimViewButton->create();
myNeteditViewsPopup->recalc();
gripSupermodes->setWidth(353);
gripSupermodes->show();
}
void
GNEViewNetHelper::EditModes::setSupermode(Supermode supermode, const bool force) {
if (!force && (supermode == currentSupermode)) {
myViewNet->setStatusBarText(TL("Mode already selected"));
if (myViewNet->myCurrentFrame != nullptr) {
myViewNet->myCurrentFrame->focusUpperElement();
}
} else {
myViewNet->setStatusBarText("");
myViewNet->abortOperation(false);
currentSupermode = supermode;
if (supermode == Supermode::NETWORK) {
networkButton->setChecked(true);
demandButton->setChecked(false);
dataButton->setChecked(false);
myViewNet->myNetworkCheckableButtons.showNetworkCheckableButtons();
myViewNet->myDemandCheckableButtons.hideDemandCheckableButtons();
myViewNet->myDataCheckableButtons.hideDataCheckableButtons();
setNetworkEditMode(networkEditMode, true);
} else if (supermode == Supermode::DEMAND) {
networkButton->setChecked(false);
demandButton->setChecked(true);
dataButton->setChecked(false);
myViewNet->myNetworkCheckableButtons.hideNetworkCheckableButtons();
myViewNet->myDemandCheckableButtons.showDemandCheckableButtons();
myViewNet->myDataCheckableButtons.hideDataCheckableButtons();
setDemandEditMode(demandEditMode, true);
myViewNet->myNet->computeNetwork(myViewNet->myViewParent->getGNEAppWindows());
if (!myViewNet->myNet->getDemandPathManager()->getPathCalculator()->isPathCalculatorUpdated()) {
myViewNet->myNet->getDemandPathManager()->getPathCalculator()->updatePathCalculator();
myViewNet->myNet->computeDemandElements(myViewNet->myViewParent->getGNEAppWindows());
}
} else if (supermode == Supermode::DATA) {
networkButton->setChecked(false);
demandButton->setChecked(false);
dataButton->setChecked(true);
myViewNet->myNetworkCheckableButtons.hideNetworkCheckableButtons();
myViewNet->myDemandCheckableButtons.hideDemandCheckableButtons();
myViewNet->myDataCheckableButtons.showDataCheckableButtons();
setDataEditMode(dataEditMode, true);
if (myViewNet->getViewParent()->getGNEAppWindows()->getProcessingMenuCommands().menuCheckRecomputeDataMode->getCheck() == TRUE) {
myViewNet->myNet->computeNetwork(myViewNet->myViewParent->getGNEAppWindows());
}
for (const auto& TAZ : myViewNet->getNet()->getAttributeCarriers()->getAdditionals().at(SUMO_TAG_TAZ)) {
TAZ.second->resetAdditionalContour();
}
}
networkButton->update();
demandButton->update();
dataButton->update();
myViewNet->myViewParent->getGNEAppWindows()->updateSuperModeMenuCommands(currentSupermode);
}
}
void
GNEViewNetHelper::EditModes::setNetworkEditMode(NetworkEditMode mode, const bool force) {
if ((mode == networkEditMode) && !force) {
myViewNet->setStatusBarText(TL("Network mode already selected"));
if (myViewNet->myCurrentFrame != nullptr) {
myViewNet->myCurrentFrame->focusUpperElement();
}
} else if (networkEditMode == NetworkEditMode::NETWORK_TLS && !myViewNet->myViewParent->getTLSEditorFrame()->isTLSSaved()) {
myViewNet->setStatusBarText(TL("Save modifications in TLS before change mode"));
myViewNet->myCurrentFrame->focusUpperElement();
} else {
myViewNet->setStatusBarText("");
myViewNet->abortOperation(false);
myViewNet->myEditNetworkElementShapes.stopEditCustomShape();
networkEditMode = mode;
if (networkEditMode == NetworkEditMode::NETWORK_INSPECT) {
demandEditMode = DemandEditMode::DEMAND_INSPECT;
dataEditMode = DataEditMode::DATA_INSPECT;
} else if (networkEditMode == NetworkEditMode::NETWORK_DELETE) {
demandEditMode = DemandEditMode::DEMAND_DELETE;
dataEditMode = DataEditMode::DATA_DELETE;
} else if (networkEditMode == NetworkEditMode::NETWORK_SELECT) {
demandEditMode = DemandEditMode::DEMAND_SELECT;
dataEditMode = DataEditMode::DATA_SELECT;
} else if (networkEditMode == NetworkEditMode::NETWORK_MOVE) {
demandEditMode = DemandEditMode::DEMAND_MOVE;
}
switch (mode) {
case NetworkEditMode::NETWORK_PROHIBITION:
case NetworkEditMode::NETWORK_CONNECT:
case NetworkEditMode::NETWORK_TLS:
case NetworkEditMode::NETWORK_WIRE:
myViewNet->myNet->computeNetwork(myViewNet->myViewParent->getGNEAppWindows());
break;
default:
break;
}
myViewNet->updateCursor();
myViewNet->updateNetworkModeSpecificControls();
}
}
void
GNEViewNetHelper::EditModes::setDemandEditMode(DemandEditMode mode, const bool force) {
if ((mode == demandEditMode) && !force) {
myViewNet->setStatusBarText(TL("Demand mode already selected"));
if (myViewNet->myCurrentFrame != nullptr) {
myViewNet->myCurrentFrame->focusUpperElement();
}
} else {
myViewNet->setStatusBarText("");
myViewNet->abortOperation(false);
myViewNet->myEditNetworkElementShapes.stopEditCustomShape();
demandEditMode = mode;
if (demandEditMode == DemandEditMode::DEMAND_INSPECT) {
networkEditMode = NetworkEditMode::NETWORK_INSPECT;
dataEditMode = DataEditMode::DATA_INSPECT;
} else if (demandEditMode == DemandEditMode::DEMAND_DELETE) {
networkEditMode = NetworkEditMode::NETWORK_DELETE;
dataEditMode = DataEditMode::DATA_DELETE;
} else if (demandEditMode == DemandEditMode::DEMAND_SELECT) {
networkEditMode = NetworkEditMode::NETWORK_SELECT;
dataEditMode = DataEditMode::DATA_SELECT;
} else if (demandEditMode == DemandEditMode::DEMAND_MOVE) {
networkEditMode = NetworkEditMode::NETWORK_MOVE;
}
myViewNet->updateCursor();
myViewNet->updateDemandModeSpecificControls();
}
}
void
GNEViewNetHelper::EditModes::setDataEditMode(DataEditMode mode, const bool force) {
if ((mode == dataEditMode) && !force) {
myViewNet->setStatusBarText(TL("Data mode already selected"));
if (myViewNet->myCurrentFrame != nullptr) {
myViewNet->myCurrentFrame->focusUpperElement();
}
} else {
myViewNet->setStatusBarText("");
myViewNet->abortOperation(false);
myViewNet->myEditNetworkElementShapes.stopEditCustomShape();
dataEditMode = mode;
if (dataEditMode == DataEditMode::DATA_INSPECT) {
networkEditMode = NetworkEditMode::NETWORK_INSPECT;
demandEditMode = DemandEditMode::DEMAND_INSPECT;
} else if (dataEditMode == DataEditMode::DATA_DELETE) {
networkEditMode = NetworkEditMode::NETWORK_DELETE;
demandEditMode = DemandEditMode::DEMAND_DELETE;
} else if (dataEditMode == DataEditMode::DATA_SELECT) {
networkEditMode = NetworkEditMode::NETWORK_SELECT;
demandEditMode = DemandEditMode::DEMAND_SELECT;
}
for (const auto& dataSet : myViewNet->getNet()->getAttributeCarriers()->getDataSets()) {
dataSet.second->updateAttributeColors();
}
myViewNet->updateCursor();
myViewNet->updateDataModeSpecificControls();
}
}
bool
GNEViewNetHelper::EditModes::isCurrentSupermodeNetwork() const {
return (currentSupermode == Supermode::NETWORK);
}
bool
GNEViewNetHelper::EditModes::isCurrentSupermodeDemand() const {
return (currentSupermode == Supermode::DEMAND);
}
bool
GNEViewNetHelper::EditModes::isCurrentSupermodeData() const {
return (currentSupermode == Supermode::DATA);
}
void
GNEViewNetHelper::EditModes::setView(FXSelector sel) {
auto gripSupermodes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().superModes;
auto& fileMenuCommands = myViewNet->getViewParent()->getGNEAppWindows()->getFileMenuCommands();
if (sel == MID_GNE_VIEW_DEFAULT) {
myNeteditViewsButton->setIcon(GUIIconSubSys::getIcon(GUIIcon::VIEWDEFAULT));
gripSupermodes->setWidth(353);
fileMenuCommands.setDefaultView();
} else if (sel == MID_GNE_VIEW_JUPEDSIM) {
myNeteditViewsButton->setIcon(GUIIconSubSys::getIcon(GUIIcon::VIEWJUPEDSIM));
gripSupermodes->setWidth(250);
fileMenuCommands.setJuPedSimView();
}
myViewNet->viewUpdated();
}
bool
GNEViewNetHelper::EditModes::isDefaultView() const {
return myNeteditViewsButton->getIcon() == GUIIconSubSys::getIcon(GUIIcon::VIEWDEFAULT);
}
bool
GNEViewNetHelper::EditModes::isJuPedSimView() const {
return myNeteditViewsButton->getIcon() == GUIIconSubSys::getIcon(GUIIcon::VIEWJUPEDSIM);
}
GNEViewNetHelper::NetworkViewOptions::NetworkViewOptions(GNEViewNet* viewNet) :
myViewNet(viewNet) {
}
void
GNEViewNetHelper::NetworkViewOptions::buildNetworkViewOptionsMenuChecks() {
auto gripModes = myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().modes;
auto toolTipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
menuCheckToggleGrid = new MFXCheckableButton(false, gripModes, toolTipMenu,
(std::string("\t") + TL("Show grid") + std::string("\t") + TL("Show grid and restrict movement to the grid - define grid size in visualization options. (Ctrl+G)")),
GUIIconSubSys::getIcon(GUIIcon::COMMONMODE_CHECKBOX_TOGGLEGRID),
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_TOGGLEGRID, GUIDesignMFXCheckableButtonSquare);
menuCheckToggleGrid->setChecked(false);
menuCheckToggleGrid->create();
menuCheckToggleDrawJunctionShape = new MFXCheckableButton(false, gripModes, toolTipMenu,
(std::string("\t") + TL("Hide junction shape") + std::string("\t") + TL("Toggle hiding junction shape. (Ctrl+J)")),
GUIIconSubSys::getIcon(GUIIcon::COMMONMODE_CHECKBOX_TOGGLEDRAWJUNCTIONSHAPE),
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE, GUIDesignMFXCheckableButtonSquare);
menuCheckToggleDrawJunctionShape->setChecked(false);
menuCheckToggleDrawJunctionShape->create();
menuCheckDrawSpreadVehicles = new MFXCheckableButton(false, gripModes, toolTipMenu,
(std::string("\t") + TL("Draw vehicles spread in lane or depart position") + std::string("\t") + TL("Draw vehicles spread in lane or in depart position.")),
GUIIconSubSys::getIcon(GUIIcon::COMMONMODE_CHECKBOX_SPREADVEHICLE),
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_DRAWSPREADVEHICLES, GUIDesignMFXCheckableButtonSquare);
menuCheckDrawSpreadVehicles->setChecked(false);
menuCheckDrawSpreadVehicles->create();
menuCheckShowDemandElements = new MFXCheckableButton(false, gripModes, toolTipMenu,
(std::string("\t") + TL("Show demand elements") + std::string("\t") + TL("Toggle show demand elements.")),
GUIIconSubSys::getIcon(GUIIcon::COMMONMODE_CHECKBOX_SHOWDEMANDELEMENTS),
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_SHOWDEMANDELEMENTS, GUIDesignMFXCheckableButtonSquare);
menuCheckShowDemandElements->setChecked(false);
menuCheckShowDemandElements->create();
menuCheckSelectEdges = new MFXCheckableButton(false, gripModes, toolTipMenu,
(std::string("\t") + TL("Clicks target lanes") + std::string("\t") + TL("Toggle whether clicking should inspect/select/delete lanes instead of edges.")),
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_SELECTEDGES),
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_SELECTEDGES, GUIDesignMFXCheckableButtonSquare);
menuCheckSelectEdges->create();
menuCheckShowConnections = new MFXCheckableButton(false, gripModes, toolTipMenu,
(std::string("\t") + TL("Show connections over junctions") + std::string("\t") + TL("Toggle show connections over junctions.")),
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_SHOWCONNECTIONS),
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_SHOWCONNECTIONS, GUIDesignMFXCheckableButtonSquare);
menuCheckShowConnections->setChecked(myViewNet->getVisualisationSettings().showLane2Lane);
menuCheckShowConnections->create();
menuCheckHideConnections = new MFXCheckableButton(false, gripModes, toolTipMenu,
(std::string("\t") + TL("Hide connections") + std::string("\t") + TL("Toggle hide connections.")),
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_HIDECONNECTIONS),
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_HIDECONNECTIONS, GUIDesignMFXCheckableButtonSquare);
menuCheckHideConnections->setChecked(false);
menuCheckHideConnections->create();
menuCheckShowAdditionalSubElements = new MFXCheckableButton(false, gripModes, toolTipMenu,
(std::string("\t") + TL("Show additional sub-elements") + std::string("\t") + TL("Toggle show additional sub-elements.")),
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_SHOWSUBADDITIONALS),
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_SHOWSUBADDITIONALS, GUIDesignMFXCheckableButtonSquare);
menuCheckShowAdditionalSubElements->setChecked(false);
menuCheckShowAdditionalSubElements->create();
menuCheckShowTAZElements = new MFXCheckableButton(false, gripModes, toolTipMenu,
(std::string("\t") + TL("Show TAZ elements") + std::string("\t") + TL("Toggle show TAZ elements.")),
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_SHOWTAZELEMENTS),
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_SHOWTAZELEMENTS, GUIDesignMFXCheckableButtonSquare);
menuCheckShowTAZElements->setChecked(false);
menuCheckShowTAZElements->create();
menuCheckExtendSelection = new MFXCheckableButton(false, gripModes, toolTipMenu,
(std::string("\t") + TL("Automatic select junctions") + std::string("\t") + TL("Toggle whether selecting multiple edges should automatically select their junctions.")),
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_AUTOSELECTJUNCTIONS),
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_EXTENDSELECTION, GUIDesignMFXCheckableButtonSquare);
menuCheckExtendSelection->setChecked(true);
menuCheckExtendSelection->create();
menuCheckChangeAllPhases = new MFXCheckableButton(false, gripModes, toolTipMenu,
(std::string("\t") + TL("Apply state to all phases") + std::string("\t") + TL("Toggle whether clicking should apply state changes to all phases of the current TLS plan.")),
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_APPLYTOALLPHASES),
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_CHANGEALLPHASES, GUIDesignMFXCheckableButtonSquare);
menuCheckChangeAllPhases->setChecked(false);
menuCheckChangeAllPhases->create();
menuCheckMergeAutomatically = new MFXCheckableButton(false, gripModes, toolTipMenu,
(std::string("\t") + TL("Automatic merging junction") + std::string("\t") + TL("Toggle ask for confirmation before merging junction.")),
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_MERGEAUTOMATICALLY),
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_MERGEAUTOMATICALLY, GUIDesignMFXCheckableButtonSquare);
menuCheckMergeAutomatically->create();
menuCheckChainEdges = new MFXCheckableButton(false, gripModes, toolTipMenu,
(std::string("\t") + TL("Edge chain mode") + std::string("\t") + TL("Create consecutive edges with a single click (hit ESC to cancel chain).")),
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_CHAIN),
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_CHAINEDGES, GUIDesignMFXCheckableButtonSquare);
menuCheckChainEdges->setChecked(false);
menuCheckChainEdges->create();
menuCheckAutoOppositeEdge = new MFXCheckableButton(false, gripModes, toolTipMenu,
(std::string("\t") + TL("Edge opposite direction") + std::string("\t") + TL("Automatically create an edge in the opposite direction.")),
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_TWOWAY),
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_AUTOOPPOSITEEDGES, GUIDesignMFXCheckableButtonSquare);
menuCheckAutoOppositeEdge->setChecked(false);
menuCheckAutoOppositeEdge->create();
menuCheckMoveElevation = new MFXCheckableButton(false, gripModes, toolTipMenu,
(std::string("\t") + TL("Move elevation") + std::string("\t") + TL("Apply mouse movement to elevation instead of x,y position.")),
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_ELEVATION),
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_MOVEELEVATION, GUIDesignMFXCheckableButtonSquare);
menuCheckMoveElevation->setChecked(false);
menuCheckMoveElevation->create();
menuCheckShowJunctionBubble = new MFXCheckableButton(false, gripModes, toolTipMenu,
(std::string("\t") + TL("Show bubbles") + std::string("\t") + TL("Toggle show bubbles over junctions shapes.")),
GUIIconSubSys::getIcon(GUIIcon::NETWORKMODE_CHECKBOX_BUBBLES),
myViewNet, MID_GNE_NETWORKVIEWOPTIONS_SHOWBUBBLES, GUIDesignMFXCheckableButtonSquare);
menuCheckShowJunctionBubble->setChecked(false);
menuCheckShowJunctionBubble->create();
gripModes->recalc();
}
void
GNEViewNetHelper::NetworkViewOptions::hideNetworkViewOptionsMenuChecks() {
menuCheckToggleGrid->hide();
menuCheckToggleDrawJunctionShape->hide();
menuCheckDrawSpreadVehicles->hide();
menuCheckShowDemandElements->hide();
menuCheckSelectEdges->hide();
menuCheckShowConnections->hide();
menuCheckHideConnections->hide();
menuCheckShowAdditionalSubElements->hide();
menuCheckShowTAZElements->hide();
menuCheckExtendSelection->hide();
menuCheckChangeAllPhases->hide();
menuCheckMergeAutomatically->hide();
menuCheckShowJunctionBubble->hide();
menuCheckMoveElevation->hide();
menuCheckChainEdges->hide();
menuCheckAutoOppositeEdge->hide();
}
void
GNEViewNetHelper::NetworkViewOptions::getVisibleNetworkMenuCommands(std::vector<MFXCheckableButton*>& commands) const {
if (menuCheckToggleGrid->shown()) {
commands.push_back(menuCheckToggleGrid);
}
if (menuCheckToggleDrawJunctionShape->shown()) {
commands.push_back(menuCheckToggleDrawJunctionShape);
}
if (menuCheckDrawSpreadVehicles->shown()) {
commands.push_back(menuCheckDrawSpreadVehicles);
}
if (menuCheckShowDemandElements->shown()) {
commands.push_back(menuCheckShowDemandElements);
}
if (menuCheckSelectEdges->shown()) {
commands.push_back(menuCheckSelectEdges);
}
if (menuCheckShowConnections->shown()) {
commands.push_back(menuCheckShowConnections);
}
if (menuCheckHideConnections->shown()) {
commands.push_back(menuCheckHideConnections);
}
if (menuCheckShowAdditionalSubElements->shown()) {
commands.push_back(menuCheckShowAdditionalSubElements);
}
if (menuCheckShowTAZElements->shown()) {
commands.push_back(menuCheckShowTAZElements);
}
if (menuCheckExtendSelection->shown()) {
commands.push_back(menuCheckExtendSelection);
}
if (menuCheckChangeAllPhases->shown()) {
commands.push_back(menuCheckChangeAllPhases);
}
if (menuCheckMergeAutomatically->shown()) {
commands.push_back(menuCheckMergeAutomatically);
}
if (menuCheckChainEdges->shown()) {
commands.push_back(menuCheckChainEdges);
}
if (menuCheckAutoOppositeEdge->shown()) {
commands.push_back(menuCheckAutoOppositeEdge);
}
if (menuCheckMoveElevation->shown()) {
commands.push_back(menuCheckMoveElevation);
}
if (menuCheckShowJunctionBubble->shown()) {
commands.push_back(menuCheckShowJunctionBubble);
}
}
bool
GNEViewNetHelper::NetworkViewOptions::drawSpreadVehicles() const {
return (menuCheckDrawSpreadVehicles->amChecked() == TRUE);
}
bool
GNEViewNetHelper::NetworkViewOptions::showDemandElements() const {
if (menuCheckShowDemandElements->shown()) {
return (menuCheckShowDemandElements->amChecked() == TRUE);
} else {
return true;
}
}
bool
GNEViewNetHelper::NetworkViewOptions::selectEdges() const {
if (menuCheckSelectEdges->shown()) {
return (menuCheckSelectEdges->amChecked() != TRUE);
} else {
return true;
}
}
bool
GNEViewNetHelper::NetworkViewOptions::showConnections() const {
if (myViewNet->myEditModes.isCurrentSupermodeData()) {
return false;
} else if (myViewNet->myEditModes.networkEditMode == NetworkEditMode::NETWORK_CONNECT) {
return (menuCheckHideConnections->amChecked() == FALSE);
} else if (myViewNet->myEditModes.networkEditMode == NetworkEditMode::NETWORK_PROHIBITION) {
return true;
} else if (myViewNet->myEditModes.isCurrentSupermodeNetwork() && menuCheckShowConnections->shown() == false) {
return false;
} else {
return (myViewNet->getVisualisationSettings().showLane2Lane);
}
}
bool
GNEViewNetHelper::NetworkViewOptions::showSubAdditionals() const {
if (!myViewNet->myEditModes.isCurrentSupermodeNetwork()) {
return false;
} else if (menuCheckShowAdditionalSubElements->shown() == false) {
return false;
} else {
return menuCheckShowAdditionalSubElements->amChecked();
}
}
bool
GNEViewNetHelper::NetworkViewOptions::showTAZElements() const {
if (!myViewNet->myEditModes.isCurrentSupermodeNetwork()) {
return false;
} else if (menuCheckShowTAZElements->shown() == false) {
return false;
} else {
return menuCheckShowTAZElements->amChecked();
}
}
bool
GNEViewNetHelper::NetworkViewOptions::editingElevation() const {
if (menuCheckMoveElevation->shown()) {
return (menuCheckMoveElevation->amChecked() == TRUE);
} else {
return false;
}
}
GNEViewNetHelper::DemandViewOptions::DemandViewOptions(GNEViewNet* viewNet) :
myViewNet(viewNet) {
}
void
GNEViewNetHelper::DemandViewOptions::buildDemandViewOptionsMenuChecks() {
auto gripModes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().modes;
auto tooltipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
menuCheckToggleGrid = new MFXCheckableButton(false, gripModes, tooltipMenu,
(std::string("\t") + TL("Show grid") + std::string("\t") + TL("Show grid and restrict movement to the grid - define grid size in visualization options. (Ctrl+G)")),
GUIIconSubSys::getIcon(GUIIcon::COMMONMODE_CHECKBOX_TOGGLEGRID),
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_SHOWGRID, GUIDesignMFXCheckableButtonSquare);
menuCheckToggleGrid->setChecked(false);
menuCheckToggleGrid->create();
menuCheckToggleDrawJunctionShape = new MFXCheckableButton(false, gripModes, tooltipMenu,
(std::string("\t") + TL("Hide junction shape") + std::string("\t") + TL("Toggle hiding junction shape. (Ctrl+J)")),
GUIIconSubSys::getIcon(GUIIcon::COMMONMODE_CHECKBOX_TOGGLEDRAWJUNCTIONSHAPE),
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE, GUIDesignMFXCheckableButtonSquare);
menuCheckToggleDrawJunctionShape->setChecked(false);
menuCheckToggleDrawJunctionShape->create();
menuCheckDrawSpreadVehicles = new MFXCheckableButton(false, gripModes, tooltipMenu,
(std::string("\t") + TL("Draw vehicles spread/depart position") + std::string("\t") + TL("Draw vehicles spread in lane or in depart position.")),
GUIIconSubSys::getIcon(GUIIcon::COMMONMODE_CHECKBOX_SPREADVEHICLE),
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_DRAWSPREADVEHICLES, GUIDesignMFXCheckableButtonSquare);
menuCheckDrawSpreadVehicles->setChecked(false);
menuCheckDrawSpreadVehicles->create();
menuCheckHideShapes = new MFXCheckableButton(false, gripModes, tooltipMenu,
(std::string("\t") + TL("Show shapes") + std::string("\t") + TL("Toggle show shapes (Polygons and POIs).")),
GUIIconSubSys::getIcon(GUIIcon::DEMANDMODE_CHECKBOX_HIDESHAPES),
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_HIDESHAPES, GUIDesignMFXCheckableButtonSquare);
menuCheckHideShapes->setChecked(false);
menuCheckHideShapes->create();
menuCheckShowAllTrips = new MFXCheckableButton(false, gripModes, tooltipMenu,
(std::string("\t") + TL("Show all trips") + std::string("\t") + TL("Toggle show all trips (requires updated demand - F5).")),
GUIIconSubSys::getIcon(GUIIcon::DEMANDMODE_CHECKBOX_SHOWTRIPS),
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_SHOWTRIPS, GUIDesignMFXCheckableButtonSquare);
menuCheckShowAllTrips->setChecked(false);
menuCheckShowAllTrips->create();
menuCheckShowAllPersonPlans = new MFXCheckableButton(false, gripModes, tooltipMenu,
(std::string("\t") + TL("Show all person plans") + std::string("\t") + TL("Toggle show all person plans.")),
GUIIconSubSys::getIcon(GUIIcon::DEMANDMODE_CHECKBOX_SHOWPERSONPLANS),
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_SHOWALLPERSONPLANS, GUIDesignMFXCheckableButtonSquare);
menuCheckShowAllPersonPlans->setChecked(false);
menuCheckShowAllPersonPlans->create();
menuCheckLockPerson = new MFXCheckableButton(false, gripModes, tooltipMenu,
(std::string("\t") + TL("Lock selected person") + std::string("\t") + TL("Toggle lock selected person.")),
GUIIconSubSys::getIcon(GUIIcon::DEMANDMODE_CHECKBOX_LOCKPERSON),
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_LOCKPERSON, GUIDesignMFXCheckableButtonSquare);
menuCheckLockPerson->setChecked(false);
menuCheckLockPerson->create();
menuCheckShowAllContainerPlans = new MFXCheckableButton(false, gripModes, tooltipMenu,
(std::string("\t") + TL("Show all containers plans") + std::string("\t") + TL("Toggle show all container plans.")),
GUIIconSubSys::getIcon(GUIIcon::DEMANDMODE_CHECKBOX_SHOWCONTAINERPLANS),
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_SHOWALLCONTAINERPLANS, GUIDesignMFXCheckableButtonSquare);
menuCheckShowAllContainerPlans->setChecked(false);
menuCheckShowAllContainerPlans->create();
menuCheckLockContainer = new MFXCheckableButton(false, gripModes, tooltipMenu,
(std::string("\t") + TL("Lock selected container") + std::string("\t") + TL("Toggle lock selected container.")),
GUIIconSubSys::getIcon(GUIIcon::DEMANDMODE_CHECKBOX_LOCKCONTAINER),
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_LOCKCONTAINER, GUIDesignMFXCheckableButtonSquare);
menuCheckLockContainer->setChecked(false);
menuCheckLockContainer->create();
menuCheckHideNonInspectedDemandElements = new MFXCheckableButton(false, gripModes, tooltipMenu,
(std::string("\t") + TL("Show non-inspected demand elements") + std::string("\t") + TL("Toggle show non-inspected demand elements.")),
GUIIconSubSys::getIcon(GUIIcon::DEMANDMODE_CHECKBOX_HIDENONINSPECTEDDEMANDELEMENTS),
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_HIDENONINSPECTED, GUIDesignMFXCheckableButtonSquare);
menuCheckHideNonInspectedDemandElements->setChecked(false);
menuCheckHideNonInspectedDemandElements->create();
menuCheckShowOverlappedRoutes = new MFXCheckableButton(false, gripModes, tooltipMenu,
(std::string("\t") + TL("Show number of overlapped routes") + std::string("\t") + TL("Toggle show number of overlapped routes.")),
GUIIconSubSys::getIcon(GUIIcon::DEMANDMODE_CHECKBOX_SHOWOVERLAPPEDROUTES),
myViewNet, MID_GNE_DEMANDVIEWOPTIONS_SHOWOVERLAPPEDROUTES, GUIDesignMFXCheckableButtonSquare);
menuCheckShowOverlappedRoutes->setChecked(false);
menuCheckShowOverlappedRoutes->create();
gripModes->recalc();
}
void
GNEViewNetHelper::DemandViewOptions::hideDemandViewOptionsMenuChecks() {
menuCheckToggleGrid->hide();
menuCheckToggleDrawJunctionShape->hide();
menuCheckDrawSpreadVehicles->hide();
menuCheckHideShapes->hide();
menuCheckShowAllTrips->hide();
menuCheckShowAllPersonPlans->hide();
menuCheckLockPerson->hide();
menuCheckShowAllContainerPlans->hide();
menuCheckLockContainer->hide();
menuCheckHideNonInspectedDemandElements->hide();
menuCheckShowOverlappedRoutes->hide();
}
void
GNEViewNetHelper::DemandViewOptions::getVisibleDemandMenuCommands(std::vector<MFXCheckableButton*>& commands) const {
if (menuCheckToggleGrid->shown()) {
commands.push_back(menuCheckToggleGrid);
}
if (menuCheckToggleDrawJunctionShape->shown()) {
commands.push_back(menuCheckToggleDrawJunctionShape);
}
if (menuCheckDrawSpreadVehicles->shown()) {
commands.push_back(menuCheckDrawSpreadVehicles);
}
if (menuCheckHideShapes->shown()) {
commands.push_back(menuCheckHideShapes);
}
if (menuCheckShowAllTrips->shown()) {
commands.push_back(menuCheckShowAllTrips);
}
if (menuCheckShowAllPersonPlans->shown() && menuCheckShowAllPersonPlans->isEnabled()) {
commands.push_back(menuCheckShowAllPersonPlans);
}
if (menuCheckLockPerson->shown() && menuCheckLockPerson->isEnabled()) {
commands.push_back(menuCheckLockPerson);
}
if (menuCheckShowAllContainerPlans->shown() && menuCheckShowAllContainerPlans->isEnabled()) {
commands.push_back(menuCheckShowAllContainerPlans);
}
if (menuCheckLockContainer->shown() && menuCheckLockContainer->isEnabled()) {
commands.push_back(menuCheckLockContainer);
}
if (menuCheckHideNonInspectedDemandElements->shown()) {
commands.push_back(menuCheckHideNonInspectedDemandElements);
}
if (menuCheckShowOverlappedRoutes->shown()) {
commands.push_back(menuCheckShowOverlappedRoutes);
}
}
bool
GNEViewNetHelper::DemandViewOptions::drawSpreadVehicles() const {
return (menuCheckDrawSpreadVehicles->amChecked() == TRUE);
}
bool
GNEViewNetHelper::DemandViewOptions::showNonInspectedDemandElements(const GNEDemandElement* demandElement) const {
if (menuCheckHideNonInspectedDemandElements->shown()) {
const auto& inspectedElements = myViewNet->getInspectedElements();
if ((menuCheckHideNonInspectedDemandElements->amChecked() == FALSE) || (inspectedElements.getFirstAC() == nullptr)) {
return true;
} else if (inspectedElements.getFirstAC() && inspectedElements.getFirstAC()->getTagProperty()->isDemandElement()) {
if (inspectedElements.isACInspected(demandElement)) {
return true;
} else {
for (const auto& demandElementChild : demandElement->getChildDemandElements()) {
if (inspectedElements.isACInspected(demandElementChild)) {
return true;
}
}
for (const auto& demandElementParent : demandElement->getParentDemandElements()) {
if (inspectedElements.isACInspected(demandElementParent)) {
return true;
}
}
return false;
}
} else {
return true;
}
} else {
return true;
}
}
bool
GNEViewNetHelper::DemandViewOptions::showShapes() const {
if (menuCheckHideShapes->shown()) {
return (menuCheckHideShapes->amChecked() == FALSE);
} else {
return true;
}
}
bool
GNEViewNetHelper::DemandViewOptions::showAllTrips() const {
return (menuCheckShowAllTrips->amChecked() == TRUE);
}
bool
GNEViewNetHelper::DemandViewOptions::showAllPersonPlans() const {
if (menuCheckShowAllPersonPlans->isEnabled()) {
return (menuCheckShowAllPersonPlans->amChecked() == TRUE);
} else {
return false;
}
}
void
GNEViewNetHelper::DemandViewOptions::lockPerson(const GNEDemandElement* person) {
myLockedPerson = person;
}
void
GNEViewNetHelper::DemandViewOptions::unlockPerson() {
myLockedPerson = nullptr;
}
const GNEDemandElement*
GNEViewNetHelper::DemandViewOptions::getLockedPerson() const {
return myLockedPerson;
}
bool
GNEViewNetHelper::DemandViewOptions::showAllContainerPlans() const {
if (menuCheckShowAllContainerPlans->isEnabled()) {
return (menuCheckShowAllContainerPlans->amChecked() == TRUE);
} else {
return false;
}
}
void
GNEViewNetHelper::DemandViewOptions::lockContainer(const GNEDemandElement* container) {
myLockedContainer = container;
}
void
GNEViewNetHelper::DemandViewOptions::unlockContainer() {
myLockedContainer = nullptr;
}
bool
GNEViewNetHelper::DemandViewOptions::showOverlappedRoutes() const {
if (menuCheckShowOverlappedRoutes->isEnabled()) {
return (menuCheckShowOverlappedRoutes->amChecked() == TRUE);
} else {
return false;
}
}
const GNEDemandElement*
GNEViewNetHelper::DemandViewOptions::getLockedContainer() const {
return myLockedContainer;
}
GNEViewNetHelper::DataViewOptions::DataViewOptions(GNEViewNet* viewNet) :
myViewNet(viewNet) {
}
void
GNEViewNetHelper::DataViewOptions::buildDataViewOptionsMenuChecks() {
auto gripModes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().modes;
auto tooltipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
menuCheckToggleDrawJunctionShape = new MFXCheckableButton(false, gripModes, tooltipMenu,
(std::string("\t") + TL("Hide junction shape") + std::string("\t") + TL("Toggle hiding junction shape. (Ctrl+J)")),
GUIIconSubSys::getIcon(GUIIcon::COMMONMODE_CHECKBOX_TOGGLEDRAWJUNCTIONSHAPE),
myViewNet, MID_GNE_DATAVIEWOPTIONS_TOGGLEDRAWJUNCTIONSHAPE, GUIDesignMFXCheckableButtonSquare);
menuCheckToggleDrawJunctionShape->setChecked(false);
menuCheckToggleDrawJunctionShape->create();
menuCheckShowAdditionals = new MFXCheckableButton(false, gripModes, tooltipMenu,
(std::string("\t") + TL("Show additionals") + std::string("\t") + TL("Toggle show additionals.")),
GUIIconSubSys::getIcon(GUIIcon::DATAMODE_CHECKBOX_SHOWADDITIONALS),
myViewNet, MID_GNE_DATAVIEWOPTIONS_SHOWADDITIONALS, GUIDesignMFXCheckableButtonSquare);
menuCheckShowAdditionals->create();
menuCheckShowShapes = new MFXCheckableButton(false, gripModes, tooltipMenu,
(std::string("\t") + TL("Show shapes") + std::string("\t") + TL("Toggle show shapes (Polygons and POIs).")),
GUIIconSubSys::getIcon(GUIIcon::DATAMODE_CHECKBOX_SHOWSHAPES),
myViewNet, MID_GNE_DATAVIEWOPTIONS_SHOWSHAPES, GUIDesignMFXCheckableButtonSquare);
menuCheckShowShapes->create();
menuCheckShowDemandElements = new MFXCheckableButton(false, gripModes, tooltipMenu,
(std::string("\t") + TL("Show demand elements") + std::string("\t") + TL("Toggle show demand elements.")),
GUIIconSubSys::getIcon(GUIIcon::COMMONMODE_CHECKBOX_SHOWDEMANDELEMENTS),
myViewNet, MID_GNE_DATAVIEWOPTIONS_SHOWDEMANDELEMENTS, GUIDesignMFXCheckableButtonSquare);
menuCheckShowDemandElements->create();
menuCheckToggleTAZRelDrawing = new MFXCheckableButton(false, gripModes, tooltipMenu,
(std::string("\t") + TL("Draw TAZREL drawing mode") + std::string("\t") + TL("Toggle draw TAZREL drawing mode.")),
GUIIconSubSys::getIcon(GUIIcon::DATAMODE_CHECKBOX_TAZRELDRAWING),
myViewNet, MID_GNE_DATAVIEWOPTIONS_TAZRELDRAWING, GUIDesignMFXCheckableButtonSquare);
menuCheckToggleTAZRelDrawing->create();
menuCheckToggleTAZDrawFill = new MFXCheckableButton(false, gripModes, tooltipMenu,
(std::string("\t") + TL("Toggle draw TAZ fill") + std::string("\t") + TL("Toggle draw TAZ fill")),
GUIIconSubSys::getIcon(GUIIcon::DATAMODE_CHECKBOX_TAZDRAWFILL),
myViewNet, MID_GNE_DATAVIEWOPTIONS_TAZDRAWFILL, GUIDesignMFXCheckableButtonSquare);
menuCheckToggleTAZDrawFill->create();
menuCheckToggleTAZRelOnlyFrom = new MFXCheckableButton(false, gripModes, tooltipMenu,
(std::string("\t") + TL("Toggle draw TAZRel only from") + std::string("\t") + TL("Toggle draw TAZRel only from")),
GUIIconSubSys::getIcon(GUIIcon::DATAMODE_CHECKBOX_TAZRELONLYFROM),
myViewNet, MID_GNE_DATAVIEWOPTIONS_TAZRELONLYFROM, GUIDesignMFXCheckableButtonSquare);
menuCheckToggleTAZRelOnlyFrom->create();
menuCheckToggleTAZRelOnlyTo = new MFXCheckableButton(false, gripModes, tooltipMenu,
(std::string("\t") + TL("Toggle draw TAZRel only to") + std::string("\t") + TL("Toggle draw TAZRel only to")),
GUIIconSubSys::getIcon(GUIIcon::DATAMODE_CHECKBOX_TAZRELONLYTO),
myViewNet, MID_GNE_DATAVIEWOPTIONS_TAZRELONLYTO, GUIDesignMFXCheckableButtonSquare);
menuCheckToggleTAZRelOnlyTo->create();
gripModes->recalc();
}
void
GNEViewNetHelper::DataViewOptions::hideDataViewOptionsMenuChecks() {
menuCheckToggleDrawJunctionShape->hide();
menuCheckShowAdditionals->hide();
menuCheckShowShapes->hide();
menuCheckShowDemandElements->hide();
menuCheckToggleTAZRelDrawing->hide();
menuCheckToggleTAZDrawFill->hide();
menuCheckToggleTAZRelOnlyFrom->hide();
menuCheckToggleTAZRelOnlyTo->hide();
}
void
GNEViewNetHelper::DataViewOptions::getVisibleDataMenuCommands(std::vector<MFXCheckableButton*>& commands) const {
if (menuCheckToggleDrawJunctionShape->shown()) {
commands.push_back(menuCheckToggleDrawJunctionShape);
}
if (menuCheckShowAdditionals->shown()) {
commands.push_back(menuCheckShowAdditionals);
}
if (menuCheckShowShapes->shown()) {
commands.push_back(menuCheckShowShapes);
}
if (menuCheckShowDemandElements->shown()) {
commands.push_back(menuCheckShowDemandElements);
}
if (menuCheckToggleTAZRelDrawing->shown()) {
commands.push_back(menuCheckToggleTAZRelDrawing);
}
if (menuCheckToggleTAZDrawFill->shown()) {
commands.push_back(menuCheckToggleTAZDrawFill);
}
if (menuCheckToggleTAZRelOnlyFrom->shown()) {
commands.push_back(menuCheckToggleTAZRelOnlyFrom);
}
if (menuCheckToggleTAZRelOnlyTo->shown()) {
commands.push_back(menuCheckToggleTAZRelOnlyTo);
}
}
bool
GNEViewNetHelper::DataViewOptions::showAdditionals() const {
if (menuCheckShowAdditionals->shown()) {
return (menuCheckShowAdditionals->amChecked() == TRUE);
} else {
return true;
}
}
bool
GNEViewNetHelper::DataViewOptions::showShapes() const {
if (menuCheckShowShapes->shown()) {
return (menuCheckShowShapes->amChecked() == TRUE);
} else {
return true;
}
}
bool
GNEViewNetHelper::DataViewOptions::showDemandElements() const {
if (menuCheckShowDemandElements->shown()) {
return (menuCheckShowDemandElements->amChecked() == TRUE);
} else {
return true;
}
}
bool
GNEViewNetHelper::DataViewOptions::TAZRelDrawing() const {
return (menuCheckToggleTAZRelDrawing->amChecked() != TRUE);
}
bool
GNEViewNetHelper::DataViewOptions::TAZDrawFill() const {
if (menuCheckToggleTAZDrawFill->shown()) {
return (menuCheckToggleTAZDrawFill->amChecked() != TRUE);
} else {
return false;
}
}
bool
GNEViewNetHelper::DataViewOptions::TAZRelOnlyFrom() const {
if (menuCheckToggleTAZRelOnlyFrom->shown()) {
return (menuCheckToggleTAZRelOnlyFrom->amChecked() != TRUE);
} else {
return false;
}
}
bool
GNEViewNetHelper::DataViewOptions::TAZRelOnlyTo() const {
if (menuCheckToggleTAZRelOnlyTo->shown()) {
return (menuCheckToggleTAZRelOnlyTo->amChecked() != TRUE);
} else {
return false;
}
}
GNEViewNetHelper::IntervalBar::IntervalBar(GNEViewNet* viewNet) :
myViewNet(viewNet) {
}
void
GNEViewNetHelper::IntervalBar::buildIntervalBarElements() {
const auto staticTooltip = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
FXLabel* genericDataLabel = new FXLabel(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
TL("Data type"), 0, GUIDesignLabelThickedFixed(100));
genericDataLabel->create();
myGenericDataTypesComboBox = new MFXComboBoxIcon(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
staticTooltip, false, GUIDesignComboBoxVisibleItemsFixed, myViewNet,
MID_GNE_INTERVALBAR_GENERICDATATYPE, GUIDesignComboBoxFixed(180));
myGenericDataTypesComboBox->create();
myGenericDataTypesComboBox->appendIconItem("<all>");
myGenericDataTypesComboBox->appendIconItem(toString(GNE_TAG_EDGEREL_SINGLE).c_str());
myGenericDataTypesComboBox->appendIconItem(toString(SUMO_TAG_EDGEREL).c_str());
myGenericDataTypesComboBox->appendIconItem(toString(SUMO_TAG_TAZREL).c_str());
FXLabel* dataSetLabel = new FXLabel(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
TL("Data sets"), 0, GUIDesignLabelThickedFixed(100));
dataSetLabel->create();
myDataSetsComboBox = new MFXComboBoxIcon(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
staticTooltip, false, GUIDesignComboBoxVisibleItemsFixed,
myViewNet, MID_GNE_INTERVALBAR_DATASET, GUIDesignComboBoxFixed(180));
myDataSetsComboBox->create();
myIntervalCheckBox = new FXCheckButton(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
TL("Interval"), myViewNet, MID_GNE_INTERVALBAR_LIMITED, GUIDesignCheckButtonAttribute);
myIntervalCheckBox->create();
myBeginTextField = new FXTextField(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
GUIDesignTextFieldNCol, myViewNet, MID_GNE_INTERVALBAR_BEGIN, GUIDesignTextFieldFixedRestricted(50, TEXTFIELD_REAL));
myBeginTextField->create();
myEndTextField = new FXTextField(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
GUIDesignTextFieldNCol, myViewNet, MID_GNE_INTERVALBAR_END, GUIDesignTextFieldFixedRestricted(50, TEXTFIELD_REAL));
myEndTextField->create();
FXLabel* parameterLabel = new FXLabel(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
TL("Parameter"), 0, GUIDesignLabelThickedFixed(100));
parameterLabel->create();
myParametersComboBox = new MFXComboBoxIcon(myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar,
staticTooltip, false, GUIDesignComboBoxVisibleItemsFixed,
myViewNet, MID_GNE_INTERVALBAR_PARAMETER, GUIDesignComboBoxFixed(180));
myParametersComboBox->create();
myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar->recalc();
}
void
GNEViewNetHelper::IntervalBar::showIntervalBar() {
updateIntervalBar();
myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar->show();
}
void
GNEViewNetHelper::IntervalBar::hideIntervalBar() {
myViewNet->myViewParent->getGNEAppWindows()->getToolbarsGrip().intervalBar->hide();
}
void
GNEViewNetHelper::IntervalBar::updateIntervalBar() {
if (myUpdateInterval && myViewNet->getNet()) {
myDataSets.clear();
double begin = INVALID_DOUBLE;
double end = INVALID_DOUBLE;
myParameters.clear();
for (const auto& dataSet : myViewNet->getNet()->getAttributeCarriers()->getDataSets()) {
myDataSets.push_back(dataSet.second->getID());
for (const auto& interval : dataSet.second->getDataIntervalChildren()) {
if ((begin == INVALID_DOUBLE) || (interval.first < begin)) {
begin = interval.first;
}
if ((end == INVALID_DOUBLE) || (interval.first > end)) {
end = interval.first;
}
for (const auto& genericData : interval.second->getGenericDataChildren()) {
for (const auto& parameter : genericData->getParametersMap()) {
myParameters.insert(parameter.first);
}
}
}
}
const std::string previousDataSet = myDataSetsComboBox->getText().text();
const std::string previousBegin = (myIntervalCheckBox->getCheck() == TRUE) ? myBeginTextField->getText().text() : "";
const std::string previousEnd = (myIntervalCheckBox->getCheck() == TRUE) ? myEndTextField->getText().text() : "";
const std::string previousParameter = myParametersComboBox->getText().text();
myDataSetsComboBox->clearItems();
myParametersComboBox->clearItems();
myDataSetsComboBox->appendIconItem("<all>");
myParametersComboBox->appendIconItem("<all>");
for (const auto& dataSet : myDataSets) {
myDataSetsComboBox->appendIconItem(dataSet.c_str());
}
myBeginTextField->setText(toString(begin).c_str());
myEndTextField->setText(toString(end).c_str());
for (const auto& parameter : myParameters) {
myParametersComboBox->appendIconItem(parameter.c_str());
}
myDataSetsComboBox->setCurrentItem(0, FALSE);
for (int i = 0; i < myDataSetsComboBox->getNumItems(); i++) {
if (myDataSetsComboBox->getItemText(i) == previousDataSet) {
myDataSetsComboBox->setCurrentItem(i);
}
}
if (myIntervalCheckBox->getCheck() == TRUE) {
myBeginTextField->setText(previousBegin.c_str());
myEndTextField->setText(previousEnd.c_str());
}
myParametersComboBox->setCurrentItem(0, FALSE);
for (int i = 0; i < myParametersComboBox->getNumItems(); i++) {
if (myParametersComboBox->getItemText(i) == previousParameter) {
myParametersComboBox->setCurrentItem(i);
}
}
if ((myViewNet->getEditModes().dataEditMode == DataEditMode::DATA_INSPECT) ||
(myViewNet->getEditModes().dataEditMode == DataEditMode::DATA_SELECT) ||
(myViewNet->getEditModes().dataEditMode == DataEditMode::DATA_DELETE)) {
enableIntervalBar();
} else {
disableIntervalBar();
}
myUpdateInterval = false;
}
}
void
GNEViewNetHelper::IntervalBar::markForUpdate() {
myUpdateInterval = true;
}
SumoXMLTag
GNEViewNetHelper::IntervalBar::getGenericDataType() const {
if (myGenericDataTypesComboBox->isEnabled() && (myGenericDataTypesComboBox->getTextColor() == GUIDesignTextColorBlack)) {
if (myGenericDataTypesComboBox->getText() == toString(GNE_TAG_EDGEREL_SINGLE).c_str()) {
return GNE_TAG_EDGEREL_SINGLE;
} else if (myGenericDataTypesComboBox->getText() == toString(SUMO_TAG_EDGEREL).c_str()) {
return SUMO_TAG_EDGEREL;
} else if (myGenericDataTypesComboBox->getText() == toString(SUMO_TAG_TAZREL).c_str()) {
return SUMO_TAG_TAZREL;
}
}
return SUMO_TAG_NOTHING;
}
GNEDataSet*
GNEViewNetHelper::IntervalBar::getDataSet() const {
if (!myDataSetsComboBox->isEnabled() ||
(myDataSetsComboBox->getCurrentItem() == 0) ||
(myDataSetsComboBox->getTextColor() == GUIDesignTextColorRed)) {
return nullptr;
} else {
return myViewNet->getNet()->getAttributeCarriers()->retrieveDataSet(myDataSetsComboBox->getText().text());
}
}
double
GNEViewNetHelper::IntervalBar::getBegin() const {
if (!myIntervalCheckBox->isEnabled() || (myIntervalCheckBox->getCheck() == FALSE)) {
return INVALID_DOUBLE;
} else {
return GNEAttributeCarrier::parse<double>(myBeginTextField->getText().text());
}
}
double
GNEViewNetHelper::IntervalBar::getEnd() const {
if (!myIntervalCheckBox->isEnabled() || (myIntervalCheckBox->getCheck() == FALSE)) {
return INVALID_DOUBLE;
} else {
return GNEAttributeCarrier::parse<double>(myEndTextField->getText().text());
}
}
std::string
GNEViewNetHelper::IntervalBar::getParameter() const {
if (!myParametersComboBox->isEnabled() ||
(myParametersComboBox->getCurrentItem() == 0) ||
(myParametersComboBox->getTextColor() == GUIDesignTextColorRed)) {
return "";
} else {
return myParametersComboBox->getText().text();
}
}
void
GNEViewNetHelper::IntervalBar::setGenericDataType() {
if ((myGenericDataTypesComboBox->getText() == "<all>") ||
(myGenericDataTypesComboBox->getText() == toString(GNE_TAG_EDGEREL_SINGLE).c_str()) ||
(myGenericDataTypesComboBox->getText() == toString(SUMO_TAG_EDGEREL).c_str()) ||
(myGenericDataTypesComboBox->getText() == toString(SUMO_TAG_TAZREL).c_str())) {
myGenericDataTypesComboBox->setTextColor(GUIDesignTextColorBlack);
} else {
myGenericDataTypesComboBox->setTextColor(GUIDesignTextColorRed);
}
myViewNet->updateViewNet();
}
void
GNEViewNetHelper::IntervalBar::setDataSet() {
if (std::find(myDataSets.begin(), myDataSets.end(), myDataSetsComboBox->getText().text()) != myDataSets.end()) {
myDataSetsComboBox->setTextColor(GUIDesignTextColorBlack);
} else {
myDataSetsComboBox->setTextColor(GUIDesignTextColorRed);
}
myViewNet->updateViewNet();
}
void
GNEViewNetHelper::IntervalBar::setInterval() {
if (myIntervalCheckBox->isEnabled() && (myIntervalCheckBox->getCheck() == TRUE)) {
myBeginTextField->enable();
myEndTextField->enable();
} else {
myBeginTextField->disable();
myEndTextField->disable();
}
myViewNet->updateViewNet();
}
void
GNEViewNetHelper::IntervalBar::setBegin() {
if (myBeginTextField->getText().empty()) {
myBeginTextField->setText(toString(myViewNet->getNet()->getDataSetIntervalMinimumBegin()).c_str());
myBeginTextField->setTextColor(GUIDesignTextColorBlack);
} else if (GNEAttributeCarrier::canParse<double>(myBeginTextField->getText().text())) {
myBeginTextField->setTextColor(GUIDesignTextColorBlack);
} else {
myBeginTextField->setTextColor(GUIDesignTextColorRed);
}
myViewNet->updateViewNet();
}
void
GNEViewNetHelper::IntervalBar::setEnd() {
if (myEndTextField->getText().empty()) {
myEndTextField->setText(toString(myViewNet->getNet()->getDataSetIntervalMaximumEnd()).c_str());
myEndTextField->setTextColor(GUIDesignTextColorBlack);
} else if (GNEAttributeCarrier::canParse<double>(myEndTextField->getText().text())) {
myEndTextField->setTextColor(GUIDesignTextColorBlack);
} else {
myEndTextField->setTextColor(GUIDesignTextColorRed);
}
myViewNet->updateViewNet();
}
void
GNEViewNetHelper::IntervalBar::setParameter() {
if (myParameters.count(myParametersComboBox->getText().text()) > 0) {
myParametersComboBox->setTextColor(GUIDesignTextColorBlack);
} else {
myParametersComboBox->setTextColor(GUIDesignTextColorRed);
}
myViewNet->updateViewNet();
}
void
GNEViewNetHelper::IntervalBar::enableIntervalBar() {
myGenericDataTypesComboBox->enable();
myDataSetsComboBox->enable();
myIntervalCheckBox->enable();
if (myIntervalCheckBox->getCheck() == TRUE) {
myBeginTextField->enable();
myEndTextField->enable();
} else {
myBeginTextField->disable();
myEndTextField->disable();
}
myParametersComboBox->enable();
}
void
GNEViewNetHelper::IntervalBar::disableIntervalBar() {
myGenericDataTypesComboBox->disable();
myDataSetsComboBox->disable();
myIntervalCheckBox->disable();
myBeginTextField->disable();
myEndTextField->disable();
myParametersComboBox->disable();
}
GNEViewNetHelper::CommonCheckableButtons::CommonCheckableButtons(GNEViewNet* viewNet) :
myViewNet(viewNet) {
}
void
GNEViewNetHelper::CommonCheckableButtons::buildCommonCheckableButtons() {
auto gripModes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().modes;
auto tooltipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
inspectButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Inspect mode") + std::string("\t") + TL("Mode to inspect elements and change their attributes. (I)"),
GUIIconSubSys::getIcon(GUIIcon::MODEINSPECT), myViewNet, MID_HOTKEY_I_MODE_INSPECT, GUIDesignMFXCheckableButtonSquare);
inspectButton->create();
deleteButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Delete mode") + std::string("\t") + TL("Mode for deleting elements. (D)"),
GUIIconSubSys::getIcon(GUIIcon::MODEDELETE), myViewNet, MID_HOTKEY_D_MODE_SINGLESIMULATIONSTEP_DELETE, GUIDesignMFXCheckableButtonSquare);
deleteButton->create();
selectButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Select mode") + std::string("\t") + TL("Mode for selecting elements. (S)"),
GUIIconSubSys::getIcon(GUIIcon::MODESELECT), myViewNet, MID_HOTKEY_S_MODE_STOPSIMULATION_SELECT, GUIDesignMFXCheckableButtonSquare);
selectButton->create();
gripModes->recalc();
}
void
GNEViewNetHelper::CommonCheckableButtons::showCommonCheckableButtons() {
inspectButton->show();
deleteButton->show();
selectButton->show();
}
void
GNEViewNetHelper::CommonCheckableButtons::hideCommonCheckableButtons() {
inspectButton->hide();
deleteButton->hide();
selectButton->hide();
}
void
GNEViewNetHelper::CommonCheckableButtons::disableCommonCheckableButtons() {
inspectButton->setChecked(false);
deleteButton->setChecked(false);
selectButton->setChecked(false);
}
void
GNEViewNetHelper::CommonCheckableButtons::updateCommonCheckableButtons() {
inspectButton->update();
deleteButton->update();
selectButton->update();
}
GNEViewNetHelper::NetworkCheckableButtons::NetworkCheckableButtons(GNEViewNet* viewNet) :
myViewNet(viewNet) {
}
void
GNEViewNetHelper::NetworkCheckableButtons::buildNetworkCheckableButtons() {
auto gripModes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().modes;
auto tooltipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
moveNetworkElementsButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Move mode") + std::string("\t") + TL("Mode for moving elements. (M)"),
GUIIconSubSys::getIcon(GUIIcon::MODEMOVE), myViewNet, MID_HOTKEY_M_MODE_MOVE_MEANDATA, GUIDesignMFXCheckableButtonSquare);
moveNetworkElementsButton->create();
createEdgeButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Edge mode") + std::string("\t") + TL("Mode for creating junctions and edges. (E)"),
GUIIconSubSys::getIcon(GUIIcon::MODECREATEEDGE), myViewNet, MID_HOTKEY_E_MODE_EDGE_EDGEDATA, GUIDesignMFXCheckableButtonSquare);
createEdgeButton->create();
trafficLightButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Traffic light mode") + std::string("\t") + TL("Mode for editing traffic lights over junctions. (T)"),
GUIIconSubSys::getIcon(GUIIcon::MODETLS), myViewNet, MID_HOTKEY_T_MODE_TLS_TYPE, GUIDesignMFXCheckableButtonSquare);
trafficLightButton->create();
connectionButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Connection mode") + std::string("\t") + TL("Mode for edit connections between lanes. (C)"),
GUIIconSubSys::getIcon(GUIIcon::MODECONNECTION), myViewNet, MID_HOTKEY_C_MODE_CONNECT_CONTAINER, GUIDesignMFXCheckableButtonSquare);
connectionButton->create();
prohibitionButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Prohibition mode") + std::string("\t") + TL("Mode for editing connection prohibitions. (H)"),
GUIIconSubSys::getIcon(GUIIcon::MODEPROHIBITION), myViewNet, MID_HOTKEY_H_MODE_PROHIBITION_CONTAINERPLAN, GUIDesignMFXCheckableButtonSquare);
prohibitionButton->create();
crossingButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Crossing mode") + std::string("\t") + TL("Mode for creating crossings between edges. (R)"),
GUIIconSubSys::getIcon(GUIIcon::MODECROSSING), myViewNet, MID_HOTKEY_R_MODE_CROSSING_ROUTE_EDGERELDATA, GUIDesignMFXCheckableButtonSquare);
crossingButton->create();
additionalButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Additional mode") + std::string("\t") + TL("Mode for creating additional elements. (A)"),
GUIIconSubSys::getIcon(GUIIcon::MODEADDITIONAL), myViewNet, MID_HOTKEY_A_MODE_STARTSIMULATION_ADDITIONALS_STOPS, GUIDesignMFXCheckableButtonSquare);
additionalButton->create();
wireButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Wire mode") + std::string("\t") + TL("Mode for editing overhead wires. (W)"),
GUIIconSubSys::getIcon(GUIIcon::MODEWIRE), myViewNet, MID_HOTKEY_W_MODE_WIRE_ROUTEDISTRIBUTION, GUIDesignMFXCheckableButtonSquare);
wireButton->create();
TAZButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("TAZ mode") + std::string("\t") + TL("Mode for creating Traffic Assignment Zones. (Z)"),
GUIIconSubSys::getIcon(GUIIcon::MODETAZ), myViewNet, MID_HOTKEY_Z_MODE_TAZ_TAZREL, GUIDesignMFXCheckableButtonSquare);
TAZButton->create();
shapeButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Polygon mode") + std::string("\t") + TL("Mode for creating polygons and POIs. (P)"),
GUIIconSubSys::getIcon(GUIIcon::MODESHAPE), myViewNet, MID_HOTKEY_P_MODE_POLYGON_PERSON, GUIDesignMFXCheckableButtonSquare);
shapeButton->create();
decalButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Decal mode") + std::string("\t") + TL("Mode for editing decals. (U)"),
GUIIconSubSys::getIcon(GUIIcon::MODEDECAL), myViewNet, MID_HOTKEY_U_MODE_DECAL_TYPEDISTRIBUTION, GUIDesignMFXCheckableButtonSquare);
decalButton->create();
gripModes->recalc();
}
void
GNEViewNetHelper::NetworkCheckableButtons::showNetworkCheckableButtons() {
if (myViewNet->getEditModes().isJuPedSimView()) {
moveNetworkElementsButton->show();
createEdgeButton->show();
connectionButton->hide();
trafficLightButton->hide();
additionalButton->show();
crossingButton->show();
TAZButton->show();
shapeButton->show();
prohibitionButton->hide();
wireButton->hide();
decalButton->hide();
} else {
moveNetworkElementsButton->show();
createEdgeButton->show();
connectionButton->show();
trafficLightButton->show();
additionalButton->show();
crossingButton->show();
TAZButton->show();
shapeButton->show();
prohibitionButton->show();
wireButton->show();
decalButton->show();
}
}
void
GNEViewNetHelper::NetworkCheckableButtons::hideNetworkCheckableButtons() {
moveNetworkElementsButton->hide();
createEdgeButton->hide();
connectionButton->hide();
trafficLightButton->hide();
additionalButton->hide();
crossingButton->hide();
TAZButton->hide();
shapeButton->hide();
prohibitionButton->hide();
wireButton->hide();
decalButton->hide();
}
void
GNEViewNetHelper::NetworkCheckableButtons::disableNetworkCheckableButtons() {
moveNetworkElementsButton->setChecked(false);
createEdgeButton->setChecked(false);
connectionButton->setChecked(false);
trafficLightButton->setChecked(false);
additionalButton->setChecked(false);
crossingButton->setChecked(false);
TAZButton->setChecked(false);
shapeButton->setChecked(false);
prohibitionButton->setChecked(false);
wireButton->setChecked(false);
decalButton->setChecked(false);
}
void
GNEViewNetHelper::NetworkCheckableButtons::updateNetworkCheckableButtons() {
moveNetworkElementsButton->update();
createEdgeButton->update();
connectionButton->update();
trafficLightButton->update();
additionalButton->update();
crossingButton->update();
TAZButton->update();
shapeButton->update();
prohibitionButton->update();
wireButton->update();
decalButton->update();
}
GNEViewNetHelper::DemandCheckableButtons::DemandCheckableButtons(GNEViewNet* viewNet) :
myViewNet(viewNet) {
}
void
GNEViewNetHelper::DemandCheckableButtons::buildDemandCheckableButtons() {
auto gripModes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().modes;
auto tooltipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
moveDemandElementsButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Move mode") + std::string("\t") + TL("Mode for moving elements. (M)"),
GUIIconSubSys::getIcon(GUIIcon::MODEMOVE), myViewNet, MID_HOTKEY_M_MODE_MOVE_MEANDATA, GUIDesignMFXCheckableButtonSquare);
moveDemandElementsButton->create();
routeButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Route mode") + std::string("\t") + TL("Mode for creating routes. (R)"),
GUIIconSubSys::getIcon(GUIIcon::MODEROUTE), myViewNet, MID_HOTKEY_R_MODE_CROSSING_ROUTE_EDGERELDATA, GUIDesignMFXCheckableButtonSquare);
routeButton->create();
routeDistributionButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Route distribution mode") + std::string("\t") + TL("Mode for creating and editing rout distributions. (W)"),
GUIIconSubSys::getIcon(GUIIcon::MODEROUTEDISTRIBUTION), myViewNet, MID_HOTKEY_W_MODE_WIRE_ROUTEDISTRIBUTION, GUIDesignMFXCheckableButtonSquare);
routeDistributionButton->create();
vehicleButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Vehicle mode") + std::string("\t") + TL("Mode for creating vehicles. (V)"),
GUIIconSubSys::getIcon(GUIIcon::MODEVEHICLE), myViewNet, MID_HOTKEY_V_MODE_VEHICLE, GUIDesignMFXCheckableButtonSquare);
vehicleButton->create();
typeButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Type mode") + std::string("\t") + TL("Mode for creating types (of vehicles, persons and containers). (T)"),
GUIIconSubSys::getIcon(GUIIcon::MODETYPE), myViewNet, MID_HOTKEY_T_MODE_TLS_TYPE, GUIDesignMFXCheckableButtonSquare);
typeButton->create();
typeDistributionButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Type distribution mode") + std::string("\t") + TL("Mode for creating and editing type distribution. (U)"),
GUIIconSubSys::getIcon(GUIIcon::MODETYPEDISTRIBUTION), myViewNet, MID_HOTKEY_U_MODE_DECAL_TYPEDISTRIBUTION, GUIDesignMFXCheckableButtonSquare);
typeDistributionButton->create();
stopButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Stop mode") + std::string("\t") + TL("Mode for creating stops. (A)"),
GUIIconSubSys::getIcon(GUIIcon::MODESTOP), myViewNet, MID_HOTKEY_A_MODE_STARTSIMULATION_ADDITIONALS_STOPS, GUIDesignMFXCheckableButtonSquare);
stopButton->create();
personButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Person mode") + std::string("\t") + TL("Mode for creating persons. (P)"),
GUIIconSubSys::getIcon(GUIIcon::MODEPERSON), myViewNet, MID_HOTKEY_P_MODE_POLYGON_PERSON, GUIDesignMFXCheckableButtonSquare);
personButton->create();
personPlanButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Person plan mode") + std::string("\t") + TL("Mode for creating person plans. (L)"),
GUIIconSubSys::getIcon(GUIIcon::MODEPERSONPLAN), myViewNet, MID_HOTKEY_L_MODE_PERSONPLAN, GUIDesignMFXCheckableButtonSquare);
personPlanButton->create();
containerButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Container mode") + std::string("\t") + TL("Mode for creating containers. (C)"),
GUIIconSubSys::getIcon(GUIIcon::MODECONTAINER), myViewNet, MID_HOTKEY_C_MODE_CONNECT_CONTAINER, GUIDesignMFXCheckableButtonSquare);
containerButton->create();
containerPlanButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Container plan mode") + std::string("\t") + TL("Mode for creating container plans. (H)"),
GUIIconSubSys::getIcon(GUIIcon::MODECONTAINERPLAN), myViewNet, MID_HOTKEY_H_MODE_PROHIBITION_CONTAINERPLAN, GUIDesignMFXCheckableButtonSquare);
containerPlanButton->create();
gripModes->recalc();
}
void
GNEViewNetHelper::DemandCheckableButtons::showDemandCheckableButtons() {
if (myViewNet->getEditModes().isJuPedSimView()) {
moveDemandElementsButton->hide();
routeButton->show();
routeDistributionButton->show();
vehicleButton->hide();
typeButton->show();
typeDistributionButton->show();
stopButton->hide();
personButton->show();
personPlanButton->show();
containerButton->hide();
containerPlanButton->hide();
} else {
moveDemandElementsButton->show();
routeButton->show();
routeDistributionButton->show();
vehicleButton->show();
typeButton->show();
typeDistributionButton->show();
stopButton->show();
personButton->show();
personPlanButton->show();
containerButton->show();
containerPlanButton->show();
}
}
void
GNEViewNetHelper::DemandCheckableButtons::hideDemandCheckableButtons() {
moveDemandElementsButton->hide();
routeButton->hide();
routeDistributionButton->hide();
vehicleButton->hide();
typeButton->hide();
typeDistributionButton->hide();
stopButton->hide();
personButton->hide();
personPlanButton->hide();
containerButton->hide();
containerPlanButton->hide();
}
void
GNEViewNetHelper::DemandCheckableButtons::disableDemandCheckableButtons() {
moveDemandElementsButton->setChecked(false);
routeButton->setChecked(false);
routeDistributionButton->setChecked(false);
vehicleButton->setChecked(false);
typeButton->setChecked(false);
typeDistributionButton->setChecked(false);
stopButton->setChecked(false);
personButton->setChecked(false);
personPlanButton->setChecked(false);
containerButton->setChecked(false);
containerPlanButton->setChecked(false);
}
void
GNEViewNetHelper::DemandCheckableButtons::updateDemandCheckableButtons() {
moveDemandElementsButton->update();
routeButton->update();
routeDistributionButton->update();
vehicleButton->update();
typeButton->update();
typeDistributionButton->update();
stopButton->update();
personButton->update();
personPlanButton->update();
containerButton->update();
containerPlanButton->update();
}
GNEViewNetHelper::DataCheckableButtons::DataCheckableButtons(GNEViewNet* viewNet) :
myViewNet(viewNet) {
}
void
GNEViewNetHelper::DataCheckableButtons::buildDataCheckableButtons() {
auto gripModes = myViewNet->getViewParent()->getGNEAppWindows()->getToolbarsGrip().modes;
auto tooltipMenu = myViewNet->myViewParent->getGNEAppWindows()->getStaticTooltipMenu();
edgeDataButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Edge data mode") + std::string("\t") + TL("Mode for creating edge datas. (E)"),
GUIIconSubSys::getIcon(GUIIcon::MODEEDGEDATA), myViewNet, MID_HOTKEY_E_MODE_EDGE_EDGEDATA, GUIDesignMFXCheckableButtonSquare);
edgeDataButton->create();
edgeRelDataButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("Edge relation data mode") + std::string("\t") + TL("Mode for creating edge relation datas. (R)"),
GUIIconSubSys::getIcon(GUIIcon::MODEEDGERELDATA), myViewNet, MID_HOTKEY_R_MODE_CROSSING_ROUTE_EDGERELDATA, GUIDesignMFXCheckableButtonSquare);
edgeRelDataButton->create();
TAZRelDataButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("TAZ relation data mode") + std::string("\t") + TL("Mode for creating TAZ relation datas. (Z)"),
GUIIconSubSys::getIcon(GUIIcon::MODETAZRELDATA), myViewNet, MID_HOTKEY_Z_MODE_TAZ_TAZREL, GUIDesignMFXCheckableButtonSquare);
TAZRelDataButton->create();
meanDataButton = new MFXCheckableButton(false, gripModes, tooltipMenu,
std::string("\t") + TL("MeanData mode") + std::string("\t") + TL("Mode for MeanData elements. (M)"),
GUIIconSubSys::getIcon(GUIIcon::MODEMEANDATA), myViewNet, MID_HOTKEY_M_MODE_MOVE_MEANDATA, GUIDesignMFXCheckableButtonSquare);
meanDataButton->create();
gripModes->recalc();
}
void
GNEViewNetHelper::DataCheckableButtons::showDataCheckableButtons() {
edgeDataButton->show();
edgeRelDataButton->show();
TAZRelDataButton->show();
meanDataButton->show();
}
void
GNEViewNetHelper::DataCheckableButtons::hideDataCheckableButtons() {
edgeDataButton->hide();
edgeRelDataButton->hide();
TAZRelDataButton->hide();
meanDataButton->hide();
}
void
GNEViewNetHelper::DataCheckableButtons::disableDataCheckableButtons() {
edgeDataButton->setChecked(false);
edgeRelDataButton->setChecked(false);
TAZRelDataButton->setChecked(false);
meanDataButton->setChecked(false);
}
void
GNEViewNetHelper::DataCheckableButtons::updateDataCheckableButtons() {
edgeDataButton->update();
edgeRelDataButton->update();
TAZRelDataButton->update();
meanDataButton->update();
}
GNEViewNetHelper::EditNetworkElementShapes::EditNetworkElementShapes(GNEViewNet* viewNet) :
myViewNet(viewNet),
myPreviousNetworkEditMode(NetworkEditMode::NETWORK_NONE) {
}
void
GNEViewNetHelper::EditNetworkElementShapes::startEditCustomShape(GNENetworkElement* element) {
if (element && (myEditedNetworkElement == nullptr)) {
myPreviousNetworkEditMode = myViewNet->myEditModes.networkEditMode;
myViewNet->myEditModes.setNetworkEditMode(NetworkEditMode::NETWORK_MOVE);
myEditedNetworkElement = element;
myEditedNetworkElement->setShapeEdited(true);
myViewNet->updateViewNet();
}
}
void
GNEViewNetHelper::EditNetworkElementShapes::stopEditCustomShape() {
if (myEditedNetworkElement != nullptr) {
myEditedNetworkElement->setShapeEdited(false);
myEditedNetworkElement = nullptr;
if (myViewNet->myEditModes.networkEditMode != myPreviousNetworkEditMode) {
myViewNet->myEditModes.setNetworkEditMode(myPreviousNetworkEditMode);
}
}
}
void
GNEViewNetHelper::EditNetworkElementShapes::commitShapeEdited() {
if (myEditedNetworkElement != nullptr) {
stopEditCustomShape();
}
}
GNENetworkElement*
GNEViewNetHelper::EditNetworkElementShapes::getEditedNetworkElement() const {
return myEditedNetworkElement;
}
void
GNEViewNetHelper::LockIcon::drawLockIcon(const GUIVisualizationSettings::Detail d,
const GNEAttributeCarrier* AC, GUIGlObjectType type, const Position position, const double exaggeration,
const double size, const double offsetx, const double offsety) {
if (checkDrawing(d, AC, type, exaggeration)) {
GLHelper::pushMatrix();
glTranslated(position.x(), position.y(), GLO_LOCKICON);
glTranslated(offsetx, offsety, 0);
glRotated(180, 0, 0, 1);
glColor3d(1, 1, 1);
GUITexturesHelper::drawTexturedBox(GUITextureSubSys::getTexture(GUITexture::LOCK), size);
GLHelper::popMatrix();
}
}
GNEViewNetHelper::LockIcon::LockIcon() {}
bool
GNEViewNetHelper::LockIcon::checkDrawing(const GUIVisualizationSettings::Detail d, const GNEAttributeCarrier* AC,
GUIGlObjectType type, const double exaggeration) {
if (d > GUIVisualizationSettings::Detail::LockedIcons) {
return false;
}
const auto viewNet = AC->getNet()->getViewNet();
if (exaggeration == 0) {
return false;
}
if (viewNet->getEditModes().isCurrentSupermodeNetwork() &&
!(AC->getTagProperty()->isNetworkElement() || AC->getTagProperty()->isAdditionalElement())) {
return false;
}
if (viewNet->getEditModes().isCurrentSupermodeDemand() && (!AC->getTagProperty()->isDemandElement())) {
return false;
}
if (viewNet->getEditModes().isCurrentSupermodeData() && (!AC->getTagProperty()->isDataElement())) {
return false;
}
if (!viewNet->getLockManager().isObjectLocked(type, AC->isAttributeCarrierSelected())) {
return false;
}
return true;
}
const std::vector<RGBColor>&
GNEViewNetHelper::getRainbowScaledColors() {
if (myRainbowScaledColors.empty()) {
myRainbowScaledColors.push_back(RGBColor(232, 35, 0, 255));
myRainbowScaledColors.push_back(RGBColor(255, 165, 0, 255));
myRainbowScaledColors.push_back(RGBColor(255, 255, 0, 255));
myRainbowScaledColors.push_back(RGBColor(28, 215, 0, 255));
myRainbowScaledColors.push_back(RGBColor(0, 181, 100, 255));
myRainbowScaledColors.push_back(RGBColor(0, 255, 191, 255));
myRainbowScaledColors.push_back(RGBColor(178, 255, 255, 255));
myRainbowScaledColors.push_back(RGBColor(0, 112, 184, 255));
myRainbowScaledColors.push_back(RGBColor(56, 41, 131, 255));
myRainbowScaledColors.push_back(RGBColor(127, 0, 255, 255));
}
return myRainbowScaledColors;
}
const RGBColor&
GNEViewNetHelper::getRainbowScaledColor(const double min, const double max, const double value) {
if (value <= min) {
return getRainbowScaledColors().front();
} else if (value >= max) {
return getRainbowScaledColors().back();
} else {
const double procent = ((value - min) * 100) / (max - min);
if (procent <= 0) {
return getRainbowScaledColors().front();
} else if (procent >= 100) {
return getRainbowScaledColors().back();
} else {
return getRainbowScaledColors().at((int)(procent / 10.0));
}
}
}
std::vector<GUIGlObject*>
GNEViewNetHelper::filterElementsByLayer(const std::vector<GUIGlObject*>& GLObjects) {
std::vector<GUIGlObject*> filteredGLObjects;
if (GLObjects.size() > 0) {
const auto firstLayer = GLObjects.front()->getType();
for (const auto& GLObject : GLObjects) {
if ((GLO_RIDE <= firstLayer) && (firstLayer <= GLO_TRANSHIP) &&
(GLO_RIDE <= GLObject->getType()) && (GLObject->getType() <= GLO_TRANSHIP)) {
filteredGLObjects.push_back(GLObject);
} else if ((GLO_STOP <= firstLayer) && (firstLayer <= GLO_STOP_PLAN) &&
(GLO_STOP <= GLObject->getType()) && (GLObject->getType() <= GLO_STOP_PLAN)) {
filteredGLObjects.push_back(GLObject);
} else if ((GLO_VEHICLE <= firstLayer) && (firstLayer <= GLO_ROUTEFLOW) &&
(GLO_VEHICLE <= GLObject->getType()) && (GLObject->getType() <= GLO_ROUTEFLOW)) {
filteredGLObjects.push_back(GLObject);
} else if ((GLO_PERSON <= firstLayer) && (firstLayer <= GLO_PERSONFLOW) &&
(GLO_PERSON <= GLObject->getType()) && (GLObject->getType() <= GLO_PERSONFLOW)) {
filteredGLObjects.push_back(GLObject);
} else if ((GLO_CONTAINER <= firstLayer) && (firstLayer <= GLO_CONTAINERFLOW) &&
(GLO_CONTAINER <= GLObject->getType()) && (GLObject->getType() <= GLO_CONTAINERFLOW)) {
filteredGLObjects.push_back(GLObject);
} else if (GLObject->getType() == firstLayer) {
filteredGLObjects.push_back(GLObject);
}
}
}
return filteredGLObjects;
}