void qDrawShadeRect(QPainter *p, int x, int y, int w, int h, const QPalette &pal, bool sunken, int lineWidth, int midLineWidth, const QBrush *fill) { if (w == 0 || h == 0) return; if (! (w > 0 && h > 0 && lineWidth >= 0 && midLineWidth >= 0)) { qWarning("qDrawShadeRect: Invalid parameters"); return; } QPen oldPen = p->pen(); if (sunken) p->setPen(pal.dark().color()); else p->setPen(pal.light().color()); int x1=x, y1=y, x2=x+w-1, y2=y+h-1; if (lineWidth == 1 && midLineWidth == 0) {// standard shade rectangle p->drawRect(x1, y1, w-2, h-2); if (sunken) p->setPen(pal.light().color()); else p->setPen(pal.dark().color()); QLineF lines[4] = { QLineF(x1+1, y1+1, x2-2, y1+1), QLineF(x1+1, y1+2, x1+1, y2-2), QLineF(x1, y2, x2, y2), QLineF(x2,y1, x2,y2-1) }; p->drawLines(lines, 4); // draw bottom/right lines } else { // more complicated int m = lineWidth+midLineWidth; int i, j=0, k=m; for (i=0; i<lineWidth; i++) { // draw top shadow QLineF lines[4] = { QLineF(x1+i, y2-i, x1+i, y1+i), QLineF(x1+i, y1+i, x2-i, y1+i), QLineF(x1+k, y2-k, x2-k, y2-k), QLineF(x2-k, y2-k, x2-k, y1+k) }; p->drawLines(lines, 4); k++; } p->setPen(pal.mid().color()); j = lineWidth*2; for (i=0; i<midLineWidth; i++) { // draw lines in the middle p->drawRect(x1+lineWidth+i, y1+lineWidth+i, w-j-1, h-j-1); j += 2; } if (sunken) p->setPen(pal.light().color()); else p->setPen(pal.dark().color()); k = m; for (i=0; i<lineWidth; i++) { // draw bottom shadow QLineF lines[4] = { QLineF(x1+1+i, y2-i, x2-i, y2-i), QLineF(x2-i, y2-i, x2-i, y1+i+1), QLineF(x1+k, y2-k, x1+k, y1+k), QLineF(x1+k, y1+k, x2-k, y1+k) }; p->drawLines(lines, 4); k++; } } if (fill) { QBrush oldBrush = p->brush(); int tlw = lineWidth + midLineWidth; p->setPen(Qt::NoPen); p->setBrush(*fill); p->drawRect(x+tlw, y+tlw, w-2*tlw, h-2*tlw); p->setBrush(oldBrush); } p->setPen(oldPen); // restore pen }
QT_BEGIN_NAMESPACE /*! \headerfile <qdrawutil.h> \title Drawing Utility Functions \sa QPainter */ /*! \fn void qDrawShadeLine(QPainter *painter, int x1, int y1, int x2, int y2, const QPalette &palette, bool sunken, int lineWidth, int midLineWidth) \relates <qdrawutil.h> Draws a horizontal (\a y1 == \a y2) or vertical (\a x1 == \a x2) shaded line using the given \a painter. Note that nothing is drawn if \a y1 != \a y2 and \a x1 != \a x2 (i.e. the line is neither horizontal nor vertical). The provided \a palette specifies the shading colors (\l {QPalette::light()}{light}, \l {QPalette::dark()}{dark} and \l {QPalette::mid()}{middle} colors). The given \a lineWidth specifies the line width for each of the lines; it is not the total line width. The given \a midLineWidth specifies the width of a middle line drawn in the QPalette::mid() color. The line appears sunken if \a sunken is true, otherwise raised. \warning This function does not look at QWidget::style() or QApplication::style(). Use the drawing functions in QStyle to make widgets that follow the current GUI style. Alternatively you can use a QFrame widget and apply the QFrame::setFrameStyle() function to display a shaded line: \snippet code/src_gui_painting_qdrawutil.cpp 0 \sa qDrawShadeRect(), qDrawShadePanel(), QStyle */ void qDrawShadeLine(QPainter *p, int x1, int y1, int x2, int y2, const QPalette &pal, bool sunken, int lineWidth, int midLineWidth) { if (!(p && lineWidth >= 0 && midLineWidth >= 0)) { qWarning("qDrawShadeLine: Invalid parameters"); return; } int tlw = lineWidth*2 + midLineWidth; // total line width QPen oldPen = p->pen(); // save pen if (sunken) p->setPen(pal.color(QPalette::Dark)); else p->setPen(pal.light().color()); QPolygon a; int i; if (y1 == y2) { // horizontal line int y = y1 - tlw/2; if (x1 > x2) { // swap x1 and x2 int t = x1; x1 = x2; x2 = t; } x2--; for (i=0; i<lineWidth; i++) { // draw top shadow a.setPoints(3, x1+i, y+tlw-1-i, x1+i, y+i, x2-i, y+i); p->drawPolyline(a); } if (midLineWidth > 0) { p->setPen(pal.mid().color()); for (i=0; i<midLineWidth; i++) // draw lines in the middle p->drawLine(x1+lineWidth, y+lineWidth+i, x2-lineWidth, y+lineWidth+i); } if (sunken) p->setPen(pal.light().color()); else p->setPen(pal.dark().color()); for (i=0; i<lineWidth; i++) { // draw bottom shadow a.setPoints(3, x1+i, y+tlw-i-1, x2-i, y+tlw-i-1, x2-i, y+i+1); p->drawPolyline(a); } } else if (x1 == x2) { // vertical line int x = x1 - tlw/2; if (y1 > y2) { // swap y1 and y2 int t = y1; y1 = y2; y2 = t; } y2--; for (i=0; i<lineWidth; i++) { // draw left shadow a.setPoints(3, x+i, y2, x+i, y1+i, x+tlw-1, y1+i); p->drawPolyline(a); } if (midLineWidth > 0) { p->setPen(pal.mid().color()); for (i=0; i<midLineWidth; i++) // draw lines in the middle p->drawLine(x+lineWidth+i, y1+lineWidth, x+lineWidth+i, y2); } if (sunken) p->setPen(pal.light().color()); else p->setPen(pal.dark().color()); for (i=0; i<lineWidth; i++) { // draw right shadow a.setPoints(3, x+lineWidth, y2-i, x+tlw-i-1, y2-i, x+tlw-i-1, y1+lineWidth); p->drawPolyline(a); } } p->setPen(oldPen); }
void LaptopClient::paintEvent( QPaintEvent* ) { QPainter p(widget()); QPalette g = options()->palette(KDecoration::ColorFrame, isActive()); g.setCurrentColorGroup( QPalette::Active ); QRect r(widget()->rect()); p.setPen(Qt::black); p.drawRect(r.adjusted(0, 0, -1, -1)); // fill mid frame... p.setPen(g.background().color()); p.drawLine(r.x()+2, r.y()+2, r.right()-2, r.y()+2); p.drawLine(r.left()+2, r.y()+3, r.left()+2, r.bottom()-layoutMetric(LM_BorderBottom)+1); p.drawLine(r.right()-2, r.y()+3, r.right()-2, r.bottom()-layoutMetric(LM_BorderBottom)+1); p.drawLine(r.left()+3, r.y()+3, r.left()+3, r.y()+layoutMetric(LM_TitleEdgeTop)+layoutMetric(LM_TitleHeight)+layoutMetric(LM_TitleEdgeTop) ); p.drawLine(r.right()-3, r.y()+3, r.right()-3, r.y()+layoutMetric(LM_TitleEdgeTop)+layoutMetric(LM_TitleHeight)+layoutMetric(LM_TitleEdgeTop) ); if (!mustDrawHandle() ) p.drawLine(r.left()+1, r.bottom()-2, r.right()-1, r.bottom()-2); // outer frame p.setPen(g.color(QPalette::Light)); p.drawLine(r.x()+1, r.y()+1, r.right()-1, r.y()+1); p.drawLine(r.x()+1, r.y()+1, r.x()+1, r.bottom()-1); p.setPen(g.dark().color()); p.drawLine(r.right()-1, r.y()+1, r.right()-1, r.bottom()-1); p.drawLine(r.x()+1, r.bottom()-1, r.right()-1, r.bottom()-1); int th = titleHeight; int bb = handleSize + 2; // Bottom border int bs = handleSize - 2; // inner size of bottom border if (!mustDrawHandle()) { bb = 6; bs = 0; } if ( isToolWindow() ) th -= 2; // inner rect p.drawRect(r.x() + 3, r.y() + th + 3, r.width() - 7, r.height() - th - bb - 1); // handles if (mustDrawHandle()) { if (r.width() > 3*handleSize + 20) { int range = 8 + 3*handleSize/2; qDrawShadePanel(&p, r.x() + 1, r.bottom() - bs, range, handleSize - 2, g, false, 1, &g.brush(QPalette::Mid)); qDrawShadePanel(&p, r.x() + range + 1, r.bottom() - bs, r.width() - 2*range - 2, handleSize - 2, g, false, 1, isActive() ? &g.brush(QPalette::Background) : &g.brush(QPalette::Mid)); qDrawShadePanel(&p, r.right() - range, r.bottom() - bs, range, bs, g, false, 1, &g.brush(QPalette::Mid)); } else { qDrawShadePanel(&p, r.x() + 1, r.bottom() - bs, r.width() - 2, bs, g, false, 1, isActive() ? &g.brush(QPalette::Background) : &g.brush(QPalette::Mid)); } } r = titleRect(); if(isActive()){ updateActiveBuffer(); p.drawPixmap(r.x(), r.y(), activeBuffer); p.setPen(g.background().color()); p.drawPoint(r.x(), r.y()); p.drawPoint(r.right(), r.y()); p.drawLine(r.right()+1, r.y(), r.right()+1, r.bottom()); } else{ if(iUpperGradient) p.drawTiledPixmap(r.x(), r.y(), r.width(), r.height()-1, *iUpperGradient); else p.fillRect(r.x(), r.y(), r.width(), r.height()-1, options()->color(KDecoration::ColorTitleBar, false)); p.setFont(options()->font(false, isToolWindow() )); QFontMetrics fm(options()->font(false)); g = options()->palette(KDecoration::ColorTitleBar, false); g.setCurrentColorGroup( QPalette::Active ); if(iUpperGradient) p.drawTiledPixmap(r.x()+((r.width()-fm.width(caption()))/2)-4, r.y(), fm.width(caption())+8, r.height()-1, *iUpperGradient); else p.fillRect(r.x()+((r.width()-fm.width(caption()))/2)-4, r.y(), fm.width(caption())+8, r.height()-1, g.brush(QPalette::Background)); p.setPen(g.mid().color()); p.drawLine(r.x(), r.y(), r.right(), r.y()); p.drawLine(r.x(), r.y(), r.x(), r.bottom()); p.setPen(g.color(QPalette::Button)); p.drawLine(r.right(), r.y(), r.right(), r.bottom()); p.drawLine(r.x(), r.bottom(), r.right(), r.bottom()); p.setPen(options()->color(KDecoration::ColorFont, false)); p.drawText(r.x(), r.y()+1, r.width(), r.height()-1, Qt::AlignCenter, caption() ); g = options()->palette(KDecoration::ColorFrame, true); g.setCurrentColorGroup( QPalette::Active ); p.setPen(g.background().color()); p.drawPoint(r.x(), r.y()); p.drawPoint(r.right(), r.y()); p.drawLine(r.right()+1, r.y(), r.right()+1, r.bottom()); } }
void qDrawShadePanel(QPainter *p, int x, int y, int w, int h, const QPalette &pal, bool sunken, int lineWidth, const QBrush *fill) { if (w == 0 || h == 0) return; if (!(w > 0 && h > 0 && lineWidth >= 0)) { qWarning("qDrawShadePanel: Invalid parameters"); } QColor shade = pal.dark().color(); QColor light = pal.light().color(); if (fill) { if (fill->color() == shade) shade = pal.shadow().color(); if (fill->color() == light) light = pal.midlight().color(); } QPen oldPen = p->pen(); // save pen QVector<QLineF> lines; lines.reserve(2*lineWidth); if (sunken) p->setPen(shade); else p->setPen(light); int x1, y1, x2, y2; int i; x1 = x; y1 = y2 = y; x2 = x+w-2; for (i=0; i<lineWidth; i++) { // top shadow lines << QLineF(x1, y1++, x2--, y2++); } x2 = x1; y1 = y+h-2; for (i=0; i<lineWidth; i++) { // left shado lines << QLineF(x1++, y1, x2++, y2--); } p->drawLines(lines); lines.clear(); if (sunken) p->setPen(light); else p->setPen(shade); x1 = x; y1 = y2 = y+h-1; x2 = x+w-1; for (i=0; i<lineWidth; i++) { // bottom shadow lines << QLineF(x1++, y1--, x2, y2--); } x1 = x2; y1 = y; y2 = y+h-lineWidth-1; for (i=0; i<lineWidth; i++) { // right shadow lines << QLineF(x1--, y1++, x2--, y2); } p->drawLines(lines); if (fill) // fill with fill color p->fillRect(x+lineWidth, y+lineWidth, w-lineWidth*2, h-lineWidth*2, *fill); p->setPen(oldPen); // restore pen }
// motif arrows look the same whether they are used or not // is this correct? static void qDrawMotifArrow(QPainter *p, Qt::ArrowType type, bool down, int x, int y, int w, int h, const QPalette &pal, bool) { QPolygon bFill; // fill polygon QPolygon bTop; // top shadow. QPolygon bBot; // bottom shadow. QPolygon bLeft; // left shadow. QTransform matrix; // xform matrix bool vertical = type == Qt::UpArrow || type == Qt::DownArrow; bool horizontal = !vertical; int dim = w < h ? w : h; int colspec = 0x0000; // color specification array if (dim < 2) // too small arrow return; if (dim > 3) { if (dim > 6) bFill.resize(dim & 1 ? 3 : 4); bTop.resize((dim/2)*2); bBot.resize(dim & 1 ? dim + 1 : dim); bLeft.resize(dim > 4 ? 4 : 2); bLeft.putPoints(0, 2, 0,0, 0,dim-1); if (dim > 4) bLeft.putPoints(2, 2, 1,2, 1,dim-3); bTop.putPoints(0, 4, 1,0, 1,1, 2,1, 3,1); bBot.putPoints(0, 4, 1,dim-1, 1,dim-2, 2,dim-2, 3,dim-2); for(int i=0; i<dim/2-2 ; i++) { bTop.putPoints(i*2+4, 2, 2+i*2,2+i, 5+i*2, 2+i); bBot.putPoints(i*2+4, 2, 2+i*2,dim-3-i, 5+i*2,dim-3-i); } if (dim & 1) // odd number size: extra line bBot.putPoints(dim-1, 2, dim-3,dim/2, dim-1,dim/2); if (dim > 6) { // dim>6: must fill interior bFill.putPoints(0, 2, 1,dim-3, 1,2); if (dim & 1) // if size is an odd number bFill.setPoint(2, dim - 3, dim / 2); else bFill.putPoints(2, 2, dim-4,dim/2-1, dim-4,dim/2); } } else { if (dim == 3) { // 3x3 arrow pattern bLeft.setPoints(4, 0,0, 0,2, 1,1, 1,1); bTop .setPoints(2, 1,0, 1,0); bBot .setPoints(2, 1,2, 2,1); } else { // 2x2 arrow pattern bLeft.setPoints(2, 0,0, 0,1); bTop .setPoints(2, 1,0, 1,0); bBot .setPoints(2, 1,1, 1,1); } } if (type == Qt::UpArrow || type == Qt::LeftArrow) { matrix.translate(x, y); if (vertical) { matrix.translate(0, h - 1); matrix.rotate(-90); } else { matrix.translate(w - 1, h - 1); matrix.rotate(180); } if (down) colspec = horizontal ? 0x2334 : 0x2343; else colspec = horizontal ? 0x1443 : 0x1434; } else if (type == Qt::DownArrow || type == Qt::RightArrow) { matrix.translate(x, y); if (vertical) { matrix.translate(w-1, 0); matrix.rotate(90); } if (down) colspec = horizontal ? 0x2443 : 0x2434; else colspec = horizontal ? 0x1334 : 0x1343; } const QColor *cols[5]; cols[0] = 0; cols[1] = &pal.button().color(); cols[2] = &pal.mid().color(); cols[3] = &pal.light().color(); cols[4] = &pal.dark().color(); #define CMID *cols[(colspec>>12) & 0xf] #define CLEFT *cols[(colspec>>8) & 0xf] #define CTOP *cols[(colspec>>4) & 0xf] #define CBOT *cols[colspec & 0xf] QPen savePen = p->pen(); // save current pen QBrush saveBrush = p->brush(); // save current brush QTransform wxm = p->transform(); QPen pen(Qt::NoPen); const QBrush &brush = pal.brush(QPalette::Button); p->setPen(pen); p->setBrush(brush); p->setTransform(matrix, true); // set transformation matrix p->drawPolygon(bFill); // fill arrow p->setBrush(Qt::NoBrush); // don't fill p->setPen(CLEFT); p->drawLines(bLeft); p->setPen(CTOP); p->drawLines(bTop); p->setPen(CBOT); p->drawLines(bBot); p->setTransform(wxm); p->setBrush(saveBrush); // restore brush p->setPen(savePen); // restore pen #undef CMID #undef CLEFT #undef CTOP #undef CBOT }
void KTThemeSelector::setupChooseColor() { DVHBox *hbox = new DVHBox(this, Qt::Horizontal); DVHBox *box1 = new DVHBox(hbox, Qt::Vertical); box1->boxLayout()->setMargin(10); m_general = new QGroupBox(tr("General"), box1); QGridLayout *layout1 = new QGridLayout(m_general); QStringList labels1 = QStringList() << tr("Text") << tr("Base") << tr("Foreground") << tr("Background") << tr("Button") << tr("Button Text"); QStringList names = QStringList() << "Text" << "Base" << "Foreground" << "Background" << "Button" << "ButtonText"; QPalette colorGroup = QApplication::palette(); QList<QColor> colors = QList<QColor>() << colorGroup.text ().color() << colorGroup.base().color() << colorGroup.foreground().color() << colorGroup.background().color() << colorGroup.button().color() << colorGroup.buttonText().color(); for(int i = 0; i < labels1.count(); i++) { layout1->addWidget(new QLabel(labels1[i], m_general), i, 0 ); DColorButton *button = new DColorButton(m_general); button->setObjectName(names[i]); QPalette pal = button->palette(); pal.setColor(QPalette::Button, colors[i]); button->setPalette(pal); m_generalButtonGroup.addButton(button); layout1->addWidget(button, i, 1); m_generalSection.insert(names[i], colors[i].name()); } m_effects = new QGroupBox(tr("Effects"), box1); QGridLayout *layout2 = new QGridLayout(m_effects); QStringList labels2 = QStringList() << tr("Light") << tr("Midlight") << tr("Dark") << tr("Mid"); QStringList names2 = QStringList() << "Light" << "Midlight" << "Dark" << "Mid"; colors.clear(); colors << colorGroup.light().color() << colorGroup.midlight().color() << colorGroup.dark().color() << colorGroup.mid().color(); for(int i = 0; i < labels2.count(); i++) { layout2->addWidget(new QLabel(labels2[i], m_effects), i, 0 ); DColorButton *button = new DColorButton(m_effects); button->setObjectName(names2[i]); QPalette pal = button->palette(); pal.setColor(QPalette::Button, colors[i]); button->setPalette(pal); m_effectsButtonGroup.addButton(button); layout2->addWidget(button, i, 1); m_effectsSection.insert(names2[i], colors[i].name()); } //////////// DVHBox *box2 = new DVHBox(hbox, Qt::Vertical); box2->boxLayout()->setMargin(10); m_selections = new QGroupBox(tr("Selections"), box2); QGridLayout *layout3 = new QGridLayout(m_selections); QStringList labels3 = QStringList() << tr("Highlight") << tr("Highlighted Text"); QStringList names3 = QStringList() << "Highlight" << "HighlightedText"; colors.clear(); colors << colorGroup.highlight().color() << colorGroup.highlightedText().color(); for(int i = 0; i < labels3.count(); i++) { layout3->addWidget(new QLabel(labels3[i], m_selections), i, 0 ); DColorButton *button = new DColorButton(m_selections); button->setObjectName(names3[i]); QPalette pal = button->palette(); pal.setColor(QPalette::Button, colors[i]); button->setPalette(pal); m_selectionsButtonGroup.addButton(button); layout3->addWidget(button, i, 1); m_selectionsSection.insert(names3[i], colors[i].name()); } m_textEffects = new QGroupBox(tr("Text effects"), box2); QGridLayout *layout4 = new QGridLayout(m_textEffects); QStringList labels4 = QStringList() << tr("Bright Text") << tr("Link") << tr("Link Visited"); QStringList names4 = QStringList() << "BrightText" << "Link" << "LinkVisited"; colors.clear(); colors << colorGroup.brightText().color() << colorGroup.link().color() << colorGroup.linkVisited().color(); for(int i = 0; i < labels4.count(); i++) { layout4->addWidget(new QLabel(labels4[i], m_textEffects), i, 0 ); DColorButton *button = new DColorButton(m_textEffects); button->setObjectName(names4[i]); QPalette pal = button->palette(); pal.setColor(QPalette::Button, colors[i]); button->setPalette(pal); m_textEffectsButtonGroup.addButton(button); layout4->addWidget(button, i, 1); m_textEffectsSection.insert(names4[i], colors[i].name()); } QGroupBox *schemeWidget = new QGroupBox(tr("Schema"), box2); // FIXME: add vertical layout QVBoxLayout *schemaLayout = new QVBoxLayout; m_allSchemes = new QTreeWidget; m_allSchemes->setHeaderLabels ( QStringList() << tr("Schema") << tr( "Owner" ) << tr( "Date" ) ); m_allSchemes->header()->setResizeMode(QHeaderView::Stretch); schemaLayout->addWidget(m_allSchemes); connect(m_allSchemes, SIGNAL(itemDoubleClicked (QTreeWidgetItem *, int )), this, SLOT(loadSchemaFromListView( QTreeWidgetItem *, int ))); QPushButton *saveSchemeButton = new QPushButton(tr("Save schema")); connect(saveSchemeButton, SIGNAL(clicked()), SLOT(saveSchema())); schemaLayout->addWidget(saveSchemeButton); schemeWidget->setLayout(schemaLayout); new DSeparator(this); new QLabel(tr("Style"), this); DStyleComboBox *styleComboBox = new DStyleComboBox(this); Q_UNUSED(styleComboBox); new DSeparator(this); m_useColors = new QCheckBox(tr("Use this colors"), this); connect(&m_generalButtonGroup, SIGNAL(buttonClicked(QAbstractButton * )), SLOT(chooseGeneralColor(QAbstractButton * ))); connect(&m_effectsButtonGroup, SIGNAL(buttonClicked(QAbstractButton * )), SLOT(chooseEffectsColor(QAbstractButton * ))); connect(&m_selectionsButtonGroup, SIGNAL(buttonClicked(QAbstractButton * )), SLOT(chooseSelectionsColor(QAbstractButton * ))); connect(&m_textEffectsButtonGroup, SIGNAL(buttonClicked(QAbstractButton * )), SLOT(chooseTextEffectsColor(QAbstractButton * ))); }
/*! Draw a rectangular frame \param painter Painter \param rect Frame rectangle \param palette Palette \param foregroundRole Foreground role used for QFrame::Plain \param frameWidth Frame width \param midLineWidth Used for QFrame::Box \param frameStyle bitwise OR´ed value of QFrame::Shape and QFrame::Shadow */ void QwtPainter::drawFrame( QPainter *painter, const QRectF &rect, const QPalette &palette, QPalette::ColorRole foregroundRole, int frameWidth, int midLineWidth, int frameStyle ) { if ( frameWidth <= 0 || rect.isEmpty() ) return; const int shadow = frameStyle & QFrame::Shadow_Mask; painter->save(); if ( shadow == QFrame::Plain ) { const QRectF outerRect = rect.adjusted( 0.0, 0.0, -1.0, -1.0 ); const QRectF innerRect = outerRect.adjusted( frameWidth, frameWidth, -frameWidth, -frameWidth ); QPainterPath path; path.addRect( outerRect ); path.addRect( innerRect ); painter->setPen( Qt::NoPen ); painter->setBrush( palette.color( foregroundRole ) ); painter->drawPath( path ); } else { const int shape = frameStyle & QFrame::Shape_Mask; if ( shape == QFrame::Box ) { const QRectF outerRect = rect.adjusted( 0.0, 0.0, -1.0, -1.0 ); const QRectF midRect1 = outerRect.adjusted( frameWidth, frameWidth, -frameWidth, -frameWidth ); const QRectF midRect2 = midRect1.adjusted( midLineWidth, midLineWidth, -midLineWidth, -midLineWidth ); const QRectF innerRect = midRect2.adjusted( frameWidth, frameWidth, -frameWidth, -frameWidth ); QPainterPath path1; path1.moveTo( outerRect.bottomLeft() ); path1.lineTo( outerRect.topLeft() ); path1.lineTo( outerRect.topRight() ); path1.lineTo( midRect1.topRight() ); path1.lineTo( midRect1.topLeft() ); path1.lineTo( midRect1.bottomLeft() ); QPainterPath path2; path2.moveTo( outerRect.bottomLeft() ); path2.lineTo( outerRect.bottomRight() ); path2.lineTo( outerRect.topRight() ); path2.lineTo( midRect1.topRight() ); path2.lineTo( midRect1.bottomRight() ); path2.lineTo( midRect1.bottomLeft() ); QPainterPath path3; path3.moveTo( midRect2.bottomLeft() ); path3.lineTo( midRect2.topLeft() ); path3.lineTo( midRect2.topRight() ); path3.lineTo( innerRect.topRight() ); path3.lineTo( innerRect.topLeft() ); path3.lineTo( innerRect.bottomLeft() ); QPainterPath path4; path4.moveTo( midRect2.bottomLeft() ); path4.lineTo( midRect2.bottomRight() ); path4.lineTo( midRect2.topRight() ); path4.lineTo( innerRect.topRight() ); path4.lineTo( innerRect.bottomRight() ); path4.lineTo( innerRect.bottomLeft() ); QPainterPath path5; path5.addRect( midRect1 ); path5.addRect( midRect2 ); painter->setPen( Qt::NoPen ); QBrush brush1 = palette.dark().color(); QBrush brush2 = palette.light().color(); if ( shadow == QFrame::Raised ) qSwap( brush1, brush2 ); painter->setBrush( brush1 ); painter->drawPath( path1 ); painter->drawPath( path4 ); painter->setBrush( brush2 ); painter->drawPath( path2 ); painter->drawPath( path3 ); painter->setBrush( palette.mid() ); painter->drawPath( path5 ); } #if 0 // qDrawWinPanel doesn't result in something nice // on a scalable document like PDF. Better draw a // Panel. else if ( shape == QFrame::WinPanel ) { painter->setRenderHint( QPainter::NonCosmeticDefaultPen, true ); qDrawWinPanel ( painter, rect.toRect(), palette, frameStyle & QFrame::Sunken ); } else if ( shape == QFrame::StyledPanel ) { } #endif else { const QRectF outerRect = rect.adjusted( 0.0, 0.0, -1.0, -1.0 ); const QRectF innerRect = outerRect.adjusted( frameWidth - 1.0, frameWidth - 1.0, -( frameWidth - 1.0 ), -( frameWidth - 1.0 ) ); QPainterPath path1; path1.moveTo( outerRect.bottomLeft() ); path1.lineTo( outerRect.topLeft() ); path1.lineTo( outerRect.topRight() ); path1.lineTo( innerRect.topRight() ); path1.lineTo( innerRect.topLeft() ); path1.lineTo( innerRect.bottomLeft() ); QPainterPath path2; path2.moveTo( outerRect.bottomLeft() ); path2.lineTo( outerRect.bottomRight() ); path2.lineTo( outerRect.topRight() ); path2.lineTo( innerRect.topRight() ); path2.lineTo( innerRect.bottomRight() ); path2.lineTo( innerRect.bottomLeft() ); painter->setPen( Qt::NoPen ); QBrush brush1 = palette.dark().color(); QBrush brush2 = palette.light().color(); if ( shadow == QFrame::Raised ) qSwap( brush1, brush2 ); painter->setBrush( brush1 ); painter->drawPath( path1 ); painter->setBrush( brush2 ); painter->drawPath( path2 ); } } painter->restore(); }
void QNEConnection::updatePath() { if(!m_port1 || !m_port2) { QPainterPath p; //QPointF pos1(m_port1->scenePos()); //QPointF pos2(m_port2->scenePos()); p.moveTo(pos1); qreal dx = pos2.x() - pos1.x(); qreal dy = pos2.y() - pos1.y(); QPointF ctr1(pos1.x() + dx * 0.25, pos1.y() + dy * 0.1); QPointF ctr2(pos1.x() + dx * 0.75, pos1.y() + dy * 0.9); p.cubicTo(ctr1, ctr2, pos2); setPath(p); return; } QPointF a(mapFromItem(m_port1, 0, 0)); QPointF b(mapFromItem(m_port2, 0, 0)); qreal dist = QLineF(a, b).length(); qreal diffx = abs(a.x() - b.x()); qreal diffy = abs(a.y() - b.y()); QPointF left; QPointF right; QNEPort* leftConn; QNEPort* rightConn; if (a.x() < b.x()) { left = a; leftConn = m_port1; right = b; rightConn = m_port2; } else { left = b; leftConn = m_port2; right = a; rightConn = m_port1; } QPointF bottom; QPointF top; QNEPort* bottomConn; QNEPort* topConn; if (a.y() < b.y()) { top = a; topConn = m_port1; bottom = b; bottomConn = m_port2; } else { top = b; topConn = m_port2; bottom = a; bottomConn = m_port1; } QPointF controlPoint1 = a; QPointF controlPoint2 = b; //how much to move control point from start or end point, default as used for simple case qreal moveX = 0.45 * diffx; qreal moveY = 0.45 * diffy; QSizeF combinedSize(30,30); if (leftConn->parentItem() != NULL) { combinedSize.setWidth(leftConn->parentItem()->boundingRect().width()); combinedSize.setHeight(leftConn->parentItem()->boundingRect().height()); } else { combinedSize.setWidth(5 * leftConn->radius()); combinedSize.setWidth(5 * leftConn->radius()); } if (rightConn->parentItem() != NULL) { combinedSize.setWidth(combinedSize.width() + rightConn->parentItem()->boundingRect().width()); combinedSize.setHeight(combinedSize.height() + rightConn->parentItem()->boundingRect().height()); } else { combinedSize.setWidth(combinedSize.width() + 5 * rightConn->radius()); combinedSize.setHeight(combinedSize.height() + 5 * rightConn->radius()); } if (leftConn->position() == rightConn->position() && leftConn->position() == QNEPort::LeftPosition && right.x() - left.x() < combinedSize.width()/2.0) { controlPoint1.setX(controlPoint1.x() - moveY/2.0 /*- combinedSize.width()/2.0*/); controlPoint2.setX(controlPoint2.x() - moveY/2.0 /*- combinedSize.width()/2.0*/); } else if (leftConn->position() == rightConn->position() && leftConn->position() == QNEPort::RightPosition && right.x() - left.x() < combinedSize.width()/2.0) { controlPoint1.setX(controlPoint1.x() + moveY/2.0 /*+ combinedSize.width()/2.0*/); controlPoint2.setX(controlPoint2.x() + moveY/2.0 /*+ combinedSize.width()/2.0*/); } else if (leftConn->position() == rightConn->position() && leftConn->position() == QNEPort::TopPosition && bottom.y() - top.y() < combinedSize.height()/2.0) { controlPoint1.setY(controlPoint1.y() - moveX/2.0 /*- combinedSize.height()/2.0*/); controlPoint2.setY(controlPoint2.y() - moveX/2.0 /*- combinedSize.height()/2.0*/); } else if (leftConn->position() == rightConn->position() && leftConn->position() == QNEPort::BottomPosition && bottom.y() - top.y() < combinedSize.height()/2.0) { controlPoint1.setY(controlPoint1.y() + moveX/2.0 /*+ combinedSize.height()/2.0*/); controlPoint2.setY(controlPoint2.y() + moveX/2.0 /*+ combinedSize.height()/2.0*/); } else //the simple case, they face each other the "good" way if (leftConn->position() != QNEPort::LeftPosition && rightConn->position() != QNEPort::RightPosition && topConn->position() != QNEPort::TopPosition && bottomConn->position() != QNEPort::BottomPosition) { //very simple: straight line //controlPoint1 = a + 0.3 * (b-a); //controlPoint2 = a + 0.7 * (b-a); controlPoint1 = a; controlPoint2 = b; //how much to move control point from start or end point qreal moveX = 0.45 * diffx; qreal moveY = 0.45 * diffy; if (dist > 5 * (m_port1->radius() + arrowSize)) { /* does mess up good case because moves there too if (abs(diffx-diffy) > 0.3 * dist) { moveX += abs(diffx-diffy); moveY += abs(diffx-diffy); } */ if (moveX < 3 * (m_port1->radius() + arrowSize)) { moveX = 3 * (m_port1->radius() + arrowSize); } if (moveY < 3 * (m_port1->radius() + arrowSize)) { moveY = 3 * (m_port1->radius() + arrowSize); } } if (m_port1->position() == QNEPort::LeftPosition) { controlPoint1.setX(controlPoint1.x() - moveX); } else if (m_port1->position() == QNEPort::RightPosition) { controlPoint1.setX(controlPoint1.x() + moveX); } else if (m_port1->position() == QNEPort::BottomPosition) { controlPoint1.setY(controlPoint1.y() + moveY); } else if (m_port1->position() == QNEPort::TopPosition) { controlPoint1.setY(controlPoint1.y() - moveY); } if (m_port2->position() == QNEPort::LeftPosition) { controlPoint2.setX(controlPoint2.x() - moveX); } else if (m_port2->position() == QNEPort::RightPosition) { controlPoint2.setX(controlPoint2.x() + moveX); } else if (m_port2->position() == QNEPort::BottomPosition) { controlPoint2.setY(controlPoint2.y() + moveY); } else if (m_port2->position() == QNEPort::TopPosition) { controlPoint2.setY(controlPoint2.y() - moveY); } } //the bad case, method needs cleanup else { controlPoint1 = a; controlPoint2 = b; qreal maxMove = 0.5 * dist; moveX = 0.5 * dist; moveY = 0.5 * dist; if (m_port1->parentItem() != NULL) { maxMove = 1 * (m_port1->parentItem()->boundingRect().width() + m_port1->parentItem()->boundingRect().height()); } else if (m_port2->parentItem() != NULL) { maxMove = 1 * (m_port2->parentItem()->boundingRect().width() + m_port2->parentItem()->boundingRect().height()); } if (moveX > maxMove) { moveX = maxMove + 0.1 * (moveX-maxMove); } if (moveY > maxMove) { moveY = maxMove + 0.1 * (moveY-maxMove); } if (m_port1->position() == QNEPort::LeftPosition) { moveX *= -1; if ((m_port1 == topConn) == (m_port1 == rightConn)) { moveY *= -1;//relevantHeight; } } else if (m_port1->position() == QNEPort::RightPosition) { //moveX *= 1; if ((m_port1 == topConn) == (m_port1 == leftConn)) { moveY *= -1;//relevantHeight; } } else if (m_port1->position() == QNEPort::BottomPosition) { //moveY *= 1; if ((m_port1 == leftConn) == (m_port1 == topConn)) { moveX *= -1; } } else if (m_port1->position() == QNEPort::TopPosition) { moveY *= -1; if ((m_port1 == leftConn) == (m_port1 == bottomConn)) { moveX *= -1; } } /* if (m_port1->connectorAlignment() == m_port2->connectorAlignment()) { moveX *= 2; moveY *= 2; } */ //ugly shit: handle some cases that don't look nice if (m_port2 == topConn && topConn->position() == QNEPort::TopPosition && (bottomConn->position() == QNEPort::LeftPosition || bottomConn->position() == QNEPort::RightPosition)) { moveY *= -1; //moveY = 0; } else if (m_port2 == bottomConn && bottomConn->position() == QNEPort::BottomPosition && (topConn->position() == QNEPort::LeftPosition || topConn->position() == QNEPort::RightPosition)) { moveY *= -1; //moveY = 0; } else if (m_port2 == leftConn && leftConn->position() == QNEPort::LeftPosition && (rightConn->position() == QNEPort::TopPosition || rightConn->position() == QNEPort::BottomPosition)) { moveX *= -1; //moveX = 0; } else if (m_port2 == rightConn && rightConn->position() == QNEPort::RightPosition && (leftConn->position() == QNEPort::TopPosition || leftConn->position() == QNEPort::BottomPosition)) { moveX *= -1; //moveX = 0; } controlPoint1.setX(controlPoint1.x() + moveX); controlPoint1.setY(controlPoint1.y() + moveY); moveX = 0.5 * dist; moveY = 0.5 * dist; // if start was null, then it was already set to end. if (m_port1->parentItem() != NULL && m_port2->parentItem() != NULL) { maxMove = 1 * (m_port2->parentItem()->boundingRect().width() + m_port2->parentItem()->boundingRect().height()); } if (moveX > maxMove) { moveX = maxMove + 0.1 * (moveX-maxMove); } if (moveY > maxMove) { moveY = maxMove + 0.1 * (moveY-maxMove); } if (m_port2->position() == QNEPort::LeftPosition) { moveX *= -1; if ((m_port2 == topConn) == (m_port2 == rightConn)) { moveY *= -1;//relevantHeight; } } else if (m_port2->position() == QNEPort::RightPosition) { //moveX *= 1; if ((m_port2 == topConn) == (m_port2 == leftConn)) { moveY *= -1;//relevantHeight; } } else if (m_port2->position() == QNEPort::BottomPosition) { //moveY *= 1; if ((m_port1 == leftConn) == (m_port1 == topConn)) { moveX *= -1; } } else if (m_port2->position() == QNEPort::TopPosition) { moveY *= -1; if ((m_port1 == leftConn) == (m_port1 == bottomConn)) { moveX *= -1; } } /* if (m_port1->connectorAlignment() == m_port2->connectorAlignment()) { moveX *= 2; moveY *= 2; }*/ //ugly shit: handle some cases that don't look nice if (m_port1 == topConn && topConn->position() == QNEPort::TopPosition && (bottomConn->position() == QNEPort::LeftPosition || bottomConn->position() == QNEPort::RightPosition)) { moveY *= -1; //moveY = 0; } else if (m_port1 == bottomConn && bottomConn->position() == QNEPort::BottomPosition && (topConn->position() == QNEPort::LeftPosition || topConn->position() == QNEPort::RightPosition)) { moveY *= -1; //moveY = 0; } else if (m_port1 == leftConn && leftConn->position() == QNEPort::LeftPosition && (rightConn->position() == QNEPort::TopPosition || rightConn->position() == QNEPort::BottomPosition)) { moveX *= -1; //moveX = 0; } else if (m_port1 == rightConn && rightConn->position() == QNEPort::RightPosition && (leftConn->position() == QNEPort::TopPosition || leftConn->position() == QNEPort::BottomPosition)) { moveX *= -1; //moveX = 0; } controlPoint2.setX(controlPoint2.x() + moveX); controlPoint2.setY(controlPoint2.y() + moveY); } QPainterPath p(a); p.cubicTo(controlPoint1, controlPoint2, b); if(m_port1->isOutput()) p.addPolygon(createArrowPoly(p, m_port1)); if(m_port2->isOutput()) p.addPolygon(createArrowPoly(p, m_port2)); this->setPath(p); if(scene()) { QPalette palette = scene()->palette(); setPen(QPen(palette.dark().color(), 2)); setBrush(Qt::NoBrush); } }