diff options
| author | Nicolas Fella <[email protected]> | 2023-10-24 23:12:22 +0200 |
|---|---|---|
| committer | Nicolas Fella <[email protected]> | 2023-10-24 23:14:25 +0200 |
| commit | 1826f905d706925456763394de17294bcb6d1c35 (patch) | |
| tree | 6838f9f0a8423cc7b0b86554139299c649f53b42 /src | |
| parent | 8b91acf05b2b41ae68268081d31af18cf66d3bca (diff) | |
| parent | ef59e42c40df5e873a1a1b6c2173d5b55641a783 (diff) | |
Merge branch 'master' into kf6
Diffstat (limited to 'src')
| -rw-r--r-- | src/dolphinmainwindow.cpp | 1 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistcontroller.cpp | 5 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistview.cpp | 60 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistview.h | 8 | ||||
| -rw-r--r-- | src/kitemviews/kstandarditemlistwidget.cpp | 15 | ||||
| -rw-r--r-- | src/kitemviews/kstandarditemlistwidget.h | 7 | ||||
| -rw-r--r-- | src/org.kde.dolphin.appdata.xml | 2 | ||||
| -rw-r--r-- | src/search/dolphinsearchbox.cpp | 4 | ||||
| -rw-r--r-- | src/settings/contextmenu/contextmenusettingspage.cpp | 20 | ||||
| -rw-r--r-- | src/statusbar/dolphinstatusbar.cpp | 2 | ||||
| -rw-r--r-- | src/views/dolphinview.cpp | 8 | ||||
| -rw-r--r-- | src/views/dolphinview.h | 7 | ||||
| -rw-r--r-- | src/views/dolphinviewactionhandler.cpp | 1 |
13 files changed, 103 insertions, 37 deletions
diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index e5fb4efa9..27e4d2381 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -2398,6 +2398,7 @@ void DolphinMainWindow::connectViewSignals(DolphinViewContainer *container) { connect(container, &DolphinViewContainer::showFilterBarChanged, this, &DolphinMainWindow::updateFilterBarAction); connect(container, &DolphinViewContainer::writeStateChanged, this, &DolphinMainWindow::slotWriteStateChanged); + slotWriteStateChanged(container->view()->isFolderWritable()); connect(container, &DolphinViewContainer::searchModeEnabledChanged, this, &DolphinMainWindow::updateSearchAction); connect(container, &DolphinViewContainer::captionChanged, this, &DolphinMainWindow::updateWindowTitle); connect(container, &DolphinViewContainer::tabRequested, this, &DolphinMainWindow::openNewTab); diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index be7a63e09..5abf1830b 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -539,7 +539,7 @@ void KItemListController::slotChangeCurrentItem(const QString &text, bool search m_selectionManager->beginAnchoredSelection(index); } - m_view->scrollToItem(index); + m_view->scrollToItem(index, KItemListView::ViewItemPosition::Beginning); } } @@ -1299,7 +1299,8 @@ void KItemListController::slotRubberBandChanged() if (widgetRect.intersects(rubberBandRect)) { // Select the full row intersecting with the rubberband rectangle const QRectF selectionRect = widget->selectionRect().translated(widgetRect.topLeft()); - if (selectionRect.intersects(rubberBandRect)) { + const QRectF iconRect = widget->iconRect().translated(widgetRect.topLeft()); + if (selectionRect.intersects(rubberBandRect) || iconRect.intersects(rubberBandRect)) { selectedItems.insert(index); } } diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 659e59f0f..cf1483659 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -537,7 +537,7 @@ bool KItemListView::isElided(int index) const return m_sizeHintResolver->isElided(index); } -void KItemListView::scrollToItem(int index) +void KItemListView::scrollToItem(int index, ViewItemPosition viewItemPosition) { QRectF viewGeometry = geometry(); if (m_headerWidget->isVisible()) { @@ -546,29 +546,65 @@ void KItemListView::scrollToItem(int index) } QRectF currentRect = itemRect(index); - // Fix for Bug 311099 - View the underscore when using Ctrl + PagDown + // Fix for Bug 311099 - View the underscore when using Ctrl + PageDown currentRect.adjust(-m_styleOption.horizontalMargin, -m_styleOption.verticalMargin, m_styleOption.horizontalMargin, m_styleOption.verticalMargin); - if (!viewGeometry.contains(currentRect)) { - qreal newOffset = scrollOffset(); - if (scrollOrientation() == Qt::Vertical) { + qreal newOffset = scrollOffset(); + if (scrollOrientation() == Qt::Vertical && (currentRect.top() < viewGeometry.top() || currentRect.bottom() > viewGeometry.bottom())) { + switch (viewItemPosition) { + case Beginning: + newOffset += currentRect.top() - viewGeometry.top(); + break; + case Middle: + newOffset += 0.5 * (currentRect.top() + currentRect.bottom() - (viewGeometry.top() + viewGeometry.bottom())); + break; + case End: + newOffset += currentRect.bottom() - viewGeometry.bottom(); + break; + case Nearest: if (currentRect.top() < viewGeometry.top()) { newOffset += currentRect.top() - viewGeometry.top(); - } else if (currentRect.bottom() > viewGeometry.bottom()) { + } else { newOffset += currentRect.bottom() - viewGeometry.bottom(); } - } else { + break; + default: + Q_UNREACHABLE(); + } + } else if (scrollOrientation() == Qt::Horizontal && (currentRect.left() < viewGeometry.left() || currentRect.right() > viewGeometry.right())) { + switch (viewItemPosition) { + case Beginning: + if (layoutDirection() == Qt::RightToLeft) { + newOffset += currentRect.right() - viewGeometry.right(); + } else { + newOffset += currentRect.left() - viewGeometry.left(); + } + break; + case Middle: + newOffset += 0.5 * (currentRect.left() + currentRect.right() - (viewGeometry.left() + viewGeometry.right())); + break; + case End: + if (layoutDirection() == Qt::RightToLeft) { + newOffset += currentRect.left() - viewGeometry.left(); + } else { + newOffset += currentRect.right() - viewGeometry.right(); + } + break; + case Nearest: if (currentRect.left() < viewGeometry.left()) { newOffset += currentRect.left() - viewGeometry.left(); - } else if (currentRect.right() > viewGeometry.right()) { + } else { newOffset += currentRect.right() - viewGeometry.right(); } + break; + default: + Q_UNREACHABLE(); } + } - if (newOffset != scrollOffset()) { - Q_EMIT scrollTo(newOffset); - return; - } + if (newOffset != scrollOffset()) { + Q_EMIT scrollTo(newOffset); + return; } Q_EMIT scrollingStopped(); diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h index 7bcaec704..8812eb8cc 100644 --- a/src/kitemviews/kitemlistview.h +++ b/src/kitemviews/kitemlistview.h @@ -59,6 +59,9 @@ class DOLPHIN_EXPORT KItemListView : public QGraphicsWidget Q_PROPERTY(qreal itemOffset READ itemOffset WRITE setItemOffset NOTIFY itemOffsetChanged) public: + /** The position in the view to which an item should be scrolled to. */ + enum ViewItemPosition { Beginning, Middle, End, Nearest }; + explicit KItemListView(QGraphicsWidget *parent = nullptr); ~KItemListView() override; @@ -251,9 +254,10 @@ public: /** * Scrolls to the item with the index \a index so that the item - * will be fully visible. + * will be fully visible. The item is positioned within the view + * as specified by \a viewItemPosition. */ - void scrollToItem(int index); + void scrollToItem(int index, ViewItemPosition viewItemPosition = ViewItemPosition::Nearest); /** * If several properties of KItemListView are changed synchronously, it is diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index 52df17ad3..e37013f95 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -1205,6 +1205,16 @@ QString KStandardItemListWidget::elideRightKeepExtension(const QString &text, in return m_customizedFontMetrics.elidedText(text, Qt::ElideRight, elidingWidth); } +QString KStandardItemListWidget::escapeString(const QString &text) const +{ + QString escaped(text); + + const QChar returnSymbol(0x21b5); + escaped.replace('\n', returnSymbol); + + return escaped; +} + void KStandardItemListWidget::updateIconsLayoutTextCache() { // +------+ @@ -1227,7 +1237,7 @@ void KStandardItemListWidget::updateIconsLayoutTextCache() // Initialize properties for the "text" role. It will be used as anchor // for initializing the position of the other roles. TextInfo *nameTextInfo = m_textInfo.value("text"); - const QString nameText = KStringHandler::preProcessWrap(values["text"].toString()); + const QString nameText = KStringHandler::preProcessWrap(escapeString(values["text"].toString())); nameTextInfo->staticText.setText(nameText); // Calculate the number of lines required for the name and the required width @@ -1348,7 +1358,7 @@ void KStandardItemListWidget::updateCompactLayoutTextCache() qreal y = qRound((widgetHeight - textLinesHeight) / 2); const qreal maxWidth = size().width() - x - option.padding; for (const QByteArray &role : std::as_const(m_sortedVisibleRoles)) { - const QString text = roleText(role, values); + const QString text = escapeString(roleText(role, values)); TextInfo *textInfo = m_textInfo.value(role); textInfo->staticText.setText(text); @@ -1407,6 +1417,7 @@ void KStandardItemListWidget::updateDetailsLayoutTextCache() const bool isTextRole = (role == "text"); if (isTextRole) { + text = escapeString(text); availableTextWidth -= firstColumnInc - sidePadding(); } diff --git a/src/kitemviews/kstandarditemlistwidget.h b/src/kitemviews/kstandarditemlistwidget.h index 1313179c9..a09f0c7a8 100644 --- a/src/kitemviews/kstandarditemlistwidget.h +++ b/src/kitemviews/kstandarditemlistwidget.h @@ -209,6 +209,13 @@ private: QString elideRightKeepExtension(const QString &text, int elidingWidth) const; /** + * Escapes text for display purposes. + * + * Replaces '\n' with Unicode line break (U+21B5). + */ + QString escapeString(const QString &text) const; + + /** * Closes the role editor and returns the focus back * to the KItemListContainer. */ diff --git a/src/org.kde.dolphin.appdata.xml b/src/org.kde.dolphin.appdata.xml index 83840d35f..f04032497 100644 --- a/src/org.kde.dolphin.appdata.xml +++ b/src/org.kde.dolphin.appdata.xml @@ -494,10 +494,10 @@ <binary>dolphin</binary> </provides> <releases> + <release version="23.08.2" date="2023-10-12"/> <release version="23.08.1" date="2023-09-14"/> <release version="23.08.0" date="2023-08-24"/> <release version="23.04.3" date="2023-07-06"/> - <release version="23.04.2" date="2023-06-08"/> </releases> <content_rating type="oars-1.1"/> </component> diff --git a/src/search/dolphinsearchbox.cpp b/src/search/dolphinsearchbox.cpp index a09f25293..a3cec6fe7 100644 --- a/src/search/dolphinsearchbox.cpp +++ b/src/search/dolphinsearchbox.cpp @@ -265,9 +265,7 @@ void DolphinSearchBox::slotSearchTextChanged(const QString &text) if (text.isEmpty()) { // Restore URL when search box is cleared by closing and reopening the box. emitCloseRequest(); - QTimer::singleShot(0, this, [this] { - Q_EMIT openRequest(); - }); + Q_EMIT openRequest(); } else { m_startSearchTimer->start(); } diff --git a/src/settings/contextmenu/contextmenusettingspage.cpp b/src/settings/contextmenu/contextmenusettingspage.cpp index 68073a16e..a1fada2ad 100644 --- a/src/settings/contextmenu/contextmenusettingspage.cpp +++ b/src/settings/contextmenu/contextmenusettingspage.cpp @@ -170,15 +170,14 @@ void ContextMenuSettingsPage::applySettings() QStringList enabledPlugins; - const QAbstractItemModel *model = m_listView->model(); - for (int i = 0; i < model->rowCount(); ++i) { - const QModelIndex index = model->index(i, 0); - const QString service = model->data(index, ServiceModel::DesktopEntryNameRole).toString(); - const bool checked = model->data(index, Qt::CheckStateRole).value<Qt::CheckState>() == Qt::Checked; + for (int i = 0; i < m_serviceModel->rowCount(); ++i) { + const QModelIndex index = m_serviceModel->index(i, 0); + const QString service = m_serviceModel->data(index, ServiceModel::DesktopEntryNameRole).toString(); + const bool checked = m_serviceModel->data(index, Qt::CheckStateRole).value<Qt::CheckState>() == Qt::Checked; if (service.startsWith(VersionControlServicePrefix)) { if (checked) { - enabledPlugins.append(model->data(index, Qt::DisplayRole).toString()); + enabledPlugins.append(m_serviceModel->data(index, Qt::DisplayRole).toString()); } } else if (service == QLatin1String(DeleteService)) { KSharedConfig::Ptr globalConfig = KSharedConfig::openConfig(QStringLiteral("kdeglobals"), KConfig::NoGlobals); @@ -223,14 +222,13 @@ void ContextMenuSettingsPage::applySettings() void ContextMenuSettingsPage::restoreDefaults() { - QAbstractItemModel *model = m_listView->model(); - for (int i = 0; i < model->rowCount(); ++i) { - const QModelIndex index = model->index(i, 0); - const QString service = model->data(index, ServiceModel::DesktopEntryNameRole).toString(); + for (int i = 0; i < m_serviceModel->rowCount(); ++i) { + const QModelIndex index = m_serviceModel->index(i, 0); + const QString service = m_serviceModel->data(index, ServiceModel::DesktopEntryNameRole).toString(); const bool checked = !service.startsWith(VersionControlServicePrefix) && service != QLatin1String(DeleteService) && service != QLatin1String(CopyToMoveToService); - model->setData(index, checked ? Qt::Checked : Qt::Unchecked, Qt::CheckStateRole); + m_serviceModel->setData(index, checked ? Qt::Checked : Qt::Unchecked, Qt::CheckStateRole); } } diff --git a/src/statusbar/dolphinstatusbar.cpp b/src/statusbar/dolphinstatusbar.cpp index 9c101b3fa..9830960dc 100644 --- a/src/statusbar/dolphinstatusbar.cpp +++ b/src/statusbar/dolphinstatusbar.cpp @@ -269,7 +269,7 @@ void DolphinStatusBar::contextMenuEvent(QContextMenuEvent *event) showSpaceInfoAction->setCheckable(true); showSpaceInfoAction->setChecked(GeneralSettings::showSpaceInfo()); - const QAction *action = menu.exec(QCursor::pos()); + const QAction *action = menu.exec(event->reason() == QContextMenuEvent::Reason::Mouse ? QCursor::pos() : mapToGlobal(QPoint(width() / 2, height() / 2))); if (action == showZoomSliderAction) { const bool visible = showZoomSliderAction->isChecked(); GeneralSettings::setShowZoomSlider(visible); diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index 5bdc9e15f..0bb73e623 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -267,7 +267,6 @@ void DolphinView::setActive(bool active) if (active) { m_container->setFocus(); Q_EMIT activated(); - Q_EMIT writeStateChanged(m_isFolderWritable); } } @@ -1759,7 +1758,7 @@ void DolphinView::updateViewState() // scroll to current item and reset the state if (m_scrollToCurrentItem) { - m_view->scrollToItem(currentIndex); + m_view->scrollToItem(currentIndex, KItemListView::ViewItemPosition::Middle); m_scrollToCurrentItem = false; } m_currentItemUrl = QUrl(); @@ -2243,6 +2242,11 @@ void DolphinView::updateWritableState() } } +bool DolphinView::isFolderWritable() const +{ + return m_isFolderWritable; +} + QUrl DolphinView::viewPropertiesUrl() const { if (m_viewPropertiesContext.isEmpty()) { diff --git a/src/views/dolphinview.h b/src/views/dolphinview.h index 05b9e009c..0b0c83487 100644 --- a/src/views/dolphinview.h +++ b/src/views/dolphinview.h @@ -344,6 +344,11 @@ public: /** Activates the view if the item list container gets focus. */ bool eventFilter(QObject *watched, QEvent *event) override; + /** + * Returns whether the folder represented by the current URL is writable. + */ + bool isFolderWritable() const; + public Q_SLOTS: void reload(); @@ -880,7 +885,7 @@ private: /** * Updates m_isFolderWritable dependent on whether the folder represented by * the current URL is writable. If the state has changed, the signal - * writeableStateChanged() will be emitted. + * writeStateChanged() will be emitted. */ void updateWritableState(); diff --git a/src/views/dolphinviewactionhandler.cpp b/src/views/dolphinviewactionhandler.cpp index 397ff5d5e..98cbbdf80 100644 --- a/src/views/dolphinviewactionhandler.cpp +++ b/src/views/dolphinviewactionhandler.cpp @@ -60,6 +60,7 @@ void DolphinViewActionHandler::setCurrentView(DolphinView *view) connect(view, &DolphinView::sortRoleChanged, this, &DolphinViewActionHandler::slotSortRoleChanged); connect(view, &DolphinView::zoomLevelChanged, this, &DolphinViewActionHandler::slotZoomLevelChanged); connect(view, &DolphinView::writeStateChanged, this, &DolphinViewActionHandler::slotWriteStateChanged); + slotWriteStateChanged(view->isFolderWritable()); connect(view, &DolphinView::selectionModeChangeRequested, this, [this](bool enabled) { Q_EMIT selectionModeChangeTriggered(enabled); }); |
