bool DrawPathTool::removeLastPointFromSelectedPath() { if (editingInProgress() || map()->getNumSelectedObjects() != 1) { return false; } Object* object = map()->getFirstSelectedObject(); if (object->getType() != Object::Path) { return false; } PathObject* path = object->asPath(); if (path->parts().size() != 1) { return false; } int points_on_path = 0; int num_coords = path->getCoordinateCount(); for (int i = 0; i < num_coords && points_on_path < 3; ++i) { ++points_on_path; if (path->getCoordinate(i).isCurveStart()) { i += 2; // Skip the control points. } } if (points_on_path < 3) { // Too few points after deleting the last: delete the whole object. map()->deleteSelectedObjects(); return true; } ReplaceObjectsUndoStep* undo_step = new ReplaceObjectsUndoStep(map()); Object* undo_duplicate = object->duplicate(); undo_duplicate->setMap(map()); undo_step->addObject(object, undo_duplicate); map()->push(undo_step); updateDirtyRect(); path->parts().front().setClosed(false); path->deleteCoordinate(num_coords - 1, false); path->update(); map()->setObjectsDirty(); map()->emitSelectionEdited(); return true; }
UndoStep* SwitchDashesUndoStep::undo() { int const part_index = getPartIndex(); SwitchDashesUndoStep* undo_step = new SwitchDashesUndoStep(map); undo_step->setPartIndex(part_index); MapPart* part = map->getPart(part_index); for (ObjectList::iterator it = modified_objects.begin(), end = modified_objects.end(); it != end; ++it) { PathObject* object = reinterpret_cast<PathObject*>(part->getObject(*it)); object->reverse(); object->update(); undo_step->addObject(*it); } return undo_step; }