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

View File

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