#include <netedit/frames/common/GNEInspectorFrame.h>
#include <netedit/GNEViewNet.h>
#include <utils/foxtools/MFXDynamicLabel.h>
#include <utils/gui/div/GUIDesigns.h>
#include <utils/gui/windows/GUIAppEnum.h>
#include "GNEDrawingShape.h"
FXDEFMAP(GNEDrawingShape) DrawingShapeMap[] = {
FXMAPFUNC(SEL_COMMAND, MID_GNE_STARTDRAWING, GNEDrawingShape::onCmdStartDrawing),
FXMAPFUNC(SEL_COMMAND, MID_GNE_STOPDRAWING, GNEDrawingShape::onCmdStopDrawing),
FXMAPFUNC(SEL_COMMAND, MID_GNE_ABORTDRAWING, GNEDrawingShape::onCmdAbortDrawing)
};
FXIMPLEMENT(GNEDrawingShape, MFXGroupBoxModule, DrawingShapeMap, ARRAYNUMBER(DrawingShapeMap))
GNEDrawingShape::GNEDrawingShape(GNEFrame* frameParent) :
MFXGroupBoxModule(frameParent, TL("Drawing")),
myFrameParent(frameParent),
myDeleteLastCreatedPoint(false) {
myStartDrawingButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Start drawing"), "", "", 0, this, MID_GNE_STARTDRAWING, GUIDesignButton);
myStopDrawingButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Stop drawing"), "", "", 0, this, MID_GNE_STOPDRAWING, GUIDesignButton);
myAbortDrawingButton = GUIDesigns::buildFXButton(getCollapsableFrame(), TL("Abort drawing"), "", "", 0, this, MID_GNE_ABORTDRAWING, GUIDesignButton);
std::ostringstream information;
information
<< "- " << TL("'Start drawing' or ENTER to create a shape.") << "\n"
<< "- " << TL("'Stop drawing' or ENTER to finish shape creation.") << "\n"
<< "- " << TL("'Abort drawing' or ESC to abort shape creation.") << "\n"
<< "- " << TL("'Shift + Click' to remove the last inserted point.");
myInformationLabel = new MFXDynamicLabel(getCollapsableFrame(), information.str().c_str(), 0, GUIDesignLabelFrameInformation);
myStopDrawingButton->disable();
myAbortDrawingButton->disable();
}
GNEDrawingShape::~GNEDrawingShape() {}
void GNEDrawingShape::showDrawingShape() {
abortDrawing();
MFXGroupBoxModule::show();
}
void GNEDrawingShape::hideDrawingShape() {
abortDrawing();
MFXGroupBoxModule::hide();
}
void
GNEDrawingShape::startDrawing() {
if (shown()) {
myStartDrawingButton->disable();
myStopDrawingButton->enable();
myAbortDrawingButton->enable();
}
}
void
GNEDrawingShape::stopDrawing() {
if (myFrameParent->shapeDrawed()) {
myTemporalShape.clear();
myStartDrawingButton->enable();
myStopDrawingButton->disable();
myAbortDrawingButton->disable();
} else {
abortDrawing();
}
}
void
GNEDrawingShape::abortDrawing() {
myTemporalShape.clear();
myStartDrawingButton->enable();
myStopDrawingButton->disable();
myAbortDrawingButton->disable();
}
void
GNEDrawingShape::addNewPoint(const Position& P) {
if (myStopDrawingButton->isEnabled()) {
myTemporalShape.push_back(P);
} else {
throw ProcessError(TL("A new point cannot be added if drawing wasn't started"));
}
}
void
GNEDrawingShape::removeLastPoint() {
if (myTemporalShape.size() > 1) {
myTemporalShape.pop_back();
}
}
const PositionVector&
GNEDrawingShape::getTemporalShape() const {
return myTemporalShape;
}
bool
GNEDrawingShape::isDrawing() const {
return myStopDrawingButton->isEnabled();
}
void
GNEDrawingShape::setDeleteLastCreatedPoint(bool value) {
myDeleteLastCreatedPoint = value;
myFrameParent->getViewNet()->updateViewNet();
}
bool
GNEDrawingShape::getDeleteLastCreatedPoint() {
return myDeleteLastCreatedPoint;
}
long
GNEDrawingShape::onCmdStartDrawing(FXObject*, FXSelector, void*) {
startDrawing();
return 0;
}
long
GNEDrawingShape::onCmdStopDrawing(FXObject*, FXSelector, void*) {
stopDrawing();
return 0;
}
long
GNEDrawingShape::onCmdAbortDrawing(FXObject*, FXSelector, void*) {
abortDrawing();
return 0;
}