From b2d608798c26c61a2bbfc6083da8aecf634bc9e9 Mon Sep 17 00:00:00 2001 From: CodeOtakuu Date: Thu, 23 Jul 2026 02:00:51 +0400 Subject: [PATCH] Add SettingsGroup --- .../Helpers/TextBlockTemplateSelector.cpp | 29 ++++ .../Helpers/TextBlockTemplateSelector.h | 34 +++++ .../Helpers/TextBlockTemplateSelector.idl | 9 ++ .../SettingsGroup/SettingsGroup.Callbacks.cpp | 133 ++++++++++++++++++ .../SettingsGroup.Properties.cpp | 109 ++++++++++++++ .../SettingsGroup/SettingsGroup.cpp | 52 +++++++ .../SettingsGroup/SettingsGroup.h | 129 +++++++++++++++++ .../SettingsGroup/SettingsGroup.idl | 25 ++++ .../SettingsGroup/SettingsGroup.xaml | 82 +++++++++++ .../Themes/Generic.xaml | 1 + .../XamlToolkit.WinUI.Controls.vcxproj | 25 ++++ ...XamlToolkit.WinUI.Controls.vcxproj.filters | 18 +++ .../ItemsCountToCornerRadiusConverter.cpp | 41 ++++++ .../ItemsCountToCornerRadiusConverter.h | 35 +++++ .../ItemsCountToCornerRadiusConverter.idl | 7 + .../XamlToolkit.WinUI.Converters.vcxproj | 11 ++ ...mlToolkit.WinUI.Converters.vcxproj.filters | 1 + 17 files changed, 741 insertions(+) create mode 100644 XamlToolkit.WinUI.Controls/SettingsControls/Helpers/TextBlockTemplateSelector.cpp create mode 100644 XamlToolkit.WinUI.Controls/SettingsControls/Helpers/TextBlockTemplateSelector.h create mode 100644 XamlToolkit.WinUI.Controls/SettingsControls/Helpers/TextBlockTemplateSelector.idl create mode 100644 XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.Callbacks.cpp create mode 100644 XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.Properties.cpp create mode 100644 XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.cpp create mode 100644 XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.h create mode 100644 XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.idl create mode 100644 XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.xaml create mode 100644 XamlToolkit.WinUI.Converters/ItemsCountToCornerRadiusConverter.cpp create mode 100644 XamlToolkit.WinUI.Converters/ItemsCountToCornerRadiusConverter.h create mode 100644 XamlToolkit.WinUI.Converters/ItemsCountToCornerRadiusConverter.idl diff --git a/XamlToolkit.WinUI.Controls/SettingsControls/Helpers/TextBlockTemplateSelector.cpp b/XamlToolkit.WinUI.Controls/SettingsControls/Helpers/TextBlockTemplateSelector.cpp new file mode 100644 index 00000000..1db710b0 --- /dev/null +++ b/XamlToolkit.WinUI.Controls/SettingsControls/Helpers/TextBlockTemplateSelector.cpp @@ -0,0 +1,29 @@ +#include "pch.h" + +#include "winrt_module_imports.h" +#include "TextBlockTemplateSelector.h" +#if __has_include("TextBlockTemplateSelector.g.cpp") +#include "TextBlockTemplateSelector.g.cpp" +#endif + +namespace winrt::XamlToolkit::WinUI::Controls::implementation +{ + winrt::DataTemplate TextBlockTemplateSelector::SelectTemplateCore(winrt::IInspectable const& item, winrt::DependencyObject const& container) + { + if (!item) return nullptr; + + if (auto string = item.try_as()) + { + return TextBlockTemplate; + } + else + { + return base_type::SelectTemplateCore(item, container); + } + } + + winrt::DataTemplate TextBlockTemplateSelector::SelectTemplateCore(winrt::IInspectable const& item) + { + return SelectTemplate(item, nullptr); + } +} diff --git a/XamlToolkit.WinUI.Controls/SettingsControls/Helpers/TextBlockTemplateSelector.h b/XamlToolkit.WinUI.Controls/SettingsControls/Helpers/TextBlockTemplateSelector.h new file mode 100644 index 00000000..d64d5a1f --- /dev/null +++ b/XamlToolkit.WinUI.Controls/SettingsControls/Helpers/TextBlockTemplateSelector.h @@ -0,0 +1,34 @@ +#pragma once + +#include "TextBlockTemplateSelector.g.h" + +#ifdef __INTELLISENSE__ +#include +#include +#endif + +namespace winrt +{ + using namespace winrt::Windows::Foundation; + using namespace winrt::Microsoft::UI::Xaml; +} + +namespace winrt::XamlToolkit::WinUI::Controls::implementation +{ + struct TextBlockTemplateSelector : TextBlockTemplateSelectorT + { + TextBlockTemplateSelector() = default; + + [[nodiscard]] winrt::DataTemplate SelectTemplateCore(winrt::IInspectable const& item, winrt::DependencyObject const& container); + [[nodiscard]] winrt::DataTemplate SelectTemplateCore(winrt::IInspectable const& item); + + wil::single_threaded_rw_property TextBlockTemplate; + }; +} + +namespace winrt::XamlToolkit::WinUI::Controls::factory_implementation +{ + struct TextBlockTemplateSelector : TextBlockTemplateSelectorT + { + }; +} diff --git a/XamlToolkit.WinUI.Controls/SettingsControls/Helpers/TextBlockTemplateSelector.idl b/XamlToolkit.WinUI.Controls/SettingsControls/Helpers/TextBlockTemplateSelector.idl new file mode 100644 index 00000000..47ca3086 --- /dev/null +++ b/XamlToolkit.WinUI.Controls/SettingsControls/Helpers/TextBlockTemplateSelector.idl @@ -0,0 +1,9 @@ +namespace XamlToolkit.WinUI.Controls +{ + [default_interface] runtimeclass TextBlockTemplateSelector : Microsoft.UI.Xaml.Controls.DataTemplateSelector + { + TextBlockTemplateSelector(); + + Microsoft.UI.Xaml.DataTemplate TextBlockTemplate { get; set; }; + } +} diff --git a/XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.Callbacks.cpp b/XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.Callbacks.cpp new file mode 100644 index 00000000..91b51cec --- /dev/null +++ b/XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.Callbacks.cpp @@ -0,0 +1,133 @@ +#include "pch.h" +#include "winrt_module_imports.h" +#include "SettingsGroup.h" + +namespace winrt::XamlToolkit::WinUI::Controls::implementation +{ + void SettingsGroup::OnItemsChanged(DependencyObject const& d, DependencyPropertyChangedEventArgs const& e) + { + if (auto settingsGroup = d.try_as()) + { + settingsGroup->RaiseItemsChanged(); + } + } + + void SettingsGroup::OnContentChanged(DependencyObject const& d, DependencyPropertyChangedEventArgs const& e) + { + if (auto settingsGroup = d.try_as()) + { + settingsGroup->RaiseContentChanged(); + } + } + + void SettingsGroup::OnHeaderIconChanged(DependencyObject const& d, DependencyPropertyChangedEventArgs const& e) + { + if (auto settingsGroup = d.try_as()) + { + settingsGroup->RaiseHeaderIconChanged(); + } + } + + void SettingsGroup::OnHeaderChanged(DependencyObject const& d, DependencyPropertyChangedEventArgs const& e) + { + if (auto settingsGroup = d.try_as()) + { + settingsGroup->RaiseHeaderChanged(); + } + } + + void SettingsGroup::OnDescriptionChanged(DependencyObject const& d, DependencyPropertyChangedEventArgs const& e) + { + if (auto settingsGroup = d.try_as()) + { + settingsGroup->RaiseDescriptionChanged(); + } + } + + void SettingsGroup::RaiseItemsChanged() + { + if (_itemsRepeater) + { + RootGridCornerRadius(GetRootGridCornerRadius()); + + if (_rootGrid) + { + _rootGrid.CornerRadius(RootGridCornerRadius()); + + if (Items().Size() > 0) + { + _rootGrid.BorderThickness(winrt::Thickness{ 1, 1, 1, 0 }); + } + else + { + _rootGrid.BorderThickness(winrt::Thickness{ 1, 1, 1, 1 }); + } + } + + auto size = Items().Size(); + for (int32_t i = 0; i < size; ++i) + { + auto item = Items().GetAt(i); + + if (auto control = item.try_as()) + { + winrt::CornerRadius cornerRadius{ 0 }; + winrt::Thickness borderThickness{ 1, 1, 1, 0 }; + + if (i == size - 1) + { + cornerRadius = winrt::CornerRadius{ 0, 0, 8, 8 }; + borderThickness = winrt::Thickness{ 1, 1, 1, 1 }; + } + control.BorderThickness(borderThickness); + control.CornerRadius(cornerRadius); + control.Padding(winrt::Thickness{ 25, 0, 25, 0 }); + control.Margin(winrt::Thickness{ 0 }); + } + } + _itemsRepeater.ItemsSource(Items()); + } + } + + void SettingsGroup::RaiseContentChanged() + { + if (_contentPresenter) + { + _contentPresenter.Visibility(Content() ? winrt::Visibility::Visible : winrt::Visibility::Collapsed); + } + } + + void SettingsGroup::RaiseHeaderIconChanged() + { + if (auto headerIconPresenter = GetTemplateChild(PartHeaderIconPresenter).try_as()) + { + headerIconPresenter.Visibility(HeaderIcon() ? winrt::Visibility::Visible : winrt::Visibility::Collapsed); + } + } + + void SettingsGroup::RaiseHeaderChanged() + { + if (_headerPresenter) + { + _headerPresenter.Visibility(Header() ? winrt::Visibility::Visible : winrt::Visibility::Collapsed); + } + } + + void SettingsGroup::RaiseDescriptionChanged() + { + if (_descriptionPresenter) + { + _descriptionPresenter.Visibility(Description() ? winrt::Visibility::Visible : winrt::Visibility::Collapsed); + } + } + + void SettingsGroup::Items_CollectionChanged(winrt::IInspectable const& s, winrt::IVectorChangedEventArgs const& e) + { + RaiseItemsChanged(); + } + + void SettingsGroup::SettingsGroup_IsEnabledChanged(winrt::IInspectable const& s, DependencyPropertyChangedEventArgs const& e) + { + winrt::VisualStateManager::GoToState(*this, IsEnabled() ? L"Normal" : L"Disabled", true); + } +} diff --git a/XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.Properties.cpp b/XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.Properties.cpp new file mode 100644 index 00000000..ae1c4542 --- /dev/null +++ b/XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.Properties.cpp @@ -0,0 +1,109 @@ +#include "pch.h" +#include "winrt_module_imports.h" +#include "SettingsGroup.h" + + +namespace winrt::XamlToolkit::WinUI::Controls::implementation +{ + const wil::single_threaded_property SettingsGroup::RootGridCornerRadiusProperty = + winrt::DependencyProperty::Register( + L"RootGridCornerRadius", + winrt::xaml_typename(), + winrt::xaml_typename(), + winrt::PropertyMetadata{ winrt::box_value(winrt::CornerRadius{ 0 }) }); + + const wil::single_threaded_property SettingsGroup::ItemsProperty = + winrt::DependencyProperty::Register( + L"Items", + winrt::xaml_typename>(), + winrt::xaml_typename(), + winrt::PropertyMetadata{ nullptr, &SettingsGroup::OnItemsChanged }); + + const wil::single_threaded_property SettingsGroup::ContentProperty = + winrt::DependencyProperty::Register( + L"Content", + winrt::xaml_typename(), + winrt::xaml_typename(), + winrt::PropertyMetadata{ winrt::IInspectable{}, &SettingsGroup::OnContentChanged }); + + const wil::single_threaded_property SettingsGroup::HeaderIconProperty = + winrt::DependencyProperty::Register( + L"HeaderIcon", + winrt::xaml_typename(), + winrt::xaml_typename(), + winrt::PropertyMetadata{ nullptr, &SettingsGroup::OnHeaderIconChanged }); + + const wil::single_threaded_property SettingsGroup::HeaderProperty = + winrt::DependencyProperty::Register( + L"Header", + winrt::xaml_typename(), + winrt::xaml_typename(), + winrt::PropertyMetadata{ nullptr, &SettingsGroup::OnHeaderChanged }); + + const wil::single_threaded_property SettingsGroup::DescriptionProperty = + winrt::DependencyProperty::Register( + L"Description", + winrt::xaml_typename(), + winrt::xaml_typename(), + winrt::PropertyMetadata{ nullptr, &SettingsGroup::OnDescriptionChanged }); + + winrt::CornerRadius SettingsGroup::RootGridCornerRadius() const noexcept + { + return winrt::unbox_value(GetValue(RootGridCornerRadiusProperty)); + } + + void SettingsGroup::RootGridCornerRadius(winrt::CornerRadius const& value) noexcept + { + SetValue(RootGridCornerRadiusProperty, winrt::box_value(value)); + } + + winrt::IObservableVector SettingsGroup::Items() const noexcept + { + return winrt::unbox_value>(GetValue(ItemsProperty)); + } + + void SettingsGroup::Items(winrt::IObservableVector const& value) noexcept + { + SetValue(ItemsProperty, winrt::box_value(value)); + } + + winrt::IInspectable SettingsGroup::Content() const noexcept + { + return winrt::unbox_value(GetValue(ContentProperty)); + } + + void SettingsGroup::Content(winrt::IInspectable const& value) noexcept + { + SetValue(ContentProperty, winrt::box_value(value)); + } + + winrt::IconElement SettingsGroup::HeaderIcon() const noexcept + { + return winrt::unbox_value(GetValue(HeaderIconProperty)); + } + + void SettingsGroup::HeaderIcon(winrt::IconElement const& value) noexcept + { + SetValue(HeaderIconProperty, winrt::box_value(value)); + } + + winrt::IInspectable SettingsGroup::Header() const noexcept + { + return winrt::unbox_value(GetValue(HeaderProperty)); + } + + void SettingsGroup::Header(winrt::IInspectable const& value) noexcept + { + SetValue(HeaderProperty, winrt::box_value(value)); + } + + winrt::IInspectable SettingsGroup::Description() const noexcept + { + return winrt::unbox_value(GetValue(DescriptionProperty)); + } + + void SettingsGroup::Description(winrt::IInspectable const& value) noexcept + { + SetValue(DescriptionProperty, winrt::box_value(value)); + } +} \ No newline at end of file diff --git a/XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.cpp b/XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.cpp new file mode 100644 index 00000000..4e1d0bf3 --- /dev/null +++ b/XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.cpp @@ -0,0 +1,52 @@ +#include "pch.h" +#include "winrt_module_imports.h" +#include "SettingsGroup.h" +#if __has_include("SettingsGroup.g.cpp") +#include "SettingsGroup.g.cpp" +#endif + +namespace winrt::XamlToolkit::WinUI::Controls::implementation +{ + SettingsGroup::SettingsGroup() + { + Items(winrt::single_threaded_observable_vector()); + _itemsVectorChangedRevoker_ = Items().VectorChanged(winrt::auto_revoke, { this, &SettingsGroup::Items_CollectionChanged }); + } + + void SettingsGroup::OnApplyTemplate() + { + _itemsRepeater = GetTemplateChild(PartItemsRepeater).try_as(); + _contentPresenter = GetTemplateChild(PartContentPresenter).try_as(); + _headerPresenter = GetTemplateChild(PartHeaderPresenter).try_as(); + _descriptionPresenter = GetTemplateChild(PartDescriptionPresenter).try_as(); + _rootGrid = GetTemplateChild(PartRootGrid).try_as(); + + if (_itemsRepeater) + { + RaiseItemsChanged(); + } + + SetEnabledState(); + + _isEnabledChangedRevoker = IsEnabledChanged(winrt::auto_revoke, { this, &SettingsGroup::SettingsGroup_IsEnabledChanged }); + + RaiseHeaderIconChanged(); + RaiseHeaderChanged(); + RaiseDescriptionChanged(); + RaiseContentChanged(); + + RootGridCornerRadius(GetRootGridCornerRadius()); + + base_type::OnApplyTemplate(); + } + + void SettingsGroup::SetEnabledState() + { + winrt::VisualStateManager::GoToState(*this, IsEnabled() ? L"Normal" : L"Disabled", true); + } + + winrt::CornerRadius SettingsGroup::GetRootGridCornerRadius() + { + return _radiusConverter.Convert(winrt::box_value(Items().Size()), winrt::TypeName{}, nullptr, winrt::hstring{}).as(); + } +} diff --git a/XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.h b/XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.h new file mode 100644 index 00000000..d5c1d16d --- /dev/null +++ b/XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.h @@ -0,0 +1,129 @@ +#pragma once + +#include "SettingsGroup.g.h" + +#ifdef __INTELLISENSE__ +#include +#include +#include +#endif + +namespace winrt +{ + using namespace winrt::Windows::Foundation; + using namespace winrt::Windows::Foundation::Collections; + using namespace winrt::Windows::UI::Xaml::Interop; + + using namespace winrt::Microsoft::UI::Xaml; + using namespace winrt::Microsoft::UI::Xaml::Controls; +} + +namespace winrt::XamlToolkit::WinUI::Controls::implementation +{ + struct SettingsGroup : SettingsGroupT + { + static constexpr auto PartContentPresenter = L"ContentPresenter"; + static constexpr auto PartHeaderIconPresenter = L"HeaderIconPresenter"; + static constexpr auto PartHeaderPresenter = L"HeaderPresenter"; + static constexpr auto PartDescriptionPresenter = L"DescriptionPresenter"; + static constexpr auto PartRootGrid = L"RootGrid"; + static constexpr auto PartItemsRepeater = L"ItemsRepeater"; + + SettingsGroup(); + + void OnApplyTemplate(); + + void SetEnabledState(); + +#pragma region Properties + + static const wil::single_threaded_property RootGridCornerRadiusProperty; + + static const wil::single_threaded_property ItemsProperty; + + static const wil::single_threaded_property ContentProperty; + + static const wil::single_threaded_property HeaderIconProperty; + + static const wil::single_threaded_property HeaderProperty; + + static const wil::single_threaded_property DescriptionProperty; + + [[nodiscard]] winrt::CornerRadius RootGridCornerRadius() const noexcept; + void RootGridCornerRadius(winrt::CornerRadius const& value) noexcept; + + [[nodiscrad]] winrt::IObservableVector Items() const noexcept; + void Items(winrt::IObservableVector const& value) noexcept; + + [[nodiscard]] winrt::IInspectable Content() const noexcept; + void Content(winrt::IInspectable const& value) noexcept; + + [[nodiscard]] winrt::IconElement HeaderIcon() const noexcept; + void HeaderIcon(winrt::IconElement const& value) noexcept; + + [[nodiscard]] winrt::IInspectable Header() const noexcept; + void Header(winrt::IInspectable const& value) noexcept; + + [[nodiscard]] winrt::IInspectable Description() const noexcept; + void Description(winrt::IInspectable const& value) noexcept; + +#pragma endregion + +#pragma region Callbacks + + static void OnItemsChanged(DependencyObject const& d, DependencyPropertyChangedEventArgs const& e); + + static void OnContentChanged(DependencyObject const& d, DependencyPropertyChangedEventArgs const& e); + + static void OnHeaderIconChanged(DependencyObject const& d, DependencyPropertyChangedEventArgs const& e); + + static void OnHeaderChanged(DependencyObject const& d, DependencyPropertyChangedEventArgs const& e); + + static void OnDescriptionChanged(DependencyObject const& d, DependencyPropertyChangedEventArgs const& e); + + void RaiseItemsChanged(); + + void RaiseContentChanged(); + + void RaiseDescriptionChanged(); + + void RaiseHeaderChanged(); + + void RaiseHeaderIconChanged(); + + void Items_CollectionChanged(winrt::IInspectable const& s, winrt::IVectorChangedEventArgs const& e); + + void SettingsGroup_IsEnabledChanged(winrt::IInspectable const& s, DependencyPropertyChangedEventArgs const& e); + +#pragma endregion + + private: + + SettingsGroup::IsEnabledChanged_revoker _isEnabledChangedRevoker; + + winrt::IObservableVector::VectorChanged_revoker _itemsVectorChangedRevoker_; + + winrt::ItemsRepeater _itemsRepeater; + + winrt::ContentPresenter _contentPresenter; + + winrt::ContentPresenter _descriptionPresenter; + + winrt::ContentPresenter _headerPresenter; + + winrt::Grid _rootGrid; + + static winrt::XamlToolkit::WinUI::Converters::ItemsCountToCornerRadiusConverter _radiusConverter; + + private: + + [[nodiscard]] winrt::CornerRadius GetRootGridCornerRadius(); + }; +} + +namespace winrt::XamlToolkit::WinUI::Controls::factory_implementation +{ + struct SettingsGroup : SettingsGroupT + { + }; +} diff --git a/XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.idl b/XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.idl new file mode 100644 index 00000000..9c15bfcf --- /dev/null +++ b/XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.idl @@ -0,0 +1,25 @@ +namespace XamlToolkit.WinUI.Controls +{ + [default_interface] runtimeclass SettingsGroup : Microsoft.UI.Xaml.Controls.Control + { + SettingsGroup(); + + static Microsoft.UI.Xaml.DependencyProperty RootGridCornerRadiusProperty { get; }; + Microsoft.UI.Xaml.CornerRadius RootGridCornerRadius { get; set; }; + + static Microsoft.UI.Xaml.DependencyProperty ItemsProperty { get; }; + Windows.Foundation.Collections.IObservableVector Items { get; set; }; + + static Microsoft.UI.Xaml.DependencyProperty ContentProperty { get; }; + Object Content { get; set; }; + + static Microsoft.UI.Xaml.DependencyProperty HeaderIconProperty { get; }; + Microsoft.UI.Xaml.Controls.IconElement HeaderIcon { get; set; }; + + static Microsoft.UI.Xaml.DependencyProperty HeaderProperty { get; }; + Object Header { get; set; }; + + static Microsoft.UI.Xaml.DependencyProperty DescriptionProperty { get; }; + Object Description { get; set; }; + } +} diff --git a/XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.xaml b/XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.xaml new file mode 100644 index 00000000..3baf9d20 --- /dev/null +++ b/XamlToolkit.WinUI.Controls/SettingsControls/SettingsGroup/SettingsGroup.xaml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/XamlToolkit.WinUI.Controls/Themes/Generic.xaml b/XamlToolkit.WinUI.Controls/Themes/Generic.xaml index 2c4f3434..dc9e56b4 100644 --- a/XamlToolkit.WinUI.Controls/Themes/Generic.xaml +++ b/XamlToolkit.WinUI.Controls/Themes/Generic.xaml @@ -2,6 +2,7 @@ + diff --git a/XamlToolkit.WinUI.Controls/XamlToolkit.WinUI.Controls.vcxproj b/XamlToolkit.WinUI.Controls/XamlToolkit.WinUI.Controls.vcxproj index 647d7c07..39b9c521 100644 --- a/XamlToolkit.WinUI.Controls/XamlToolkit.WinUI.Controls.vcxproj +++ b/XamlToolkit.WinUI.Controls/XamlToolkit.WinUI.Controls.vcxproj @@ -213,6 +213,14 @@ Code + + SettingsControls\Helpers\TextBlockTemplateSelector.idl + Code + + + SettingsControls\SettingsGroup\SettingsGroup.idl + Code + @@ -510,11 +518,21 @@ + + SettingsControls\Helpers\TextBlockTemplateSelector.idl + Code + + + + SettingsControls\SettingsGroup\SettingsGroup.idl + Code + + @@ -723,11 +741,17 @@ + + Designer + + + Designer + StaggeredLayout\StaggeredLayout.cpp @@ -815,6 +839,7 @@ + diff --git a/XamlToolkit.WinUI.Controls/XamlToolkit.WinUI.Controls.vcxproj.filters b/XamlToolkit.WinUI.Controls/XamlToolkit.WinUI.Controls.vcxproj.filters index 72f11d25..526f5bbc 100644 --- a/XamlToolkit.WinUI.Controls/XamlToolkit.WinUI.Controls.vcxproj.filters +++ b/XamlToolkit.WinUI.Controls/XamlToolkit.WinUI.Controls.vcxproj.filters @@ -98,6 +98,9 @@ {8e8f1622-f403-47a5-ad30-c8d2fdd2ac1c} + + {b596aea5-8dd0-4359-aaad-cd6eab8a5855} + @@ -264,6 +267,12 @@ ColorPicker + + SettingsControls\SettingsGroup + + + SettingsControls\SettingsGroup + @@ -463,6 +472,12 @@ StaggeredPanel + + SettingsControls\Helpers + + + SettingsControls\SettingsGroup + @@ -547,6 +562,9 @@ CameraPreview + + SettingsControls\SettingsGroup + diff --git a/XamlToolkit.WinUI.Converters/ItemsCountToCornerRadiusConverter.cpp b/XamlToolkit.WinUI.Converters/ItemsCountToCornerRadiusConverter.cpp new file mode 100644 index 00000000..6acfcda2 --- /dev/null +++ b/XamlToolkit.WinUI.Converters/ItemsCountToCornerRadiusConverter.cpp @@ -0,0 +1,41 @@ +#include "pch.h" +#include "winrt_module_imports.h" +#include "ItemsCountToCornerRadiusConverter.h" +#if __has_include("ItemsCountToCornerRadiusConverter.g.cpp") +#include "ItemsCountToCornerRadiusConverter.g.cpp" +#endif + +namespace winrt::XamlToolkit::WinUI::Converters::implementation +{ + winrt::IInspectable ItemsCountToCornerRadiusConverter::Convert(winrt::IInspectable const& value, + [[maybe_unused]] winrt::TypeName const& targetType, + [[maybe_unused]] winrt::IInspectable const& parameter, + [[maybe_unused]] winrt::hstring const& language) + { + uint32_t itemsCount{ 0 }; + + if (auto countInt = value.try_as()) + { + itemsCount = static_cast(*countInt); + } + else if (auto countUint = value.try_as()) + { + itemsCount = *countUint; + } + + if (itemsCount > 0) + { + return winrt::box_value(winrt::CornerRadius{ 8, 8, 0, 0 }); + } + return winrt::box_value(winrt::CornerRadius{ 8, 8, 8, 8 }); + } + + winrt::IInspectable ItemsCountToCornerRadiusConverter::ConvertBack( + [[maybe_unused]] winrt::IInspectable const& value, + [[maybe_unused]] winrt::TypeName const& targetType, + [[maybe_unused]] winrt::IInspectable const& parameter, + [[maybe_unused]] winrt::hstring const& language) + { + return value; + } +} diff --git a/XamlToolkit.WinUI.Converters/ItemsCountToCornerRadiusConverter.h b/XamlToolkit.WinUI.Converters/ItemsCountToCornerRadiusConverter.h new file mode 100644 index 00000000..aa223a26 --- /dev/null +++ b/XamlToolkit.WinUI.Converters/ItemsCountToCornerRadiusConverter.h @@ -0,0 +1,35 @@ +#pragma once + +#include "ItemsCountToCornerRadiusConverter.g.h" + +#ifdef __INTELLISENSE__ +#include +#include +#include +#endif + +namespace winrt +{ + using namespace winrt::Windows::Foundation; + using namespace winrt::Windows::UI::Xaml::Interop; + using namespace winrt::Microsoft::UI::Xaml; +} + +namespace winrt::XamlToolkit::WinUI::Converters::implementation +{ + struct ItemsCountToCornerRadiusConverter : ItemsCountToCornerRadiusConverterT + { + ItemsCountToCornerRadiusConverter() = default; + + [[nodiscard]] winrt::IInspectable Convert(winrt::IInspectable const& value, winrt::TypeName const& targetType, winrt::IInspectable const& parameter, winrt::hstring const& language); + + [[nodiscard]] winrt::IInspectable ConvertBack(winrt::IInspectable const& value, winrt::TypeName const& targetType, winrt::IInspectable const& parameter, winrt::hstring const& language); + }; +} + +namespace winrt::XamlToolkit::WinUI::Converters::factory_implementation +{ + struct ItemsCountToCornerRadiusConverter : ItemsCountToCornerRadiusConverterT + { + }; +} diff --git a/XamlToolkit.WinUI.Converters/ItemsCountToCornerRadiusConverter.idl b/XamlToolkit.WinUI.Converters/ItemsCountToCornerRadiusConverter.idl new file mode 100644 index 00000000..048f4fb6 --- /dev/null +++ b/XamlToolkit.WinUI.Converters/ItemsCountToCornerRadiusConverter.idl @@ -0,0 +1,7 @@ +namespace XamlToolkit.WinUI.Converters +{ + [default_interface] runtimeclass ItemsCountToCornerRadiusConverter : Microsoft.UI.Xaml.Data.IValueConverter + { + ItemsCountToCornerRadiusConverter(); + } +} diff --git a/XamlToolkit.WinUI.Converters/XamlToolkit.WinUI.Converters.vcxproj b/XamlToolkit.WinUI.Converters/XamlToolkit.WinUI.Converters.vcxproj index 7f0fb80e..62a6c4a8 100644 --- a/XamlToolkit.WinUI.Converters/XamlToolkit.WinUI.Converters.vcxproj +++ b/XamlToolkit.WinUI.Converters/XamlToolkit.WinUI.Converters.vcxproj @@ -158,6 +158,10 @@ FileSizeToFriendlyStringConverter.idl Code + + ItemsCountToCornerRadiusConverter.idl + Code + ResourceNameToResourceStringConverter.idl Code @@ -228,6 +232,10 @@ FileSizeToFriendlyStringConverter.idl Code + + ItemsCountToCornerRadiusConverter.idl + Code + ResourceNameToResourceStringConverter.idl Code @@ -296,6 +304,9 @@ Designer + + Designer + Designer diff --git a/XamlToolkit.WinUI.Converters/XamlToolkit.WinUI.Converters.vcxproj.filters b/XamlToolkit.WinUI.Converters/XamlToolkit.WinUI.Converters.vcxproj.filters index 1a46d530..3c16b5f9 100644 --- a/XamlToolkit.WinUI.Converters/XamlToolkit.WinUI.Converters.vcxproj.filters +++ b/XamlToolkit.WinUI.Converters/XamlToolkit.WinUI.Converters.vcxproj.filters @@ -69,6 +69,7 @@ +