diff options
Diffstat (limited to 'cui/source/dialogs/FontFeaturesDialog.cxx')
-rw-r--r-- | cui/source/dialogs/FontFeaturesDialog.cxx | 131 |
1 files changed, 88 insertions, 43 deletions
diff --git a/cui/source/dialogs/FontFeaturesDialog.cxx b/cui/source/dialogs/FontFeaturesDialog.cxx index b9120b0371c8..e9aba0a6e409 100644 --- a/cui/source/dialogs/FontFeaturesDialog.cxx +++ b/cui/source/dialogs/FontFeaturesDialog.cxx @@ -10,20 +10,25 @@ #include <FontFeaturesDialog.hxx> #include <rtl/ustrbuf.hxx> +#include <utility> #include <vcl/font/FeatureParser.hxx> -#include <vcl/virdev.hxx> -#include <svtools/colorcfg.hxx> +#include <FontFeatures.hxx> #include <unordered_set> using namespace css; namespace cui { -FontFeaturesDialog::FontFeaturesDialog(weld::Window* pParent, OUString const& rFontName) +FontFeaturesDialog::FontFeaturesDialog(weld::Window* pParent, OUString aFontName) : GenericDialogController(pParent, "cui/ui/fontfeaturesdialog.ui", "FontFeaturesDialog") - , m_sFontName(rFontName) + , m_sFontName(std::move(aFontName)) , m_xContentWindow(m_xBuilder->weld_scrolled_window("contentWindow")) + , m_xContentBox(m_xBuilder->weld_container("contentBox")) , m_xContentGrid(m_xBuilder->weld_container("contentGrid")) + , m_xStylisticSetsBox(m_xBuilder->weld_container("stylisticSetsBox")) + , m_xStylisticSetsGrid(m_xBuilder->weld_container("stylisticSetsGrid")) + , m_xCharacterVariantsBox(m_xBuilder->weld_container("characterVariantsBox")) + , m_xCharacterVariantsGrid(m_xBuilder->weld_container("characterVariantsGrid")) , m_xPreviewWindow(new weld::CustomWeld(*m_xBuilder, "preview", m_aPreviewWindow)) { initialize(); @@ -50,75 +55,95 @@ static sal_Int32 makeEnumComboBox(weld::ComboBox& rNameBox, void FontFeaturesDialog::initialize() { ScopedVclPtrInstance<VirtualDevice> aVDev(*Application::GetDefaultDevice(), - DeviceFormat::DEFAULT, DeviceFormat::DEFAULT); - aVDev->SetOutputSizePixel(Size(10, 10)); - - vcl::Font aFont = aVDev->GetFont(); - aFont.SetFamilyName(m_sFontName); - aVDev->SetFont(aFont); - - std::vector<vcl::font::Feature> rFontFeatures; - - if (!aVDev->GetFontFeatures(rFontFeatures)) - return; + DeviceFormat::WITH_ALPHA); + std::vector<vcl::font::Feature> rFontFeatures = getFontFeatureList(m_sFontName, *aVDev); std::unordered_set<sal_uInt32> aDoneFeatures; std::vector<vcl::font::Feature> rFilteredFontFeatures; for (vcl::font::Feature const& rFontFeature : rFontFeatures) { - sal_uInt32 nFontFeatureCode = rFontFeature.m_aID.m_aFeatureCode; + sal_uInt32 nFontFeatureCode = rFontFeature.m_nCode; if (!aDoneFeatures.insert(nFontFeatureCode).second) continue; rFilteredFontFeatures.push_back(rFontFeature); } - fillGrid(rFilteredFontFeatures); + int nRowHeight = fillGrid(rFilteredFontFeatures); + auto nFeaturesHeight = m_xContentBox->get_preferred_size().Height() + + m_xStylisticSetsBox->get_preferred_size().Height() + + m_xCharacterVariantsBox->get_preferred_size().Height(); m_xContentWindow->set_size_request( - -1, std::min(std::max(m_xContentWindow->get_preferred_size().Height(), - m_xContentGrid->get_preferred_size().Height()), + -1, std::min(std::max(m_xContentWindow->get_preferred_size().Height(), nFeaturesHeight), static_cast<tools::Long>(300L))); + if (nRowHeight) + { + // tdf#141333 use row height + the 6 px spacing of contentGrid + m_xContentWindow->vadjustment_set_step_increment(nRowHeight + 6); + } + updateFontPreview(); } -void FontFeaturesDialog::fillGrid(std::vector<vcl::font::Feature> const& rFontFeatures) +int FontFeaturesDialog::fillGrid(std::vector<vcl::font::Feature> const& rFontFeatures) { + int nRowHeight(0); + vcl::font::FeatureParser aParser(m_sFontName); auto aExistingFeatures = aParser.getFeaturesMap(); - sal_Int32 i = 0; + sal_Int32 nIdx, nStylisticSets(0), nCharacterVariants(0), nOtherFeatures(0); for (vcl::font::Feature const& rFontFeature : rFontFeatures) { - sal_uInt32 nFontFeatureCode = rFontFeature.m_aID.m_aFeatureCode; + sal_uInt32 nFontFeatureCode = rFontFeature.m_nCode; vcl::font::FeatureDefinition aDefinition; if (rFontFeature.m_aDefinition) aDefinition = rFontFeature.m_aDefinition; if (!aDefinition) - aDefinition = { nFontFeatureCode, nullptr }; + aDefinition = { nFontFeatureCode, "" }; - m_aFeatureItems.emplace_back(m_xContentGrid.get()); + if (rFontFeature.isStylisticSet()) + { + nIdx = nStylisticSets++; + m_xStylisticSetsBox->set_visible(true); + m_aFeatureItems.emplace_back( + std::make_unique<FontFeatureItem>(m_xStylisticSetsGrid.get())); + } + else if (rFontFeature.isCharacterVariant()) + { + nIdx = nCharacterVariants++; + m_xCharacterVariantsBox->set_visible(true); + m_aFeatureItems.emplace_back( + std::make_unique<FontFeatureItem>(m_xCharacterVariantsGrid.get())); + } + else + { + nIdx = nOtherFeatures++; + m_xContentBox->set_visible(true); + m_aFeatureItems.emplace_back(std::make_unique<FontFeatureItem>(m_xContentGrid.get())); + } - uint32_t nValue = 0; + int32_t nValue = 0; if (aExistingFeatures.find(nFontFeatureCode) != aExistingFeatures.end()) nValue = aExistingFeatures.at(nFontFeatureCode); else nValue = aDefinition.getDefault(); - FontFeatureItem& aCurrentItem = m_aFeatureItems.back(); + 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; + sal_Int32 nGridPositionX = (nIdx % 2) * 2; + sal_Int32 nGridPositionY = nIdx / 2; aCurrentItem.m_xContainer->set_grid_left_attach(nGridPositionX); aCurrentItem.m_xContainer->set_grid_top_attach(nGridPositionY); Link<weld::ComboBox&, void> aComboBoxSelectHandler = LINK(this, FontFeaturesDialog, ComboBoxSelectedHdl); - Link<weld::ToggleButton&, void> aCheckBoxToggleHandler + Link<weld::Toggleable&, void> aCheckBoxToggleHandler = LINK(this, FontFeaturesDialog, CheckBoxToggledHdl); if (aDefinition.getType() == vcl::font::FeatureParameterType::ENUM) @@ -134,14 +159,28 @@ void FontFeaturesDialog::fillGrid(std::vector<vcl::font::Feature> const& rFontFe } else { - aCurrentItem.m_xCheck->set_active(nValue > 0); + if (nValue < 0) + { + aCurrentItem.m_xCheck->set_state(TRISTATE_INDET); + aCurrentItem.m_aTriStateEnabled.bTriStateEnabled = true; + aCurrentItem.m_aTriStateEnabled.eState = TRISTATE_INDET; + } + else + { + aCurrentItem.m_xCheck->set_state(nValue > 0 ? TRISTATE_TRUE : TRISTATE_FALSE); + aCurrentItem.m_aTriStateEnabled.bTriStateEnabled = false; + aCurrentItem.m_aTriStateEnabled.eState = aCurrentItem.m_xCheck->get_state(); + } aCurrentItem.m_xCheck->set_label(aDefinition.getDescription()); - aCurrentItem.m_xCheck->connect_toggled(aCheckBoxToggleHandler); + aCurrentItem.m_aToggleHdl = aCheckBoxToggleHandler; aCurrentItem.m_xCheck->show(); } - i++; + nRowHeight + = std::max<int>(nRowHeight, aCurrentItem.m_xContainer->get_preferred_size().Height()); } + + return nRowHeight; } void FontFeaturesDialog::updateFontPreview() @@ -159,7 +198,14 @@ void FontFeaturesDialog::updateFontPreview() m_aPreviewWindow.SetFont(rPreviewFont, rPreviewFontCJK, rPreviewFontCTL); } -IMPL_LINK_NOARG(FontFeaturesDialog, CheckBoxToggledHdl, weld::ToggleButton&, void) +IMPL_LINK(FontFeatureItem, CheckBoxToggledHdl, weld::Toggleable&, rToggle, void) +{ + m_aTriStateEnabled.ButtonToggled(rToggle); + m_aTriStateEnabled.bTriStateEnabled = false; + m_aToggleHdl.Call(rToggle); +} + +IMPL_LINK_NOARG(FontFeaturesDialog, CheckBoxToggledHdl, weld::Toggleable&, void) { updateFontPreview(); } @@ -175,19 +221,20 @@ OUString FontFeaturesDialog::createFontNameWithFeatures() OUStringBuffer sNameSuffix; bool bFirst = true; - for (const FontFeatureItem& rItem : m_aFeatureItems) + for (const auto& rEntry : m_aFeatureItems) { + const FontFeatureItem& rItem(*rEntry); if (rItem.m_xCheck->get_visible()) { - if (sal_uInt32(rItem.m_xCheck->get_active()) != rItem.m_nDefault) + if (rItem.m_xCheck->get_state() != TRISTATE_INDET) { if (!bFirst) - sNameSuffix.append(OUString(vcl::font::FeatureSeparator)); + sNameSuffix.append(vcl::font::FeatureSeparator); else bFirst = false; sNameSuffix.append(vcl::font::featureCodeAsString(rItem.m_aFeatureCode)); - if (!rItem.m_xCheck->get_active()) + if (rItem.m_xCheck->get_state() == TRISTATE_FALSE) sNameSuffix.append("=0"); } } @@ -197,20 +244,18 @@ OUString FontFeaturesDialog::createFontNameWithFeatures() if (nSelection != int(rItem.m_nDefault)) { if (!bFirst) - sNameSuffix.append(OUString(vcl::font::FeatureSeparator)); + sNameSuffix.append(vcl::font::FeatureSeparator); else bFirst = false; - sNameSuffix.append(vcl::font::featureCodeAsString(rItem.m_aFeatureCode)); - sNameSuffix.append("="); - sNameSuffix.append(OUString::number(nSelection)); + sNameSuffix.append(vcl::font::featureCodeAsString(rItem.m_aFeatureCode) + "=" + + OUString::number(nSelection)); } } } sResultFontName = vcl::font::trimFontNameFeatures(m_sFontName); if (!sNameSuffix.isEmpty()) - sResultFontName - += OUStringChar(vcl::font::FeaturePrefix) + sNameSuffix.makeStringAndClear(); + sResultFontName += OUStringChar(vcl::font::FeaturePrefix) + sNameSuffix; return sResultFontName; } |