From 7b4dbe0e9b2942179529f5c3115b5b340b4f95e7 Mon Sep 17 00:00:00 2001 From: mntone Date: Fri, 13 Jan 2023 15:54:40 +0900 Subject: [PATCH] Adds StringIsPresentToVisibilityConverter. --- idl/AngelUmbrella.idl | 6 ++++ src/AngelUmbrella.vcxproj | 2 ++ src/AngelUmbrella.vcxproj.filters | 6 ++++ .../StringIsPresentToVisibilityConverter.cpp | 28 +++++++++++++++ .../StringIsPresentToVisibilityConverter.h | 20 +++++++++++ src/version.props | 2 +- test/Converters/StringConverterTestSupport.cs | 28 +++++++++++++++ ...tringIsPresentToVisibilityConverterTest.cs | 35 +++++++++++++++++++ 8 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 src/Converters/StringIsPresentToVisibilityConverter.cpp create mode 100644 src/Converters/StringIsPresentToVisibilityConverter.h create mode 100644 test/Converters/StringConverterTestSupport.cs create mode 100644 test/Converters/StringIsPresentToVisibilityConverterTest.cs diff --git a/idl/AngelUmbrella.idl b/idl/AngelUmbrella.idl index 060cbfe..e7a128e 100644 --- a/idl/AngelUmbrella.idl +++ b/idl/AngelUmbrella.idl @@ -15,6 +15,12 @@ namespace Mntone.AngelUmbrella InvertedBooleanConverter(); } + [interface_name("IStringIsPresentToVisibilityConverter", A0144BE4-B8E9-4EFC-9CE0-DC48EB2416A7)] + runtimeclass StringIsPresentToVisibilityConverter : Microsoft.UI.Xaml.Data.IValueConverter + { + StringIsPresentToVisibilityConverter(); + } + } namespace UI diff --git a/src/AngelUmbrella.vcxproj b/src/AngelUmbrella.vcxproj index 8da1567..04fa904 100644 --- a/src/AngelUmbrella.vcxproj +++ b/src/AngelUmbrella.vcxproj @@ -158,6 +158,7 @@ + UI\Controls\SettingsCard.xaml @@ -177,6 +178,7 @@ + UI\Controls\SettingsCard.xaml diff --git a/src/AngelUmbrella.vcxproj.filters b/src/AngelUmbrella.vcxproj.filters index 744d7c1..8dc8a6f 100644 --- a/src/AngelUmbrella.vcxproj.filters +++ b/src/AngelUmbrella.vcxproj.filters @@ -52,6 +52,9 @@ Converters + + Converters + Helpers @@ -68,5 +71,8 @@ Converters + + Converters + \ No newline at end of file diff --git a/src/Converters/StringIsPresentToVisibilityConverter.cpp b/src/Converters/StringIsPresentToVisibilityConverter.cpp new file mode 100644 index 0000000..6e065e6 --- /dev/null +++ b/src/Converters/StringIsPresentToVisibilityConverter.cpp @@ -0,0 +1,28 @@ +#include "pch.h" +#include "StringIsPresentToVisibilityConverter.h" +#if __has_include("Converters/StringIsPresentToVisibilityConverter.g.cpp") +#include "Converters/StringIsPresentToVisibilityConverter.g.cpp" +#endif + +namespace winrt { + using namespace ::winrt::Windows::Foundation; + using namespace ::winrt::Windows::UI::Xaml::Interop; + + using namespace ::winrt::Microsoft::UI::Xaml; +} + +using namespace winrt::Mntone::AngelUmbrella::Converters::implementation; + +StringIsPresentToVisibilityConverter::StringIsPresentToVisibilityConverter() noexcept { +} + +winrt::IInspectable StringIsPresentToVisibilityConverter::Convert(IInspectable const& value, TypeName const& targetType, IInspectable const& /*parameter*/, hstring const& /*language*/) const { + WINRT_ASSERT(xaml_typename() == targetType); + + std::optional string { value.try_as() }; + return box_value(string.has_value() && !string.value().empty() ? Visibility::Visible : Visibility::Collapsed); +} + +winrt::IInspectable StringIsPresentToVisibilityConverter::ConvertBack(IInspectable const& /*value*/, TypeName const& /*targetType*/, IInspectable const& /*parameter*/, hstring const& /*language*/) const { + throw hresult_not_implemented(); +} diff --git a/src/Converters/StringIsPresentToVisibilityConverter.h b/src/Converters/StringIsPresentToVisibilityConverter.h new file mode 100644 index 0000000..ba09fe2 --- /dev/null +++ b/src/Converters/StringIsPresentToVisibilityConverter.h @@ -0,0 +1,20 @@ +#pragma once +#include "Converters/StringIsPresentToVisibilityConverter.g.h" + +namespace winrt::Mntone::AngelUmbrella::Converters::implementation { + + struct StringIsPresentToVisibilityConverter: StringIsPresentToVisibilityConverterT { + StringIsPresentToVisibilityConverter() noexcept; + + Windows::Foundation::IInspectable Convert(Windows::Foundation::IInspectable const& value, Windows::UI::Xaml::Interop::TypeName const& targetType, Windows::Foundation::IInspectable const& parameter, hstring const& language) const; + Windows::Foundation::IInspectable ConvertBack(Windows::Foundation::IInspectable const& value, Windows::UI::Xaml::Interop::TypeName const& targetType, Windows::Foundation::IInspectable const& parameter, hstring const& language) const; + }; + +} + +namespace winrt::Mntone::AngelUmbrella::Converters::factory_implementation { + + struct StringIsPresentToVisibilityConverter: StringIsPresentToVisibilityConverterT { + }; + +} diff --git a/src/version.props b/src/version.props index 030e1c3..a3ec903 100644 --- a/src/version.props +++ b/src/version.props @@ -3,7 +3,7 @@ 1 0 - 2 + 3 0 0 diff --git a/test/Converters/StringConverterTestSupport.cs b/test/Converters/StringConverterTestSupport.cs new file mode 100644 index 0000000..aaaeb59 --- /dev/null +++ b/test/Converters/StringConverterTestSupport.cs @@ -0,0 +1,28 @@ +using Microsoft.UI.Xaml; + +namespace Mntone.AngelUmbrella.Tests.Converters +{ + public class StringConverterTestSupport + where T : Microsoft.UI.Xaml.Data.IValueConverter, new() + where TOut : struct + { + public T Converter { get; } + + protected StringConverterTestSupport() + { + Converter = new T(); + } + + protected TOut? Convert(string? value) + => Converter.Convert(value, typeof(TOut), null, null) as TOut?; + + protected TOut? ConvertNull() + => Converter.Convert(null, typeof(TOut), null, null) as TOut?; + + protected string? ConvertBack(TOut? value) + => Converter.ConvertBack(value, typeof(string), null, null) as string; + + protected string? ConvertBackUnsetValue() + => Converter.ConvertBack(DependencyProperty.UnsetValue, typeof(string), null, null) as string; + } +} diff --git a/test/Converters/StringIsPresentToVisibilityConverterTest.cs b/test/Converters/StringIsPresentToVisibilityConverterTest.cs new file mode 100644 index 0000000..0a12b99 --- /dev/null +++ b/test/Converters/StringIsPresentToVisibilityConverterTest.cs @@ -0,0 +1,35 @@ +using Microsoft.UI.Xaml; + +namespace Mntone.AngelUmbrella.Tests.Converters +{ + [TestClass] + public sealed class StringIsPresentToVisibilityConverterTest : StringConverterTestSupport + { + [TestMethod] + public void ConvertNullptr() + { + var retValue = Convert(null); + Assert.AreEqual(Visibility.Collapsed, retValue); + } + + [TestMethod] + public void ConvertEmpty() + { + var retValue = Convert(""); + Assert.AreEqual(Visibility.Collapsed, retValue); + } + + [TestMethod] + public void ConvertPresent() + { + var retValue = Convert("string"); + Assert.AreEqual(Visibility.Visible, retValue); + } + + [TestMethod] + public void ConvertBackNotImplemented() + { + Assert.ThrowsException(() => ConvertBackUnsetValue()); + } + } +} \ No newline at end of file