Skip to content

Commit

Permalink
Merge pull request #19 from UnicordDev/feature/more-embeds
Browse files Browse the repository at this point in the history
More embed types
  • Loading branch information
WamWooWam authored Dec 7, 2024
2 parents 950381f + 4d9348c commit cb35a37
Show file tree
Hide file tree
Showing 12 changed files with 457 additions and 59 deletions.
15 changes: 15 additions & 0 deletions UniSky/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using UnhandledExceptionEventArgs = Windows.UI.Xaml.UnhandledExceptionEventArgs;

namespace UniSky;

Expand All @@ -33,6 +34,8 @@ namespace UniSky;
/// </summary>
sealed partial class App : Application
{
private ILogger<App> _logger;

/// <summary>
/// Initializes the singleton application object. This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
Expand All @@ -43,10 +46,22 @@ public App()

this.InitializeComponent();
this.Suspending += OnSuspending;
this.UnhandledException += OnUnhandledException;

_logger = ServiceContainer.Default.GetRequiredService<ILoggerFactory>()
.CreateLogger<App>();

// ResourceContext.SetGlobalQualifierValue("Custom", "Twitter", ResourceQualifierPersistence.LocalMachine);
}

private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
_logger.LogError(e.Exception, "Unhandled exception!!");

// hate this
e.Handled = true;
}

private void ConfigureServices()
{
var collection = new ServiceCollection();
Expand Down
45 changes: 45 additions & 0 deletions UniSky/Converters/VisibilityConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
using System;
using System.Collections;
using System.Linq;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Data;

namespace UniSky.Converters;

public class VisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
if (value is null)
{
return Visibility.Collapsed;
}

if (value is bool b)
{
return b ? Visibility.Visible : Visibility.Collapsed;
}

if (value is int i)
{
return i > 0 ? Visibility.Visible : Visibility.Collapsed;
}

if (value is string str)
{
return string.IsNullOrWhiteSpace(str) ? Visibility.Collapsed : Visibility.Visible;
}

if (value is IEnumerable e)
{
return e.OfType<object>().Any() ? Visibility.Visible : Visibility.Collapsed;
}

return Visibility.Visible;
}

public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
220 changes: 202 additions & 18 deletions UniSky/DataTemplates/FeedTemplates.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,21 @@
<SolidColorBrush x:Key="LikeBrush">#ea4298</SolidColorBrush>
<SolidColorBrush x:Key="RetweetBrush">#5cefaa</SolidColorBrush>

<datatemplates:PostEmbedTemplateSelector x:Key="PostEmbedTemplateSelector"
ImagesEmbedTemplate="{StaticResource ImagesEmbedContentTemplate}"
VideoEmbedTemplate="{StaticResource VideoEmbedContentTemplate}"
PostEmbedTemplate="{StaticResource PostEmbedContentTemplate}"
ExternalEmbedTemplate="{StaticResource ExternalEmbedContentTemplate}"
RecordWithMediaEmbedTemplate="{StaticResource RecordWithMediaEmbedContentTemplate}"/>

<datatemplates:PostEmbedTemplateSelector x:Key="PostEmbedChildTemplateSelector"
ImagesEmbedTemplate="{StaticResource ImagesEmbedContentTemplate}"
VideoEmbedTemplate="{StaticResource VideoEmbedContentTemplate}"
PostEmbedTemplate="{StaticResource PostEmbedContentTemplate}"
ExternalEmbedTemplate="{StaticResource ExternalEmbedContentTemplate}"/>

<converters:VisibilityConverter x:Key="VisibilityConverter"/>

<MenuFlyout x:Key="FeedItemMoreButtonFlyout"
w1809:Placement="BottomEdgeAlignedRight"
not1809:Placement="Bottom">
Expand All @@ -36,7 +51,7 @@
Text="Report Post"
Icon="ReportHacked"/>
</MenuFlyout>

<Style x:Key="FeedItemActionButtonStyle" TargetType="Button">
<Setter Property="Padding" Value="8"/>
<Setter Property="Margin" Value="0,0,8,0"/>
Expand All @@ -45,6 +60,168 @@
<Setter Property="Foreground" Value="{ThemeResource ApplicationSecondaryForegroundThemeBrush}"/>
</Style>

<DataTemplate x:Key="RecordWithMediaEmbedContentTemplate"
x:DataType="posts:PostEmbedRecordWithMediaViewModel">
<StackPanel>
<Grid x:Name="MediaContentContainer"
Visibility="{Binding Media,Converter={StaticResource VisibilityConverter}}">
<ContentControl x:Name="MediaContent"
Margin="0,4,0,0"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
ContentTemplateSelector="{StaticResource PostEmbedChildTemplateSelector}"
Content="{Binding Media}"/>
</Grid>
<Grid x:Name="RecordContentContainer"
Visibility="{Binding Record, Converter={StaticResource VisibilityConverter}}">
<ContentControl x:Name="RecordContent"
Margin="0,4,0,0"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
ContentTemplateSelector="{StaticResource PostEmbedChildTemplateSelector}"
Content="{Binding Record}"/>
</Grid>
</StackPanel>
</DataTemplate>

<DataTemplate x:Key="ExternalEmbedContentTemplate"
x:DataType="posts:PostEmbedExternalViewModel">
<Button Style="{ThemeResource CleanButtonStyle}"
Command="{Binding OpenLinkCommand}"
BorderBrush="{ThemeResource SystemControlSeparatorBrush}"
Padding="0"
extensions:Hairline.BorderThickness="1"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>

<Border x:Name="ThumbnailBox"
Visibility="{Binding ThumbnailUrl, Converter={StaticResource VisibilityConverter}}"
BorderBrush="{ThemeResource SystemControlSeparatorBrush}"
extensions:Hairline.BorderThickness="0,0,0,1">
<toolkit:ConstrainedBox AspectRatio="2:1">
<Image Source="{Binding ThumbnailUrl}"
VerticalAlignment="Center"
Stretch="UniformToFill"/>
</toolkit:ConstrainedBox>
</Border>

<StackPanel Grid.Row="1"
Padding="8,8,8,4">
<TextBlock x:Name="TitleBlock"
Visibility="{Binding Title, Converter={StaticResource VisibilityConverter}}"
Grid.Row="0"
Grid.Column="1"
Style="{ThemeResource BaseTextBlockStyle}"
Text="{Binding Title}"
VerticalAlignment="Bottom"
MaxLines="1"/>

<TextBlock x:Name="SubtitleBlock"
Visibility="{Binding Description, Converter={StaticResource VisibilityConverter}}"
Grid.Row="1"
Grid.Column="1"
Margin="0,2,0,0"
Style="{ThemeResource CaptionTextBlockStyle}"
Text="{Binding Description}"
VerticalAlignment="Top"
MaxLines="2"/>
</StackPanel>

<TextBlock Grid.Row="2"
Text="{Binding Source}"
Style="{ThemeResource CaptionTextBlockStyle}"
Foreground="{ThemeResource ApplicationSecondaryForegroundThemeBrush}"
MaxLines="1"
Margin="8,0,8,8"/>
</Grid>
</Button>
</DataTemplate>

<DataTemplate x:Key="PostEmbedContentTemplate"
x:DataType="posts:PostEmbedPostViewModel">
<Button Style="{ThemeResource CleanButtonStyle}"
BorderBrush="{ThemeResource SystemControlSeparatorBrush}"
extensions:Hairline.BorderThickness="1"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
Padding="8">
<StackPanel>
<Button Command="{Binding Author.OpenProfileCommand}"
CommandParameter="{Binding ElementName=SmallProfileEllipse}"
Style="{ThemeResource CleanButtonStyle}"
Padding="0"
VerticalAlignment="Top"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>

<Ellipse x:Name="SmallProfileEllipse"
Width="20"
Height="20"
Margin="0,0,8,0">
<Ellipse.Fill>
<ImageBrush>
<ImageBrush.ImageSource>
<BitmapImage UriSource="{Binding Author.AvatarUrl}"
DecodePixelWidth="16"
DecodePixelHeight="16"
DecodePixelType="Logical"/>
</ImageBrush.ImageSource>
</ImageBrush>
</Ellipse.Fill>
</Ellipse>

<TextBlock Grid.Column="1"
Foreground="{ThemeResource SystemControlForegroundBaseMediumLowBrush}"
VerticalAlignment="Top"
TextTrimming="CharacterEllipsis">
<Run Text="{Binding Author.Name, Mode=OneWay}"
FontWeight="Bold"
Foreground="{ThemeResource SystemControlForegroundBaseHighBrush}"/>
<Run Text="{Binding Author.Handle, Mode=OneWay}"/>
</TextBlock>

<TextBlock x:Name="DateBlock"
Grid.Column="2"
Margin="2,0"
Foreground="{ThemeResource SystemControlForegroundBaseLowBrush}"
Typography.NumeralAlignment="Tabular"
Text="{Binding Date}"/>
</Grid>
</Button>

<controls:RichTextBlock x:Name="MainContent"
Visibility="{Binding Text, Converter={StaticResource VisibilityConverter}}"
Inlines="{Binding RichText.Facets}"
TextWrapping="Wrap"
Margin="0,2,0,0"
IsTextSelectionEnabled="True"
VerticalAlignment="Top"/>

<Grid x:Name="EmbedContentContainer"
Visibility="{Binding Embed, Converter={StaticResource VisibilityConverter}}">
<ContentControl x:Name="EmbedContent"
Margin="0,4,0,0"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
ContentTemplateSelector="{StaticResource PostEmbedTemplateSelector}"
Content="{Binding Embed}"/>
</Grid>
</StackPanel>
</Button>
</DataTemplate>

<DataTemplate x:Key="ImagesEmbedContentTemplate"
x:DataType="posts:PostEmbedImagesViewModel">
<UserControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Expand Down Expand Up @@ -210,10 +387,6 @@
</toolkit:ConstrainedBox>
</DataTemplate>

<datatemplates:PostEmbedTemplateSelector x:Key="PostEmbedTemplateSelector"
ImagesEmbedTemplate="{StaticResource ImagesEmbedContentTemplate}"
VideoEmbedTemplate="{StaticResource VideoEmbedContentTemplate}"/>

<DataTemplate x:Key="FeedItemContentTemplate"
x:DataType="posts:PostViewModel">
<StackPanel BorderBrush="{ThemeResource SystemControlRevealSeparatorBrush}"
Expand Down Expand Up @@ -277,6 +450,7 @@
CommandParameter="{Binding ElementName=ProfileEllipse}"
Style="{ThemeResource CleanButtonStyle}"
Padding="0"
Margin="-1,0,0,0"
VerticalAlignment="Top">
<Ellipse x:Name="ProfileEllipse"
Width="42"
Expand Down Expand Up @@ -305,29 +479,37 @@
</Grid>

<StackPanel Grid.Column="1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Foreground="{ThemeResource SystemControlForegroundBaseMediumLowBrush}"
<Button Command="{x:Bind Author.OpenProfileCommand}"
CommandParameter="{Binding ElementName=ProfileEllipse}"
Style="{ThemeResource CleanButtonStyle}"
Padding="0"
VerticalAlignment="Top"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Foreground="{ThemeResource SystemControlForegroundBaseMediumLowBrush}"
VerticalAlignment="Top"
TextTrimming="CharacterEllipsis">
<Run Text="{x:Bind Author.Name, Mode=OneWay}"
FontWeight="Bold"
Foreground="{ThemeResource SystemControlForegroundBaseHighBrush}"/>
<Run Text="{x:Bind Author.Handle, Mode=OneWay}"/>
</TextBlock>
</TextBlock>

<TextBlock x:Name="DateBlock"
<TextBlock x:Name="DateBlock"
x:Phase="4"
Grid.Column="1"
Margin="4,0,0,0"
Foreground="{ThemeResource SystemControlForegroundBaseLowBrush}"
Typography.NumeralAlignment="Tabular"
Text="{x:Bind Date}"/>
</Grid>

</Grid>
</Button>

<controls:RichTextBlock x:Name="MainContent"
x:Load="{x:Bind converters:Static.NotNullOrWhiteSpace(Text)}"
Inlines="{x:Bind RichText.Facets}"
Expand All @@ -340,9 +522,11 @@
x:Load="{x:Bind converters:Static.NotNull(Embed)}"
x:Phase="2">
<ContentControl x:Name="EmbedContent"
Margin="0,4,0,4"
ContentTemplateSelector="{StaticResource PostEmbedTemplateSelector}"
Content="{x:Bind Embed}"/>
Margin="0,4,0,4"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
ContentTemplateSelector="{StaticResource PostEmbedTemplateSelector}"
Content="{x:Bind Embed}"/>
</Grid>

<Grid x:Name="Interactions">
Expand Down
6 changes: 6 additions & 0 deletions UniSky/DataTemplates/PostEmbedTemplateSelector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,19 @@ internal class PostEmbedTemplateSelector : DataTemplateSelector
{
public DataTemplate VideoEmbedTemplate { get; set; }
public DataTemplate ImagesEmbedTemplate { get; set; }
public DataTemplate PostEmbedTemplate { get; set; }
public DataTemplate ExternalEmbedTemplate { get; set; }
public DataTemplate RecordWithMediaEmbedTemplate { get; set; }

protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
{
return item switch
{
PostEmbedImagesViewModel => ImagesEmbedTemplate,
PostEmbedVideoViewModel => VideoEmbedTemplate,
PostEmbedPostViewModel => PostEmbedTemplate,
PostEmbedExternalViewModel => ExternalEmbedTemplate,
PostEmbedRecordWithMediaViewModel => RecordWithMediaEmbedTemplate,
_ => null,
};
}
Expand Down
2 changes: 1 addition & 1 deletion UniSky/Package.appxmanifest
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<Identity
Name="24101WamWooWamRD.25225E497690B"
Publisher="CN=0F22111D-EDF0-42F0-B58D-26C4C5C5054B"
Version="1.0.154.0" />
Version="1.0.157.0" />

<mp:PhoneIdentity PhoneProductId="d3ae258d-7752-4bdb-bb0c-b6cca57f9cd1" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>

Expand Down
Loading

0 comments on commit cb35a37

Please sign in to comment.