From f03db4379822d6405c23e3bed9f1fa0221c24964 Mon Sep 17 00:00:00 2001 From: erri120 <erri120@protonmail.com> Date: Sun, 2 Feb 2020 13:36:22 +0100 Subject: [PATCH] Fleshed out the Manifest --- Wabbajack/View Models/ManifestVM.cs | 22 +++++--- Wabbajack/Views/ManifestView.xaml | 69 +++++++++++++++++--------- Wabbajack/Views/ManifestView.xaml.cs | 42 ++++++++++++++-- Wabbajack/Views/ManifestWindow.xaml | 17 +++++-- Wabbajack/Views/ManifestWindow.xaml.cs | 8 ++- 5 files changed, 121 insertions(+), 37 deletions(-) diff --git a/Wabbajack/View Models/ManifestVM.cs b/Wabbajack/View Models/ManifestVM.cs index e56ed260..80935f71 100644 --- a/Wabbajack/View Models/ManifestVM.cs +++ b/Wabbajack/View Models/ManifestVM.cs @@ -1,14 +1,24 @@ -using Wabbajack.Lib; +using System.Collections.Generic; +using Wabbajack.Common; +using Wabbajack.Lib; -namespace Wabbajack.View_Models +namespace Wabbajack { public class ManifestVM : ViewModel - { - public readonly Manifest Manifest; + { + public Manifest Manifest { get; set; } - public ManifestVM(ModList modlist) + public string Name => !string.IsNullOrWhiteSpace(Manifest.Name) ? Manifest.Name : "Wabbajack Modlist"; + public string Author => !string.IsNullOrWhiteSpace(Manifest.Author) ? $"Created by {Manifest.Author}" : "Created by Jyggalag"; + public string Description => !string.IsNullOrWhiteSpace(Manifest.Description) ? Manifest.Description : ""; + public string InstallSize => $"Install Size: {Manifest.InstallSize.ToFileSizeString()}"; + public string DownloadSize => $"Download Size: {Manifest.DownloadSize.ToFileSizeString()}"; + + public IEnumerable<Archive> Archives => Manifest.Archives; + + public ManifestVM(Manifest manifest) { - Manifest = new Manifest(modlist); + Manifest = manifest; } } } diff --git a/Wabbajack/Views/ManifestView.xaml b/Wabbajack/Views/ManifestView.xaml index 462f1fa3..e2c9860d 100644 --- a/Wabbajack/Views/ManifestView.xaml +++ b/Wabbajack/Views/ManifestView.xaml @@ -1,37 +1,60 @@ -<reactiveUi:ReactiveUserControl x:TypeArguments="viewModels:ManifestVM" x:Class="Wabbajack.ManifestView" +<reactiveUi:ReactiveUserControl x:TypeArguments="local:ManifestVM" x:Class="Wabbajack.ManifestView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Wabbajack" xmlns:reactiveUi="http://reactiveui.net" - xmlns:viewModels="clr-namespace:Wabbajack.View_Models" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> <ScrollViewer> - <Grid Margin="8"> - <TextBlock x:Name="Name" FontSize="20"/> - </Grid> + <ScrollViewer.Resources> + <Style x:Key="HeaderStyle" TargetType="{x:Type TextBlock}"> + <Setter Property="Foreground" Value="#03DAC6"/> + </Style> + <Style x:Key="HyperlinkStyle" TargetType="{x:Type Hyperlink}"> + <Setter Property="Foreground" Value="#BB76FC"/> + </Style> + <Style x:Key="ModTitleStyle" TargetType="{x:Type TextBlock}"> + <Setter Property="Foreground" Value="#C7FC86"/> + </Style> + </ScrollViewer.Resources> + <StackPanel Margin="8"> + <TextBlock x:Name="Name" FontSize="32" HorizontalAlignment="Center" Style="{StaticResource HeaderStyle}"/> + <TextBlock x:Name="Author" FontSize="14" Padding="0 3 0 3"/> + <TextBlock x:Name="Description" FontSize="14" TextWrapping="Wrap"/> - <!--<ItemsControl Margin="8" x:Name="ManifestItemsControl"> - <ItemsControl.Resources> - <DataTemplate x:Key="HeaderTemplate"> - <Grid> - <TextBlock Text="{Binding Path=Text}" FontSize="20"/> - </Grid> - </DataTemplate> - </ItemsControl.Resources> + <TextBlock FontSize="26" Padding="0 6 0 0" Text="Mods"/> + <TextBlock x:Name="InstallSize" FontSize="20"/> + <TextBlock x:Name="DownloadSize" FontSize="20" Padding="0 0 0 3"/> - <ItemsControl.ItemsPanel> - <ItemsPanelTemplate> - <ScrollViewer /> - </ItemsPanelTemplate> - </ItemsControl.ItemsPanel> + <ItemsControl Padding="0 3 0 6" x:Name="ModsList"> + <ItemsControl.ItemsPanel> + <ItemsPanelTemplate> + <StackPanel/> + </ItemsPanelTemplate> + </ItemsControl.ItemsPanel> - <ItemsControl.ItemTemplateSelector> - <DataTemplateSelector x:Name="DataTemplateSelector"/> - </ItemsControl.ItemTemplateSelector> - - </ItemsControl>--> + <ItemsControl.ItemTemplate> + <DataTemplate> + <Grid Margin="0 3 0 3"> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="Auto"/> + <ColumnDefinition Width="Auto"/> + </Grid.ColumnDefinitions> + <Grid.RowDefinitions> + <RowDefinition Height="Auto"/> + <RowDefinition Height="Auto"/> + </Grid.RowDefinitions> + <TextBlock Padding="6 0 0 0" Grid.Column="0" Grid.Row="0" FontSize="16" Text="{Binding Path=Name}" Style="{StaticResource ModTitleStyle}"/> + <TextBlock Padding="3 0 0 0" Grid.Column="1" Grid.Row="0" FontSize="16"> + <Hyperlink NavigateUri="{Binding Path=Name}" Style="{StaticResource HyperlinkStyle}" RequestNavigate="Hyperlink_OnRequestNavigate">Link</Hyperlink> + </TextBlock> + <TextBlock Padding="6 0 0 0" Grid.Column="0" Grid.Row="1" FontSize="12" Text="{Binding Path=Hash}"/> + </Grid> + </DataTemplate> + </ItemsControl.ItemTemplate> + </ItemsControl> + </StackPanel> </ScrollViewer> </reactiveUi:ReactiveUserControl> diff --git a/Wabbajack/Views/ManifestView.xaml.cs b/Wabbajack/Views/ManifestView.xaml.cs index fc63fc3a..4b915178 100644 --- a/Wabbajack/Views/ManifestView.xaml.cs +++ b/Wabbajack/Views/ManifestView.xaml.cs @@ -1,7 +1,13 @@ -using System.Reactive.Disposables; +using System; +using System.Diagnostics; +using System.Reactive.Disposables; +using System.Windows.Documents; +using System.Windows.Navigation; +using Microsoft.VisualBasic.CompilerServices; using ReactiveUI; using Wabbajack.Lib; -using Wabbajack.View_Models; +using Wabbajack.Lib.Downloaders; +using Utils = Wabbajack.Common.Utils; namespace Wabbajack { @@ -12,14 +18,42 @@ namespace Wabbajack public ManifestView(ModList modlist) { Modlist = modlist; + + var manifest = new Manifest(modlist); + if(ViewModel == null) + ViewModel = new ManifestVM(manifest); + InitializeComponent(); - ViewModel = new ManifestVM(modlist); this.WhenActivated(disposable => { - this.Bind(ViewModel, x => x.Manifest.Name, x => x.Name.Text) + this.OneWayBind(ViewModel, x => x.Name, x => x.Name.Text) + .DisposeWith(disposable); + this.OneWayBind(ViewModel, x => x.Author, x => x.Author.Text) + .DisposeWith(disposable); + this.OneWayBind(ViewModel, x => x.Description, x => x.Description.Text) + .DisposeWith(disposable); + this.OneWayBind(ViewModel, x => x.Archives, x => x.ModsList.ItemsSource) + .DisposeWith(disposable); + this.OneWayBind(ViewModel, x => x.InstallSize, x => x.InstallSize.Text) + .DisposeWith(disposable); + this.OneWayBind(ViewModel, x => x.DownloadSize, x => x.DownloadSize.Text) .DisposeWith(disposable); }); } + + private void Hyperlink_OnRequestNavigate(object sender, RequestNavigateEventArgs e) + { + if (!(sender is Hyperlink hyperlink)) return; + if (!(hyperlink.DataContext is Archive archive)) return; + + var url = archive.State.GetManifestURL(archive); + if (string.IsNullOrWhiteSpace(url)) return; + + //url = url.Replace("&", "^&"); + Process.Start(new ProcessStartInfo("cmd", $"/c start {url}") {CreateNoWindow = true}); + + e.Handled = true; + } } } diff --git a/Wabbajack/Views/ManifestWindow.xaml b/Wabbajack/Views/ManifestWindow.xaml index 7bee5991..1e2f42e7 100644 --- a/Wabbajack/Views/ManifestWindow.xaml +++ b/Wabbajack/Views/ManifestWindow.xaml @@ -1,11 +1,22 @@ -<Window x:Class="Wabbajack.ManifestWindow" +<mah:MetroWindow x:Class="Wabbajack.ManifestWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Wabbajack" + xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" mc:Ignorable="d" - Title="ManifestWindow" Height="450" Width="800" d:DataContext="{d:DesignInstance local:ManifestWindow }"> + Title="Manifest" + Width="1280" + Height="960" + MinWidth="850" + MinHeight="650" + ResizeMode="CanResize" + TitleBarHeight="25" + UseLayoutRounding="True" + WindowTitleBrush="{StaticResource MahApps.Brushes.Accent}" + Style="{StaticResource {x:Type Window}}" + d:DataContext="{d:DesignInstance local:ManifestWindow }"> <Grid x:Name="Grid"> </Grid> -</Window> +</mah:MetroWindow> diff --git a/Wabbajack/Views/ManifestWindow.xaml.cs b/Wabbajack/Views/ManifestWindow.xaml.cs index 62331461..532754c6 100644 --- a/Wabbajack/Views/ManifestWindow.xaml.cs +++ b/Wabbajack/Views/ManifestWindow.xaml.cs @@ -9,8 +9,14 @@ namespace Wabbajack public ManifestWindow(ModList modlist) { Modlist = modlist; + InitializeComponent(); - Grid.Children.Add(new ManifestView(Modlist)); + + var manifestView = new ManifestView(Modlist); + + Grid.Children.Add(manifestView); + + Title = $"{Modlist.Name} by {Modlist.Author}"; } } }