Index: src/kmessagewidget.cpp =================================================================== --- src/kmessagewidget.cpp +++ src/kmessagewidget.cpp @@ -53,6 +53,7 @@ QPixmap contentSnapShot; void createLayout(); + void updateColors(); void updateSnapShot(); void updateLayout(); void slotTimeLineChanged(qreal); @@ -162,6 +163,74 @@ q->updateGeometry(); } +static QColor darkShade(QColor c) +{ + qreal contrast = 0.7; // taken from kcolorscheme for the dark shade + + qreal darkAmount; + if (c.lightnessF() < 0.006) { /* too dark */ + darkAmount = 0.02 + 0.40 * contrast; + } else if (c.lightnessF() > 0.93) { /* too bright */ + darkAmount = -0.06 - 0.60 * contrast; + } else { + darkAmount = (-c.lightnessF()) * (0.55 + contrast * 0.35); + } + + qreal v = c.lightnessF() + darkAmount; + v = v > 0.0 ? (v < 1.0 ? v : 1.0) : 0.0; + c.setHsvF(c.hslHueF(), c.hslSaturationF(), v); + return c; +} + +void KMessageWidgetPrivate::updateColors() +{ + QColor bg0, bg1, bg2, border, fg; + switch (messageType) { + case KMessageWidget::Positive: + bg1.setRgb(39, 174, 96); // values taken from kcolorscheme.cpp (Positive) + fg.setRgb(239, 240, 241); + break; + case KMessageWidget::Information: + bg1 = q->palette().highlight().color(); + fg = q->palette().highlightedText().color(); + break; + case KMessageWidget::Warning: + bg1.setRgb(246, 116, 0); // values taken from kcolorscheme.cpp (Neutral) + fg.setRgb(239, 240, 241); + break; + case KMessageWidget::Error: + bg1.setRgb(218, 68, 83); // values taken from kcolorscheme.cpp (Negative) + fg.setRgb(239, 240, 241); + break; + } + + // Colors + bg0 = bg1.lighter(110); + bg2 = bg1.darker(110); + border = darkShade(bg1); + + content->setStyleSheet( + QString::fromLatin1(".QFrame {" + "background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1," + " stop: 0 %1," + " stop: 0.1 %2," + " stop: 1.0 %3);" + "border-radius: 5px;" + "border: 1px solid %4;" + "margin: %5px;" + "}" + ".QLabel { color: %6; }" + ) + .arg(bg0.name()) + .arg(bg1.name()) + .arg(bg2.name()) + .arg(border.name()) + // DefaultFrameWidth returns the size of the external margin + border width. We know our border is 1px, so we subtract this from the frame normal QStyle FrameWidth to get our margin + .arg(q->style()->pixelMetric(QStyle::PM_DefaultFrameWidth, 0, q) - 1) + .arg(fg.name()) + ); +} + void KMessageWidgetPrivate::updateLayout() { if (content->layout()) { @@ -252,73 +321,10 @@ return d->messageType; } -static QColor darkShade(QColor c) -{ - qreal contrast = 0.7; // taken from kcolorscheme for the dark shade - - qreal darkAmount; - if (c.lightnessF() < 0.006) { /* too dark */ - darkAmount = 0.02 + 0.40 * contrast; - } else if (c.lightnessF() > 0.93) { /* too bright */ - darkAmount = -0.06 - 0.60 * contrast; - } else { - darkAmount = (-c.lightnessF()) * (0.55 + contrast * 0.35); - } - - qreal v = c.lightnessF() + darkAmount; - v = v > 0.0 ? (v < 1.0 ? v : 1.0) : 0.0; - c.setHsvF(c.hslHueF(), c.hslSaturationF(), v); - return c; -} - void KMessageWidget::setMessageType(KMessageWidget::MessageType type) { d->messageType = type; - QColor bg0, bg1, bg2, border, fg; - switch (type) { - case Positive: - bg1.setRgb(39, 174, 96); // values taken from kcolorscheme.cpp (Positive) - fg.setRgb(239, 240, 241); - break; - case Information: - bg1 = palette().highlight().color(); - fg = palette().highlightedText().color(); - break; - case Warning: - bg1.setRgb(246, 116, 0); // values taken from kcolorscheme.cpp (Neutral) - fg.setRgb(239, 240, 241); - break; - case Error: - bg1.setRgb(218, 68, 83); // values taken from kcolorscheme.cpp (Negative) - fg.setRgb(239, 240, 241); - break; - } - - // Colors - bg0 = bg1.lighter(110); - bg2 = bg1.darker(110); - border = darkShade(bg1); - - d->content->setStyleSheet( - QString::fromLatin1(".QFrame {" - "background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1," - " stop: 0 %1," - " stop: 0.1 %2," - " stop: 1.0 %3);" - "border-radius: 5px;" - "border: 1px solid %4;" - "margin: %5px;" - "}" - ".QLabel { color: %6; }" - ) - .arg(bg0.name()) - .arg(bg1.name()) - .arg(bg2.name()) - .arg(border.name()) - // DefaultFrameWidth returns the size of the external margin + border width. We know our border is 1px, so we subtract this from the frame normal QStyle FrameWidth to get our margin - .arg(style()->pixelMetric(QStyle::PM_DefaultFrameWidth, 0, this) - 1) - .arg(fg.name()) - ); + d->updateColors(); } QSize KMessageWidget::sizeHint() const Index: tests/kmessagewidgettest.cpp =================================================================== --- tests/kmessagewidgettest.cpp +++ tests/kmessagewidgettest.cpp @@ -53,6 +53,7 @@ QVBoxLayout *l = new QVBoxLayout(mainWindow); KMessageWidget *mw = new KMessageWidget(mainWindow); + mw->setMessageType(KMessageWidget::Positive); mw->setWordWrap(true); mw->setText( QStringLiteral("Test KMessageWidget is properly sized when word-wrap is enabled by default.") @@ -64,6 +65,15 @@ mw2->setIcon(QIcon::fromTheme(QStringLiteral("kde"))); mw2->addAction(new QAction(QStringLiteral("Foo"), mw2)); mw2->addAction(new QAction(QStringLiteral("Bar"), mw2)); + KMessageWidget *mw3 = new KMessageWidget(mainWindow); + mw3->setMessageType(KMessageWidget::Warning); + mw3->setWordWrap(true); + mw3->setText(QStringLiteral("A KMessageWidget of Warning type.")); + KMessageWidget *mw4 = new KMessageWidget(mainWindow); + mw4->setMessageType(KMessageWidget::Error); + mw4->setWordWrap(true); + mw4->setText(QStringLiteral("A KMessageWidget of Error type.")); + // A frame to materialize the end of the KMessageWidget QFrame *frame = new QFrame(mainWindow); frame->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); @@ -73,16 +83,22 @@ wordWrapCb->setChecked(true); QObject::connect(wordWrapCb, &QAbstractButton::toggled, mw, &KMessageWidget::setWordWrap); QObject::connect(wordWrapCb, &QAbstractButton::toggled, mw2, &KMessageWidget::setWordWrap); + QObject::connect(wordWrapCb, &QAbstractButton::toggled, mw3, &KMessageWidget::setWordWrap); + QObject::connect(wordWrapCb, &QAbstractButton::toggled, mw4, &KMessageWidget::setWordWrap); QCheckBox *closeButtonCb = new QCheckBox(QStringLiteral("closeButton"), mainWindow); closeButtonCb->setChecked(true); QObject::connect(closeButtonCb, &QAbstractButton::toggled, mw, &KMessageWidget::setCloseButtonVisible); QObject::connect(closeButtonCb, &QAbstractButton::toggled, mw2, &KMessageWidget::setCloseButtonVisible); + QObject::connect(closeButtonCb, &QAbstractButton::toggled, mw3, &KMessageWidget::setCloseButtonVisible); + QObject::connect(closeButtonCb, &QAbstractButton::toggled, mw4, &KMessageWidget::setCloseButtonVisible); l->addWidget(wordWrapCb); l->addWidget(closeButtonCb); l->addWidget(mw); l->addWidget(mw2); + l->addWidget(mw3); + l->addWidget(mw4); l->addWidget(frame); mainWindow->resize(400, 300);