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 
15 ColoringRulesDelegate::ColoringRulesDelegate(QObject *parent) : QStyledItemDelegate(parent)
16 {
17 }
18 
19 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 
42 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 
64 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 
105 void ColoringRulesDelegate::updateEditorGeometry(QWidget *editor,
106         const QStyleOptionViewItem &option, const QModelIndex&) const
107 {
108     editor->setGeometry(option.rect);
109 }
110 
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