1 /* copy_from_profile_button.cpp
2 *
3 * Wireshark - Network traffic analyzer
4 * By Gerald Combs <gerald@wireshark.org>
5 * Copyright 1998 Gerald Combs
6 *
7 * SPDX-License-Identifier: GPL-2.0-or-later
8 */
9
10 #include <ui/qt/widgets/copy_from_profile_button.h>
11 #include <ui/qt/models/profile_model.h>
12 #include <wsutil/filesystem.h>
13
14 #include <QDir>
15 #include <QFileInfo>
16 #include <QMenu>
17 #include <QAction>
18
CopyFromProfileButton(QWidget * parent,QString fileName,QString toolTip)19 CopyFromProfileButton::CopyFromProfileButton(QWidget * parent, QString fileName, QString toolTip) :
20 QPushButton(parent),
21 buttonMenu_(Q_NULLPTR)
22 {
23 setText(tr("Copy from"));
24 if (toolTip.length() == 0)
25 setToolTip(tr("Copy entries from another profile."));
26 else {
27 setToolTip(toolTip);
28 }
29
30 if (fileName.length() > 0)
31 setFilename(fileName);
32 }
33
setFilename(QString filename)34 void CopyFromProfileButton::setFilename(QString filename)
35 {
36 setEnabled(false);
37
38 if (filename.length() <= 0)
39 return;
40
41 ProfileModel model(this);
42
43 QList<QAction *> global;
44 QList<QAction *> user;
45
46 QAction * pa = systemDefault(filename);
47 if (pa)
48 global << pa;
49
50 if (! buttonMenu_)
51 buttonMenu_ = new QMenu();
52
53 if (buttonMenu_->actions().count() > 0)
54 buttonMenu_->clear();
55
56 for (int cnt = 0; cnt < model.rowCount(); cnt++)
57 {
58 QModelIndex idx = model.index(cnt, ProfileModel::COL_NAME);
59 QString profilePath = idx.data(ProfileModel::DATA_PATH).toString();
60 if (! idx.isValid() || profilePath.isEmpty())
61 continue;
62
63 if (! idx.data(ProfileModel::DATA_PATH_IS_NOT_DESCRIPTION).toBool() || idx.data(ProfileModel::DATA_IS_SELECTED).toBool())
64 continue;
65
66 QDir profileDir(profilePath);
67 if (! profileDir.exists())
68 continue;
69
70 QFileInfo fi = profileDir.filePath(filename);
71 if (! fi.exists())
72 continue;
73
74 if (! config_file_exists_with_entries(fi.absoluteFilePath().toUtf8().constData(), '#'))
75 continue;
76
77 QString name = idx.data().toString();
78 pa = new QAction(name, this);
79 if (idx.data(ProfileModel::DATA_IS_DEFAULT).toBool())
80 buttonMenu_->addAction(pa);
81 else if (idx.data(ProfileModel::DATA_IS_GLOBAL).toBool())
82 global << pa;
83 else
84 user << pa;
85
86 pa->setFont(idx.data(Qt::FontRole).value<QFont>());
87 pa->setProperty("profile_name", name);
88 pa->setProperty("profile_is_global", idx.data(ProfileModel::DATA_IS_GLOBAL));
89 pa->setProperty("profile_filename", fi.absoluteFilePath());
90 }
91
92 buttonMenu_->addActions(user);
93 if (global.count() > 0)
94 {
95 if (actions().count() > 0)
96 buttonMenu_->addSeparator();
97 buttonMenu_->addActions(global);
98 }
99 if (buttonMenu_->actions().count() <= 0)
100 return;
101
102 connect(buttonMenu_, &QMenu::triggered, this, &CopyFromProfileButton::menuActionTriggered);
103 setMenu(buttonMenu_);
104 setEnabled(true);
105 }
106
107 // "System default" is not a profile.
108 // Add a special entry for this if the filename exists.
systemDefault(QString filename)109 QAction * CopyFromProfileButton::systemDefault(QString filename)
110 {
111 QAction * data = Q_NULLPTR;
112
113 QDir dataDir(get_datafile_dir());
114 QString path = dataDir.filePath(filename);
115 if (QFile::exists(path))
116 {
117 data = new QAction(tr("System default"), this);
118 data->setData(path);
119 QFont font = data->font();
120 font.setItalic(true);
121 data->setFont(font);
122 }
123
124 return data;
125 }
126
menuActionTriggered(QAction * action)127 void CopyFromProfileButton::menuActionTriggered(QAction * action)
128 {
129 if (action->property("profile_filename").toString().length() > 0)
130 {
131 QString filename = action->property("profile_filename").toString();
132 if (QFileInfo::exists(filename))
133 emit copyProfile(filename);
134 }
135 }
136