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);
618 painter->drawPixmap(inter.x(), inter.y(), pixmap, inter.x() - aligned.x(), inter.y() - aligned.y(), qRound(inter.width() * scale), qRound(inter.height() *scale));
2154QRect QStyle::visualRect(Qt::LayoutDirection direction,
const QRect &boundingRect,
const QRect &logicalRect)
2156 if (direction == Qt::LeftToRight)
2158 QRect rect = logicalRect;
2159 rect.translate(2 * (boundingRect.right() - logicalRect.right()) +
2160 logicalRect.width() - boundingRect.width(), 0);
2184QRect QStyle::alignedRect(Qt::LayoutDirection direction, Qt::Alignment alignment,
const QSize &size,
const QRect &rectangle)
2186 alignment = visualAlignment(direction, alignment);
2187 int x = rectangle.x();
2188 int y = rectangle.y();
2189 int w = size.width();
2190 int h = size.height();
2191 if ((alignment & Qt::AlignVCenter) == Qt::AlignVCenter)
2192 y += rectangle.size().height()/2 - h/2;
2193 else if ((alignment & Qt::AlignBottom) == Qt::AlignBottom)
2194 y += rectangle.size().height() - h;
2195 if ((alignment & Qt::AlignRight) == Qt::AlignRight)
2196 x += rectangle.size().width() - w;
2197 else if ((alignment & Qt::AlignHCenter) == Qt::AlignHCenter)
2198 x += rectangle.size().width()/2 - w/2;
2199 return QRect(x, y, w, h);
2233int QStyle::sliderPositionFromValue(
int min,
int max,
int logicalValue,
int span,
bool upsideDown)
2235 if (span <= 0 || max <= min)
2237 if (logicalValue < min)
2238 return upsideDown ? span : 0;
2239 if (logicalValue > max)
2240 return upsideDown ? 0 : span;
2242 const uint range = qint64(max) - min;
2243 const uint p = upsideDown ? qint64(max) - logicalValue : qint64(logicalValue) - min;
2245 if (range > (uint)INT_MAX/4096) {
2246 double dpos = (
double(p))/(
double(range)/span);
2248 }
else if (q20::cmp_greater(range, span)) {
2249 return (2 * p * span + range) / (2*range);
2251 uint div = span / range;
2252 uint mod = span % range;
2253 return p * div + (2 * p * mod + range) / (2 * range);
2278int QStyle::sliderValueFromPosition(
int min,
int max,
int pos,
int span,
bool upsideDown)
2280 if (span <= 0 || pos <= 0)
2281 return upsideDown ? max : min;
2283 return upsideDown ? min : max;
2285 const qint64 range = qint64(max) - min;
2287 if (q20::cmp_greater(span, range)) {
2288 const int tmp = (2 * range * pos + span) / (qint64(2) * span);
2289 return upsideDown ? max - tmp : tmp + min;
2291 const qint64 div = range / span;
2292 const qint64 mod = range % span;
2293 const int tmp = pos * div + (2 * mod * pos + span) / (qint64(2) * span);
2294 return upsideDown ? max - tmp : tmp + min;
2312QPalette QStyle::standardPalette()
const
2314 QColor background = QColor(0xd4, 0xd0, 0xc8);
2316 QColor light(background.lighter());
2317 QColor dark(background.darker());
2318 QColor mid(Qt::gray);
2319 QPalette palette(Qt::black, background, light, dark, mid, Qt::black, Qt::white);
2320 palette.setBrush(QPalette::Disabled, QPalette::WindowText, dark);
2321 palette.setBrush(QPalette::Disabled, QPalette::Text, dark);
2322 palette.setBrush(QPalette::Disabled, QPalette::ButtonText, dark);
2323 palette.setBrush(QPalette::Disabled, QPalette::Base, background);
2382int QStyle::combinedLayoutSpacing(QSizePolicy::ControlTypes controls1,
2383 QSizePolicy::ControlTypes controls2, Qt::Orientation orientation,
2384 QStyleOption *option, QWidget *widget)
const
2386 QSizePolicy::ControlType array1[MaxBits];
2387 QSizePolicy::ControlType array2[MaxBits];
2388 int count1 = unpackControlTypes(controls1, array1);
2389 int count2 = unpackControlTypes(controls2, array2);
2392 for (
int i = 0; i < count1; ++i) {
2393 for (
int j = 0; j < count2; ++j) {
2394 int spacing = layoutSpacing(array1[i], array2[j], orientation, option, widget);
2395 result = qMax(spacing, result);
2440QCachedPainter::QCachedPainter(QPainter *painter,
const QString &cachePrefix,
2441 const QStyleOption *option, QSize size, QRect paintRect)
2442 : m_painter(painter)
2444 , m_paintRect(paintRect)
2446 const auto sz = size.isEmpty() ? option->rect.size() : size;
2447 const qreal dpr = QStyleHelper::getDpr(painter);
2448 m_pixmapName = QStyleHelper::uniqueName(cachePrefix, option, sz, dpr);
2449 m_alreadyCached = QPixmapCache::find(m_pixmapName, &m_pixmap);
2450 if (!m_alreadyCached) {
2451 m_pixmap = styleCachePixmap(sz, dpr);
2452 m_pixmapPainter = std::make_unique<QPainter>(&m_pixmap);
2453 m_pixmapPainter->setRenderHints(painter->renderHints());
2454 s_pixmapCacheKeys += m_pixmapName;