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));
2150QRect QStyle::visualRect(Qt::LayoutDirection direction,
const QRect &boundingRect,
const QRect &logicalRect)
2152 if (direction == Qt::LeftToRight)
2154 QRect rect = logicalRect;
2155 rect.translate(2 * (boundingRect.right() - logicalRect.right()) +
2156 logicalRect.width() - boundingRect.width(), 0);
2180QRect QStyle::alignedRect(Qt::LayoutDirection direction, Qt::Alignment alignment,
const QSize &size,
const QRect &rectangle)
2182 alignment = visualAlignment(direction, alignment);
2183 int x = rectangle.x();
2184 int y = rectangle.y();
2185 int w = size.width();
2186 int h = size.height();
2187 if ((alignment & Qt::AlignVCenter) == Qt::AlignVCenter)
2188 y += rectangle.size().height()/2 - h/2;
2189 else if ((alignment & Qt::AlignBottom) == Qt::AlignBottom)
2190 y += rectangle.size().height() - h;
2191 if ((alignment & Qt::AlignRight) == Qt::AlignRight)
2192 x += rectangle.size().width() - w;
2193 else if ((alignment & Qt::AlignHCenter) == Qt::AlignHCenter)
2194 x += rectangle.size().width()/2 - w/2;
2195 return QRect(x, y, w, h);
2229int QStyle::sliderPositionFromValue(
int min,
int max,
int logicalValue,
int span,
bool upsideDown)
2231 if (span <= 0 || max <= min)
2233 if (logicalValue < min)
2234 return upsideDown ? span : 0;
2235 if (logicalValue > max)
2236 return upsideDown ? 0 : span;
2238 const uint range = qint64(max) - min;
2239 const uint p = upsideDown ? qint64(max) - logicalValue : qint64(logicalValue) - min;
2241 if (range > (uint)INT_MAX/4096) {
2242 double dpos = (
double(p))/(
double(range)/span);
2244 }
else if (q20::cmp_greater(range, span)) {
2245 return (2 * p * span + range) / (2*range);
2247 uint div = span / range;
2248 uint mod = span % range;
2249 return p * div + (2 * p * mod + range) / (2 * range);
2274int QStyle::sliderValueFromPosition(
int min,
int max,
int pos,
int span,
bool upsideDown)
2276 if (span <= 0 || pos <= 0)
2277 return upsideDown ? max : min;
2279 return upsideDown ? min : max;
2281 const qint64 range = qint64(max) - min;
2283 if (q20::cmp_greater(span, range)) {
2284 const int tmp = (2 * range * pos + span) / (qint64(2) * span);
2285 return upsideDown ? max - tmp : tmp + min;
2287 const qint64 div = range / span;
2288 const qint64 mod = range % span;
2289 const int tmp = pos * div + (2 * mod * pos + span) / (qint64(2) * span);
2290 return upsideDown ? max - tmp : tmp + min;
2308QPalette QStyle::standardPalette()
const
2310 QColor background = QColor(0xd4, 0xd0, 0xc8);
2312 QColor light(background.lighter());
2313 QColor dark(background.darker());
2314 QColor mid(Qt::gray);
2315 QPalette palette(Qt::black, background, light, dark, mid, Qt::black, Qt::white);
2316 palette.setBrush(QPalette::Disabled, QPalette::WindowText, dark);
2317 palette.setBrush(QPalette::Disabled, QPalette::Text, dark);
2318 palette.setBrush(QPalette::Disabled, QPalette::ButtonText, dark);
2319 palette.setBrush(QPalette::Disabled, QPalette::Base, background);
2378int QStyle::combinedLayoutSpacing(QSizePolicy::ControlTypes controls1,
2379 QSizePolicy::ControlTypes controls2, Qt::Orientation orientation,
2380 QStyleOption *option, QWidget *widget)
const
2382 QSizePolicy::ControlType array1[MaxBits];
2383 QSizePolicy::ControlType array2[MaxBits];
2384 int count1 = unpackControlTypes(controls1, array1);
2385 int count2 = unpackControlTypes(controls2, array2);
2388 for (
int i = 0; i < count1; ++i) {
2389 for (
int j = 0; j < count2; ++j) {
2390 int spacing = layoutSpacing(array1[i], array2[j], orientation, option, widget);
2391 result = qMax(spacing, result);
2436QCachedPainter::QCachedPainter(QPainter *painter,
const QString &cachePrefix,
2437 const QStyleOption *option, QSize size, QRect paintRect)
2438 : m_painter(painter)
2440 , m_paintRect(paintRect)
2442 const auto sz = size.isEmpty() ? option->rect.size() : size;
2443 const qreal dpr = QStyleHelper::getDpr(painter);
2444 m_pixmapName = QStyleHelper::uniqueName(cachePrefix, option, sz, dpr);
2445 m_alreadyCached = QPixmapCache::find(m_pixmapName, &m_pixmap);
2446 if (!m_alreadyCached) {
2447 m_pixmap = styleCachePixmap(sz, dpr);
2448 m_pixmapPainter = std::make_unique<QPainter>(&m_pixmap);
2449 m_pixmapPainter->setRenderHints(painter->renderHints());
2450 s_pixmapCacheKeys += m_pixmapName;