┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews
diff options
context:
space:
mode:
Diffstat (limited to 'src/kitemviews')
-rw-r--r--src/kitemviews/kfileitemlisttostring.cpp82
-rw-r--r--src/kitemviews/kfileitemlisttostring.h56
-rw-r--r--src/kitemviews/kfileitemmodel.cpp2
-rw-r--r--src/kitemviews/kitemlistcontroller.cpp5
-rw-r--r--src/kitemviews/kstandarditemlistwidget.cpp4
-rw-r--r--src/kitemviews/private/ktwofingerswipe.cpp139
-rw-r--r--src/kitemviews/private/ktwofingerswipe.h54
-rw-r--r--src/kitemviews/private/ktwofingertap.cpp122
-rw-r--r--src/kitemviews/private/ktwofingertap.h48
9 files changed, 146 insertions, 366 deletions
diff --git a/src/kitemviews/kfileitemlisttostring.cpp b/src/kitemviews/kfileitemlisttostring.cpp
new file mode 100644
index 000000000..8e8f880e9
--- /dev/null
+++ b/src/kitemviews/kfileitemlisttostring.cpp
@@ -0,0 +1,82 @@
+/*
+ This file is part of the KDE project
+ SPDX-FileCopyrightText: 2022 Felix Ernst <[email protected]>
+
+ SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
+*/
+
+#include "kfileitemlisttostring.h"
+
+#include <KFileItem>
+#include <KFileItemListProperties>
+#include <KLocalizedString>
+
+#include <QFontMetrics>
+#include <QString>
+
+QString fileItemListToString(KFileItemList items, int maximumTextWidth, QFontMetrics fontMetrics, ItemsState itemsState)
+{
+ QString text;
+ switch (items.count()) {
+ case 1:
+ text = i18nc("Textual representation of a file. %1 is the name of the file/folder.",
+ "\"%1\"", items.first().name());
+ break;
+ case 2:
+ text = i18nc("Textual representation of two files. %1 and %2 are names of files/folders.",
+ "\"%1\" and \"%2\"", items.first().name(), items.last().name());
+ break;
+ case 3:
+ text = i18nc("Textual representation of three files. %1, %2 and %3 are names of files/folders.",
+ "\"%1\", \"%2\" and \"%3\"",
+ items.first().name(), items.at(1).name(), items.last().name());
+ break;
+ case 4:
+ text = i18nc("Textual representation of four files. %1, %2, %3 and %4 are names of files/folders.",
+ "\"%1\", \"%2\", \"%3\" and \"%4\"",
+ items.first().name(), items.at(1).name(), items.at(2).name(), items.last().name());
+ break;
+ case 5:
+ text = i18nc("Textual representation of five files. %1, %2, %3, %4 and %5 are names of files/folders.",
+ "\"%1\", \"%2\", \"%3\", \"%4\" and \"%5\"",
+ items.first().name(), items.at(1).name(), items.at(2).name(), items.at(3).name(), items.last().name());
+ break;
+ default:
+ text = QString();
+ break;
+ }
+
+ // At some point the added clarity from the text starts being less important than the text width.
+ if (!text.isEmpty() && fontMetrics.horizontalAdvance(text) <= maximumTextWidth) {
+ return text;
+ }
+
+ const KFileItemListProperties properties(items);
+ if (itemsState == Selected) {
+ if (properties.isFile()) {
+ text = i18ncp("Textual representation of selected files. %1 is the number of files.",
+ "One Selected File", "%1 Selected Files", items.count());
+ } else if (properties.isDirectory()) {
+ text = i18ncp("Textual representation of selected folders. %1 is the number of folders.",
+ "One Selected Folder", "%1 Selected Folders", items.count());
+ } else {
+ text = i18ncp("Textual representation of selected fileitems. %1 is the number of files/folders.",
+ "One Selected Item", "%1 Selected Items", items.count());
+ }
+
+ if (fontMetrics.horizontalAdvance(text) <= maximumTextWidth) {
+ return text;
+ }
+ }
+
+ if (properties.isFile()) {
+ return i18ncp("Textual representation of files. %1 is the number of files.",
+ "One File", "%1 Files", items.count());
+ } else if (properties.isDirectory()) {
+ return i18ncp("Textual representation of folders. %1 is the number of folders.",
+ "One Folder", "%1 Folders", items.count());
+ } else {
+ return i18ncp("Textual representation of fileitems. %1 is the number of files/folders.",
+ "One Item", "%1 Items", items.count());
+ }
+}
diff --git a/src/kitemviews/kfileitemlisttostring.h b/src/kitemviews/kfileitemlisttostring.h
new file mode 100644
index 000000000..7eee0aec9
--- /dev/null
+++ b/src/kitemviews/kfileitemlisttostring.h
@@ -0,0 +1,56 @@
+/*
+ This file is part of the KDE project
+ SPDX-FileCopyrightText: 2022 Felix Ernst <[email protected]>
+
+ SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
+*/
+
+#ifndef KFILEITEMLISTTOSTRING_H
+#define KFILEITEMLISTTOSTRING_H
+
+class KFileItemList;
+class QFontMetrics;
+class QString;
+
+enum ItemsState {
+ None,
+ Selected
+};
+
+/**
+ * @brief Generates a textual representation of the given list of KFileItems.
+ *
+ * This method is especially useful to be very explicit about which items will be affected by an action.
+ * For example can a label for a delete button be enriched to say "Permanantly Delete `picture1` and `picture2`"
+ * but also "Permanently Delete 7 Selected Folders" without requiring a huge amount of new translations for this.
+ *
+ * Unfortunately this doesn't always work.
+ *
+ * For some texts and some languages this wide range of words cannot be inserted into a text while staying
+ * grammatically correct. Because of this you will probably need to write a fallback for these languages.
+ * Something like this:
+ * \code
+ * // i18n: @action:inmenu menu with actions like copy, paste, rename.
+ * // %2 is a textual representation of the currently selected files or folders. This can be the name of
+ * // the file/files like "file1" or "file1, file2 and file3" or an aggregate like "8 Selected Folders".
+ * // If this sort of word puzzle can not be correctly translated in your language, translate it as "NULL" (without the quotes)
+ * // and a fallback will be used.
+ * auto buttonText = i18ncp("@action A more elaborate and clearly worded version of the Delete action", "Permanently Delete %2", "Permanently Delete %2", items.count(), fileItemListToString(items, fontMetrics.averageCharWidth() * 20, fontMetrics));
+ * if (buttonText == QStringLiteral("NULL")) {
+ * buttonText = i18ncp("@action Delete button label. %1 is the number of items to be deleted.",
+ * "Permanently Delete %1 Item", "Permanently Delete %1 Items", items.count())
+ * }
+ * \endcode
+ * (The i18n call should be completely in the line following the i18n: comment without any line breaks within the i18n call or the comment might not be correctly extracted. See: https://commits.kde.org/kxmlgui/a31135046e1b3335b5d7bbbe6aa9a883ce3284c1 )
+ *
+ * @param items The KFileItemList for which a QString should be generated.
+ * @param maximumTextWidth The maximum width/horizontalAdvance the QString should have. Keep scaling in mind.
+ * @param fontMetrics the fontMetrics for the font that is used to calculate the maximumTextWidth.
+ * @param itemsState A state of the @p items that should be spelled out in the returned QString.
+ * @returns the names of the @p items separated by commas if that is below the @p maximumCharacterWidth.
+ * Otherwise returns something like "5 Files", "8 Selected Folders" or "60 Items"
+ * while being as specific as possible.
+ */
+QString fileItemListToString(KFileItemList items, int maximumTextWidth, QFontMetrics fontMetrics, ItemsState itemsState = ItemsState::None);
+
+#endif // KFILEITEMLISTTOSTRING_H
diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp
index 6391d7d3f..052a71cbd 100644
--- a/src/kitemviews/kfileitemmodel.cpp
+++ b/src/kitemviews/kfileitemmodel.cpp
@@ -15,7 +15,7 @@
#include <KDirLister>
#include <KIO/Job>
-#include <KIO/kio_version.h>
+#include <kio_version.h>
#include <KLocalizedString>
#include <KLazyLocalizedString>
#include <KUrlMimeData>
diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp
index 2422e9110..966dc822b 100644
--- a/src/kitemviews/kitemlistcontroller.cpp
+++ b/src/kitemviews/kitemlistcontroller.cpp
@@ -13,10 +13,11 @@
#include "kitemlistview.h"
#include "private/kitemlistkeyboardsearchmanager.h"
#include "private/kitemlistrubberband.h"
-#include "private/ktwofingerswipe.h"
-#include "private/ktwofingertap.h"
#include "views/draganddrophelper.h"
+#include <KTwoFingerSwipe>
+#include <KTwoFingerTap>
+
#include <QAccessible>
#include <QApplication>
#include <QDrag>
diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp
index d04ef370b..db4e4a90e 100644
--- a/src/kitemviews/kstandarditemlistwidget.cpp
+++ b/src/kitemviews/kstandarditemlistwidget.cpp
@@ -1211,7 +1211,11 @@ QString KStandardItemListWidget::elideRightKeepExtension(const QString &text, in
QString ret = m_customizedFontMetrics.elidedText(text.chopped(extensionLength),
Qt::ElideRight,
elidingWidth - extensionWidth);
+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
ret.append(text.rightRef(extensionLength));
+#else
+ ret.append(QStringView(text).right(extensionLength));
+#endif
return ret;
}
}
diff --git a/src/kitemviews/private/ktwofingerswipe.cpp b/src/kitemviews/private/ktwofingerswipe.cpp
deleted file mode 100644
index 6d0e18e65..000000000
--- a/src/kitemviews/private/ktwofingerswipe.cpp
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2020 Steffen Hartleib <[email protected]>
- *
- * SPDX-License-Identifier: GPL-2.0-or-later
- */
-
-// Self
-#include "ktwofingerswipe.h"
-
-// Qt
-#include <QTouchEvent>
-#include <QLineF>
-
-KTwoFingerSwipeRecognizer::KTwoFingerSwipeRecognizer() :
- QGestureRecognizer(),
- m_touchBeginnTimestamp(0),
- m_gestureAlreadyTriggered(false)
-{
-}
-
-KTwoFingerSwipeRecognizer::~KTwoFingerSwipeRecognizer()
-{
-}
-
-QGesture* KTwoFingerSwipeRecognizer::create(QObject*)
-{
- return static_cast<QGesture*>(new KTwoFingerSwipe());
-}
-
-QGestureRecognizer::Result KTwoFingerSwipeRecognizer::recognize(QGesture* gesture, QObject* watched, QEvent* event)
-{
- Q_UNUSED(watched)
-
- KTwoFingerSwipe* const kTwoFingerSwipe = static_cast<KTwoFingerSwipe*>(gesture);
- const QTouchEvent* touchEvent = static_cast<const QTouchEvent*>(event);
-
- const int maxTimeFrameForSwipe = 90;
- const int minDistanceForSwipe = 30;
-
- switch (event->type()) {
- case QEvent::TouchBegin: {
- m_touchBeginnTimestamp = touchEvent->timestamp();
- m_gestureAlreadyTriggered = false;
- kTwoFingerSwipe->setHotSpot(touchEvent->touchPoints().first().startScreenPos());
- kTwoFingerSwipe->setPos(touchEvent->touchPoints().first().startPos());
- kTwoFingerSwipe->setScreenPos(touchEvent->touchPoints().first().startScreenPos());
- kTwoFingerSwipe->setScenePos(touchEvent->touchPoints().first().startScenePos());
- return MayBeGesture;
- }
-
- case QEvent::TouchUpdate: {
- const qint64 now = touchEvent->timestamp();
- const qint64 elapsedTime = now - m_touchBeginnTimestamp;
- const QPointF distance = touchEvent->touchPoints().first().startPos() - touchEvent->touchPoints().first().pos();
- kTwoFingerSwipe->setHotSpot(touchEvent->touchPoints().first().startScreenPos());
- kTwoFingerSwipe->setPos(touchEvent->touchPoints().first().startPos());
- kTwoFingerSwipe->setScreenPos(touchEvent->touchPoints().first().startScreenPos());
- kTwoFingerSwipe->setScenePos(touchEvent->touchPoints().first().startScenePos());
- const QLineF ql = QLineF(touchEvent->touchPoints().first().startPos(), touchEvent->touchPoints().first().pos());
- kTwoFingerSwipe->setSwipeAngle(ql.angle());
-
- if (touchEvent->touchPoints().size() > 2) {
- return CancelGesture;
- }
-
- if (touchEvent->touchPoints().size() == 2) {
- if ((elapsedTime) > maxTimeFrameForSwipe) {
- return CancelGesture;
- }
-
- if (distance.manhattanLength() >= minDistanceForSwipe &&
- (elapsedTime) <= maxTimeFrameForSwipe && !m_gestureAlreadyTriggered) {
- m_gestureAlreadyTriggered = true;
- return FinishGesture;
- } else if ((elapsedTime) <= maxTimeFrameForSwipe && !m_gestureAlreadyTriggered) {
- return TriggerGesture;
- }
- }
- break;
- }
-
- default:
- return Ignore;
- }
- return Ignore;
-}
-
-KTwoFingerSwipe::KTwoFingerSwipe(QObject* parent) :
- QGesture(parent),
- m_pos(QPointF(-1, -1)),
- m_screenPos(QPointF(-1, -1)),
- m_scenePos(QPointF(-1, -1)),
- m_swipeAngle(0.0)
-{
-}
-
-KTwoFingerSwipe::~KTwoFingerSwipe()
-{
-}
-
-QPointF KTwoFingerSwipe::pos() const
-{
- return m_pos;
-}
-
-void KTwoFingerSwipe::setPos(QPointF _pos)
-{
- m_pos = _pos;
-}
-
-QPointF KTwoFingerSwipe::screenPos() const
-{
- return m_screenPos;
-}
-
-void KTwoFingerSwipe::setScreenPos(QPointF _screenPos)
-{
- m_screenPos = _screenPos;
-}
-
-QPointF KTwoFingerSwipe::scenePos() const
-{
- return m_scenePos;
-}
-
-void KTwoFingerSwipe::setScenePos(QPointF _scenePos)
-{
- m_scenePos = _scenePos;
-}
-
-qreal KTwoFingerSwipe::swipeAngle() const
-{
- return m_swipeAngle;
-}
- void KTwoFingerSwipe::setSwipeAngle(qreal _swipeAngle)
-{
- m_swipeAngle = _swipeAngle;
-}
-
diff --git a/src/kitemviews/private/ktwofingerswipe.h b/src/kitemviews/private/ktwofingerswipe.h
deleted file mode 100644
index 6d64d8ff7..000000000
--- a/src/kitemviews/private/ktwofingerswipe.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2020 Steffen Hartleib <[email protected]>
- *
- * SPDX-License-Identifier: GPL-2.0-or-later
- */
-
-#ifndef KTWOFINGERSWIPE_H
-#define KTWOFINGERSWIPE_H
-
-#include "dolphin_export.h"
-// Qt
-#include <QGesture>
-#include <QGestureRecognizer>
-
-class DOLPHIN_EXPORT KTwoFingerSwipe : public QGesture
-{
- Q_OBJECT
- Q_PROPERTY(QPointF pos READ pos WRITE setPos)
- Q_PROPERTY(QPointF screenPos READ screenPos WRITE setScreenPos)
- Q_PROPERTY(QPointF scenePos READ scenePos WRITE setScenePos)
- Q_PROPERTY(qreal swipeAngle READ swipeAngle WRITE setSwipeAngle)
-public:
- explicit KTwoFingerSwipe(QObject* parent = nullptr);
- ~KTwoFingerSwipe() override;
- QPointF pos() const;
- void setPos(QPointF pos);
- QPointF screenPos() const;
- void setScreenPos(QPointF screenPos);
- QPointF scenePos() const;
- void setScenePos(QPointF scenePos);
- qreal swipeAngle() const;
- void setSwipeAngle(qreal swipeAngle);
-private:
- QPointF m_pos;
- QPointF m_screenPos;
- QPointF m_scenePos;
- qreal m_swipeAngle;
-};
-
-class DOLPHIN_EXPORT KTwoFingerSwipeRecognizer : public QGestureRecognizer
-{
-public:
- explicit KTwoFingerSwipeRecognizer();
- ~KTwoFingerSwipeRecognizer() override;
- QGesture* create(QObject*) override;
- Result recognize(QGesture*, QObject*, QEvent*) override;
-private:
- Q_DISABLE_COPY( KTwoFingerSwipeRecognizer )
- qint64 m_touchBeginnTimestamp;
- bool m_gestureAlreadyTriggered;
-};
-
-#endif /* KTWOFINGERSWIPE_H */
-
diff --git a/src/kitemviews/private/ktwofingertap.cpp b/src/kitemviews/private/ktwofingertap.cpp
deleted file mode 100644
index edd9d1d35..000000000
--- a/src/kitemviews/private/ktwofingertap.cpp
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2020 Steffen Hartleib <[email protected]>
- *
- * SPDX-License-Identifier: GPL-2.0-or-later
- */
-
-// Self
-#include "ktwofingertap.h"
-
-// Qt
-#include <QTouchEvent>
-#include <QApplication>
-#include <QGraphicsWidget>
-
-KTwoFingerTapRecognizer::KTwoFingerTapRecognizer() :
- QGestureRecognizer(),
- m_gestureTriggered(false)
-{
-}
-
-KTwoFingerTapRecognizer::~KTwoFingerTapRecognizer()
-{
-}
-
-QGesture* KTwoFingerTapRecognizer::create(QObject*)
-{
- return static_cast<QGesture*>(new KTwoFingerTap());
-}
-
-QGestureRecognizer::Result KTwoFingerTapRecognizer::recognize(QGesture* gesture, QObject* watched, QEvent* event)
-{
- if (qobject_cast<QGraphicsWidget*>(watched)) {
- return Ignore;
- }
-
- KTwoFingerTap* const kTwoFingerTap = static_cast<KTwoFingerTap*>(gesture);
- const QTouchEvent* touchEvent = static_cast<const QTouchEvent*>(event);
-
- switch (event->type()) {
- case QEvent::TouchBegin: {
- kTwoFingerTap->setHotSpot(touchEvent->touchPoints().first().startScreenPos());
- kTwoFingerTap->setPos(touchEvent->touchPoints().first().startPos());
- kTwoFingerTap->setScreenPos(touchEvent->touchPoints().first().startScreenPos());
- kTwoFingerTap->setScenePos(touchEvent->touchPoints().first().startScenePos());
- m_gestureTriggered = false;
- return MayBeGesture;
- }
-
- case QEvent::TouchUpdate: {
-
- if (touchEvent->touchPoints().size() > 2) {
- m_gestureTriggered = false;
- return CancelGesture;
- }
-
- if (touchEvent->touchPoints().size() == 2) {
- if ((touchEvent->touchPoints().first().startPos() - touchEvent->touchPoints().first().pos()).manhattanLength() >= QApplication::startDragDistance()) {
- m_gestureTriggered = false;
- return CancelGesture;
- }
- if ((touchEvent->touchPoints().at(1).startPos() - touchEvent->touchPoints().at(1).pos()).manhattanLength() >= QApplication::startDragDistance()) {
- m_gestureTriggered = false;
- return CancelGesture;
- }
- if (touchEvent->touchPointStates() & Qt::TouchPointPressed) {
- m_gestureTriggered = true;
- }
- if (touchEvent->touchPointStates() & Qt::TouchPointReleased && m_gestureTriggered) {
- m_gestureTriggered = false;
- return FinishGesture;
- }
- }
- break;
- }
-
- default:
- return Ignore;
- }
- return Ignore;
-}
-
-KTwoFingerTap::KTwoFingerTap(QObject* parent) :
- QGesture(parent),
- m_pos(QPointF(-1, -1)),
- m_screenPos(QPointF(-1, -1)),
- m_scenePos(QPointF(-1, -1))
-{
-}
-
-KTwoFingerTap::~KTwoFingerTap()
-{
-}
-
-QPointF KTwoFingerTap::pos() const
-{
- return m_pos;
-}
-
-void KTwoFingerTap::setPos(QPointF _pos)
-{
- m_pos = _pos;
-}
-
-QPointF KTwoFingerTap::screenPos() const
-{
- return m_screenPos;
-}
-
-void KTwoFingerTap::setScreenPos(QPointF _screenPos)
-{
- m_screenPos = _screenPos;
-}
-
-QPointF KTwoFingerTap::scenePos() const
-{
- return m_scenePos;
-}
-
-void KTwoFingerTap::setScenePos(QPointF _scenePos)
-{
- m_scenePos = _scenePos;
-}
diff --git a/src/kitemviews/private/ktwofingertap.h b/src/kitemviews/private/ktwofingertap.h
deleted file mode 100644
index 6d409900b..000000000
--- a/src/kitemviews/private/ktwofingertap.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2020 Steffen Hartleib <[email protected]>
- *
- * SPDX-License-Identifier: GPL-2.0-or-later
- */
-
-#ifndef KTWOFINGERTAP_H
-#define KTWOFINGERTAP_H
-
-#include <dolphin_export.h>
-// Qt
-#include <QGesture>
-#include <QGestureRecognizer>
-
-class DOLPHIN_EXPORT KTwoFingerTap : public QGesture
-{
- Q_OBJECT
- Q_PROPERTY(QPointF pos READ pos WRITE setPos)
- Q_PROPERTY(QPointF screenPos READ screenPos WRITE setScreenPos)
- Q_PROPERTY(QPointF scenePos READ scenePos WRITE setScenePos)
-public:
- explicit KTwoFingerTap(QObject* parent = nullptr);
- ~KTwoFingerTap() override;
- QPointF pos() const;
- void setPos(QPointF pos);
- QPointF screenPos() const;
- void setScreenPos(QPointF screenPos);
- QPointF scenePos() const;
- void setScenePos(QPointF scenePos);
-private:
- QPointF m_pos;
- QPointF m_screenPos;
- QPointF m_scenePos;
-};
-
-class DOLPHIN_EXPORT KTwoFingerTapRecognizer : public QGestureRecognizer
-{
-public:
- explicit KTwoFingerTapRecognizer();
- ~KTwoFingerTapRecognizer() override;
- QGesture* create(QObject*) override;
- Result recognize(QGesture*, QObject*, QEvent*) override;
-private:
- Q_DISABLE_COPY(KTwoFingerTapRecognizer)
- bool m_gestureTriggered;
-};
-
-#endif /* KTWOFINGERTAP_H */