File indexing completed on 2024-12-01 03:41:15

0001 /*
0002     This file is part of the KDE project
0003     SPDX-FileCopyrightText: 2006-2007, 2008 Fredrik Höglund <fredrik@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #ifndef KFILEITEMDELEGATE_H
0009 #define KFILEITEMDELEGATE_H
0010 
0011 #include "kiowidgets_export.h"
0012 #include <QAbstractItemDelegate>
0013 #include <QTextOption>
0014 
0015 #include <memory>
0016 
0017 class QAbstractItemModel;
0018 class QAbstractItemView;
0019 class QHelpEvent;
0020 class QModelIndex;
0021 class QPainter;
0022 
0023 /**
0024  * @class KFileItemDelegate kfileitemdelegate.h <KFileItemDelegate>
0025  *
0026  * KFileItemDelegate is intended to be used to provide a KDE file system
0027  * view, when using one of the standard item views in Qt with KDirModel.
0028  *
0029  * While primarily intended to be used with KDirModel, it uses
0030  * Qt::DecorationRole and Qt::DisplayRole for the icons and text labels,
0031  * just like QItemDelegate, and can thus be used with any standard model.
0032  *
0033  * When used with KDirModel however, KFileItemDelegate can change the way
0034  * the display and/or decoration roles are drawn, based on properties
0035  * of the file items. For example, if the file item is a symbolic link,
0036  * it will use an italic font to draw the file name.
0037  *
0038  * KFileItemDelegate also supports showing additional information about
0039  * the file items below the icon labels.
0040  *
0041  * Which information should be shown, if any, is controlled by the
0042  * @ref information property, which is a list that can be set by calling
0043  * setShowInformation(), and read by calling showInformation().
0044  * By default this list is empty.
0045  *
0046  * To use KFileItemDelegate, instantiate an object from the delegate,
0047  * and call setItemDelegate() in one of the standard item views in Qt:
0048  *
0049  * @code
0050  * QListView *listview = new QListView(this);
0051  * KFileItemDelegate *delegate = new KFileItemDelegate(this);
0052  * listview->setItemDelegate(delegate);
0053  * @endcode
0054  */
0055 class KIOWIDGETS_EXPORT KFileItemDelegate : public QAbstractItemDelegate
0056 {
0057     Q_OBJECT
0058 
0059     /**
0060      * This property holds which additional information (if any) should be shown below
0061      * items in icon views.
0062      *
0063      * Access functions:
0064      * @li void setShownformation(InformationList information)
0065      * @li InformationList showInformation() const
0066      */
0067     Q_PROPERTY(InformationList information READ showInformation WRITE setShowInformation)
0068 
0069     /**
0070      * This property holds the color used for the text shadow.
0071      *
0072      * The alpha value in the color determines the opacity of the shadow.
0073      * Shadows are only rendered when the alpha value is non-zero.
0074      * The default value for this property is Qt::transparent.
0075      *
0076      * Access functions:
0077      * @li void setShadowColor(const QColor &color)
0078      * @li QColor shadowColor() const
0079      */
0080     Q_PROPERTY(QColor shadowColor READ shadowColor WRITE setShadowColor)
0081 
0082     /**
0083      * This property holds the horizontal and vertical offset for the text shadow.
0084      * The default value for this property is (1, 1).
0085      *
0086      * Access functions:
0087      * @li void setShadowOffset(const QPointF &offset)
0088      * @li QPointF shadowOffset() const
0089      */
0090     Q_PROPERTY(QPointF shadowOffset READ shadowOffset WRITE setShadowOffset)
0091 
0092     /**
0093      * This property holds the blur radius for the text shadow.
0094      * The default value for this property is 2.
0095      *
0096      * Access functions:
0097      * @li void setShadowBlur(qreal radius)
0098      * @li qreal shadowBlur() const
0099      */
0100     Q_PROPERTY(qreal shadowBlur READ shadowBlur WRITE setShadowBlur)
0101 
0102     /**
0103      * This property holds the maximum size that can be returned
0104      * by KFileItemDelegate::sizeHint(). If the maximum size is empty,
0105      * it will be ignored.
0106      */
0107     Q_PROPERTY(QSize maximumSize READ maximumSize WRITE setMaximumSize)
0108 
0109     /**
0110      * This property determines whether a tooltip will be shown by the delegate
0111      * if the display role is elided. This tooltip will contain the full display
0112      * role information. The tooltip will only be shown if the Qt::ToolTipRole differs
0113      * from Qt::DisplayRole, or if they match, showToolTipWhenElided flag is set and
0114      * the display role information is elided.
0115      */
0116     Q_PROPERTY(bool showToolTipWhenElided READ showToolTipWhenElided WRITE setShowToolTipWhenElided)
0117 
0118     /**
0119      * This property determines if there are KIO jobs on a destination URL visible, then
0120      * they will have a small animation overlay displayed on them.
0121      */
0122     Q_PROPERTY(bool jobTransfersVisible READ jobTransfersVisible WRITE setJobTransfersVisible)
0123 
0124 public:
0125     /**
0126      * This enum defines the additional information that can be displayed below item
0127      * labels in icon views.
0128      *
0129      * The information will only be shown for indexes for which the model provides
0130      * a valid value for KDirModel::FileItemRole, and only when there's sufficient vertical
0131      * space to display at least one line of the information, along with the display label.
0132      *
0133      * For the number of items to be shown for folders, the model must provide a valid
0134      * value for KDirMode::ChildCountRole, in addition to KDirModel::FileItemRole.
0135      *
0136      * Note that KFileItemDelegate will not call KFileItem::determineMimeType() if
0137      * KFileItem::isMimeTypeKnown() returns false, so if you want to display MIME types
0138      * you should use a KMimeTypeResolver with the model and the view, to ensure that MIME
0139      * types are resolved. If the MIME type isn't known, "Unknown" will be displayed until
0140      * the MIME type has been successfully resolved.
0141      *
0142      * @see setShowInformation()
0143      * @see showInformation()
0144      * @see information
0145      */
0146     enum Information {
0147         NoInformation, ///< No additional information will be shown for items.
0148         Size, ///< The file size for files, and the number of items for folders.
0149         Permissions, ///< A UNIX permissions string, e.g.\ -rwxr-xr-x.
0150         OctalPermissions, ///< The permissions as an octal value, e.g.\ 0644.
0151         Owner, ///< The user name of the file owner, e.g.\ root
0152         OwnerAndGroup, ///< The user and group that owns the file, e.g.\ root:root
0153         CreationTime, ///< The date and time the file/folder was created.
0154         ModificationTime, ///< The date and time the file/folder was last modified.
0155         AccessTime, ///< The date and time the file/folder was last accessed.
0156         MimeType, ///< The MIME type for the item, e.g.\ text/html.
0157         FriendlyMimeType, ///< The descriptive name for the MIME type, e.g.\ HTML Document.
0158         LinkDest, ///< The destination of a symbolic link. @since 4.5
0159         LocalPathOrUrl, ///< The local path to the file or the URL in case it is not a local file. @since 4.5
0160         Comment, ///< A simple comment that can be displayed to the user as is. @since 4.6
0161     };
0162     Q_ENUM(Information)
0163 
0164     typedef QList<Information> InformationList;
0165 
0166     /**
0167      * Constructs a new KFileItemDelegate.
0168      *
0169      * @param parent The parent object for the delegate.
0170      */
0171     explicit KFileItemDelegate(QObject *parent = nullptr);
0172 
0173     /**
0174      * Destroys the item delegate.
0175      */
0176     ~KFileItemDelegate() override;
0177 
0178     /**
0179      * Returns the nominal size for the item referred to by @p index, given the
0180      * provided options.
0181      *
0182      * If the model provides a valid Qt::FontRole and/or Qt::TextAlignmentRole for the item,
0183      * those will be used instead of the ones specified in the style options.
0184      *
0185      * This function is reimplemented from @ref QAbstractItemDelegate.
0186      *
0187      * @param option  The style options that should be used when painting the item.
0188      * @param index   The index to the item for which to return the size hint.
0189      */
0190     QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
0191 
0192     /**
0193      * Paints the item indicated by @p index, using @p painter.
0194      *
0195      * The item will be drawn in the rectangle specified by option.rect.
0196      * The correct size for that rectangle can be obtained by calling
0197      * @ref sizeHint().
0198      *
0199      * This function will use the following data values if the model provides
0200      * them for the item, in place of the values in @p option:
0201      *
0202      * @li Qt::FontRole           The font that should be used for the display role.
0203      * @li Qt::TextAlignmentRole  The alignment of the display role.
0204      * @li Qt::ForegroundRole     The text color for the display role.
0205      * @li Qt::BackgroundRole     The background color for the item.
0206      *
0207      * This function is reimplemented from @ref QAbstractItemDelegate.
0208      *
0209      * @param painter The painter with which to draw the item.
0210      * @param option  The style options that should be used when painting the item.
0211      * @param index   The index to the item that should be painted.
0212      */
0213     void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
0214 
0215     /**
0216      * Reimplemented from @ref QAbstractItemDelegate.
0217      */
0218     QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
0219 
0220     /**
0221      * Reimplemented from @ref QAbstractItemDelegate.
0222      */
0223     bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override;
0224 
0225     /**
0226      * Reimplemented from @ref QAbstractItemDelegate.
0227      */
0228     void setEditorData(QWidget *editor, const QModelIndex &index) const override;
0229 
0230     /**
0231      * Reimplemented from @ref QAbstractItemDelegate.
0232      */
0233     void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
0234 
0235     /**
0236      * Reimplemented from @ref QAbstractItemDelegate.
0237      */
0238     void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
0239 
0240     /**
0241      * Sets the list of information lines that are shown below the icon label in list views.
0242      *
0243      * You will typically construct the list like this:
0244      * @code
0245      * KFileItemDelegate::InformationList list;
0246      * list << KFileItemDelegate::FriendlyMimeType << KFileItemDelegate::Size;
0247      * delegate->setShowInformation(list);
0248      * @endcode
0249      *
0250      * The information lines will be displayed in the list order.
0251      * The delegate will first draw the item label, and then as many information
0252      * lines as will fit in the available space.
0253      *
0254      * @param list A list of information items that should be shown
0255      */
0256     void setShowInformation(const InformationList &list);
0257 
0258     /**
0259      * Sets a single information line that is shown below the icon label in list views.
0260      *
0261      * This is a convenience function for when you only want to show a single line
0262      * of information.
0263      *
0264      * @param information The information that should be shown
0265      */
0266     void setShowInformation(Information information);
0267 
0268     /**
0269      * Returns the file item information that should be shown below item labels in list views.
0270      */
0271     InformationList showInformation() const;
0272 
0273     /**
0274      * Sets the color used for drawing the text shadow.
0275      *
0276      * To enable text shadows, set the shadow color to a non-transparent color.
0277      * To disable text shadows, set the color to Qt::transparent.
0278      *
0279      * @see shadowColor()
0280      */
0281     void setShadowColor(const QColor &color);
0282 
0283     /**
0284      * Returns the color used for the text shadow.
0285      *
0286      * @see setShadowColor()
0287      */
0288     QColor shadowColor() const;
0289 
0290     /**
0291      * Sets the horizontal and vertical offset for the text shadow.
0292      *
0293      * @see shadowOffset()
0294      */
0295     void setShadowOffset(const QPointF &offset);
0296 
0297     /**
0298      * Returns the offset used for the text shadow.
0299      *
0300      * @see setShadowOffset()
0301      */
0302     QPointF shadowOffset() const;
0303 
0304     /**
0305      * Sets the blur radius for the text shadow.
0306      *
0307      * @see shadowBlur()
0308      */
0309     void setShadowBlur(qreal radius);
0310 
0311     /**
0312      * Returns the blur radius for the text shadow.
0313      *
0314      * @see setShadowBlur()
0315      */
0316     qreal shadowBlur() const;
0317 
0318     /**
0319      * Sets the maximum size for KFileItemDelegate::sizeHint().
0320      *
0321      * @see maximumSize()
0322      */
0323     void setMaximumSize(const QSize &size);
0324 
0325     /**
0326      * Returns the maximum size for KFileItemDelegate::sizeHint().
0327      *
0328      * @see setMaximumSize()
0329      */
0330     QSize maximumSize() const;
0331 
0332     /**
0333      * Sets whether a tooltip should be shown if the display role is
0334      * elided containing the full display role information.
0335      *
0336      * @note The tooltip will only be shown if the Qt::ToolTipRole differs
0337      *       from Qt::DisplayRole, or if they match, showToolTipWhenElided
0338      *       flag is set and the display role information is elided.
0339      * @see showToolTipWhenElided()
0340      */
0341     void setShowToolTipWhenElided(bool showToolTip);
0342 
0343     /**
0344      * Returns whether a tooltip should be shown if the display role
0345      * is elided containing the full display role information.
0346      *
0347      * @note The tooltip will only be shown if the Qt::ToolTipRole differs
0348      *       from Qt::DisplayRole, or if they match, showToolTipWhenElided
0349      *       flag is set and the display role information is elided.
0350      * @see setShowToolTipWhenElided()
0351      */
0352     bool showToolTipWhenElided() const;
0353 
0354     /**
0355      * Returns the rectangle of the icon that is aligned inside the decoration
0356      * rectangle.
0357      */
0358     QRect iconRect(const QStyleOptionViewItem &option, const QModelIndex &index) const;
0359 
0360     /**
0361      * When the contents text needs to be wrapped, @p wrapMode strategy
0362      * will be followed.
0363      *
0364      */
0365     void setWrapMode(QTextOption::WrapMode wrapMode);
0366 
0367     /**
0368      * Returns the wrapping strategy followed to show text when it needs
0369      * wrapping.
0370      *
0371      */
0372     QTextOption::WrapMode wrapMode() const;
0373 
0374     /**
0375      * Enable/Disable the displaying of an animated overlay that is shown for any destination
0376      * urls (in the view). When enabled, the animations (if any) will be drawn automatically.
0377      *
0378      * Only the files/folders that are visible and have jobs associated with them
0379      * will display the animation.
0380      * You would likely not want this enabled if you perform some kind of custom painting
0381      * that takes up a whole item, and will just make this(and what you paint) look funky.
0382      *
0383      * Default is disabled.
0384      *
0385      * Note: The model (KDirModel) needs to have it's method called with the same
0386      * value, when you make the call to this method.
0387      */
0388     void setJobTransfersVisible(bool jobTransfersVisible);
0389 
0390     /**
0391      * Returns whether or not the displaying of job transfers is enabled.
0392      * @see setJobTransfersVisible()
0393      */
0394     bool jobTransfersVisible() const;
0395 
0396     /**
0397      * Reimplemented from @ref QAbstractItemDelegate.
0398      */
0399     bool eventFilter(QObject *object, QEvent *event) override;
0400 
0401 public Q_SLOTS:
0402     /**
0403      * Reimplemented from @ref QAbstractItemDelegate.
0404      */
0405     bool helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index) override;
0406 
0407     /**
0408      * Returns the shape of the item as a region.
0409      * The returned region can be used for precise hit testing of the item.
0410      */
0411     QRegion shape(const QStyleOptionViewItem &option, const QModelIndex &index);
0412 
0413 private:
0414     class Private;
0415     std::unique_ptr<Private> const d; /// @internal
0416     Q_DISABLE_COPY(KFileItemDelegate)
0417 };
0418 
0419 #endif // KFILEITEMDELEGATE_H