1 /* coloring_rules_delegate.cpp
2 * Delegates for editing various coloring rule fields.
3 *
4 * Wireshark - Network traffic analyzer
5 * By Gerald Combs <gerald@wireshark.org>
6 * Copyright 1998 Gerald Combs
7 *
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 */
10
11 #include <ui/qt/models/coloring_rules_delegate.h>
12 #include <ui/qt/models/coloring_rules_model.h>
13 #include <ui/qt/widgets/display_filter_edit.h>
14
ColoringRulesDelegate(QObject * parent)15 ColoringRulesDelegate::ColoringRulesDelegate(QObject *parent) : QStyledItemDelegate(parent)
16 {
17 }
18
createEditor(QWidget * parent,const QStyleOptionViewItem &,const QModelIndex & index) const19 QWidget* ColoringRulesDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem&,
20 const QModelIndex &index) const
21 {
22 switch (index.column())
23 {
24 case ColoringRulesModel::colName:
25 {
26 SyntaxLineEdit *editor = new SyntaxLineEdit(parent);
27 connect(editor, &SyntaxLineEdit::textChanged, this, &ColoringRulesDelegate::ruleNameChanged);
28 return editor;
29 }
30
31 case ColoringRulesModel::colFilter:
32 return new DisplayFilterEdit(parent);
33
34 default:
35 Q_ASSERT(FALSE);
36 return 0;
37 }
38
39 return 0;
40 }
41
setEditorData(QWidget * editor,const QModelIndex & index) const42 void ColoringRulesDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
43 {
44 switch (index.column())
45 {
46 case ColoringRulesModel::colName:
47 {
48 SyntaxLineEdit *syntaxEdit = static_cast<SyntaxLineEdit*>(editor);
49 syntaxEdit->setText(index.model()->data(index, Qt::EditRole).toString());
50 break;
51 }
52 case ColoringRulesModel::colFilter:
53 {
54 DisplayFilterEdit *displayEdit = static_cast<DisplayFilterEdit*>(editor);
55 displayEdit->setText(index.model()->data(index, Qt::EditRole).toString());
56 break;
57 }
58 default:
59 QStyledItemDelegate::setEditorData(editor, index);
60 break;
61 }
62 }
63
setModelData(QWidget * editor,QAbstractItemModel * model,const QModelIndex & index) const64 void ColoringRulesDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
65 const QModelIndex &index) const
66 {
67 switch (index.column())
68 {
69 case ColoringRulesModel::colName:
70 {
71 SyntaxLineEdit *syntaxEdit = static_cast<SyntaxLineEdit*>(editor);
72 model->setData(index, syntaxEdit->text(), Qt::EditRole);
73 if (syntaxEdit->syntaxState() == SyntaxLineEdit::Invalid) {
74 QString error_text = tr("the \"@\" symbol will be ignored.");
75 emit invalidField(index, error_text);
76 }
77 else
78 {
79 emit validField(index);
80 }
81 break;
82 }
83 case ColoringRulesModel::colFilter:
84 {
85 DisplayFilterEdit *displayEdit = static_cast<DisplayFilterEdit*>(editor);
86 model->setData(index, displayEdit->text(), Qt::EditRole);
87 if ((displayEdit->syntaxState() == SyntaxLineEdit::Invalid) &&
88 (model->data(model->index(index.row(), ColoringRulesModel::colName), Qt::CheckStateRole) == Qt::Checked))
89 {
90 model->setData(model->index(index.row(), ColoringRulesModel::colName), Qt::Unchecked, Qt::CheckStateRole);
91 emit invalidField(index, displayEdit->syntaxErrorMessage());
92 }
93 else
94 {
95 emit validField(index);
96 }
97 break;
98 }
99 default:
100 QStyledItemDelegate::setModelData(editor, model, index);
101 break;
102 }
103 }
104
updateEditorGeometry(QWidget * editor,const QStyleOptionViewItem & option,const QModelIndex &) const105 void ColoringRulesDelegate::updateEditorGeometry(QWidget *editor,
106 const QStyleOptionViewItem &option, const QModelIndex&) const
107 {
108 editor->setGeometry(option.rect);
109 }
110
ruleNameChanged(const QString name)111 void ColoringRulesDelegate::ruleNameChanged(const QString name)
112 {
113 SyntaxLineEdit *name_edit = qobject_cast<SyntaxLineEdit*>(QObject::sender());
114 if (!name_edit) return;
115
116 if (name.isEmpty()) {
117 name_edit->setSyntaxState(SyntaxLineEdit::Empty);
118 } else if (name.contains("@")) {
119 name_edit->setSyntaxState(SyntaxLineEdit::Invalid);
120 } else {
121 name_edit->setSyntaxState(SyntaxLineEdit::Valid);
122 }
123 }
124