/** Redefined to display user input like closable "bubbles". */ void TagLineEdit::paintEvent(QPaintEvent *) { QStylePainter p(this); // Draw frame QStyleOptionFrameV3 frame; this->initStyleOption(&frame); QPalette palette = QApplication::palette(); p.setPen(palette.mid().color()); p.setBrush(palette.base()); p.drawRect(this->rect().adjusted(0, 0, -1, -1)); // Compute cursor position QRect contentsRect = this->style()->subElementRect(QStyle::SE_LineEditContents, &frame); QRect rText = contentsRect.adjusted(2, 0, 0, 0); if (!_tags.isEmpty() || (placeholderText().isEmpty() || (!placeholderText().isEmpty() && hasFocus()))) { p.setPen(palette.text().color()); p.drawText(rText, Qt::AlignLeft | Qt::AlignVCenter, text()); // Animate cursor is focus is owned by this widget bool overlap = false; for (TagButton *t : _tags) { if (t->frameGeometry().contains(cursorRect().center())) { overlap = true; break; } } if (!overlap && hasFocus()) { this->drawCursor(&p, rText.adjusted(0, 1, 0, -1)); } } else { p.setPen(palette.mid().color()); p.drawText(rText, Qt::AlignLeft | Qt::AlignVCenter, placeholderText()); } }
void AddressWidget::paintEvent(QPaintEvent *event) { QLineEdit::paintEvent(event); QColor badgeColor = QColor(245, 245, 245); QStyleOptionFrame panel; initStyleOption(&panel); panel.palette = palette(); panel.palette.setColor(QPalette::Base, badgeColor); panel.state = QStyle::State_Active; QRect rectangle = style()->subElementRect(QStyle::SE_LineEditContents, &panel, this); rectangle.setWidth(30); rectangle.moveTo(panel.lineWidth, panel.lineWidth); m_securityBadgeRectangle = rectangle; QPainter painter(this); painter.fillRect(rectangle, badgeColor); painter.setClipRect(rectangle); style()->drawPrimitive(QStyle::PE_PanelLineEdit, &panel, &painter, this); QPalette linePalette = palette(); linePalette.setCurrentColorGroup(QPalette::Disabled); painter.setPen(QPen(linePalette.mid().color(), 1)); painter.drawLine(rectangle.right(), rectangle.top(), rectangle.right(), rectangle.bottom()); }
static void qDrawWinArrow(QPainter *p, Qt::ArrowType type, bool down, int x, int y, int w, int h, const QPalette &pal, bool enabled) { QPolygon a; // arrow polygon switch (type) { case Qt::UpArrow: a.setPoints(7, -3,1, 3,1, -2,0, 2,0, -1,-1, 1,-1, 0,-2); break; case Qt::DownArrow: a.setPoints(7, -3,-1, 3,-1, -2,0, 2,0, -1,1, 1,1, 0,2); break; case Qt::LeftArrow: a.setPoints(7, 1,-3, 1,3, 0,-2, 0,2, -1,-1, -1,1, -2,0); break; case Qt::RightArrow: a.setPoints(7, -1,-3, -1,3, 0,-2, 0,2, 1,-1, 1,1, 2,0); break; default: break; } if (a.isEmpty()) return; if (down) { x++; y++; } QPen savePen = p->pen(); // save current pen if (down) p->setBrushOrigin(p->brushOrigin() + QPoint(1,1)); p->fillRect(x, y, w, h, pal.brush(QPalette::Button)); if (down) p->setBrushOrigin(p->brushOrigin() - QPoint(1,1)); if (enabled) { a.translate(x+w/2, y+h/2); p->setPen(pal.foreground().color()); p->drawLine(a.at(0), a.at(1)); p->drawLine(a.at(2), a.at(2)); p->drawPoint(a[6]); } else { a.translate(x+w/2+1, y+h/2+1); p->setPen(pal.light().color()); p->drawLine(a.at(0), a.at(1)); p->drawLine(a.at(2), a.at(2)); p->drawPoint(a[6]); a.translate(-1, -1); p->setPen(pal.mid().color()); p->drawLine(a.at(0), a.at(1)); p->drawLine(a.at(2), a.at(2)); p->drawPoint(a[6]); } p->setPen(savePen); // restore pen }
void LaptopClient::updateActiveBuffer( ) { QRect rTitle = titleRect(); if( !bufferDirty && (lastBufferWidth == rTitle.width())) return; if ( rTitle.width() <= 0 || rTitle.height() <= 0 ) return; lastBufferWidth = rTitle.width(); bufferDirty = false; activeBuffer = QPixmap(rTitle.width(), rTitle.height()); QPainter p; QRect r(0, 0, activeBuffer.width(), activeBuffer.height()); p.begin(&activeBuffer); if(aUpperGradient){ p.drawTiledPixmap(r, *aUpperGradient); } else{ p.fillRect(r, options()->color(KDecoration::ColorTitleBar, true)); } if(titlePix) p.drawTiledPixmap(r, *titlePix); p.setFont(options()->font(true, isToolWindow() )); QFontMetrics fm(options()->font(true)); QPalette g = options()->palette(KDecoration::ColorTitleBar, true); g.setCurrentColorGroup( QPalette::Active ); if(aUpperGradient) p.drawTiledPixmap(r.x()+((r.width()-fm.width(caption()))/2)-4, r.y(), fm.width(caption())+8, r.height()-1, *aUpperGradient); else p.fillRect(r.x()+((r.width()-fm.width(caption()))/2)-4, 0, fm.width(caption())+8, r.height(), 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, true)); 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()); p.end(); }
void TimeTrackingView::PaintAttributes::initialize( const QPalette& palette ) { headerBrush = palette.mid(); taskBrushEven = palette.light(); taskBrushOdd = palette.midlight(); totalsRowBrush = headerBrush; totalsRowEvenDayBrush = QBrush( taskBrushEven.color().darker(125) ); headerEvenDayBrush = totalsRowEvenDayBrush; QColor dimHighlight = palette.highlight().color(); dim = 0.25; dimHighlight.setAlphaF( dim * dimHighlight.alphaF() ); const QBrush halfHighlight( dimHighlight ); runningTaskColor = palette.highlight().color(); }
/** Custom rendering. */ void SearchDialog::paintEvent(QPaintEvent *) { QStylePainter p(this); QPalette palette = QApplication::palette(); p.setPen(palette.mid().color()); p.setBrush(palette.base()); p.drawRect(rect().adjusted(0, 0, -1, -1)); p.setPen(palette.midlight().color()); p.drawLine(1, labelSearchMore->height() - 1, rect().width() - 2, labelSearchMore->height() - 1); int y = rect().y() + rect().height() - aggregated->height(); p.drawLine(39, rect().y() + labelSearchMore->height(), 39, y); p.drawLine(1, y, rect().width() - 2, y); }
void QuickStart::paintEvent(QPaintEvent *) { QPainter p(this); QPalette palette = QApplication::palette(); p.fillRect(this->rect(), palette.base()); p.setPen(palette.mid().color()); if (isLeftToRight()) { p.drawLine(QPoint(rect().width() / 2 - 1, 0), rect().topRight()); p.drawLine(rect().topRight(), rect().bottomRight()); } else { p.drawLine(rect().topLeft(), QPoint(rect().width() / 2 - 1, 0)); p.drawLine(rect().topLeft(), rect().bottomLeft()); } }
ImageView::ImageView(QWidget *parent) : QWidget(parent) { m_spacePressed = false; m_mode = MODE_NONE; m_index = 0; m_handler = 0; m_overlay = 0; m_zoom = m_resolution = 1; setAutoFillBackground(true); QPalette p = palette(); p.setBrush(QPalette::Background, p.mid()); setPalette(p); qApp->installEventFilter(this); }
QVariantMap Bridge::get_palette() { QVariantMap colors; QPalette palette = qApp->palette(); colors.insert("window", palette.window().color().name()); colors.insert("window_text", palette.windowText().color().name()); colors.insert("base", palette.base().color().name()); colors.insert("alternate_base", palette.alternateBase().color().name()); colors.insert("text", palette.text().color().name()); colors.insert("button", palette.buttonText().color().name()); colors.insert("bright_text", palette.brightText().color().name()); colors.insert("light", palette.light().color().name()); colors.insert("midlight", palette.midlight().color().name()); colors.insert("dark", palette.dark().color().name()); colors.insert("mid", palette.mid().color().name()); colors.insert("shadow", palette.shadow().color().name()); colors.insert("highlight", palette.highlight().color().name()); colors.insert("highlight_text", palette.highlightedText().color().name()); colors.insert("link", palette.link().color().name()); colors.insert("link_visited", palette.linkVisited().color().name()); return colors; }
void ClassicStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, QPainter *p, const QWidget *widget) const { if (cc != QStyle::CC_Dial) { QCommonStyle::drawComplexControl(cc, opt, p, widget); return; } const QStyleOptionSlider *dial = qstyleoption_cast<const QStyleOptionSlider *>(opt); if (dial == NULL) return; float angle = DIAL_MIN + (DIAL_RANGE * (float(dial->sliderValue - dial->minimum) / (float(dial->maximum - dial->minimum)))); int degrees = int(angle * 180.0 / M_PI); int ns = dial->tickInterval; int numTicks = 1 + (dial->maximum + ns - dial->minimum) / ns; int size = dial->rect.width() < dial->rect.height() ? dial->rect.width() : dial->rect.height(); int scale = 1; int width = size * scale; int indent = (int)(width * 0.15 + 1); QPalette pal = opt->palette; QColor knobColor = pal.mid().color(); //pal.background().color(); QColor meterColor = (dial->state & State_Enabled) ? pal.highlight().color() : pal.mid().color(); QPen pen; QColor c; p->save(); p->setRenderHint(QPainter::Antialiasing, true); p->translate(1+(dial->rect.width()-size)/2, 1+(dial->rect.height()-size)/2); // Knob body and face... pen.setColor(knobColor); pen.setWidth(scale * 2); pen.setCapStyle(Qt::FlatCap); p->setPen(pen); QRadialGradient gradient(size/2, size/2, size-indent, size/2-indent, size/2-indent); gradient.setColorAt(0, knobColor.light()); gradient.setColorAt(1, knobColor.dark()); p->setBrush(gradient); p->drawEllipse(indent, indent, width-2*indent, width-2*indent); // The bright metering bit... c = meterColor; pen.setColor(c); pen.setWidth(indent); p->setPen(pen); int arcLen = -(degrees - 45) * 16; if (arcLen == 0) arcLen = -16; p->drawArc(indent/2, indent/2, width-indent, width-indent, (180 + 45) * 16, arcLen); p->setBrush(Qt::NoBrush); // Tick notches... if (dial->subControls & QStyle::SC_DialTickmarks) { // std::cerr << "Notches visible" << std::endl; pen.setColor(pal.dark().color()); pen.setWidth(scale); p->setPen(pen); for (int i = 0; i < numTicks; ++i) { int div = numTicks; if (div > 1) --div; drawTick(p, DIAL_MIN + (DIAL_MAX - DIAL_MIN) * i / div, width, true); } } // Shadowing... pen.setWidth(scale); p->setPen(pen); // Knob shadow... int shadowAngle = -720; c = knobColor.dark(); for (int arc = 120; arc < 2880; arc += 240) { pen.setColor(c); p->setPen(pen); p->drawArc(indent, indent, width-2*indent, width-2*indent, shadowAngle + arc, 240); p->drawArc(indent, indent, width-2*indent, width-2*indent, shadowAngle - arc, 240); c = c.light(110); } // Scale shadow... shadowAngle = 2160; c = pal.dark().color(); for (int arc = 120; arc < 2880; arc += 240) { pen.setColor(c); p->setPen(pen); p->drawArc(scale/2, scale/2, width-scale, width-scale, shadowAngle + arc, 240); p->drawArc(scale/2, scale/2, width-scale, width-scale, shadowAngle - arc, 240); c = c.light(108); } // Undraw the bottom part... pen.setColor(pal.background().color()); pen.setWidth(scale * 4); p->setPen(pen); p->drawArc(scale/2, scale/2, width-scale, width-scale, -45 * 16, -90 * 16); // Pointer notch... float hyp = float(width) / 2.0; float len = hyp - indent; --len; float x0 = hyp; float y0 = hyp; float x = hyp - len * qSin(angle); float y = hyp + len * qCos(angle); c = pal.dark().color(); pen.setColor((dial->state & State_Enabled) ? c.dark(130) : c); pen.setWidth(scale * 2); p->setPen(pen); p->drawLine(int(x0), int(y0), int(x), int(y)); // done p->restore(); }
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()); } }
/** Redefined. */ void AddressBarButton::paintEvent(QPaintEvent *) { QStylePainter p(this); QRect r = rect().adjusted(0, 1, -1, -(1 + extra)); static const int arrowWidth = r.height(); QPalette palette = QApplication::palette(); QLinearGradient g(rect().topLeft(), rect().bottomLeft()); g.setColorAt(0, palette.base().color()); g.setColorAt(1, palette.window().color()); p.fillRect(r, g); // Compute size of rectangles to display text and right arrow if (_atLeastOneSubDir) { if (isLeftToRight()) { _arrowRect = QRect(r.width() - arrowWidth, r.y(), arrowWidth, r.height()); _textRect = QRect(r.x(), r.y(), r.width() - arrowWidth, r.height()); } else { _arrowRect = QRect(r.x(), r.y(), arrowWidth, r.height()); _textRect = QRect(r.x() + arrowWidth, r.y(), r.width() - arrowWidth, r.height()); } } else { _textRect = r.adjusted(0, 0, -5, 0); } // Highlight button if mouse is over QPoint pos = mapFromGlobal(QCursor::pos()); p.save(); QBrush brush; if (_addressBar->isDown()) { brush = palette.highlight().color().lighter(); } else { brush = palette.highlight().color().lighter(lighterValue); } if (_highlighted) { p.setPen(palette.highlight().color()); p.setBrush(brush); p.drawRect(_textRect); if (_atLeastOneSubDir) { p.drawRect(_arrowRect); } } else { if (_atLeastOneSubDir) { if (_textRect.contains(pos) || _arrowRect.contains(pos)) { p.setPen(palette.highlight().color()); p.setBrush(brush); p.drawRect(_textRect); p.drawRect(_arrowRect); } else { p.setPen(Qt::NoPen); p.setBrush(Qt::NoBrush); p.drawRect(_textRect); p.drawRect(_arrowRect); } } else { if (_textRect.contains(pos)) { p.setPen(palette.highlight().color()); p.setBrush(brush); p.drawRect(_textRect); } } } p.restore(); // Draw folder's name QColor lighterBG = palette.highlight().color().lighter(); QColor highlightedText = palette.highlightedText().color(); if (rect().contains(pos) && SettingsPrivate::instance()->isCustomTextColorOverriden()) { p.setPen(palette.highlightedText().color()); } else if (qAbs(lighterBG.value() - highlightedText.value()) > 128 && _highlighted) { p.setPen(highlightedText); } else { p.setPen(palette.text().color()); } // Special case for root and drives bool root = false; if (_path.isRoot()) { QPixmap pixmap = QFileIconProvider().icon(QFileIconProvider::Computer).pixmap(20, 20); QString drive; if (_isAbsoluteRoot) { pixmap = QFileIconProvider().icon(QFileIconProvider::Computer).pixmap(20, 20); if (isLeftToRight()) { p.drawPixmap(2, 3, 20, 20, pixmap); } else { p.drawPixmap(18, 3, 20, 20, pixmap); } } else { drive = AddressBar::getVolumeInfo(_path.absolutePath()); if (!_isAbsoluteRoot && !drive.isEmpty()) { // Add a small offset to simulate a pressed button if (_highlighted) { p.translate(1, 1); } p.drawText(_textRect.adjusted(5, 0, 0, 0), Qt::AlignCenter, drive); } pixmap = QFileIconProvider().icon(QFileIconProvider::Drive).pixmap(20, 20); } } else { if (!_path.dirName().isEmpty()) { // Add a small offset to simulate a pressed button if (_highlighted) { p.translate(1, 1); } p.drawText(_textRect.adjusted(0, 0, 0, 0), Qt::AlignCenter, _path.dirName()); } } if (_atLeastOneSubDir) { QStyleOptionButton o; o.initFrom(this); p.save(); p.setPen(Qt::NoPen); p.setBrush(o.palette.mid()); if (root && _addressBar->hasHiddenFolders()) { /// Right To Left QPoint p1(o.rect.x() + 32, o.rect.y() + 11), p2(o.rect.x() + 29, o.rect.y() + 14), p2b(o.rect.x() + 29, o.rect.y() + 13), p3(o.rect.x() + 32, o.rect.y() + 16); p.save(); p.setPen(Qt::black); p.setRenderHint(QPainter::Antialiasing); p.drawLine(p1, p2); p.drawLine(p2b, p3); p.translate(4, 0); p.drawLine(p1, p2); p.drawLine(p2b, p3); p.restore(); } else { int w = _arrowRect.width() / 3; int h = this->rect().height() / 3; QRect indicatorArrow(_arrowRect.x() + w + 1, _arrowRect.y() + h, w, h); o.rect = indicatorArrow; p.setRenderHint(QPainter::Antialiasing); p.save(); QPen pen(palette.mid().color()); pen.setWidthF(1.5); pen.setJoinStyle(Qt::MiterJoin); p.setPen(pen); QPolygon pol; QPoint p1, p2, p3; if (_highlighted) { p.translate(0, -1); p1 = QPoint(o.rect.x(), o.rect.y() + o.rect.height() / 2); p2 = QPoint(o.rect.x() + o.rect.width(), o.rect.y() + o.rect.height() / 2); p3 = QPoint(o.rect.x() + o.rect.width() / 2, o.rect.y() + o.rect.height()); } else if (isLeftToRight()) { p1 = QPoint(o.rect.x(), o.rect.y()); p2 = QPoint(o.rect.x(), o.rect.y() + o.rect.height()); p3 = QPoint(o.rect.x() + o.rect.width(), o.rect.y() + o.rect.height() / 2); } else { p1 = QPoint(o.rect.x() + o.rect.width(), o.rect.y()); p2 = QPoint(o.rect.x() + o.rect.width(), o.rect.y() + o.rect.height()); p3 = QPoint(o.rect.x(), o.rect.y() + o.rect.height() / 2); } pol.append(p1); pol.append(p2); pol.append(p3); p.drawPolygon(pol); p.restore(); p.setRenderHint(QPainter::Antialiasing, false); } p.restore(); } }
// Constructor. synthv1widget::synthv1widget ( QWidget *pParent, Qt::WindowFlags wflags ) : QWidget(pParent, wflags) { Q_INIT_RESOURCE(synthv1); #if QT_VERSION >= 0x050000 // HACK: Dark themes grayed/disabled color group fix... QPalette pal; if (pal.base().color().value() < 0x7f) { const QColor& color = pal.window().color(); const int iGroups = int(QPalette::Active | QPalette::Inactive) + 1; for (int i = 0; i < iGroups; ++i) { const QPalette::ColorGroup group = QPalette::ColorGroup(i); pal.setBrush(group, QPalette::Light, color.lighter(150)); pal.setBrush(group, QPalette::Midlight, color.lighter(120)); pal.setBrush(group, QPalette::Dark, color.darker(150)); pal.setBrush(group, QPalette::Mid, color.darker(120)); pal.setBrush(group, QPalette::Shadow, color.darker(200)); } pal.setColor(QPalette::Disabled, QPalette::ButtonText, pal.mid().color()); QWidget::setPalette(pal); } #endif m_ui.setupUi(this); // Init sched notifier. m_sched_notifier = NULL; // Init swapable params A/B to default. for (uint32_t i = 0; i < synthv1::NUM_PARAMS; ++i) m_params_ab[i] = synthv1_param::paramDefaultValue(synthv1::ParamIndex(i)); // Start clean. m_iUpdate = 0; // Replicate the stacked/pages for (int iTab = 0; iTab < m_ui.StackedWidget->count(); ++iTab) m_ui.TabBar->addTab(m_ui.StackedWidget->widget(iTab)->windowTitle()); // Swappable params A/B group. QButtonGroup *pSwapParamsGroup = new QButtonGroup(this); pSwapParamsGroup->addButton(m_ui.SwapParamsAButton); pSwapParamsGroup->addButton(m_ui.SwapParamsBButton); pSwapParamsGroup->setExclusive(true); m_ui.SwapParamsAButton->setChecked(true); // Wave shapes. QStringList shapes; shapes << tr("Pulse"); shapes << tr("Saw"); shapes << tr("Sine"); shapes << tr("Rand"); shapes << tr("Noise"); m_ui.Dco1Shape1Knob->insertItems(0, shapes); m_ui.Dco1Shape2Knob->insertItems(0, shapes); m_ui.Dco2Shape1Knob->insertItems(0, shapes); m_ui.Dco2Shape2Knob->insertItems(0, shapes); m_ui.Lfo1ShapeKnob->insertItems(0, shapes); m_ui.Lfo2ShapeKnob->insertItems(0, shapes); // Filter types. QStringList types; types << tr("LPF"); types << tr("BPF"); types << tr("HPF"); types << tr("BRF"); m_ui.Dcf1TypeKnob->insertItems(0, types); m_ui.Dcf2TypeKnob->insertItems(0, types); // Filter slopes. QStringList slopes; slopes << tr("12dB/oct"); slopes << tr("24dB/oct"); m_ui.Dcf1SlopeKnob->insertItems(0, slopes); m_ui.Dcf2SlopeKnob->insertItems(0, slopes); // Dynamic states. QStringList states; states << tr("Off"); states << tr("On"); m_ui.Dco1Bandl1Knob->insertItems(0, states); m_ui.Dco1Bandl2Knob->insertItems(0, states); m_ui.Dco2Bandl1Knob->insertItems(0, states); m_ui.Dco2Bandl2Knob->insertItems(0, states); m_ui.Dyn1CompressKnob->insertItems(0, states); m_ui.Dyn1LimiterKnob->insertItems(0, states); // Special values const QString& sOff = states.first(); m_ui.Cho1WetKnob->setSpecialValueText(sOff); m_ui.Fla1WetKnob->setSpecialValueText(sOff); m_ui.Pha1WetKnob->setSpecialValueText(sOff); m_ui.Del1WetKnob->setSpecialValueText(sOff); m_ui.Rev1WetKnob->setSpecialValueText(sOff); const QString& sAuto = tr("Auto"); m_ui.Del1BpmKnob->setSpecialValueText(sAuto); // Wave integer widths. m_ui.Dco1Width1Knob->setDecimals(0); m_ui.Dco1Width2Knob->setDecimals(0); m_ui.Dco2Width1Knob->setDecimals(0); m_ui.Dco2Width2Knob->setDecimals(0); m_ui.Lfo1WidthKnob->setDecimals(0); m_ui.Lfo2WidthKnob->setDecimals(0); // DCO octave limits. m_ui.Dco1OctaveKnob->setMinimum(-4.0f); m_ui.Dco1OctaveKnob->setMaximum(+4.0f); m_ui.Dco2OctaveKnob->setMinimum(-4.0f); m_ui.Dco2OctaveKnob->setMaximum(+4.0f); // DCO balance limits. m_ui.Dco1BalanceKnob->setMinimum(-1.0f); m_ui.Dco1BalanceKnob->setMaximum(+1.0f); m_ui.Dco2BalanceKnob->setMinimum(-1.0f); m_ui.Dco2BalanceKnob->setMaximum(+1.0f); // DCO tune limits. m_ui.Dco1TuningKnob->setMinimum(-1.0f); m_ui.Dco1TuningKnob->setMaximum(+1.0f); m_ui.Dco2TuningKnob->setMinimum(-1.0f); m_ui.Dco2TuningKnob->setMaximum(+1.0f); // DCF volume (env.amount) limits. m_ui.Dcf1EnvelopeKnob->setMinimum(-1.0f); m_ui.Dcf1EnvelopeKnob->setMaximum(+1.0f); m_ui.Dcf2EnvelopeKnob->setMinimum(-1.0f); m_ui.Dcf2EnvelopeKnob->setMaximum(+1.0f); // LFO parameter limits. m_ui.Lfo1SweepKnob->setMinimum(-1.0f); m_ui.Lfo1SweepKnob->setMaximum(+1.0f); m_ui.Lfo1CutoffKnob->setMinimum(-1.0f); m_ui.Lfo1CutoffKnob->setMaximum(+1.0f); m_ui.Lfo1ResoKnob->setMinimum(-1.0f); m_ui.Lfo1ResoKnob->setMaximum(+1.0f); m_ui.Lfo1PitchKnob->setMinimum(-1.0f); m_ui.Lfo1PitchKnob->setMaximum(+1.0f); m_ui.Lfo1PanningKnob->setMinimum(-1.0f); m_ui.Lfo1PanningKnob->setMaximum(+1.0f); m_ui.Lfo1VolumeKnob->setMinimum(-1.0f); m_ui.Lfo1VolumeKnob->setMaximum(+1.0f); m_ui.Lfo2SweepKnob->setMinimum(-1.0f); m_ui.Lfo2SweepKnob->setMaximum(+1.0f); m_ui.Lfo2CutoffKnob->setMinimum(-1.0f); m_ui.Lfo2CutoffKnob->setMaximum(+1.0f); m_ui.Lfo2ResoKnob->setMinimum(-1.0f); m_ui.Lfo2ResoKnob->setMaximum(+1.0f); m_ui.Lfo2PitchKnob->setMinimum(-1.0f); m_ui.Lfo2PitchKnob->setMaximum(+1.0f); m_ui.Lfo2PanningKnob->setMinimum(-1.0f); m_ui.Lfo2PanningKnob->setMaximum(+1.0f); m_ui.Lfo2VolumeKnob->setMinimum(-1.0f); m_ui.Lfo2VolumeKnob->setMaximum(+1.0f); // Channel filters QStringList channels; channels << tr("Omni"); for (int iChannel = 0; iChannel < 16; ++iChannel) channels << QString::number(iChannel + 1); m_ui.Def1ChannelKnob->insertItems(0, channels); m_ui.Def2ChannelKnob->insertItems(0, channels); // Mono switches m_ui.Def1MonoKnob->insertItems(0, states); m_ui.Def2MonoKnob->insertItems(0, states); // Output (stereo-)width limits. m_ui.Out1WidthKnob->setMinimum(-1.0f); m_ui.Out1WidthKnob->setMaximum(+1.0f); m_ui.Out2WidthKnob->setMinimum(-1.0f); m_ui.Out2WidthKnob->setMaximum(+1.0f); // Output (stereo-)panning limits. m_ui.Out1PanningKnob->setMinimum(-1.0f); m_ui.Out1PanningKnob->setMaximum(+1.0f); m_ui.Out2PanningKnob->setMinimum(-1.0f); m_ui.Out2PanningKnob->setMaximum(+1.0f); // Effects (delay BPM) m_ui.Del1BpmKnob->setScale(1.0f); m_ui.Del1BpmKnob->setMinimum(3.6f); m_ui.Del1BpmKnob->setMaximum(360.0f); m_ui.Del1BpmKnob->setSingleStep(1.0f); // Reverb (stereo-)width limits. m_ui.Rev1WidthKnob->setMinimum(-1.0f); m_ui.Rev1WidthKnob->setMaximum(+1.0f); // DCO1 setParamKnob(synthv1::DCO1_SHAPE1, m_ui.Dco1Shape1Knob); setParamKnob(synthv1::DCO1_WIDTH1, m_ui.Dco1Width1Knob); setParamKnob(synthv1::DCO1_BANDL1, m_ui.Dco1Bandl1Knob); setParamKnob(synthv1::DCO1_SHAPE2, m_ui.Dco1Shape2Knob); setParamKnob(synthv1::DCO1_WIDTH2, m_ui.Dco1Width2Knob); setParamKnob(synthv1::DCO1_BANDL2, m_ui.Dco1Bandl2Knob); setParamKnob(synthv1::DCO1_BALANCE, m_ui.Dco1BalanceKnob); setParamKnob(synthv1::DCO1_DETUNE, m_ui.Dco1DetuneKnob); setParamKnob(synthv1::DCO1_PHASE, m_ui.Dco1PhaseKnob); setParamKnob(synthv1::DCO1_OCTAVE, m_ui.Dco1OctaveKnob); setParamKnob(synthv1::DCO1_TUNING, m_ui.Dco1TuningKnob); setParamKnob(synthv1::DCO1_GLIDE, m_ui.Dco1GlideKnob); setParamKnob(synthv1::DCO1_ENVTIME, m_ui.Dco1EnvTimeKnob); QObject::connect( m_ui.Dco1Shape1Knob, SIGNAL(valueChanged(float)), m_ui.Dco1Wave1, SLOT(setWaveShape(float))); QObject::connect( m_ui.Dco1Wave1, SIGNAL(waveShapeChanged(float)), m_ui.Dco1Shape1Knob, SLOT(setValue(float))); QObject::connect( m_ui.Dco1Width1Knob, SIGNAL(valueChanged(float)), m_ui.Dco1Wave1, SLOT(setWaveWidth(float))); QObject::connect( m_ui.Dco1Wave1, SIGNAL(waveWidthChanged(float)), m_ui.Dco1Width1Knob, SLOT(setValue(float))); QObject::connect( m_ui.Dco1Shape2Knob, SIGNAL(valueChanged(float)), m_ui.Dco1Wave2, SLOT(setWaveShape(float))); QObject::connect( m_ui.Dco1Wave2, SIGNAL(waveShapeChanged(float)), m_ui.Dco1Shape2Knob, SLOT(setValue(float))); QObject::connect( m_ui.Dco1Width2Knob, SIGNAL(valueChanged(float)), m_ui.Dco1Wave2, SLOT(setWaveWidth(float))); QObject::connect( m_ui.Dco1Wave2, SIGNAL(waveWidthChanged(float)), m_ui.Dco1Width2Knob, SLOT(setValue(float))); // DCF1 setParamKnob(synthv1::DCF1_CUTOFF, m_ui.Dcf1CutoffKnob); setParamKnob(synthv1::DCF1_RESO, m_ui.Dcf1ResoKnob); setParamKnob(synthv1::DCF1_TYPE, m_ui.Dcf1TypeKnob); setParamKnob(synthv1::DCF1_SLOPE, m_ui.Dcf1SlopeKnob); setParamKnob(synthv1::DCF1_ENVELOPE, m_ui.Dcf1EnvelopeKnob); setParamKnob(synthv1::DCF1_ATTACK, m_ui.Dcf1AttackKnob); setParamKnob(synthv1::DCF1_DECAY, m_ui.Dcf1DecayKnob); setParamKnob(synthv1::DCF1_SUSTAIN, m_ui.Dcf1SustainKnob); setParamKnob(synthv1::DCF1_RELEASE, m_ui.Dcf1ReleaseKnob); QObject::connect( m_ui.Dcf1Filt, SIGNAL(cutoffChanged(float)), m_ui.Dcf1CutoffKnob, SLOT(setValue(float))); QObject::connect( m_ui.Dcf1CutoffKnob, SIGNAL(valueChanged(float)), m_ui.Dcf1Filt, SLOT(setCutoff(float))); QObject::connect( m_ui.Dcf1Filt, SIGNAL(resoChanged(float)), m_ui.Dcf1ResoKnob, SLOT(setValue(float))); QObject::connect( m_ui.Dcf1ResoKnob, SIGNAL(valueChanged(float)), m_ui.Dcf1Filt, SLOT(setReso(float))); QObject::connect( m_ui.Dcf1TypeKnob, SIGNAL(valueChanged(float)), m_ui.Dcf1Filt, SLOT(setType(float))); QObject::connect( m_ui.Dcf1SlopeKnob, SIGNAL(valueChanged(float)), m_ui.Dcf1Filt, SLOT(setSlope(float))); QObject::connect( m_ui.Dcf1Env, SIGNAL(attackChanged(float)), m_ui.Dcf1AttackKnob, SLOT(setValue(float))); QObject::connect( m_ui.Dcf1AttackKnob, SIGNAL(valueChanged(float)), m_ui.Dcf1Env, SLOT(setAttack(float))); QObject::connect( m_ui.Dcf1Env, SIGNAL(decayChanged(float)), m_ui.Dcf1DecayKnob, SLOT(setValue(float))); QObject::connect( m_ui.Dcf1DecayKnob, SIGNAL(valueChanged(float)), m_ui.Dcf1Env, SLOT(setDecay(float))); QObject::connect( m_ui.Dcf1Env, SIGNAL(sustainChanged(float)), m_ui.Dcf1SustainKnob, SLOT(setValue(float))); QObject::connect( m_ui.Dcf1SustainKnob, SIGNAL(valueChanged(float)), m_ui.Dcf1Env, SLOT(setSustain(float))); QObject::connect( m_ui.Dcf1Env, SIGNAL(releaseChanged(float)), m_ui.Dcf1ReleaseKnob, SLOT(setValue(float))); QObject::connect( m_ui.Dcf1ReleaseKnob, SIGNAL(valueChanged(float)), m_ui.Dcf1Env, SLOT(setRelease(float))); // LFO1 setParamKnob(synthv1::LFO1_SHAPE, m_ui.Lfo1ShapeKnob); setParamKnob(synthv1::LFO1_WIDTH, m_ui.Lfo1WidthKnob); setParamKnob(synthv1::LFO1_RATE, m_ui.Lfo1RateKnob); setParamKnob(synthv1::LFO1_PANNING, m_ui.Lfo1PanningKnob); setParamKnob(synthv1::LFO1_VOLUME, m_ui.Lfo1VolumeKnob); setParamKnob(synthv1::LFO1_CUTOFF, m_ui.Lfo1CutoffKnob); setParamKnob(synthv1::LFO1_RESO, m_ui.Lfo1ResoKnob); setParamKnob(synthv1::LFO1_PITCH, m_ui.Lfo1PitchKnob); setParamKnob(synthv1::LFO1_SWEEP, m_ui.Lfo1SweepKnob); setParamKnob(synthv1::LFO1_ATTACK, m_ui.Lfo1AttackKnob); setParamKnob(synthv1::LFO1_DECAY, m_ui.Lfo1DecayKnob); setParamKnob(synthv1::LFO1_SUSTAIN, m_ui.Lfo1SustainKnob); setParamKnob(synthv1::LFO1_RELEASE, m_ui.Lfo1ReleaseKnob); QObject::connect( m_ui.Lfo1ShapeKnob, SIGNAL(valueChanged(float)), m_ui.Lfo1Wave, SLOT(setWaveShape(float))); QObject::connect( m_ui.Lfo1Wave, SIGNAL(waveShapeChanged(float)), m_ui.Lfo1ShapeKnob, SLOT(setValue(float))); QObject::connect( m_ui.Lfo1WidthKnob, SIGNAL(valueChanged(float)), m_ui.Lfo1Wave, SLOT(setWaveWidth(float))); QObject::connect( m_ui.Lfo1Wave, SIGNAL(waveWidthChanged(float)), m_ui.Lfo1WidthKnob, SLOT(setValue(float))); QObject::connect( m_ui.Lfo1Env, SIGNAL(attackChanged(float)), m_ui.Lfo1AttackKnob, SLOT(setValue(float))); QObject::connect( m_ui.Lfo1AttackKnob, SIGNAL(valueChanged(float)), m_ui.Lfo1Env, SLOT(setAttack(float))); QObject::connect( m_ui.Lfo1Env, SIGNAL(decayChanged(float)), m_ui.Lfo1DecayKnob, SLOT(setValue(float))); QObject::connect( m_ui.Lfo1DecayKnob, SIGNAL(valueChanged(float)), m_ui.Lfo1Env, SLOT(setDecay(float))); QObject::connect( m_ui.Lfo1Env, SIGNAL(sustainChanged(float)), m_ui.Lfo1SustainKnob, SLOT(setValue(float))); QObject::connect( m_ui.Lfo1SustainKnob, SIGNAL(valueChanged(float)), m_ui.Lfo1Env, SLOT(setSustain(float))); QObject::connect( m_ui.Lfo1Env, SIGNAL(releaseChanged(float)), m_ui.Lfo1ReleaseKnob, SLOT(setValue(float))); QObject::connect( m_ui.Lfo1ReleaseKnob, SIGNAL(valueChanged(float)), m_ui.Lfo1Env, SLOT(setRelease(float))); // DCA1 setParamKnob(synthv1::DCA1_VOLUME, m_ui.Dca1VolumeKnob); setParamKnob(synthv1::DCA1_ATTACK, m_ui.Dca1AttackKnob); setParamKnob(synthv1::DCA1_DECAY, m_ui.Dca1DecayKnob); setParamKnob(synthv1::DCA1_SUSTAIN, m_ui.Dca1SustainKnob); setParamKnob(synthv1::DCA1_RELEASE, m_ui.Dca1ReleaseKnob); QObject::connect( m_ui.Dca1Env, SIGNAL(attackChanged(float)), m_ui.Dca1AttackKnob, SLOT(setValue(float))); QObject::connect( m_ui.Dca1AttackKnob, SIGNAL(valueChanged(float)), m_ui.Dca1Env, SLOT(setAttack(float))); QObject::connect( m_ui.Dca1Env, SIGNAL(decayChanged(float)), m_ui.Dca1DecayKnob, SLOT(setValue(float))); QObject::connect( m_ui.Dca1DecayKnob, SIGNAL(valueChanged(float)), m_ui.Dca1Env, SLOT(setDecay(float))); QObject::connect( m_ui.Dca1Env, SIGNAL(sustainChanged(float)), m_ui.Dca1SustainKnob, SLOT(setValue(float))); QObject::connect( m_ui.Dca1SustainKnob, SIGNAL(valueChanged(float)), m_ui.Dca1Env, SLOT(setSustain(float))); QObject::connect( m_ui.Dca1Env, SIGNAL(releaseChanged(float)), m_ui.Dca1ReleaseKnob, SLOT(setValue(float))); QObject::connect( m_ui.Dca1ReleaseKnob, SIGNAL(valueChanged(float)), m_ui.Dca1Env, SLOT(setRelease(float))); // DEF1 setParamKnob(synthv1::DEF1_PITCHBEND, m_ui.Def1PitchbendKnob); setParamKnob(synthv1::DEF1_MODWHEEL, m_ui.Def1ModwheelKnob); setParamKnob(synthv1::DEF1_PRESSURE, m_ui.Def1PressureKnob); setParamKnob(synthv1::DEF1_VELOCITY, m_ui.Def1VelocityKnob); setParamKnob(synthv1::DEF1_CHANNEL, m_ui.Def1ChannelKnob); setParamKnob(synthv1::DEF1_MONO, m_ui.Def1MonoKnob); // OUT1 setParamKnob(synthv1::OUT1_WIDTH, m_ui.Out1WidthKnob); setParamKnob(synthv1::OUT1_PANNING, m_ui.Out1PanningKnob); setParamKnob(synthv1::OUT1_VOLUME, m_ui.Out1VolumeKnob); // DCO2 setParamKnob(synthv1::DCO2_SHAPE1, m_ui.Dco2Shape1Knob); setParamKnob(synthv1::DCO2_WIDTH1, m_ui.Dco2Width1Knob); setParamKnob(synthv1::DCO2_BANDL1, m_ui.Dco2Bandl1Knob); setParamKnob(synthv1::DCO2_SHAPE2, m_ui.Dco2Shape2Knob); setParamKnob(synthv1::DCO2_WIDTH2, m_ui.Dco2Width2Knob); setParamKnob(synthv1::DCO2_BANDL2, m_ui.Dco2Bandl2Knob); setParamKnob(synthv1::DCO2_BALANCE, m_ui.Dco2BalanceKnob); setParamKnob(synthv1::DCO2_DETUNE, m_ui.Dco2DetuneKnob); setParamKnob(synthv1::DCO2_PHASE, m_ui.Dco2PhaseKnob); setParamKnob(synthv1::DCO2_OCTAVE, m_ui.Dco2OctaveKnob); setParamKnob(synthv1::DCO2_TUNING, m_ui.Dco2TuningKnob); setParamKnob(synthv1::DCO2_GLIDE, m_ui.Dco2GlideKnob); setParamKnob(synthv1::DCO2_ENVTIME, m_ui.Dco2EnvTimeKnob); QObject::connect( m_ui.Dco2Shape1Knob, SIGNAL(valueChanged(float)), m_ui.Dco2Wave1, SLOT(setWaveShape(float))); QObject::connect( m_ui.Dco2Wave1, SIGNAL(waveShapeChanged(float)), m_ui.Dco2Shape1Knob, SLOT(setValue(float))); QObject::connect( m_ui.Dco2Width1Knob, SIGNAL(valueChanged(float)), m_ui.Dco2Wave1, SLOT(setWaveWidth(float))); QObject::connect( m_ui.Dco2Wave1, SIGNAL(waveWidthChanged(float)), m_ui.Dco2Width1Knob, SLOT(setValue(float))); QObject::connect( m_ui.Dco2Shape2Knob, SIGNAL(valueChanged(float)), m_ui.Dco2Wave2, SLOT(setWaveShape(float))); QObject::connect( m_ui.Dco2Wave2, SIGNAL(waveShapeChanged(float)), m_ui.Dco2Shape2Knob, SLOT(setValue(float))); QObject::connect( m_ui.Dco2Width2Knob, SIGNAL(valueChanged(float)), m_ui.Dco2Wave2, SLOT(setWaveWidth(float))); QObject::connect( m_ui.Dco2Wave2, SIGNAL(waveWidthChanged(float)), m_ui.Dco2Width2Knob, SLOT(setValue(float))); // DCF2 setParamKnob(synthv1::DCF2_CUTOFF, m_ui.Dcf2CutoffKnob); setParamKnob(synthv1::DCF2_RESO, m_ui.Dcf2ResoKnob); setParamKnob(synthv1::DCF2_TYPE, m_ui.Dcf2TypeKnob); setParamKnob(synthv1::DCF2_SLOPE, m_ui.Dcf2SlopeKnob); setParamKnob(synthv1::DCF2_ENVELOPE, m_ui.Dcf2EnvelopeKnob); setParamKnob(synthv1::DCF2_ATTACK, m_ui.Dcf2AttackKnob); setParamKnob(synthv1::DCF2_DECAY, m_ui.Dcf2DecayKnob); setParamKnob(synthv1::DCF2_SUSTAIN, m_ui.Dcf2SustainKnob); setParamKnob(synthv1::DCF2_RELEASE, m_ui.Dcf2ReleaseKnob); QObject::connect( m_ui.Dcf2Filt, SIGNAL(cutoffChanged(float)), m_ui.Dcf2CutoffKnob, SLOT(setValue(float))); QObject::connect( m_ui.Dcf2CutoffKnob, SIGNAL(valueChanged(float)), m_ui.Dcf2Filt, SLOT(setCutoff(float))); QObject::connect( m_ui.Dcf2Filt, SIGNAL(resoChanged(float)), m_ui.Dcf2ResoKnob, SLOT(setValue(float))); QObject::connect( m_ui.Dcf2ResoKnob, SIGNAL(valueChanged(float)), m_ui.Dcf2Filt, SLOT(setReso(float))); QObject::connect( m_ui.Dcf2TypeKnob, SIGNAL(valueChanged(float)), m_ui.Dcf2Filt, SLOT(setType(float))); QObject::connect( m_ui.Dcf2SlopeKnob, SIGNAL(valueChanged(float)), m_ui.Dcf2Filt, SLOT(setSlope(float))); QObject::connect( m_ui.Dcf2Env, SIGNAL(attackChanged(float)), m_ui.Dcf2AttackKnob, SLOT(setValue(float))); QObject::connect( m_ui.Dcf2AttackKnob, SIGNAL(valueChanged(float)), m_ui.Dcf2Env, SLOT(setAttack(float))); QObject::connect( m_ui.Dcf2Env, SIGNAL(decayChanged(float)), m_ui.Dcf2DecayKnob, SLOT(setValue(float))); QObject::connect( m_ui.Dcf2DecayKnob, SIGNAL(valueChanged(float)), m_ui.Dcf2Env, SLOT(setDecay(float))); QObject::connect( m_ui.Dcf2Env, SIGNAL(sustainChanged(float)), m_ui.Dcf2SustainKnob, SLOT(setValue(float))); QObject::connect( m_ui.Dcf2SustainKnob, SIGNAL(valueChanged(float)), m_ui.Dcf2Env, SLOT(setSustain(float))); QObject::connect( m_ui.Dcf2Env, SIGNAL(releaseChanged(float)), m_ui.Dcf2ReleaseKnob, SLOT(setValue(float))); QObject::connect( m_ui.Dcf2ReleaseKnob, SIGNAL(valueChanged(float)), m_ui.Dcf2Env, SLOT(setRelease(float))); // LFO2 setParamKnob(synthv1::LFO2_SHAPE, m_ui.Lfo2ShapeKnob); setParamKnob(synthv1::LFO2_WIDTH, m_ui.Lfo2WidthKnob); setParamKnob(synthv1::LFO2_RATE, m_ui.Lfo2RateKnob); setParamKnob(synthv1::LFO2_PANNING, m_ui.Lfo2PanningKnob); setParamKnob(synthv1::LFO2_VOLUME, m_ui.Lfo2VolumeKnob); setParamKnob(synthv1::LFO2_CUTOFF, m_ui.Lfo2CutoffKnob); setParamKnob(synthv1::LFO2_RESO, m_ui.Lfo2ResoKnob); setParamKnob(synthv1::LFO2_PITCH, m_ui.Lfo2PitchKnob); setParamKnob(synthv1::LFO2_SWEEP, m_ui.Lfo2SweepKnob); setParamKnob(synthv1::LFO2_ATTACK, m_ui.Lfo2AttackKnob); setParamKnob(synthv1::LFO2_DECAY, m_ui.Lfo2DecayKnob); setParamKnob(synthv1::LFO2_SUSTAIN, m_ui.Lfo2SustainKnob); setParamKnob(synthv1::LFO2_RELEASE, m_ui.Lfo2ReleaseKnob); QObject::connect( m_ui.Lfo2ShapeKnob, SIGNAL(valueChanged(float)), m_ui.Lfo2Wave, SLOT(setWaveShape(float))); QObject::connect( m_ui.Lfo2Wave, SIGNAL(waveShapeChanged(float)), m_ui.Lfo2ShapeKnob, SLOT(setValue(float))); QObject::connect( m_ui.Lfo2WidthKnob, SIGNAL(valueChanged(float)), m_ui.Lfo2Wave, SLOT(setWaveWidth(float))); QObject::connect( m_ui.Lfo2Wave, SIGNAL(waveWidthChanged(float)), m_ui.Lfo2WidthKnob, SLOT(setValue(float))); QObject::connect( m_ui.Lfo2Env, SIGNAL(attackChanged(float)), m_ui.Lfo2AttackKnob, SLOT(setValue(float))); QObject::connect( m_ui.Lfo2AttackKnob, SIGNAL(valueChanged(float)), m_ui.Lfo2Env, SLOT(setAttack(float))); QObject::connect( m_ui.Lfo2Env, SIGNAL(decayChanged(float)), m_ui.Lfo2DecayKnob, SLOT(setValue(float))); QObject::connect( m_ui.Lfo2DecayKnob, SIGNAL(valueChanged(float)), m_ui.Lfo2Env, SLOT(setDecay(float))); QObject::connect( m_ui.Lfo2Env, SIGNAL(sustainChanged(float)), m_ui.Lfo2SustainKnob, SLOT(setValue(float))); QObject::connect( m_ui.Lfo2SustainKnob, SIGNAL(valueChanged(float)), m_ui.Lfo2Env, SLOT(setSustain(float))); QObject::connect( m_ui.Lfo2Env, SIGNAL(releaseChanged(float)), m_ui.Lfo2ReleaseKnob, SLOT(setValue(float))); QObject::connect( m_ui.Lfo2ReleaseKnob, SIGNAL(valueChanged(float)), m_ui.Lfo2Env, SLOT(setRelease(float))); // DCA2 setParamKnob(synthv1::DCA2_VOLUME, m_ui.Dca2VolumeKnob); setParamKnob(synthv1::DCA2_ATTACK, m_ui.Dca2AttackKnob); setParamKnob(synthv1::DCA2_DECAY, m_ui.Dca2DecayKnob); setParamKnob(synthv1::DCA2_SUSTAIN, m_ui.Dca2SustainKnob); setParamKnob(synthv1::DCA2_RELEASE, m_ui.Dca2ReleaseKnob); QObject::connect( m_ui.Dca2Env, SIGNAL(attackChanged(float)), m_ui.Dca2AttackKnob, SLOT(setValue(float))); QObject::connect( m_ui.Dca2AttackKnob, SIGNAL(valueChanged(float)), m_ui.Dca2Env, SLOT(setAttack(float))); QObject::connect( m_ui.Dca2Env, SIGNAL(decayChanged(float)), m_ui.Dca2DecayKnob, SLOT(setValue(float))); QObject::connect( m_ui.Dca2DecayKnob, SIGNAL(valueChanged(float)), m_ui.Dca2Env, SLOT(setDecay(float))); QObject::connect( m_ui.Dca2Env, SIGNAL(sustainChanged(float)), m_ui.Dca2SustainKnob, SLOT(setValue(float))); QObject::connect( m_ui.Dca2SustainKnob, SIGNAL(valueChanged(float)), m_ui.Dca2Env, SLOT(setSustain(float))); QObject::connect( m_ui.Dca2Env, SIGNAL(releaseChanged(float)), m_ui.Dca2ReleaseKnob, SLOT(setValue(float))); QObject::connect( m_ui.Dca2ReleaseKnob, SIGNAL(valueChanged(float)), m_ui.Dca2Env, SLOT(setRelease(float))); // DEF2 setParamKnob(synthv1::DEF2_PITCHBEND, m_ui.Def2PitchbendKnob); setParamKnob(synthv1::DEF2_MODWHEEL, m_ui.Def2ModwheelKnob); setParamKnob(synthv1::DEF2_PRESSURE, m_ui.Def2PressureKnob); setParamKnob(synthv1::DEF2_VELOCITY, m_ui.Def2VelocityKnob); setParamKnob(synthv1::DEF2_CHANNEL, m_ui.Def2ChannelKnob); setParamKnob(synthv1::DEF2_MONO, m_ui.Def2MonoKnob); // OUT2 setParamKnob(synthv1::OUT2_WIDTH, m_ui.Out2WidthKnob); setParamKnob(synthv1::OUT2_PANNING, m_ui.Out2PanningKnob); setParamKnob(synthv1::OUT2_VOLUME, m_ui.Out2VolumeKnob); // Effects setParamKnob(synthv1::CHO1_WET, m_ui.Cho1WetKnob); setParamKnob(synthv1::CHO1_DELAY, m_ui.Cho1DelayKnob); setParamKnob(synthv1::CHO1_FEEDB, m_ui.Cho1FeedbKnob); setParamKnob(synthv1::CHO1_RATE, m_ui.Cho1RateKnob); setParamKnob(synthv1::CHO1_MOD, m_ui.Cho1ModKnob); setParamKnob(synthv1::FLA1_WET, m_ui.Fla1WetKnob); setParamKnob(synthv1::FLA1_DELAY, m_ui.Fla1DelayKnob); setParamKnob(synthv1::FLA1_FEEDB, m_ui.Fla1FeedbKnob); setParamKnob(synthv1::FLA1_DAFT, m_ui.Fla1DaftKnob); setParamKnob(synthv1::PHA1_WET, m_ui.Pha1WetKnob); setParamKnob(synthv1::PHA1_RATE, m_ui.Pha1RateKnob); setParamKnob(synthv1::PHA1_FEEDB, m_ui.Pha1FeedbKnob); setParamKnob(synthv1::PHA1_DEPTH, m_ui.Pha1DepthKnob); setParamKnob(synthv1::PHA1_DAFT, m_ui.Pha1DaftKnob); setParamKnob(synthv1::DEL1_WET, m_ui.Del1WetKnob); setParamKnob(synthv1::DEL1_DELAY, m_ui.Del1DelayKnob); setParamKnob(synthv1::DEL1_FEEDB, m_ui.Del1FeedbKnob); setParamKnob(synthv1::DEL1_BPM, m_ui.Del1BpmKnob); QObject::connect(m_ui.Del1BpmKnob, SIGNAL(valueChanged(float)), SLOT(bpmSyncChanged())); // Reverb setParamKnob(synthv1::REV1_WET, m_ui.Rev1WetKnob); setParamKnob(synthv1::REV1_ROOM, m_ui.Rev1RoomKnob); setParamKnob(synthv1::REV1_DAMP, m_ui.Rev1DampKnob); setParamKnob(synthv1::REV1_FEEDB, m_ui.Rev1FeedbKnob); setParamKnob(synthv1::REV1_WIDTH, m_ui.Rev1WidthKnob); // Dynamics setParamKnob(synthv1::DYN1_COMPRESS, m_ui.Dyn1CompressKnob); setParamKnob(synthv1::DYN1_LIMITER, m_ui.Dyn1LimiterKnob); // Preset management QObject::connect(m_ui.Preset, SIGNAL(newPresetFile()), SLOT(newPreset())); QObject::connect(m_ui.Preset, SIGNAL(loadPresetFile(const QString&)), SLOT(loadPreset(const QString&))); QObject::connect(m_ui.Preset, SIGNAL(savePresetFile(const QString&)), SLOT(savePreset(const QString&))); QObject::connect(m_ui.Preset, SIGNAL(resetPresetFile()), SLOT(resetParams())); // Swap params A/B QObject::connect(m_ui.SwapParamsAButton, SIGNAL(toggled(bool)), SLOT(swapParams(bool))); QObject::connect(m_ui.SwapParamsBButton, SIGNAL(toggled(bool)), SLOT(swapParams(bool))); // Direct stacked-page signal/slot QObject::connect(m_ui.TabBar, SIGNAL(currentChanged(int)), m_ui.StackedWidget, SLOT(setCurrentIndex(int))); // Menu actions QObject::connect(m_ui.helpConfigureAction, SIGNAL(triggered(bool)), SLOT(helpConfigure())); QObject::connect(m_ui.helpAboutAction, SIGNAL(triggered(bool)), SLOT(helpAbout())); QObject::connect(m_ui.helpAboutQtAction, SIGNAL(triggered(bool)), SLOT(helpAboutQt())); // General knob/dial behavior init... synthv1_config *pConfig = synthv1_config::getInstance(); if (pConfig) { synthv1widget_dial::setDialMode( synthv1widget_dial::DialMode(pConfig->iKnobDialMode)); } // Epilog. // QWidget::adjustSize(); m_ui.StatusBar->showMessage(tr("Ready"), 5000); m_ui.StatusBar->setModified(false); m_ui.Preset->setDirtyPreset(false); }
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 * ))); }
/** Redefined to be style-aware at runtime. */ void ExtendedTabBar::paintEvent(QPaintEvent *) { QStyleOptionTab lib, fe; initStyleOption(&lib, 0); initStyleOption(&fe, 1); QPalette pal = QApplication::palette(); QStylePainter p(this); // Library is selected if (currentIndex() == 0) { p.fillRect(lib.rect, lib.palette.base().color()); p.setPen(pal.text().color()); p.drawText(lib.rect, Qt::AlignCenter, fontMetrics().elidedText(lib.text, Qt::ElideRight, lib.rect.width())); // Draw Top and Right lines only p.setPen(pal.mid().color()); p.drawLine(lib.rect.x(), lib.rect.y(), lib.rect.x() + lib.rect.width(), lib.rect.y()); if (isLeftToRight()) { p.drawLine(lib.rect.x() + lib.rect.width(), lib.rect.y(), lib.rect.x() + lib.rect.width(), lib.rect.y() + lib.rect.height()); } else { p.drawLine(lib.rect.x(), lib.rect.y(), lib.rect.x(), lib.rect.y() + lib.rect.height()); } // Reduce the size of unselected tab fe.rect.adjust(3, 2, -3, 0); if (fe.state.testFlag(QStyle::State_MouseOver)) { p.fillRect(fe.rect, pal.highlight().color().light()); p.setPen(pal.text().color()); p.drawText(fe.rect, Qt::AlignCenter, fontMetrics().elidedText(fe.text, Qt::ElideRight, fe.rect.width())); p.setPen(fe.palette.highlight().color()); } else { p.fillRect(fe.rect, pal.light().color()); p.setPen(pal.mid().color()); p.drawText(fe.rect, Qt::AlignCenter, fontMetrics().elidedText(fe.text, Qt::ElideRight, fe.rect.width())); p.setPen(pal.midlight().color()); } // Draw Left, Top and Right lines p.drawLine(fe.rect.x(), fe.rect.y() + fe.rect.height(), fe.rect.x(), fe.rect.y()); p.drawLine(fe.rect.x(), fe.rect.y(), fe.rect.x() + fe.rect.width(), fe.rect.y()); p.drawLine(fe.rect.x() + fe.rect.width(), fe.rect.y(), fe.rect.x() + fe.rect.width(), fe.rect.y() + fe.rect.height()); // Draw bottom line p.setPen(pal.mid().color()); if (isLeftToRight()) { p.drawLine(rect().x() + rect().width() / 2, rect().y() + rect().height() - 1, rect().x() + rect().width(), rect().y() + rect().height() - 1); } else { p.drawLine(rect().x(), rect().y() + rect().height() - 1, rect().x() + rect().width() / 2, rect().y() + rect().height() - 1); } } else { p.fillRect(fe.rect, lib.palette.base().color()); p.setPen(pal.text().color()); p.drawText(fe.rect, Qt::AlignCenter, fontMetrics().elidedText(fe.text, Qt::ElideRight, fe.rect.width())); if (isLeftToRight()) { if (rect().width() % 2 == 0) { lib.rect.adjust(0, 0, -1, 0); fe.rect.adjust(-1, 0, -1, 0); } } else { if (rect().width() % 2 == 1) { lib.rect.adjust(0, 0, -1, 0); fe.rect.adjust(1, 0, -1, 0); } } // Draw Left, Top and Right lines p.setPen(pal.mid().color()); p.drawLine(fe.rect.x(), fe.rect.y() + fe.rect.height(), fe.rect.x(), fe.rect.y()); p.drawLine(fe.rect.x(), fe.rect.y(), fe.rect.x() + fe.rect.width(), fe.rect.y()); p.drawLine(fe.rect.x() + fe.rect.width(), fe.rect.y(), fe.rect.x() + fe.rect.width(), fe.rect.y() + fe.rect.height()); // Reduce the size of unselected tab lib.rect.adjust(2, 2, -3, 0); if (lib.state.testFlag(QStyle::State_MouseOver)) { p.fillRect(lib.rect, pal.highlight().color().light()); p.setPen(pal.text().color()); p.drawText(lib.rect, Qt::AlignCenter, fontMetrics().elidedText(lib.text, Qt::ElideRight, lib.rect.width())); p.setPen(lib.palette.highlight().color()); } else { p.fillRect(lib.rect, pal.light().color()); p.setPen(pal.mid().color()); p.drawText(lib.rect, Qt::AlignCenter, fontMetrics().elidedText(lib.text, Qt::ElideRight, lib.rect.width())); p.setPen(pal.midlight().color()); } // Draw Left, Top and Right lines p.drawLine(lib.rect.x(), lib.rect.y() + lib.rect.height(), lib.rect.x(), lib.rect.y()); p.drawLine(lib.rect.x(), lib.rect.y(), lib.rect.x() + lib.rect.width(), lib.rect.y()); p.drawLine(lib.rect.x() + lib.rect.width(), lib.rect.y(), lib.rect.x() + lib.rect.width(), lib.rect.y() + lib.rect.height()); } }
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); }
// 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 }
/*! 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 MiamStyle::drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { switch (element) { #if !defined(Q_OS_OSX) case CE_Splitter: break; #endif case CE_MenuBarItem:{ const QStyleOptionMenuItem *somi = static_cast<const QStyleOptionMenuItem*>(option); const bool act = somi->state & (State_Sunken | State_Selected); QPalette palette = QApplication::palette(); QBrush brush; if (act) { painter->setPen(palette.highlight().color()); brush = palette.highlight().color().lighter(); painter->setBrush(brush); painter->drawRect(option->rect.adjusted(0, 0, -1, -1)); } else { brush = palette.window(); painter->fillRect(option->rect, palette.window()); } uint alignment = Qt::AlignCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine; if (!styleHint(SH_UnderlineShortcut, somi, widget)) { alignment |= Qt::TextHideMnemonic; } if (somi->state.testFlag(QStyle::State_Enabled)) { if (SettingsPrivate::instance()->isCustomTextColorOverriden()) { if (act) { painter->setPen(palette.highlightedText().color()); } else { painter->setPen(palette.text().color()); } } else { if (qAbs(palette.text().color().value() - brush.color().value()) < 128) { painter->setPen(palette.highlightedText().color()); } else { painter->setPen(palette.text().color()); } } } /*else if (act) { painter->setPen(palette.mid().color()); }*/ painter->drawText(option->rect, alignment, somi->text); break; } case CE_MenuItem: if (const QStyleOptionMenuItem *menuitem = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) { QGuiApplication *app = static_cast<QGuiApplication*>(QGuiApplication::instance()); qreal checkcol = 25 / app->devicePixelRatio(); qreal gutterWidth = 3 / app->devicePixelRatio(); QRect rect = option->rect; //draw vertical menu line if (option->direction == Qt::LeftToRight) checkcol += rect.x(); int x, y, w, h; menuitem->rect.getRect(&x, &y, &w, &h); int tab = menuitem->tabWidth; bool dis = !(menuitem->state & State_Enabled); bool checked = menuitem->checkType != QStyleOptionMenuItem::NotCheckable ? menuitem->checked : false; bool act = menuitem->state & State_Selected; QPalette palette = QApplication::palette(); if (menuitem->menuItemType == QStyleOptionMenuItem::Separator) { int yoff = y - 1 + h / 2; qreal separatorSize = 6 / app->devicePixelRatio(); QPoint p1 = QPoint(x + checkcol, yoff); QPoint p2 = QPoint(x + w + separatorSize, yoff); painter->save(); painter->fillRect(menuitem->rect, palette.window()); painter->setPen(palette.mid().color()); painter->drawLine(p1, p2); painter->restore(); return; } QString s = menuitem->text; QBrush fill; if (act) { fill = palette.highlight().color().lighter(); } else { fill = palette.window(); } painter->fillRect(menuitem->rect, fill); QRect vCheckRect = visualRect(option->direction, menuitem->rect, QRect(menuitem->rect.x(), menuitem->rect.y(), checkcol - (gutterWidth + menuitem->rect.x()), menuitem->rect.height())); if (checked) { QStyleOptionMenuItem newMi = *menuitem; int windowsItemFrame = 2; newMi.rect = visualRect(option->direction, menuitem->rect, QRect(menuitem->rect.x() + windowsItemFrame, menuitem->rect.y() + windowsItemFrame, checkcol - 2 * windowsItemFrame, menuitem->rect.height() - 2 * windowsItemFrame) ); painter->setRenderHint(QPainter::Antialiasing, true); proxy()->drawPrimitive(PE_IndicatorMenuCheckMark, &newMi, painter, widget); painter->setRenderHint(QPainter::Antialiasing, false); } if (!menuitem->icon.isNull()) { QIcon::Mode mode = dis ? QIcon::Disabled : QIcon::Normal; if (act && !dis) { mode = QIcon::Active; } QPixmap pixmap; if (checked) { pixmap = menuitem->icon.pixmap(proxy()->pixelMetric(PM_SmallIconSize, option, widget), mode, QIcon::On); } else { pixmap = menuitem->icon.pixmap(proxy()->pixelMetric(PM_SmallIconSize, option, widget), mode); } const int pixw = pixmap.width() / pixmap.devicePixelRatio(); const int pixh = pixmap.height() / pixmap.devicePixelRatio(); QRect pmr(0, 0, pixw, pixh); pmr.moveCenter(vCheckRect.center()); painter->setPen(palette.text().color()); painter->drawPixmap(pmr.topLeft(), pixmap); } //painter->setPen(palette.buttonText().color()); QColor textColor = palette.text().color(); if (dis) { textColor = palette.mid().color(); painter->setPen(textColor); } else if (act && SettingsPrivate::instance()->isCustomTextColorOverriden()) { textColor = palette.highlightedText().color(); painter->setPen(textColor); } int xm = checkcol + 2 + (gutterWidth - menuitem->rect.x()) - 1; int xpos = menuitem->rect.x() + xm; /// int windowsItemVMargin = 3, windowsRightBorder = 3; QRect textRect(xpos, y + windowsItemVMargin, w - xm - windowsRightBorder - tab + 1, h - 2 * windowsItemVMargin); QRect vTextRect = visualRect(option->direction, menuitem->rect, textRect); if (!s.isEmpty()) { // draw text painter->save(); int t = s.indexOf(QLatin1Char('\t')); int text_flags = Qt::AlignVCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine; if (!proxy()->styleHint(SH_UnderlineShortcut, menuitem, widget)) { text_flags |= Qt::TextHideMnemonic; } text_flags |= Qt::AlignLeft; if (t >= 0) { QRect vShortcutRect = visualRect(option->direction, menuitem->rect, QRect(textRect.topRight(), QPoint(menuitem->rect.right(), textRect.bottom()))); painter->drawText(vShortcutRect, text_flags, s.mid(t + 1)); s = s.left(t); } QFont font = menuitem->font; if (menuitem->menuItemType == QStyleOptionMenuItem::DefaultItem) { font.setBold(true); } painter->setFont(font); painter->setPen(textColor); painter->drawText(vTextRect, text_flags, s.left(t)); painter->restore(); } if (menuitem->menuItemType == QStyleOptionMenuItem::SubMenu) {// draw sub menu arrow int dim = (h - 2 * 5) / 2; PrimitiveElement arrow; arrow = (option->direction == Qt::RightToLeft) ? PE_IndicatorArrowLeft : PE_IndicatorArrowRight; xpos = x + w - 2 - 2 - dim; QRect vSubMenuRect = visualRect(option->direction, menuitem->rect, QRect(xpos, y + h / 2 - dim / 2, dim, dim)); QStyleOptionMenuItem newMI = *menuitem; newMI.rect = vSubMenuRect; newMI.state = dis ? State_None : State_Enabled; proxy()->drawPrimitive(arrow, &newMI, painter, widget); } } break; case CE_MenuBarEmptyArea:{ painter->fillRect(option->rect, QApplication::palette().window()); break; } default: QProxyStyle::drawControl(element, option, painter, widget); } }