diff --git a/CHANGELOG.md b/CHANGELOG.md index e9318ad449da7d7f8233768a6cbea39635c2591f..1af42178766a148b8bab071a2144e6b2f08ad2e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,9 @@ All notable changes to this project will be documented in this file. ## v0.8.0 [Unreleased] - ### Added #### JPSEDITOR +- 1.2.16 Create and save HLines - First approaches of an undo/redo framework - Undo/Redo working when line added or deleted - DXF import with different layers - Not working properly with AutoCAD ?! @@ -18,6 +18,7 @@ All notable changes to this project will be documented in this file. - Zooming - Line editing - Length of line is displayed + - Show origin - ... - Room and door declarations diff --git a/forms/HLine.png b/forms/HLine.png new file mode 100644 index 0000000000000000000000000000000000000000..81b9f3dce14be3bb072beb30858f16af605a42ff Binary files /dev/null and b/forms/HLine.png differ diff --git a/forms/Ressource.qrc b/forms/Ressource.qrc index ecefdd345d0269930e59a4597e6f09c1f559bcb8..239132d9cc563449d64f155a0f319ba2ab071c31 100644 --- a/forms/Ressource.qrc +++ b/forms/Ressource.qrc @@ -41,5 +41,6 @@ <file>anglesnap.PNG</file> <file>Undo-icon.png</file> <file>Redo-Icon.png</file> + <file>HLine.png</file> </qresource> </RCC> diff --git a/forms/mainwindow.ui b/forms/mainwindow.ui index 97af0c19e3c334749a9002d6f3938eb69d99f4b1..803f47cc4b52cb3dc5261fa97e5271d047516066 100644 --- a/forms/mainwindow.ui +++ b/forms/mainwindow.ui @@ -53,8 +53,12 @@ </property> <addaction name="actionSelect_Mode"/> <addaction name="separator"/> + <addaction name="actionUndo"/> + <addaction name="actionRedo"/> + <addaction name="separator"/> <addaction name="actionWall"/> <addaction name="actionDoor"/> + <addaction name="actionHLine"/> <addaction name="separator"/> <addaction name="actiongridmode"/> <addaction name="actionObjectsnap"/> @@ -519,7 +523,7 @@ <string>Undo</string> </property> <property name="toolTip"> - <string>Undo</string> + <string>Undo PaintEvent</string> </property> <property name="shortcut"> <string>Ctrl+Z</string> @@ -537,10 +541,10 @@ <string>Redo</string> </property> <property name="toolTip"> - <string>Redo</string> + <string>Redo PaintEvent</string> </property> <property name="shortcut"> - <string>Ctrl+U</string> + <string>Ctrl+Y</string> </property> </action> <action name="actionHLine"> @@ -552,7 +556,7 @@ </property> <property name="icon"> <iconset resource="Ressource.qrc"> - <normaloff>:/Wall.png</normaloff>:/Wall.png</iconset> + <normaloff>:/HLine.png</normaloff>:/HLine.png</iconset> </property> <property name="text"> <string>HLine</string> diff --git a/src/GraphicView.cpp b/src/GraphicView.cpp index 352e1c7acb5cd564b06bf8a4c7e5e3f304557781..0d8e51c8bbc59531b34e19d4f4d432727778187c 100644 --- a/src/GraphicView.cpp +++ b/src/GraphicView.cpp @@ -46,6 +46,7 @@ jpsGraphicsView::jpsGraphicsView(QWidget* parent):QGraphicsView(parent) translation_x=0; translation_y=0;//this->height(); anglesnap=false; + id_counter=0; _scaleFactor=1.0; _gridSize=1.0; gl_scale_f=.01*_scaleFactor; @@ -792,6 +793,8 @@ void jpsGraphicsView::drawLine() { jpsLineItem* lineItem= new jpsLineItem(current_line); + lineItem->set_id(id_counter); + id_counter++; // if there is already a drawn line if (line_vector.size()>=1) @@ -812,7 +815,7 @@ void jpsGraphicsView::drawLine() current_line=nullptr; //Undo - RecordUndoLineAction("LineAdded",lineItem->GetType(),lineItem->get_line()->line()); + RecordUndoLineAction("LineAdded",lineItem->GetType(),lineItem->get_id(),lineItem->get_line()->line()); //drawLine(); @@ -875,6 +878,8 @@ jpsLineItem* jpsGraphicsView::addLineItem(const qreal &x1,const qreal &y1,const current_line=Scene->addLine(x1,y1,x2,y2); current_line->setTransform(QTransform::fromTranslate(translation_x,translation_y), true); jpsLineItem* newLine = new jpsLineItem(current_line); + newLine->set_id(id_counter); + id_counter++; if (type=="Door") { @@ -979,6 +984,7 @@ void jpsGraphicsView::EditLine(QPointF* point) if (marked_lines.first()->get_line()->line().p1()==*point) { + RecordUndoLineAction("LineEdited",marked_lines.first()->GetType(),marked_lines.first()->get_id(),marked_lines.first()->get_line()->line()); current_line=marked_lines[0]->get_line(); marked_lines[0]->get_line()->setLine(marked_lines[0]->get_line()->line().x2(),marked_lines[0]->get_line()->line().y2(),translated_pos.x(),translated_pos.y()); //current_line=Scene->addLine(marked_lines[0]->get_line()->line().p2().x(), @@ -989,6 +995,7 @@ void jpsGraphicsView::EditLine(QPointF* point) else if (marked_lines.first()->get_line()->line().p2()==*point) { + RecordUndoLineAction("LineEdited",marked_lines.first()->GetType(),marked_lines.first()->get_id(),marked_lines.first()->get_line()->line()); current_line=marked_lines[0]->get_line(); marked_lines[0]->get_line()->setLine(marked_lines[0]->get_line()->line().x1(),marked_lines[0]->get_line()->line().y1(),translated_pos.x(),translated_pos.y()); @@ -1004,6 +1011,7 @@ void jpsGraphicsView::EditLine(QPointF* point) //line_tracked=1; RemoveIntersections(marked_lines.first()); _statLineEdit=true; + //delete_marked_lines(); en_disableWall(); @@ -1048,14 +1056,40 @@ bool jpsGraphicsView::show_hide_roomCaption(QString name, qreal x, qreal y) return true; } -void jpsGraphicsView::RecordUndoLineAction(const QString& name, const QString& type, const QLineF &oldLine) +void jpsGraphicsView::RecordUndoLineAction(const QString& name, const QString& type, const int& itemID, const QLineF &oldLine) +{ + _undoStack.PushNewAction(LineAction(name,type,itemID,oldLine)); +} + +void jpsGraphicsView::RecordRedoLineAction(const QString &name, const QString &type, const int& itemID, const QLineF &oldLine) { - _undoStack.PushNewAction(LineAction(name,type,oldLine)); + _redoStack.PushNewAction(LineAction(name,type,itemID,oldLine)); +} + +void jpsGraphicsView::UndoLineEdit(const int& lineID, const QLineF& old_line) +{ + for (jpsLineItem* lineItem:line_vector) + { + if (lineItem->get_id()==lineID) + { + RecordRedoLineAction("LineEdited",lineItem->GetType(),lineItem->get_id(),lineItem->get_line()->line()); + lineItem->get_line()->setLine(old_line); + break; + } + } } -void jpsGraphicsView::RecordRedoLineAction(const QString &name, const QString &type, const QLineF &oldLine) +void jpsGraphicsView::RedoLineEdit(const int &lineID, const QLineF &old_line) { - _redoStack.PushNewAction(LineAction(name,type,oldLine)); + for (jpsLineItem* lineItem:line_vector) + { + if (lineItem->get_id()==lineID) + { + RecordUndoLineAction("LineEdited",lineItem->GetType(),lineItem->get_id(),lineItem->get_line()->line()); + lineItem->get_line()->setLine(old_line); + break; + } + } } void jpsGraphicsView::Undo() @@ -1069,13 +1103,18 @@ void jpsGraphicsView::Undo() addLineItem(recentAction.GetOldLine().p1().x(),recentAction.GetOldLine().p1().y(),recentAction.GetOldLine().p2().x(), recentAction.GetOldLine().p2().y(),recentAction.GetType()); - RecordRedoLineAction("LineAdded",recentAction.GetType(),QLineF(0,0,0,0)); + RecordRedoLineAction("LineAdded",recentAction.GetType(),id_counter-1,QLineF(0,0,0,0)); } else if (recentAction.GetName()=="LineAdded") { - RecordRedoLineAction("LineDeleted",line_vector.back()->GetType(),line_vector.back()->get_line()->line()); + RecordRedoLineAction("LineDeleted",line_vector.back()->GetType(),line_vector.back()->get_id(), + line_vector.back()->get_line()->line()); RemoveLineItem(line_vector.back()); } + else if (recentAction.GetName()=="LineEdited") + { + UndoLineEdit(recentAction.GetItemID(),recentAction.GetOldLine()); + } } } @@ -1091,15 +1130,21 @@ void jpsGraphicsView::Redo() addLineItem(recentAction.GetOldLine().p1().x(),recentAction.GetOldLine().p1().y(),recentAction.GetOldLine().p2().x(), recentAction.GetOldLine().p2().y(),recentAction.GetType()); - RecordUndoLineAction("LineAdded",recentAction.GetType(),QLineF(0,0,0,0)); + RecordUndoLineAction("LineAdded",recentAction.GetType(),id_counter-1,QLineF(0,0,0,0)); } else if (recentAction.GetName()=="LineAdded") { - RecordUndoLineAction("LineDeleted",line_vector.back()->GetType(),line_vector.back()->get_line()->line()); + RecordUndoLineAction("LineDeleted",line_vector.back()->GetType(),line_vector.back()->get_id(), + line_vector.back()->get_line()->line()); RemoveLineItem(line_vector.back()); } + else if (recentAction.GetName()=="LineEdited") + { + RedoLineEdit(recentAction.GetItemID(),recentAction.GetOldLine()); + + } } @@ -1443,7 +1488,7 @@ void jpsGraphicsView::delete_marked_lines() for (int i=0; i<marked_lines.size(); ++i) { - RecordUndoLineAction("LineDeleted",marked_lines[i]->GetType(),marked_lines[i]->get_line()->line()); + RecordUndoLineAction("LineDeleted",marked_lines[i]->GetType(),marked_lines[i]->get_id(),marked_lines[i]->get_line()->line()); RemoveIntersections(marked_lines[i]); @@ -1571,6 +1616,8 @@ void jpsGraphicsView::take_l_from_lineEdit(const qreal &length) line.setLength(length); current_line->setLine(line); jpsLineItem* jpsline = new jpsLineItem(current_line); + jpsline->set_id(id_counter); + id_counter++; jpsline->set_type(statWall,statDoor,statExit); line_vector.push_back(jpsline); current_line=nullptr; diff --git a/src/GraphicView.h b/src/GraphicView.h index 06be9be84f013b9d71818a36c5ea1ee815e34c11..e72eb847602aab6192ae783019ae7e2f6bd3adc2 100644 --- a/src/GraphicView.h +++ b/src/GraphicView.h @@ -132,8 +132,10 @@ public: bool show_hide_roomCaption(QString name, qreal x, qreal y); //Undo Framework - void RecordUndoLineAction(const QString &name, const QString &type, const QLineF &oldLine); - void RecordRedoLineAction(const QString &name, const QString &type, const QLineF &oldLine); + void RecordUndoLineAction(const QString &name, const QString &type, const int &itemID, const QLineF &oldLine); + void RecordRedoLineAction(const QString &name, const QString &type, const int &itemID, const QLineF &oldLine); + void UndoLineEdit(const int &lineID, const QLineF &old_line); + void RedoLineEdit(const int &lineID, const QLineF &old_line); public slots: //Waypoints @@ -197,6 +199,7 @@ private: QList<jpsLineItem *> marked_lines; QGraphicsTextItem* current_caption; QList<QGraphicsTextItem* > caption_list; + int id_counter; //Landmark and waypoints QList<jpsLandmark* > LLandmarks; diff --git a/src/UndoFramework/lineaction.cpp b/src/UndoFramework/lineaction.cpp index a8cca4b006a2da540e13af1f6ab04c61cb5ccfab..9bc9523366ea8e8bd70a7b7a4b6885badb11ae32 100644 --- a/src/UndoFramework/lineaction.cpp +++ b/src/UndoFramework/lineaction.cpp @@ -5,9 +5,10 @@ LineAction::LineAction() } -LineAction::LineAction(const QString &name, const QString &type, const QLineF &oldLine) : Action(name,type) +LineAction::LineAction(const QString &name, const QString &type, const int &itemID, const QLineF &oldLine) : Action(name,type) { _oldLine=oldLine; + _itemID=itemID; } LineAction::~LineAction() @@ -20,3 +21,8 @@ QLineF LineAction::GetOldLine() const return _oldLine; } +int LineAction::GetItemID() const +{ + return _itemID; +} + diff --git a/src/UndoFramework/lineaction.h b/src/UndoFramework/lineaction.h index 63e0cb7eefc501b22374023593ea709b52c1a7f5..e61f2662b3c6bc7ab3e94df87814e36f379961da 100644 --- a/src/UndoFramework/lineaction.h +++ b/src/UndoFramework/lineaction.h @@ -8,12 +8,14 @@ class LineAction : public Action { public: LineAction(); - LineAction(const QString& name, const QString& type, const QLineF& oldLine); + LineAction(const QString& name, const QString& type, const int& itemID, const QLineF& oldLine); ~LineAction(); QLineF GetOldLine() const; + int GetItemID() const; private: QLineF _oldLine; + int _itemID; }; #endif // PAINTACTION_H diff --git a/src/datamanager.cpp b/src/datamanager.cpp index 3b699f9d4e9e3ac0903ece5f9dada96e6010f18f..3b58cea740acf040395dc2fbde9d4e26f8a33f52 100644 --- a/src/datamanager.cpp +++ b/src/datamanager.cpp @@ -358,6 +358,7 @@ void jpsDatamanager::writeRoutingHeader(QXmlStreamWriter *stream) void jpsDatamanager::writeHLines(QXmlStreamWriter *stream, QList<jpsLineItem *> &hLines) { + // to be sure that id is unique (considering crossings, transitions) int id=1000; for (jpsLineItem *lineItem:hLines) { diff --git a/src/mainWindow.cpp b/src/mainWindow.cpp index e063547944c07c0c1dc0c4a6b87e515e0a1e5031..7d9317f7b35f2aa41b2457cc02687b7c8e7f01de 100644 --- a/src/mainWindow.cpp +++ b/src/mainWindow.cpp @@ -183,6 +183,13 @@ void MWindow::AutoSave() dmanager->AutoSaveXML(file); //file.write(coord_string.toUtf8());//textEdit->toPlainText().toUtf8()); statusBar()->showMessage(tr("Backup file generated!"),10000); + + //routing (hlines) + QString fileNameRouting = file.fileName(); + fileNameRouting=fileNameRouting.split(".").first()+"_routing.xml"; + QFile routingFile(fileNameRouting); + if (routingFile.open(QIODevice::WriteOnly|QIODevice::Text)) + dmanager->writeRoutingXML(routingFile); } } @@ -339,7 +346,8 @@ void MWindow::saveFile(){ dmanager->writeXML(file); //routing (hlines) - QString fileNameRouting = fileName+"routing.xml"; + QString fileNameRouting=fileName.split(".").first()+"_routing.xml"; + QFile routingFile(fileNameRouting); if (routingFile.open(QIODevice::WriteOnly|QIODevice::Text)) dmanager->writeRoutingXML(routingFile);