6#include "ui_signalslotdialog.h"
13#include <QtDesigner/membersheet.h>
14#include <QtDesigner/qextensionmanager.h>
15#include <QtDesigner/abstractformeditor.h>
16#include <QtDesigner/abstractformwindow.h>
17#include <QtDesigner/abstractwidgetfactory.h>
18#include <abstractdialoggui_p.h>
20#include <QtGui/qstandarditemmodel.h>
21#include <QtGui/qvalidator.h>
22#include <QtWidgets/qstyleditemdelegate.h>
23#include <QtWidgets/qlineedit.h>
24#include <QtWidgets/qapplication.h>
25#include <QtWidgets/qmessagebox.h>
27#include <QtCore/qregularexpression.h>
28#include <QtCore/qdebug.h>
32using namespace Qt::StringLiterals;
41 QStandardItem *rc =
new QStandardItem(text);
42 rc->setFlags(Qt::ItemIsEnabled|Qt::ItemIsEditable|Qt::ItemIsSelectable);
48 QStandardItem *rc =
new QStandardItem(text);
49 Qt::ItemFlags flags = rc->flags();
50 rc->setFlags(flags & ~(Qt::ItemIsEnabled|Qt::ItemIsEditable|Qt::ItemIsSelectable));
57 class SignatureDelegate :
public QStyledItemDelegate {
59 SignatureDelegate(QObject * parent =
nullptr);
60 QWidget * createEditor (
QWidget * parent,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const override;
61 void setModelData (
QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index)
const override;
64 const QRegularExpression m_signatureRegexp;
65 const QRegularExpression m_methodNameRegexp;
68 SignatureDelegate::SignatureDelegate(QObject * parent) :
69 QStyledItemDelegate(parent),
70 m_signatureRegexp(signatureRegExp),
71 m_methodNameRegexp(methodNameRegExp)
73 Q_ASSERT(m_signatureRegexp.isValid());
74 Q_ASSERT(m_methodNameRegexp.isValid());
77 QWidget * SignatureDelegate::createEditor (
QWidget * parent,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const
79 QWidget *rc = QStyledItemDelegate::createEditor(parent, option, index);
80 QLineEdit *le = qobject_cast<QLineEdit *>(rc);
82 le->setValidator(
new QRegularExpressionValidator(m_signatureRegexp, le));
86 void SignatureDelegate::setModelData(
QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index )
const
88 QLineEdit *le = qobject_cast<QLineEdit *>(editor);
91 QString signature = le->text();
92 if (!m_signatureRegexp.match(signature).hasMatch()) {
93 if (m_methodNameRegexp.match(signature).hasMatch()) {
95 le->setText(signature);
100 QStyledItemDelegate::setModelData(editor, model, index);
104 class FakeMethodMetaDBCommand :
public qdesigner_internal::QDesignerFormWindowCommand {
107 explicit FakeMethodMetaDBCommand(QDesignerFormWindowInterface *formWindow);
109 void init(QObject *o,
110 const QStringList &oldFakeSlots,
const QStringList &oldFakeSignals,
111 const QStringList &newFakeSlots,
const QStringList &newFakeSignals);
115 qdesigner_internal::SignalSlotDialog::fakeMethodsToMetaDataBase(core(), m_object,
116 m_oldFakeSlots, m_oldFakeSignals);
120 qdesigner_internal::SignalSlotDialog::fakeMethodsToMetaDataBase(core(), m_object,
121 m_newFakeSlots, m_newFakeSignals);
126 QStringList m_oldFakeSlots;
127 QStringList m_oldFakeSignals;
128 QStringList m_newFakeSlots;
129 QStringList m_newFakeSignals;
132 FakeMethodMetaDBCommand::FakeMethodMetaDBCommand(QDesignerFormWindowInterface *formWindow) :
133 qdesigner_internal::QDesignerFormWindowCommand(QApplication::translate(
"Command",
"Change signals/slots"), formWindow),
138 void FakeMethodMetaDBCommand::init(QObject *o,
139 const QStringList &oldFakeSlots,
const QStringList &oldFakeSignals,
140 const QStringList &newFakeSlots,
const QStringList &newFakeSignals)
143 m_oldFakeSlots = oldFakeSlots;
144 m_oldFakeSignals = oldFakeSignals;
145 m_newFakeSlots = newFakeSlots;
146 m_newFakeSignals = newFakeSignals;
155 m_existingMethods.clear();
156 m_fakeMethods.clear();
161 QStandardItemModel(parent)
167 if (role != Qt::EditRole)
168 return QStandardItemModel::setData(index, value, role);
170 const QStandardItem *item = itemFromIndex(index);
172 const QString signature = value.toString();
173 if (item->text() == signature)
177 emit checkSignature(signature, &ok);
181 return QStandardItemModel::setData(index, value, role);
185SignaturePanel::SignaturePanel(QObject *parent, QListView *listView, QToolButton *addButton, QToolButton *removeButton,
const QString &newPrefix) :
187 m_newPrefix(newPrefix),
188 m_model(
new SignatureModel(
this)),
189 m_listView(listView),
190 m_removeButton(removeButton)
192 m_removeButton->setEnabled(
false);
194 connect(addButton, &QAbstractButton::clicked,
this, &SignaturePanel::slotAdd);
195 connect(m_removeButton, &QAbstractButton::clicked,
this, &
SignaturePanel::slotRemove);
197 m_listView->setModel(m_model);
198 SignatureDelegate *delegate =
new SignatureDelegate(
this);
199 m_listView->setItemDelegate(delegate);
200 connect(m_model, &SignatureModel::checkSignature,
201 this, &SignaturePanel::checkSignature);
202 connect(m_listView->selectionModel(), &QItemSelectionModel::selectionChanged,
208 m_listView->selectionModel()->clearSelection();
210 for (
int i = 1; ; i++) {
212 QString newSlot = m_newPrefix + QString::number(i) + u'(';
214 if (m_model->findItems(newSlot, Qt::MatchStartsWith, 0).isEmpty()) {
216 QStandardItem * item = createEditableItem(newSlot);
217 m_model->appendRow(item);
218 const QModelIndex index = m_model->indexFromItem (item);
219 m_listView->setCurrentIndex (index);
220 m_listView->edit(index);
228 return m_model->findItems(signature).size();
233 const QModelIndexList selectedIndexes = m_listView->selectionModel()->selectedIndexes ();
234 if (selectedIndexes.isEmpty())
239 if (
const int row = selectedIndexes.constFirst().row())
240 m_listView->setCurrentIndex (selectedIndexes.constFirst().sibling(row - 1, 0));
242 for (
auto i = selectedIndexes.size() - 1; i >= 0; --i)
243 qDeleteAll(m_model->takeRow(selectedIndexes.at(i).row()));
246void SignaturePanel::slotSelectionChanged(
const QItemSelection &selected,
const QItemSelection &)
248 m_removeButton->setEnabled(!selected.indexes().isEmpty());
255 QStandardItem *lastExisting =
nullptr;
256 for (
const QString &s : d.m_existingMethods) {
257 lastExisting = createDisabledItem(s);
258 m_model->appendRow(lastExisting);
260 for (
const QString &s : d.m_fakeMethods)
261 m_model->appendRow(createEditableItem(s));
263 m_listView->scrollTo(m_model->indexFromItem(lastExisting));
269 if (
const int rowCount = m_model->rowCount())
270 for (
int i = 0; i < rowCount; i++) {
271 const QStandardItem *item = m_model->item(i);
272 if (item->flags() & Qt::ItemIsEditable)
280 const QModelIndex idx = m_listView->currentIndex();
282 m_listView->closePersistentEditor(idx);
507#include "moc_signalslotdialog_p.cpp"
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
\reimp
void setData(const SignalSlotDialogData &d)
QStringList fakeMethods() const
Combined button and popup list for selecting options.
Auxiliary methods to store/retrieve settings.
static QStandardItem * createDisabledItem(const QString &text)
static constexpr auto methodNameRegExp
static constexpr auto signatureRegExp
static QStandardItem * createEditableItem(const QString &text)