From: Akseli Lahtinen Date: Thu, 24 Apr 2025 12:03:42 +0000 (+0300) Subject: DolphinStatusBar: Fix premature text squeezing X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/be36fc1bc45b63693bd5861efed94c08cd9ffe2a DolphinStatusBar: Fix premature text squeezing The text would get squeezed and elided prematurely due to some clipping calculations and paddings created for the clipping. This slightly modifies the clipping code, that we extend the painted area and then clip off the excess, instead of moving the area to specific place and then clipping off the excess. This also makes sure the text width accounts for one extra character plus the clippings we do, so that text will always fit the statusbar. BUG: 503164 --- diff --git a/src/dolphinviewcontainer.cpp b/src/dolphinviewcontainer.cpp index 9bda4d888..ee4bb6e4c 100644 --- a/src/dolphinviewcontainer.cpp +++ b/src/dolphinviewcontainer.cpp @@ -1094,11 +1094,9 @@ bool DolphinViewContainer::eventFilter(QObject *object, QEvent *event) QRect DolphinViewContainer::preferredSmallStatusBarGeometry() { - // Adjust to clipping, we need to add 1 due to how QRects coordinates work. - int clipAdjustment = m_statusBar->clippingAmount() + 1; - // Add offset depending if horizontal scrollbar or filterbar is visible. - const int yPos = m_view->geometry().bottom() - m_view->horizontalScrollBarHeight() - m_statusBar->minimumHeight() + clipAdjustment; - QRect statusBarRect = rect().adjusted(-clipAdjustment, yPos, 0, 0); + // Add offset depending if horizontal scrollbar or filterbar is visible, we need to add 1 due to how QRect coordinates work. + const int yPos = m_view->geometry().bottom() - m_view->horizontalScrollBarHeight() - m_statusBar->minimumHeight() + 1; + QRect statusBarRect = rect().adjusted(0, yPos, 0, 0); return statusBarRect; } diff --git a/src/statusbar/dolphinstatusbar.cpp b/src/statusbar/dolphinstatusbar.cpp index 17a29e84c..f81120a44 100644 --- a/src/statusbar/dolphinstatusbar.cpp +++ b/src/statusbar/dolphinstatusbar.cpp @@ -50,6 +50,7 @@ DolphinStatusBar::DolphinStatusBar(QWidget *parent) setProperty("_breeze_statusbar_separator", true); QWidget *contentsContainer = prepareContentsContainer(); + contentsContainer->setContentsMargins(0, 0, 0, 0); // Initialize text label m_label = new KSqueezedTextLabel(m_text, contentsContainer); @@ -292,8 +293,8 @@ void DolphinStatusBar::updateWidthToContent() // from "jumping around" when user tries to interact with them. setFixedWidth(maximumViewWidth); } else { - const int contentWidth = style()->pixelMetric(QStyle::PM_LayoutLeftMargin, &opt, this) + labelSize.width() - + style()->pixelMetric(QStyle::PM_LayoutRightMargin, &opt, this); + // Make sure we have room for the text + const int contentWidth = labelSize.width() + QFontMetrics(font()).averageCharWidth() + (clippingAmount() * 2); setFixedWidth(qMin(contentWidth, maximumViewWidth)); } Q_EMIT widthUpdated(); @@ -422,7 +423,7 @@ void DolphinStatusBar::updateContentsMargins() m_topLayout->setContentsMargins(6, 0, 2, 0); } else { // Add extra margins to toplayout to avoid clipping too early. - m_topLayout->setContentsMargins(clippingAmount() * 2, 0, clippingAmount(), clippingAmount()); + m_topLayout->setContentsMargins(clippingAmount() * 2, 0, clippingAmount(), 0); } setContentsMargins(0, 0, 0, 0); } @@ -438,11 +439,13 @@ void DolphinStatusBar::paintEvent(QPaintEvent *paintEvent) if (m_label && !m_label->fullText().isEmpty()) { opt.state = QStyle::State_Sunken; QPainterPath path; - // Clip the left and bottom border off. + // Adjust the rectangle to be a bit larger, then clip the left and bottom border off. QRect clipRect; if (layoutDirection() == Qt::RightToLeft) { + opt.rect = rect().adjusted(0, 0, clippingAmount(), clippingAmount()); clipRect = QRect(opt.rect.topLeft(), opt.rect.bottomRight()).adjusted(0, 0, -clippingAmount(), -clippingAmount()); } else { + opt.rect = rect().adjusted(-clippingAmount(), 0, 0, clippingAmount()); clipRect = QRect(opt.rect.topLeft(), opt.rect.bottomRight()).adjusted(clippingAmount(), 0, 0, -clippingAmount()); } path.addRect(clipRect);