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_hos...@sil.org> AuthorDate: Mon Mar 25 13:44:10 2019 +0700 Commit: Martin Hosken <martin_hos...@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_hos...@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; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits