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);
509QRect QStyle::itemTextRect(
const QFontMetrics &metrics,
const QRect &rect,
int alignment,
bool enabled,
510 const QString &text)
const
514 rect.getRect(&x, &y, &w, &h);
515 if (!text.isEmpty()) {
516 result = metrics.boundingRect(x, y, w, h, alignment, text);
517 if (!enabled && proxy()->styleHint(SH_EtchDisabledText)) {
518 result.setWidth(result.width()+1);
519 result.setHeight(result.height()+1);
522 result = QRect(x, y, w, h);
533QRect QStyle::itemPixmapRect(
const QRect &rect,
int alignment,
const QPixmap &pixmap)
const
537 rect.getRect(&x, &y, &w, &h);
539 QSizeF pixmapSize = pixmap.deviceIndependentSize();
540 const int pixmapWidth = pixmapSize.width();
541 const int pixmapHeight = pixmapSize.height();
543 if ((alignment & Qt::AlignVCenter) == Qt::AlignVCenter)
544 y += h/2 - pixmapHeight/2;
545 else if ((alignment & Qt::AlignBottom) == Qt::AlignBottom)
546 y += h - pixmapHeight;
547 if ((alignment & Qt::AlignRight) == Qt::AlignRight)
548 x += w - pixmapWidth;
549 else if ((alignment & Qt::AlignHCenter) == Qt::AlignHCenter)
550 x += w/2 - pixmapWidth/2;
551 else if ((alignment & Qt::AlignLeft) != Qt::AlignLeft && QGuiApplication::isRightToLeft())
552 x += w - pixmapWidth;
553 result = QRect(x, y, pixmapWidth, pixmapHeight);
573void QStyle::drawItemText(QPainter *painter,
const QRect &rect,
int alignment,
const QPalette &pal,
574 bool enabled,
const QString& text, QPalette::ColorRole textRole)
const
579 if (textRole != QPalette::NoRole) {
580 savedPen = painter->pen();
581 painter->setPen(QPen(pal.brush(textRole), savedPen.widthF()));
584 if (proxy()->styleHint(SH_DitherDisabledText)) {
586 painter->drawText(rect, alignment, text, &br);
587 painter->fillRect(br, QBrush(painter->background().color(), Qt::Dense5Pattern));
589 }
else if (proxy()->styleHint(SH_EtchDisabledText)) {
590 QPen pen = painter->pen();
591 painter->setPen(pal.light().color());
592 painter->drawText(rect.adjusted(1, 1, 1, 1), alignment, text);
593 painter->setPen(pen);
596 painter->drawText(rect, alignment, text);
597 if (textRole != QPalette::NoRole)
598 painter->setPen(savedPen);
611void QStyle::drawItemPixmap(QPainter *painter,
const QRect &rect,
int alignment,
612 const QPixmap &pixmap)
const
614 qreal scale = pixmap.devicePixelRatio();
615 QRect aligned = alignedRect(QGuiApplication::layoutDirection(), QFlag(alignment), pixmap.size() / scale, rect);
616 QRect inter = aligned.intersected(rect);
621 const QRect source(qRound((inter.x() - aligned.x()) * scale),
622 qRound((inter.y() - aligned.y()) * scale),
623 qRound(inter.width() * scale),
624 qRound(inter.height() * scale));
626 painter->drawPixmap(inter.topLeft(), pixmap, source);
2161QRect QStyle::visualRect(Qt::LayoutDirection direction,
const QRect &boundingRect,
const QRect &logicalRect)
2163 if (direction == Qt::LeftToRight)
2165 QRect rect = logicalRect;
2166 rect.translate(2 * (boundingRect.right() - logicalRect.right()) +
2167 logicalRect.width() - boundingRect.width(), 0);
2191QRect QStyle::alignedRect(Qt::LayoutDirection direction, Qt::Alignment alignment,
const QSize &size,
const QRect &rectangle)
2193 alignment = visualAlignment(direction, alignment);
2194 int x = rectangle.x();
2195 int y = rectangle.y();
2196 int w = size.width();
2197 int h = size.height();
2198 if ((alignment & Qt::AlignVCenter) == Qt::AlignVCenter)
2199 y += rectangle.size().height()/2 - h/2;
2200 else if ((alignment & Qt::AlignBottom) == Qt::AlignBottom)
2201 y += rectangle.size().height() - h;
2202 if ((alignment & Qt::AlignRight) == Qt::AlignRight)
2203 x += rectangle.size().width() - w;
2204 else if ((alignment & Qt::AlignHCenter) == Qt::AlignHCenter)
2205 x += rectangle.size().width()/2 - w/2;
2206 return QRect(x, y, w, h);
2240int QStyle::sliderPositionFromValue(
int min,
int max,
int logicalValue,
int span,
bool upsideDown)
2242 if (span <= 0 || max <= min)
2244 if (logicalValue < min)
2245 return upsideDown ? span : 0;
2246 if (logicalValue > max)
2247 return upsideDown ? 0 : span;
2249 const uint range = qint64(max) - min;
2250 const uint p = upsideDown ? qint64(max) - logicalValue : qint64(logicalValue) - min;
2252 if (range > (uint)INT_MAX/4096) {
2253 double dpos = (
double(p))/(
double(range)/span);
2255 }
else if (q20::cmp_greater(range, span)) {
2256 return (2 * p * span + range) / (2*range);
2258 uint div = span / range;
2259 uint mod = span % range;
2260 return p * div + (2 * p * mod + range) / (2 * range);
2285int QStyle::sliderValueFromPosition(
int min,
int max,
int pos,
int span,
bool upsideDown)
2287 if (span <= 0 || pos <= 0)
2288 return upsideDown ? max : min;
2290 return upsideDown ? min : max;
2292 const qint64 range = qint64(max) - min;
2294 if (q20::cmp_greater(span, range)) {
2295 const int tmp = (2 * range * pos + span) / (qint64(2) * span);
2296 return upsideDown ? max - tmp : tmp + min;
2298 const qint64 div = range / span;
2299 const qint64 mod = range % span;
2300 const int tmp = pos * div + (2 * mod * pos + span) / (qint64(2) * span);
2301 return upsideDown ? max - tmp : tmp + min;
2319QPalette QStyle::standardPalette()
const
2321 QColor background = QColor(0xd4, 0xd0, 0xc8);
2323 QColor light(background.lighter());
2324 QColor dark(background.darker());
2325 QColor mid(Qt::gray);
2326 QPalette palette(Qt::black, background, light, dark, mid, Qt::black, Qt::white);
2327 palette.setBrush(QPalette::Disabled, QPalette::WindowText, dark);
2328 palette.setBrush(QPalette::Disabled, QPalette::Text, dark);
2329 palette.setBrush(QPalette::Disabled, QPalette::ButtonText, dark);
2330 palette.setBrush(QPalette::Disabled, QPalette::Base, background);
2389int QStyle::combinedLayoutSpacing(QSizePolicy::ControlTypes controls1,
2390 QSizePolicy::ControlTypes controls2, Qt::Orientation orientation,
2391 QStyleOption *option, QWidget *widget)
const
2393 QSizePolicy::ControlType array1[MaxBits];
2394 QSizePolicy::ControlType array2[MaxBits];
2395 int count1 = unpackControlTypes(controls1, array1);
2396 int count2 = unpackControlTypes(controls2, array2);
2399 for (
int i = 0; i < count1; ++i) {
2400 for (
int j = 0; j < count2; ++j) {
2401 int spacing = layoutSpacing(array1[i], array2[j], orientation, option, widget);
2402 result = qMax(spacing, result);
2447QCachedPainter::QCachedPainter(QPainter *painter,
const QString &cachePrefix,
2448 const QStyleOption *option, QSize size, QRect paintRect)
2449 : m_painter(painter)
2451 , m_paintRect(paintRect)
2453 const auto sz = size.isEmpty() ? option->rect.size() : size;
2454 const qreal dpr = QStyleHelper::getDpr(painter);
2455 m_pixmapName = QStyleHelper::uniqueName(cachePrefix, option, sz, dpr);
2456 m_alreadyCached = QPixmapCache::find(m_pixmapName, &m_pixmap);
2457 if (!m_alreadyCached) {
2458 m_pixmap = styleCachePixmap(sz, dpr);
2459 m_pixmapPainter = std::make_unique<QPainter>(&m_pixmap);
2460 m_pixmapPainter->setRenderHints(painter->renderHints());
2461 s_pixmapCacheKeys += m_pixmapName;