fixed some issues
improvied editing changed toolbox
This commit is contained in:
@@ -15,6 +15,13 @@
|
||||
#include "../mapview/model/MMFloorGroundTruthPoints.h"
|
||||
|
||||
#include "../mapview/2D/tools/ToolMeasure.h"
|
||||
#include "../mapview/2D/tools/ToolSelector.h"
|
||||
#include "../mapview/2D/tools/ToolNewElement.h"
|
||||
#include "../mapview/2D/tools/ToolNewWall.h"
|
||||
#include "../mapview/2D/tools/ToolNewDoor.h"
|
||||
#include "../mapview/2D/tools/ToolNewStair.h"
|
||||
#include "../mapview/2D/tools/ToolNewElevator.h"
|
||||
#include "../mapview/2D/tools/ToolNewOutline.h"
|
||||
|
||||
#include "../UIHelper.h"
|
||||
|
||||
@@ -124,6 +131,12 @@ ToolBoxWidget::ToolBoxWidget(MapView2D* view, QWidget *parent) : QWidget(parent)
|
||||
lay->addWidget(btnGTP, r++, 0, 1,1,Qt::AlignTop);
|
||||
connect(btnGTP, SIGNAL(clicked(bool)), this, SLOT(onNewGTP()));
|
||||
|
||||
|
||||
|
||||
// what to do when the main-tool is changed
|
||||
connect(&view->getTools(), SIGNAL(mainToolChanged()), this, SLOT(onMainToolChanged()));
|
||||
|
||||
|
||||
// FILL
|
||||
lay->addItem(new QSpacerItem(0,0,QSizePolicy::Minimum, QSizePolicy::MinimumExpanding), r, 0);
|
||||
|
||||
@@ -132,6 +145,27 @@ ToolBoxWidget::ToolBoxWidget(MapView2D* view, QWidget *parent) : QWidget(parent)
|
||||
|
||||
}
|
||||
|
||||
|
||||
void ToolBoxWidget::onMainToolChanged() {
|
||||
|
||||
// get the currently active Main-Tool
|
||||
Tool* t = view->getTools().getMain();
|
||||
|
||||
QString styleSel = "background-color: #bbbbff;";
|
||||
QString styleNor = "";
|
||||
|
||||
// highlight the corresponding button
|
||||
btnSelect->setStyleSheet( dynamic_cast<ToolSelector*>(t) ? styleSel : styleNor );
|
||||
btnMeasure->setStyleSheet( dynamic_cast<ToolMeasure*>(t) ? styleSel : styleNor );
|
||||
|
||||
btnGround->setStyleSheet( dynamic_cast<ToolNewOutline*>(t) ? styleSel : styleNor );
|
||||
|
||||
btnDoor->setStyleSheet( dynamic_cast<ToolNewDoor*>(t) ? styleSel : styleNor );
|
||||
btnWall->setStyleSheet( dynamic_cast<ToolNewWall*>(t) ? styleSel : styleNor );
|
||||
btnElevator->setStyleSheet( dynamic_cast<ToolNewElevator*>(t) ? styleSel : styleNor );
|
||||
|
||||
}
|
||||
|
||||
void ToolBoxWidget::setSelectedLayer(MapLayer *ml) {
|
||||
|
||||
this->curLayer = ml;
|
||||
@@ -158,249 +192,42 @@ void ToolBoxWidget::setSelectedLayer(MapLayer *ml) {
|
||||
|
||||
void ToolBoxWidget::onNewGround() {
|
||||
|
||||
const Point2 center = view->getScaler().getCenter();
|
||||
float s = view->getScaler().sm(50);
|
||||
// const Point2 center = view->getScaler().getCenter();
|
||||
// float s = view->getScaler().sm(50);
|
||||
|
||||
Floorplan::FloorOutlinePolygon* poly = new Floorplan::FloorOutlinePolygon();
|
||||
poly->name = "new";
|
||||
poly->poly.points.push_back(Point2(center.x-s, center.y-s));
|
||||
poly->poly.points.push_back(Point2(center.x+s, center.y-s));
|
||||
poly->poly.points.push_back(Point2(center.x, center.y+s));
|
||||
// Floorplan::FloorOutlinePolygon* poly = new Floorplan::FloorOutlinePolygon();
|
||||
// poly->name = "new";
|
||||
// poly->poly.points.push_back(Point2(center.x-s, center.y-s));
|
||||
// poly->poly.points.push_back(Point2(center.x+s, center.y-s));
|
||||
// poly->poly.points.push_back(Point2(center.x, center.y+s));
|
||||
|
||||
|
||||
MMFloorOutline* ml = (MMFloorOutline*)curLayer;
|
||||
ml->create(poly);
|
||||
// MMFloorOutline* ml = (MMFloorOutline*)curLayer;
|
||||
// ml->create(poly);
|
||||
|
||||
// view->getModel()->reselect();
|
||||
|
||||
view->getTools().setMain(new ToolNewOutline(view->getTools(), curLayer));
|
||||
|
||||
view->getModel()->reselect();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
template <typename FloorplanElement, typename MapModelElement> class NewElementTool : public Tool {
|
||||
|
||||
protected:
|
||||
|
||||
/** add another line after this one? */
|
||||
bool addAnother = true;
|
||||
|
||||
/** register this tool into the given tools-queue */
|
||||
Tools& tools;
|
||||
Tool* oldMainTool;
|
||||
|
||||
/** the layer to add the new element to */
|
||||
MapLayer* layer = nullptr;
|
||||
|
||||
/** currently edited element */
|
||||
FloorplanElement* foEL = nullptr;
|
||||
MapModelElement* mmEL = nullptr;
|
||||
|
||||
public:
|
||||
|
||||
NewElementTool(Tools& tools, MapLayer* layer) : tools(tools), layer(layer) {
|
||||
oldMainTool = tools.getMain(); // keep the current tool to reset it later
|
||||
tools.setMain(this);
|
||||
}
|
||||
|
||||
virtual ~NewElementTool() {
|
||||
tools.setMain(oldMainTool); // reset to the previous tool
|
||||
}
|
||||
|
||||
virtual bool mousePressEvent(MapView2D* m, QMouseEvent* e) override {
|
||||
if (e->button() == Qt::MouseButton::LeftButton) {
|
||||
(void) m; (void) e;
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
virtual bool mouseMoveEvent(MapView2D* m, QMouseEvent* e) override {
|
||||
const Point2 onScreen(e->x(), e->y());
|
||||
Point2 onMap = m->getScaler().sm(onScreen);
|
||||
onMap = m->getScaler().snap(onMap);
|
||||
moving(onMap);
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual bool mouseReleaseEvent(MapView2D* m, QMouseEvent* e) override {
|
||||
if (e->button() == Qt::MouseButton::LeftButton) {
|
||||
(void) m; (void) e;
|
||||
next();
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
virtual bool keyPressEvent(MapView2D* m, QKeyEvent* e) override {
|
||||
(void) m;
|
||||
if (e->key() == Qt::Key_Escape) {
|
||||
deleteCurrent();
|
||||
disableMe();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
/** all subclasses must create a new, empty element here */
|
||||
virtual void createEmptyElement() = 0;
|
||||
|
||||
/** mouse is currently moved */
|
||||
virtual void moving(const Point2 mapPoint) = 0;
|
||||
|
||||
/** next pont */
|
||||
virtual void next() = 0;
|
||||
|
||||
protected:
|
||||
|
||||
void create() {
|
||||
createEmptyElement();
|
||||
mmEL->getMV2D()->focus();
|
||||
}
|
||||
|
||||
/** delete the currently edited element */
|
||||
void deleteCurrent() {
|
||||
if (mmEL) {mmEL->deleteMe();}
|
||||
}
|
||||
|
||||
/** finalize the current element (if any) */
|
||||
void finalizeCurrent() {
|
||||
if (!mmEL) {return;}
|
||||
mmEL->getMV2D()->unfocus();
|
||||
mmEL = nullptr;
|
||||
}
|
||||
|
||||
/** finish creating new elements */
|
||||
void disableMe() {
|
||||
finalizeCurrent();
|
||||
delete this; // see dtor!
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
class NewWallTool : public NewElementTool<Floorplan::FloorObstacleLine, MMFloorObstacleLine> {
|
||||
|
||||
private:
|
||||
|
||||
/** currently edited line node (has 2) */
|
||||
int idx = 0;
|
||||
|
||||
public:
|
||||
|
||||
NewWallTool(Tools& tools, MapLayer* layer) : NewElementTool(tools, layer) {
|
||||
create();
|
||||
}
|
||||
|
||||
const std::string getName() const override {
|
||||
return "new Wall";
|
||||
}
|
||||
|
||||
void createEmptyElement() override {
|
||||
|
||||
foEL = new Floorplan::FloorObstacleLine(Floorplan::ObstacleType::WALL, Floorplan::Material::DRYWALL, Point2(0, 0), Point2(0, 0));
|
||||
MMFloorObstacles* obs = (MMFloorObstacles*)layer;
|
||||
mmEL = obs->createLine(foEL);
|
||||
|
||||
}
|
||||
|
||||
/** mouse is currently moved */
|
||||
void moving(const Point2 mapPoint) override {
|
||||
|
||||
if (idx == 0) { foEL->from = mapPoint; foEL->to = mapPoint; }
|
||||
if (idx == 1) { foEL->to = mapPoint; }
|
||||
|
||||
}
|
||||
|
||||
/** next pont */
|
||||
void next() override {
|
||||
|
||||
if (++idx == 2) {
|
||||
finalizeCurrent();
|
||||
if (addAnother) {
|
||||
idx = 0;
|
||||
create();
|
||||
} else {
|
||||
disableMe();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
class NewDoorTool : public NewElementTool<Floorplan::FloorObstacleDoor, MMFloorObstacleDoor> {
|
||||
|
||||
private:
|
||||
|
||||
/** currently edited line node (has 2) */
|
||||
int idx = 0;
|
||||
|
||||
public:
|
||||
|
||||
NewDoorTool(Tools& tools, MapLayer* layer) : NewElementTool(tools, layer) {
|
||||
create();
|
||||
}
|
||||
|
||||
const std::string getName() const override {
|
||||
return "new Door";
|
||||
}
|
||||
|
||||
void createEmptyElement() override {
|
||||
|
||||
foEL = new Floorplan::FloorObstacleDoor(Floorplan::DoorType::SWING, Floorplan::Material::WOOD, Point2(0, 0), Point2(0, 0));
|
||||
MMFloorObstacles* obs = (MMFloorObstacles*)layer;
|
||||
mmEL = obs->createDoor(foEL);
|
||||
|
||||
}
|
||||
|
||||
/** mouse is currently moved */
|
||||
void moving(const Point2 mapPoint) override {
|
||||
|
||||
if (idx == 0) { foEL->from = mapPoint; foEL->to = mapPoint; }
|
||||
if (idx == 1) { foEL->to = mapPoint; }
|
||||
|
||||
}
|
||||
|
||||
/** next pont */
|
||||
void next() override {
|
||||
|
||||
if (++idx == 2) {
|
||||
finalizeCurrent();
|
||||
if (addAnother) {
|
||||
idx = 0;
|
||||
create();
|
||||
} else {
|
||||
disableMe();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
void ToolBoxWidget::onSelect() {
|
||||
|
||||
|
||||
view->getTools().setMainDefault();
|
||||
}
|
||||
|
||||
void ToolBoxWidget::onMeasure() {
|
||||
|
||||
new ToolMeasure(view->getTools());
|
||||
|
||||
view->getTools().setMain(new ToolMeasure(view->getTools()));
|
||||
}
|
||||
|
||||
|
||||
|
||||
void ToolBoxWidget::onNewWall() {
|
||||
view->getTools().setMain(new ToolNewWall(view->getTools(), curLayer));
|
||||
}
|
||||
|
||||
new NewWallTool(view->getTools(), curLayer);
|
||||
//view->getModel()->reselect();
|
||||
|
||||
void ToolBoxWidget::onNewDoor() {
|
||||
view->getTools().setMain(new ToolNewDoor(view->getTools(), curLayer));
|
||||
}
|
||||
|
||||
void ToolBoxWidget::onNewPillar() {
|
||||
@@ -421,37 +248,35 @@ void ToolBoxWidget::onNewPillar() {
|
||||
|
||||
}
|
||||
|
||||
void ToolBoxWidget::onNewDoor() {
|
||||
|
||||
new NewDoorTool(view->getTools(), curLayer);
|
||||
|
||||
}
|
||||
|
||||
void ToolBoxWidget::onNewStair() {
|
||||
|
||||
const Point2 center = view->getScaler().getCenter();
|
||||
view->getTools().setMain(new ToolNewStair(view->getTools(), curLayer));
|
||||
|
||||
Floorplan::StairFreeform* stair = new Floorplan::StairFreeform();
|
||||
Floorplan::StairPart part(Point3(center.x-3, center.y, 0), Point3(center.x+3, center.y, 3), 3);
|
||||
stair->parts.push_back( part );
|
||||
|
||||
MMFloorStairs* stairs = (MMFloorStairs*)curLayer;
|
||||
stairs->create(stair);
|
||||
// const Point2 center = view->getScaler().getCenter();
|
||||
|
||||
// Floorplan::StairFreeform* stair = new Floorplan::StairFreeform();
|
||||
// Floorplan::StairPart part(Point3(center.x-3, center.y, 0), Point3(center.x+3, center.y, 3), 3);
|
||||
// stair->parts.push_back( part );
|
||||
|
||||
// MMFloorStairs* stairs = (MMFloorStairs*)curLayer;
|
||||
// stairs->create(stair);
|
||||
|
||||
//view->getModel()->reselect();
|
||||
|
||||
}
|
||||
|
||||
void ToolBoxWidget::onNewElevator() {
|
||||
|
||||
const Point2 center = view->getScaler().getCenter();
|
||||
// const Point2 center = view->getScaler().getCenter();
|
||||
|
||||
Floorplan::Elevator* elevator = new Floorplan::Elevator(center);
|
||||
// Floorplan::Elevator* elevator = new Floorplan::Elevator(center);
|
||||
|
||||
MMFloorElevators* elevators = (MMFloorElevators*)curLayer;
|
||||
elevators->create(elevator);
|
||||
// MMFloorElevators* elevators = (MMFloorElevators*)curLayer;
|
||||
// elevators->create(elevator);
|
||||
|
||||
//view->getModel()->reselect();
|
||||
view->getTools().setMain(new ToolNewElevator(view->getTools(), curLayer));
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -71,6 +71,8 @@ private slots:
|
||||
|
||||
void onNewImage();
|
||||
|
||||
void onMainToolChanged();
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user