Skip to content

Commit

Permalink
Adds StringIsPresentToVisibilityConverter.
Browse files Browse the repository at this point in the history
  • Loading branch information
mntone committed Jan 13, 2023
1 parent a197f70 commit 7b4dbe0
Show file tree
Hide file tree
Showing 8 changed files with 126 additions and 1 deletion.
6 changes: 6 additions & 0 deletions idl/AngelUmbrella.idl
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions src/AngelUmbrella.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@
<ClInclude Include="version.h" />
<ClInclude Include="Converters\BooleanToVisibilityConverter.h" />
<ClInclude Include="Converters\InvertedBooleanConverter.h" />
<ClInclude Include="Converters\StringIsPresentToVisibilityConverter.h" />
<ClInclude Include="Helpers\ValueHelper.h" />
<ClInclude Include="UI\Controls\SettingsCard.xaml.h">
<DependentUpon>UI\Controls\SettingsCard.xaml</DependentUpon>
Expand All @@ -177,6 +178,7 @@
<ClCompile Include="$(GeneratedFilesDir)module.g.cpp" />
<ClCompile Include="Converters\BooleanToVisibilityConverter.cpp" />
<ClCompile Include="Converters\InvertedBooleanConverter.cpp" />
<ClCompile Include="Converters\StringIsPresentToVisibilityConverter.cpp" />
<ClCompile Include="UI\Controls\SettingsCard.xaml.cpp">
<DependentUpon>UI\Controls\SettingsCard.xaml</DependentUpon>
</ClCompile>
Expand Down
6 changes: 6 additions & 0 deletions src/AngelUmbrella.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@
<ClInclude Include="Converters\InvertedBooleanConverter.h">
<Filter>Converters</Filter>
</ClInclude>
<ClInclude Include="Converters\StringIsPresentToVisibilityConverter.h">
<Filter>Converters</Filter>
</ClInclude>
<ClInclude Include="Helpers\ValueHelper.h">
<Filter>Helpers</Filter>
</ClInclude>
Expand All @@ -68,5 +71,8 @@
<ClCompile Include="Converters\InvertedBooleanConverter.cpp">
<Filter>Converters</Filter>
</ClCompile>
<ClCompile Include="Converters\StringIsPresentToVisibilityConverter.cpp">
<Filter>Converters</Filter>
</ClCompile>
</ItemGroup>
</Project>
28 changes: 28 additions & 0 deletions src/Converters/StringIsPresentToVisibilityConverter.cpp
Original file line number Diff line number Diff line change
@@ -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<Visibility>() == targetType);

std::optional<hstring> string { value.try_as<hstring>() };
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();
}
20 changes: 20 additions & 0 deletions src/Converters/StringIsPresentToVisibilityConverter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#pragma once
#include "Converters/StringIsPresentToVisibilityConverter.g.h"

namespace winrt::Mntone::AngelUmbrella::Converters::implementation {

struct StringIsPresentToVisibilityConverter: StringIsPresentToVisibilityConverterT<StringIsPresentToVisibilityConverter> {
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<StringIsPresentToVisibilityConverter, implementation::StringIsPresentToVisibilityConverter> {
};

}
2 changes: 1 addition & 1 deletion src/version.props
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<PropertyGroup>
<AngelVersionMajor>1</AngelVersionMajor>
<AngelVersionMinor>0</AngelVersionMinor>
<AngelVersionPatch>2</AngelVersionPatch>
<AngelVersionPatch>3</AngelVersionPatch>
<AngelVersionBuild Condition="$(AngelVersionBuild) == ''">0</AngelVersionBuild>
<AngelVersionRevision Condition="$(AngelVersionRevision) == ''">0</AngelVersionRevision>
</PropertyGroup>
Expand Down
28 changes: 28 additions & 0 deletions test/Converters/StringConverterTestSupport.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using Microsoft.UI.Xaml;

namespace Mntone.AngelUmbrella.Tests.Converters
{
public class StringConverterTestSupport<T, TOut>
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;
}
}
35 changes: 35 additions & 0 deletions test/Converters/StringIsPresentToVisibilityConverterTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using Microsoft.UI.Xaml;

namespace Mntone.AngelUmbrella.Tests.Converters
{
[TestClass]
public sealed class StringIsPresentToVisibilityConverterTest : StringConverterTestSupport<StringIsPresentToVisibilityConverter, Visibility>
{
[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<NotImplementedException>(() => ConvertBackUnsetValue());
}
}
}

0 comments on commit 7b4dbe0

Please sign in to comment.