File indexing completed on 2024-12-08 06:40:58

0001 /*
0002     This file is part of the KDE project
0003     SPDX-FileCopyrightText: 2007, 2009 Rafael Fernández López <ereslibre@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #ifndef KCATEGORYDRAWER_H
0009 #define KCATEGORYDRAWER_H
0010 
0011 #include <kitemviews_export.h>
0012 
0013 #include <QMouseEvent>
0014 #include <QObject>
0015 #include <memory>
0016 
0017 class KCategoryDrawerPrivate;
0018 
0019 class QPainter;
0020 class QModelIndex;
0021 class QStyleOption;
0022 
0023 class KCategorizedView;
0024 
0025 /**
0026  * @class KCategoryDrawer kcategorydrawer.h KCategoryDrawer
0027  *
0028  * The category drawing is performed by this class. It also gives information about the category
0029  * height and margins.
0030  *
0031  */
0032 class KITEMVIEWS_EXPORT KCategoryDrawer : public QObject
0033 {
0034     Q_OBJECT
0035     friend class KCategorizedView;
0036 
0037 public:
0038     /*
0039      * Construct a category drawer for a given view
0040      *
0041      * @since 5.0
0042      */
0043     KCategoryDrawer(KCategorizedView *view);
0044     ~KCategoryDrawer() override;
0045 
0046     /**
0047      * @return The view this category drawer is associated with.
0048      */
0049     KCategorizedView *view() const;
0050 
0051     /**
0052      * This method purpose is to draw a category represented by the given
0053      * @param index with the given @param sortRole sorting role
0054      *
0055      * @note This method will be called one time per category, always with the
0056      *       first element in that category
0057      */
0058     virtual void drawCategory(const QModelIndex &index, int sortRole, const QStyleOption &option, QPainter *painter) const;
0059 
0060     /**
0061      * @return The category height for the category represented by index @p index with
0062      *         style options @p option.
0063      */
0064     virtual int categoryHeight(const QModelIndex &index, const QStyleOption &option) const;
0065 
0066     /**
0067      * @note 0 by default
0068      *
0069      * @since 4.4
0070      */
0071     virtual int leftMargin() const;
0072 
0073     /**
0074      * @note 0 by default
0075      *
0076      * @since 4.4
0077      */
0078     virtual int rightMargin() const;
0079 
0080 Q_SIGNALS:
0081     /**
0082      * This signal becomes emitted when collapse or expand has been clicked.
0083      */
0084     void collapseOrExpandClicked(const QModelIndex &index);
0085 
0086     /**
0087      * Emit this signal on your subclass implementation to notify that something happened. Usually
0088      * this will be triggered when you have received an event, and its position matched some "hot spot".
0089      *
0090      * You give this action the integer you want, and having connected this signal to your code,
0091      * the connected slot can perform the needed changes (view, model, selection model, delegate...)
0092      */
0093     void actionRequested(int action, const QModelIndex &index);
0094 
0095 protected:
0096     /**
0097      * Method called when the mouse button has been pressed.
0098      *
0099      * @param index The representative index of the block of items.
0100      * @param blockRect The rect occupied by the block of items.
0101      * @param event The mouse event.
0102      *
0103      * @warning You explicitly have to determine whether the event has been accepted or not. You
0104      *          have to call event->accept() or event->ignore() at all possible case branches in
0105      *          your code.
0106      */
0107     virtual void mouseButtonPressed(const QModelIndex &index, const QRect &blockRect, QMouseEvent *event);
0108 
0109     /**
0110      * Method called when the mouse button has been released.
0111      *
0112      * @param index The representative index of the block of items.
0113      * @param blockRect The rect occupied by the block of items.
0114      * @param event The mouse event.
0115      *
0116      * @warning You explicitly have to determine whether the event has been accepted or not. You
0117      *          have to call event->accept() or event->ignore() at all possible case branches in
0118      *          your code.
0119      */
0120     virtual void mouseButtonReleased(const QModelIndex &index, const QRect &blockRect, QMouseEvent *event);
0121 
0122     /**
0123      * Method called when the mouse has been moved.
0124      *
0125      * @param index The representative index of the block of items.
0126      * @param blockRect The rect occupied by the block of items.
0127      * @param event The mouse event.
0128      */
0129     virtual void mouseMoved(const QModelIndex &index, const QRect &blockRect, QMouseEvent *event);
0130 
0131     /**
0132      * Method called when the mouse button has been double clicked.
0133      *
0134      * @param index The representative index of the block of items.
0135      * @param blockRect The rect occupied by the block of items.
0136      * @param event The mouse event.
0137      *
0138      * @warning You explicitly have to determine whether the event has been accepted or not. You
0139      *          have to call event->accept() or event->ignore() at all possible case branches in
0140      *          your code.
0141      */
0142     virtual void mouseButtonDoubleClicked(const QModelIndex &index, const QRect &blockRect, QMouseEvent *event);
0143 
0144     /**
0145      * Method called when the mouse button has left this block.
0146      *
0147      * @param index The representative index of the block of items.
0148      * @param blockRect The rect occupied by the block of items.
0149      */
0150     virtual void mouseLeft(const QModelIndex &index, const QRect &blockRect);
0151 
0152 private:
0153     std::unique_ptr<KCategoryDrawerPrivate> const d;
0154 };
0155 
0156 #endif // KCATEGORYDRAWER_H