Exemple #1
0
	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
	}
Exemple #2
0
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();
        }
	}
}
Exemple #4
0
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;
	}
}