1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the Qt Designer of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:GPL-EXCEPT$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21 ** included in the packaging of this file. Please review the following
22 ** information to ensure the GNU General Public License requirements will
23 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24 **
25 ** $QT_END_LICENSE$
26 **
27 ****************************************************************************/
28 
29 //
30 //  W A R N I N G
31 //  -------------
32 //
33 // This file is not part of the Qt API.  It exists for the convenience
34 // of Qt Designer.  This header
35 // file may change from version to version without notice, or even be removed.
36 //
37 // We mean it.
38 //
39 
40 #ifndef _SIGNALSLOTDIALOG_H
41 #define _SIGNALSLOTDIALOG_H
42 
43 #include "shared_global_p.h"
44 #include <QtCore/qstringlist.h>
45 #include <QtWidgets/qdialog.h>
46 #include <QtGui/qstandarditemmodel.h>
47 
48 QT_BEGIN_NAMESPACE
49 
50 class QDesignerFormEditorInterface;
51 class QDesignerFormWindowInterface;
52 class QDesignerDialogGuiInterface;
53 class QDesignerMemberSheet;
54 class QListView;
55 class QToolButton;
56 class QItemSelection;
57 
58 namespace Ui {
59     class SignalSlotDialogClass;
60 }
61 
62 namespace qdesigner_internal {
63 
64 // Dialog data
65 struct SignalSlotDialogData {
66     void clear();
67     QStringList m_existingMethods;
68     QStringList m_fakeMethods;
69 };
70 
71 // Internal helper class: A model for signatures that allows for verifying duplicates
72 // (checking signals versus slots and vice versa).
73 class SignatureModel : public QStandardItemModel {
74     Q_OBJECT
75 
76 public:
77     SignatureModel(QObject *parent = nullptr);
78     bool setData (const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
79 
80 signals:
81     void checkSignature(const QString &signature, bool *ok);
82 };
83 
84 // Internal helper class: Panel for editing method signatures. List view with validator,
85 // add and remove button
86 class SignaturePanel  : public QObject {
87      Q_OBJECT
88 
89 public:
90     SignaturePanel(QObject *parent, QListView *listView, QToolButton *addButton, QToolButton *removeButton, const QString &newPrefix);
91 
92     QStringList fakeMethods() const;
93     void setData(const SignalSlotDialogData &d);
94     int count(const QString &signature) const;
95 
96 signals:
97     void checkSignature(const QString &signature, bool *ok);
98 
99 private slots:
100     void slotAdd();
101     void slotRemove();
102     void slotSelectionChanged(const QItemSelection &, const QItemSelection &);
103 
104 private:
105     void closeEditor();
106 
107     const QString m_newPrefix;
108     SignatureModel *m_model;
109     QListView *m_listView;
110     QToolButton *m_removeButton;
111 };
112 
113 // Dialog for  editing signals and slots.
114 // Provides static convenience function
115 // to modify fake signals and slots. They are
116 // handled in 2 ways:
117 // 1) For the MainContainer: Fake signals and slots are stored
118 //    in the meta database (per-instance)
119 // 2) For promoted widgets: Fake signals and slots are stored
120 //    in the widget database (per-class)
121 // Arguably, we could require the MainContainer to be promoted for that, too,
122 // but that would require entering a header.
123 
124 class QDESIGNER_SHARED_EXPORT SignalSlotDialog : public QDialog {
125     Q_OBJECT
126 
127 public:
128     enum FocusMode { FocusSlots, FocusSignals };
129 
130     explicit SignalSlotDialog(QDesignerDialogGuiInterface *dialogGui, QWidget *parent = nullptr, FocusMode m = FocusSlots);
131     ~SignalSlotDialog() override;
132 
133     DialogCode showDialog(SignalSlotDialogData &slotData, SignalSlotDialogData &signalData);
134 
135     // Edit fake methods stored in MetaDataBase (per instance, used for main containers)
136     static bool editMetaDataBase(QDesignerFormWindowInterface *fw, QObject *object, QWidget *parent = nullptr, FocusMode m = FocusSlots);
137 
138     // Edit fake methods of a promoted class stored in WidgetDataBase (synthesizes a widget to obtain existing members).
139     static bool editPromotedClass(QDesignerFormEditorInterface *core, const QString &promotedClassName, QWidget *parent = nullptr, FocusMode m = FocusSlots);
140     // Edit fake methods of a promoted class stored in WidgetDataBase on a base class instance.
141     static bool editPromotedClass(QDesignerFormEditorInterface *core, QObject *baseObject, QWidget *parent = nullptr, FocusMode m = FocusSlots);
142 
143 private slots:
144     void slotCheckSignature(const QString &signature, bool *ok);
145 
146 private:
147     // Edit fake methods of a promoted class stored in WidgetDataBase using an instance of the base class.
148     static bool editPromotedClass(QDesignerFormEditorInterface *core, const QString &promotedClassName, QObject *baseObject, QWidget *parent, FocusMode m);
149 
150     const FocusMode m_focusMode;
151     Ui::SignalSlotDialogClass *m_ui;
152     QDesignerDialogGuiInterface *m_dialogGui;
153     SignaturePanel *m_slotPanel;
154     SignaturePanel *m_signalPanel;
155 };
156 }
157 
158 QT_END_NAMESPACE
159 
160 #endif
161