[Libreoffice-commits] core.git: cui/source include/vcl vcl/source
Martin Hosken (via logerrit)
logerrit at kemper.freedesktop.org
Tue Mar 26 04:00:56 UTC 2019
cui/source/dialogs/FontFeaturesDialog.cxx | 30 ++++++++++++++++++++++--------
cui/source/inc/FontFeaturesDialog.hxx | 1 +
include/vcl/font/Feature.hxx | 7 +++++--
vcl/source/font/Feature.cxx | 7 ++++++-
vcl/source/font/FeatureCollector.cxx | 8 ++++++--
5 files changed, 40 insertions(+), 13 deletions(-)
New commits:
commit 36eb092bed8528eaca295d817ec77fc9a2b73339
Author: Martin Hosken <martin_hosken at sil.org>
AuthorDate: Mon Mar 25 13:44:10 2019 +0700
Commit: Martin Hosken <martin_hosken at sil.org>
CommitDate: Tue Mar 26 05:00:33 2019 +0100
Allow irregular feature value structures in feature dialog
Change-Id: I92df2d47bebb0b0af38f3527881ac65a11d1bb98
Reviewed-on: https://gerrit.libreoffice.org/69643
Tested-by: Jenkins
Reviewed-by: Martin Hosken <martin_hosken at sil.org>
diff --git a/cui/source/dialogs/FontFeaturesDialog.cxx b/cui/source/dialogs/FontFeaturesDialog.cxx
index b4dd8e7fc63e..27b7b18620d2 100644
--- a/cui/source/dialogs/FontFeaturesDialog.cxx
+++ b/cui/source/dialogs/FontFeaturesDialog.cxx
@@ -34,11 +34,20 @@ FontFeaturesDialog::FontFeaturesDialog(weld::Window* pParent, OUString const& rF
FontFeaturesDialog::~FontFeaturesDialog() {}
-static void makeEnumComboBox(weld::ComboBox& rNameBox,
- vcl::font::FeatureDefinition const& rFeatureDefinition)
+static sal_Int32 makeEnumComboBox(weld::ComboBox& rNameBox,
+ vcl::font::FeatureDefinition const& rFeatureDefinition,
+ uint32_t nDefault)
{
+ sal_Int32 nRes = 0;
+ int count = 0;
for (vcl::font::FeatureParameter const& rParameter : rFeatureDefinition.getEnumParameters())
- rNameBox.append_text(rParameter.getDescription());
+ {
+ rNameBox.append(OUString::number(rParameter.getCode()), rParameter.getDescription());
+ if (rParameter.getCode() == nDefault)
+ nRes = count;
+ ++count;
+ }
+ return nRes;
}
void FontFeaturesDialog::initialize()
@@ -94,9 +103,12 @@ void FontFeaturesDialog::fillGrid(std::vector<vcl::font::Feature> const& rFontFe
uint32_t nValue = 0;
if (aExistingFeatures.find(nFontFeatureCode) != aExistingFeatures.end())
nValue = aExistingFeatures.at(nFontFeatureCode);
+ else
+ nValue = aDefinition.getDefault();
FontFeatureItem& aCurrentItem = m_aFeatureItems.back();
aCurrentItem.m_aFeatureCode = nFontFeatureCode;
+ aCurrentItem.m_nDefault = aDefinition.getDefault();
sal_Int32 nGridPositionX = (i % 2) * 2;
sal_Int32 nGridPositionY = i / 2;
@@ -113,9 +125,9 @@ void FontFeaturesDialog::fillGrid(std::vector<vcl::font::Feature> const& rFontFe
aCurrentItem.m_xText->set_label(aDefinition.getDescription());
aCurrentItem.m_xText->show();
- makeEnumComboBox(*aCurrentItem.m_xCombo, aDefinition);
+ sal_Int32 nInit = makeEnumComboBox(*aCurrentItem.m_xCombo, aDefinition, nValue);
- aCurrentItem.m_xCombo->set_active(nValue);
+ aCurrentItem.m_xCombo->set_active(nInit);
aCurrentItem.m_xCombo->connect_changed(aComboBoxSelectHandler);
aCurrentItem.m_xCombo->show();
}
@@ -166,7 +178,7 @@ OUString FontFeaturesDialog::createFontNameWithFeatures()
{
if (rItem.m_xCheck->get_visible())
{
- if (rItem.m_xCheck->get_active())
+ if (sal_uInt32(rItem.m_xCheck->get_active()) != rItem.m_nDefault)
{
if (!bFirst)
sNameSuffix.append(OUString(vcl::font::FeatureSeparator));
@@ -174,12 +186,14 @@ OUString FontFeaturesDialog::createFontNameWithFeatures()
bFirst = false;
sNameSuffix.append(vcl::font::featureCodeAsString(rItem.m_aFeatureCode));
+ if (!rItem.m_xCheck->get_active())
+ sNameSuffix.append("=0");
}
}
else if (rItem.m_xCombo->get_visible() && rItem.m_xText->get_visible())
{
- int nSelection = rItem.m_xCombo->get_active();
- if (nSelection > 0)
+ sal_Int32 nSelection = rItem.m_xCombo->get_active_id().toInt32();
+ if (nSelection != int(rItem.m_nDefault))
{
if (!bFirst)
sNameSuffix.append(OUString(vcl::font::FeatureSeparator));
diff --git a/cui/source/inc/FontFeaturesDialog.hxx b/cui/source/inc/FontFeaturesDialog.hxx
index ccecb1fcbcbd..b8c48ce805bc 100644
--- a/cui/source/inc/FontFeaturesDialog.hxx
+++ b/cui/source/inc/FontFeaturesDialog.hxx
@@ -33,6 +33,7 @@ struct FontFeatureItem
}
sal_uInt32 m_aFeatureCode;
+ sal_uInt32 m_nDefault;
std::unique_ptr<weld::Builder> m_xBuilder;
std::unique_ptr<weld::Widget> m_xContainer;
std::unique_ptr<weld::Label> m_xText;
diff --git a/include/vcl/font/Feature.hxx b/include/vcl/font/Feature.hxx
index 47092f9bb56e..b56ce19ba194 100644
--- a/include/vcl/font/Feature.hxx
+++ b/include/vcl/font/Feature.hxx
@@ -60,6 +60,7 @@ private:
const char* m_pDescriptionID;
OUString m_sNumericPart;
uint32_t m_nCode;
+ uint32_t m_nDefault;
FeatureParameterType m_eType;
// the index of the parameter defines the enum value, string is the description
std::vector<FeatureParameter> m_aEnumParameters;
@@ -69,16 +70,18 @@ public:
FeatureDefinition(uint32_t nCode, OUString const& rDescription,
FeatureParameterType eType = FeatureParameterType::BOOL,
std::vector<FeatureParameter> const& rEnumParameters
- = std::vector<FeatureParameter>{});
+ = std::vector<FeatureParameter>{},
+ uint32_t nDefault = 0);
FeatureDefinition(uint32_t nCode, const char* pDescriptionID,
OUString const& rNumericPart = OUString());
FeatureDefinition(uint32_t nCode, const char* pDescriptionID,
std::vector<FeatureParameter> aEnumParameters);
const std::vector<FeatureParameter>& getEnumParameters() const;
- OUString getDescription() const;
uint32_t getCode() const;
+ OUString getDescription() const;
FeatureParameterType getType() const;
+ uint32_t getDefault() const;
operator bool() const;
};
diff --git a/vcl/source/font/Feature.cxx b/vcl/source/font/Feature.cxx
index 2516da2bc4c0..4be8152d4bc7 100644
--- a/vcl/source/font/Feature.cxx
+++ b/vcl/source/font/Feature.cxx
@@ -100,10 +100,12 @@ FeatureDefinition::FeatureDefinition()
FeatureDefinition::FeatureDefinition(uint32_t nCode, OUString const& rDescription,
FeatureParameterType eType,
- std::vector<FeatureParameter> const& rEnumParameters)
+ std::vector<FeatureParameter> const& rEnumParameters,
+ uint32_t nDefault)
: m_sDescription(rDescription)
, m_pDescriptionID(nullptr)
, m_nCode(nCode)
+ , m_nDefault(nDefault)
, m_eType(eType)
, m_aEnumParameters(rEnumParameters)
{
@@ -114,6 +116,7 @@ FeatureDefinition::FeatureDefinition(uint32_t nCode, const char* pDescriptionID,
: m_pDescriptionID(pDescriptionID)
, m_sNumericPart(rNumericPart)
, m_nCode(nCode)
+ , m_nDefault(0)
, m_eType(FeatureParameterType::BOOL)
{
}
@@ -122,6 +125,7 @@ FeatureDefinition::FeatureDefinition(uint32_t nCode, const char* pDescriptionID,
std::vector<FeatureParameter> aEnumParameters)
: m_pDescriptionID(pDescriptionID)
, m_nCode(nCode)
+ , m_nDefault(0)
, m_eType(FeatureParameterType::ENUM)
, m_aEnumParameters(std::move(aEnumParameters))
{
@@ -157,6 +161,7 @@ FeatureParameterType FeatureDefinition::getType() const { return m_eType; }
FeatureDefinition::operator bool() const { return m_nCode != 0; }
+uint32_t FeatureDefinition::getDefault() const { return m_nDefault; }
} // end font namespace
} // end vcl namespace
diff --git a/vcl/source/font/FeatureCollector.cxx b/vcl/source/font/FeatureCollector.cxx
index 7e5f8fa8c632..ed110ccbf073 100644
--- a/vcl/source/font/FeatureCollector.cxx
+++ b/vcl/source/font/FeatureCollector.cxx
@@ -27,6 +27,8 @@ bool FeatureCollector::collectGraphite()
gr_uint16 nUILanguage = gr_uint16(m_eLanguageType);
gr_uint16 nNumberOfFeatures = gr_face_n_fref(grFace);
+ gr_feature_val* pfeatureValues
+ = gr_face_featureval_for_lang(grFace, 0); // shame we don't know which lang
for (gr_uint16 i = 0; i < nNumberOfFeatures; ++i)
{
@@ -36,6 +38,7 @@ bool FeatureCollector::collectGraphite()
if (nFeatureCode == 0) // illegal feature code - skip
continue;
+ gr_uint16 nValue = gr_fref_feature_value(pFeatureRef, pfeatureValues);
gr_uint32 nLabelLength = 0;
void* pLabel = gr_fref_label(pFeatureRef, &nUILanguage, gr_utf8, &nLabelLength);
OUString sLabel(OUString::createFromAscii(static_cast<char*>(pLabel)));
@@ -52,7 +55,8 @@ bool FeatureCollector::collectGraphite()
void* pValueLabel = gr_fref_value_label(pFeatureRef, j, &nUILanguage, gr_utf8,
&nValueLabelLength);
OUString sValueLabel(OUString::createFromAscii(static_cast<char*>(pValueLabel)));
- aParameters.emplace_back(sal_uInt32(j), sValueLabel);
+ gr_uint16 nParamValue = gr_fref_value(pFeatureRef, j);
+ aParameters.emplace_back(sal_uInt32(nParamValue), sValueLabel);
gr_label_destroy(pValueLabel);
}
@@ -72,7 +76,7 @@ bool FeatureCollector::collectGraphite()
vcl::font::FeatureType::Graphite);
vcl::font::Feature& rFeature = m_rFontFeatures.back();
rFeature.m_aDefinition = vcl::font::FeatureDefinition(
- nFeatureCode, sLabel, eFeatureParameterType, aParameters);
+ nFeatureCode, sLabel, eFeatureParameterType, aParameters, sal_uInt32(nValue));
}
}
return true;
More information about the Libreoffice-commits
mailing list