diff --git a/src/main.cpp b/src/main.cpp --- a/src/main.cpp +++ b/src/main.cpp @@ -67,6 +67,8 @@ app.setOrganizationName(QStringLiteral("KDE")); app.setWindowIcon(QIcon::fromTheme(QStringLiteral(APP_NAME))); + app.setAttribute(Qt::AA_UseHighDpiPixmaps, true); + QCommandLineParser options; options.addHelpOption(); options.addVersionOption(); diff --git a/src/progressBox.cpp b/src/progressBox.cpp --- a/src/progressBox.cpp +++ b/src/progressBox.cpp @@ -89,7 +89,7 @@ ProgressBox::setText(int files) { m_text = i18np("%1 File", "%1 Files", files); - m_textWidth = fontMetrics().width(m_text); + m_textWidth = fontMetrics().horizontalAdvance(m_text); m_textHeight = fontMetrics().height(); } @@ -108,15 +108,15 @@ tick+=16; for (int i=0; isegment->file()->displayName(); if (varySizes) { font.setPointSize(sizes[label->level]); } QFontMetrics fontMetrics(font); - const int minTextWidth = fontMetrics.width(QStringLiteral("M...")) + LABEL_TEXT_HMARGIN; // Fully elided string + const int minTextWidth = fontMetrics.horizontalAdvance(QStringLiteral("M...")) + LABEL_TEXT_HMARGIN; // Fully elided string const int fontHeight = fontMetrics.height() + LABEL_TEXT_VMARGIN; //used to ensure label texts don't overlap const int lineSpacing = fontHeight / 4; @@ -237,7 +237,7 @@ int textY = startY + lineSpacing; int textX; - const int textWidth = fontMetrics.width(string) + LABEL_TEXT_HMARGIN; + const int textWidth = fontMetrics.horizontalAdvance(string) + LABEL_TEXT_HMARGIN; if (rightSide) { if (startX + minTextWidth > width() || textY < fontHeight || middleX < targetX) { //skip this strut @@ -271,7 +271,7 @@ } else { textX = 0; string = fontMetrics.elidedText(string, Qt::ElideMiddle, startX); - startX = fontMetrics.width(string) + LABEL_TEXT_HMARGIN; + startX = fontMetrics.horizontalAdvance(string) + LABEL_TEXT_HMARGIN; } } diff --git a/src/radialMap/map.h b/src/radialMap/map.h --- a/src/radialMap/map.h +++ b/src/radialMap/map.h @@ -27,7 +27,7 @@ #include #include -#include +#include #include namespace RadialMap { @@ -40,17 +40,17 @@ ~Map(); void make(const Folder *, bool = false); - bool resize(const QRect&); + bool resize(const QRectF&); bool isNull() const { return (m_signature == nullptr); } void invalidate(); - int height() const { + qreal height() const { return m_rect.height(); } - int width() const { + qreal width() const { return m_rect.width(); } QPixmap pixmap() const { @@ -72,13 +72,14 @@ const Folder *m_root; uint m_minSize; QVector m_limits; - QRect m_rect; + QRectF m_rect; uint m_visibleDepth; ///visible level depth of system QPixmap m_pixmap; int m_ringBreadth; uint m_innerRadius; ///radius of inner circle QString m_centerText; bool m_summary; + qreal m_dpr; uint MAP_2MARGIN; }; diff --git a/src/radialMap/map.cpp b/src/radialMap/map.cpp --- a/src/radialMap/map.cpp +++ b/src/radialMap/map.cpp @@ -203,7 +203,7 @@ return false; } -bool RadialMap::Map::resize(const QRect &newRect) +bool RadialMap::Map::resize(const QRectF &newRect) { //there's a MAP_2MARGIN border @@ -222,10 +222,11 @@ size = minSize; } - //this QRect is used by paint() + //this QRectF is used by paint() m_rect.setRect(0,0,size,size); - m_pixmap = QPixmap(m_rect.size()); + m_pixmap = QPixmap(m_rect.width() * m_dpr, m_rect.height() * m_dpr); + m_pixmap.setDevicePixelRatio(m_dpr); //resize the pixmap size += MAP_2MARGIN; @@ -352,7 +353,7 @@ KColorScheme scheme(QPalette::Active, KColorScheme::View); QPainter paint; - QRect rect = m_rect; + QRectF rect = m_rect; rect.adjust(MAP_HIDDEN_TRIANGLE_SIZE, MAP_HIDDEN_TRIANGLE_SIZE, -MAP_HIDDEN_TRIANGLE_SIZE, -MAP_HIDDEN_TRIANGLE_SIZE); m_pixmap.fill(Qt::transparent); @@ -381,7 +382,7 @@ //do intelligent distribution of excess to prevent nasty resizing if (m_ringBreadth != MAX_RING_BREADTH && m_ringBreadth != MIN_RING_BREADTH) { - excess = rect.width() % m_ringBreadth; + excess = int(rect.width()) % m_ringBreadth; ++step; } @@ -405,8 +406,8 @@ } //draw arrow head to indicate undisplayed files/directories - QPolygon pts(3); - QPoint pos, cpos = rect.center(); + QPolygonF pts; + QPointF pos, cpos = rect.center(); uint a[3] = { segment->start(), segment->length(), 0 }; a[2] = a[0] + (a[1] / 2); //assign to halfway between @@ -426,9 +427,9 @@ } sincos(ra, &sinra, &cosra); - pos.rx() = cpos.x() + static_cast(cosra * radius); - pos.ry() = cpos.y() - static_cast(sinra * radius); - pts.setPoint(i, pos); + pos.rx() = cpos.x() + cosra * radius; + pos.ry() = cpos.y() - sinra * radius; + pts << pos; } paint.setBrush(segment->pen()); @@ -440,7 +441,7 @@ int width = 2; pen.setWidth(width); paint.setPen(pen); - QRect rect2 = rect; + QRectF rect2 = rect; width /= 2; rect2.adjust(width, width, -width, -width); paint.drawArc(rect2, segment->start(), segment->length()); diff --git a/src/radialMap/widget.h b/src/radialMap/widget.h --- a/src/radialMap/widget.h +++ b/src/radialMap/widget.h @@ -98,7 +98,7 @@ void leaveEvent(QEvent*) override; protected: - const Segment *segmentAt(QPoint position) const; //FIXME const reference for a library others can use + const Segment *segmentAt(QPointF position) const; //FIXME const reference for a library others can use const Segment *rootSegment() const { return m_rootSegment; ///never == 0 } @@ -111,7 +111,7 @@ const Folder *m_tree; const Segment *m_focus; - QPoint m_offset; + QPointF m_offset; QTimer m_timer; Map m_map; Segment *m_rootSegment; diff --git a/src/radialMap/widget.cpp b/src/radialMap/widget.cpp --- a/src/radialMap/widget.cpp +++ b/src/radialMap/widget.cpp @@ -52,6 +52,7 @@ connect(&m_timer, &QTimer::timeout, this, &Widget::resizeTimeout); m_tooltip.setFrameShape(QFrame::StyledPanel); m_tooltip.setWindowFlags(Qt::ToolTip | Qt::WindowTransparentForInput); + m_map.m_dpr = devicePixelRatioF(); } RadialMap::Widget::~Widget() diff --git a/src/radialMap/widgetEvents.cpp b/src/radialMap/widgetEvents.cpp --- a/src/radialMap/widgetEvents.cpp +++ b/src/radialMap/widgetEvents.cpp @@ -88,9 +88,9 @@ } } -const RadialMap::Segment* RadialMap::Widget::segmentAt(QPoint e) const +const RadialMap::Segment* RadialMap::Widget::segmentAt(QPointF e) const { - //determine which segment QPoint e is above + //determine which segment QPointF e is above e -= m_offset; @@ -152,10 +152,10 @@ return; } - const QRect screenRect = window()->windowHandle()->screen()->availableGeometry(); + const QRectF screenRect = window()->windowHandle()->screen()->availableGeometry(); QPoint tooltipPosition = e->globalPos() + QPoint(20, 20); - QRect tooltipRect(tooltipPosition, m_tooltip.size()); + QRectF tooltipRect(tooltipPosition, m_tooltip.size()); // Same content as before if (m_focus == oldFocus) { @@ -224,7 +224,7 @@ int tooltipHeight = 0; for (const QString &part : string.split(QLatin1Char('\n'))) { tooltipHeight += fontMetrics.height(); - tooltipWidth = qMax(tooltipWidth, fontMetrics.width(part)); + tooltipWidth = qMax(tooltipWidth, fontMetrics.horizontalAdvance(part)); } tooltipWidth += 10; tooltipHeight += 10;