aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmldesigner/components/annotationeditor/annotationtableview.h
blob: 138d76fed61b4bc09bfc12ecc3f7a6290721787d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
#pragma once

#include <QItemDelegate>
#include <QLabel>
#include <QPointer>
#include <QTableView>

#include <memory>

#include "annotation.h"
#include "defaultannotations.h"

#include <utils/qtcolorbutton.h>

QT_BEGIN_NAMESPACE
class QStandardItemModel;
class QCompleter;
QT_END_NAMESPACE

namespace QmlDesigner {

class CommentDelegate : public QItemDelegate
{
    Q_OBJECT
public:
    enum Role { CommentRole = Qt::UserRole + 1 };

    CommentDelegate(QObject *parent = nullptr);
    ~CommentDelegate() override;

    DefaultAnnotationsModel *defaultAnnotations() const;
    void setDefaultAnnotations(DefaultAnnotationsModel *);

    QCompleter *completer() const;

    void updateEditorGeometry(QWidget *editor,
                              const QStyleOptionViewItem &option,
                              const QModelIndex &index) const override;

    static Comment comment(QModelIndex const &);

private:
    std::unique_ptr<QCompleter> m_completer;
    QPointer<DefaultAnnotationsModel> m_defaults;
};

class CommentTitleDelegate : public CommentDelegate
{
    Q_OBJECT
public:
    CommentTitleDelegate(QObject *parent = nullptr);
    ~CommentTitleDelegate() override;

    QWidget *createEditor(QWidget *parent,
                          const QStyleOptionViewItem &option,
                          const QModelIndex &index) const override;

    void setEditorData(QWidget *editor, const QModelIndex &index) const override;
    void setModelData(QWidget *editor,
                      QAbstractItemModel *model,
                      const QModelIndex &index) const override;
signals:
    void commentChanged(int row, const QmlDesigner::Comment &comment);
};

class CommentValueDelegate : public CommentDelegate
{
    Q_OBJECT
public:
    CommentValueDelegate(QObject *parent = nullptr);
    ~CommentValueDelegate();

    void paint(QPainter *painter,
               const QStyleOptionViewItem &option,
               const QModelIndex &index) const override;

    void setEditorData(QWidget *editor, const QModelIndex &index) const override;
    void setModelData(QWidget *editor,
                      QAbstractItemModel *model,
                      const QModelIndex &index) const override;

public slots:
    void slotEditorFinished(QWidget* editor);
    void slotEditorCanceled(QWidget* editor);

signals:
    void richTextEditorRequested(int index, QString const &richText);
};

class RichTextCellEditor : public QLabel
{
    Q_OBJECT
    Q_PROPERTY(QmlDesigner::RichTextProxy richText READ richText WRITE setRichText NOTIFY
                   richTextChanged USER true)
public:
    RichTextCellEditor(QWidget *parent = nullptr);
    ~RichTextCellEditor() override;

    RichTextProxy richText() const;
    void setRichText(RichTextProxy const &);

    void setupSignal(int row, QString const &commentTitle);

signals:
    void clicked();
    void richTextChanged();
    void richTextClicked(int index, QString const &text);

protected:
    void mouseReleaseEvent(QMouseEvent *) override;

private:
    RichTextProxy m_richText;
    QMetaObject::Connection m_connection;
};

class AnnotationTableColorButton : public Utils::QtColorButton
{
    Q_OBJECT
public:
    AnnotationTableColorButton(QWidget* parent);
    ~AnnotationTableColorButton();

    bool eventFilter(QObject *object, QEvent *event) override;

signals:
    void editorStarted(QWidget* editor);
    void editorFinished(QWidget* editor);
    void editorCanceled(QWidget* editor);
};

class AnnotationTableView : public QTableView
{
    Q_OBJECT
public:
    AnnotationTableView(QWidget *parent = nullptr);
    ~AnnotationTableView();

    QVector<Comment> fetchComments() const;
    Comment fetchComment(int row) const;
    void setupComments(QVector<Comment> const &comments);

    DefaultAnnotationsModel *defaultAnnotations() const;
    void setDefaultAnnotations(DefaultAnnotationsModel *);

    void changeRow(int index, Comment const &comment);
    void removeRow(int index);
    void removeSelectedRows();

signals:
    void richTextEditorRequested(int index, QString const &commentTitle);

protected:
    void keyPressEvent(QKeyEvent *) override;

private:
    void addEmptyRow();
    bool rowIsEmpty(int row) const;
    static QString dataToCommentText(QVariant const &);
    static QVariant commentToData(Comment const&, QMetaType::Type type);

    CommentTitleDelegate m_titleDelegate;
    CommentValueDelegate m_valueDelegate;

    bool m_modelUpdating = false;
    std::unique_ptr<QStandardItemModel> m_model;
    std::unique_ptr<QItemEditorFactory> m_editorFactory;
    QPointer<DefaultAnnotationsModel> m_defaults;
};
} // namespace QmlDesigner