void StrokeSelection::cut() { if (m_indexes.empty()) return; TTool *tool = TTool::getApplication()->getCurrentTool()->getTool(); if (!tool) return; bool isSpline = tool->getApplication()->getCurrentObject()->isSpline(); TUndo *undo; if (isSpline) undo = new ToolUtils::UndoPath( tool->getXsheet()->getStageObject(tool->getObjectId())->getSpline()); StrokesData *data = new StrokesData(); data->setImage(m_vi, m_indexes); std::set<int> oldIndexes = m_indexes; cutStrokesWithoutUndo(m_vi, m_indexes); if (!isSpline) { TXshSimpleLevel *level = tool->getApplication()->getCurrentLevel()->getSimpleLevel(); TUndoManager::manager()->add(new CutStrokesUndo( level, tool->getCurrentFid(), oldIndexes, data, m_sceneHandle)); } else { assert(undo); if (undo) TUndoManager::manager()->add(undo); } }
void ControlPointSelection::setUnlinear() { TTool *tool = TTool::getApplication()->getCurrentTool()->getTool(); int currentStrokeIndex = m_controlPointEditorStroke->getStrokeIndex(); TVectorImageP vi(tool->getImage(false)); if (!vi || isEmpty() || currentStrokeIndex == -1) return; TUndo *undo; if (tool->getApplication()->getCurrentObject()->isSpline()) undo = new UndoPath( tool->getXsheet()->getStageObject(tool->getObjectId())->getSpline()); else { TXshSimpleLevel *level = tool->getApplication()->getCurrentLevel()->getSimpleLevel(); UndoControlPointEditor *cpEditorUndo = new UndoControlPointEditor(level, tool->getCurrentFid()); cpEditorUndo->addOldStroke(currentStrokeIndex, vi->getVIStroke(currentStrokeIndex)); undo = cpEditorUndo; } if (m_controlPointEditorStroke->getControlPointCount() == 0) return; bool isChanged = m_controlPointEditorStroke->setControlPointsLinear( m_selectedPoints, false); if (!isChanged) return; TUndoManager::manager()->add(undo); tool->notifyImageChanged(); }
void ControlPointSelection::deleteControlPoints() { TTool *tool = TTool::getApplication()->getCurrentTool()->getTool(); TVectorImageP vi(tool->getImage(false)); int currentStrokeIndex = m_controlPointEditorStroke->getStrokeIndex(); if (!vi || isEmpty() || currentStrokeIndex == -1) return; // Inizializzo l'UNDO TUndo *undo; bool isCurrentObjectSpline = tool->getApplication()->getCurrentObject()->isSpline(); if (isCurrentObjectSpline) undo = new UndoPath( tool->getXsheet()->getStageObject(tool->getObjectId())->getSpline()); else { TXshSimpleLevel *level = tool->getApplication()->getCurrentLevel()->getSimpleLevel(); UndoControlPointEditor *cpEditorUndo = new UndoControlPointEditor(level, tool->getCurrentFid()); cpEditorUndo->addOldStroke(currentStrokeIndex, vi->getVIStroke(currentStrokeIndex)); undo = cpEditorUndo; } int i; for (i = m_controlPointEditorStroke->getControlPointCount() - 1; i >= 0; i--) if (isSelected(i)) m_controlPointEditorStroke->deleteControlPoint(i); if (m_controlPointEditorStroke->getControlPointCount() == 0) { m_controlPointEditorStroke->setStroke((TVectorImage *)0, -1); if (!isCurrentObjectSpline) { UndoControlPointEditor *cpEditorUndo = dynamic_cast<UndoControlPointEditor *>(undo); if (cpEditorUndo) cpEditorUndo->isStrokeDelete(true); } } // La spline non puo' essere cancellata completamente!!! if (vi->getStrokeCount() == 0) { if (TTool::getApplication()->getCurrentObject()->isSpline()) { std::vector<TPointD> points; double d = 10; points.push_back(TPointD(-d, 0)); points.push_back(TPointD(0, 0)); points.push_back(TPointD(d, 0)); TStroke *stroke = new TStroke(points); vi->addStroke(stroke, false); m_controlPointEditorStroke->setStrokeIndex(0); } } tool->notifyImageChanged(); selectNone(); // Registro l'UNDO TUndoManager::manager()->add(undo); }
void StrokeSelection::paste() { TTool *tool = TTool::getApplication()->getCurrentTool()->getTool(); if (!tool) return; if (TTool::getApplication()->getCurrentObject()->isSpline()) { const StrokesData *stData = dynamic_cast<const StrokesData *>( QApplication::clipboard()->mimeData()); if (!stData) return; TVectorImageP splineImg = tool->getImage(true); TVectorImageP img = stData->m_image; if (!splineImg || !img) return; QMutexLocker lock(splineImg->getMutex()); TUndo *undo = new ToolUtils::UndoPath( tool->getXsheet()->getStageObject(tool->getObjectId())->getSpline()); while (splineImg->getStrokeCount() > 0) splineImg->deleteStroke(0); TStroke *stroke = img->getStroke(0); splineImg->addStroke(new TStroke(*stroke), false); TUndoManager::manager()->add(undo); tool->notifyImageChanged(); tool->invalidate(); return; } TVectorImageP tarImg = tool->touchImage(); if (!tarImg) return; TPaletteP palette = tarImg->getPalette(); TPaletteP oldPalette = new TPalette(); if (palette) oldPalette = palette->clone(); bool isPaste = pasteStrokesWithoutUndo(tarImg, m_indexes, m_sceneHandle); if (isPaste) { TXshSimpleLevel *level = TTool::getApplication()->getCurrentLevel()->getSimpleLevel(); TUndoManager::manager()->add(new PasteStrokesUndo( level, tool->getCurrentFid(), m_indexes, oldPalette, m_sceneHandle)); m_updateSelectionBBox = isPaste; } tool->notifyImageChanged(); tool->getApplication() ->getPaletteController() ->getCurrentLevelPalette() ->notifyPaletteChanged(); m_updateSelectionBBox = false; tool->invalidate(); }