29static int unpackControlTypes(QSizePolicy::ControlTypes controls, QSizePolicy::ControlType *array)
35 if (qPopulationCount(uint(controls)) == 1) {
36 array[0] = QSizePolicy::ControlType(uint(controls));
41 for (
int i = 0; i <
MaxBits; ++i) {
42 if (uint bit = (controls & (0x1 << i)))
43 array[count++] = QSizePolicy::ControlType(bit);
546QRect QStyle::itemTextRect(
const QFontMetrics &metrics,
const QRect &rect,
int alignment,
bool enabled,
547 const QString &text)
const
551 rect.getRect(&x, &y, &w, &h);
552 if (!text.isEmpty()) {
553 result = metrics.boundingRect(x, y, w, h, alignment, text);
554 if (!enabled && proxy()->styleHint(SH_EtchDisabledText)) {
555 result.setWidth(result.width()+1);
556 result.setHeight(result.height()+1);
559 result = QRect(x, y, w, h);
570QRect QStyle::itemPixmapRect(
const QRect &rect,
int alignment,
const QPixmap &pixmap)
const
574 rect.getRect(&x, &y, &w, &h);
576 QSizeF pixmapSize = pixmap.deviceIndependentSize();
577 const int pixmapWidth = pixmapSize.width();
578 const int pixmapHeight = pixmapSize.height();
580 if ((alignment & Qt::AlignVCenter) == Qt::AlignVCenter)
581 y += h/2 - pixmapHeight/2;
582 else if ((alignment & Qt::AlignBottom) == Qt::AlignBottom)
583 y += h - pixmapHeight;
584 if ((alignment & Qt::AlignRight) == Qt::AlignRight)
585 x += w - pixmapWidth;
586 else if ((alignment & Qt::AlignHCenter) == Qt::AlignHCenter)
587 x += w/2 - pixmapWidth/2;
588 else if ((alignment & Qt::AlignLeft) != Qt::AlignLeft && QGuiApplication::isRightToLeft())
589 x += w - pixmapWidth;
590 result = QRect(x, y, pixmapWidth, pixmapHeight);
610void QStyle::drawItemText(QPainter *painter,
const QRect &rect,
int alignment,
const QPalette &pal,
611 bool enabled,
const QString& text, QPalette::ColorRole textRole)
const
616 if (textRole != QPalette::NoRole) {
617 savedPen = painter->pen();
618 painter->setPen(QPen(pal.brush(textRole), savedPen.widthF()));
621 if (proxy()->styleHint(SH_DitherDisabledText)) {
623 painter->drawText(rect, alignment, text, &br);
624 painter->fillRect(br, QBrush(painter->background().color(), Qt::Dense5Pattern));
626 }
else if (proxy()->styleHint(SH_EtchDisabledText)) {
627 QPen pen = painter->pen();
628 painter->setPen(pal.light().color());
629 painter->drawText(rect.adjusted(1, 1, 1, 1), alignment, text);
630 painter->setPen(pen);
633 painter->drawText(rect, alignment, text);
634 if (textRole != QPalette::NoRole)
635 painter->setPen(savedPen);
648void QStyle::drawItemPixmap(QPainter *painter,
const QRect &rect,
int alignment,
649 const QPixmap &pixmap)
const
651 qreal scale = pixmap.devicePixelRatio();
652 QRect aligned = alignedRect(QGuiApplication::layoutDirection(), QFlag(alignment), pixmap.size() / scale, rect);
653 QRect inter = aligned.intersected(rect);
658 const QRect source(qRound((inter.x() - aligned.x()) * scale),
659 qRound((inter.y() - aligned.y()) * scale),
660 qRound(inter.width() * scale),
661 qRound(inter.height() * scale));
663 painter->drawPixmap(inter.topLeft(), pixmap, source);
2198QRect QStyle::visualRect(Qt::LayoutDirection direction,
const QRect &boundingRect,
const QRect &logicalRect)
2200 if (direction == Qt::LeftToRight)
2202 QRect rect = logicalRect;
2203 rect.translate(2 * (boundingRect.right() - logicalRect.right()) +
2204 logicalRect.width() - boundingRect.width(), 0);
2228QRect QStyle::alignedRect(Qt::LayoutDirection direction, Qt::Alignment alignment,
const QSize &size,
const QRect &rectangle)
2230 alignment = visualAlignment(direction, alignment);
2231 int x = rectangle.x();
2232 int y = rectangle.y();
2233 int w = size.width();
2234 int h = size.height();
2235 if ((alignment & Qt::AlignVCenter) == Qt::AlignVCenter)
2236 y += rectangle.size().height()/2 - h/2;
2237 else if ((alignment & Qt::AlignBottom) == Qt::AlignBottom)
2238 y += rectangle.size().height() - h;
2239 if ((alignment & Qt::AlignRight) == Qt::AlignRight)
2240 x += rectangle.size().width() - w;
2241 else if ((alignment & Qt::AlignHCenter) == Qt::AlignHCenter)
2242 x += rectangle.size().width()/2 - w/2;
2243 return QRect(x, y, w, h);
2277int QStyle::sliderPositionFromValue(
int min,
int max,
int logicalValue,
int span,
bool upsideDown)
2279 if (span <= 0 || max <= min)
2281 if (logicalValue < min)
2282 return upsideDown ? span : 0;
2283 if (logicalValue > max)
2284 return upsideDown ? 0 : span;
2286 const uint range = qint64(max) - min;
2287 const uint p = upsideDown ? qint64(max) - logicalValue : qint64(logicalValue) - min;
2289 if (range > (uint)INT_MAX/4096) {
2290 double dpos = (
double(p))/(
double(range)/span);
2292 }
else if (q20::cmp_greater(range, span)) {
2293 return (2 * p * span + range) / (2*range);
2295 uint div = span / range;
2296 uint mod = span % range;
2297 return p * div + (2 * p * mod + range) / (2 * range);
2322int QStyle::sliderValueFromPosition(
int min,
int max,
int pos,
int span,
bool upsideDown)
2324 if (span <= 0 || pos <= 0)
2325 return upsideDown ? max : min;
2327 return upsideDown ? min : max;
2329 const qint64 range = qint64(max) - min;
2331 if (q20::cmp_greater(span, range)) {
2332 const int tmp = (2 * range * pos + span) / (qint64(2) * span);
2333 return upsideDown ? max - tmp : tmp + min;
2335 const qint64 div = range / span;
2336 const qint64 mod = range % span;
2337 const int tmp = pos * div + (2 * mod * pos + span) / (qint64(2) * span);
2338 return upsideDown ? max - tmp : tmp + min;
2356QPalette QStyle::standardPalette()
const
2358 QColor background = QColor(0xd4, 0xd0, 0xc8);
2360 QColor light(background.lighter());
2361 QColor dark(background.darker());
2362 QColor mid(Qt::gray);
2363 QPalette palette(Qt::black, background, light, dark, mid, Qt::black, Qt::white);
2364 palette.setBrush(QPalette::Disabled, QPalette::WindowText, dark);
2365 palette.setBrush(QPalette::Disabled, QPalette::Text, dark);
2366 palette.setBrush(QPalette::Disabled, QPalette::ButtonText, dark);
2367 palette.setBrush(QPalette::Disabled, QPalette::Base, background);
2426int QStyle::combinedLayoutSpacing(QSizePolicy::ControlTypes controls1,
2427 QSizePolicy::ControlTypes controls2, Qt::Orientation orientation,
2428 QStyleOption *option, QWidget *widget)
const
2430 QSizePolicy::ControlType array1[MaxBits];
2431 QSizePolicy::ControlType array2[MaxBits];
2432 int count1 = unpackControlTypes(controls1, array1);
2433 int count2 = unpackControlTypes(controls2, array2);
2436 for (
int i = 0; i < count1; ++i) {
2437 for (
int j = 0; j < count2; ++j) {
2438 int spacing = layoutSpacing(array1[i], array2[j], orientation, option, widget);
2439 result = qMax(spacing, result);
2484QCachedPainter::QCachedPainter(QPainter *painter,
const QString &cachePrefix,
2485 const QStyleOption *option, QSize size, QRect paintRect)
2486 : m_painter(painter)
2488 , m_paintRect(paintRect)
2490 const auto sz = size.isEmpty() ? option->rect.size() : size;
2491 const qreal dpr = QStyleHelper::getDpr(painter);
2492 m_pixmapName = QStyleHelper::uniqueName(cachePrefix, option, sz, dpr);
2493 m_alreadyCached = QPixmapCache::find(m_pixmapName, &m_pixmap);
2494 if (!m_alreadyCached) {
2495 m_pixmap = styleCachePixmap(sz, dpr);
2496 m_pixmapPainter = std::make_unique<QPainter>(&m_pixmap);
2497 m_pixmapPainter->setRenderHints(painter->renderHints());
2498 s_pixmapCacheKeys += m_pixmapName;