bool KarbonLayerSortingModel::lessThan(const QModelIndex &left, const QModelIndex &right) const { KoShape * leftShape = static_cast<KoShape*>(left.internalPointer()); KoShape * rightShape = static_cast<KoShape*>(right.internalPointer()); if (! leftShape || ! rightShape) return false; if (m_document) { KoShapeLayer * leftLayer = dynamic_cast<KoShapeLayer*>(leftShape); KoShapeLayer * rightLayer = dynamic_cast<KoShapeLayer*>(rightShape); if (leftLayer && rightLayer) { return m_document->layerPos(leftLayer) < m_document->layerPos(rightLayer); } else { if (leftShape->zIndex() == rightShape->zIndex()) { KoShapeContainer * leftParent = leftShape->parent(); KoShapeContainer * rightParent = rightShape->parent(); if (leftParent && leftParent == rightParent) { QList<KoShape*> children = leftParent->shapes(); return children.indexOf(leftShape) < children.indexOf(rightShape); } else { return leftShape < rightShape; } } else { return leftShape->zIndex() < rightShape->zIndex(); } } } else { if (leftShape->zIndex() == rightShape->zIndex()) return leftShape < rightShape; else return leftShape->zIndex() < rightShape->zIndex(); } }
void KWCopyShape::paint(QPainter &painter, const KoViewConverter &converter, KoShapePaintingContext &paintcontext) { Q_ASSERT(m_original); //paint all child shapes KoShapeContainer* container = dynamic_cast<KoShapeContainer*>(m_original); if (container) { QList<KoShape*> sortedObjects = container->shapes(); sortedObjects.append(m_original); qSort(sortedObjects.begin(), sortedObjects.end(), KoShape::compareShapeZIndex); // Do the following to revert the absolute transformation of the // container that is re-applied in shape->absoluteTransformation() // later on. The transformation matrix of the container has already // been applied once before this function is called. QTransform baseMatrix = container->absoluteTransformation(&converter).inverted() * painter.transform(); KWPage copypage = m_pageManager->page(this); Q_ASSERT(copypage.isValid()); foreach(KoShape *shape, sortedObjects) { painter.save(); if (shape != m_original) { painter.setTransform(shape->absoluteTransformation(&converter) * baseMatrix); } KoTextShapeData *data = qobject_cast<KoTextShapeData*>(shape->userData()); if (data == 0) { shape->paint(painter, converter, paintcontext); } else { // Since the rootArea is shared between the copyShape and the originalShape we need to // temporary switch the used KoTextPage to be sure the proper page-numbers are displayed. KWPage originalpage = m_pageManager->page(shape); Q_ASSERT(originalpage.isValid()); KoTextLayoutRootArea *area = data->rootArea(); bool wasBlockChanges = false; if (area) { // We need to block documentChanged() signals emitted cause for example page-variables // may change there content to result in us marking root-areas dirty for relayout else // we could end in an infinite relayout ping-pong. wasBlockChanges = area->documentLayout()->changesBlocked(); area->documentLayout()->setBlockChanges(true); area->setPage(new KWPage(copypage)); } shape->paint(painter, converter, paintcontext); if (area) { area->setPage(new KWPage(originalpage)); area->documentLayout()->setBlockChanges(wasBlockChanges); } } painter.restore(); if (shape->stroke()) { painter.save(); painter.setTransform(shape->absoluteTransformation(&converter) * baseMatrix); shape->stroke()->paint(shape, painter, converter); painter.restore(); } } } else {
static void prepare(KoShape *s, QMap<KoShape*, QList<KoShape*> > &newOrder, KoShapeManager *manager, KoShapeReorderCommand::MoveShapeType move) { KoShapeContainer *parent = s->parent(); QMap<KoShape*, QList<KoShape*> >::iterator it(newOrder.find(parent)); if (it == newOrder.end()) { QList<KoShape*> children; if (parent != 0) { children = parent->shapes(); } else { // get all toplevel shapes children = manager->topLevelShapes(); } qSort(children.begin(), children.end(), KoShape::compareShapeZIndex); // the append and prepend are needed so that the raise/lower of all shapes works as expected. children.append(0); children.prepend(0); it = newOrder.insert(parent, children); } QList<KoShape *> & shapes(newOrder[parent]); int index = shapes.indexOf(s); if (index != -1) { shapes.removeAt(index); switch (move) { case KoShapeReorderCommand::BringToFront: index = shapes.size(); break; case KoShapeReorderCommand::RaiseShape: if (index < shapes.size()) { ++index; } break; case KoShapeReorderCommand::LowerShape: if (index > 0) { --index; } break; case KoShapeReorderCommand::SendToBack: index = 0; break; } shapes.insert(index,s); } }
void ShowChangesCommand::checkAndAddAnchoredShapes(int position, int length) { KoInlineTextObjectManager *inlineObjectManager = KoTextDocument(m_document).inlineTextObjectManager(); Q_ASSERT(inlineObjectManager); QTextCursor cursor = m_textEditor->document()->find(QString(QChar::ObjectReplacementCharacter), position); while(!cursor.isNull() && cursor.position() < position + length) { QTextCharFormat fmt = cursor.charFormat(); KoInlineObject *object = inlineObjectManager->inlineTextObject(fmt); Q_ASSERT(object); /* FIXME KoTextAnchor *anchor = dynamic_cast<KoTextAnchor *>(object); if (!anchor) { continue; } */ #if 0 // TODO -- since March 2010... KoTextDocumentLayout *lay = qobject_cast<KoTextDocumentLayout*>(m_document->documentLayout()); KoShapeContainer *container = dynamic_cast<KoShapeContainer *>(lay->shapeForPosition(i)); // a very ugly hack. Since this class is going away soon, it should be okay if (!container) container = dynamic_cast<KoShapeContainer *>((lay->shapes()).at(0)); if (container) { container->addShape(anchor->shape()); KUndo2Command *shapeCommand = m_canvas->shapeController()->addShapeDirect(anchor->shape()); shapeCommand->redo(); m_shapeCommands.push_front(shapeCommand); } #endif cursor = m_textEditor->document()->find(QString(QChar::ObjectReplacementCharacter), position); } }