use super::*;
pub enum Handle {
TextBlock(bindings::TextBlock),
Button(bindings::Button),
HyperlinkButton(bindings::HyperlinkButton),
RepeatButton(bindings::RepeatButton),
Border(bindings::Border),
BreadcrumbBar(bindings::BreadcrumbBar),
StackPanel(bindings::StackPanel),
VariableSizedWrapGrid(bindings::VariableSizedWrapGrid),
Grid(bindings::Grid),
TextBox(bindings::TextBox),
AutoSuggestBox(bindings::AutoSuggestBox),
PasswordBox(bindings::PasswordBox),
NumberBox(bindings::NumberBox),
Slider(bindings::Slider),
TitleBar(bindings::TitleBar),
NavigationView(bindings::NavigationView),
NavigationViewItem(bindings::NavigationViewItem),
SplitView(bindings::SplitView),
ProgressBar(bindings::ProgressBar),
ToggleSwitch(bindings::ToggleSwitch),
CheckBox(bindings::CheckBox),
ToggleButton(bindings::ToggleButton),
RadioButton(bindings::RadioButton),
RadioButtons(bindings::RadioButtons),
InfoBadge(bindings::InfoBadge),
InfoBar(bindings::InfoBar),
PersonPicture(bindings::PersonPicture),
ScrollViewer(bindings::ScrollViewer),
ScrollView(bindings::ScrollView),
Image(bindings::Image),
ProgressRing(bindings::ProgressRing),
ListBox(bindings::ListBox),
Rectangle(bindings::Rectangle),
Ellipse(bindings::Ellipse),
Line(bindings::Line),
SymbolIcon(bindings::SymbolIcon),
ImageIcon(bindings::ImageIcon),
FontIcon(bindings::FontIcon),
BitmapIcon(bindings::BitmapIcon),
PathIcon(bindings::PathIcon),
ListBoxItem(bindings::ListBoxItem),
RatingControl(bindings::RatingControl),
Expander(bindings::Expander),
ComboBox(bindings::ComboBox),
Pivot(bindings::Pivot),
PivotItem(bindings::PivotItem),
FlipView(bindings::FlipView),
SelectorBar(bindings::SelectorBar),
SelectorBarItem(bindings::SelectorBarItem),
TabView(bindings::TabView),
TabViewItem(bindings::TabViewItem),
TeachingTip(bindings::TeachingTip),
DropDownButton(bindings::DropDownButton),
CommandBar(bindings::CommandBar),
AppBarButton(bindings::AppBarButton),
AppBarSeparator(bindings::AppBarSeparator),
MenuBar(bindings::MenuBar),
MenuBarItem(bindings::MenuBarItem),
SplitButton(bindings::SplitButton),
ColorPicker(bindings::ColorPicker),
DatePicker(bindings::DatePicker),
TimePicker(bindings::TimePicker),
CalendarDatePicker(bindings::CalendarDatePicker),
ToolTip(bindings::ToolTip),
ContentDialog(bindings::ContentDialog),
CalendarView(bindings::CalendarView),
ListView(bindings::ListView),
ListViewItem(bindings::ListViewItem),
TreeView(bindings::TreeView),
GridView(bindings::GridView),
GridViewItem(bindings::GridViewItem),
RelativePanel(bindings::RelativePanel),
Canvas(bindings::Canvas),
RichEditBox(bindings::RichEditBox),
RichTextBlock(bindings::RichTextBlock),
Viewbox(bindings::Viewbox),
WebView2(bindings::WebView2),
SwapChainPanel(bindings::SwapChainPanel),
}
pub enum SlotCollection {
Inspectable(windows_collections::IVector<windows_core::IInspectable>),
ICommandBarElement(windows_collections::IVector<bindings::ICommandBarElement>),
MenuBarItem(windows_collections::IVector<bindings::MenuBarItem>),
SelectorBarItem(windows_collections::IVector<bindings::SelectorBarItem>),
}
#[allow(non_snake_case)]
impl SlotCollection {
pub fn Size(&self) -> Result<u32, RuntimeError> {
match self {
Self::Inspectable(value) => value.Size().map_err(native_error),
Self::ICommandBarElement(value) => value.Size().map_err(native_error),
Self::MenuBarItem(value) => value.Size().map_err(native_error),
Self::SelectorBarItem(value) => value.Size().map_err(native_error),
}
}
pub fn GetAt(&self, index: u32) -> Result<windows_core::IInspectable, RuntimeError> {
match self {
Self::Inspectable(value) => value.GetAt(index).map_err(native_error),
Self::ICommandBarElement(value) => {
value.GetAt(index).map(Into::into).map_err(native_error)
}
Self::MenuBarItem(value) => value.GetAt(index).map(Into::into).map_err(native_error),
Self::SelectorBarItem(value) => {
value.GetAt(index).map(Into::into).map_err(native_error)
}
}
}
pub fn InsertAt(
&self,
index: u32,
child: &windows_core::IInspectable,
) -> Result<(), RuntimeError> {
match self {
Self::Inspectable(value) => value.InsertAt(index, child).map_err(native_error),
Self::ICommandBarElement(value) => {
let child = child
.cast::<bindings::ICommandBarElement>()
.map_err(native_error)?;
value.InsertAt(index, &child).map_err(native_error)
}
Self::MenuBarItem(value) => {
let child = child
.cast::<bindings::MenuBarItem>()
.map_err(native_error)?;
value.InsertAt(index, &child).map_err(native_error)
}
Self::SelectorBarItem(value) => {
let child = child
.cast::<bindings::SelectorBarItem>()
.map_err(native_error)?;
value.InsertAt(index, &child).map_err(native_error)
}
}
}
pub fn RemoveAt(&self, index: u32) -> Result<(), RuntimeError> {
match self {
Self::Inspectable(value) => value.RemoveAt(index).map_err(native_error),
Self::ICommandBarElement(value) => value.RemoveAt(index).map_err(native_error),
Self::MenuBarItem(value) => value.RemoveAt(index).map_err(native_error),
Self::SelectorBarItem(value) => value.RemoveAt(index).map_err(native_error),
}
}
}
impl Handle {
pub fn create(kind: MountedKind) -> Result<Self, RuntimeError> {
Ok(match kind {
MountedKind::TextBlock => {
Self::TextBlock(bindings::TextBlock::new().map_err(native_error)?)
}
MountedKind::Button => Self::Button(bindings::Button::new().map_err(native_error)?),
MountedKind::HyperlinkButton => {
Self::HyperlinkButton(bindings::HyperlinkButton::new().map_err(native_error)?)
}
MountedKind::RepeatButton => {
Self::RepeatButton(bindings::RepeatButton::new().map_err(native_error)?)
}
MountedKind::Border => Self::Border(bindings::Border::new().map_err(native_error)?),
MountedKind::BreadcrumbBar => {
Self::BreadcrumbBar(bindings::BreadcrumbBar::new().map_err(native_error)?)
}
MountedKind::StackPanel => {
Self::StackPanel(bindings::StackPanel::new().map_err(native_error)?)
}
MountedKind::VariableSizedWrapGrid => Self::VariableSizedWrapGrid(
bindings::VariableSizedWrapGrid::new().map_err(native_error)?,
),
MountedKind::Grid => Self::Grid(bindings::Grid::new().map_err(native_error)?),
MountedKind::TextBox => Self::TextBox(bindings::TextBox::new().map_err(native_error)?),
MountedKind::AutoSuggestBox => {
Self::AutoSuggestBox(bindings::AutoSuggestBox::new().map_err(native_error)?)
}
MountedKind::PasswordBox => {
Self::PasswordBox(bindings::PasswordBox::new().map_err(native_error)?)
}
MountedKind::NumberBox => {
Self::NumberBox(bindings::NumberBox::new().map_err(native_error)?)
}
MountedKind::Slider => Self::Slider(bindings::Slider::new().map_err(native_error)?),
MountedKind::TitleBar => {
Self::TitleBar(bindings::TitleBar::new().map_err(native_error)?)
}
MountedKind::NavigationView => {
Self::NavigationView(bindings::NavigationView::new().map_err(native_error)?)
}
MountedKind::NavigationViewItem => {
Self::NavigationViewItem(bindings::NavigationViewItem::new().map_err(native_error)?)
}
MountedKind::SplitView => {
Self::SplitView(bindings::SplitView::new().map_err(native_error)?)
}
MountedKind::ProgressBar => {
Self::ProgressBar(bindings::ProgressBar::new().map_err(native_error)?)
}
MountedKind::ToggleSwitch => {
Self::ToggleSwitch(bindings::ToggleSwitch::new().map_err(native_error)?)
}
MountedKind::CheckBox => {
Self::CheckBox(bindings::CheckBox::new().map_err(native_error)?)
}
MountedKind::ToggleButton => {
Self::ToggleButton(bindings::ToggleButton::new().map_err(native_error)?)
}
MountedKind::RadioButton => {
Self::RadioButton(bindings::RadioButton::new().map_err(native_error)?)
}
MountedKind::RadioButtons => {
Self::RadioButtons(bindings::RadioButtons::new().map_err(native_error)?)
}
MountedKind::InfoBadge => {
Self::InfoBadge(bindings::InfoBadge::new().map_err(native_error)?)
}
MountedKind::InfoBar => Self::InfoBar(bindings::InfoBar::new().map_err(native_error)?),
MountedKind::PersonPicture => {
Self::PersonPicture(bindings::PersonPicture::new().map_err(native_error)?)
}
MountedKind::ScrollViewer => {
Self::ScrollViewer(bindings::ScrollViewer::new().map_err(native_error)?)
}
MountedKind::ScrollView => {
Self::ScrollView(bindings::ScrollView::new().map_err(native_error)?)
}
MountedKind::Image => Self::Image(bindings::Image::new().map_err(native_error)?),
MountedKind::ProgressRing => {
Self::ProgressRing(bindings::ProgressRing::new().map_err(native_error)?)
}
MountedKind::ListBox => Self::ListBox(bindings::ListBox::new().map_err(native_error)?),
MountedKind::Rectangle => {
Self::Rectangle(bindings::Rectangle::new().map_err(native_error)?)
}
MountedKind::Ellipse => Self::Ellipse(bindings::Ellipse::new().map_err(native_error)?),
MountedKind::Line => Self::Line(bindings::Line::new().map_err(native_error)?),
MountedKind::SymbolIcon => {
Self::SymbolIcon(bindings::SymbolIcon::new().map_err(native_error)?)
}
MountedKind::ImageIcon => {
Self::ImageIcon(bindings::ImageIcon::new().map_err(native_error)?)
}
MountedKind::FontIcon => {
Self::FontIcon(bindings::FontIcon::new().map_err(native_error)?)
}
MountedKind::BitmapIcon => {
Self::BitmapIcon(bindings::BitmapIcon::new().map_err(native_error)?)
}
MountedKind::PathIcon => {
Self::PathIcon(bindings::PathIcon::new().map_err(native_error)?)
}
MountedKind::ListBoxItem => {
Self::ListBoxItem(bindings::ListBoxItem::new().map_err(native_error)?)
}
MountedKind::RatingControl => {
Self::RatingControl(bindings::RatingControl::new().map_err(native_error)?)
}
MountedKind::Expander => {
Self::Expander(bindings::Expander::new().map_err(native_error)?)
}
MountedKind::ComboBox => {
Self::ComboBox(bindings::ComboBox::new().map_err(native_error)?)
}
MountedKind::Pivot => Self::Pivot(bindings::Pivot::new().map_err(native_error)?),
MountedKind::PivotItem => {
Self::PivotItem(bindings::PivotItem::new().map_err(native_error)?)
}
MountedKind::FlipView => {
Self::FlipView(bindings::FlipView::new().map_err(native_error)?)
}
MountedKind::SelectorBar => {
Self::SelectorBar(bindings::SelectorBar::new().map_err(native_error)?)
}
MountedKind::SelectorBarItem => {
Self::SelectorBarItem(bindings::SelectorBarItem::new().map_err(native_error)?)
}
MountedKind::TabView => Self::TabView(bindings::TabView::new().map_err(native_error)?),
MountedKind::TabViewItem => {
Self::TabViewItem(bindings::TabViewItem::new().map_err(native_error)?)
}
MountedKind::TeachingTip => {
Self::TeachingTip(bindings::TeachingTip::new().map_err(native_error)?)
}
MountedKind::DropDownButton => {
Self::DropDownButton(bindings::DropDownButton::new().map_err(native_error)?)
}
MountedKind::CommandBar => {
Self::CommandBar(bindings::CommandBar::new().map_err(native_error)?)
}
MountedKind::AppBarButton => {
Self::AppBarButton(bindings::AppBarButton::new().map_err(native_error)?)
}
MountedKind::AppBarSeparator => {
Self::AppBarSeparator(bindings::AppBarSeparator::new().map_err(native_error)?)
}
MountedKind::MenuBar => Self::MenuBar(bindings::MenuBar::new().map_err(native_error)?),
MountedKind::MenuBarItem => {
Self::MenuBarItem(bindings::MenuBarItem::new().map_err(native_error)?)
}
MountedKind::SplitButton => {
Self::SplitButton(bindings::SplitButton::new().map_err(native_error)?)
}
MountedKind::ColorPicker => {
Self::ColorPicker(bindings::ColorPicker::new().map_err(native_error)?)
}
MountedKind::DatePicker => {
Self::DatePicker(bindings::DatePicker::new().map_err(native_error)?)
}
MountedKind::TimePicker => {
Self::TimePicker(bindings::TimePicker::new().map_err(native_error)?)
}
MountedKind::CalendarDatePicker => {
Self::CalendarDatePicker(bindings::CalendarDatePicker::new().map_err(native_error)?)
}
MountedKind::ToolTip => Self::ToolTip(bindings::ToolTip::new().map_err(native_error)?),
MountedKind::ContentDialog => {
Self::ContentDialog(bindings::ContentDialog::new().map_err(native_error)?)
}
MountedKind::CalendarView => {
Self::CalendarView(bindings::CalendarView::new().map_err(native_error)?)
}
MountedKind::ListView => {
Self::ListView(bindings::ListView::new().map_err(native_error)?)
}
MountedKind::ListViewItem => {
Self::ListViewItem(bindings::ListViewItem::new().map_err(native_error)?)
}
MountedKind::TreeView => {
Self::TreeView(bindings::TreeView::new().map_err(native_error)?)
}
MountedKind::GridView => {
Self::GridView(bindings::GridView::new().map_err(native_error)?)
}
MountedKind::GridViewItem => {
Self::GridViewItem(bindings::GridViewItem::new().map_err(native_error)?)
}
MountedKind::RelativePanel => {
Self::RelativePanel(bindings::RelativePanel::new().map_err(native_error)?)
}
MountedKind::Canvas => Self::Canvas(bindings::Canvas::new().map_err(native_error)?),
MountedKind::RichEditBox => {
Self::RichEditBox(bindings::RichEditBox::new().map_err(native_error)?)
}
MountedKind::RichTextBlock => {
Self::RichTextBlock(bindings::RichTextBlock::new().map_err(native_error)?)
}
MountedKind::Viewbox => Self::Viewbox(bindings::Viewbox::new().map_err(native_error)?),
MountedKind::WebView2 => {
Self::WebView2(bindings::WebView2::new().map_err(native_error)?)
}
MountedKind::SwapChainPanel => {
Self::SwapChainPanel(bindings::SwapChainPanel::new().map_err(native_error)?)
}
MountedKind::ItemsRepeater => return Err(RuntimeError::UnsupportedKind),
})
}
pub fn ui_element(&self) -> windows_core::Result<UIElement> {
match self {
Self::TextBlock(value) => value.cast(),
Self::Button(value) => value.cast(),
Self::HyperlinkButton(value) => value.cast(),
Self::RepeatButton(value) => value.cast(),
Self::Border(value) => value.cast(),
Self::BreadcrumbBar(value) => value.cast(),
Self::StackPanel(value) => value.cast(),
Self::VariableSizedWrapGrid(value) => value.cast(),
Self::Grid(value) => value.cast(),
Self::TextBox(value) => value.cast(),
Self::AutoSuggestBox(value) => value.cast(),
Self::PasswordBox(value) => value.cast(),
Self::NumberBox(value) => value.cast(),
Self::Slider(value) => value.cast(),
Self::TitleBar(value) => value.cast(),
Self::NavigationView(value) => value.cast(),
Self::NavigationViewItem(value) => value.cast(),
Self::SplitView(value) => value.cast(),
Self::ProgressBar(value) => value.cast(),
Self::ToggleSwitch(value) => value.cast(),
Self::CheckBox(value) => value.cast(),
Self::ToggleButton(value) => value.cast(),
Self::RadioButton(value) => value.cast(),
Self::RadioButtons(value) => value.cast(),
Self::InfoBadge(value) => value.cast(),
Self::InfoBar(value) => value.cast(),
Self::PersonPicture(value) => value.cast(),
Self::ScrollViewer(value) => value.cast(),
Self::ScrollView(value) => value.cast(),
Self::Image(value) => value.cast(),
Self::ProgressRing(value) => value.cast(),
Self::ListBox(value) => value.cast(),
Self::Rectangle(value) => value.cast(),
Self::Ellipse(value) => value.cast(),
Self::Line(value) => value.cast(),
Self::SymbolIcon(value) => value.cast(),
Self::ImageIcon(value) => value.cast(),
Self::FontIcon(value) => value.cast(),
Self::BitmapIcon(value) => value.cast(),
Self::PathIcon(value) => value.cast(),
Self::ListBoxItem(value) => value.cast(),
Self::RatingControl(value) => value.cast(),
Self::Expander(value) => value.cast(),
Self::ComboBox(value) => value.cast(),
Self::Pivot(value) => value.cast(),
Self::PivotItem(value) => value.cast(),
Self::FlipView(value) => value.cast(),
Self::SelectorBar(value) => value.cast(),
Self::SelectorBarItem(value) => value.cast(),
Self::TabView(value) => value.cast(),
Self::TabViewItem(value) => value.cast(),
Self::TeachingTip(value) => value.cast(),
Self::DropDownButton(value) => value.cast(),
Self::CommandBar(value) => value.cast(),
Self::AppBarButton(value) => value.cast(),
Self::AppBarSeparator(value) => value.cast(),
Self::MenuBar(value) => value.cast(),
Self::MenuBarItem(value) => value.cast(),
Self::SplitButton(value) => value.cast(),
Self::ColorPicker(value) => value.cast(),
Self::DatePicker(value) => value.cast(),
Self::TimePicker(value) => value.cast(),
Self::CalendarDatePicker(value) => value.cast(),
Self::ToolTip(value) => value.cast(),
Self::ContentDialog(value) => value.cast(),
Self::CalendarView(value) => value.cast(),
Self::ListView(value) => value.cast(),
Self::ListViewItem(value) => value.cast(),
Self::TreeView(value) => value.cast(),
Self::GridView(value) => value.cast(),
Self::GridViewItem(value) => value.cast(),
Self::RelativePanel(value) => value.cast(),
Self::Canvas(value) => value.cast(),
Self::RichEditBox(value) => value.cast(),
Self::RichTextBlock(value) => value.cast(),
Self::Viewbox(value) => value.cast(),
Self::WebView2(value) => value.cast(),
Self::SwapChainPanel(value) => value.cast(),
}
}
pub fn dependency_object(&self) -> windows_core::Result<IDependencyObject> {
match self {
Self::TextBlock(value) => value.cast(),
Self::Button(value) => value.cast(),
Self::HyperlinkButton(value) => value.cast(),
Self::RepeatButton(value) => value.cast(),
Self::Border(value) => value.cast(),
Self::BreadcrumbBar(value) => value.cast(),
Self::StackPanel(value) => value.cast(),
Self::VariableSizedWrapGrid(value) => value.cast(),
Self::Grid(value) => value.cast(),
Self::TextBox(value) => value.cast(),
Self::AutoSuggestBox(value) => value.cast(),
Self::PasswordBox(value) => value.cast(),
Self::NumberBox(value) => value.cast(),
Self::Slider(value) => value.cast(),
Self::TitleBar(value) => value.cast(),
Self::NavigationView(value) => value.cast(),
Self::NavigationViewItem(value) => value.cast(),
Self::SplitView(value) => value.cast(),
Self::ProgressBar(value) => value.cast(),
Self::ToggleSwitch(value) => value.cast(),
Self::CheckBox(value) => value.cast(),
Self::ToggleButton(value) => value.cast(),
Self::RadioButton(value) => value.cast(),
Self::RadioButtons(value) => value.cast(),
Self::InfoBadge(value) => value.cast(),
Self::InfoBar(value) => value.cast(),
Self::PersonPicture(value) => value.cast(),
Self::ScrollViewer(value) => value.cast(),
Self::ScrollView(value) => value.cast(),
Self::Image(value) => value.cast(),
Self::ProgressRing(value) => value.cast(),
Self::ListBox(value) => value.cast(),
Self::Rectangle(value) => value.cast(),
Self::Ellipse(value) => value.cast(),
Self::Line(value) => value.cast(),
Self::SymbolIcon(value) => value.cast(),
Self::ImageIcon(value) => value.cast(),
Self::FontIcon(value) => value.cast(),
Self::BitmapIcon(value) => value.cast(),
Self::PathIcon(value) => value.cast(),
Self::ListBoxItem(value) => value.cast(),
Self::RatingControl(value) => value.cast(),
Self::Expander(value) => value.cast(),
Self::ComboBox(value) => value.cast(),
Self::Pivot(value) => value.cast(),
Self::PivotItem(value) => value.cast(),
Self::FlipView(value) => value.cast(),
Self::SelectorBar(value) => value.cast(),
Self::SelectorBarItem(value) => value.cast(),
Self::TabView(value) => value.cast(),
Self::TabViewItem(value) => value.cast(),
Self::TeachingTip(value) => value.cast(),
Self::DropDownButton(value) => value.cast(),
Self::CommandBar(value) => value.cast(),
Self::AppBarButton(value) => value.cast(),
Self::AppBarSeparator(value) => value.cast(),
Self::MenuBar(value) => value.cast(),
Self::MenuBarItem(value) => value.cast(),
Self::SplitButton(value) => value.cast(),
Self::ColorPicker(value) => value.cast(),
Self::DatePicker(value) => value.cast(),
Self::TimePicker(value) => value.cast(),
Self::CalendarDatePicker(value) => value.cast(),
Self::ToolTip(value) => value.cast(),
Self::ContentDialog(value) => value.cast(),
Self::CalendarView(value) => value.cast(),
Self::ListView(value) => value.cast(),
Self::ListViewItem(value) => value.cast(),
Self::TreeView(value) => value.cast(),
Self::GridView(value) => value.cast(),
Self::GridViewItem(value) => value.cast(),
Self::RelativePanel(value) => value.cast(),
Self::Canvas(value) => value.cast(),
Self::RichEditBox(value) => value.cast(),
Self::RichTextBlock(value) => value.cast(),
Self::Viewbox(value) => value.cast(),
Self::WebView2(value) => value.cast(),
Self::SwapChainPanel(value) => value.cast(),
}
}
pub fn kind(&self) -> MountedKind {
match self {
Self::TextBlock(_) => MountedKind::TextBlock,
Self::Button(_) => MountedKind::Button,
Self::HyperlinkButton(_) => MountedKind::HyperlinkButton,
Self::RepeatButton(_) => MountedKind::RepeatButton,
Self::Border(_) => MountedKind::Border,
Self::BreadcrumbBar(_) => MountedKind::BreadcrumbBar,
Self::StackPanel(_) => MountedKind::StackPanel,
Self::VariableSizedWrapGrid(_) => MountedKind::VariableSizedWrapGrid,
Self::Grid(_) => MountedKind::Grid,
Self::TextBox(_) => MountedKind::TextBox,
Self::AutoSuggestBox(_) => MountedKind::AutoSuggestBox,
Self::PasswordBox(_) => MountedKind::PasswordBox,
Self::NumberBox(_) => MountedKind::NumberBox,
Self::Slider(_) => MountedKind::Slider,
Self::TitleBar(_) => MountedKind::TitleBar,
Self::NavigationView(_) => MountedKind::NavigationView,
Self::NavigationViewItem(_) => MountedKind::NavigationViewItem,
Self::SplitView(_) => MountedKind::SplitView,
Self::ProgressBar(_) => MountedKind::ProgressBar,
Self::ToggleSwitch(_) => MountedKind::ToggleSwitch,
Self::CheckBox(_) => MountedKind::CheckBox,
Self::ToggleButton(_) => MountedKind::ToggleButton,
Self::RadioButton(_) => MountedKind::RadioButton,
Self::RadioButtons(_) => MountedKind::RadioButtons,
Self::InfoBadge(_) => MountedKind::InfoBadge,
Self::InfoBar(_) => MountedKind::InfoBar,
Self::PersonPicture(_) => MountedKind::PersonPicture,
Self::ScrollViewer(_) => MountedKind::ScrollViewer,
Self::ScrollView(_) => MountedKind::ScrollView,
Self::Image(_) => MountedKind::Image,
Self::ProgressRing(_) => MountedKind::ProgressRing,
Self::ListBox(_) => MountedKind::ListBox,
Self::Rectangle(_) => MountedKind::Rectangle,
Self::Ellipse(_) => MountedKind::Ellipse,
Self::Line(_) => MountedKind::Line,
Self::SymbolIcon(_) => MountedKind::SymbolIcon,
Self::ImageIcon(_) => MountedKind::ImageIcon,
Self::FontIcon(_) => MountedKind::FontIcon,
Self::BitmapIcon(_) => MountedKind::BitmapIcon,
Self::PathIcon(_) => MountedKind::PathIcon,
Self::ListBoxItem(_) => MountedKind::ListBoxItem,
Self::RatingControl(_) => MountedKind::RatingControl,
Self::Expander(_) => MountedKind::Expander,
Self::ComboBox(_) => MountedKind::ComboBox,
Self::Pivot(_) => MountedKind::Pivot,
Self::PivotItem(_) => MountedKind::PivotItem,
Self::FlipView(_) => MountedKind::FlipView,
Self::SelectorBar(_) => MountedKind::SelectorBar,
Self::SelectorBarItem(_) => MountedKind::SelectorBarItem,
Self::TabView(_) => MountedKind::TabView,
Self::TabViewItem(_) => MountedKind::TabViewItem,
Self::TeachingTip(_) => MountedKind::TeachingTip,
Self::DropDownButton(_) => MountedKind::DropDownButton,
Self::CommandBar(_) => MountedKind::CommandBar,
Self::AppBarButton(_) => MountedKind::AppBarButton,
Self::AppBarSeparator(_) => MountedKind::AppBarSeparator,
Self::MenuBar(_) => MountedKind::MenuBar,
Self::MenuBarItem(_) => MountedKind::MenuBarItem,
Self::SplitButton(_) => MountedKind::SplitButton,
Self::ColorPicker(_) => MountedKind::ColorPicker,
Self::DatePicker(_) => MountedKind::DatePicker,
Self::TimePicker(_) => MountedKind::TimePicker,
Self::CalendarDatePicker(_) => MountedKind::CalendarDatePicker,
Self::ToolTip(_) => MountedKind::ToolTip,
Self::ContentDialog(_) => MountedKind::ContentDialog,
Self::CalendarView(_) => MountedKind::CalendarView,
Self::ListView(_) => MountedKind::ListView,
Self::ListViewItem(_) => MountedKind::ListViewItem,
Self::TreeView(_) => MountedKind::TreeView,
Self::GridView(_) => MountedKind::GridView,
Self::GridViewItem(_) => MountedKind::GridViewItem,
Self::RelativePanel(_) => MountedKind::RelativePanel,
Self::Canvas(_) => MountedKind::Canvas,
Self::RichEditBox(_) => MountedKind::RichEditBox,
Self::RichTextBlock(_) => MountedKind::RichTextBlock,
Self::Viewbox(_) => MountedKind::Viewbox,
Self::WebView2(_) => MountedKind::WebView2,
Self::SwapChainPanel(_) => MountedKind::SwapChainPanel,
}
}
pub fn is_content(&self) -> bool {
matches!(
self,
Self::Button(_)
| Self::HyperlinkButton(_)
| Self::RepeatButton(_)
| Self::Border(_)
| Self::CheckBox(_)
| Self::ToggleButton(_)
| Self::RadioButton(_)
| Self::ScrollViewer(_)
| Self::ScrollView(_)
| Self::ListBoxItem(_)
| Self::PivotItem(_)
| Self::TabViewItem(_)
| Self::DropDownButton(_)
| Self::SplitButton(_)
| Self::ToolTip(_)
| Self::ContentDialog(_)
| Self::ListViewItem(_)
| Self::GridViewItem(_)
)
}
pub fn child_collection(&self) -> Result<Option<UIElementCollection>, RuntimeError> {
Ok(match self {
Self::StackPanel(value) => Some(
value
.cast::<IPanel>()
.map_err(native_error)?
.Children()
.map_err(native_error)?,
),
Self::VariableSizedWrapGrid(value) => Some(
value
.cast::<IPanel>()
.map_err(native_error)?
.Children()
.map_err(native_error)?,
),
Self::Grid(value) => Some(
value
.cast::<IPanel>()
.map_err(native_error)?
.Children()
.map_err(native_error)?,
),
Self::RelativePanel(value) => Some(
value
.cast::<IPanel>()
.map_err(native_error)?
.Children()
.map_err(native_error)?,
),
Self::Canvas(value) => Some(
value
.cast::<IPanel>()
.map_err(native_error)?
.Children()
.map_err(native_error)?,
),
_ => None,
})
}
}
pub fn set_content(handle: &Handle, child: Option<&UIElement>) -> Result<(), RuntimeError> {
match handle {
Handle::Button(control) => {
let control = control.cast::<IContentControl>().map_err(native_error)?;
match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control
.SetContent(None::<&windows_core::IInspectable>)
.map_err(native_error),
}
}
Handle::HyperlinkButton(control) => {
let control = control.cast::<IContentControl>().map_err(native_error)?;
match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control
.SetContent(None::<&windows_core::IInspectable>)
.map_err(native_error),
}
}
Handle::RepeatButton(control) => {
let control = control.cast::<IContentControl>().map_err(native_error)?;
match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control
.SetContent(None::<&windows_core::IInspectable>)
.map_err(native_error),
}
}
Handle::Border(control) => match child {
Some(child) => control.SetChild(child).map_err(native_error),
None => control.SetChild(None::<&UIElement>).map_err(native_error),
},
Handle::CheckBox(control) => {
let control = control.cast::<IContentControl>().map_err(native_error)?;
match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control
.SetContent(None::<&windows_core::IInspectable>)
.map_err(native_error),
}
}
Handle::ToggleButton(control) => {
let control = control.cast::<IContentControl>().map_err(native_error)?;
match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control
.SetContent(None::<&windows_core::IInspectable>)
.map_err(native_error),
}
}
Handle::RadioButton(control) => {
let control = control.cast::<IContentControl>().map_err(native_error)?;
match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control
.SetContent(None::<&windows_core::IInspectable>)
.map_err(native_error),
}
}
Handle::ScrollViewer(control) => {
let control = control.cast::<IContentControl>().map_err(native_error)?;
match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control
.SetContent(None::<&windows_core::IInspectable>)
.map_err(native_error),
}
}
Handle::ScrollView(control) => match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control.SetContent(None::<&UIElement>).map_err(native_error),
},
Handle::ListBoxItem(control) => {
let control = control.cast::<IContentControl>().map_err(native_error)?;
match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control
.SetContent(None::<&windows_core::IInspectable>)
.map_err(native_error),
}
}
Handle::PivotItem(control) => {
let control = control.cast::<IContentControl>().map_err(native_error)?;
match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control
.SetContent(None::<&windows_core::IInspectable>)
.map_err(native_error),
}
}
Handle::TabViewItem(control) => {
let control = control.cast::<IContentControl>().map_err(native_error)?;
match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control
.SetContent(None::<&windows_core::IInspectable>)
.map_err(native_error),
}
}
Handle::DropDownButton(control) => {
let control = control.cast::<IContentControl>().map_err(native_error)?;
match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control
.SetContent(None::<&windows_core::IInspectable>)
.map_err(native_error),
}
}
Handle::SplitButton(control) => {
let control = control.cast::<IContentControl>().map_err(native_error)?;
match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control
.SetContent(None::<&windows_core::IInspectable>)
.map_err(native_error),
}
}
Handle::ToolTip(control) => {
let control = control.cast::<IContentControl>().map_err(native_error)?;
match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control
.SetContent(None::<&windows_core::IInspectable>)
.map_err(native_error),
}
}
Handle::ContentDialog(control) => {
let control = control.cast::<IContentControl>().map_err(native_error)?;
match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control
.SetContent(None::<&windows_core::IInspectable>)
.map_err(native_error),
}
}
Handle::ListViewItem(control) => {
let control = control.cast::<IContentControl>().map_err(native_error)?;
match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control
.SetContent(None::<&windows_core::IInspectable>)
.map_err(native_error),
}
}
Handle::GridViewItem(control) => {
let control = control.cast::<IContentControl>().map_err(native_error)?;
match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control
.SetContent(None::<&windows_core::IInspectable>)
.map_err(native_error),
}
}
_ => Err(RuntimeError::UnsupportedKind),
}
}
pub fn set_property(
handle: &Handle,
property: PropertyId,
value: &PropertyValue,
) -> Result<(), RuntimeError> {
match (handle, property, value) {
(Handle::TextBlock(control), PropertyId::TextBlockText, PropertyValue::Str(value)) => {
control.SetText(value).map_err(native_error)
}
(
Handle::TextBlock(control),
PropertyId::TextBlockTextWrapping,
PropertyValue::TextWrapping(value),
) => control
.SetTextWrapping(match value {
crate::TextWrapping::NoWrap => bindings::TextWrapping::NoWrap,
crate::TextWrapping::Wrap => bindings::TextWrapping::Wrap,
crate::TextWrapping::WrapWholeWords => bindings::TextWrapping::WrapWholeWords,
})
.map_err(native_error),
(Handle::TextBlock(control), PropertyId::TextBlockFontSize, PropertyValue::F64(value)) => {
control.SetFontSize(*value).map_err(native_error)
}
(
Handle::TextBlock(control),
PropertyId::TextBlockFontWeight,
PropertyValue::FontWeight(value),
) => control
.SetFontWeight(bindings::FontWeight {
weight: value.get(),
})
.map_err(native_error),
(
Handle::TextBlock(control),
PropertyId::TextBlockIsTextSelectionEnabled,
PropertyValue::Bool(value),
) => control
.SetIsTextSelectionEnabled(*value)
.map_err(native_error),
(Handle::TextBlock(control), PropertyId::TextBlockMaxLines, PropertyValue::I32(value)) => {
control.SetMaxLines(*value).map_err(native_error)
}
(
Handle::TextBlock(control),
PropertyId::TextBlockTextTrimming,
PropertyValue::TextTrimming(value),
) => control
.SetTextTrimming(match value {
crate::TextTrimming::None => bindings::TextTrimming::None,
crate::TextTrimming::CharacterEllipsis => bindings::TextTrimming::CharacterEllipsis,
crate::TextTrimming::WordEllipsis => bindings::TextTrimming::WordEllipsis,
crate::TextTrimming::Clip => bindings::TextTrimming::Clip,
})
.map_err(native_error),
(
Handle::TextBlock(control),
PropertyId::TextBlockForeground,
PropertyValue::Brush(crate::Brush::Solid(color)),
) => {
let brush = SolidColorBrush::new().map_err(native_error)?;
brush
.SetColor(bindings::Color {
a: color.a,
r: color.r,
g: color.g,
b: color.b,
})
.map_err(native_error)?;
control.SetForeground(&brush).map_err(native_error)
}
(Handle::Button(control), PropertyId::ButtonIsEnabled, PropertyValue::Bool(value)) => {
control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error)
}
(
Handle::Button(control),
PropertyId::ButtonHorizontalContentAlignment,
PropertyValue::HorizontalAlignment(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetHorizontalContentAlignment(match value {
crate::HorizontalAlignment::Left => bindings::HorizontalAlignment::Left,
crate::HorizontalAlignment::Center => bindings::HorizontalAlignment::Center,
crate::HorizontalAlignment::Right => bindings::HorizontalAlignment::Right,
crate::HorizontalAlignment::Stretch => bindings::HorizontalAlignment::Stretch,
})
.map_err(native_error),
(
Handle::Button(control),
PropertyId::ButtonVerticalContentAlignment,
PropertyValue::VerticalAlignment(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetVerticalContentAlignment(match value {
crate::VerticalAlignment::Top => bindings::VerticalAlignment::Top,
crate::VerticalAlignment::Center => bindings::VerticalAlignment::Center,
crate::VerticalAlignment::Bottom => bindings::VerticalAlignment::Bottom,
crate::VerticalAlignment::Stretch => bindings::VerticalAlignment::Stretch,
})
.map_err(native_error),
(Handle::Button(_), PropertyId::ButtonResources, PropertyValue::ResourceOverrides(_)) => {
Err(RuntimeError::UnsupportedKind)
}
(Handle::Button(control), PropertyId::ButtonStyle, PropertyValue::ButtonStyle(value)) => {
let resource = match value {
crate::ButtonStyle::Default => None,
crate::ButtonStyle::Accent => Some("AccentButtonStyle"),
crate::ButtonStyle::Subtle => Some("SubtleButtonStyle"),
crate::ButtonStyle::TextLink => Some("TextBlockButtonStyle"),
};
let element = control.cast::<IFrameworkElement>().map_err(native_error)?;
set_resource_style(&element, resource)
}
(
Handle::Button(_),
PropertyId::ButtonKeyboardAccelerators,
PropertyValue::KeyAccelerators(_),
) => Err(RuntimeError::UnsupportedKind),
(
Handle::HyperlinkButton(control),
PropertyId::HyperlinkButtonNavigateUri,
PropertyValue::Str(value),
) => {
let value = Uri::CreateUri(value).map_err(native_error)?;
control.SetNavigateUri(&value).map_err(native_error)
}
(
Handle::HyperlinkButton(control),
PropertyId::HyperlinkButtonIsEnabled,
PropertyValue::Bool(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error),
(
Handle::RepeatButton(control),
PropertyId::RepeatButtonDelay,
PropertyValue::I32(value),
) => control.SetDelay(*value).map_err(native_error),
(
Handle::RepeatButton(control),
PropertyId::RepeatButtonInterval,
PropertyValue::I32(value),
) => control.SetInterval(*value).map_err(native_error),
(
Handle::RepeatButton(control),
PropertyId::RepeatButtonIsEnabled,
PropertyValue::Bool(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error),
(Handle::Border(control), PropertyId::BorderPadding, PropertyValue::Thickness(value)) => {
control
.SetPadding({
let [left, top, right, bottom] = value.values();
bindings::Thickness {
left,
top,
right,
bottom,
}
})
.map_err(native_error)
}
(
Handle::Border(control),
PropertyId::BorderBorderThickness,
PropertyValue::Thickness(value),
) => control
.SetBorderThickness({
let [left, top, right, bottom] = value.values();
bindings::Thickness {
left,
top,
right,
bottom,
}
})
.map_err(native_error),
(
Handle::Border(control),
PropertyId::BorderCornerRadius,
PropertyValue::CornerRadius(value),
) => control
.SetCornerRadius({
let [top_left, top_right, bottom_right, bottom_left] = value.values();
bindings::CornerRadius {
top_left,
top_right,
bottom_right,
bottom_left,
}
})
.map_err(native_error),
(
Handle::Border(control),
PropertyId::BorderBackground,
PropertyValue::Brush(crate::Brush::Solid(color)),
) => {
let brush = SolidColorBrush::new().map_err(native_error)?;
brush
.SetColor(bindings::Color {
a: color.a,
r: color.r,
g: color.g,
b: color.b,
})
.map_err(native_error)?;
control.SetBackground(&brush).map_err(native_error)
}
(
Handle::Border(control),
PropertyId::BorderBorderBrush,
PropertyValue::Brush(crate::Brush::Solid(color)),
) => {
let brush = SolidColorBrush::new().map_err(native_error)?;
brush
.SetColor(bindings::Color {
a: color.a,
r: color.r,
g: color.g,
b: color.b,
})
.map_err(native_error)?;
control.SetBorderBrush(&brush).map_err(native_error)
}
(
Handle::Border(control),
PropertyId::BorderOpacityTransition,
PropertyValue::Duration(value),
) => {
let duration = windows_time::TimeSpan::try_from(*value)
.map_err(|_| RuntimeError::UnsupportedKind)?;
let transition = ScalarTransition::new().map_err(native_error)?;
transition.SetDuration(duration).map_err(native_error)?;
control
.cast::<IUIElement>()
.map_err(native_error)?
.SetOpacityTransition(&transition)
.map_err(native_error)
}
(Handle::Border(control), PropertyId::BorderScale, PropertyValue::F64(value)) => {
let control = control.cast::<IUIElement>().map_err(native_error)?;
let element = control.cast::<IFrameworkElement>().map_err(native_error)?;
let width = element.ActualWidth().map_err(native_error)? as f32;
let height = element.ActualHeight().map_err(native_error)? as f32;
control
.SetCenterPoint(windows_numerics::Vector3 {
x: width / 2.0,
y: height / 2.0,
z: 0.0,
})
.map_err(native_error)?;
let value = *value as f32;
control
.SetScale(windows_numerics::Vector3 {
x: value,
y: value,
z: 1.0,
})
.map_err(native_error)
}
(
Handle::Border(control),
PropertyId::BorderScaleTransition,
PropertyValue::Duration(value),
) => {
let duration = windows_time::TimeSpan::try_from(*value)
.map_err(|_| RuntimeError::UnsupportedKind)?;
let transition = Vector3Transition::new().map_err(native_error)?;
transition.SetDuration(duration).map_err(native_error)?;
control
.cast::<IUIElement>()
.map_err(native_error)?
.SetScaleTransition(&transition)
.map_err(native_error)
}
(Handle::Border(_), PropertyId::BorderCapturePointerOnPress, PropertyValue::Bool(_)) => {
Err(RuntimeError::UnsupportedKind)
}
(Handle::Border(_), PropertyId::BorderAllowDrop, PropertyValue::DragDropPolicy(_)) => {
Err(RuntimeError::UnsupportedKind)
}
(
Handle::BreadcrumbBar(control),
PropertyId::BreadcrumbBarItemsSource,
PropertyValue::StrList(value),
) => {
let values: Vec<Option<windows_core::IInspectable>> = value
.iter()
.map(|value| Some(windows_reference::IReference::from(value.as_str()).into()))
.collect();
let values: windows_collections::IVector<windows_core::IInspectable> = values.into();
control.SetItemsSource(&values).map_err(native_error)
}
(
Handle::StackPanel(control),
PropertyId::StackPanelOrientation,
PropertyValue::Orientation(value),
) => control
.SetOrientation(match value {
crate::Orientation::Vertical => bindings::Orientation::Vertical,
crate::Orientation::Horizontal => bindings::Orientation::Horizontal,
})
.map_err(native_error),
(Handle::StackPanel(control), PropertyId::StackPanelSpacing, PropertyValue::F64(value)) => {
control.SetSpacing(*value).map_err(native_error)
}
(
Handle::VariableSizedWrapGrid(control),
PropertyId::VariableSizedWrapGridItemWidth,
PropertyValue::F64(value),
) => control.SetItemWidth(*value).map_err(native_error),
(
Handle::VariableSizedWrapGrid(control),
PropertyId::VariableSizedWrapGridItemHeight,
PropertyValue::F64(value),
) => control.SetItemHeight(*value).map_err(native_error),
(
Handle::VariableSizedWrapGrid(control),
PropertyId::VariableSizedWrapGridOrientation,
PropertyValue::Orientation(value),
) => control
.SetOrientation(match value {
crate::Orientation::Vertical => bindings::Orientation::Vertical,
crate::Orientation::Horizontal => bindings::Orientation::Horizontal,
})
.map_err(native_error),
(Handle::Grid(control), PropertyId::GridRowSpacing, PropertyValue::F64(value)) => {
control.SetRowSpacing(*value).map_err(native_error)
}
(Handle::Grid(control), PropertyId::GridColumnSpacing, PropertyValue::F64(value)) => {
control.SetColumnSpacing(*value).map_err(native_error)
}
(
Handle::Grid(_),
PropertyId::GridKeyboardAccelerators,
PropertyValue::KeyAccelerators(_),
) => Err(RuntimeError::UnsupportedKind),
(
Handle::Grid(control),
PropertyId::GridBackground,
PropertyValue::Brush(crate::Brush::Solid(color)),
) => {
let brush = SolidColorBrush::new().map_err(native_error)?;
brush
.SetColor(bindings::Color {
a: color.a,
r: color.r,
g: color.g,
b: color.b,
})
.map_err(native_error)?;
control
.cast::<IPanel>()
.map_err(native_error)?
.SetBackground(&brush)
.map_err(native_error)
}
(Handle::TextBox(control), PropertyId::TextBoxText, PropertyValue::Str(value)) => {
control.SetText(value).map_err(native_error)
}
(
Handle::TextBox(control),
PropertyId::TextBoxPlaceholderText,
PropertyValue::Str(value),
) => control.SetPlaceholderText(value).map_err(native_error),
(Handle::TextBox(control), PropertyId::TextBoxIsEnabled, PropertyValue::Bool(value)) => {
control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error)
}
(
Handle::TextBox(control),
PropertyId::TextBoxAcceptsReturn,
PropertyValue::Bool(value),
) => control.SetAcceptsReturn(*value).map_err(native_error),
(
Handle::TextBox(control),
PropertyId::TextBoxTextWrapping,
PropertyValue::TextWrapping(value),
) => control
.SetTextWrapping(match value {
crate::TextWrapping::NoWrap => bindings::TextWrapping::NoWrap,
crate::TextWrapping::Wrap => bindings::TextWrapping::Wrap,
crate::TextWrapping::WrapWholeWords => bindings::TextWrapping::WrapWholeWords,
})
.map_err(native_error),
(
Handle::TextBox(control),
PropertyId::TextBoxBackground,
PropertyValue::Brush(crate::Brush::Solid(color)),
) => {
let brush = SolidColorBrush::new().map_err(native_error)?;
brush
.SetColor(bindings::Color {
a: color.a,
r: color.r,
g: color.g,
b: color.b,
})
.map_err(native_error)?;
control
.cast::<IControl>()
.map_err(native_error)?
.SetBackground(&brush)
.map_err(native_error)
}
(
Handle::TextBox(control),
PropertyId::TextBoxBorderBrush,
PropertyValue::Brush(crate::Brush::Solid(color)),
) => {
let brush = SolidColorBrush::new().map_err(native_error)?;
brush
.SetColor(bindings::Color {
a: color.a,
r: color.r,
g: color.g,
b: color.b,
})
.map_err(native_error)?;
control
.cast::<IControl>()
.map_err(native_error)?
.SetBorderBrush(&brush)
.map_err(native_error)
}
(
Handle::TextBox(control),
PropertyId::TextBoxBorderThickness,
PropertyValue::Thickness(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetBorderThickness({
let [left, top, right, bottom] = value.values();
bindings::Thickness {
left,
top,
right,
bottom,
}
})
.map_err(native_error),
(
Handle::AutoSuggestBox(control),
PropertyId::AutoSuggestBoxText,
PropertyValue::Str(value),
) => control.SetText(value).map_err(native_error),
(
Handle::AutoSuggestBox(control),
PropertyId::AutoSuggestBoxItemsSource,
PropertyValue::StrList(value),
) => {
let values: Vec<Option<windows_core::IInspectable>> = value
.iter()
.map(|value| Some(windows_reference::IReference::from(value.as_str()).into()))
.collect();
let values: windows_collections::IVector<windows_core::IInspectable> = values.into();
control
.cast::<IItemsControl>()
.map_err(native_error)?
.SetItemsSource(&values)
.map_err(native_error)
}
(
Handle::AutoSuggestBox(control),
PropertyId::AutoSuggestBoxPlaceholderText,
PropertyValue::Str(value),
) => control.SetPlaceholderText(value).map_err(native_error),
(
Handle::AutoSuggestBox(control),
PropertyId::AutoSuggestBoxIsEnabled,
PropertyValue::Bool(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error),
(
Handle::PasswordBox(control),
PropertyId::PasswordBoxPassword,
PropertyValue::Str(value),
) => control.SetPassword(value).map_err(native_error),
(
Handle::PasswordBox(control),
PropertyId::PasswordBoxPlaceholderText,
PropertyValue::Str(value),
) => control.SetPlaceholderText(value).map_err(native_error),
(
Handle::PasswordBox(control),
PropertyId::PasswordBoxPasswordRevealMode,
PropertyValue::PasswordRevealMode(value),
) => control
.SetPasswordRevealMode(match value {
crate::PasswordRevealMode::Peek => bindings::PasswordRevealMode::Peek,
crate::PasswordRevealMode::Hidden => bindings::PasswordRevealMode::Hidden,
crate::PasswordRevealMode::Visible => bindings::PasswordRevealMode::Visible,
})
.map_err(native_error),
(
Handle::PasswordBox(control),
PropertyId::PasswordBoxIsEnabled,
PropertyValue::Bool(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error),
(Handle::NumberBox(control), PropertyId::NumberBoxMinimum, PropertyValue::F64(value)) => {
control.SetMinimum(*value).map_err(native_error)
}
(Handle::NumberBox(control), PropertyId::NumberBoxMaximum, PropertyValue::F64(value)) => {
control.SetMaximum(*value).map_err(native_error)
}
(
Handle::NumberBox(control),
PropertyId::NumberBoxValue,
PropertyValue::OptionalF64(value),
) => control
.SetValue(native_number_box_value(*value))
.map_err(native_error),
(
Handle::NumberBox(control),
PropertyId::NumberBoxIsEnabled,
PropertyValue::Bool(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error),
(Handle::Slider(control), PropertyId::SliderMinimum, PropertyValue::F64(value)) => control
.cast::<IRangeBase>()
.map_err(native_error)?
.SetMinimum(*value)
.map_err(native_error),
(Handle::Slider(control), PropertyId::SliderMaximum, PropertyValue::F64(value)) => control
.cast::<IRangeBase>()
.map_err(native_error)?
.SetMaximum(*value)
.map_err(native_error),
(Handle::Slider(control), PropertyId::SliderValue, PropertyValue::F64(value)) => control
.cast::<IRangeBase>()
.map_err(native_error)?
.SetValue(*value)
.map_err(native_error),
(Handle::Slider(control), PropertyId::SliderIsEnabled, PropertyValue::Bool(value)) => {
control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error)
}
(Handle::Slider(control), PropertyId::SliderStepFrequency, PropertyValue::F64(value)) => {
control.SetStepFrequency(*value).map_err(native_error)
}
(
Handle::Slider(control),
PropertyId::SliderOrientation,
PropertyValue::Orientation(value),
) => control
.SetOrientation(match value {
crate::Orientation::Vertical => bindings::Orientation::Vertical,
crate::Orientation::Horizontal => bindings::Orientation::Horizontal,
})
.map_err(native_error),
(Handle::TitleBar(control), PropertyId::TitleBarTitle, PropertyValue::Str(value)) => {
control.SetTitle(value).map_err(native_error)
}
(Handle::TitleBar(control), PropertyId::TitleBarSubtitle, PropertyValue::Str(value)) => {
control.SetSubtitle(value).map_err(native_error)
}
(
Handle::TitleBar(control),
PropertyId::TitleBarIsBackButtonVisible,
PropertyValue::Bool(value),
) => control.SetIsBackButtonVisible(*value).map_err(native_error),
(
Handle::TitleBar(control),
PropertyId::TitleBarIsBackButtonEnabled,
PropertyValue::Bool(value),
) => control.SetIsBackButtonEnabled(*value).map_err(native_error),
(
Handle::TitleBar(control),
PropertyId::TitleBarIsPaneToggleButtonVisible,
PropertyValue::Bool(value),
) => control
.SetIsPaneToggleButtonVisible(*value)
.map_err(native_error),
(
Handle::NavigationView(control),
PropertyId::NavigationViewIsEnabled,
PropertyValue::Bool(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error),
(
Handle::NavigationView(control),
PropertyId::NavigationViewPaneDisplayMode,
PropertyValue::NavigationViewPaneDisplayMode(value),
) => control
.cast::<INavigationView2>()
.map_err(native_error)?
.SetPaneDisplayMode(match value {
crate::NavigationViewPaneDisplayMode::Auto => {
bindings::NavigationViewPaneDisplayMode::Auto
}
crate::NavigationViewPaneDisplayMode::Left => {
bindings::NavigationViewPaneDisplayMode::Left
}
crate::NavigationViewPaneDisplayMode::Top => {
bindings::NavigationViewPaneDisplayMode::Top
}
crate::NavigationViewPaneDisplayMode::LeftCompact => {
bindings::NavigationViewPaneDisplayMode::LeftCompact
}
crate::NavigationViewPaneDisplayMode::LeftMinimal => {
bindings::NavigationViewPaneDisplayMode::LeftMinimal
}
})
.map_err(native_error),
(
Handle::NavigationView(control),
PropertyId::NavigationViewIsPaneToggleButtonVisible,
PropertyValue::Bool(value),
) => control
.SetIsPaneToggleButtonVisible(*value)
.map_err(native_error),
(
Handle::NavigationView(control),
PropertyId::NavigationViewIsBackButtonVisible,
PropertyValue::NavigationViewBackButtonVisible(value),
) => control
.cast::<INavigationView2>()
.map_err(native_error)?
.SetIsBackButtonVisible(match value {
crate::NavigationViewBackButtonVisible::Collapsed => {
bindings::NavigationViewBackButtonVisible::Collapsed
}
crate::NavigationViewBackButtonVisible::Visible => {
bindings::NavigationViewBackButtonVisible::Visible
}
crate::NavigationViewBackButtonVisible::Auto => {
bindings::NavigationViewBackButtonVisible::Auto
}
})
.map_err(native_error),
(
Handle::NavigationView(control),
PropertyId::NavigationViewIsSettingsVisible,
PropertyValue::Bool(value),
) => control.SetIsSettingsVisible(*value).map_err(native_error),
(
Handle::NavigationView(control),
PropertyId::NavigationViewAlwaysShowHeader,
PropertyValue::Bool(value),
) => control.SetAlwaysShowHeader(*value).map_err(native_error),
(
Handle::NavigationView(control),
PropertyId::NavigationViewPaneTitle,
PropertyValue::Str(value),
) => control
.cast::<INavigationView2>()
.map_err(native_error)?
.SetPaneTitle(value)
.map_err(native_error),
(
Handle::NavigationView(control),
PropertyId::NavigationViewOpenPaneLength,
PropertyValue::F64(value),
) => control.SetOpenPaneLength(*value).map_err(native_error),
(
Handle::NavigationView(control),
PropertyId::NavigationViewIsPaneOpen,
PropertyValue::Bool(value),
) => control.SetIsPaneOpen(*value).map_err(native_error),
(
Handle::NavigationViewItem(control),
PropertyId::NavigationViewItemTag,
PropertyValue::Str(value),
) => {
let value = windows_reference::IReference::from(value.as_str());
control
.cast::<IFrameworkElement>()
.map_err(native_error)?
.SetTag(&value)
.map_err(native_error)
}
(
Handle::NavigationViewItem(control),
PropertyId::NavigationViewItemIsSelected,
PropertyValue::Bool(value),
) => control
.cast::<INavigationViewItemBase2>()
.map_err(native_error)?
.SetIsSelected(*value)
.map_err(native_error),
(
Handle::NavigationViewItem(control),
PropertyId::NavigationViewItemSelectsOnInvoked,
PropertyValue::Bool(value),
) => control
.cast::<INavigationViewItem2>()
.map_err(native_error)?
.SetSelectsOnInvoked(*value)
.map_err(native_error),
(
Handle::NavigationViewItem(control),
PropertyId::NavigationViewItemIsExpanded,
PropertyValue::Bool(value),
) => control
.cast::<INavigationViewItem2>()
.map_err(native_error)?
.SetIsExpanded(*value)
.map_err(native_error),
(
Handle::SplitView(control),
PropertyId::SplitViewOpenPaneLength,
PropertyValue::F64(value),
) => control.SetOpenPaneLength(*value).map_err(native_error),
(
Handle::SplitView(control),
PropertyId::SplitViewCompactPaneLength,
PropertyValue::F64(value),
) => control.SetCompactPaneLength(*value).map_err(native_error),
(
Handle::SplitView(control),
PropertyId::SplitViewDisplayMode,
PropertyValue::SplitViewDisplayMode(value),
) => control
.SetDisplayMode(match value {
crate::SplitViewDisplayMode::Overlay => bindings::SplitViewDisplayMode::Overlay,
crate::SplitViewDisplayMode::Inline => bindings::SplitViewDisplayMode::Inline,
crate::SplitViewDisplayMode::CompactOverlay => {
bindings::SplitViewDisplayMode::CompactOverlay
}
crate::SplitViewDisplayMode::CompactInline => {
bindings::SplitViewDisplayMode::CompactInline
}
})
.map_err(native_error),
(
Handle::SplitView(control),
PropertyId::SplitViewIsPaneOpen,
PropertyValue::Bool(value),
) => control.SetIsPaneOpen(*value).map_err(native_error),
(
Handle::ProgressBar(control),
PropertyId::ProgressBarMinimum,
PropertyValue::F64(value),
) => control
.cast::<IRangeBase>()
.map_err(native_error)?
.SetMinimum(*value)
.map_err(native_error),
(
Handle::ProgressBar(control),
PropertyId::ProgressBarMaximum,
PropertyValue::F64(value),
) => control
.cast::<IRangeBase>()
.map_err(native_error)?
.SetMaximum(*value)
.map_err(native_error),
(Handle::ProgressBar(control), PropertyId::ProgressBarValue, PropertyValue::F64(value)) => {
control
.cast::<IRangeBase>()
.map_err(native_error)?
.SetValue(*value)
.map_err(native_error)
}
(
Handle::ProgressBar(control),
PropertyId::ProgressBarIsIndeterminate,
PropertyValue::Bool(value),
) => control.SetIsIndeterminate(*value).map_err(native_error),
(
Handle::ProgressBar(control),
PropertyId::ProgressBarShowError,
PropertyValue::Bool(value),
) => control.SetShowError(*value).map_err(native_error),
(
Handle::ProgressBar(control),
PropertyId::ProgressBarShowPaused,
PropertyValue::Bool(value),
) => control.SetShowPaused(*value).map_err(native_error),
(
Handle::ProgressBar(control),
PropertyId::ProgressBarIsEnabled,
PropertyValue::Bool(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error),
(
Handle::ToggleSwitch(control),
PropertyId::ToggleSwitchIsOn,
PropertyValue::Bool(value),
) => control.SetIsOn(*value).map_err(native_error),
(
Handle::ToggleSwitch(control),
PropertyId::ToggleSwitchIsEnabled,
PropertyValue::Bool(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error),
(Handle::CheckBox(control), PropertyId::CheckBoxIsChecked, PropertyValue::Bool(value)) => {
control
.cast::<IToggleButton>()
.map_err(native_error)?
.SetIsChecked(Some(*value))
.map_err(native_error)
}
(Handle::CheckBox(control), PropertyId::CheckBoxIsEnabled, PropertyValue::Bool(value)) => {
control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error)
}
(
Handle::ToggleButton(control),
PropertyId::ToggleButtonIsChecked,
PropertyValue::Bool(value),
) => control.SetIsChecked(Some(*value)).map_err(native_error),
(
Handle::ToggleButton(control),
PropertyId::ToggleButtonIsEnabled,
PropertyValue::Bool(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error),
(
Handle::RadioButton(control),
PropertyId::RadioButtonGroupName,
PropertyValue::Str(value),
) => control.SetGroupName(value).map_err(native_error),
(
Handle::RadioButton(control),
PropertyId::RadioButtonIsChecked,
PropertyValue::Bool(value),
) => control
.cast::<IToggleButton>()
.map_err(native_error)?
.SetIsChecked(Some(*value))
.map_err(native_error),
(
Handle::RadioButton(control),
PropertyId::RadioButtonIsEnabled,
PropertyValue::Bool(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error),
(
Handle::RadioButtons(control),
PropertyId::RadioButtonsItemsSource,
PropertyValue::StrList(value),
) => {
let values: Vec<Option<windows_core::IInspectable>> = value
.iter()
.map(|value| Some(windows_reference::IReference::from(value.as_str()).into()))
.collect();
let values: windows_collections::IVector<windows_core::IInspectable> = values.into();
control.SetItemsSource(&values).map_err(native_error)
}
(
Handle::RadioButtons(control),
PropertyId::RadioButtonsSelectedIndex,
PropertyValue::SelectionIndex(value),
) => {
let value = native_selection_index(*value)?;
control.SetSelectedIndex(value).map_err(native_error)
}
(
Handle::RadioButtons(control),
PropertyId::RadioButtonsMaxColumns,
PropertyValue::I32(value),
) => control.SetMaxColumns(*value).map_err(native_error),
(Handle::InfoBadge(control), PropertyId::InfoBadgeValue, PropertyValue::I32(value)) => {
control.SetValue(*value).map_err(native_error)
}
(Handle::InfoBar(control), PropertyId::InfoBarTitle, PropertyValue::Str(value)) => {
control.SetTitle(value).map_err(native_error)
}
(Handle::InfoBar(control), PropertyId::InfoBarMessage, PropertyValue::Str(value)) => {
control.SetMessage(value).map_err(native_error)
}
(
Handle::InfoBar(control),
PropertyId::InfoBarSeverity,
PropertyValue::InfoBarSeverity(value),
) => control
.SetSeverity(match value {
crate::InfoBarSeverity::Informational => bindings::InfoBarSeverity::Informational,
crate::InfoBarSeverity::Success => bindings::InfoBarSeverity::Success,
crate::InfoBarSeverity::Warning => bindings::InfoBarSeverity::Warning,
crate::InfoBarSeverity::Error => bindings::InfoBarSeverity::Error,
})
.map_err(native_error),
(Handle::InfoBar(control), PropertyId::InfoBarIsOpen, PropertyValue::Bool(value)) => {
control.SetIsOpen(*value).map_err(native_error)
}
(Handle::InfoBar(control), PropertyId::InfoBarIsClosable, PropertyValue::Bool(value)) => {
control.SetIsClosable(*value).map_err(native_error)
}
(
Handle::PersonPicture(control),
PropertyId::PersonPictureDisplayName,
PropertyValue::Str(value),
) => control.SetDisplayName(value).map_err(native_error),
(
Handle::PersonPicture(control),
PropertyId::PersonPictureInitials,
PropertyValue::Str(value),
) => control.SetInitials(value).map_err(native_error),
(
Handle::ScrollViewer(control),
PropertyId::ScrollViewerHorizontalScrollBarVisibility,
PropertyValue::ScrollBarVisibility(value),
) => control
.SetHorizontalScrollBarVisibility(match value {
crate::ScrollBarVisibility::Disabled => bindings::ScrollBarVisibility::Disabled,
crate::ScrollBarVisibility::Auto => bindings::ScrollBarVisibility::Auto,
crate::ScrollBarVisibility::Hidden => bindings::ScrollBarVisibility::Hidden,
crate::ScrollBarVisibility::Visible => bindings::ScrollBarVisibility::Visible,
})
.map_err(native_error),
(
Handle::ScrollViewer(control),
PropertyId::ScrollViewerVerticalScrollBarVisibility,
PropertyValue::ScrollBarVisibility(value),
) => control
.SetVerticalScrollBarVisibility(match value {
crate::ScrollBarVisibility::Disabled => bindings::ScrollBarVisibility::Disabled,
crate::ScrollBarVisibility::Auto => bindings::ScrollBarVisibility::Auto,
crate::ScrollBarVisibility::Hidden => bindings::ScrollBarVisibility::Hidden,
crate::ScrollBarVisibility::Visible => bindings::ScrollBarVisibility::Visible,
})
.map_err(native_error),
(
Handle::ScrollView(control),
PropertyId::ScrollViewHorizontalScrollBarVisibility,
PropertyValue::ScrollingScrollBarVisibility(value),
) => control
.SetHorizontalScrollBarVisibility(match value {
crate::ScrollingScrollBarVisibility::Auto => {
bindings::ScrollingScrollBarVisibility::Auto
}
crate::ScrollingScrollBarVisibility::Visible => {
bindings::ScrollingScrollBarVisibility::Visible
}
crate::ScrollingScrollBarVisibility::Hidden => {
bindings::ScrollingScrollBarVisibility::Hidden
}
})
.map_err(native_error),
(
Handle::ScrollView(control),
PropertyId::ScrollViewVerticalScrollBarVisibility,
PropertyValue::ScrollingScrollBarVisibility(value),
) => control
.SetVerticalScrollBarVisibility(match value {
crate::ScrollingScrollBarVisibility::Auto => {
bindings::ScrollingScrollBarVisibility::Auto
}
crate::ScrollingScrollBarVisibility::Visible => {
bindings::ScrollingScrollBarVisibility::Visible
}
crate::ScrollingScrollBarVisibility::Hidden => {
bindings::ScrollingScrollBarVisibility::Hidden
}
})
.map_err(native_error),
(Handle::Image(control), PropertyId::ImageSource, PropertyValue::Str(value)) => {
let uri = Uri::CreateUri(value).map_err(native_error)?;
let path = value.split(['?', '#']).next().unwrap_or(value);
let source: ImageSource = if path.to_ascii_lowercase().ends_with(".svg") {
let source = SvgImageSource::new().map_err(native_error)?;
source.SetUriSource(&uri).map_err(native_error)?;
source.cast().map_err(native_error)?
} else {
let source = BitmapImage::new().map_err(native_error)?;
source.SetUriSource(&uri).map_err(native_error)?;
source.cast().map_err(native_error)?
};
control.SetSource(&source).map_err(native_error)
}
(Handle::Image(control), PropertyId::ImageStretch, PropertyValue::Stretch(value)) => {
control
.SetStretch(match value {
crate::Stretch::None => bindings::Stretch::None,
crate::Stretch::Fill => bindings::Stretch::Fill,
crate::Stretch::Uniform => bindings::Stretch::Uniform,
crate::Stretch::UniformToFill => bindings::Stretch::UniformToFill,
})
.map_err(native_error)
}
(
Handle::ProgressRing(control),
PropertyId::ProgressRingMinimum,
PropertyValue::F64(value),
) => control.SetMinimum(*value).map_err(native_error),
(
Handle::ProgressRing(control),
PropertyId::ProgressRingMaximum,
PropertyValue::F64(value),
) => control.SetMaximum(*value).map_err(native_error),
(
Handle::ProgressRing(control),
PropertyId::ProgressRingValue,
PropertyValue::F64(value),
) => control.SetValue(*value).map_err(native_error),
(
Handle::ProgressRing(control),
PropertyId::ProgressRingIsIndeterminate,
PropertyValue::Bool(value),
) => control.SetIsIndeterminate(*value).map_err(native_error),
(
Handle::ProgressRing(control),
PropertyId::ProgressRingIsActive,
PropertyValue::Bool(value),
) => control.SetIsActive(*value).map_err(native_error),
(
Handle::ProgressRing(control),
PropertyId::ProgressRingIsEnabled,
PropertyValue::Bool(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error),
(Handle::ListBox(control), PropertyId::ListBoxIsEnabled, PropertyValue::Bool(value)) => {
control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error)
}
(
Handle::Rectangle(control),
PropertyId::RectangleFill,
PropertyValue::Brush(crate::Brush::Solid(color)),
) => {
let brush = SolidColorBrush::new().map_err(native_error)?;
brush
.SetColor(bindings::Color {
a: color.a,
r: color.r,
g: color.g,
b: color.b,
})
.map_err(native_error)?;
control
.cast::<IShape>()
.map_err(native_error)?
.SetFill(&brush)
.map_err(native_error)
}
(
Handle::Rectangle(control),
PropertyId::RectangleStroke,
PropertyValue::Brush(crate::Brush::Solid(color)),
) => {
let brush = SolidColorBrush::new().map_err(native_error)?;
brush
.SetColor(bindings::Color {
a: color.a,
r: color.r,
g: color.g,
b: color.b,
})
.map_err(native_error)?;
control
.cast::<IShape>()
.map_err(native_error)?
.SetStroke(&brush)
.map_err(native_error)
}
(
Handle::Rectangle(control),
PropertyId::RectangleStrokeThickness,
PropertyValue::F64(value),
) => control
.cast::<IShape>()
.map_err(native_error)?
.SetStrokeThickness(*value)
.map_err(native_error),
(Handle::Rectangle(control), PropertyId::RectangleRadiusX, PropertyValue::F64(value)) => {
control.SetRadiusX(*value).map_err(native_error)
}
(Handle::Rectangle(control), PropertyId::RectangleRadiusY, PropertyValue::F64(value)) => {
control.SetRadiusY(*value).map_err(native_error)
}
(
Handle::Ellipse(control),
PropertyId::EllipseFill,
PropertyValue::Brush(crate::Brush::Solid(color)),
) => {
let brush = SolidColorBrush::new().map_err(native_error)?;
brush
.SetColor(bindings::Color {
a: color.a,
r: color.r,
g: color.g,
b: color.b,
})
.map_err(native_error)?;
control
.cast::<IShape>()
.map_err(native_error)?
.SetFill(&brush)
.map_err(native_error)
}
(
Handle::Ellipse(control),
PropertyId::EllipseStroke,
PropertyValue::Brush(crate::Brush::Solid(color)),
) => {
let brush = SolidColorBrush::new().map_err(native_error)?;
brush
.SetColor(bindings::Color {
a: color.a,
r: color.r,
g: color.g,
b: color.b,
})
.map_err(native_error)?;
control
.cast::<IShape>()
.map_err(native_error)?
.SetStroke(&brush)
.map_err(native_error)
}
(
Handle::Ellipse(control),
PropertyId::EllipseStrokeThickness,
PropertyValue::F64(value),
) => control
.cast::<IShape>()
.map_err(native_error)?
.SetStrokeThickness(*value)
.map_err(native_error),
(
Handle::Line(control),
PropertyId::LineStroke,
PropertyValue::Brush(crate::Brush::Solid(color)),
) => {
let brush = SolidColorBrush::new().map_err(native_error)?;
brush
.SetColor(bindings::Color {
a: color.a,
r: color.r,
g: color.g,
b: color.b,
})
.map_err(native_error)?;
control
.cast::<IShape>()
.map_err(native_error)?
.SetStroke(&brush)
.map_err(native_error)
}
(Handle::Line(control), PropertyId::LineStrokeThickness, PropertyValue::F64(value)) => {
control
.cast::<IShape>()
.map_err(native_error)?
.SetStrokeThickness(*value)
.map_err(native_error)
}
(Handle::Line(control), PropertyId::LineX1, PropertyValue::F64(value)) => {
control.SetX1(*value).map_err(native_error)
}
(Handle::Line(control), PropertyId::LineY1, PropertyValue::F64(value)) => {
control.SetY1(*value).map_err(native_error)
}
(Handle::Line(control), PropertyId::LineX2, PropertyValue::F64(value)) => {
control.SetX2(*value).map_err(native_error)
}
(Handle::Line(control), PropertyId::LineY2, PropertyValue::F64(value)) => {
control.SetY2(*value).map_err(native_error)
}
(
Handle::SymbolIcon(control),
PropertyId::SymbolIconSymbol,
PropertyValue::Symbol(value),
) => control
.SetSymbol(match value {
crate::Symbol::Previous => bindings::Symbol::Previous,
crate::Symbol::Next => bindings::Symbol::Next,
crate::Symbol::Play => bindings::Symbol::Play,
crate::Symbol::Pause => bindings::Symbol::Pause,
crate::Symbol::Edit => bindings::Symbol::Edit,
crate::Symbol::Save => bindings::Symbol::Save,
crate::Symbol::Clear => bindings::Symbol::Clear,
crate::Symbol::Delete => bindings::Symbol::Delete,
crate::Symbol::Remove => bindings::Symbol::Remove,
crate::Symbol::Add => bindings::Symbol::Add,
crate::Symbol::Cancel => bindings::Symbol::Cancel,
crate::Symbol::Accept => bindings::Symbol::Accept,
crate::Symbol::More => bindings::Symbol::More,
crate::Symbol::Redo => bindings::Symbol::Redo,
crate::Symbol::Undo => bindings::Symbol::Undo,
crate::Symbol::Home => bindings::Symbol::Home,
crate::Symbol::Up => bindings::Symbol::Up,
crate::Symbol::Forward => bindings::Symbol::Forward,
crate::Symbol::Back => bindings::Symbol::Back,
crate::Symbol::Favorite => bindings::Symbol::Favorite,
crate::Symbol::Camera => bindings::Symbol::Camera,
crate::Symbol::Setting => bindings::Symbol::Setting,
crate::Symbol::Video => bindings::Symbol::Video,
crate::Symbol::Sync => bindings::Symbol::Sync,
crate::Symbol::Download => bindings::Symbol::Download,
crate::Symbol::Mail => bindings::Symbol::Mail,
crate::Symbol::Find => bindings::Symbol::Find,
crate::Symbol::Help => bindings::Symbol::Help,
crate::Symbol::Upload => bindings::Symbol::Upload,
crate::Symbol::Emoji => bindings::Symbol::Emoji,
crate::Symbol::TwoPage => bindings::Symbol::TwoPage,
crate::Symbol::LeaveChat => bindings::Symbol::LeaveChat,
crate::Symbol::MailForward => bindings::Symbol::MailForward,
crate::Symbol::Clock => bindings::Symbol::Clock,
crate::Symbol::Send => bindings::Symbol::Send,
crate::Symbol::Crop => bindings::Symbol::Crop,
crate::Symbol::RotateCamera => bindings::Symbol::RotateCamera,
crate::Symbol::People => bindings::Symbol::People,
crate::Symbol::OpenPane => bindings::Symbol::OpenPane,
crate::Symbol::ClosePane => bindings::Symbol::ClosePane,
crate::Symbol::World => bindings::Symbol::World,
crate::Symbol::Flag => bindings::Symbol::Flag,
crate::Symbol::PreviewLink => bindings::Symbol::PreviewLink,
crate::Symbol::Globe => bindings::Symbol::Globe,
crate::Symbol::Trim => bindings::Symbol::Trim,
crate::Symbol::AttachCamera => bindings::Symbol::AttachCamera,
crate::Symbol::ZoomIn => bindings::Symbol::ZoomIn,
crate::Symbol::Bookmarks => bindings::Symbol::Bookmarks,
crate::Symbol::Document => bindings::Symbol::Document,
crate::Symbol::ProtectedDocument => bindings::Symbol::ProtectedDocument,
crate::Symbol::Page => bindings::Symbol::Page,
crate::Symbol::Bullets => bindings::Symbol::Bullets,
crate::Symbol::Comment => bindings::Symbol::Comment,
crate::Symbol::MailFilled => bindings::Symbol::MailFilled,
crate::Symbol::ContactInfo => bindings::Symbol::ContactInfo,
crate::Symbol::HangUp => bindings::Symbol::HangUp,
crate::Symbol::ViewAll => bindings::Symbol::ViewAll,
crate::Symbol::MapPin => bindings::Symbol::MapPin,
crate::Symbol::Phone => bindings::Symbol::Phone,
crate::Symbol::VideoChat => bindings::Symbol::VideoChat,
crate::Symbol::Switch => bindings::Symbol::Switch,
crate::Symbol::Contact => bindings::Symbol::Contact,
crate::Symbol::Rename => bindings::Symbol::Rename,
crate::Symbol::Pin => bindings::Symbol::Pin,
crate::Symbol::MusicInfo => bindings::Symbol::MusicInfo,
crate::Symbol::Go => bindings::Symbol::Go,
crate::Symbol::Keyboard => bindings::Symbol::Keyboard,
crate::Symbol::DockLeft => bindings::Symbol::DockLeft,
crate::Symbol::DockRight => bindings::Symbol::DockRight,
crate::Symbol::DockBottom => bindings::Symbol::DockBottom,
crate::Symbol::Remote => bindings::Symbol::Remote,
crate::Symbol::Refresh => bindings::Symbol::Refresh,
crate::Symbol::Rotate => bindings::Symbol::Rotate,
crate::Symbol::Shuffle => bindings::Symbol::Shuffle,
crate::Symbol::List => bindings::Symbol::List,
crate::Symbol::Shop => bindings::Symbol::Shop,
crate::Symbol::SelectAll => bindings::Symbol::SelectAll,
crate::Symbol::Orientation => bindings::Symbol::Orientation,
crate::Symbol::Import => bindings::Symbol::Import,
crate::Symbol::ImportAll => bindings::Symbol::ImportAll,
crate::Symbol::BrowsePhotos => bindings::Symbol::BrowsePhotos,
crate::Symbol::WebCam => bindings::Symbol::WebCam,
crate::Symbol::Pictures => bindings::Symbol::Pictures,
crate::Symbol::SaveLocal => bindings::Symbol::SaveLocal,
crate::Symbol::Caption => bindings::Symbol::Caption,
crate::Symbol::Stop => bindings::Symbol::Stop,
crate::Symbol::ShowResults => bindings::Symbol::ShowResults,
crate::Symbol::Volume => bindings::Symbol::Volume,
crate::Symbol::Repair => bindings::Symbol::Repair,
crate::Symbol::Message => bindings::Symbol::Message,
crate::Symbol::Page2 => bindings::Symbol::Page2,
crate::Symbol::CalendarDay => bindings::Symbol::CalendarDay,
crate::Symbol::CalendarWeek => bindings::Symbol::CalendarWeek,
crate::Symbol::Calendar => bindings::Symbol::Calendar,
crate::Symbol::Character => bindings::Symbol::Character,
crate::Symbol::MailReplyAll => bindings::Symbol::MailReplyAll,
crate::Symbol::Read => bindings::Symbol::Read,
crate::Symbol::Link => bindings::Symbol::Link,
crate::Symbol::Account => bindings::Symbol::Account,
crate::Symbol::ShowBcc => bindings::Symbol::ShowBcc,
crate::Symbol::HideBcc => bindings::Symbol::HideBcc,
crate::Symbol::Cut => bindings::Symbol::Cut,
crate::Symbol::Attach => bindings::Symbol::Attach,
crate::Symbol::Paste => bindings::Symbol::Paste,
crate::Symbol::Filter => bindings::Symbol::Filter,
crate::Symbol::Copy => bindings::Symbol::Copy,
crate::Symbol::Emoji2 => bindings::Symbol::Emoji2,
crate::Symbol::Important => bindings::Symbol::Important,
crate::Symbol::MailReply => bindings::Symbol::MailReply,
crate::Symbol::SlideShow => bindings::Symbol::SlideShow,
crate::Symbol::Sort => bindings::Symbol::Sort,
crate::Symbol::Manage => bindings::Symbol::Manage,
crate::Symbol::AllApps => bindings::Symbol::AllApps,
crate::Symbol::DisconnectDrive => bindings::Symbol::DisconnectDrive,
crate::Symbol::MapDrive => bindings::Symbol::MapDrive,
crate::Symbol::NewWindow => bindings::Symbol::NewWindow,
crate::Symbol::OpenWith => bindings::Symbol::OpenWith,
crate::Symbol::ContactPresence => bindings::Symbol::ContactPresence,
crate::Symbol::Priority => bindings::Symbol::Priority,
crate::Symbol::GoToToday => bindings::Symbol::GoToToday,
crate::Symbol::Font => bindings::Symbol::Font,
crate::Symbol::FontColor => bindings::Symbol::FontColor,
crate::Symbol::Contact2 => bindings::Symbol::Contact2,
crate::Symbol::Folder => bindings::Symbol::Folder,
crate::Symbol::Audio => bindings::Symbol::Audio,
crate::Symbol::Placeholder => bindings::Symbol::Placeholder,
crate::Symbol::View => bindings::Symbol::View,
crate::Symbol::SetLockScreen => bindings::Symbol::SetLockScreen,
crate::Symbol::SetTile => bindings::Symbol::SetTile,
crate::Symbol::ClosedCaption => bindings::Symbol::ClosedCaption,
crate::Symbol::StopSlideShow => bindings::Symbol::StopSlideShow,
crate::Symbol::Permissions => bindings::Symbol::Permissions,
crate::Symbol::Highlight => bindings::Symbol::Highlight,
crate::Symbol::DisableUpdates => bindings::Symbol::DisableUpdates,
crate::Symbol::UnFavorite => bindings::Symbol::UnFavorite,
crate::Symbol::UnPin => bindings::Symbol::UnPin,
crate::Symbol::OpenLocal => bindings::Symbol::OpenLocal,
crate::Symbol::Mute => bindings::Symbol::Mute,
crate::Symbol::Italic => bindings::Symbol::Italic,
crate::Symbol::Underline => bindings::Symbol::Underline,
crate::Symbol::Bold => bindings::Symbol::Bold,
crate::Symbol::MoveToFolder => bindings::Symbol::MoveToFolder,
crate::Symbol::LikeDislike => bindings::Symbol::LikeDislike,
crate::Symbol::Dislike => bindings::Symbol::Dislike,
crate::Symbol::Like => bindings::Symbol::Like,
crate::Symbol::AlignRight => bindings::Symbol::AlignRight,
crate::Symbol::AlignCenter => bindings::Symbol::AlignCenter,
crate::Symbol::AlignLeft => bindings::Symbol::AlignLeft,
crate::Symbol::Zoom => bindings::Symbol::Zoom,
crate::Symbol::ZoomOut => bindings::Symbol::ZoomOut,
crate::Symbol::OpenFile => bindings::Symbol::OpenFile,
crate::Symbol::OtherUser => bindings::Symbol::OtherUser,
crate::Symbol::Admin => bindings::Symbol::Admin,
crate::Symbol::Street => bindings::Symbol::Street,
crate::Symbol::Map => bindings::Symbol::Map,
crate::Symbol::ClearSelection => bindings::Symbol::ClearSelection,
crate::Symbol::FontDecrease => bindings::Symbol::FontDecrease,
crate::Symbol::FontIncrease => bindings::Symbol::FontIncrease,
crate::Symbol::FontSize => bindings::Symbol::FontSize,
crate::Symbol::CellPhone => bindings::Symbol::CellPhone,
crate::Symbol::ReShare => bindings::Symbol::ReShare,
crate::Symbol::Tag => bindings::Symbol::Tag,
crate::Symbol::RepeatOne => bindings::Symbol::RepeatOne,
crate::Symbol::RepeatAll => bindings::Symbol::RepeatAll,
crate::Symbol::OutlineStar => bindings::Symbol::OutlineStar,
crate::Symbol::SolidStar => bindings::Symbol::SolidStar,
crate::Symbol::Calculator => bindings::Symbol::Calculator,
crate::Symbol::Directions => bindings::Symbol::Directions,
crate::Symbol::Target => bindings::Symbol::Target,
crate::Symbol::Library => bindings::Symbol::Library,
crate::Symbol::PhoneBook => bindings::Symbol::PhoneBook,
crate::Symbol::Memo => bindings::Symbol::Memo,
crate::Symbol::Microphone => bindings::Symbol::Microphone,
crate::Symbol::PostUpdate => bindings::Symbol::PostUpdate,
crate::Symbol::BackToWindow => bindings::Symbol::BackToWindow,
crate::Symbol::FullScreen => bindings::Symbol::FullScreen,
crate::Symbol::NewFolder => bindings::Symbol::NewFolder,
crate::Symbol::CalendarReply => bindings::Symbol::CalendarReply,
crate::Symbol::UnSyncFolder => bindings::Symbol::UnSyncFolder,
crate::Symbol::ReportHacked => bindings::Symbol::ReportHacked,
crate::Symbol::SyncFolder => bindings::Symbol::SyncFolder,
crate::Symbol::BlockContact => bindings::Symbol::BlockContact,
crate::Symbol::SwitchApps => bindings::Symbol::SwitchApps,
crate::Symbol::AddFriend => bindings::Symbol::AddFriend,
crate::Symbol::TouchPointer => bindings::Symbol::TouchPointer,
crate::Symbol::GoToStart => bindings::Symbol::GoToStart,
crate::Symbol::ZeroBars => bindings::Symbol::ZeroBars,
crate::Symbol::OneBar => bindings::Symbol::OneBar,
crate::Symbol::TwoBars => bindings::Symbol::TwoBars,
crate::Symbol::ThreeBars => bindings::Symbol::ThreeBars,
crate::Symbol::FourBars => bindings::Symbol::FourBars,
crate::Symbol::Scan => bindings::Symbol::Scan,
crate::Symbol::Preview => bindings::Symbol::Preview,
crate::Symbol::GlobalNavigationButton => bindings::Symbol::GlobalNavigationButton,
crate::Symbol::Share => bindings::Symbol::Share,
crate::Symbol::Print => bindings::Symbol::Print,
crate::Symbol::XboxOneConsole => bindings::Symbol::XboxOneConsole,
})
.map_err(native_error),
(Handle::ImageIcon(control), PropertyId::ImageIconSource, PropertyValue::Str(value)) => {
let uri = Uri::CreateUri(value).map_err(native_error)?;
let path = value.split(['?', '#']).next().unwrap_or(value);
let source: ImageSource = if path.to_ascii_lowercase().ends_with(".svg") {
let source = SvgImageSource::new().map_err(native_error)?;
source.SetUriSource(&uri).map_err(native_error)?;
source.cast().map_err(native_error)?
} else {
let source = BitmapImage::new().map_err(native_error)?;
source.SetUriSource(&uri).map_err(native_error)?;
source.cast().map_err(native_error)?
};
control.SetSource(&source).map_err(native_error)
}
(Handle::FontIcon(control), PropertyId::FontIconGlyph, PropertyValue::Str(value)) => {
control.SetGlyph(value).map_err(native_error)
}
(
Handle::BitmapIcon(control),
PropertyId::BitmapIconUriSource,
PropertyValue::Str(value),
) => {
let value = Uri::CreateUri(value).map_err(native_error)?;
control.SetUriSource(&value).map_err(native_error)
}
(
Handle::BitmapIcon(control),
PropertyId::BitmapIconShowAsMonochrome,
PropertyValue::Bool(value),
) => control.SetShowAsMonochrome(*value).map_err(native_error),
(Handle::PathIcon(control), PropertyId::PathIconData, PropertyValue::Str(value)) => {
let type_name = TypeName {
name: "Microsoft.UI.Xaml.Media.Geometry".into(),
kind: TypeKind::Metadata,
};
let value =
windows_reference::IReference::<windows_core::HSTRING>::from(value.as_str());
let parsed = XamlBindingHelper::ConvertValue(&type_name, &value)
.and_then(|value| value.cast::<bindings::Geometry>())
.map_err(native_error)?;
control.SetData(&parsed).map_err(native_error)
}
(Handle::ListBoxItem(control), PropertyId::ListBoxItemTag, PropertyValue::Str(value)) => {
let value = windows_reference::IReference::from(value.as_str());
control
.cast::<IFrameworkElement>()
.map_err(native_error)?
.SetTag(&value)
.map_err(native_error)
}
(
Handle::ListBoxItem(control),
PropertyId::ListBoxItemIsSelected,
PropertyValue::Bool(value),
) => control
.cast::<ISelectorItem>()
.map_err(native_error)?
.SetIsSelected(*value)
.map_err(native_error),
(
Handle::RatingControl(control),
PropertyId::RatingControlMaxRating,
PropertyValue::I32(value),
) => control.SetMaxRating(*value).map_err(native_error),
(
Handle::RatingControl(control),
PropertyId::RatingControlValue,
PropertyValue::OptionalF64(value),
) => control
.SetValue(native_rating_value(*value))
.map_err(native_error),
(
Handle::RatingControl(control),
PropertyId::RatingControlCaption,
PropertyValue::Str(value),
) => control.SetCaption(value).map_err(native_error),
(
Handle::RatingControl(control),
PropertyId::RatingControlIsReadOnly,
PropertyValue::Bool(value),
) => control.SetIsReadOnly(*value).map_err(native_error),
(Handle::Expander(control), PropertyId::ExpanderIsExpanded, PropertyValue::Bool(value)) => {
control.SetIsExpanded(*value).map_err(native_error)
}
(
Handle::ComboBox(control),
PropertyId::ComboBoxItemsSource,
PropertyValue::StrList(value),
) => {
let values: Vec<Option<windows_core::IInspectable>> = value
.iter()
.map(|value| Some(windows_reference::IReference::from(value.as_str()).into()))
.collect();
let values: windows_collections::IVector<windows_core::IInspectable> = values.into();
control
.cast::<IItemsControl>()
.map_err(native_error)?
.SetItemsSource(&values)
.map_err(native_error)
}
(
Handle::ComboBox(control),
PropertyId::ComboBoxSelectedIndex,
PropertyValue::SelectionIndex(value),
) => {
let value = native_selection_index(*value)?;
control
.cast::<ISelector>()
.map_err(native_error)?
.SetSelectedIndex(value)
.map_err(native_error)
}
(
Handle::ComboBox(control),
PropertyId::ComboBoxPlaceholderText,
PropertyValue::Str(value),
) => control.SetPlaceholderText(value).map_err(native_error),
(Handle::ComboBox(control), PropertyId::ComboBoxIsEditable, PropertyValue::Bool(value)) => {
control.SetIsEditable(*value).map_err(native_error)
}
(Handle::ComboBox(control), PropertyId::ComboBoxIsEnabled, PropertyValue::Bool(value)) => {
control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error)
}
(
Handle::Pivot(control),
PropertyId::PivotSelectedIndex,
PropertyValue::SelectionIndex(value),
) => {
let value = native_selection_index(*value)?;
control.SetSelectedIndex(value).map_err(native_error)
}
(Handle::Pivot(control), PropertyId::PivotTitle, PropertyValue::Str(value)) => {
let value = windows_reference::IReference::from(value.as_str());
control.SetTitle(&value).map_err(native_error)
}
(Handle::PivotItem(control), PropertyId::PivotItemHeader, PropertyValue::Str(value)) => {
let value = windows_reference::IReference::from(value.as_str());
control.SetHeader(&value).map_err(native_error)
}
(
Handle::FlipView(control),
PropertyId::FlipViewSelectedIndex,
PropertyValue::SelectionIndex(value),
) => {
let value = native_selection_index(*value)?;
control
.cast::<ISelector>()
.map_err(native_error)?
.SetSelectedIndex(value)
.map_err(native_error)
}
(
Handle::SelectorBarItem(control),
PropertyId::SelectorBarItemText,
PropertyValue::Str(value),
) => control.SetText(value).map_err(native_error),
(
Handle::SelectorBarItem(control),
PropertyId::SelectorBarItemIsSelected,
PropertyValue::Bool(value),
) => control
.cast::<IItemContainer>()
.map_err(native_error)?
.SetIsSelected(*value)
.map_err(native_error),
(
Handle::TabView(control),
PropertyId::TabViewSelectedIndex,
PropertyValue::SelectionIndex(value),
) => {
let value = native_selection_index(*value)?;
control.SetSelectedIndex(value).map_err(native_error)
}
(
Handle::TabView(control),
PropertyId::TabViewCanReorderTabs,
PropertyValue::Bool(value),
) => control.SetCanReorderTabs(*value).map_err(native_error),
(
Handle::TabView(control),
PropertyId::TabViewIsAddTabButtonVisible,
PropertyValue::Bool(value),
) => control
.SetIsAddTabButtonVisible(*value)
.map_err(native_error),
(
Handle::TabViewItem(control),
PropertyId::TabViewItemHeader,
PropertyValue::Str(value),
) => {
let value = windows_reference::IReference::from(value.as_str());
control.SetHeader(&value).map_err(native_error)
}
(
Handle::TabViewItem(control),
PropertyId::TabViewItemIsClosable,
PropertyValue::Bool(value),
) => control.SetIsClosable(*value).map_err(native_error),
(Handle::TabViewItem(control), PropertyId::TabViewItemTag, PropertyValue::Str(value)) => {
let value = windows_reference::IReference::from(value.as_str());
control
.cast::<IFrameworkElement>()
.map_err(native_error)?
.SetTag(&value)
.map_err(native_error)
}
(Handle::TeachingTip(control), PropertyId::TeachingTipTitle, PropertyValue::Str(value)) => {
control.SetTitle(value).map_err(native_error)
}
(
Handle::TeachingTip(control),
PropertyId::TeachingTipSubtitle,
PropertyValue::Str(value),
) => control.SetSubtitle(value).map_err(native_error),
(
Handle::TeachingTip(control),
PropertyId::TeachingTipIsOpen,
PropertyValue::Bool(value),
) => control.SetIsOpen(*value).map_err(native_error),
(
Handle::TeachingTip(control),
PropertyId::TeachingTipIsLightDismissEnabled,
PropertyValue::Bool(value),
) => control
.SetIsLightDismissEnabled(*value)
.map_err(native_error),
(
Handle::TeachingTip(control),
PropertyId::TeachingTipPreferredPlacement,
PropertyValue::TeachingTipPlacementMode(value),
) => control
.SetPreferredPlacement(match value {
crate::TeachingTipPlacementMode::Auto => bindings::TeachingTipPlacementMode::Auto,
crate::TeachingTipPlacementMode::Top => bindings::TeachingTipPlacementMode::Top,
crate::TeachingTipPlacementMode::Bottom => {
bindings::TeachingTipPlacementMode::Bottom
}
crate::TeachingTipPlacementMode::Left => bindings::TeachingTipPlacementMode::Left,
crate::TeachingTipPlacementMode::Right => bindings::TeachingTipPlacementMode::Right,
crate::TeachingTipPlacementMode::TopRight => {
bindings::TeachingTipPlacementMode::TopRight
}
crate::TeachingTipPlacementMode::TopLeft => {
bindings::TeachingTipPlacementMode::TopLeft
}
crate::TeachingTipPlacementMode::BottomRight => {
bindings::TeachingTipPlacementMode::BottomRight
}
crate::TeachingTipPlacementMode::BottomLeft => {
bindings::TeachingTipPlacementMode::BottomLeft
}
crate::TeachingTipPlacementMode::LeftTop => {
bindings::TeachingTipPlacementMode::LeftTop
}
crate::TeachingTipPlacementMode::LeftBottom => {
bindings::TeachingTipPlacementMode::LeftBottom
}
crate::TeachingTipPlacementMode::RightTop => {
bindings::TeachingTipPlacementMode::RightTop
}
crate::TeachingTipPlacementMode::RightBottom => {
bindings::TeachingTipPlacementMode::RightBottom
}
crate::TeachingTipPlacementMode::Center => {
bindings::TeachingTipPlacementMode::Center
}
})
.map_err(native_error),
(
Handle::TeachingTip(control),
PropertyId::TeachingTipActionButtonContent,
PropertyValue::Str(value),
) => {
let value = windows_reference::IReference::from(value.as_str());
control.SetActionButtonContent(&value).map_err(native_error)
}
(
Handle::TeachingTip(control),
PropertyId::TeachingTipCloseButtonContent,
PropertyValue::Str(value),
) => {
let value = windows_reference::IReference::from(value.as_str());
control.SetCloseButtonContent(&value).map_err(native_error)
}
(
Handle::DropDownButton(control),
PropertyId::DropDownButtonIsEnabled,
PropertyValue::Bool(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error),
(
Handle::AppBarButton(control),
PropertyId::AppBarButtonLabel,
PropertyValue::Str(value),
) => control.SetLabel(value).map_err(native_error),
(
Handle::AppBarButton(control),
PropertyId::AppBarButtonIsEnabled,
PropertyValue::Bool(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error),
(Handle::MenuBarItem(control), PropertyId::MenuBarItemTitle, PropertyValue::Str(value)) => {
control.SetTitle(value).map_err(native_error)
}
(
Handle::SplitButton(control),
PropertyId::SplitButtonIsEnabled,
PropertyValue::Bool(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error),
(
Handle::ColorPicker(control),
PropertyId::ColorPickerColor,
PropertyValue::Color(value),
) => {
let value = bindings::Color {
a: value.a,
r: value.r,
g: value.g,
b: value.b,
};
control.SetColor(value).map_err(native_error)
}
(
Handle::ColorPicker(control),
PropertyId::ColorPickerIsAlphaEnabled,
PropertyValue::Bool(value),
) => control.SetIsAlphaEnabled(*value).map_err(native_error),
(
Handle::ColorPicker(control),
PropertyId::ColorPickerIsHexInputVisible,
PropertyValue::Bool(value),
) => control.SetIsHexInputVisible(*value).map_err(native_error),
(
Handle::ColorPicker(control),
PropertyId::ColorPickerIsColorSliderVisible,
PropertyValue::Bool(value),
) => control
.SetIsColorSliderVisible(*value)
.map_err(native_error),
(
Handle::ColorPicker(control),
PropertyId::ColorPickerIsColorChannelTextInputVisible,
PropertyValue::Bool(value),
) => control
.SetIsColorChannelTextInputVisible(*value)
.map_err(native_error),
(
Handle::ColorPicker(control),
PropertyId::ColorPickerIsEnabled,
PropertyValue::Bool(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error),
(
Handle::DatePicker(control),
PropertyId::DatePickerDayVisible,
PropertyValue::Bool(value),
) => control.SetDayVisible(*value).map_err(native_error),
(
Handle::DatePicker(control),
PropertyId::DatePickerMonthVisible,
PropertyValue::Bool(value),
) => control.SetMonthVisible(*value).map_err(native_error),
(
Handle::DatePicker(control),
PropertyId::DatePickerYearVisible,
PropertyValue::Bool(value),
) => control.SetYearVisible(*value).map_err(native_error),
(
Handle::DatePicker(control),
PropertyId::DatePickerIsEnabled,
PropertyValue::Bool(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error),
(
Handle::TimePicker(control),
PropertyId::TimePickerClockIdentifier,
PropertyValue::Str(value),
) => control.SetClockIdentifier(value).map_err(native_error),
(
Handle::TimePicker(control),
PropertyId::TimePickerMinuteIncrement,
PropertyValue::I32(value),
) => control.SetMinuteIncrement(*value).map_err(native_error),
(
Handle::TimePicker(control),
PropertyId::TimePickerIsEnabled,
PropertyValue::Bool(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error),
(
Handle::CalendarDatePicker(control),
PropertyId::CalendarDatePickerPlaceholderText,
PropertyValue::Str(value),
) => control.SetPlaceholderText(value).map_err(native_error),
(
Handle::CalendarDatePicker(control),
PropertyId::CalendarDatePickerIsTodayHighlighted,
PropertyValue::Bool(value),
) => control.SetIsTodayHighlighted(*value).map_err(native_error),
(
Handle::CalendarDatePicker(control),
PropertyId::CalendarDatePickerIsCalendarOpen,
PropertyValue::Bool(value),
) => control.SetIsCalendarOpen(*value).map_err(native_error),
(
Handle::CalendarDatePicker(control),
PropertyId::CalendarDatePickerIsEnabled,
PropertyValue::Bool(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error),
(
Handle::ContentDialog(control),
PropertyId::ContentDialogTitle,
PropertyValue::Str(value),
) => {
let value = windows_reference::IReference::from(value.as_str());
control.SetTitle(&value).map_err(native_error)
}
(
Handle::ContentDialog(control),
PropertyId::ContentDialogPrimaryButtonText,
PropertyValue::Str(value),
) => control.SetPrimaryButtonText(value).map_err(native_error),
(
Handle::ContentDialog(control),
PropertyId::ContentDialogSecondaryButtonText,
PropertyValue::Str(value),
) => control.SetSecondaryButtonText(value).map_err(native_error),
(
Handle::ContentDialog(control),
PropertyId::ContentDialogCloseButtonText,
PropertyValue::Str(value),
) => control.SetCloseButtonText(value).map_err(native_error),
(
Handle::ContentDialog(control),
PropertyId::ContentDialogIsPrimaryButtonEnabled,
PropertyValue::Bool(value),
) => control
.SetIsPrimaryButtonEnabled(*value)
.map_err(native_error),
(
Handle::ContentDialog(control),
PropertyId::ContentDialogIsSecondaryButtonEnabled,
PropertyValue::Bool(value),
) => control
.SetIsSecondaryButtonEnabled(*value)
.map_err(native_error),
(
Handle::CalendarView(control),
PropertyId::CalendarViewIsTodayHighlighted,
PropertyValue::Bool(value),
) => control.SetIsTodayHighlighted(*value).map_err(native_error),
(
Handle::CalendarView(control),
PropertyId::CalendarViewIsGroupLabelVisible,
PropertyValue::Bool(value),
) => control.SetIsGroupLabelVisible(*value).map_err(native_error),
(
Handle::CalendarView(control),
PropertyId::CalendarViewIsEnabled,
PropertyValue::Bool(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error),
(
Handle::ListView(control),
PropertyId::ListViewSelectedIndex,
PropertyValue::SelectionIndex(value),
) => {
let value = native_selection_index(*value)?;
control
.cast::<ISelector>()
.map_err(native_error)?
.SetSelectedIndex(value)
.map_err(native_error)
}
(
Handle::ListView(control),
PropertyId::ListViewSelectionMode,
PropertyValue::ListViewSelectionMode(value),
) => control
.cast::<IListViewBase>()
.map_err(native_error)?
.SetSelectionMode(match value {
crate::ListViewSelectionMode::None => bindings::ListViewSelectionMode::None,
crate::ListViewSelectionMode::Single => bindings::ListViewSelectionMode::Single,
crate::ListViewSelectionMode::Multiple => bindings::ListViewSelectionMode::Multiple,
crate::ListViewSelectionMode::Extended => bindings::ListViewSelectionMode::Extended,
})
.map_err(native_error),
(
Handle::ListView(control),
PropertyId::ListViewCanDragItems,
PropertyValue::Bool(value),
) => control
.cast::<IListViewBase>()
.map_err(native_error)?
.SetCanDragItems(*value)
.map_err(native_error),
(
Handle::ListView(control),
PropertyId::ListViewCanReorderItems,
PropertyValue::Bool(value),
) => control
.cast::<IListViewBase>()
.map_err(native_error)?
.SetCanReorderItems(*value)
.map_err(native_error),
(Handle::ListView(control), PropertyId::ListViewAllowDrop, PropertyValue::Bool(value)) => {
control
.cast::<IUIElement>()
.map_err(native_error)?
.SetAllowDrop(*value)
.map_err(native_error)
}
(Handle::ListViewItem(control), PropertyId::ListViewItemTag, PropertyValue::Str(value)) => {
let value = windows_reference::IReference::from(value.as_str());
control
.cast::<IFrameworkElement>()
.map_err(native_error)?
.SetTag(&value)
.map_err(native_error)
}
(
Handle::TreeView(control),
PropertyId::TreeViewSelectionMode,
PropertyValue::TreeViewSelectionMode(value),
) => control
.SetSelectionMode(match value {
crate::TreeViewSelectionMode::None => bindings::TreeViewSelectionMode::None,
crate::TreeViewSelectionMode::Single => bindings::TreeViewSelectionMode::Single,
crate::TreeViewSelectionMode::Multiple => bindings::TreeViewSelectionMode::Multiple,
})
.map_err(native_error),
(
Handle::GridView(control),
PropertyId::GridViewSelectedIndex,
PropertyValue::SelectionIndex(value),
) => {
let value = native_selection_index(*value)?;
control
.cast::<ISelector>()
.map_err(native_error)?
.SetSelectedIndex(value)
.map_err(native_error)
}
(
Handle::GridView(control),
PropertyId::GridViewCanDragItems,
PropertyValue::Bool(value),
) => control
.cast::<IListViewBase>()
.map_err(native_error)?
.SetCanDragItems(*value)
.map_err(native_error),
(
Handle::GridView(control),
PropertyId::GridViewCanReorderItems,
PropertyValue::Bool(value),
) => control
.cast::<IListViewBase>()
.map_err(native_error)?
.SetCanReorderItems(*value)
.map_err(native_error),
(Handle::GridView(control), PropertyId::GridViewAllowDrop, PropertyValue::Bool(value)) => {
control
.cast::<IUIElement>()
.map_err(native_error)?
.SetAllowDrop(*value)
.map_err(native_error)
}
(Handle::GridViewItem(control), PropertyId::GridViewItemTag, PropertyValue::Str(value)) => {
let value = windows_reference::IReference::from(value.as_str());
control
.cast::<IFrameworkElement>()
.map_err(native_error)?
.SetTag(&value)
.map_err(native_error)
}
(
Handle::RichEditBox(control),
PropertyId::RichEditBoxDocument,
PropertyValue::Str(value),
) => set_rich_edit_text(control, value),
(
Handle::RichEditBox(control),
PropertyId::RichEditBoxPlaceholderText,
PropertyValue::Str(value),
) => control.SetPlaceholderText(value).map_err(native_error),
(
Handle::RichEditBox(control),
PropertyId::RichEditBoxIsReadOnly,
PropertyValue::Bool(value),
) => control.SetIsReadOnly(*value).map_err(native_error),
(
Handle::RichEditBox(control),
PropertyId::RichEditBoxIsEnabled,
PropertyValue::Bool(value),
) => control
.cast::<IControl>()
.map_err(native_error)?
.SetIsEnabled(*value)
.map_err(native_error),
(
Handle::RichTextBlock(control),
PropertyId::RichTextBlockBlocks,
PropertyValue::RichText(value),
) => {
let blocks: windows_collections::IVector<Block> = control
.Blocks()
.and_then(|blocks| blocks.cast())
.map_err(native_error)?;
blocks.Clear().map_err(native_error)?;
let append_run = |inlines: &windows_collections::IVector<Inline>,
value: &crate::RichTextRun| {
let run = Run::new().map_err(native_error)?;
run.SetText(&value.text).map_err(native_error)?;
if value.is_bold {
run.cast::<ITextElement>()
.and_then(|run| run.SetFontWeight(bindings::FontWeight { weight: 700 }))
.map_err(native_error)?;
}
if value.is_italic {
run.cast::<ITextElement>()
.and_then(|run| run.SetFontStyle(bindings::FontStyle::Italic))
.map_err(native_error)?;
}
let run = run.cast::<Inline>().map_err(native_error)?;
inlines.Append(&run).map_err(native_error)
};
for paragraph in value.paragraphs.iter() {
let native = Paragraph::new().map_err(native_error)?;
let inlines: windows_collections::IVector<Inline> = native
.Inlines()
.and_then(|inlines| inlines.cast())
.map_err(native_error)?;
for inline in ¶graph.inlines {
match inline {
crate::RichTextInline::Run(value) => append_run(&inlines, value)?,
crate::RichTextInline::Hyperlink(value) => {
let hyperlink = Hyperlink::new().map_err(native_error)?;
let uri = Uri::CreateUri(&value.uri).map_err(native_error)?;
hyperlink.SetNavigateUri(&uri).map_err(native_error)?;
let hyperlink_inlines: windows_collections::IVector<Inline> = hyperlink
.cast::<ISpan>()
.and_then(|hyperlink| hyperlink.Inlines())
.and_then(|inlines| inlines.cast())
.map_err(native_error)?;
append_run(
&hyperlink_inlines,
&crate::RichTextRun::plain(&value.text),
)?;
let hyperlink = hyperlink.cast::<Inline>().map_err(native_error)?;
inlines.Append(&hyperlink).map_err(native_error)?;
}
crate::RichTextInline::LineBreak => {
let line_break = LineBreak::new().map_err(native_error)?;
let line_break = line_break.cast::<Inline>().map_err(native_error)?;
inlines.Append(&line_break).map_err(native_error)?;
}
}
}
let native = native.cast::<Block>().map_err(native_error)?;
blocks.Append(&native).map_err(native_error)?;
}
Ok(())
}
(
Handle::RichTextBlock(control),
PropertyId::RichTextBlockFontSize,
PropertyValue::F64(value),
) => control.SetFontSize(*value).map_err(native_error),
(
Handle::RichTextBlock(control),
PropertyId::RichTextBlockIsTextSelectionEnabled,
PropertyValue::Bool(value),
) => control
.SetIsTextSelectionEnabled(*value)
.map_err(native_error),
(
Handle::RichTextBlock(control),
PropertyId::RichTextBlockTextWrapping,
PropertyValue::TextWrapping(value),
) => control
.SetTextWrapping(match value {
crate::TextWrapping::NoWrap => bindings::TextWrapping::NoWrap,
crate::TextWrapping::Wrap => bindings::TextWrapping::Wrap,
crate::TextWrapping::WrapWholeWords => bindings::TextWrapping::WrapWholeWords,
})
.map_err(native_error),
(Handle::Viewbox(control), PropertyId::ViewboxStretch, PropertyValue::Stretch(value)) => {
control
.SetStretch(match value {
crate::Stretch::None => bindings::Stretch::None,
crate::Stretch::Fill => bindings::Stretch::Fill,
crate::Stretch::Uniform => bindings::Stretch::Uniform,
crate::Stretch::UniformToFill => bindings::Stretch::UniformToFill,
})
.map_err(native_error)
}
_ => Err(RuntimeError::UnsupportedKind),
}
}
pub fn clear_property(handle: &Handle, property: PropertyId) -> Result<(), RuntimeError> {
let dependency_object = handle.dependency_object().map_err(native_error)?;
match (handle, property) {
(Handle::TextBlock(_), PropertyId::TextBlockText) => dependency_object
.ClearValue(&bindings::TextBlock::TextProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TextBlock(_), PropertyId::TextBlockTextWrapping) => dependency_object
.ClearValue(&bindings::TextBlock::TextWrappingProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TextBlock(_), PropertyId::TextBlockFontSize) => dependency_object
.ClearValue(&bindings::TextBlock::FontSizeProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TextBlock(_), PropertyId::TextBlockFontWeight) => dependency_object
.ClearValue(&bindings::TextBlock::FontWeightProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TextBlock(_), PropertyId::TextBlockIsTextSelectionEnabled) => dependency_object
.ClearValue(
&bindings::TextBlock::IsTextSelectionEnabledProperty().map_err(native_error)?,
)
.map_err(native_error),
(Handle::TextBlock(_), PropertyId::TextBlockMaxLines) => dependency_object
.ClearValue(&bindings::TextBlock::MaxLinesProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TextBlock(_), PropertyId::TextBlockTextTrimming) => dependency_object
.ClearValue(&bindings::TextBlock::TextTrimmingProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TextBlock(_), PropertyId::TextBlockForeground) => dependency_object
.ClearValue(&bindings::TextBlock::ForegroundProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Button(_), PropertyId::ButtonIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Button(_), PropertyId::ButtonHorizontalContentAlignment) => dependency_object
.ClearValue(
&bindings::Control::HorizontalContentAlignmentProperty().map_err(native_error)?,
)
.map_err(native_error),
(Handle::Button(_), PropertyId::ButtonVerticalContentAlignment) => dependency_object
.ClearValue(
&bindings::Control::VerticalContentAlignmentProperty().map_err(native_error)?,
)
.map_err(native_error),
(Handle::Button(_), PropertyId::ButtonResources) => Err(RuntimeError::UnsupportedKind),
(Handle::Button(_), PropertyId::ButtonStyle) => dependency_object
.ClearValue(&bindings::FrameworkElement::StyleProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Button(_), PropertyId::ButtonKeyboardAccelerators) => {
Err(RuntimeError::UnsupportedKind)
}
(Handle::HyperlinkButton(_), PropertyId::HyperlinkButtonNavigateUri) => dependency_object
.ClearValue(&bindings::HyperlinkButton::NavigateUriProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::HyperlinkButton(_), PropertyId::HyperlinkButtonIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::RepeatButton(_), PropertyId::RepeatButtonDelay) => dependency_object
.ClearValue(&bindings::RepeatButton::DelayProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::RepeatButton(_), PropertyId::RepeatButtonInterval) => dependency_object
.ClearValue(&bindings::RepeatButton::IntervalProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::RepeatButton(_), PropertyId::RepeatButtonIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Border(_), PropertyId::BorderPadding) => dependency_object
.ClearValue(&bindings::Border::PaddingProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Border(_), PropertyId::BorderBorderThickness) => dependency_object
.ClearValue(&bindings::Border::BorderThicknessProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Border(_), PropertyId::BorderCornerRadius) => dependency_object
.ClearValue(&bindings::Border::CornerRadiusProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Border(_), PropertyId::BorderBackground) => dependency_object
.ClearValue(&bindings::Border::BackgroundProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Border(_), PropertyId::BorderBorderBrush) => dependency_object
.ClearValue(&bindings::Border::BorderBrushProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Border(control), PropertyId::BorderOpacityTransition) => control
.cast::<IUIElement>()
.map_err(native_error)?
.SetOpacityTransition(None::<&ScalarTransition>)
.map_err(native_error),
(Handle::Border(control), PropertyId::BorderScale) => control
.cast::<IUIElement>()
.map_err(native_error)?
.SetScale(windows_numerics::Vector3 {
x: 1.0,
y: 1.0,
z: 1.0,
})
.map_err(native_error),
(Handle::Border(control), PropertyId::BorderScaleTransition) => control
.cast::<IUIElement>()
.map_err(native_error)?
.SetScaleTransition(None::<&Vector3Transition>)
.map_err(native_error),
(Handle::Border(_), PropertyId::BorderCapturePointerOnPress) => {
Err(RuntimeError::UnsupportedKind)
}
(Handle::Border(_), PropertyId::BorderAllowDrop) => Err(RuntimeError::UnsupportedKind),
(Handle::BreadcrumbBar(_), PropertyId::BreadcrumbBarItemsSource) => dependency_object
.ClearValue(&bindings::BreadcrumbBar::ItemsSourceProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::StackPanel(_), PropertyId::StackPanelOrientation) => dependency_object
.ClearValue(&bindings::StackPanel::OrientationProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::StackPanel(_), PropertyId::StackPanelSpacing) => dependency_object
.ClearValue(&bindings::StackPanel::SpacingProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::VariableSizedWrapGrid(_), PropertyId::VariableSizedWrapGridItemWidth) => {
dependency_object
.ClearValue(
&bindings::VariableSizedWrapGrid::ItemWidthProperty().map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::VariableSizedWrapGrid(_), PropertyId::VariableSizedWrapGridItemHeight) => {
dependency_object
.ClearValue(
&bindings::VariableSizedWrapGrid::ItemHeightProperty().map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::VariableSizedWrapGrid(_), PropertyId::VariableSizedWrapGridOrientation) => {
dependency_object
.ClearValue(
&bindings::VariableSizedWrapGrid::OrientationProperty()
.map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::Grid(_), PropertyId::GridRowSpacing) => dependency_object
.ClearValue(&bindings::Grid::RowSpacingProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Grid(_), PropertyId::GridColumnSpacing) => dependency_object
.ClearValue(&bindings::Grid::ColumnSpacingProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Grid(_), PropertyId::GridKeyboardAccelerators) => {
Err(RuntimeError::UnsupportedKind)
}
(Handle::Grid(_), PropertyId::GridBackground) => dependency_object
.ClearValue(&bindings::Panel::BackgroundProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TextBox(_), PropertyId::TextBoxText) => dependency_object
.ClearValue(&bindings::TextBox::TextProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TextBox(_), PropertyId::TextBoxPlaceholderText) => dependency_object
.ClearValue(&bindings::TextBox::PlaceholderTextProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TextBox(_), PropertyId::TextBoxIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TextBox(_), PropertyId::TextBoxAcceptsReturn) => dependency_object
.ClearValue(&bindings::TextBox::AcceptsReturnProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TextBox(_), PropertyId::TextBoxTextWrapping) => dependency_object
.ClearValue(&bindings::TextBox::TextWrappingProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TextBox(_), PropertyId::TextBoxBackground) => dependency_object
.ClearValue(&bindings::Control::BackgroundProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TextBox(_), PropertyId::TextBoxBorderBrush) => dependency_object
.ClearValue(&bindings::Control::BorderBrushProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TextBox(_), PropertyId::TextBoxBorderThickness) => dependency_object
.ClearValue(&bindings::Control::BorderThicknessProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::AutoSuggestBox(_), PropertyId::AutoSuggestBoxText) => dependency_object
.ClearValue(&bindings::AutoSuggestBox::TextProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::AutoSuggestBox(_), PropertyId::AutoSuggestBoxItemsSource) => dependency_object
.ClearValue(&bindings::ItemsControl::ItemsSourceProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::AutoSuggestBox(_), PropertyId::AutoSuggestBoxPlaceholderText) => dependency_object
.ClearValue(&bindings::AutoSuggestBox::PlaceholderTextProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::AutoSuggestBox(_), PropertyId::AutoSuggestBoxIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::PasswordBox(_), PropertyId::PasswordBoxPassword) => dependency_object
.ClearValue(&bindings::PasswordBox::PasswordProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::PasswordBox(_), PropertyId::PasswordBoxPlaceholderText) => dependency_object
.ClearValue(&bindings::PasswordBox::PlaceholderTextProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::PasswordBox(_), PropertyId::PasswordBoxPasswordRevealMode) => dependency_object
.ClearValue(&bindings::PasswordBox::PasswordRevealModeProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::PasswordBox(_), PropertyId::PasswordBoxIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::NumberBox(_), PropertyId::NumberBoxMinimum) => dependency_object
.ClearValue(&bindings::NumberBox::MinimumProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::NumberBox(_), PropertyId::NumberBoxMaximum) => dependency_object
.ClearValue(&bindings::NumberBox::MaximumProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::NumberBox(_), PropertyId::NumberBoxValue) => dependency_object
.ClearValue(&bindings::NumberBox::ValueProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::NumberBox(_), PropertyId::NumberBoxIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Slider(_), PropertyId::SliderMinimum) => dependency_object
.ClearValue(&bindings::RangeBase::MinimumProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Slider(_), PropertyId::SliderMaximum) => dependency_object
.ClearValue(&bindings::RangeBase::MaximumProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Slider(_), PropertyId::SliderValue) => dependency_object
.ClearValue(&bindings::RangeBase::ValueProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Slider(_), PropertyId::SliderIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Slider(_), PropertyId::SliderStepFrequency) => dependency_object
.ClearValue(&bindings::Slider::StepFrequencyProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Slider(_), PropertyId::SliderOrientation) => dependency_object
.ClearValue(&bindings::Slider::OrientationProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TitleBar(_), PropertyId::TitleBarTitle) => dependency_object
.ClearValue(&bindings::TitleBar::TitleProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TitleBar(_), PropertyId::TitleBarSubtitle) => dependency_object
.ClearValue(&bindings::TitleBar::SubtitleProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TitleBar(_), PropertyId::TitleBarIsBackButtonVisible) => dependency_object
.ClearValue(&bindings::TitleBar::IsBackButtonVisibleProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TitleBar(_), PropertyId::TitleBarIsBackButtonEnabled) => dependency_object
.ClearValue(&bindings::TitleBar::IsBackButtonEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TitleBar(_), PropertyId::TitleBarIsPaneToggleButtonVisible) => dependency_object
.ClearValue(
&bindings::TitleBar::IsPaneToggleButtonVisibleProperty().map_err(native_error)?,
)
.map_err(native_error),
(Handle::NavigationView(_), PropertyId::NavigationViewIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::NavigationView(_), PropertyId::NavigationViewPaneDisplayMode) => dependency_object
.ClearValue(&bindings::NavigationView::PaneDisplayModeProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::NavigationView(_), PropertyId::NavigationViewIsPaneToggleButtonVisible) => {
dependency_object
.ClearValue(
&bindings::NavigationView::IsPaneToggleButtonVisibleProperty()
.map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::NavigationView(_), PropertyId::NavigationViewIsBackButtonVisible) => {
dependency_object
.ClearValue(
&bindings::NavigationView::IsBackButtonVisibleProperty()
.map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::NavigationView(_), PropertyId::NavigationViewIsSettingsVisible) => {
dependency_object
.ClearValue(
&bindings::NavigationView::IsSettingsVisibleProperty().map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::NavigationView(_), PropertyId::NavigationViewAlwaysShowHeader) => {
dependency_object
.ClearValue(
&bindings::NavigationView::AlwaysShowHeaderProperty().map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::NavigationView(_), PropertyId::NavigationViewPaneTitle) => dependency_object
.ClearValue(&bindings::NavigationView::PaneTitleProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::NavigationView(_), PropertyId::NavigationViewOpenPaneLength) => dependency_object
.ClearValue(&bindings::NavigationView::OpenPaneLengthProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::NavigationView(_), PropertyId::NavigationViewIsPaneOpen) => dependency_object
.ClearValue(&bindings::NavigationView::IsPaneOpenProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::NavigationViewItem(_), PropertyId::NavigationViewItemTag) => dependency_object
.ClearValue(&bindings::FrameworkElement::TagProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::NavigationViewItem(_), PropertyId::NavigationViewItemIsSelected) => {
dependency_object
.ClearValue(
&bindings::NavigationViewItemBase::IsSelectedProperty()
.map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::NavigationViewItem(_), PropertyId::NavigationViewItemSelectsOnInvoked) => {
dependency_object
.ClearValue(
&bindings::NavigationViewItem::SelectsOnInvokedProperty()
.map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::NavigationViewItem(_), PropertyId::NavigationViewItemIsExpanded) => {
dependency_object
.ClearValue(
&bindings::NavigationViewItem::IsExpandedProperty().map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::SplitView(_), PropertyId::SplitViewOpenPaneLength) => dependency_object
.ClearValue(&bindings::SplitView::OpenPaneLengthProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::SplitView(_), PropertyId::SplitViewCompactPaneLength) => dependency_object
.ClearValue(&bindings::SplitView::CompactPaneLengthProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::SplitView(_), PropertyId::SplitViewDisplayMode) => dependency_object
.ClearValue(&bindings::SplitView::DisplayModeProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::SplitView(_), PropertyId::SplitViewIsPaneOpen) => dependency_object
.ClearValue(&bindings::SplitView::IsPaneOpenProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ProgressBar(_), PropertyId::ProgressBarMinimum) => dependency_object
.ClearValue(&bindings::RangeBase::MinimumProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ProgressBar(_), PropertyId::ProgressBarMaximum) => dependency_object
.ClearValue(&bindings::RangeBase::MaximumProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ProgressBar(_), PropertyId::ProgressBarValue) => dependency_object
.ClearValue(&bindings::RangeBase::ValueProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ProgressBar(_), PropertyId::ProgressBarIsIndeterminate) => dependency_object
.ClearValue(&bindings::ProgressBar::IsIndeterminateProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ProgressBar(_), PropertyId::ProgressBarShowError) => dependency_object
.ClearValue(&bindings::ProgressBar::ShowErrorProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ProgressBar(_), PropertyId::ProgressBarShowPaused) => dependency_object
.ClearValue(&bindings::ProgressBar::ShowPausedProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ProgressBar(_), PropertyId::ProgressBarIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ToggleSwitch(_), PropertyId::ToggleSwitchIsOn) => dependency_object
.ClearValue(&bindings::ToggleSwitch::IsOnProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ToggleSwitch(_), PropertyId::ToggleSwitchIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::CheckBox(_), PropertyId::CheckBoxIsChecked) => dependency_object
.ClearValue(&bindings::ToggleButton::IsCheckedProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::CheckBox(_), PropertyId::CheckBoxIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ToggleButton(_), PropertyId::ToggleButtonIsChecked) => dependency_object
.ClearValue(&bindings::ToggleButton::IsCheckedProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ToggleButton(_), PropertyId::ToggleButtonIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::RadioButton(_), PropertyId::RadioButtonGroupName) => dependency_object
.ClearValue(&bindings::RadioButton::GroupNameProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::RadioButton(_), PropertyId::RadioButtonIsChecked) => dependency_object
.ClearValue(&bindings::ToggleButton::IsCheckedProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::RadioButton(_), PropertyId::RadioButtonIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::RadioButtons(_), PropertyId::RadioButtonsItemsSource) => dependency_object
.ClearValue(&bindings::RadioButtons::ItemsSourceProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::RadioButtons(_), PropertyId::RadioButtonsSelectedIndex) => dependency_object
.ClearValue(&bindings::RadioButtons::SelectedIndexProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::RadioButtons(_), PropertyId::RadioButtonsMaxColumns) => dependency_object
.ClearValue(&bindings::RadioButtons::MaxColumnsProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::InfoBadge(_), PropertyId::InfoBadgeValue) => dependency_object
.ClearValue(&bindings::InfoBadge::ValueProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::InfoBar(_), PropertyId::InfoBarTitle) => dependency_object
.ClearValue(&bindings::InfoBar::TitleProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::InfoBar(_), PropertyId::InfoBarMessage) => dependency_object
.ClearValue(&bindings::InfoBar::MessageProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::InfoBar(_), PropertyId::InfoBarSeverity) => dependency_object
.ClearValue(&bindings::InfoBar::SeverityProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::InfoBar(_), PropertyId::InfoBarIsOpen) => dependency_object
.ClearValue(&bindings::InfoBar::IsOpenProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::InfoBar(_), PropertyId::InfoBarIsClosable) => dependency_object
.ClearValue(&bindings::InfoBar::IsClosableProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::PersonPicture(_), PropertyId::PersonPictureDisplayName) => dependency_object
.ClearValue(&bindings::PersonPicture::DisplayNameProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::PersonPicture(_), PropertyId::PersonPictureInitials) => dependency_object
.ClearValue(&bindings::PersonPicture::InitialsProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ScrollViewer(_), PropertyId::ScrollViewerHorizontalScrollBarVisibility) => {
dependency_object
.ClearValue(
&bindings::ScrollViewer::HorizontalScrollBarVisibilityProperty()
.map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::ScrollViewer(_), PropertyId::ScrollViewerVerticalScrollBarVisibility) => {
dependency_object
.ClearValue(
&bindings::ScrollViewer::VerticalScrollBarVisibilityProperty()
.map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::ScrollView(_), PropertyId::ScrollViewHorizontalScrollBarVisibility) => {
dependency_object
.ClearValue(
&bindings::ScrollView::HorizontalScrollBarVisibilityProperty()
.map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::ScrollView(_), PropertyId::ScrollViewVerticalScrollBarVisibility) => {
dependency_object
.ClearValue(
&bindings::ScrollView::VerticalScrollBarVisibilityProperty()
.map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::Image(_), PropertyId::ImageSource) => dependency_object
.ClearValue(&bindings::Image::SourceProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Image(_), PropertyId::ImageStretch) => dependency_object
.ClearValue(&bindings::Image::StretchProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ProgressRing(_), PropertyId::ProgressRingMinimum) => dependency_object
.ClearValue(&bindings::ProgressRing::MinimumProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ProgressRing(_), PropertyId::ProgressRingMaximum) => dependency_object
.ClearValue(&bindings::ProgressRing::MaximumProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ProgressRing(_), PropertyId::ProgressRingValue) => dependency_object
.ClearValue(&bindings::ProgressRing::ValueProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ProgressRing(_), PropertyId::ProgressRingIsIndeterminate) => dependency_object
.ClearValue(&bindings::ProgressRing::IsIndeterminateProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ProgressRing(_), PropertyId::ProgressRingIsActive) => dependency_object
.ClearValue(&bindings::ProgressRing::IsActiveProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ProgressRing(_), PropertyId::ProgressRingIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ListBox(_), PropertyId::ListBoxIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Rectangle(_), PropertyId::RectangleFill) => dependency_object
.ClearValue(&bindings::Shape::FillProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Rectangle(_), PropertyId::RectangleStroke) => dependency_object
.ClearValue(&bindings::Shape::StrokeProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Rectangle(_), PropertyId::RectangleStrokeThickness) => dependency_object
.ClearValue(&bindings::Shape::StrokeThicknessProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Rectangle(_), PropertyId::RectangleRadiusX) => dependency_object
.ClearValue(&bindings::Rectangle::RadiusXProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Rectangle(_), PropertyId::RectangleRadiusY) => dependency_object
.ClearValue(&bindings::Rectangle::RadiusYProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Ellipse(_), PropertyId::EllipseFill) => dependency_object
.ClearValue(&bindings::Shape::FillProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Ellipse(_), PropertyId::EllipseStroke) => dependency_object
.ClearValue(&bindings::Shape::StrokeProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Ellipse(_), PropertyId::EllipseStrokeThickness) => dependency_object
.ClearValue(&bindings::Shape::StrokeThicknessProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Line(_), PropertyId::LineStroke) => dependency_object
.ClearValue(&bindings::Shape::StrokeProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Line(_), PropertyId::LineStrokeThickness) => dependency_object
.ClearValue(&bindings::Shape::StrokeThicknessProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Line(_), PropertyId::LineX1) => dependency_object
.ClearValue(&bindings::Line::X1Property().map_err(native_error)?)
.map_err(native_error),
(Handle::Line(_), PropertyId::LineY1) => dependency_object
.ClearValue(&bindings::Line::Y1Property().map_err(native_error)?)
.map_err(native_error),
(Handle::Line(_), PropertyId::LineX2) => dependency_object
.ClearValue(&bindings::Line::X2Property().map_err(native_error)?)
.map_err(native_error),
(Handle::Line(_), PropertyId::LineY2) => dependency_object
.ClearValue(&bindings::Line::Y2Property().map_err(native_error)?)
.map_err(native_error),
(Handle::SymbolIcon(_), PropertyId::SymbolIconSymbol) => dependency_object
.ClearValue(&bindings::SymbolIcon::SymbolProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ImageIcon(_), PropertyId::ImageIconSource) => dependency_object
.ClearValue(&bindings::ImageIcon::SourceProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::FontIcon(_), PropertyId::FontIconGlyph) => dependency_object
.ClearValue(&bindings::FontIcon::GlyphProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::BitmapIcon(_), PropertyId::BitmapIconUriSource) => dependency_object
.ClearValue(&bindings::BitmapIcon::UriSourceProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::BitmapIcon(_), PropertyId::BitmapIconShowAsMonochrome) => dependency_object
.ClearValue(&bindings::BitmapIcon::ShowAsMonochromeProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::PathIcon(_), PropertyId::PathIconData) => dependency_object
.ClearValue(&bindings::PathIcon::DataProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ListBoxItem(_), PropertyId::ListBoxItemTag) => dependency_object
.ClearValue(&bindings::FrameworkElement::TagProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ListBoxItem(_), PropertyId::ListBoxItemIsSelected) => dependency_object
.ClearValue(&bindings::SelectorItem::IsSelectedProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::RatingControl(_), PropertyId::RatingControlMaxRating) => dependency_object
.ClearValue(&bindings::RatingControl::MaxRatingProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::RatingControl(_), PropertyId::RatingControlValue) => dependency_object
.ClearValue(&bindings::RatingControl::ValueProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::RatingControl(_), PropertyId::RatingControlCaption) => dependency_object
.ClearValue(&bindings::RatingControl::CaptionProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::RatingControl(_), PropertyId::RatingControlIsReadOnly) => dependency_object
.ClearValue(&bindings::RatingControl::IsReadOnlyProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Expander(_), PropertyId::ExpanderIsExpanded) => dependency_object
.ClearValue(&bindings::Expander::IsExpandedProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ComboBox(_), PropertyId::ComboBoxItemsSource) => dependency_object
.ClearValue(&bindings::ItemsControl::ItemsSourceProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ComboBox(_), PropertyId::ComboBoxSelectedIndex) => dependency_object
.ClearValue(&bindings::Selector::SelectedIndexProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ComboBox(_), PropertyId::ComboBoxPlaceholderText) => dependency_object
.ClearValue(&bindings::ComboBox::PlaceholderTextProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ComboBox(_), PropertyId::ComboBoxIsEditable) => dependency_object
.ClearValue(&bindings::ComboBox::IsEditableProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ComboBox(_), PropertyId::ComboBoxIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Pivot(_), PropertyId::PivotSelectedIndex) => dependency_object
.ClearValue(&bindings::Pivot::SelectedIndexProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Pivot(_), PropertyId::PivotTitle) => dependency_object
.ClearValue(&bindings::Pivot::TitleProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::PivotItem(_), PropertyId::PivotItemHeader) => dependency_object
.ClearValue(&bindings::PivotItem::HeaderProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::FlipView(_), PropertyId::FlipViewSelectedIndex) => dependency_object
.ClearValue(&bindings::Selector::SelectedIndexProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::SelectorBarItem(_), PropertyId::SelectorBarItemText) => dependency_object
.ClearValue(&bindings::SelectorBarItem::TextProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::SelectorBarItem(_), PropertyId::SelectorBarItemIsSelected) => dependency_object
.ClearValue(&bindings::ItemContainer::IsSelectedProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TabView(_), PropertyId::TabViewSelectedIndex) => dependency_object
.ClearValue(&bindings::TabView::SelectedIndexProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TabView(_), PropertyId::TabViewCanReorderTabs) => dependency_object
.ClearValue(&bindings::TabView::CanReorderTabsProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TabView(_), PropertyId::TabViewIsAddTabButtonVisible) => dependency_object
.ClearValue(&bindings::TabView::IsAddTabButtonVisibleProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TabViewItem(_), PropertyId::TabViewItemHeader) => dependency_object
.ClearValue(&bindings::TabViewItem::HeaderProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TabViewItem(_), PropertyId::TabViewItemIsClosable) => dependency_object
.ClearValue(&bindings::TabViewItem::IsClosableProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TabViewItem(_), PropertyId::TabViewItemTag) => dependency_object
.ClearValue(&bindings::FrameworkElement::TagProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TeachingTip(_), PropertyId::TeachingTipTitle) => dependency_object
.ClearValue(&bindings::TeachingTip::TitleProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TeachingTip(_), PropertyId::TeachingTipSubtitle) => dependency_object
.ClearValue(&bindings::TeachingTip::SubtitleProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TeachingTip(_), PropertyId::TeachingTipIsOpen) => dependency_object
.ClearValue(&bindings::TeachingTip::IsOpenProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TeachingTip(_), PropertyId::TeachingTipIsLightDismissEnabled) => dependency_object
.ClearValue(
&bindings::TeachingTip::IsLightDismissEnabledProperty().map_err(native_error)?,
)
.map_err(native_error),
(Handle::TeachingTip(_), PropertyId::TeachingTipPreferredPlacement) => dependency_object
.ClearValue(&bindings::TeachingTip::PreferredPlacementProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TeachingTip(_), PropertyId::TeachingTipActionButtonContent) => dependency_object
.ClearValue(
&bindings::TeachingTip::ActionButtonContentProperty().map_err(native_error)?,
)
.map_err(native_error),
(Handle::TeachingTip(_), PropertyId::TeachingTipCloseButtonContent) => dependency_object
.ClearValue(&bindings::TeachingTip::CloseButtonContentProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::DropDownButton(_), PropertyId::DropDownButtonIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::AppBarButton(_), PropertyId::AppBarButtonLabel) => dependency_object
.ClearValue(&bindings::AppBarButton::LabelProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::AppBarButton(_), PropertyId::AppBarButtonIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::MenuBarItem(_), PropertyId::MenuBarItemTitle) => dependency_object
.ClearValue(&bindings::MenuBarItem::TitleProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::SplitButton(_), PropertyId::SplitButtonIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ColorPicker(_), PropertyId::ColorPickerColor) => dependency_object
.ClearValue(&bindings::ColorPicker::ColorProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ColorPicker(_), PropertyId::ColorPickerIsAlphaEnabled) => dependency_object
.ClearValue(&bindings::ColorPicker::IsAlphaEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ColorPicker(_), PropertyId::ColorPickerIsHexInputVisible) => dependency_object
.ClearValue(&bindings::ColorPicker::IsHexInputVisibleProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ColorPicker(_), PropertyId::ColorPickerIsColorSliderVisible) => dependency_object
.ClearValue(
&bindings::ColorPicker::IsColorSliderVisibleProperty().map_err(native_error)?,
)
.map_err(native_error),
(Handle::ColorPicker(_), PropertyId::ColorPickerIsColorChannelTextInputVisible) => {
dependency_object
.ClearValue(
&bindings::ColorPicker::IsColorChannelTextInputVisibleProperty()
.map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::ColorPicker(_), PropertyId::ColorPickerIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::DatePicker(_), PropertyId::DatePickerDayVisible) => dependency_object
.ClearValue(&bindings::DatePicker::DayVisibleProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::DatePicker(_), PropertyId::DatePickerMonthVisible) => dependency_object
.ClearValue(&bindings::DatePicker::MonthVisibleProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::DatePicker(_), PropertyId::DatePickerYearVisible) => dependency_object
.ClearValue(&bindings::DatePicker::YearVisibleProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::DatePicker(_), PropertyId::DatePickerIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TimePicker(_), PropertyId::TimePickerClockIdentifier) => dependency_object
.ClearValue(&bindings::TimePicker::ClockIdentifierProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TimePicker(_), PropertyId::TimePickerMinuteIncrement) => dependency_object
.ClearValue(&bindings::TimePicker::MinuteIncrementProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TimePicker(_), PropertyId::TimePickerIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::CalendarDatePicker(_), PropertyId::CalendarDatePickerPlaceholderText) => {
dependency_object
.ClearValue(
&bindings::CalendarDatePicker::PlaceholderTextProperty()
.map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::CalendarDatePicker(_), PropertyId::CalendarDatePickerIsTodayHighlighted) => {
dependency_object
.ClearValue(
&bindings::CalendarDatePicker::IsTodayHighlightedProperty()
.map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::CalendarDatePicker(_), PropertyId::CalendarDatePickerIsCalendarOpen) => {
dependency_object
.ClearValue(
&bindings::CalendarDatePicker::IsCalendarOpenProperty()
.map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::CalendarDatePicker(_), PropertyId::CalendarDatePickerIsEnabled) => {
dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error)
}
(Handle::ContentDialog(_), PropertyId::ContentDialogTitle) => dependency_object
.ClearValue(&bindings::ContentDialog::TitleProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ContentDialog(_), PropertyId::ContentDialogPrimaryButtonText) => dependency_object
.ClearValue(
&bindings::ContentDialog::PrimaryButtonTextProperty().map_err(native_error)?,
)
.map_err(native_error),
(Handle::ContentDialog(_), PropertyId::ContentDialogSecondaryButtonText) => {
dependency_object
.ClearValue(
&bindings::ContentDialog::SecondaryButtonTextProperty()
.map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::ContentDialog(_), PropertyId::ContentDialogCloseButtonText) => dependency_object
.ClearValue(&bindings::ContentDialog::CloseButtonTextProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ContentDialog(_), PropertyId::ContentDialogIsPrimaryButtonEnabled) => {
dependency_object
.ClearValue(
&bindings::ContentDialog::IsPrimaryButtonEnabledProperty()
.map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::ContentDialog(_), PropertyId::ContentDialogIsSecondaryButtonEnabled) => {
dependency_object
.ClearValue(
&bindings::ContentDialog::IsSecondaryButtonEnabledProperty()
.map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::CalendarView(_), PropertyId::CalendarViewIsTodayHighlighted) => dependency_object
.ClearValue(
&bindings::CalendarView::IsTodayHighlightedProperty().map_err(native_error)?,
)
.map_err(native_error),
(Handle::CalendarView(_), PropertyId::CalendarViewIsGroupLabelVisible) => dependency_object
.ClearValue(
&bindings::CalendarView::IsGroupLabelVisibleProperty().map_err(native_error)?,
)
.map_err(native_error),
(Handle::CalendarView(_), PropertyId::CalendarViewIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ListView(_), PropertyId::ListViewSelectedIndex) => dependency_object
.ClearValue(&bindings::Selector::SelectedIndexProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ListView(_), PropertyId::ListViewSelectionMode) => dependency_object
.ClearValue(&bindings::ListViewBase::SelectionModeProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ListView(_), PropertyId::ListViewCanDragItems) => dependency_object
.ClearValue(&bindings::ListViewBase::CanDragItemsProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ListView(_), PropertyId::ListViewCanReorderItems) => dependency_object
.ClearValue(&bindings::ListViewBase::CanReorderItemsProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ListView(_), PropertyId::ListViewAllowDrop) => dependency_object
.ClearValue(&bindings::UIElement::AllowDropProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::ListViewItem(_), PropertyId::ListViewItemTag) => dependency_object
.ClearValue(&bindings::FrameworkElement::TagProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::TreeView(_), PropertyId::TreeViewSelectionMode) => dependency_object
.ClearValue(&bindings::TreeView::SelectionModeProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::GridView(_), PropertyId::GridViewSelectedIndex) => dependency_object
.ClearValue(&bindings::Selector::SelectedIndexProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::GridView(_), PropertyId::GridViewCanDragItems) => dependency_object
.ClearValue(&bindings::ListViewBase::CanDragItemsProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::GridView(_), PropertyId::GridViewCanReorderItems) => dependency_object
.ClearValue(&bindings::ListViewBase::CanReorderItemsProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::GridView(_), PropertyId::GridViewAllowDrop) => dependency_object
.ClearValue(&bindings::UIElement::AllowDropProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::GridViewItem(_), PropertyId::GridViewItemTag) => dependency_object
.ClearValue(&bindings::FrameworkElement::TagProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::RichEditBox(control), PropertyId::RichEditBoxDocument) => {
set_rich_edit_text(control, "")
}
(Handle::RichEditBox(_), PropertyId::RichEditBoxPlaceholderText) => dependency_object
.ClearValue(&bindings::RichEditBox::PlaceholderTextProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::RichEditBox(_), PropertyId::RichEditBoxIsReadOnly) => dependency_object
.ClearValue(&bindings::RichEditBox::IsReadOnlyProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::RichEditBox(_), PropertyId::RichEditBoxIsEnabled) => dependency_object
.ClearValue(&bindings::Control::IsEnabledProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::RichTextBlock(control), PropertyId::RichTextBlockBlocks) => control
.Blocks()
.and_then(|blocks| blocks.cast::<windows_collections::IVector<Block>>())
.and_then(|blocks| blocks.Clear())
.map_err(native_error),
(Handle::RichTextBlock(_), PropertyId::RichTextBlockFontSize) => dependency_object
.ClearValue(&bindings::RichTextBlock::FontSizeProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::RichTextBlock(_), PropertyId::RichTextBlockIsTextSelectionEnabled) => {
dependency_object
.ClearValue(
&bindings::RichTextBlock::IsTextSelectionEnabledProperty()
.map_err(native_error)?,
)
.map_err(native_error)
}
(Handle::RichTextBlock(_), PropertyId::RichTextBlockTextWrapping) => dependency_object
.ClearValue(&bindings::RichTextBlock::TextWrappingProperty().map_err(native_error)?)
.map_err(native_error),
(Handle::Viewbox(_), PropertyId::ViewboxStretch) => dependency_object
.ClearValue(&bindings::Viewbox::StretchProperty().map_err(native_error)?)
.map_err(native_error),
_ => Err(RuntimeError::UnsupportedKind),
}
}
pub fn set_slot(
handle: &Handle,
slot: SlotId,
child: Option<&UIElement>,
) -> Result<(), RuntimeError> {
match (handle, slot) {
(Handle::TextBox(control), SlotId::TextBoxHeader) => match child {
Some(child) => control.SetHeader(child).map_err(native_error),
None => control
.SetHeader(None::<&windows_core::IInspectable>)
.map_err(native_error),
},
(Handle::AutoSuggestBox(control), SlotId::AutoSuggestBoxHeader) => match child {
Some(child) => control.SetHeader(child).map_err(native_error),
None => control
.SetHeader(None::<&windows_core::IInspectable>)
.map_err(native_error),
},
(Handle::PasswordBox(control), SlotId::PasswordBoxHeader) => match child {
Some(child) => control.SetHeader(child).map_err(native_error),
None => control
.SetHeader(None::<&windows_core::IInspectable>)
.map_err(native_error),
},
(Handle::NumberBox(control), SlotId::NumberBoxHeader) => match child {
Some(child) => control.SetHeader(child).map_err(native_error),
None => control
.SetHeader(None::<&windows_core::IInspectable>)
.map_err(native_error),
},
(Handle::Slider(control), SlotId::SliderHeader) => match child {
Some(child) => control.SetHeader(child).map_err(native_error),
None => control
.SetHeader(None::<&windows_core::IInspectable>)
.map_err(native_error),
},
(Handle::TitleBar(control), SlotId::TitleBarContent) => match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control.SetContent(None::<&UIElement>).map_err(native_error),
},
(Handle::TitleBar(control), SlotId::TitleBarRightHeader) => match child {
Some(child) => control.SetRightHeader(child).map_err(native_error),
None => control
.SetRightHeader(None::<&UIElement>)
.map_err(native_error),
},
(Handle::NavigationView(control), SlotId::NavigationViewContent) => {
let control = control.cast::<IContentControl>().map_err(native_error)?;
match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control
.SetContent(None::<&windows_core::IInspectable>)
.map_err(native_error),
}
}
(Handle::NavigationView(control), SlotId::NavigationViewHeader) => match child {
Some(child) => control.SetHeader(child).map_err(native_error),
None => control
.SetHeader(None::<&windows_core::IInspectable>)
.map_err(native_error),
},
(Handle::NavigationView(control), SlotId::NavigationViewPaneCustomContent) => {
let control = control.cast::<INavigationView2>().map_err(native_error)?;
match child {
Some(child) => control.SetPaneCustomContent(child).map_err(native_error),
None => control
.SetPaneCustomContent(None::<&UIElement>)
.map_err(native_error),
}
}
(Handle::NavigationView(control), SlotId::NavigationViewPaneFooter) => match child {
Some(child) => control.SetPaneFooter(child).map_err(native_error),
None => control
.SetPaneFooter(None::<&UIElement>)
.map_err(native_error),
},
(Handle::NavigationViewItem(control), SlotId::NavigationViewItemContent) => {
let control = control.cast::<IContentControl>().map_err(native_error)?;
match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control
.SetContent(None::<&windows_core::IInspectable>)
.map_err(native_error),
}
}
(Handle::NavigationViewItem(control), SlotId::NavigationViewItemIcon) => match child {
Some(child) => {
let child = child.cast::<IconElement>().map_err(native_error)?;
control.SetIcon(&child).map_err(native_error)
}
None => control.SetIcon(None::<&IconElement>).map_err(native_error),
},
(Handle::SplitView(control), SlotId::SplitViewPane) => match child {
Some(child) => control.SetPane(child).map_err(native_error),
None => control.SetPane(None::<&UIElement>).map_err(native_error),
},
(Handle::SplitView(control), SlotId::SplitViewContent) => match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control.SetContent(None::<&UIElement>).map_err(native_error),
},
(Handle::ToggleSwitch(control), SlotId::ToggleSwitchHeader) => match child {
Some(child) => control.SetHeader(child).map_err(native_error),
None => control
.SetHeader(None::<&windows_core::IInspectable>)
.map_err(native_error),
},
(Handle::ToggleSwitch(control), SlotId::ToggleSwitchOnContent) => match child {
Some(child) => control.SetOnContent(child).map_err(native_error),
None => control
.SetOnContent(None::<&windows_core::IInspectable>)
.map_err(native_error),
},
(Handle::ToggleSwitch(control), SlotId::ToggleSwitchOffContent) => match child {
Some(child) => control.SetOffContent(child).map_err(native_error),
None => control
.SetOffContent(None::<&windows_core::IInspectable>)
.map_err(native_error),
},
(Handle::RadioButtons(control), SlotId::RadioButtonsHeader) => match child {
Some(child) => control.SetHeader(child).map_err(native_error),
None => control
.SetHeader(None::<&windows_core::IInspectable>)
.map_err(native_error),
},
(Handle::Expander(control), SlotId::ExpanderHeader) => match child {
Some(child) => control.SetHeader(child).map_err(native_error),
None => control
.SetHeader(None::<&windows_core::IInspectable>)
.map_err(native_error),
},
(Handle::Expander(control), SlotId::ExpanderContent) => {
let control = control.cast::<IContentControl>().map_err(native_error)?;
match child {
Some(child) => control.SetContent(child).map_err(native_error),
None => control
.SetContent(None::<&windows_core::IInspectable>)
.map_err(native_error),
}
}
(Handle::ComboBox(control), SlotId::ComboBoxHeader) => match child {
Some(child) => control.SetHeader(child).map_err(native_error),
None => control
.SetHeader(None::<&windows_core::IInspectable>)
.map_err(native_error),
},
(Handle::SelectorBarItem(control), SlotId::SelectorBarItemIcon) => match child {
Some(child) => {
let child = child.cast::<IconElement>().map_err(native_error)?;
control.SetIcon(&child).map_err(native_error)
}
None => control.SetIcon(None::<&IconElement>).map_err(native_error),
},
(Handle::AppBarButton(control), SlotId::AppBarButtonIcon) => match child {
Some(child) => {
let child = child.cast::<IconElement>().map_err(native_error)?;
control.SetIcon(&child).map_err(native_error)
}
None => control.SetIcon(None::<&IconElement>).map_err(native_error),
},
(Handle::DatePicker(control), SlotId::DatePickerHeader) => match child {
Some(child) => control.SetHeader(child).map_err(native_error),
None => control
.SetHeader(None::<&windows_core::IInspectable>)
.map_err(native_error),
},
(Handle::TimePicker(control), SlotId::TimePickerHeader) => match child {
Some(child) => control.SetHeader(child).map_err(native_error),
None => control
.SetHeader(None::<&windows_core::IInspectable>)
.map_err(native_error),
},
(Handle::CalendarDatePicker(control), SlotId::CalendarDatePickerHeader) => match child {
Some(child) => control.SetHeader(child).map_err(native_error),
None => control
.SetHeader(None::<&windows_core::IInspectable>)
.map_err(native_error),
},
(Handle::RichEditBox(control), SlotId::RichEditBoxHeader) => match child {
Some(child) => control.SetHeader(child).map_err(native_error),
None => control
.SetHeader(None::<&windows_core::IInspectable>)
.map_err(native_error),
},
(Handle::Viewbox(control), SlotId::ViewboxChild) => match child {
Some(child) => control.SetChild(child).map_err(native_error),
None => control.SetChild(None::<&UIElement>).map_err(native_error),
},
_ => Err(RuntimeError::UnsupportedKind),
}
}
pub fn slot_collection(handle: &Handle, slot: SlotId) -> Result<SlotCollection, RuntimeError> {
match (handle, slot) {
(Handle::NavigationView(control), SlotId::NavigationViewMenuItems) => Ok(
SlotCollection::Inspectable(control.MenuItems().map_err(native_error)?),
),
(Handle::NavigationViewItem(control), SlotId::NavigationViewItemMenuItems) => {
Ok(SlotCollection::Inspectable(
control
.cast::<INavigationViewItem2>()
.map_err(native_error)?
.MenuItems()
.map_err(native_error)?,
))
}
(Handle::ListBox(control), SlotId::ListBoxItems) => Ok(SlotCollection::Inspectable(
control
.cast::<IItemsControl>()
.map_err(native_error)?
.Items()
.map_err(native_error)?
.cast::<windows_collections::IVector<windows_core::IInspectable>>()
.map_err(native_error)?,
)),
(Handle::Pivot(control), SlotId::PivotItems) => Ok(SlotCollection::Inspectable(
control
.cast::<IItemsControl>()
.map_err(native_error)?
.Items()
.map_err(native_error)?
.cast::<windows_collections::IVector<windows_core::IInspectable>>()
.map_err(native_error)?,
)),
(Handle::FlipView(control), SlotId::FlipViewItems) => Ok(SlotCollection::Inspectable(
control
.cast::<IItemsControl>()
.map_err(native_error)?
.Items()
.map_err(native_error)?
.cast::<windows_collections::IVector<windows_core::IInspectable>>()
.map_err(native_error)?,
)),
(Handle::SelectorBar(control), SlotId::SelectorBarItems) => Ok(
SlotCollection::SelectorBarItem(control.Items().map_err(native_error)?),
),
(Handle::TabView(control), SlotId::TabViewTabItems) => Ok(SlotCollection::Inspectable(
control.TabItems().map_err(native_error)?,
)),
(Handle::CommandBar(control), SlotId::CommandBarPrimaryCommands) => {
Ok(SlotCollection::ICommandBarElement(
control
.PrimaryCommands()
.map_err(native_error)?
.cast::<windows_collections::IVector<bindings::ICommandBarElement>>()
.map_err(native_error)?,
))
}
(Handle::CommandBar(control), SlotId::CommandBarSecondaryCommands) => {
Ok(SlotCollection::ICommandBarElement(
control
.SecondaryCommands()
.map_err(native_error)?
.cast::<windows_collections::IVector<bindings::ICommandBarElement>>()
.map_err(native_error)?,
))
}
(Handle::MenuBar(control), SlotId::MenuBarItems) => Ok(SlotCollection::MenuBarItem(
control.Items().map_err(native_error)?,
)),
(Handle::ListView(control), SlotId::ListViewItems) => Ok(SlotCollection::Inspectable(
control
.cast::<IItemsControl>()
.map_err(native_error)?
.Items()
.map_err(native_error)?
.cast::<windows_collections::IVector<windows_core::IInspectable>>()
.map_err(native_error)?,
)),
(Handle::GridView(control), SlotId::GridViewItems) => Ok(SlotCollection::Inspectable(
control
.cast::<IItemsControl>()
.map_err(native_error)?
.Items()
.map_err(native_error)?
.cast::<windows_collections::IVector<windows_core::IInspectable>>()
.map_err(native_error)?,
)),
_ => Err(RuntimeError::UnsupportedKind),
}
}
pub fn selected_item(
handle: &Handle,
selection: SelectionDescriptor,
) -> Result<Option<windows_core::IInspectable>, RuntimeError> {
match (handle, selection.slot) {
(Handle::NavigationView(value), SlotId::NavigationViewMenuItems) => {
match value.SelectedItem() {
Ok(selected) => Ok(Some(selected)),
Err(error) if error.code().is_ok() => Ok(None),
Err(error) => Err(native_error(error)),
}
}
(Handle::ListBox(value), SlotId::ListBoxItems) => {
match value
.cast::<ISelector>()
.and_then(|value| value.SelectedItem())
{
Ok(selected) => Ok(Some(selected)),
Err(error) if error.code().is_ok() => Ok(None),
Err(error) => Err(native_error(error)),
}
}
(Handle::SelectorBar(value), SlotId::SelectorBarItems) => match value.SelectedItem() {
Ok(selected) => Ok(Some(selected.into())),
Err(error) if error.code().is_ok() => Ok(None),
Err(error) => Err(native_error(error)),
},
_ => Ok(None),
}
}
pub fn set_selected_item(
handle: &Handle,
selection: SelectionDescriptor,
selected: &windows_core::IInspectable,
) -> Result<(), RuntimeError> {
match (handle, selection.slot) {
(Handle::NavigationView(value), SlotId::NavigationViewMenuItems) => {
value.SetSelectedItem(selected).map_err(native_error)
}
(Handle::ListBox(value), SlotId::ListBoxItems) => value
.cast::<ISelector>()
.and_then(|value| value.SetSelectedItem(selected))
.map_err(native_error),
(Handle::SelectorBar(value), SlotId::SelectorBarItems) => selected
.cast::<bindings::SelectorBarItem>()
.and_then(|selected| value.SetSelectedItem(&selected))
.map_err(native_error),
_ => Ok(()),
}
}
pub fn selection_item_is_selected(
selection: SelectionDescriptor,
item: &windows_core::IInspectable,
) -> Result<bool, RuntimeError> {
match selection.selected_property {
PropertyId::NavigationViewItemIsSelected => {
let Ok(item) = item.cast::<INavigationViewItemBase2>() else {
return Ok(false);
};
item.IsSelected().map_err(native_error)
}
PropertyId::ListBoxItemIsSelected => {
let Ok(item) = item.cast::<ISelectorItem>() else {
return Ok(false);
};
item.IsSelected().map_err(native_error)
}
PropertyId::SelectorBarItemIsSelected => {
let Ok(item) = item.cast::<IItemContainer>() else {
return Ok(false);
};
item.IsSelected().map_err(native_error)
}
_ => Ok(false),
}
}
pub fn selection_payload(
selection: SelectionDescriptor,
item: &windows_core::IInspectable,
) -> Result<Option<String>, RuntimeError> {
match selection.payload_property {
PropertyId::NavigationViewItemTag => match item
.cast::<IFrameworkElement>()
.and_then(|item| item.Tag())
.and_then(|value| value.cast::<windows_reference::IReference<windows_core::HSTRING>>())
.and_then(|value| value.Value())
.map(|value| value.to_string_lossy())
{
Ok(value) => Ok(Some(value)),
Err(error) if error.code().is_ok() => Ok(None),
Err(error) => Err(native_error(error)),
},
PropertyId::ListBoxItemTag => match item
.cast::<IFrameworkElement>()
.and_then(|item| item.Tag())
.and_then(|value| value.cast::<windows_reference::IReference<windows_core::HSTRING>>())
.and_then(|value| value.Value())
.map(|value| value.to_string_lossy())
{
Ok(value) => Ok(Some(value)),
Err(error) if error.code().is_ok() => Ok(None),
Err(error) => Err(native_error(error)),
},
PropertyId::SelectorBarItemText => {
match item.cast::<ISelectorBarItem>().and_then(|item| item.Text()) {
Ok(value) => Ok(Some(value)),
Err(error) if error.code().is_ok() => Ok(None),
Err(error) => Err(native_error(error)),
}
}
_ => Err(RuntimeError::UnsupportedKind),
}
}
pub fn expected_feedback(
property: PropertyId,
value: Option<&PropertyValue>,
) -> Option<(EventId, FeedbackExpectation)> {
match (property, value) {
(PropertyId::TextBoxText, Some(PropertyValue::Str(value))) => Some((
EventId::TextBoxTextChanged,
FeedbackExpectation::Exact(EventPayload::Str(value.clone())),
)),
(PropertyId::AutoSuggestBoxText, Some(PropertyValue::Str(value))) => Some((
EventId::AutoSuggestBoxTextChanged,
FeedbackExpectation::Exact(EventPayload::Str(value.clone())),
)),
(PropertyId::PasswordBoxPassword, Some(PropertyValue::Str(value))) => Some((
EventId::PasswordBoxPasswordChanged,
FeedbackExpectation::Exact(EventPayload::Str(value.clone())),
)),
(PropertyId::NumberBoxMinimum, Some(_)) => Some((
EventId::NumberBoxValueChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::NumberBoxMaximum, Some(_)) => Some((
EventId::NumberBoxValueChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::NumberBoxValue, Some(_)) => Some((
EventId::NumberBoxValueChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::SliderMinimum, Some(_)) => Some((
EventId::SliderValueChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::SliderMaximum, Some(_)) => Some((
EventId::SliderValueChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::SliderValue, Some(_)) => Some((
EventId::SliderValueChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::NavigationViewIsPaneOpen, Some(PropertyValue::Bool(value))) => Some((
EventId::NavigationViewIsPaneOpenChanged,
FeedbackExpectation::Exact(EventPayload::Bool(*value)),
)),
(PropertyId::SplitViewIsPaneOpen, Some(PropertyValue::Bool(value))) => Some((
EventId::SplitViewPaneClosed,
FeedbackExpectation::Exact(EventPayload::Bool(*value)),
)),
(PropertyId::ToggleSwitchIsOn, Some(PropertyValue::Bool(value))) => Some((
EventId::ToggleSwitchToggled,
FeedbackExpectation::Exact(EventPayload::Bool(*value)),
)),
(PropertyId::CheckBoxIsChecked, Some(PropertyValue::Bool(value))) => Some((
EventId::CheckBoxIsCheckedChanged,
FeedbackExpectation::Exact(EventPayload::Bool(*value)),
)),
(PropertyId::ToggleButtonIsChecked, Some(PropertyValue::Bool(value))) => Some((
EventId::ToggleButtonIsCheckedChanged,
FeedbackExpectation::Exact(EventPayload::Bool(*value)),
)),
(PropertyId::RadioButtonIsChecked, Some(PropertyValue::Bool(value))) => Some((
EventId::RadioButtonChecked,
FeedbackExpectation::Exact(EventPayload::Bool(*value)),
)),
(PropertyId::RadioButtonsSelectedIndex, Some(_)) => Some((
EventId::RadioButtonsSelectionChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::RatingControlMaxRating, Some(_)) => Some((
EventId::RatingControlValueChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::RatingControlValue, Some(_)) => Some((
EventId::RatingControlValueChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::ExpanderIsExpanded, Some(PropertyValue::Bool(value))) => Some((
EventId::ExpanderIsExpandedChanged,
FeedbackExpectation::Exact(EventPayload::Bool(*value)),
)),
(PropertyId::ComboBoxSelectedIndex, Some(PropertyValue::SelectionIndex(value))) => Some((
EventId::ComboBoxSelectionChanged,
FeedbackExpectation::Exact(EventPayload::SelectionIndex(*value)),
)),
(PropertyId::PivotSelectedIndex, Some(PropertyValue::SelectionIndex(value))) => Some((
EventId::PivotSelectionChanged,
FeedbackExpectation::Exact(EventPayload::SelectionIndex(*value)),
)),
(PropertyId::FlipViewSelectedIndex, Some(PropertyValue::SelectionIndex(value))) => Some((
EventId::FlipViewSelectionChanged,
FeedbackExpectation::Exact(EventPayload::SelectionIndex(*value)),
)),
(PropertyId::TabViewSelectedIndex, Some(PropertyValue::SelectionIndex(value))) => Some((
EventId::TabViewSelectionChanged,
FeedbackExpectation::Exact(EventPayload::SelectionIndex(*value)),
)),
(PropertyId::ColorPickerColor, Some(PropertyValue::Color(value))) => Some((
EventId::ColorPickerColorChanged,
FeedbackExpectation::Exact(EventPayload::Color(*value)),
)),
(PropertyId::ListViewSelectedIndex, Some(PropertyValue::SelectionIndex(value))) => Some((
EventId::ListViewSelectionChanged,
FeedbackExpectation::Exact(EventPayload::SelectionIndex(*value)),
)),
(PropertyId::GridViewSelectedIndex, Some(PropertyValue::SelectionIndex(value))) => Some((
EventId::GridViewSelectionChanged,
FeedbackExpectation::Exact(EventPayload::SelectionIndex(*value)),
)),
(PropertyId::RichEditBoxDocument, Some(PropertyValue::Str(value))) => Some((
EventId::RichEditBoxTextChanged,
FeedbackExpectation::Exact(EventPayload::Str(value.clone())),
)),
(PropertyId::TextBoxText, None) => Some((
EventId::TextBoxTextChanged,
FeedbackExpectation::Exact(EventPayload::Str(Default::default())),
)),
(PropertyId::AutoSuggestBoxText, None) => Some((
EventId::AutoSuggestBoxTextChanged,
FeedbackExpectation::Exact(EventPayload::Str(Default::default())),
)),
(PropertyId::PasswordBoxPassword, None) => Some((
EventId::PasswordBoxPasswordChanged,
FeedbackExpectation::Exact(EventPayload::Str(Default::default())),
)),
(PropertyId::NumberBoxMinimum, None) => Some((
EventId::NumberBoxValueChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::NumberBoxMaximum, None) => Some((
EventId::NumberBoxValueChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::NumberBoxValue, None) => Some((
EventId::NumberBoxValueChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::SliderMinimum, None) => Some((
EventId::SliderValueChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::SliderMaximum, None) => Some((
EventId::SliderValueChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::SliderValue, None) => Some((
EventId::SliderValueChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::NavigationViewIsPaneOpen, None) => Some((
EventId::NavigationViewIsPaneOpenChanged,
FeedbackExpectation::Exact(EventPayload::Bool(true)),
)),
(PropertyId::SplitViewIsPaneOpen, None) => Some((
EventId::SplitViewPaneClosed,
FeedbackExpectation::Exact(EventPayload::Bool(false)),
)),
(PropertyId::ToggleSwitchIsOn, None) => Some((
EventId::ToggleSwitchToggled,
FeedbackExpectation::Exact(EventPayload::Bool(false)),
)),
(PropertyId::CheckBoxIsChecked, None) => Some((
EventId::CheckBoxIsCheckedChanged,
FeedbackExpectation::Exact(EventPayload::Bool(false)),
)),
(PropertyId::ToggleButtonIsChecked, None) => Some((
EventId::ToggleButtonIsCheckedChanged,
FeedbackExpectation::Exact(EventPayload::Bool(false)),
)),
(PropertyId::RadioButtonIsChecked, None) => Some((
EventId::RadioButtonChecked,
FeedbackExpectation::Exact(EventPayload::Bool(false)),
)),
(PropertyId::RadioButtonsSelectedIndex, None) => Some((
EventId::RadioButtonsSelectionChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::RatingControlMaxRating, None) => Some((
EventId::RatingControlValueChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::RatingControlValue, None) => Some((
EventId::RatingControlValueChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::ExpanderIsExpanded, None) => Some((
EventId::ExpanderIsExpandedChanged,
FeedbackExpectation::Exact(EventPayload::Bool(false)),
)),
(PropertyId::ComboBoxSelectedIndex, None) => Some((
EventId::ComboBoxSelectionChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::PivotSelectedIndex, None) => Some((
EventId::PivotSelectionChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::FlipViewSelectedIndex, None) => Some((
EventId::FlipViewSelectionChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::TabViewSelectedIndex, None) => Some((
EventId::TabViewSelectionChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::ColorPickerColor, None) => Some((
EventId::ColorPickerColorChanged,
FeedbackExpectation::Exact(EventPayload::Color(Default::default())),
)),
(PropertyId::ListViewSelectedIndex, None) => Some((
EventId::ListViewSelectionChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::GridViewSelectedIndex, None) => Some((
EventId::GridViewSelectionChanged,
FeedbackExpectation::Normalized { observation: None },
)),
(PropertyId::RichEditBoxDocument, None) => Some((
EventId::RichEditBoxTextChanged,
FeedbackExpectation::Exact(EventPayload::Str(Default::default())),
)),
_ => None,
}
}
pub fn theme_style_info(kind: MountedKind) -> Option<(&'static str, &'static [&'static str])> {
match kind {
MountedKind::TextBlock => Some(("TextBlock", &["Foreground"])),
MountedKind::Border => Some(("Border", &["Background", "BorderBrush"])),
MountedKind::Grid => Some(("Grid", &["Background"])),
MountedKind::TextBox => Some(("TextBox", &["Background", "BorderBrush"])),
MountedKind::Rectangle => Some(("Rectangle", &["Fill", "Stroke"])),
MountedKind::Ellipse => Some(("Ellipse", &["Fill", "Stroke"])),
MountedKind::Line => Some(("Line", &["Stroke"])),
_ => None,
}
}
pub fn subscribe_event(
handle: &Handle,
node: NodeId,
event: EventId,
revision: u32,
sink: EventSink,
) -> Result<NativeSubscription, RuntimeError> {
match (handle, event) {
(Handle::Button(value), EventId::ButtonClick) => {
let source = value.cast::<IButtonBase>().map_err(native_error)?;
source.Click(move |_, _| {
sink.enqueue(node, EventId::ButtonClick, revision, EventPayload::Unit);
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::HyperlinkButton(value), EventId::HyperlinkButtonClick) => {
let source = value.cast::<IButtonBase>().map_err(native_error)?;
source.Click(move |_, _| {
sink.enqueue(
node,
EventId::HyperlinkButtonClick,
revision,
EventPayload::Unit,
);
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::RepeatButton(value), EventId::RepeatButtonClick) => {
let source = value.cast::<IButtonBase>().map_err(native_error)?;
source.Click(move |_, _| {
sink.enqueue(
node,
EventId::RepeatButtonClick,
revision,
EventPayload::Unit,
);
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::Border(value), EventId::BorderDragEnter) => {
let source = value.cast::<IUIElement>().map_err(native_error)?;
source.DragEnter(move |_, args| {
let result = args
.as_ref()
.ok_or_else(windows_core::Error::empty)
.and_then(|args| {
let data = args.DataView()?;
let kind = if data.Contains("Shell IDList Array")? {
DragKind::StorageItems
} else if data.Contains("Text")? {
DragKind::Text
} else {
DragKind::Unsupported
};
let action = sink.drag_action(node, kind);
args.SetAcceptedOperation(
action
.as_ref()
.map_or(DataPackageOperation::None, |action| {
native_drag_operation(action.operation)
}),
)?;
let ui = args.DragUIOverride()?;
if let Some(caption) =
action.as_ref().and_then(|action| action.caption.as_deref())
{
ui.SetCaption(caption)?;
ui.SetIsCaptionVisible(true)?;
} else {
ui.SetIsCaptionVisible(false)?;
}
Ok(action.map_or(DragKind::Unsupported, |_| kind))
});
match result {
Ok(kind) => sink.enqueue(
node,
EventId::BorderDragEnter,
revision,
EventPayload::DragKind(kind),
),
Err(error) => {
sink.error(
node,
EventId::BorderDragEnter,
revision,
native_error(error),
);
}
};
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::Border(value), EventId::BorderDragOver) => {
let source = value.cast::<IUIElement>().map_err(native_error)?;
source.DragOver(move |_, args| {
let result = args
.as_ref()
.ok_or_else(windows_core::Error::empty)
.and_then(|args| {
let data = args.DataView()?;
let kind = if data.Contains("Shell IDList Array")? {
DragKind::StorageItems
} else if data.Contains("Text")? {
DragKind::Text
} else {
DragKind::Unsupported
};
let action = sink.drag_action(node, kind);
args.SetAcceptedOperation(
action
.as_ref()
.map_or(DataPackageOperation::None, |action| {
native_drag_operation(action.operation)
}),
)?;
let ui = args.DragUIOverride()?;
if let Some(caption) =
action.as_ref().and_then(|action| action.caption.as_deref())
{
ui.SetCaption(caption)?;
ui.SetIsCaptionVisible(true)?;
} else {
ui.SetIsCaptionVisible(false)?;
}
Ok(action.map_or(DragKind::Unsupported, |_| kind))
});
match result {
Ok(kind) => sink.enqueue(
node,
EventId::BorderDragOver,
revision,
EventPayload::DragKind(kind),
),
Err(error) => {
sink.error(node, EventId::BorderDragOver, revision, native_error(error));
}
};
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::Border(value), EventId::BorderDragLeave) => {
let source = value.cast::<IUIElement>().map_err(native_error)?;
source.DragLeave(move |_, _| {
sink.enqueue(node, EventId::BorderDragLeave, revision, EventPayload::Unit);
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::Border(value), EventId::BorderDrop) => {
let source = value.cast::<IUIElement>().map_err(native_error)?;
source.Drop(move |_, args| {
let result = args
.as_ref()
.ok_or_else(windows_core::Error::empty)
.and_then(|args| {
let deferral = args.GetDeferral()?;
let result = (|| {
let data = args.DataView()?;
if data.Contains("Shell IDList Array")? {
let Some(action) = sink.drag_action(node, DragKind::StorageItems)
else {
args.SetAcceptedOperation(DataPackageOperation::None)?;
deferral.Complete()?;
sink.enqueue(
node,
EventId::BorderDrop,
revision,
EventPayload::DroppedData(DroppedData::Unsupported),
);
return Ok(());
};
args.SetAcceptedOperation(native_drag_operation(action.operation))?;
let operation = data.GetStorageItemsAsync()?;
let sender = sink.begin_async_event(
node,
EventId::BorderDrop,
revision,
deferral.clone(),
);
let completion = sender.clone();
if let Err(error) = operation.when(move |result| {
let result = result.and_then(|items| {
let mut dropped =
Vec::with_capacity(items.Size()? as usize);
for index in 0..items.Size()? {
let item = items.GetAt(index)?;
dropped.push(DroppedStorageItem {
name: item.Name()?,
path: item.Path()?,
});
}
Ok(DroppedData::StorageItems(dropped))
});
_ = completion.complete(result.map_err(native_error));
}) {
_ = sender.complete(Err(native_error(error)));
}
Ok(())
} else if data.Contains("Text")? {
let Some(action) = sink.drag_action(node, DragKind::Text) else {
args.SetAcceptedOperation(DataPackageOperation::None)?;
deferral.Complete()?;
sink.enqueue(
node,
EventId::BorderDrop,
revision,
EventPayload::DroppedData(DroppedData::Unsupported),
);
return Ok(());
};
args.SetAcceptedOperation(native_drag_operation(action.operation))?;
let operation = data.GetTextAsync()?;
let sender = sink.begin_async_event(
node,
EventId::BorderDrop,
revision,
deferral.clone(),
);
let completion = sender.clone();
if let Err(error) = operation.when(move |result| {
_ = completion.complete(
result
.map(|text| DroppedData::Text(text.to_string_lossy()))
.map_err(native_error),
);
}) {
_ = sender.complete(Err(native_error(error)));
}
Ok(())
} else {
args.SetAcceptedOperation(DataPackageOperation::None)?;
deferral.Complete()?;
sink.enqueue(
node,
EventId::BorderDrop,
revision,
EventPayload::DroppedData(DroppedData::Unsupported),
);
Ok(())
}
})();
if result.is_err() {
deferral.Complete()?;
}
result
});
match result {
Ok(()) => {}
Err(error) => {
sink.error(node, EventId::BorderDrop, revision, native_error(error));
}
};
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::Border(value), EventId::BorderPointerPressed) => {
let source = value.cast::<IUIElement>().map_err(native_error)?;
source.PointerPressed({
let element = value.cast::<UIElement>().map_err(native_error)?;
move |_, args| {
let mut info = crate::PointerEventInfo::default();
if let Some(args) = args.as_ref() {
if let Ok(point) = args.GetCurrentPoint(&element) {
if let Ok(position) = point.Position() {
info.x = f64::from(position.x);
info.y = f64::from(position.y);
}
if let Ok(properties) = point.Properties() {
info.is_left_button_pressed =
properties.IsLeftButtonPressed().unwrap_or(false);
info.is_right_button_pressed =
properties.IsRightButtonPressed().unwrap_or(false);
info.is_middle_button_pressed =
properties.IsMiddleButtonPressed().unwrap_or(false);
}
}
if let Ok(point) = args.GetCurrentPoint(None::<&UIElement>)
&& let Ok(position) = point.Position()
{
info.window_x = f64::from(position.x);
info.window_y = f64::from(position.y);
}
}
info.capture_succeeded =
match sink.capture_pointer_on_press(node, &element, args) {
Ok(value) => value,
Err(error) => {
sink.error(node, EventId::BorderPointerPressed, revision, error);
return;
}
};
sink.enqueue(
node,
EventId::BorderPointerPressed,
revision,
EventPayload::PointerEventInfo(info),
);
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::Border(value), EventId::BorderPointerMoved) => {
let source = value.cast::<IUIElement>().map_err(native_error)?;
source.PointerMoved({
let element = value.cast::<UIElement>().map_err(native_error)?;
move |_, args| {
let mut info = crate::PointerEventInfo::default();
if let Some(args) = args.as_ref() {
if let Ok(point) = args.GetCurrentPoint(&element) {
if let Ok(position) = point.Position() {
info.x = f64::from(position.x);
info.y = f64::from(position.y);
}
if let Ok(properties) = point.Properties() {
info.is_left_button_pressed =
properties.IsLeftButtonPressed().unwrap_or(false);
info.is_right_button_pressed =
properties.IsRightButtonPressed().unwrap_or(false);
info.is_middle_button_pressed =
properties.IsMiddleButtonPressed().unwrap_or(false);
}
}
if let Ok(point) = args.GetCurrentPoint(None::<&UIElement>)
&& let Ok(position) = point.Position()
{
info.window_x = f64::from(position.x);
info.window_y = f64::from(position.y);
}
}
sink.enqueue(
node,
EventId::BorderPointerMoved,
revision,
EventPayload::PointerEventInfo(info),
);
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::Border(value), EventId::BorderPointerEntered) => {
let source = value.cast::<IUIElement>().map_err(native_error)?;
source.PointerEntered({
let element = value.cast::<UIElement>().map_err(native_error)?;
move |_, args| {
let mut info = crate::PointerEventInfo::default();
if let Some(args) = args.as_ref() {
if let Ok(point) = args.GetCurrentPoint(&element) {
if let Ok(position) = point.Position() {
info.x = f64::from(position.x);
info.y = f64::from(position.y);
}
if let Ok(properties) = point.Properties() {
info.is_left_button_pressed =
properties.IsLeftButtonPressed().unwrap_or(false);
info.is_right_button_pressed =
properties.IsRightButtonPressed().unwrap_or(false);
info.is_middle_button_pressed =
properties.IsMiddleButtonPressed().unwrap_or(false);
}
}
if let Ok(point) = args.GetCurrentPoint(None::<&UIElement>)
&& let Ok(position) = point.Position()
{
info.window_x = f64::from(position.x);
info.window_y = f64::from(position.y);
}
}
sink.enqueue(
node,
EventId::BorderPointerEntered,
revision,
EventPayload::PointerEventInfo(info),
);
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::Border(value), EventId::BorderPointerExited) => {
let source = value.cast::<IUIElement>().map_err(native_error)?;
source.PointerExited({
let element = value.cast::<UIElement>().map_err(native_error)?;
move |_, args| {
let mut info = crate::PointerEventInfo::default();
if let Some(args) = args.as_ref() {
if let Ok(point) = args.GetCurrentPoint(&element) {
if let Ok(position) = point.Position() {
info.x = f64::from(position.x);
info.y = f64::from(position.y);
}
if let Ok(properties) = point.Properties() {
info.is_left_button_pressed =
properties.IsLeftButtonPressed().unwrap_or(false);
info.is_right_button_pressed =
properties.IsRightButtonPressed().unwrap_or(false);
info.is_middle_button_pressed =
properties.IsMiddleButtonPressed().unwrap_or(false);
}
}
if let Ok(point) = args.GetCurrentPoint(None::<&UIElement>)
&& let Ok(position) = point.Position()
{
info.window_x = f64::from(position.x);
info.window_y = f64::from(position.y);
}
}
sink.enqueue(
node,
EventId::BorderPointerExited,
revision,
EventPayload::PointerEventInfo(info),
);
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::Border(value), EventId::BorderPointerReleased) => {
let source = value.cast::<IUIElement>().map_err(native_error)?;
source.PointerReleased({
let element = value.cast::<UIElement>().map_err(native_error)?;
move |_, args| {
let mut info = crate::PointerEventInfo::default();
if let Some(args) = args.as_ref() {
if let Ok(point) = args.GetCurrentPoint(&element) {
if let Ok(position) = point.Position() {
info.x = f64::from(position.x);
info.y = f64::from(position.y);
}
if let Ok(properties) = point.Properties() {
info.is_left_button_pressed =
properties.IsLeftButtonPressed().unwrap_or(false);
info.is_right_button_pressed =
properties.IsRightButtonPressed().unwrap_or(false);
info.is_middle_button_pressed =
properties.IsMiddleButtonPressed().unwrap_or(false);
}
}
if let Ok(point) = args.GetCurrentPoint(None::<&UIElement>)
&& let Ok(position) = point.Position()
{
info.window_x = f64::from(position.x);
info.window_y = f64::from(position.y);
}
}
if let Err(error) = sink.release_pointer_after_event(node, &element, args) {
sink.error(node, EventId::BorderPointerReleased, revision, error);
return;
}
sink.enqueue(
node,
EventId::BorderPointerReleased,
revision,
EventPayload::PointerEventInfo(info),
);
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::Border(value), EventId::BorderPointerCaptureLost) => {
let source = value.cast::<IUIElement>().map_err(native_error)?;
source.PointerCaptureLost(move |_, _| {
sink.enqueue(
node,
EventId::BorderPointerCaptureLost,
revision,
EventPayload::Unit,
);
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::Border(value), EventId::BorderPointerCanceled) => {
let source = value.cast::<IUIElement>().map_err(native_error)?;
source.PointerCanceled(move |_, _| {
sink.enqueue(
node,
EventId::BorderPointerCanceled,
revision,
EventPayload::Unit,
);
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::BreadcrumbBar(value), EventId::BreadcrumbBarItemClicked) => {
value.ItemClicked(move |_, args| {
if let Some(args) = args.as_ref() {
match args
.Item()
.and_then(|value| {
value.cast::<windows_reference::IReference<windows_core::HSTRING>>()
})
.and_then(|value| value.Value())
{
Ok(value) => sink.enqueue(
node,
EventId::BreadcrumbBarItemClicked,
revision,
EventPayload::Str(value.to_string_lossy()),
),
Err(error) => sink.error(
node,
EventId::BreadcrumbBarItemClicked,
revision,
native_error(error),
),
}
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::TextBox(value), EventId::TextBoxTextChanged) => {
let event_source = (*value).clone();
value.TextChanged({
move |_, _| match event_source.Text() {
Ok(value) => sink.enqueue(
node,
EventId::TextBoxTextChanged,
revision,
EventPayload::Str(value),
),
Err(error) => sink.error(
node,
EventId::TextBoxTextChanged,
revision,
native_error(error),
),
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::AutoSuggestBox(value), EventId::AutoSuggestBoxTextChanged) => {
let event_source = (*value).clone();
value.TextChanged({
move |_, _| match event_source.Text() {
Ok(value) => sink.enqueue(
node,
EventId::AutoSuggestBoxTextChanged,
revision,
EventPayload::Str(value),
),
Err(error) => sink.error(
node,
EventId::AutoSuggestBoxTextChanged,
revision,
native_error(error),
),
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::AutoSuggestBox(value), EventId::AutoSuggestBoxSuggestionChosen) => {
value.SuggestionChosen(move |_, args| {
if let Some(args) = args.as_ref() {
match args
.SelectedItem()
.and_then(|value| {
value.cast::<windows_reference::IReference<windows_core::HSTRING>>()
})
.and_then(|value| value.Value())
{
Ok(value) => sink.enqueue(
node,
EventId::AutoSuggestBoxSuggestionChosen,
revision,
EventPayload::Str(value.to_string_lossy()),
),
Err(error) => sink.error(
node,
EventId::AutoSuggestBoxSuggestionChosen,
revision,
native_error(error),
),
}
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::PasswordBox(value), EventId::PasswordBoxPasswordChanged) => {
let event_source = (*value).clone();
value.PasswordChanged({
move |_, _| match event_source.Password() {
Ok(value) => sink.enqueue(
node,
EventId::PasswordBoxPasswordChanged,
revision,
EventPayload::Str(value),
),
Err(error) => sink.error(
node,
EventId::PasswordBoxPasswordChanged,
revision,
native_error(error),
),
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::NumberBox(value), EventId::NumberBoxValueChanged) => {
value.ValueChanged(move |_, args| {
if let Some(args) = args.as_ref() {
match args.NewValue() {
Ok(value) => sink.enqueue(
node,
EventId::NumberBoxValueChanged,
revision,
EventPayload::OptionalF64(number_box_value(value)),
),
Err(error) => sink.error(
node,
EventId::NumberBoxValueChanged,
revision,
native_error(error),
),
}
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::Slider(value), EventId::SliderValueChanged) => {
let source = value.cast::<IRangeBase>().map_err(native_error)?;
source.ValueChanged(move |_, args| {
if let Some(args) = args.as_ref() {
match args.NewValue() {
Ok(value) => sink.enqueue(
node,
EventId::SliderValueChanged,
revision,
EventPayload::F64(value),
),
Err(error) => sink.error(
node,
EventId::SliderValueChanged,
revision,
native_error(error),
),
}
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::TitleBar(value), EventId::TitleBarBackRequested) => {
value.BackRequested(move |_, _| {
sink.enqueue(
node,
EventId::TitleBarBackRequested,
revision,
EventPayload::Unit,
);
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::TitleBar(value), EventId::TitleBarPaneToggleRequested) => {
value.PaneToggleRequested(move |_, _| {
sink.enqueue(
node,
EventId::TitleBarPaneToggleRequested,
revision,
EventPayload::Unit,
);
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::NavigationView(value), EventId::NavigationViewIsPaneOpenChanged) => {
let object = value.cast::<DependencyObject>().map_err(native_error)?;
let property = bindings::NavigationView::IsPaneOpenProperty().map_err(native_error)?;
let callback = DependencyPropertyChangedCallback::new({
let event_source = (*value).clone();
move |_, _| match event_source.IsPaneOpen() {
Ok(value) => sink.enqueue(
node,
EventId::NavigationViewIsPaneOpenChanged,
revision,
EventPayload::Bool(value),
),
Err(error) => sink.error(
node,
EventId::NavigationViewIsPaneOpenChanged,
revision,
native_error(error),
),
}
});
let token = object
.RegisterPropertyChangedCallback(&property, &callback)
.map_err(native_error)?;
Ok(NativeSubscription::Property {
object,
property,
token,
})
}
(Handle::NavigationView(value), EventId::NavigationViewDisplayModeChanged) => {
value.DisplayModeChanged(move |_, args| {
if let Some(args) = args.as_ref() {
match args.DisplayMode() {
Ok(value) => sink.enqueue(
node,
EventId::NavigationViewDisplayModeChanged,
revision,
EventPayload::NavigationViewDisplayMode(match value {
bindings::NavigationViewDisplayMode::Minimal => {
crate::NavigationViewDisplayMode::Minimal
}
bindings::NavigationViewDisplayMode::Compact => {
crate::NavigationViewDisplayMode::Compact
}
bindings::NavigationViewDisplayMode::Expanded => {
crate::NavigationViewDisplayMode::Expanded
}
_ => return,
}),
),
Err(error) => sink.error(
node,
EventId::NavigationViewDisplayModeChanged,
revision,
native_error(error),
),
}
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::NavigationView(value), EventId::NavigationViewSelectionChanged) => {
value.SelectionChanged(move |_, args| {
if let Some(args) = args.as_ref() {
let value = args.SelectedItem();
match value {
Ok(item) => {
let selected = sink.selection_item(&item);
match selection_payload(
selection_for_event(EventId::NavigationViewSelectionChanged)
.unwrap(),
&item,
) {
Ok(tag) => sink.enqueue(
node,
EventId::NavigationViewSelectionChanged,
revision,
EventPayload::SelectionChange(SelectionChange {
item: selected,
tag,
}),
),
Err(error) => sink.error(
node,
EventId::NavigationViewSelectionChanged,
revision,
error,
),
}
}
Err(error) if error.code().is_ok() => sink.enqueue(
node,
EventId::NavigationViewSelectionChanged,
revision,
EventPayload::SelectionChange(SelectionChange {
item: None,
tag: None,
}),
),
Err(error) => sink.error(
node,
EventId::NavigationViewSelectionChanged,
revision,
native_error(error),
),
}
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::SplitView(value), EventId::SplitViewPaneClosed) => {
let object = value.cast::<DependencyObject>().map_err(native_error)?;
let property = bindings::SplitView::IsPaneOpenProperty().map_err(native_error)?;
let callback = DependencyPropertyChangedCallback::new({
let event_source = (*value).clone();
move |_, _| match event_source.IsPaneOpen() {
Ok(value) => sink.enqueue(
node,
EventId::SplitViewPaneClosed,
revision,
EventPayload::Bool(value),
),
Err(error) => sink.error(
node,
EventId::SplitViewPaneClosed,
revision,
native_error(error),
),
}
});
let token = object
.RegisterPropertyChangedCallback(&property, &callback)
.map_err(native_error)?;
Ok(NativeSubscription::Property {
object,
property,
token,
})
}
(Handle::ToggleSwitch(value), EventId::ToggleSwitchToggled) => {
let event_source = (*value).clone();
value.Toggled({
move |_, _| match event_source.IsOn() {
Ok(value) => sink.enqueue(
node,
EventId::ToggleSwitchToggled,
revision,
EventPayload::Bool(value),
),
Err(error) => sink.error(
node,
EventId::ToggleSwitchToggled,
revision,
native_error(error),
),
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::CheckBox(value), EventId::CheckBoxIsCheckedChanged) => {
let object = value.cast::<DependencyObject>().map_err(native_error)?;
let property = bindings::ToggleButton::IsCheckedProperty().map_err(native_error)?;
let callback = DependencyPropertyChangedCallback::new({
let event_source = value.cast::<IToggleButton>().map_err(native_error)?;
move |_, _| match event_source.IsChecked() {
Ok(value) => sink.enqueue(
node,
EventId::CheckBoxIsCheckedChanged,
revision,
EventPayload::Bool(value),
),
Err(error) => sink.error(
node,
EventId::CheckBoxIsCheckedChanged,
revision,
native_error(error),
),
}
});
let token = object
.RegisterPropertyChangedCallback(&property, &callback)
.map_err(native_error)?;
Ok(NativeSubscription::Property {
object,
property,
token,
})
}
(Handle::ToggleButton(value), EventId::ToggleButtonIsCheckedChanged) => {
let object = value.cast::<DependencyObject>().map_err(native_error)?;
let property = bindings::ToggleButton::IsCheckedProperty().map_err(native_error)?;
let callback = DependencyPropertyChangedCallback::new({
let event_source = (*value).clone();
move |_, _| match event_source.IsChecked() {
Ok(value) => sink.enqueue(
node,
EventId::ToggleButtonIsCheckedChanged,
revision,
EventPayload::Bool(value),
),
Err(error) => sink.error(
node,
EventId::ToggleButtonIsCheckedChanged,
revision,
native_error(error),
),
}
});
let token = object
.RegisterPropertyChangedCallback(&property, &callback)
.map_err(native_error)?;
Ok(NativeSubscription::Property {
object,
property,
token,
})
}
(Handle::RadioButton(value), EventId::RadioButtonChecked) => {
let object = value.cast::<DependencyObject>().map_err(native_error)?;
let property = bindings::ToggleButton::IsCheckedProperty().map_err(native_error)?;
let callback = DependencyPropertyChangedCallback::new({
let event_source = value.cast::<IToggleButton>().map_err(native_error)?;
move |_, _| match event_source.IsChecked() {
Ok(value) => sink.enqueue(
node,
EventId::RadioButtonChecked,
revision,
EventPayload::Bool(value),
),
Err(error) => sink.error(
node,
EventId::RadioButtonChecked,
revision,
native_error(error),
),
}
});
let token = object
.RegisterPropertyChangedCallback(&property, &callback)
.map_err(native_error)?;
Ok(NativeSubscription::Property {
object,
property,
token,
})
}
(Handle::RadioButtons(value), EventId::RadioButtonsSelectionChanged) => {
let event_source = (*value).clone();
value.SelectionChanged({
move |_, _| match event_source.SelectedIndex() {
Ok(value) => sink.enqueue(
node,
EventId::RadioButtonsSelectionChanged,
revision,
EventPayload::SelectionIndex(match selection_index(value) {
Ok(value) => value,
Err(error) => {
sink.error(
node,
EventId::RadioButtonsSelectionChanged,
revision,
error,
);
return;
}
}),
),
Err(error) => sink.error(
node,
EventId::RadioButtonsSelectionChanged,
revision,
native_error(error),
),
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::InfoBar(value), EventId::InfoBarClosed) => {
value.Closed(move |_, _| {
sink.enqueue(node, EventId::InfoBarClosed, revision, EventPayload::Unit);
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::Image(value), EventId::ImageImageOpened) => {
value.ImageOpened(move |_, _| {
sink.enqueue(
node,
EventId::ImageImageOpened,
revision,
EventPayload::Unit,
);
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::Image(value), EventId::ImageImageFailed) => {
value.ImageFailed(move |_, _| {
sink.enqueue(
node,
EventId::ImageImageFailed,
revision,
EventPayload::Unit,
);
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::ListBox(value), EventId::ListBoxSelectionChanged) => {
let source = value.cast::<ISelector>().map_err(native_error)?;
let event_source = source.clone();
source.SelectionChanged({
move |_, _| {
let value = event_source.SelectedItem();
match value {
Ok(item) => {
let selected = sink.selection_item(&item);
match selection_payload(
selection_for_event(EventId::ListBoxSelectionChanged).unwrap(),
&item,
) {
Ok(tag) => sink.enqueue(
node,
EventId::ListBoxSelectionChanged,
revision,
EventPayload::SelectionChange(SelectionChange {
item: selected,
tag,
}),
),
Err(error) => sink.error(
node,
EventId::ListBoxSelectionChanged,
revision,
error,
),
}
}
Err(error) if error.code().is_ok() => sink.enqueue(
node,
EventId::ListBoxSelectionChanged,
revision,
EventPayload::SelectionChange(SelectionChange {
item: None,
tag: None,
}),
),
Err(error) => sink.error(
node,
EventId::ListBoxSelectionChanged,
revision,
native_error(error),
),
}
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::RatingControl(value), EventId::RatingControlValueChanged) => {
let event_source = (*value).clone();
value.ValueChanged({
move |_, _| match event_source.Value() {
Ok(value) => sink.enqueue(
node,
EventId::RatingControlValueChanged,
revision,
EventPayload::OptionalF64(rating_value(value)),
),
Err(error) => sink.error(
node,
EventId::RatingControlValueChanged,
revision,
native_error(error),
),
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::Expander(value), EventId::ExpanderIsExpandedChanged) => {
let object = value.cast::<DependencyObject>().map_err(native_error)?;
let property = bindings::Expander::IsExpandedProperty().map_err(native_error)?;
let callback = DependencyPropertyChangedCallback::new({
let event_source = (*value).clone();
move |_, _| match event_source.IsExpanded() {
Ok(value) => sink.enqueue(
node,
EventId::ExpanderIsExpandedChanged,
revision,
EventPayload::Bool(value),
),
Err(error) => sink.error(
node,
EventId::ExpanderIsExpandedChanged,
revision,
native_error(error),
),
}
});
let token = object
.RegisterPropertyChangedCallback(&property, &callback)
.map_err(native_error)?;
Ok(NativeSubscription::Property {
object,
property,
token,
})
}
(Handle::ComboBox(value), EventId::ComboBoxSelectionChanged) => {
let source = value.cast::<ISelector>().map_err(native_error)?;
let event_source = source.clone();
source.SelectionChanged({
move |_, _| match event_source.SelectedIndex() {
Ok(value) => sink.enqueue(
node,
EventId::ComboBoxSelectionChanged,
revision,
EventPayload::SelectionIndex(match selection_index(value) {
Ok(value) => value,
Err(error) => {
sink.error(
node,
EventId::ComboBoxSelectionChanged,
revision,
error,
);
return;
}
}),
),
Err(error) => sink.error(
node,
EventId::ComboBoxSelectionChanged,
revision,
native_error(error),
),
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::Pivot(value), EventId::PivotSelectionChanged) => {
let event_source = (*value).clone();
value.SelectionChanged({
move |_, _| match event_source.SelectedIndex() {
Ok(value) => sink.enqueue(
node,
EventId::PivotSelectionChanged,
revision,
EventPayload::SelectionIndex(match selection_index(value) {
Ok(value) => value,
Err(error) => {
sink.error(node, EventId::PivotSelectionChanged, revision, error);
return;
}
}),
),
Err(error) => sink.error(
node,
EventId::PivotSelectionChanged,
revision,
native_error(error),
),
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::FlipView(value), EventId::FlipViewSelectionChanged) => {
let source = value.cast::<ISelector>().map_err(native_error)?;
let event_source = source.clone();
source.SelectionChanged({
move |_, _| match event_source.SelectedIndex() {
Ok(value) => sink.enqueue(
node,
EventId::FlipViewSelectionChanged,
revision,
EventPayload::SelectionIndex(match selection_index(value) {
Ok(value) => value,
Err(error) => {
sink.error(
node,
EventId::FlipViewSelectionChanged,
revision,
error,
);
return;
}
}),
),
Err(error) => sink.error(
node,
EventId::FlipViewSelectionChanged,
revision,
native_error(error),
),
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::SelectorBar(value), EventId::SelectorBarSelectionChanged) => {
let event_source = (*value).clone();
value.SelectionChanged({
move |_, _| {
let value = event_source.SelectedItem();
match value {
Ok(item) => {
let item: windows_core::IInspectable = item.into();
let selected = sink.selection_item(&item);
match selection_payload(
selection_for_event(EventId::SelectorBarSelectionChanged).unwrap(),
&item,
) {
Ok(tag) => sink.enqueue(
node,
EventId::SelectorBarSelectionChanged,
revision,
EventPayload::SelectionChange(SelectionChange {
item: selected,
tag,
}),
),
Err(error) => sink.error(
node,
EventId::SelectorBarSelectionChanged,
revision,
error,
),
}
}
Err(error) if error.code().is_ok() => sink.enqueue(
node,
EventId::SelectorBarSelectionChanged,
revision,
EventPayload::SelectionChange(SelectionChange {
item: None,
tag: None,
}),
),
Err(error) => sink.error(
node,
EventId::SelectorBarSelectionChanged,
revision,
native_error(error),
),
}
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::TabView(value), EventId::TabViewSelectionChanged) => {
let event_source = (*value).clone();
value.SelectionChanged({
move |_, _| match event_source.SelectedIndex() {
Ok(value) => sink.enqueue(
node,
EventId::TabViewSelectionChanged,
revision,
EventPayload::SelectionIndex(match selection_index(value) {
Ok(value) => value,
Err(error) => {
sink.error(node, EventId::TabViewSelectionChanged, revision, error);
return;
}
}),
),
Err(error) => sink.error(
node,
EventId::TabViewSelectionChanged,
revision,
native_error(error),
),
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::TabView(value), EventId::TabViewTabCloseRequested) => {
value.TabCloseRequested(move |_, args| {
if let Some(args) = args.as_ref() {
match args
.Tab()
.and_then(|item| item.cast::<IFrameworkElement>())
.and_then(|item| item.Tag())
.and_then(|value| {
value.cast::<windows_reference::IReference<windows_core::HSTRING>>()
})
.and_then(|value| value.Value())
{
Ok(value) => sink.enqueue(
node,
EventId::TabViewTabCloseRequested,
revision,
EventPayload::Str(value.to_string_lossy()),
),
Err(error) if error.code().is_ok() => sink.enqueue(
node,
EventId::TabViewTabCloseRequested,
revision,
EventPayload::Str(String::new()),
),
Err(error) => sink.error(
node,
EventId::TabViewTabCloseRequested,
revision,
native_error(error),
),
}
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::TabView(value), EventId::TabViewAddTabButtonClick) => {
value.AddTabButtonClick(move |_, _| {
sink.enqueue(
node,
EventId::TabViewAddTabButtonClick,
revision,
EventPayload::Unit,
);
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::TabView(value), EventId::TabViewTabItemsChanged) => {
value.TabItemsChanged(move |sender, _| {
if let Some(sender) = sender.as_ref() {
let result = sender
.cast::<ITabView>()
.and_then(|sender| sender.TabItems())
.and_then(|items| {
let mut tags = Vec::with_capacity(items.Size()? as usize);
for index in 0..items.Size()? {
let tag = items
.GetAt(index)?
.cast::<IFrameworkElement>()?
.Tag()?
.cast::<windows_reference::IReference<windows_core::HSTRING>>()?
.Value()?;
tags.push(tag.to_string_lossy());
}
Ok(tags)
});
match result {
Ok(value) => sink.enqueue(
node,
EventId::TabViewTabItemsChanged,
revision,
EventPayload::StrList(std::rc::Rc::new(value)),
),
Err(error) => sink.error(
node,
EventId::TabViewTabItemsChanged,
revision,
native_error(error),
),
}
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::TeachingTip(value), EventId::TeachingTipClosed) => {
value.Closed(move |_, _| {
sink.enqueue(
node,
EventId::TeachingTipClosed,
revision,
EventPayload::Unit,
);
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::TeachingTip(value), EventId::TeachingTipActionButtonClick) => {
value.ActionButtonClick(move |_, _| {
sink.enqueue(
node,
EventId::TeachingTipActionButtonClick,
revision,
EventPayload::Unit,
);
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::DropDownButton(value), EventId::DropDownButtonClick) => {
let source = value.cast::<IButtonBase>().map_err(native_error)?;
source.Click(move |_, _| {
sink.enqueue(
node,
EventId::DropDownButtonClick,
revision,
EventPayload::Unit,
);
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::AppBarButton(value), EventId::AppBarButtonClick) => {
let source = value.cast::<IButtonBase>().map_err(native_error)?;
source.Click(move |_, _| {
sink.enqueue(
node,
EventId::AppBarButtonClick,
revision,
EventPayload::Unit,
);
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::SplitButton(value), EventId::SplitButtonClick) => {
value.Click(move |_, _| {
sink.enqueue(
node,
EventId::SplitButtonClick,
revision,
EventPayload::Unit,
);
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::ColorPicker(value), EventId::ColorPickerColorChanged) => {
value.ColorChanged(move |_, args| {
if let Some(args) = args.as_ref() {
match args.NewColor() {
Ok(value) => sink.enqueue(
node,
EventId::ColorPickerColorChanged,
revision,
EventPayload::Color(crate::Color {
a: value.a,
r: value.r,
g: value.g,
b: value.b,
}),
),
Err(error) => sink.error(
node,
EventId::ColorPickerColorChanged,
revision,
native_error(error),
),
}
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::DatePicker(value), EventId::DatePickerSelectedDateChanged) => {
value.SelectedDateChanged(move |_, args| {
if let Some(args) = args.as_ref() {
match args.NewDate() {
Ok(value) => sink.enqueue(
node,
EventId::DatePickerSelectedDateChanged,
revision,
EventPayload::OptionalDateTime(Some(value)),
),
Err(error) if error.code().is_ok() => sink.enqueue(
node,
EventId::DatePickerSelectedDateChanged,
revision,
EventPayload::OptionalDateTime(None),
),
Err(error) => sink.error(
node,
EventId::DatePickerSelectedDateChanged,
revision,
native_error(error),
),
}
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::TimePicker(value), EventId::TimePickerSelectedTimeChanged) => {
value.SelectedTimeChanged(move |_, args| {
if let Some(args) = args.as_ref() {
match args.NewTime() {
Ok(value) => sink.enqueue(
node,
EventId::TimePickerSelectedTimeChanged,
revision,
EventPayload::OptionalTimeSpan(Some(value)),
),
Err(error) if error.code().is_ok() => sink.enqueue(
node,
EventId::TimePickerSelectedTimeChanged,
revision,
EventPayload::OptionalTimeSpan(None),
),
Err(error) => sink.error(
node,
EventId::TimePickerSelectedTimeChanged,
revision,
native_error(error),
),
}
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::CalendarDatePicker(value), EventId::CalendarDatePickerDateChanged) => {
value.DateChanged(move |_, args| {
if let Some(args) = args.as_ref() {
match args.NewDate() {
Ok(value) => sink.enqueue(
node,
EventId::CalendarDatePickerDateChanged,
revision,
EventPayload::OptionalDateTime(Some(value)),
),
Err(error) if error.code().is_ok() => sink.enqueue(
node,
EventId::CalendarDatePickerDateChanged,
revision,
EventPayload::OptionalDateTime(None),
),
Err(error) => sink.error(
node,
EventId::CalendarDatePickerDateChanged,
revision,
native_error(error),
),
}
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::ContentDialog(value), EventId::ContentDialogClosed) => {
value.Closed(move |_, args| {
let invoke_callback = match sink.content_dialog_closed(node, revision) {
Ok(value) => value,
Err(error) => {
sink.error(node, EventId::ContentDialogClosed, revision, error);
return;
}
};
if let Some(args) = args.as_ref() {
match args.Result() {
Ok(value) => sink.enqueue_or_observe(
node,
EventId::ContentDialogClosed,
revision,
EventPayload::ContentDialogResult(match value.0 {
1 => crate::ContentDialogResult::Primary,
2 => crate::ContentDialogResult::Secondary,
_ => crate::ContentDialogResult::None,
}),
invoke_callback,
),
Err(error) => sink.error(
node,
EventId::ContentDialogClosed,
revision,
native_error(error),
),
}
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::CalendarView(value), EventId::CalendarViewSelectedDatesChanged) => {
value.SelectedDatesChanged(move |_, _| {
sink.enqueue(
node,
EventId::CalendarViewSelectedDatesChanged,
revision,
EventPayload::Unit,
);
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::ListView(value), EventId::ListViewSelectionChanged) => {
let source = value.cast::<ISelector>().map_err(native_error)?;
let event_source = source.clone();
source.SelectionChanged({
move |_, _| match event_source.SelectedIndex() {
Ok(value) => sink.enqueue(
node,
EventId::ListViewSelectionChanged,
revision,
EventPayload::SelectionIndex(match selection_index(value) {
Ok(value) => value,
Err(error) => {
sink.error(
node,
EventId::ListViewSelectionChanged,
revision,
error,
);
return;
}
}),
),
Err(error) => sink.error(
node,
EventId::ListViewSelectionChanged,
revision,
native_error(error),
),
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::ListView(value), EventId::ListViewDragItemsCompleted) => {
let source = value.cast::<IListViewBase>().map_err(native_error)?;
source.DragItemsCompleted(move |sender, _| {
if let Some(sender) = sender.as_ref() {
let result = sender
.cast::<IItemsControl>()
.and_then(|sender| sender.Items())
.and_then(|items| {
let mut tags = Vec::with_capacity(items.Size()? as usize);
for index in 0..items.Size()? {
let tag = items
.GetAt(index)?
.cast::<IFrameworkElement>()?
.Tag()?
.cast::<windows_reference::IReference<windows_core::HSTRING>>()?
.Value()?;
tags.push(tag.to_string_lossy());
}
Ok(tags)
});
match result {
Ok(value) => sink.enqueue(
node,
EventId::ListViewDragItemsCompleted,
revision,
EventPayload::StrList(std::rc::Rc::new(value)),
),
Err(error) => sink.error(
node,
EventId::ListViewDragItemsCompleted,
revision,
native_error(error),
),
}
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::TreeView(value), EventId::TreeViewItemInvoked) => {
value.ItemInvoked(move |_, args| {
if let Some(args) = args.as_ref() {
match args
.InvokedItem()
.and_then(|node| node.cast::<ITreeViewNode>())
.and_then(|node| node.Content())
.and_then(|value| {
value.cast::<windows_reference::IReference<windows_core::HSTRING>>()
})
.and_then(|value| value.Value())
{
Ok(value) => sink.enqueue(
node,
EventId::TreeViewItemInvoked,
revision,
EventPayload::Str(value.to_string_lossy()),
),
Err(error) => sink.error(
node,
EventId::TreeViewItemInvoked,
revision,
native_error(error),
),
}
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::GridView(value), EventId::GridViewDragItemsCompleted) => {
let source = value.cast::<IListViewBase>().map_err(native_error)?;
source.DragItemsCompleted(move |sender, _| {
if let Some(sender) = sender.as_ref() {
let result = sender
.cast::<IItemsControl>()
.and_then(|sender| sender.Items())
.and_then(|items| {
let mut tags = Vec::with_capacity(items.Size()? as usize);
for index in 0..items.Size()? {
let tag = items
.GetAt(index)?
.cast::<IFrameworkElement>()?
.Tag()?
.cast::<windows_reference::IReference<windows_core::HSTRING>>()?
.Value()?;
tags.push(tag.to_string_lossy());
}
Ok(tags)
});
match result {
Ok(value) => sink.enqueue(
node,
EventId::GridViewDragItemsCompleted,
revision,
EventPayload::StrList(std::rc::Rc::new(value)),
),
Err(error) => sink.error(
node,
EventId::GridViewDragItemsCompleted,
revision,
native_error(error),
),
}
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::GridView(value), EventId::GridViewSelectionChanged) => {
let source = value.cast::<ISelector>().map_err(native_error)?;
let event_source = source.clone();
source.SelectionChanged({
move |_, _| match event_source.SelectedIndex() {
Ok(value) => sink.enqueue(
node,
EventId::GridViewSelectionChanged,
revision,
EventPayload::SelectionIndex(match selection_index(value) {
Ok(value) => value,
Err(error) => {
sink.error(
node,
EventId::GridViewSelectionChanged,
revision,
error,
);
return;
}
}),
),
Err(error) => sink.error(
node,
EventId::GridViewSelectionChanged,
revision,
native_error(error),
),
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
(Handle::RichEditBox(value), EventId::RichEditBoxTextChanged) => {
value.TextChanged({
let event_source = (*value).clone();
move |_, _| {
let value = event_source.Document().and_then(|document| {
let mut value = windows_core::HSTRING::new();
document
.GetText(bindings::TextGetOptions::None, &mut value)
.map(|_| value)
});
match value {
Ok(value) => sink.enqueue(
node,
EventId::RichEditBoxTextChanged,
revision,
EventPayload::Str(value.to_string_lossy()),
),
Err(error) => sink.error(
node,
EventId::RichEditBoxTextChanged,
revision,
native_error(error),
),
}
}
})
}
.map(|revoker| NativeSubscription::Event {
_revoker: revoker,
revision,
})
.map_err(native_error),
_ => Err(RuntimeError::UnsupportedKind),
}
}