┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNicolas Fella <[email protected]>2023-10-24 23:12:22 +0200
committerNicolas Fella <[email protected]>2023-10-24 23:14:25 +0200
commit1826f905d706925456763394de17294bcb6d1c35 (patch)
tree6838f9f0a8423cc7b0b86554139299c649f53b42 /src
parent8b91acf05b2b41ae68268081d31af18cf66d3bca (diff)
parentef59e42c40df5e873a1a1b6c2173d5b55641a783 (diff)
Merge branch 'master' into kf6
Diffstat (limited to 'src')
-rw-r--r--src/dolphinmainwindow.cpp1
-rw-r--r--src/kitemviews/kitemlistcontroller.cpp5
-rw-r--r--src/kitemviews/kitemlistview.cpp60
-rw-r--r--src/kitemviews/kitemlistview.h8
-rw-r--r--src/kitemviews/kstandarditemlistwidget.cpp15
-rw-r--r--src/kitemviews/kstandarditemlistwidget.h7
-rw-r--r--src/org.kde.dolphin.appdata.xml2
-rw-r--r--src/search/dolphinsearchbox.cpp4
-rw-r--r--src/settings/contextmenu/contextmenusettingspage.cpp20
-rw-r--r--src/statusbar/dolphinstatusbar.cpp2
-rw-r--r--src/views/dolphinview.cpp8
-rw-r--r--src/views/dolphinview.h7
-rw-r--r--src/views/dolphinviewactionhandler.cpp1
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);
});