Fix point edit when attach point changed

This commit is contained in:
wandererfan
2019-05-21 20:02:28 -04:00
parent 108038df91
commit fc904288a5
13 changed files with 401 additions and 156 deletions

View File

@@ -116,7 +116,12 @@ TaskLeaderLine::TaskLeaderLine(TechDrawGui::ViewProviderLeader* leadVP) :
connect(ui->pbTracker, SIGNAL(clicked(bool)),
this, SLOT(onTrackerClicked(bool)));
connect(ui->pbCancelEdit, SIGNAL(clicked(bool)),
this, SLOT(onCancelEditClicked(bool)));
ui->pbCancelEdit->setEnabled(false);
saveState();
m_trackerMode = QGTracker::TrackerMode::Line;
}
@@ -155,6 +160,9 @@ TaskLeaderLine::TaskLeaderLine(TechDraw::DrawView* baseFeat,
connect(ui->pbTracker, SIGNAL(clicked(bool)),
this, SLOT(onTrackerClicked(bool)));
connect(ui->pbCancelEdit, SIGNAL(clicked(bool)),
this, SLOT(onCancelEditClicked(bool)));
ui->pbCancelEdit->setEnabled(false);
m_trackerMode = QGTracker::TrackerMode::Line;
}
@@ -164,6 +172,24 @@ TaskLeaderLine::~TaskLeaderLine()
delete ui;
}
void TaskLeaderLine::saveState()
{
if (m_lineFeat != nullptr) {
m_savePoints = m_lineFeat->WayPoints.getValues();
m_saveX = m_lineFeat->X.getValue();
m_saveY = m_lineFeat->Y.getValue();
}
}
void TaskLeaderLine::restoreState()
{
if (m_lineFeat != nullptr) {
m_lineFeat->WayPoints.setValues(m_savePoints);
m_lineFeat->X.setValue(m_saveX);
m_lineFeat->Y.setValue(m_saveY);
}
}
void TaskLeaderLine::updateTask()
{
// blockUpdate = true;
@@ -190,7 +216,8 @@ void TaskLeaderLine::setUiPrimary()
}
ui->pbTracker->setText(QString::fromUtf8("Pick points"));
ui->pbTracker->setEnabled(true);
int aSize = getPrefArrowStyle() + 1;
ui->pbCancelEdit->setEnabled(true);
int aSize = getPrefArrowStyle() + 1;
ui->cboxStartSym->setCurrentIndex(aSize);
}
@@ -214,6 +241,7 @@ void TaskLeaderLine::setUiEdit()
ui->cboxEndSym->setCurrentIndex(m_lineFeat->EndSymbol.getValue() + 1);
ui->pbTracker->setText(QString::fromUtf8("Edit points"));
ui->pbTracker->setEnabled(true);
ui->pbCancelEdit->setEnabled(true);
}
if (m_lineVP != nullptr) {
@@ -264,7 +292,7 @@ void TaskLeaderLine::createLeaderFeature(std::vector<Base::Vector3d> converted)
void TaskLeaderLine::updateLeaderFeature(void)
{
// Base::Console().Message("TTL::updateLeaderFeature(%d)\n",converted.size());
// Base::Console().Message("TTL::updateLeaderFeature()\n");
Gui::Command::openCommand("Edit Leader");
//waypoints & x,y are updated by QGILeaderLine (for edits only!)
commonFeatureUpdate();
@@ -280,14 +308,6 @@ void TaskLeaderLine::updateLeaderFeature(void)
void TaskLeaderLine::commonFeatureUpdate(void)
{
// Base::Console().Message("TTL::commonFeatureUpdate()\n");
// m_lineFeat->setPosition(Rez::appX(m_attachPoint.x),Rez::appX(- m_attachPoint.y), true);
// if (!converted.empty()) {
// m_lineFeat->WayPoints.setValues(converted);
// if (m_lineFeat->AutoHorizontal.getValue()) {
// m_lineFeat->adjustLastSegment();
// }
// }
int start = ui->cboxStartSym->currentIndex() - 1;
int end = ui->cboxEndSym->currentIndex() - 1;
m_lineFeat->StartSymbol.setValue(start);
@@ -327,26 +347,35 @@ void TaskLeaderLine::onTrackerClicked(bool b)
Q_UNUSED(b);
// Base::Console().Message("TTL::onTrackerClicked() m_pbTrackerState: %d\n",
// m_pbTrackerState);
if (m_pbTrackerState == TRACKERCANCEL) {
removeTracker();
if ( (m_pbTrackerState == TRACKERSAVE) &&
(getCreateMode()) ){
if (m_tracker != nullptr) {
m_tracker->terminateDrawing();
}
m_pbTrackerState = TRACKERPICK;
ui->pbTracker->setText(QString::fromUtf8("Pick Points"));
ui->pbCancelEdit->setEnabled(false);
enableTaskButtons(true);
setEditCursor(Qt::ArrowCursor);
return;
} else if (m_pbTrackerState == TRACKERCANCELEDIT) {
abandonEditSession();
} else if ( (m_pbTrackerState == TRACKERSAVE) &&
(!getCreateMode()) ) {
if (m_qgLine != nullptr) {
m_qgLine->closeEdit();
}
m_pbTrackerState = TRACKEREDIT;
ui->pbTracker->setText(QString::fromUtf8("Edit points"));
m_pbTrackerState = TRACKERPICK;
ui->pbTracker->setText(QString::fromUtf8("Pick Points"));
ui->pbCancelEdit->setEnabled(false);
enableTaskButtons(true);
setEditCursor(Qt::ArrowCursor);
return;
}
//TRACKERPICK or TRACKEREDIT
if (getCreateMode()) {
m_inProgressLock = true;
m_saveContextPolicy = m_mdi->contextMenuPolicy();
@@ -358,9 +387,10 @@ void TaskLeaderLine::onTrackerClicked(bool b)
QString msg = tr("Pick a starting point for leader line");
getMainWindow()->statusBar()->show();
Gui::getMainWindow()->showMessage(msg,3000);
ui->pbTracker->setText(QString::fromUtf8("Escape picking"));
ui->pbTracker->setText(QString::fromUtf8("Save Points"));
ui->pbTracker->setEnabled(true);
m_pbTrackerState = TRACKERCANCEL;
ui->pbCancelEdit->setEnabled(true);
m_pbTrackerState = TRACKERSAVE;
enableTaskButtons(false);
} else { //edit mode
m_trackerPoints = m_lineFeat->WayPoints.getValues();
@@ -378,26 +408,19 @@ void TaskLeaderLine::onTrackerClicked(bool b)
//now what? throw will generate "unknown unhandled exception"
} else {
m_qgLine = qgLead;
connect(qgLead, SIGNAL(editComplete(std::vector<QPointF>, QGIView*)),
this, SLOT(onPointEditComplete(std::vector<QPointF>, QGIView*)));
m_attachPoint = Rez::guiX(Base::Vector3d(m_lineFeat->X.getValue(), //don't need this?
-m_lineFeat->Y.getValue(),
0.0));
connect(qgLead, SIGNAL(editComplete()),
this, SLOT(onPointEditComplete()));
qgLead->startPathEdit();
QString msg = tr("Click and drag markers to adjust leader line");
getMainWindow()->statusBar()->show();
Gui::getMainWindow()->showMessage(msg,3000);
msg = tr("ESC or RMB to exit");
getMainWindow()->statusBar()->show();
Gui::getMainWindow()->showMessage(msg,3000);
ui->pbTracker->setText(QString::fromUtf8("Escape edit"));
ui->pbTracker->setText(QString::fromUtf8("Save changes"));
ui->pbTracker->setEnabled(true);
m_pbTrackerState = TRACKERCANCELEDIT;
ui->pbCancelEdit->setEnabled(true);
m_pbTrackerState = TRACKERSAVE;
enableTaskButtons(false);
}
} else { // need to recreate leaderline
// same as create mode??
m_inProgressLock = true;
m_saveContextPolicy = m_mdi->contextMenuPolicy();
m_mdi->setContextMenuPolicy(Qt::PreventContextMenu);
@@ -408,12 +431,13 @@ void TaskLeaderLine::onTrackerClicked(bool b)
QString msg = tr("Pick a starting point for leader line");
getMainWindow()->statusBar()->show();
Gui::getMainWindow()->showMessage(msg,3000);
ui->pbTracker->setText(QString::fromUtf8("Escape picking"));
ui->pbTracker->setText(QString::fromUtf8("Save changes"));
ui->pbTracker->setEnabled(true);
m_pbTrackerState = TRACKERCANCEL;
ui->pbCancelEdit->setEnabled(true);
m_pbTrackerState = TRACKERSAVE;
enableTaskButtons(false);
}
} //end edit mode
}
}
void TaskLeaderLine::startTracker(void)
@@ -446,7 +470,7 @@ void TaskLeaderLine::onTrackerFinished(std::vector<QPointF> pts, QGIView* qgPare
Base::Console().Error("TaskLeaderLine - no points available\n");
return;
}
if (qgParent == nullptr) {
//do something;
m_qgParent = findParentQGIV();
@@ -465,7 +489,7 @@ void TaskLeaderLine::onTrackerFinished(std::vector<QPointF> pts, QGIView* qgPare
double scale = m_qgParent->getScale();
QPointF mapped = m_qgParent->mapFromScene(pts.front()) / scale;
m_attachPoint = Base::Vector3d(mapped.x(), mapped.y(), 0.0);
convertTrackerPoints(pts);
trackerPointsFromQPoints(pts);
} else {
Base::Console().Message("TTL::onTrackerFinished - can't find parent graphic!\n");
//blow up!?
@@ -480,6 +504,7 @@ void TaskLeaderLine::onTrackerFinished(std::vector<QPointF> pts, QGIView* qgPare
m_tracker->sleep(true);
m_inProgressLock = false;
ui->pbTracker->setEnabled(false);
ui->pbCancelEdit->setEnabled(false);
enableTaskButtons(true);
setEditCursor(Qt::ArrowCursor);
}
@@ -495,6 +520,25 @@ void TaskLeaderLine::removeTracker(void)
}
}
void TaskLeaderLine::onCancelEditClicked(bool b)
{
Q_UNUSED(b);
// Base::Console().Message("TTL::onCancelEditClicked() m_pbTrackerState: %d\n",
// m_pbTrackerState);
abandonEditSession();
if (m_lineFeat != nullptr) {
m_lineFeat->requestPaint();
}
m_pbTrackerState = TRACKEREDIT;
ui->pbTracker->setText(QString::fromUtf8("Edit points"));
ui->pbCancelEdit->setEnabled(false);
enableTaskButtons(true);
m_inProgressLock = false;
setEditCursor(Qt::ArrowCursor);
}
QGIView* TaskLeaderLine::findParentQGIV()
{
QGIView* result = nullptr;
@@ -517,9 +561,9 @@ void TaskLeaderLine::setEditCursor(QCursor c)
}
//from 1:1 scale scene QPointF to zero origin Vector3d points
void TaskLeaderLine::convertTrackerPoints(std::vector<QPointF> pts)
void TaskLeaderLine::trackerPointsFromQPoints(std::vector<QPointF> pts)
{
// Base::Console().Message("TTL::convertTrackerPoints(%d)\n", pts.size());
// Base::Console().Message("TTL::trackerPointsFromQPoints(%d)\n", pts.size());
m_trackerPoints.clear();
for (auto& p: pts) {
QPointF mapped = p - pts.front();
@@ -529,43 +573,22 @@ void TaskLeaderLine::convertTrackerPoints(std::vector<QPointF> pts)
}
//******************************************************************************
void TaskLeaderLine::onPointEditComplete(std::vector<QPointF> pts, QGIView* parent)
//void TaskLeaderLine::onPointEditComplete(std::vector<QPointF> pts, QGIView* parent)
void TaskLeaderLine::onPointEditComplete(void)
{
// Base::Console().Message("TTL::onPointEditComplete(%d)\n", pts.size());
if (pts.empty()) {
return;
}
QPointF p0 = pts.front();
if (parent == nullptr) {
Base::Console().Message("TTL::onPointEditComplete - passed parent is NULL!\n");
} else {
m_qgParent = parent;
// double scale = m_qgParent->getScale();
if ( !(TechDraw::DrawUtil::fpCompare(p0.x(),0.0) &&
TechDraw::DrawUtil::fpCompare(p0.y(),0.0)) ) {
//p0 was moved. need to change AttachPoint and intervals from p0
QPointF mapped = m_qgParent->mapFromItem(m_qgLine,p0);
m_attachPoint = Base::Vector3d(mapped.x(),mapped.y(),0.0);
for (auto& p : pts) {
p -= p0;
}
pts.at(0) = QPointF(0.0,0.0);
}
convertTrackerPoints(pts);
}
// Base::Console().Message("TTL::onPointEditComplete()\n");
m_inProgressLock = false;
m_pbTrackerState = TRACKEREDIT;
ui->pbTracker->setText(QString::fromUtf8("Edit points"));
ui->pbTracker->setEnabled(true);
ui->pbCancelEdit->setEnabled(true);
enableTaskButtons(true);
}
void TaskLeaderLine::abandonEditSession(void)
{
// Base::Console().Message("TTL::abandonEditSession()\n");
if (m_qgLine != nullptr) {
m_qgLine->abandonEdit();
}
@@ -577,6 +600,7 @@ void TaskLeaderLine::abandonEditSession(void)
ui->pbTracker->setText(QString::fromUtf8("Edit points"));
enableTaskButtons(true);
ui->pbTracker->setEnabled(true);
ui->pbCancelEdit->setEnabled(false);
setEditCursor(Qt::ArrowCursor);
}
@@ -608,7 +632,6 @@ bool TaskLeaderLine::accept()
{
// Base::Console().Message("TTL::accept()\n");
if (m_inProgressLock) {
// Base::Console().Message("TTL::accept - edit in progress!!\n");
abandonEditSession();
return true;
}
@@ -648,6 +671,12 @@ bool TaskLeaderLine::reject()
(m_lineFeat != nullptr) ) {
removeFeature();
}
if (!getCreateMode() &&
(m_lineFeat != nullptr) ) {
restoreState();
}
m_trackerMode = QGTracker::TrackerMode::None;
//make sure any dangling objects are cleaned up