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; }
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); } }
/****************************************************************************** * 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); }