Optimizations for column formatters, use CVariant directly if a value remains const (no need to always contruct CVariant)

This commit is contained in:
Klaus Basan
2018-06-14 14:39:12 +02:00
parent 348d9f1533
commit 9438462280
2 changed files with 55 additions and 45 deletions

View File

@@ -21,6 +21,7 @@
#include <QMetaType>
#include <QTime>
#include <QVariant>
#include <QScopedPointer>
using namespace BlackMisc;
using namespace BlackMisc::Aviation;
@@ -145,6 +146,12 @@ namespace BlackGui
return e;
}
const CVariant &CDefaultFormatter::emptyPixmapVariant()
{
static const CVariant e = CVariant::from(QPixmap());
return e;
}
CVariant CPixmapFormatter::displayRole(const CVariant &dataCVariant) const
{
Q_UNUSED(dataCVariant);
@@ -216,12 +223,12 @@ namespace BlackGui
// special treatment for some cases
const CLength l = dataCVariant.value<CLength>();
const bool valid = !l.isNull() && (l.isPositiveWithEpsilonConsidered() || l.isZeroEpsilonConsidered());
return valid ? CPhysiqalQuantiyFormatter::displayRole(dataCVariant) : QStringLiteral("");
return valid ? CPhysiqalQuantiyFormatter::displayRole(dataCVariant) : emptyStringVariant();
}
else
{
Q_ASSERT_X(false, "CAirspaceDistanceFormatter::formatQVariant", "No CLength class");
return QStringLiteral("");
return emptyStringVariant();
}
}
@@ -229,7 +236,7 @@ namespace BlackGui
{
if (dataCVariant.canConvert<CFrequency>())
{
// speical treatment for some cases
// special treatment for some cases
const CFrequency f = dataCVariant.value<CFrequency>();
if (CComSystem::isValidComFrequency(f))
{
@@ -259,7 +266,7 @@ namespace BlackGui
{
if (dataCVariant.canConvert<QString>()) { return dataCVariant; }
if (!dataCVariant.isValid()) { static const CVariant iv("invalid"); return iv; }
const QString s("Invalid type '%1'");
static const QString s("Invalid type: '%1'");
return CVariant::from(s.arg(dataCVariant.typeName()));
}
@@ -273,8 +280,8 @@ namespace BlackGui
{
if (dataCVariant.canConvert<bool>())
{
bool v = dataCVariant.toBool();
return v ? CVariant(m_trueName) : CVariant(m_falseName);
const bool v = dataCVariant.toBool();
return v ? CVariant(m_trueNameVariant) : CVariant(m_falseNameVariant);
}
Q_ASSERT_X(false, "CBoolTextFormatter", "no boolean value");
return CVariant();
@@ -292,12 +299,11 @@ namespace BlackGui
CBoolTextFormatter(alignment, onName, offName, rolesDecorationAndToolTip())
{
// one time pixmap creation
CLedWidget *led = ledDefault();
QScopedPointer<CLedWidget> led(createLedDefault());
led->setOn(true);
m_pixmapOnLed = led->asPixmap();
m_pixmapOnLedVariant = CVariant::fromValue(led->asPixmap());
led->setOn(false);
m_pixmapOffLed = led->asPixmap();
delete led;
m_pixmapOffLedVariant = CVariant::fromValue(led->asPixmap());
}
CVariant CBoolLedFormatter::displayRole(const CVariant &dataCVariant) const
@@ -311,8 +317,8 @@ namespace BlackGui
{
if (dataCVariant.canConvert<bool>())
{
bool v = dataCVariant.toBool();
return CVariant::from(v ? m_pixmapOnLed : m_pixmapOffLed);
const bool v = dataCVariant.toBool();
return v ? m_pixmapOnLedVariant : m_pixmapOffLedVariant;
}
Q_ASSERT_X(false, "CBoolLedFormatter", "no boolean value");
return CVariant();
@@ -331,11 +337,9 @@ namespace BlackGui
{ }
CBoolIconFormatter::CBoolIconFormatter(const CIcon &onIcon, const CIcon &offIcon, const QString &onName, const QString &offName, int alignment) :
CBoolTextFormatter(alignment, onName, offName, rolesDecorationAndToolTip()), m_iconOn(onIcon), m_iconOff(offIcon)
{
m_iconOn.setDescriptiveText(onName);
m_iconOff.setDescriptiveText(offName);
}
CBoolTextFormatter(alignment, onName, offName, rolesDecorationAndToolTip()),
m_iconOnVariant(CVariant::fromValue(onIcon.toPixmap())), m_iconOffVariant(CVariant::fromValue(offIcon.toPixmap()))
{ }
CVariant CBoolIconFormatter::displayRole(const CVariant &dataCVariant) const
{
@@ -348,8 +352,8 @@ namespace BlackGui
{
if (dataCVariant.canConvert<bool>())
{
bool v = dataCVariant.toBool();
return CVariant::from(v ? m_iconOn.toPixmap() : m_iconOff.toPixmap());
const bool v = dataCVariant.toBool();
return v ? m_iconOnVariant : m_iconOffVariant;
}
Q_ASSERT_X(false, "CBoolIconFormatter", "no boolean value");
return CVariant();
@@ -379,16 +383,16 @@ namespace BlackGui
CVariant CColorFormatter::decorationRole(const CVariant &dataCVariant) const
{
static const CVariant empty(CVariant::fromValue(QPixmap()));
CRgbColor rgbColor(dataCVariant.to<CRgbColor>());
if (!rgbColor.isValid()) { return empty; }
const CRgbColor rgbColor(dataCVariant.to<CRgbColor>());
if (!rgbColor.isValid()) { return emptyPixmapVariant(); }
return CVariant::fromValue(rgbColor.toPixmap());
}
CVariant CColorFormatter::tooltipRole(const CVariant &dataCVariant) const
{
CRgbColor rgbColor(dataCVariant.to<CRgbColor>());
if (!rgbColor.isValid()) { return ""; }
static const CVariant empty(CVariant::fromValue(QPixmap()));
const CRgbColor rgbColor(dataCVariant.to<CRgbColor>());
if (!rgbColor.isValid()) { return emptyStringVariant(); }
return rgbColor.hex(true);
}

View File

@@ -116,9 +116,12 @@ namespace BlackGui
//! Empty string CVariant
static const BlackMisc::CVariant &emptyStringVariant();
//! Empty pixmap CVariant
static const BlackMisc::CVariant &emptyPixmapVariant();
QList<int> m_supportedRoles = roleDisplay(); //!< supports decoration roles
int m_alignment = -1; //!< alignment horizontal/vertically / Qt::Alignment
bool m_useI18n = true; //!< i18n?
int m_alignment = -1; //!< alignment horizontal/vertically / Qt::Alignment
bool m_useI18n = true; //!< i18n?
};
//! Pixmap formatter
@@ -164,7 +167,9 @@ namespace BlackGui
public:
//! Constructor
CBoolTextFormatter(int alignment = alignDefault(), const QString &trueName = "true", const QString &falseName = "false", const QList<int> &supportedRoles = roleDisplay()) :
CDefaultFormatter(alignment, false, supportedRoles), m_trueName(trueName), m_falseName(falseName) {}
CDefaultFormatter(alignment, false, supportedRoles),
m_trueNameVariant(BlackMisc::CVariant::from(trueName)),
m_falseNameVariant(BlackMisc::CVariant::from(falseName)) {}
//! \copydoc CDefaultFormatter::displayRole
virtual BlackMisc::CVariant displayRole(const BlackMisc::CVariant &dataCVariant) const override;
@@ -173,8 +178,8 @@ namespace BlackGui
virtual Qt::ItemFlags flags(Qt::ItemFlags flags, bool editable) const override;
protected:
const QString m_trueName = "true"; //!< displayed when true
const QString m_falseName = "false"; //!< displayed when false
const BlackMisc::CVariant m_trueNameVariant = "true"; //!< displayed when true
const BlackMisc::CVariant m_falseNameVariant = "false"; //!< displayed when false
};
//! Format as bool LED value
@@ -200,15 +205,16 @@ namespace BlackGui
return CBoolTextFormatter::displayRole(dataCVariant);
}
//! Default LED
static BlackGui::CLedWidget *ledDefault()
{
return new BlackGui::CLedWidget(false, BlackGui::CLedWidget::Yellow, BlackGui::CLedWidget::Black, BlackGui::CLedWidget::Rounded);
}
protected:
QPixmap m_pixmapOnLed; //!< Pixmap used when on
QPixmap m_pixmapOffLed; //!< Pixmap used when off
BlackMisc::CVariant m_pixmapOnLedVariant; //!< Pixmap used when on
BlackMisc::CVariant m_pixmapOffLedVariant; //!< Pixmap used when off
private:
//! Default LED
static CLedWidget *createLedDefault()
{
return new CLedWidget(false, CLedWidget::Yellow, CLedWidget::Black, CLedWidget::Rounded);
}
};
//! Format as bool pixmap
@@ -238,8 +244,8 @@ namespace BlackGui
virtual BlackMisc::CVariant tooltipRole(const BlackMisc::CVariant &dataCVariant) const override;
protected:
BlackMisc::CIcon m_iconOn; //!< Used when on
BlackMisc::CIcon m_iconOff; //!< Used when off
const BlackMisc::CVariant m_iconOnVariant; //!< Used when on
const BlackMisc::CVariant m_iconOffVariant; //!< Used when off
};
//! Default formatter when column contains CValueObject
@@ -282,7 +288,7 @@ namespace BlackGui
static const QString &formatHmsz() { static const QString f = "HH:mm:ss.zzz"; return f; }
private:
QString m_formatString = "yyyy-MM-dd HH:mm"; //!< how the value is displayed
const QString m_formatString = "yyyy-MM-dd HH:mm"; //!< how the value is displayed
};
//! Formatter when column contains an integer
@@ -307,7 +313,7 @@ namespace BlackGui
virtual BlackMisc::CVariant displayRole(const BlackMisc::CVariant &altitude) const override;
private:
bool m_flightLevel = false;
const bool m_flightLevel = false;
};
//! Formatter when column contains a color
@@ -320,11 +326,11 @@ namespace BlackGui
//! \copydoc CDefaultFormatter::displayRole
virtual BlackMisc::CVariant displayRole(const BlackMisc::CVariant &dataCVariant) const override;
//! Display the icon
virtual BlackMisc::CVariant decorationRole(const BlackMisc::CVariant &dataCVariant) const override;
//! \copydoc CDefaultFormatter::tooltipRole
virtual BlackMisc::CVariant tooltipRole(const BlackMisc::CVariant &dataCVariant) const override;
//! Display the icon
virtual BlackMisc::CVariant decorationRole(const BlackMisc::CVariant &dataCVariant) const override;
};
//! Formatter for physical quantities
@@ -345,7 +351,7 @@ namespace BlackGui
else
{
Q_ASSERT_X(false, "CPhysiqalQuantiyFormatter::displayRole", "No CPhysicalQuantity class");
return "";
return emptyStringVariant();
}
}