wireshark/ui/qt/widgets/copy_from_profile_button.cpp

136 lines
3.7 KiB
C++

/* copy_from_profile_button.cpp
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include <ui/qt/widgets/copy_from_profile_button.h>
#include <ui/qt/models/profile_model.h>
#include <wsutil/filesystem.h>
#include <QDir>
#include <QFileInfo>
#include <QMenu>
#include <QAction>
CopyFromProfileButton::CopyFromProfileButton(QWidget * parent, QString fileName, QString toolTip) :
QPushButton(parent),
buttonMenu_(Q_NULLPTR)
{
setText(tr("Copy from"));
if (toolTip.length() == 0)
setToolTip(tr("Copy entries from another profile."));
else {
setToolTip(toolTip);
}
if (fileName.length() > 0)
setFilename(fileName);
}
void CopyFromProfileButton::setFilename(QString filename)
{
setEnabled(false);
if (filename.length() <= 0)
return;
ProfileModel model(this);
QList<QAction *> global;
QList<QAction *> user;
QAction * pa = systemDefault(filename);
if (pa)
global << pa;
if (! buttonMenu_)
buttonMenu_ = new QMenu();
if (buttonMenu_->actions().count() > 0)
buttonMenu_->clear();
for (int cnt = 0; cnt < model.rowCount(); cnt++)
{
QModelIndex idx = model.index(cnt, ProfileModel::COL_NAME);
QString profilePath = idx.data(ProfileModel::DATA_PATH).toString();
if (! idx.isValid() || profilePath.isEmpty())
continue;
if (! idx.data(ProfileModel::DATA_PATH_IS_NOT_DESCRIPTION).toBool() || idx.data(ProfileModel::DATA_IS_SELECTED).toBool())
continue;
QDir profileDir(profilePath);
if (! profileDir.exists())
continue;
QFileInfo fi(profileDir.filePath(filename));
if (! fi.exists())
continue;
if (! config_file_exists_with_entries(fi.absoluteFilePath().toUtf8().constData(), '#'))
continue;
QString name = idx.data().toString();
pa = new QAction(name, this);
if (idx.data(ProfileModel::DATA_IS_DEFAULT).toBool())
buttonMenu_->addAction(pa);
else if (idx.data(ProfileModel::DATA_IS_GLOBAL).toBool())
global << pa;
else
user << pa;
pa->setFont(idx.data(Qt::FontRole).value<QFont>());
pa->setProperty("profile_name", name);
pa->setProperty("profile_is_global", idx.data(ProfileModel::DATA_IS_GLOBAL));
pa->setProperty("profile_filename", fi.absoluteFilePath());
}
buttonMenu_->addActions(user);
if (global.count() > 0)
{
if (actions().count() > 0)
buttonMenu_->addSeparator();
buttonMenu_->addActions(global);
}
if (buttonMenu_->actions().count() <= 0)
return;
connect(buttonMenu_, &QMenu::triggered, this, &CopyFromProfileButton::menuActionTriggered);
setMenu(buttonMenu_);
setEnabled(true);
}
// "System default" is not a profile.
// Add a special entry for this if the filename exists.
QAction * CopyFromProfileButton::systemDefault(QString filename)
{
QAction * data = Q_NULLPTR;
QDir dataDir(get_datafile_dir());
QString path = dataDir.filePath(filename);
if (QFile::exists(path))
{
data = new QAction(tr("System default"), this);
data->setData(path);
QFont font = data->font();
font.setItalic(true);
data->setFont(font);
}
return data;
}
void CopyFromProfileButton::menuActionTriggered(QAction * action)
{
if (action->property("profile_filename").toString().length() > 0)
{
QString filename = action->property("profile_filename").toString();
if (QFileInfo::exists(filename))
emit copyProfile(filename);
}
}