1 /*
2     SPDX-License-Identifier: GPL-2.0-or-later
3 
4     SPDX-FileCopyrightText: 2006-2009 Eike Hein <hein@kde.org>
5 */
6 
7 // FIXME KF5 Port: ViewTree TODO: Close buttons, DND, separator painting.
8 
9 #ifndef VIEWTREE_H
10 #define VIEWTREE_H
11 
12 #include <QStyledItemDelegate>
13 #include <QTreeView>
14 #include <QPointer>
15 
16 class ChatWindow;
17 class ViewTree;
18 
19 class ViewTreeDelegate : public QStyledItemDelegate
20 {
21     Q_OBJECT
22 
23     public:
24         explicit ViewTreeDelegate(ViewTree *parent = nullptr);
25         ~ViewTreeDelegate() override;
26 
27         QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override;
28         QSize preferredSizeHint(const QModelIndex& index) const;
29 
30         void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
31 
32     private:
33         ViewTree* m_view;
34 
35         Q_DISABLE_COPY(ViewTreeDelegate)
36 };
37 
38 class ViewTree : public QTreeView
39 {
40     Q_OBJECT
41 
42     public:
43         explicit ViewTree(QWidget *parent);
44         ~ViewTree() override;
45 
46         void setModel(QAbstractItemModel *model) override;
47 
48         bool dropIndicatorOnItem() const;
49 
50     public Q_SLOTS:
51         void updateAppearance();
52         void selectView(const QModelIndex &index);
53 
54     Q_SIGNALS:
55         void sizeChanged();
56         void showView(ChatWindow* view);
57         void closeView(ChatWindow* view);
58         void showViewContextMenu(QWidget* widget, const QPoint& point);
59 
60     protected:
61         bool event(QEvent* event) override;
62         void paintEvent(QPaintEvent* event) override;
63         void drawRow(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
64         void resizeEvent(QResizeEvent* event) override;
65         void mousePressEvent(QMouseEvent* event) override;
66         void mouseReleaseEvent(QMouseEvent* event) override;
67         void mouseMoveEvent(QMouseEvent *event) override;
68         void dragEnterEvent(QDragEnterEvent *event) override;
69         void dragMoveEvent(QDragMoveEvent *event) override;
70         void contextMenuEvent(QContextMenuEvent* event) override;
71         void wheelEvent(QWheelEvent* event) override;
72         void keyPressEvent(QKeyEvent* event) override;
73 
74     private Q_SLOTS:
75         void selectionChanged(const QItemSelection& selected, const QItemSelection& deselected) override;
76 
77     private:
78         QPointer<ChatWindow> m_pressedView;
79 
80         QPoint m_pressPos;
81 
82         int m_accumulatedWheelDelta;
83         bool m_lastWheelDeltaDirection;
84 
85         Q_DISABLE_COPY(ViewTree)
86 };
87 
88 #endif
89