void DpiAwareImage::draw(QPainter &p, const QPoint &coords) const { assert(!Image_.isNull()); #ifdef __APPLE__ auto imageRect = Image_.rect(); imageRect.moveTopLeft(coords); p.drawImage(coords, Image_); #else auto imageRect = Utils::scale_bitmap( Image_.rect() ); imageRect.moveTopLeft(coords); p.drawImage(imageRect, Image_); #endif }
void WindowController::moveTo(const QPointF& position, const WindowPoint handle) { auto coordinates = _getCoordinates(); switch (handle) { case TOP_LEFT: coordinates.moveTopLeft(position); break; case CENTER: coordinates.moveCenter(position); break; } _constrainPosition(coordinates); _apply(coordinates); }
void ExploreLiveView::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget * widget) { if(!isReady) return; prePaint(painter); postPaint(painter); auto glwidget = (Viewer*)widget; if (glwidget && meshes.size()) { QRectF parentRect = parentItem()->sceneBoundingRect(); if (isCacheImage && cachedImage.isNull()) { QOpenGLContext context; context.setShareContext(glwidget->context()); context.setFormat(glwidget->format()); context.create(); QOffscreenSurface m_offscreenSurface; m_offscreenSurface.setFormat(context.format()); m_offscreenSurface.create(); context.makeCurrent(&m_offscreenSurface); QOpenGLFramebufferObjectFormat fboformat; fboformat.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); QOpenGLFramebufferObject renderFbo(cacheImageSize*1.5, cacheImageSize, fboformat); renderFbo.bind(); glwidget->glEnable(GL_DEPTH_TEST); glwidget->glEnable(GL_BLEND); glwidget->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glwidget->glCullFace(GL_BACK); glwidget->glClearColor(0,0,0,0); glwidget->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glwidget->glViewport(0, 0, cacheImageSize*1.5, cacheImageSize); // XXX Fix // glwidget->glPointSize(10); // Draw aux meshes for (auto mesh : meshes) { if (mesh.isPoints) glwidget->drawOrientedPoints(mesh.points, mesh.normals, mesh.color, glwidget->pvm); else glwidget->drawTriangles(mesh.color, mesh.points, mesh.normals, glwidget->pvm); } glwidget->glDisable(GL_DEPTH_TEST); glwidget->glFlush(); renderFbo.release(); cachedImage = renderFbo.toImage(); isReady = true; // Thanks for sharing! glwidget->makeCurrent(); } // Draw as image if(isCacheImage) { int w = shapeRect.width(); painter->drawImage(w * -0.5, w * -0.5, cachedImage.scaledToWidth(w)); } if(!isCacheImage) { auto r = shapeRect; // scale view double s = 1.5; r.setWidth(r.width() * s); r.setHeight(r.height() * s); r.moveCenter(this->mapToScene(boundingRect().center())); painter->beginNativePainting(); auto v = scene()->views().first(); QPoint viewDelta = v->mapFromScene(r.topLeft()); if (viewDelta.manhattanLength() > 5) r.moveTopLeft(viewDelta); auto camera = ExploreProcess::defaultCamera(document->extent().length()); glwidget->eyePos = camera.first; glwidget->pvm = camera.second; glwidget->glViewport(r.left(), v->height() - r.height() - r.top(), r.width(), r.height()); // Clipping OpenGL glwidget->glEnable(GL_SCISSOR_TEST); glwidget->glScissor(parentRect.x(), v->height() - parentRect.height() - parentRect.top(), parentRect.width(), parentRect.height()); glwidget->glClear(GL_DEPTH_BUFFER_BIT); // FIX XXX // glwidget->glPointSize(2); // Draw aux meshes for (auto mesh : meshes) { if (mesh.isPoints) glwidget->drawOrientedPoints(mesh.points, mesh.normals, mesh.color, glwidget->pvm); else glwidget->drawTriangles(mesh.color, mesh.points, mesh.normals, glwidget->pvm); } glwidget->glDisable(GL_SCISSOR_TEST); painter->endNativePainting(); } } }
void RectTool::cursorMoveEvent(CanvasCursorEvent *event, int id) { Q_UNUSED(id); if (d->mode == NoOperation) { event->ignore(); return; } auto delta = event->data.pos - d->dragStartPos; if ( d->dragDistanceEnough ) { switch (d->mode) { default: { break; } case Dragging: case Inserting: { QPointSet keys; if (d->mode == Dragging) { QRectF wholeRect; for (auto &info : d->selectedLayerInfos) { // rect layer if (info.rectLayer) { auto rect = info.rectLayer->rect(); wholeRect |= rect; rect.moveTopLeft(delta + info.originalRectPos); wholeRect |= rect; info.rectLayer->setRect(rect); } // raster layer else if (info.original->isType<RasterLayer>()) { wholeRect |= info.rasterBoundingRect.translated(info.rasterOffset); info.rasterOffset = delta.toQPoint(); wholeRect |= info.rasterBoundingRect.translated(info.rasterOffset); } } keys = d->rectKeysWithHandleMargin(wholeRect); } else // inserting { QRectF rect = d->layerToAdd->rect(); keys |= d->rectKeysWithHandleMargin(rect); auto p1 = d->dragStartPos, p2 = event->data.pos; rect.setLeft(std::min(p1.x(), p2.x())); rect.setRight(std::max(p1.x(), p2.x())); rect.setTop(std::min(p1.y(), p2.y())); rect.setBottom(std::max(p1.y(), p2.y())); keys |= d->rectKeysWithHandleMargin(rect); d->layerToAdd->setRect(rect); } d->updateManager->addTiles(keys); //emit requestUpdate(keys); updateGraphicsItems(); break; } } } else { if ( ( std::abs( delta.x() ) + std::abs( delta.y() ) ) >= qApp->startDragDistance() ) { d->dragDistanceEnough = true; if (d->mode == Inserting) startAdding(); } else return; } }