libqapt/utils/qapt-deb-installer/DebViewer.cpp

293 lines
10 KiB
C++

/***************************************************************************
* Copyright © 2011 Jonathan Thomas <echidnaman@kubuntu.org> *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License or (at your option) version 3 or any later version *
* accepted by the membership of KDE e.V. (or its successor approved *
* by the membership of KDE e.V.), which shall act as a proxy *
* defined in Section 14 of version 3 of the license. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
***************************************************************************/
#include "DebViewer.h"
#include <QDebug>
#include <QDir>
#include <QFile>
#include <QIcon>
#include <QLabel>
#include <QPointer>
#include <QPushButton>
#include <QStringBuilder>
#include <QTabWidget>
#include <QTextBrowser>
#include <QVBoxLayout>
#include <KFormat>
#include <KLocalizedString>
#include <QApt/Backend>
#include <QApt/DebFile>
#include "ChangesDialog.h"
DebViewer::DebViewer(QWidget *parent)
: QWidget(parent)
, m_backend(nullptr)
, m_debFile(nullptr)
{
QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->setMargin(0);
setLayout(mainLayout);
// Header
QWidget *headerWidget = new QWidget(this);
QHBoxLayout *headerLayout = new QHBoxLayout(headerWidget);
headerLayout->setMargin(0);
headerWidget->setLayout(headerLayout);
m_iconLabel = new QLabel(headerWidget);
QWidget *headerSpacer = new QWidget(headerWidget);
headerSpacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
// Name/status box in header
QWidget *nameStatusBox = new QWidget(headerWidget);
QGridLayout *nameStatusGrid = new QGridLayout(nameStatusBox);
nameStatusBox->setLayout(nameStatusGrid);
// nameStatusGrid, row 0
QLabel *namePrefixLabel = new QLabel(nameStatusBox);
namePrefixLabel->setText(i18nc("@label Label preceding the package name",
"Package:"));
m_nameLabel = new QLabel(nameStatusBox);
nameStatusGrid->addWidget(namePrefixLabel, 0, 0, Qt::AlignRight);
nameStatusGrid->addWidget(m_nameLabel, 0, 1, Qt::AlignLeft);
// nameStatusGrid, row 1
QLabel *statusPrefixLabel = new QLabel(nameStatusBox);
statusPrefixLabel->setText(i18nc("@label Label preceding the package status",
"Status:"));
m_statusLabel = new QLabel(nameStatusBox);
m_detailsButton = new QPushButton(i18nc("@label", "Details..."), nameStatusBox);
m_detailsButton->hide();
connect(m_detailsButton, SIGNAL(clicked()), this, SLOT(detailsButtonClicked()));
nameStatusGrid->addWidget(statusPrefixLabel, 1, 0, Qt::AlignRight);
nameStatusGrid->addWidget(m_statusLabel, 1, 1, Qt::AlignLeft);
nameStatusGrid->addWidget(m_detailsButton, 1, 2, Qt::AlignLeft);
headerLayout->addWidget(m_iconLabel);
headerLayout->addWidget(nameStatusBox);
headerLayout->addWidget(headerSpacer);
// Version info box
m_versionInfoWidget = new QWidget(this);
QHBoxLayout *versionInfoLayout = new QHBoxLayout(m_versionInfoWidget);
m_versionInfoWidget->setLayout(versionInfoLayout);
QLabel *infoIcon = new QLabel(m_versionInfoWidget);
infoIcon->setPixmap(QIcon::fromTheme("dialog-information").pixmap(32, 32));
QWidget *verInfoBox = new QWidget(m_versionInfoWidget);
verInfoBox->setLayout(new QVBoxLayout);
m_versionTitleLabel = new QLabel(verInfoBox);
m_versionInfoLabel = new QLabel(verInfoBox);
verInfoBox->layout()->addWidget(m_versionTitleLabel);
verInfoBox->layout()->addWidget(m_versionInfoLabel);
QWidget *versionSpacer = new QWidget(m_versionInfoWidget);
versionSpacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
versionInfoLayout->addWidget(infoIcon);
versionInfoLayout->addWidget(verInfoBox);
versionInfoLayout->addWidget(versionSpacer);
//
// Details tab widget
QTabWidget *detailsWidget = new QTabWidget(this);
QWidget *descriptionTab = new QWidget(detailsWidget);
descriptionTab->setLayout(new QVBoxLayout);
m_descriptionWidget = new QTextBrowser(descriptionTab);
descriptionTab->layout()->addWidget(m_descriptionWidget);
QWidget *detailsTab = new QWidget(detailsWidget);
QGridLayout *detailsGrid = new QGridLayout(detailsTab);
detailsTab->setLayout(detailsGrid);
// detailsGrid, row 1
QLabel *versionPrefixLabel = new QLabel(detailsTab);
versionPrefixLabel->setText(i18nc("@label Label preceding the package version",
"Version:"));
m_versionLabel = new QLabel(detailsTab);
detailsGrid->addWidget(versionPrefixLabel, 0, 0, Qt::AlignRight);
detailsGrid->addWidget(m_versionLabel, 0, 1, Qt::AlignLeft);
// detailsGrid, row 2
QLabel *sizePrefixLabel = new QLabel(detailsTab);
sizePrefixLabel->setText(i18nc("@label Label preceding the package size",
"Installed Size:"));
m_sizeLabel = new QLabel(detailsTab);
detailsGrid->addWidget(sizePrefixLabel, 1, 0, Qt::AlignRight);
detailsGrid->addWidget(m_sizeLabel, 1, 1, Qt::AlignLeft);
// detailsGrid, row 3
QLabel *maintainerPrefixLabel = new QLabel(detailsTab);
maintainerPrefixLabel->setText(i18nc("@label Label preceding the package maintainer",
"Maintainer:"));
m_maintainerLabel = new QLabel(detailsTab);
detailsGrid->addWidget(maintainerPrefixLabel, 2, 0, Qt::AlignRight);
detailsGrid->addWidget(m_maintainerLabel, 2, 1, Qt::AlignLeft);
// detailsGrid, row 4
QLabel *sectionPrefixLabel = new QLabel(detailsTab);
sectionPrefixLabel->setText(i18nc("@label Label preceding the package category",
"Category:"));
m_sectionLabel = new QLabel(detailsTab);
detailsGrid->addWidget(sectionPrefixLabel, 3, 0, Qt::AlignRight);
detailsGrid->addWidget(m_sectionLabel, 3, 1, Qt::AlignLeft);
// detailsGrid, row 4
QLabel *homepagePrefixLabel = new QLabel(detailsTab);
homepagePrefixLabel->setText(i18nc("@label Label preceding the package homepage",
"Homepage:"));
m_homepageLabel = new QLabel(detailsTab);
detailsGrid->addWidget(homepagePrefixLabel, 4, 0, Qt::AlignRight);
detailsGrid->addWidget(m_homepageLabel, 4, 1, Qt::AlignLeft);
detailsGrid->setColumnStretch(1, 1);
detailsGrid->setRowStretch(5, 1);
QWidget *fileTab = new QWidget(detailsWidget);
fileTab->setLayout(new QVBoxLayout);
m_fileWidget = new QTextBrowser(fileTab);
fileTab->layout()->addWidget(m_fileWidget);
detailsWidget->addTab(descriptionTab, i18nc("@title:tab", "Description"));
detailsWidget->addTab(detailsTab, i18nc("@title:tab", "Details"));
detailsWidget->addTab(fileTab, i18nc("@title:tab", "Included Files"));
mainLayout->addWidget(headerWidget);
mainLayout->addWidget(m_versionInfoWidget);
mainLayout->addWidget(detailsWidget);
}
DebViewer::~DebViewer()
{
}
void DebViewer::setBackend(QApt::Backend *backend)
{
m_backend = backend;
m_oldCacheState = m_backend->currentCacheState();
}
void DebViewer::setDebFile(QApt::DebFile *debFile)
{
m_debFile = debFile;
QStringList iconList = m_debFile->iconList();
qSort(iconList);
// Try to get the biggest icon, which should be last
QString iconPath;
if (!iconList.isEmpty()) {
iconPath = iconList.last();
}
QDir tempDir = QDir::temp();
tempDir.mkdir(QLatin1String("qapt-deb-installer"));
QString destPath = QDir::tempPath() + QLatin1String("/qapt-deb-installer/");
m_debFile->extractFileFromArchive(iconPath, destPath);
QIcon icon;
QString finalPath = destPath + iconPath;
if (QFile::exists(destPath + iconPath)) {
icon = QIcon(finalPath);
}
if (iconPath.isEmpty()) {
icon = QIcon::fromTheme("application-x-deb");
}
m_iconLabel->setPixmap(icon.pixmap(48,48));
m_nameLabel->setText(debFile->packageName());
// Details tab widgets
QString shortDesc = debFile->shortDescription();
shortDesc.prepend(QLatin1String("<b>"));
shortDesc.append(QLatin1String("</b><br><br>"));
QString longDesc = debFile->longDescription();
longDesc.replace('\n', QLatin1String("<br>"));
m_descriptionWidget->append(shortDesc + longDesc);
m_versionLabel->setText(debFile->version());
m_sizeLabel->setText(KFormat().formatByteSize(debFile->installedSize() * 1024));
m_maintainerLabel->setText(debFile->maintainer());
m_sectionLabel->setText(debFile->section());
m_homepageLabel->setText(debFile->homepage());
QStringList fileList = debFile->fileList();
qSort(fileList);
QString filesString;
foreach (const QString &file, fileList) {
if (!file.trimmed().isEmpty()) {
filesString.append(file + '\n');
}
}
m_fileWidget->setPlainText(filesString);
}
void DebViewer::setStatusText(const QString &text)
{
m_statusLabel->setText(text);
}
void DebViewer::showDetailsButton(bool show)
{
m_detailsButton->setVisible(show);
}
void DebViewer::hideVersionInfo()
{
m_versionInfoWidget->hide();
}
void DebViewer::setVersionTitle(const QString &title)
{
m_versionTitleLabel->setText(title);
}
void DebViewer::setVersionInfo(const QString &info)
{
m_versionInfoLabel->setText(info);
}
void DebViewer::detailsButtonClicked()
{
QList<QApt::Package *> excluded;
excluded.append(m_backend->package(m_debFile->packageName()));
auto changes = m_backend->stateChanges(m_oldCacheState, excluded);
if (changes.isEmpty()) {
return;
}
QPointer<ChangesDialog> dialog = new ChangesDialog(this, changes);
dialog->exec();
}