void Clock::paintInterface(QPainter *p, const QStyleOptionGraphicsItem *option, const QRect &contentsRect) { Q_UNUSED(option); if (!m_time.isValid() || !m_date.isValid()) { return; } p->setPen(QPen(m_plainClockColor)); p->setRenderHint(QPainter::SmoothPixmapTransform); p->setRenderHint(QPainter::Antialiasing); /* ... helps debugging contentsRect and sizing ... QColor c = QColor(Qt::blue); c.setAlphaF(.5); p->setBrush(c); p->drawRect(contentsRect); */ // Paint the date, conditionally, and let us know afterwards how much // space is left for painting the time on top of it. QRectF dateRect; const QString timeString = KGlobal::locale()->formatTime(m_time, m_showSeconds); const QString fakeTimeString = KGlobal::locale()->formatTime(QTime(23,59,59), m_showSeconds); QFont smallFont = KGlobalSettings::smallestReadableFont(); //create the string for the date and/or the timezone if (m_dateStyle || showTimezone()) { QString dateString; //Create the localized date string if needed if (m_dateStyle) { // JPL This needs a complete rewrite for l10n issues QString day = KGlobal::locale()->calendar()->formatDate(m_date, KLocale::Day, KLocale::ShortNumber); QString month = KGlobal::locale()->calendar()->formatDate(m_date, KLocale::Month, KLocale::LongNumber); if (m_dateStyle == 1) { //compact date dateString = i18nc("@label Compact date: " "%1 day in the month, %2 month number", "%1/%2", day, month); } else if (m_dateStyle == 2) { //short date dateString = KGlobal::locale()->formatDate(m_date, KLocale::ShortDate); } else if (m_dateStyle == 3) { //long date dateString = KGlobal::locale()->formatDate(m_date, KLocale::LongDate); } else if (m_dateStyle == 4) { //ISO date dateString = KGlobal::locale()->formatDate(m_date, KLocale::IsoDate); } else { //shouldn't happen dateString = KGlobal::locale()->formatDate(m_date, KLocale::ShortDate); } if (showTimezone()) { QString currentTimezone = prettyTimezone(); dateString = i18nc("@label Date with currentTimezone: " "%1 day of the week with date, %2 currentTimezone", "%1 %2", dateString, currentTimezone); } } else if (showTimezone()) { dateString = prettyTimezone(); } dateString = dateString.trimmed(); if (m_dateString != dateString) { // If this string has changed (for example due to changes in the config // we have to reset the sizing of the applet m_dateString = dateString; updateSize(); } // Check sizes // magic 10 is for very big spaces, // where there's enough space to grow without harming time space QFontMetrics fm(smallFont); if (contentsRect.height() > contentsRect.width() * 2) { //kDebug() << Plasma::Vertical << contentsRect.height() <<contentsRect.width() * 2; QRect dateRect = contentsRect; dateRect.setHeight(dateRect.width()); smallFont.setPixelSize(qMax(dateRect.height() / 2, fm.ascent())); m_dateRect = preparePainter(p, dateRect, smallFont, dateString); } else { // Find a suitable size for the date font if (formFactor() == Plasma::Vertical) { smallFont.setPixelSize(qMax(contentsRect.height()/6, fm.ascent())); } else if (formFactor() == Plasma::Horizontal) { smallFont.setPixelSize(qMax(qMin(contentsRect.height(), contentsRect.width())*2/7, fm.ascent())); //we want to write the date always on one line fm = QFontMetrics(smallFont); const int tempWidth = fm.width(dateString); if(tempWidth > contentsRect.width()){ smallFont.setPixelSize((contentsRect.width() * smallFont.pixelSize())/tempWidth); } } else { smallFont.setPixelSize(qMax(qMin(contentsRect.height(), contentsRect.width())/8, KGlobalSettings::smallestReadableFont().pointSize())); } m_dateRect = preparePainter(p, contentsRect, smallFont, dateString); } // kDebug(96669) << "m_dateRect: " << m_dateRect; const int subtitleHeight = m_dateRect.height(); const int subtitleWidth = m_dateRect.width(); // kDebug(96669) << "subtitleWitdh: " << subtitleWitdh; // kDebug(96669) << "subtitleHeight: " << subtitleHeight; if (m_dateTimezoneBesides) { //kDebug(96669) << contentsRect.height() << subtitleHeight << smallFont.pixelSize(); if (contentsRect.height() - subtitleHeight >= smallFont.pixelSize() || formFactor() != Plasma::Horizontal) { // to small to display the time on top of the date/timezone // put them side by side // kDebug(96669) << "switching to normal"; m_dateTimezoneBesides = false; dateRect = normalLayout(subtitleWidth, subtitleHeight, contentsRect); } else { dateRect = sideBySideLayout(subtitleWidth, subtitleHeight, contentsRect); } } else { /* kDebug(96669) << "checking timezone placement" << contentsRect.height() << dateRect.height() << subtitleHeight << smallFont.pixelSize() << smallFont.pointSize();*/ if (contentsRect.height() - subtitleHeight < smallFont.pixelSize() && formFactor() == Plasma::Horizontal) { // to small to display the time on top of the date/timezone // put them side by side // kDebug(96669) << "switching to s-b-s"; m_dateTimezoneBesides = true; dateRect = sideBySideLayout(subtitleWidth, subtitleHeight, contentsRect); } else { dateRect = normalLayout(subtitleWidth, subtitleHeight, contentsRect); } } } else { m_timeRect = contentsRect; } // kDebug(96669) << "timeRect: " << m_timeRect; // p->fillRect(timeRect, QBrush(QColor("red"))); // kDebug(96669) << m_time; // Choose a relatively big font size to start with m_plainClockFont.setPointSizeF(qMax(m_timeRect.height(), KGlobalSettings::smallestReadableFont().pointSize())); preparePainter(p, m_timeRect, m_plainClockFont, fakeTimeString, true); if (!m_dateString.isEmpty()) { if (m_dateTimezoneBesides) { QFontMetrics fm(m_plainClockFont); //kDebug() << dateRect << m_timeRect << fm.boundingRect(m_timeRect, Qt::AlignCenter, timeString); QRect br = fm.boundingRect(m_timeRect, Qt::AlignCenter, timeString); QFontMetrics smallfm(smallFont); dateRect.moveLeft(br.right() + qMin(0, br.left()) + smallfm.width(" ")); } // When we're relatively low, force everything into a single line QFont f = p->font(); p->setFont(smallFont); QPen datePen = p->pen(); QColor dateColor = m_plainClockColor; dateColor.setAlphaF(0.7); datePen.setColor(dateColor); p->setPen(datePen); if (formFactor() == Plasma::Horizontal && (contentsRect.height() < smallFont.pointSize()*6)) { p->drawText(dateRect, Qt::TextSingleLine | Qt::AlignHCenter, m_dateString); } else { p->drawText(dateRect, Qt::TextWordWrap | Qt::AlignHCenter, m_dateString); } p->setFont(f); } if (m_useCustomColor || !m_svgExistsInTheme) { QFontMetrics fm(p->font()); QPointF timeTextOrigin(QPointF(qMax(0, (m_timeRect.center().x() - fm.width(fakeTimeString) / 2)), (m_timeRect.center().y() + fm.height() / 3))); p->translate(-0.5, -0.5); if (m_drawShadow) { QPen tmpPen = p->pen(); // Paint a backdrop behind the time's text qreal shadowOffset = 1.0; QPen shadowPen; QColor shadowColor = m_plainClockShadowColor; shadowColor.setAlphaF(.4); shadowPen.setColor(shadowColor); p->setPen(shadowPen); QPointF shadowTimeTextOrigin = QPointF(timeTextOrigin.x() + shadowOffset, timeTextOrigin.y() + shadowOffset); p->drawText(shadowTimeTextOrigin, timeString); p->setPen(tmpPen); // Paint the time itself with a linear translucency gradient QLinearGradient gradient = QLinearGradient(QPointF(0, 0), QPointF(0, fm.height())); QColor startColor = m_plainClockColor; startColor.setAlphaF(.95); QColor stopColor = m_plainClockColor; stopColor.setAlphaF(.7); gradient.setColorAt(0.0, startColor); gradient.setColorAt(0.5, stopColor); gradient.setColorAt(1.0, startColor); QBrush gradientBrush(gradient); QPen gradientPen(gradientBrush, tmpPen.width()); p->setPen(gradientPen); } p->drawText(timeTextOrigin, timeString); //when use the custom theme colors, draw the time textured } else { QRect adjustedTimeRect = m_pixmap.rect(); adjustedTimeRect.moveCenter(m_timeRect.center()); p->drawPixmap(adjustedTimeRect, m_pixmap); } }
void DateTimeGroup::paintInterface(QPainter *p, const QStyleOptionGraphicsItem *option, const QRect &contentsRect) { Q_UNUSED(option); if (dtg.isEmpty()) { return; } p->setPen(QPen(m_plainDateTimeGroupColor)); p->setRenderHint(QPainter::SmoothPixmapTransform); p->setRenderHint(QPainter::Antialiasing); QFont smallFont = KGlobalSettings::smallestReadableFont(); dtgRect = contentsRect; m_plainDateTimeGroupFont.setPointSizeF(qMax(dtgRect.height(), KGlobalSettings::smallestReadableFont().pointSize())); preparePainter(p, dtgRect, m_plainDateTimeGroupFont, dtg, true); if (m_useCustomColor || !m_svgExistsInTheme) { QFontMetrics fm(p->font()); QPointF timeTextOrigin(QPointF(qMax(0, (dtgRect.center().x() - fm.width(dtg) / 2)), (dtgRect.center().y() + fm.height() / 3))); p->translate(-0.5, -0.5); if (m_drawShadow) { QPen tmpPen = p->pen(); qreal shadowOffset = 1.0; QPen shadowPen; QColor shadowColor = m_plainDateTimeGroupShadowColor; shadowColor.setAlphaF(.4); shadowPen.setColor(shadowColor); p->setPen(shadowPen); QPointF shadowTimeTextOrigin = QPointF(timeTextOrigin.x() + shadowOffset, timeTextOrigin.y() + shadowOffset); p->drawText(shadowTimeTextOrigin, dtg); p->setPen(tmpPen); QLinearGradient gradient = QLinearGradient(QPointF(0, 0), QPointF(0, fm.height())); QColor startColor = m_plainDateTimeGroupColor; startColor.setAlphaF(.95); QColor stopColor = m_plainDateTimeGroupColor; stopColor.setAlphaF(.7); gradient.setColorAt(0.0, startColor); gradient.setColorAt(0.5, stopColor); gradient.setColorAt(1.0, startColor); QBrush gradientBrush(gradient); QPen gradientPen(gradientBrush, tmpPen.width()); p->setPen(gradientPen); } p->drawText(timeTextOrigin, dtg); } else { QRect adjustedTimeRect = m_pixmap.rect(); adjustedTimeRect.moveCenter(dtgRect.center()); p->drawPixmap(adjustedTimeRect, m_pixmap); } }