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