[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