X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/9aee5d22513f0367febab54b38b3a7dc58d120bb..a35af3a0d2022a23c5a1cc30d693141a13673b8f:/src/kitemviews/kstandarditemlistwidget.h diff --git a/src/kitemviews/kstandarditemlistwidget.h b/src/kitemviews/kstandarditemlistwidget.h index 826452255..18f86dbcb 100644 --- a/src/kitemviews/kstandarditemlistwidget.h +++ b/src/kitemviews/kstandarditemlistwidget.h @@ -1,48 +1,42 @@ -/*************************************************************************** - * Copyright (C) 2012 by Peter Penz * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ +/* + * SPDX-FileCopyrightText: 2012 Peter Penz + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ #ifndef KSTANDARDITEMLISTWIDGET_H #define KSTANDARDITEMLISTWIDGET_H #include "dolphin_export.h" - -#include +#include "kitemviews/kitemlistwidget.h" #include +#include #include #include class KItemListRoleEditor; class KItemListStyleOption; class KItemListView; +class QVariantAnimation; +/** + * @brief standard implementation of the ItemList widget informant for use with KStandardItemListView and KStandardItemModel. + * + * @see KItemListWidgetInformant + */ class DOLPHIN_EXPORT KStandardItemListWidgetInformant : public KItemListWidgetInformant { public: KStandardItemListWidgetInformant(); - virtual ~KStandardItemListWidgetInformant(); + ~KStandardItemListWidgetInformant() override; + + void calculateItemSizeHints(QVector> &logicalHeightHints, + qreal &logicalWidthHint, + const KItemListView *view) const override; - virtual void calculateItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const Q_DECL_OVERRIDE; + qreal preferredRoleColumnWidth(const QByteArray &role, int index, const KItemListView *view) const override; - virtual qreal preferredRoleColumnWidth(const QByteArray& role, - int index, - const KItemListView* view) const Q_DECL_OVERRIDE; protected: /** * @return The value of the "text" role. The default implementation returns @@ -51,70 +45,77 @@ protected: * QHash returned by KItemModelBase::data(int), * it can reimplement this function. */ - virtual QString itemText(int index, const KItemListView* view) const; + virtual QString itemText(int index, const KItemListView *view) const; /** * @return The value of the "isLink" role. The default implementation returns false. * The derived class should reimplement this function, when information about * links is available and in usage. */ - virtual bool itemIsLink(int index, const KItemListView* view) const; + virtual bool itemIsLink(int index, const KItemListView *view) const; + + /** Configure whether the requested text should be optimized for viewing on a screen or for being read out aloud by a text-to-speech engine. */ + enum class ForUsageAs { DisplayedText, SpokenText }; /** + * @param role The role the text is being requested for. + * @param values The data of the item. All the data is passed because the text might depend on multiple data points. + * @param forUsageAs Whether the roleText should be optimized for displaying (i.e. kept somewhat short) or optimized for speaking e.g. by screen readers + * or text-to-speech in general (i.e. by prefering announcing a month as July instead of as the number 7). * @return String representation of the role \a role. The representation of * a role might depend on other roles, so the values of all roles * are passed as parameter. */ - virtual QString roleText(const QByteArray& role, - const QHash& values) const; + virtual QString roleText(const QByteArray &role, const QHash &values, ForUsageAs forUsageAs = ForUsageAs::DisplayedText) const; /** * @return A font based on baseFont which is customized for symlinks. */ - virtual QFont customizedFontForLinks(const QFont& baseFont) const; + virtual QFont customizedFontForLinks(const QFont &baseFont) const; - void calculateIconsLayoutItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const; - void calculateCompactLayoutItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const; - void calculateDetailsLayoutItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const; + void calculateIconsLayoutItemSizeHints(QVector> &logicalHeightHints, qreal &logicalWidthHint, const KItemListView *view) const; + void calculateCompactLayoutItemSizeHints(QVector> &logicalHeightHints, qreal &logicalWidthHint, const KItemListView *view) const; + void calculateDetailsLayoutItemSizeHints(QVector> &logicalHeightHints, qreal &logicalWidthHint, const KItemListView *view) const; friend class KStandardItemListWidget; // Accesses roleText() }; /** - * @brief Itemlist widget implementation for KStandardItemView and KStandardItemModel. + * @brief standard implementation of an ItemList widget for KStandardItemListView and KStandardItemModel. + * + * @see KItemListWidget */ class DOLPHIN_EXPORT KStandardItemListWidget : public KItemListWidget { Q_OBJECT public: - enum Layout - { - IconsLayout, - CompactLayout, - DetailsLayout - }; + enum Layout { IconsLayout, CompactLayout, DetailsLayout }; - KStandardItemListWidget(KItemListWidgetInformant* informant, QGraphicsItem* parent); - virtual ~KStandardItemListWidget(); + KStandardItemListWidget(KItemListWidgetInformant *informant, QGraphicsItem *parent); + ~KStandardItemListWidget() override; void setLayout(Layout layout); - Layout layout() const; + + void setHighlightEntireRow(bool highlightEntireRow); + bool highlightEntireRow() const; void setSupportsItemExpanding(bool supportsItemExpanding); bool supportsItemExpanding() const; - virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0); + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override; - virtual QRectF iconRect() const Q_DECL_OVERRIDE; - virtual QRectF textRect() const Q_DECL_OVERRIDE; - virtual QRectF textFocusRect() const Q_DECL_OVERRIDE; - virtual QRectF selectionRect() const Q_DECL_OVERRIDE; - virtual QRectF expansionToggleRect() const Q_DECL_OVERRIDE; - virtual QRectF selectionToggleRect() const Q_DECL_OVERRIDE; - virtual QPixmap createDragPixmap(const QStyleOptionGraphicsItem* option, QWidget* widget = 0) Q_DECL_OVERRIDE; + QRectF iconRect() const override; + QRectF textRect() const override; + QRectF textFocusRect() const override; + QRectF selectionRect() const override; + QRectF expansionToggleRect() const override; + QRectF selectionToggleRect() const override; + QPixmap createDragPixmap(const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override; + /** @see KItemListWidget::startActivateSoonAnimation() */ + void startActivateSoonAnimation(int timeUntilActivation) override; - static KItemListWidgetInformant* createInformant(); + static KItemListWidgetInformant *createInformant(); protected: /** @@ -123,6 +124,12 @@ protected: */ void invalidateCache(); + /** + * Invalidates the icon cache which results in calling KStandardItemListWidget::refreshCache() as + * soon as the item needs to get repainted. + */ + void invalidateIconCache(); + /** * Is called if the cache got invalidated by KStandardItemListWidget::invalidateCache(). * The default implementation is empty. @@ -133,7 +140,7 @@ protected: * @return True if the give role should be right aligned when showing it inside a column. * Per default false is returned. */ - virtual bool isRoleRightAligned(const QByteArray& role) const; + virtual bool isRoleRightAligned(const QByteArray &role) const; /** * @return True if the item should be visually marked as hidden item. Per default @@ -144,50 +151,56 @@ protected: /** * @return A font based on baseFont which is customized according to the data shown in the widget. */ - virtual QFont customizedFont(const QFont& baseFont) const; + virtual QFont customizedFont(const QFont &baseFont) const; virtual QPalette::ColorRole normalTextColorRole() const; - void setTextColor(const QColor& color); - QColor textColor() const; + void setTextColor(const QColor &color); + QColor textColor(const QWidget &widget) const; - void setOverlay(const QPixmap& overlay); - QPixmap overlay() const; + void setOverlays(QHash &overlay); + QHash overlays() const; /** * @see KStandardItemListWidgetInformant::roleText(). */ - QString roleText(const QByteArray& role, const QHash& values) const; + QString roleText(const QByteArray &role, const QHash &values) const; + + static int numberOfUnicodeCharactersIn(const QString &text); /** - * Fixes: - * Select the text without MIME-type extension - * This is file-item-specific and should be moved - * into KFileItemListWidget. - * - * Inherited classes can define, if the MIME-type extension - * should be selected or not. - * - * @return Selection length (with or without MIME-type extension) + * @return Selection length (with or without MIME-type extension) in number of unicode characters, which might be different from number of QChars. */ - virtual int selectionLength(const QString& text) const; - - virtual void dataChanged(const QHash& current, const QSet& roles = QSet()) Q_DECL_OVERRIDE; - virtual void visibleRolesChanged(const QList& current, const QList& previous) Q_DECL_OVERRIDE; - virtual void columnWidthChanged(const QByteArray& role, qreal current, qreal previous) Q_DECL_OVERRIDE; - virtual void styleOptionChanged(const KItemListStyleOption& current, const KItemListStyleOption& previous) Q_DECL_OVERRIDE; - virtual void hoveredChanged(bool hovered) Q_DECL_OVERRIDE; - virtual void selectedChanged(bool selected) Q_DECL_OVERRIDE; - virtual void siblingsInformationChanged(const QBitArray& current, const QBitArray& previous) Q_DECL_OVERRIDE; - virtual void editedRoleChanged(const QByteArray& current, const QByteArray& previous) Q_DECL_OVERRIDE; - virtual void resizeEvent(QGraphicsSceneResizeEvent* event) Q_DECL_OVERRIDE; - virtual void showEvent(QShowEvent* event) Q_DECL_OVERRIDE; - virtual void hideEvent(QHideEvent* event) Q_DECL_OVERRIDE; - -private slots: + virtual int selectionLength(const QString &text) const; + + void dataChanged(const QHash ¤t, const QSet &roles = QSet()) override; + void visibleRolesChanged(const QList ¤t, const QList &previous) override; + void columnWidthChanged(const QByteArray &role, qreal current, qreal previous) override; + void sidePaddingChanged(qreal leftPaddingWidth, qreal rightPaddingWidth) override; + void styleOptionChanged(const KItemListStyleOption ¤t, const KItemListStyleOption &previous) override; + void hoveredChanged(bool hovered) override; + void selectedChanged(bool selected) override; + void siblingsInformationChanged(const QBitArray ¤t, const QBitArray &previous) override; + void editedRoleChanged(const QByteArray ¤t, const QByteArray &previous) override; + void iconSizeChanged(int current, int previous) override; + void resizeEvent(QGraphicsSceneResizeEvent *event) override; + void showEvent(QShowEvent *event) override; + void hideEvent(QHideEvent *event) override; + bool event(QEvent *event) override; + + struct TextInfo { + QPointF pos; + QStaticText staticText; + }; + void updateAdditionalInfoTextColor(); + +public Q_SLOTS: + void finishRoleEditing(); + +private Q_SLOTS: void slotCutItemsChanged(); - void slotRoleEditingCanceled(const QByteArray& role, const QVariant& value); - void slotRoleEditingFinished(const QByteArray& role, const QVariant& value); + void slotRoleEditingCanceled(const QByteArray &role, const QVariant &value); + void slotRoleEditingFinished(const QByteArray &role, const QVariant &value); private: void triggerCacheRefreshing(); @@ -199,33 +212,51 @@ private: void updateCompactLayoutTextCache(); void updateDetailsLayoutTextCache(); - void updateAdditionalInfoTextColor(); + QPixmap addOverlays(const QPixmap &pixmap, + const QHash &overlays, + const QSize &size, + qreal devicePixelRatioF, + QIcon::Mode mode = QIcon::Normal) const; - void drawPixmap(QPainter* painter, const QPixmap& pixmap); - void drawSiblingsInformation(QPainter* painter); + void drawPixmap(QPainter *painter, const QPixmap &pixmap); + /** Draw the lines and arrows that visualize the expanded state and level of this row. */ + void drawSiblingsInformation(QPainter *painter); QRectF roleEditingRect(const QByteArray &role) 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. */ void closeRoleEditor(); - static QPixmap pixmapForIcon(const QString& name, const QStringList& overlays, int size); + QPixmap pixmapForIcon(const QString &name, const QSize &size, QIcon::Mode mode) const; /** * @return Preferred size of the rating-image based on the given * style-option. The height of the font is taken as * reference. */ - static QSizeF preferredRatingSize(const KItemListStyleOption& option); + static QSizeF preferredRatingSize(const KItemListStyleOption &option); /** * @return Horizontal padding in pixels that is added to the required width of * a column to display the content. */ - static qreal columnPadding(const KItemListStyleOption& option); + static qreal columnPadding(const KItemListStyleOption &option); + + /** @returns whether the usual icon should be shown or not. */ + bool isIconControlledByActivateSoonAnimation() const; + +protected: + QHash m_textInfo; // PlacesItemListWidget needs to access this private: bool m_isCut; @@ -233,6 +264,7 @@ private: QFont m_customizedFont; QFontMetrics m_customizedFontMetrics; bool m_isExpandable; + bool m_highlightEntireRow; bool m_supportsItemExpanding; bool m_dirtyLayout; @@ -242,17 +274,11 @@ private: Layout m_layout; QPointF m_pixmapPos; QPixmap m_pixmap; - QSize m_scaledPixmapSize; - - QRectF m_iconRect; // Cache for KItemListWidget::iconRect() - QPixmap m_hoverPixmap; // Cache for modified m_pixmap when hovering the item + QSize m_scaledPixmapSize; //Size of the pixmap in device independent pixels - struct TextInfo - { - QPointF pos; - QStaticText staticText; - }; - QHash m_textInfo; + qreal m_columnWidthSum; + QRectF m_iconRect; // Cache for KItemListWidget::iconRect() + QPixmap m_hoverPixmap; // Cache for modified m_pixmap when hovering the item QRectF m_textRect; @@ -263,11 +289,14 @@ private: QColor m_customTextColor; QColor m_additionalInfoTextColor; - QPixmap m_overlay; + QHash m_overlays; QPixmap m_rating; - KItemListRoleEditor* m_roleEditor; - KItemListRoleEditor* m_oldRoleEditor; + KItemListRoleEditor *m_roleEditor; + KItemListRoleEditor *m_oldRoleEditor; + + /** @see startActivateSoonAnimation() */ + QPointer m_activateSoonAnimation; friend class KStandardItemListWidgetInformant; // Accesses private static methods to be able to // share a common layout calculation