Ejemplo n.º 1
0
      bool
      ImageSceneState::mouseMove(QGraphicsSceneMouseEvent* event)
      {
	m_mousePos[0] = event->scenePos().x();
	m_mousePos[1] = event->scenePos().y();

	if (isPicking())
	  m_imageScene.update();

	if (event->buttons() & Qt::RightButton) {
	  QPointF newPos  = event->scenePos();
	  QPointF lastPos = event->lastScenePos();
	  float distX = newPos.x() - lastPos.x();
	  float distY = newPos.y() - lastPos.y();

	  static const float wChangeFactor = 1000.0f;

	  if (!(event->modifiers() & Qt::ShiftModifier))
	    getViewWindow()->setWidth(getViewWindow()->getWidth() + distX/wChangeFactor);

	  if (!(event->modifiers() & Qt::ControlModifier))
	    getViewWindow()->setLevel(getViewWindow()->getLevel() + distY/wChangeFactor);

	  return true;
	}
	return false;
      }
Ejemplo n.º 2
0
      void
      ImageSceneState::drawOverlay(QPainter* painter)
      {
	QRectF rect = m_imageScene.sceneRect();
	QString name;

	if (isPicking()) {
	  if (getResource())
	    name = QString::fromStdString(getResource()->getName());
	}
	else {
	  name = m_imageScene.getWidget().getName();
	  if (getResource() && !getResource()->getName().empty())
	    name += " (" + QString::fromStdString(getResource()->getName()) + ")";
	}

	int textHeight = painter->fontMetrics().height();
	painter->setPen(Qt::black);
	// scale the textHeight since it seems (visual check) that the font metrics
	// return 1.5 the actual printed height
	painter->drawText(QPointF(nameBorderInPercent*rect.width(),
				  nameBorderInPercent*rect.height() + 2/3.0 * textHeight),
			  name);

	auto res = getResource();
	if (res) {
	  float width  = getWidth();
	  float height = getHeight();

	  painter->drawLine(QPointF((1 - 0.015) * width, 0.12 * height),
			    QPointF((1 - 0.045) * width, 0.12 * height));
	  painter->drawLine(QPointF((1 - 0.015) * width, 0.88 * height),
			    QPointF((1 - 0.045) * width, 0.88 * height));
	  painter->drawLine(QPointF((1 - 0.03) * width, 0.12 * height),
			    QPointF((1 - 0.03) * width, 0.88 * height));

	  static const float epsilon = 0.0025f;

	  painter->setPen(Qt::white);
	  float ww = getViewWindow()->getWidth();
	  float wl = getViewWindow()->getLevel();

	  float minHeight = (0.12f + (0.76f-epsilon) * (wl + ww/2.0f)) * height;
	  float maxHeight = (0.12f + (0.76f-epsilon) * (wl - ww/2.0f)) * height;
	  QLinearGradient gradient(QPointF(0, minHeight), QPointF(0, maxHeight));
	  static const QColor gradColTop(0, 0, 0);
	  static const QColor gradColBott(255, 255, 255);
	  gradient.setColorAt(0, gradColTop);
	  gradient.setColorAt(1, gradColBott);
	  QRectF windowRect((1 - 0.04) * width, minHeight, 0.02 * width, maxHeight-minHeight);
	  painter->fillRect(windowRect, gradient);
	}
      }
Ejemplo n.º 3
0
/******************************************************************************
* Renders the construction grid.
******************************************************************************/
void ViewportSceneRenderer::renderGrid()
{
	if(isPicking())
		return;

	FloatType gridSpacing;
	Box2I gridRange;
	std::tie(gridSpacing, gridRange) = determineGridRange(viewport());
	if(gridSpacing <= 0) return;

	// Determine how many grid lines need to be rendered.
	int xstart = gridRange.minc.x();
	int ystart = gridRange.minc.y();
	int numLinesX = gridRange.size(0) + 1;
	int numLinesY = gridRange.size(1) + 1;

	FloatType xstartF = (FloatType)xstart * gridSpacing;
	FloatType ystartF = (FloatType)ystart * gridSpacing;
	FloatType xendF = (FloatType)(xstart + numLinesX - 1) * gridSpacing;
	FloatType yendF = (FloatType)(ystart + numLinesY - 1) * gridSpacing;

	// Allocate vertex buffer.
	int numVertices = 2 * (numLinesX + numLinesY);
	std::unique_ptr<Point3[]> vertexPositions(new Point3[numVertices]);
	std::unique_ptr<ColorA[]> vertexColors(new ColorA[numVertices]);

	// Build lines array.
	ColorA color = Viewport::viewportColor(ViewportSettings::COLOR_GRID);
	ColorA majorColor = Viewport::viewportColor(ViewportSettings::COLOR_GRID_INTENS);
	ColorA majorMajorColor = Viewport::viewportColor(ViewportSettings::COLOR_GRID_AXIS);

	Point3* v = vertexPositions.get();
	ColorA* c = vertexColors.get();
	FloatType x = xstartF;
	for(int i = xstart; i < xstart + numLinesX; i++, x += gridSpacing, c += 2) {
		*v++ = Point3(x, ystartF, 0);
		*v++ = Point3(x, yendF, 0);
		if((i % 10) != 0)
			c[0] = c[1] = color;
		else if(i != 0)
			c[0] = c[1] = majorColor;
		else
			c[0] = c[1] = majorMajorColor;
	}
	FloatType y = ystartF;
	for(int i = ystart; i < ystart + numLinesY; i++, y += gridSpacing, c += 2) {
		*v++ = Point3(xstartF, y, 0);
		*v++ = Point3(xendF, y, 0);
		if((i % 10) != 0)
			c[0] = c[1] = color;
		else if(i != 0)
			c[0] = c[1] = majorColor;
		else
			c[0] = c[1] = majorMajorColor;
	}
	OVITO_ASSERT(c == vertexColors.get() + numVertices);

	// Render grid lines.
	setWorldTransform(viewport()->gridMatrix());
	if(!_constructionGridGeometry || !_constructionGridGeometry->isValid(this))
		_constructionGridGeometry = createLinePrimitive();
	_constructionGridGeometry->setVertexCount(numVertices);
	_constructionGridGeometry->setVertexPositions(vertexPositions.get());
	_constructionGridGeometry->setVertexColors(vertexColors.get());
	_constructionGridGeometry->render(this);
}