File indexing completed on 2024-09-29 13:18:16

0001 /**
0002  * SPDX-FileCopyrightText: (C) 2003 by Sébastien Laoût <slaout@linux62.org>
0003  * SPDX-License-Identifier: GPL-2.0-or-later
0004  */
0005 
0006 #ifndef BASKETLISTVIEW_H
0007 #define BASKETLISTVIEW_H
0008 
0009 #include <QStyledItemDelegate>
0010 #include <QTreeWidget>
0011 #include <QtCore/QTimer>
0012 
0013 class QPixmap;
0014 class QResizeEvent;
0015 class QDragEnterEvent;
0016 class QDropEvent;
0017 class QDragMoveEvent;
0018 class QFocusEvent;
0019 class QDragLeaveEvent;
0020 
0021 class BasketScene;
0022 
0023 class BasketListViewItem : public QTreeWidgetItem
0024 {
0025 public:
0026     /// CONSTRUCTOR AND DESTRUCTOR:
0027     BasketListViewItem(QTreeWidget *parent, BasketScene *basket);
0028     BasketListViewItem(QTreeWidgetItem *parent, BasketScene *basket);
0029     BasketListViewItem(QTreeWidget *parent, QTreeWidgetItem *after, BasketScene *basket);
0030     BasketListViewItem(QTreeWidgetItem *parent, QTreeWidgetItem *after, BasketScene *basket);
0031     ~BasketListViewItem() override;
0032 
0033     BasketScene *basket()
0034     {
0035         return m_basket;
0036     }
0037     void setup();
0038     BasketListViewItem *lastChild();
0039     QStringList childNamesTree(int deep = 0);
0040     void moveChildsBaskets();
0041     void ensureVisible();
0042     bool isShown();
0043     bool isCurrentBasket();
0044     bool isUnderDrag();
0045     QString escapedName(const QString &string);
0046 
0047     bool haveChildsLoading();
0048     bool haveHiddenChildsLoading();
0049     bool haveChildsLocked();
0050     bool haveHiddenChildsLocked();
0051     int countChildsFound();
0052     int countHiddenChildsFound();
0053 
0054     void setUnderDrag(bool);
0055     bool isAbbreviated();
0056     void setAbbreviated(bool b);
0057 
0058 private:
0059     BasketScene *m_basket;
0060     int m_width;
0061     bool m_isUnderDrag;
0062     bool m_isAbbreviated;
0063 };
0064 
0065 Q_DECLARE_METATYPE(BasketListViewItem *);
0066 
0067 class BasketTreeListView : public QTreeWidget
0068 {
0069     Q_OBJECT
0070 public:
0071     explicit BasketTreeListView(QWidget *parent = nullptr);
0072     void dragEnterEvent(QDragEnterEvent *event) override;
0073     void removeExpands();
0074     void dragLeaveEvent(QDragLeaveEvent *event) override;
0075     void dragMoveEvent(QDragMoveEvent *event) override;
0076     void dropEvent(QDropEvent *event) override;
0077     void resizeEvent(QResizeEvent *event) override;
0078     void contextMenuEvent(QContextMenuEvent *event) override;
0079     Qt::DropActions supportedDropActions() const override;
0080 
0081     /*! Retrieve a basket from the tree
0082      *  @see BasketListViewItem::basket() */
0083     BasketListViewItem *getBasketInTree(const QModelIndex &index) const;
0084 
0085     static QString TREE_ITEM_MIME_STRING;
0086 
0087 protected:
0088     QStringList mimeTypes() const override;
0089     QMimeData *mimeData(const QList<QTreeWidgetItem *> items) const override;
0090     bool event(QEvent *e) override;
0091     void mousePressEvent(QMouseEvent *event) override;
0092     void mouseMoveEvent(QMouseEvent *event) override;
0093     void focusInEvent(QFocusEvent *) override;
0094 
0095 private:
0096     QTimer m_autoOpenTimer;
0097     QTreeWidgetItem *m_autoOpenItem;
0098 Q_SIGNALS:
0099     void contextMenuRequested(const QPoint &);
0100 private Q_SLOTS:
0101     void autoOpen();
0102 
0103 private:
0104     void setItemUnderDrag(BasketListViewItem *item);
0105     BasketListViewItem *m_itemUnderDrag;
0106     QPoint m_dragStartPosition;
0107 };
0108 
0109 /** @class FoundCountIcon
0110  *  Custom-drawn "little numbers" shown on Filter all */
0111 class FoundCountIcon : public QStyledItemDelegate
0112 {
0113 public:
0114     FoundCountIcon(BasketTreeListView *basketTree, QObject *parent = nullptr)
0115         : QStyledItemDelegate(parent)
0116         , m_basketTree(basketTree)
0117     {
0118     }
0119     void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
0120 
0121 private:
0122     QPixmap circledTextPixmap(const QString &text, int height, const QFont &font, const QColor &color) const;
0123 
0124     //! @returns Rect-with-number, or null pixmap if nothing was found / basket is loading
0125     QPixmap foundCountPixmap(bool isLoading, int countFound, bool childrenAreLoading, int countChildsFound, const QFont &font, int height) const;
0126 
0127     BasketTreeListView *m_basketTree;
0128 };
0129 
0130 #endif // BASKETLISTVIEW_H