view ui/certificateitemwidget.cpp @ 780:9f13c00a2647

Make certificate text selectable
author Andre Heinecke <andre.heinecke@intevation.de>
date Mon, 14 Jul 2014 11:50:02 +0200
parents b6172b9f885d
children 4eff77851e76
line wrap: on
line source
/* Copyright (C) 2014 by Bundesamt für Sicherheit in der Informationstechnik
 * Software engineering by Intevation GmbH
 *
 * This file is Free Software under the GNU GPL (v>=2)
 * and comes with ABSOLUTELY NO WARRANTY!
 * See LICENSE.txt for details.
 */
#include "certificateitemwidget.h"

#include <QHBoxLayout>
#include <QDebug>
#include <QStyleFactory>

CertificateItemWidget::CertificateItemWidget(QWidget *parent,
                                             const Certificate &cert,
                                             bool state,
                                             bool editable,
                                             const QString &installLabel,
                                             const QString &removeLabel) :
    QWidget(parent),
    mInstallLabel (installLabel),
    mRemoveLabel (removeLabel)
{
    mCertificate = cert;
    mState = state;
    mEditable = editable;
    setupGUI();
}


/* We use the label as data to hide it in the normal dropdown menu and only
 * show it when the popup is shown.*/

void CertificateItemWidget::setupGUI()
{
    mLabel = new QLabel;
    mComboBox = new IconOnlyTextPopupBox;
    QStyle *fusionStyle = QStyleFactory::create("Fusion");
    if (!fusionStyle) {
        qDebug() << "Failed to create fusion style";
    } else {
        mComboBox->setStyle(fusionStyle);
    }

    mComboBox->setIconSize(QSize(48, 48));
    mComboBox->setFixedWidth(68);

    const QString validity = tr("Valid: %1 until %2").arg(
            QLocale::system().toString(mCertificate.validFrom().date(), QLocale::ShortFormat)).arg(
            QLocale::system().toString(mCertificate.validTo().date(), QLocale::ShortFormat));
    const QString fpstring = tr("Fingerprint (SHA1): &lt;%1&gt;").arg(mCertificate.fingerprint());
    mLabel->setText(QString::fromLatin1("<big><b>%1</b><br/>%2<br/>%3<br/>%4</big>").arg
        (mCertificate.subjectCN()).arg(mCertificate.subjectO()).arg(validity).arg
        (fpstring));
    mLabel->setTextFormat(Qt::RichText);

    mLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

    mLabel->setTextInteractionFlags(
        Qt::TextSelectableByMouse |
        Qt::TextSelectableByKeyboard);
    mComboBox->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
    connect(mComboBox, SIGNAL(currentIndexChanged(int)),
        this, SLOT(currentStateChanged(int)));

    QHBoxLayout *layout = new QHBoxLayout;
    if (mCertificate.isInstallCert()) {
        mComboBox->addItem(QIcon(":/img/security-high.png"), QString(), mInstallLabel);
        mComboBox->addItem(QIcon(":/img/security-low.png"), QString(), mRemoveLabel);
        if (mState)
            mComboBox->setCurrentIndex(0);
        else {
            mComboBox->setCurrentIndex(1);
        }
        layout->addWidget(mComboBox);
    }
    else if (!mCertificate.isInstallCert() && !mEditable){
        QImage *img = new QImage(":/img/trash-empty.png");
        QLabel *imgLabel = new QLabel;
        imgLabel->setPixmap(QPixmap::fromImage(*img));
        imgLabel->setFixedSize(48, 48);
        imgLabel->setMargin(2);
        layout->addWidget(imgLabel);
    }
    else {
        mComboBox->addItem(QIcon(":/img/trash-empty.png"), QString(), tr("uninstall"));
        mComboBox->addItem(QIcon(":/img/security-medium.png"), QString(), tr("keep"));
        if (mState)
            mComboBox->setCurrentIndex(0);
        else {
            mComboBox->setCurrentIndex(1);
        }
        layout->addWidget(mComboBox);
    }
    layout->addWidget(mLabel);
    this->setLayout(layout);
}

bool CertificateItemWidget::state()
{
    if (!mEditable) {
        return true;
    }

    const QString currentString = mComboBox->currentData().toString();

    if (!mCertificate.isInstallCert()) {
        return currentString == tr("uninstall");
    }

    return currentString == mInstallLabel;
}

void CertificateItemWidget::setState(bool state)
{
    disconnect(mComboBox, SIGNAL(currentIndexChanged(int)),
        this, SLOT(currentStateChanged(int)));

    if (state) {
        mComboBox->setCurrentIndex(0);
    }
    else {
        mComboBox->setCurrentIndex(1);
    }
    connect(mComboBox, SIGNAL(currentIndexChanged(int)),
        this, SLOT(currentStateChanged(int)));
}

Certificate CertificateItemWidget::certificate()
{
    return mCertificate;
}

void CertificateItemWidget::currentStateChanged(int)
{
    bool state = mComboBox->currentData().toBool();
    emit stateChanged(state, mCertificate);
}

void IconOnlyTextPopupBox::showPopup() {
    for (int i = 0; i < count(); i++) {
        setItemText(i, itemData(i).toString());
    }
    QComboBox::showPopup();
}

void IconOnlyTextPopupBox::hidePopup() {
    for (int i = 0; i < count(); i++) {
        setItemText(i, QString());
    }
    QComboBox::hidePopup();
}

http://wald.intevation.org/projects/trustbridge/