Skip to content

Commit

Permalink
Mods are now "loaded"
Browse files Browse the repository at this point in the history
mods page has stuff in it now
  • Loading branch information
TrinityDevelopers committed Apr 23, 2020
1 parent 26f11cc commit a2a0900
Show file tree
Hide file tree
Showing 16 changed files with 407 additions and 65 deletions.
2 changes: 2 additions & 0 deletions ZenovaLauncher/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,13 @@ public void AppStart(object sender, StartupEventArgs e)
ProfileManager.instance = new ProfileManager(DataDirectory);
ProfileLauncher.instance = new ProfileLauncher();
AccountManager.instance = new AccountManager();
ModManager.instance = new ModManager(ModsDirectory);
Task loadTask = Task.Run(async () =>
{
await AccountManager.instance.AddAccounts();
await VersionManager.instance.LoadMinecraftVersions();
ProfileManager.instance.AddProfiles();
ModManager.instance.LoadMods();
Preferences.LoadPreferences(DataDirectory);
VersionManager.instance.RemoveUnusedVersions();
});
Expand Down
37 changes: 37 additions & 0 deletions ZenovaLauncher/Mods/Mod.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using Newtonsoft.Json;
using System;

namespace ZenovaLauncher
{
public class Mod
{
public string NameId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public Version Version { get; set; }
public string MinVersion
{
get { return MinMCVersion.InternalName; }
set { MinMCVersion = VersionManager.instance.GetVersionFromString(value); }
}
public string MaxVersion
{
get { return MaxMCVersion.InternalName; }
set { MaxMCVersion = VersionManager.instance.GetVersionFromString(value); }
}
[JsonIgnore]
public string ModDirectory { get; set; }
[JsonIgnore]
public MinecraftVersion MinMCVersion { get; set; }
[JsonIgnore]
public MinecraftVersion MaxMCVersion { get; set; }
[JsonIgnore]
public Version LatestSupported => MaxMCVersion.Version;

public enum ModSortType
{
ByLatestSupported,
ByName
}
}
}
54 changes: 54 additions & 0 deletions ZenovaLauncher/Mods/ModManager.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Windows;

namespace ZenovaLauncher
{
public class ModManager : ObservableCollection<Mod>
{
public static ModManager instance;
private static JsonSerializerSettings jsonSettings;

private readonly string _modsFileName = "modinfo.json";

public string ModsDirectory { get; set; }

public ModManager(string modsDir)
{
ModsDirectory = modsDir;
}

public Mod GetModFromDirectory(string dir)
{
return this.FirstOrDefault(m => m.ModDirectory == dir);
}

public void LoadMods()
{
jsonSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() };
foreach (string dir in Directory.GetDirectories(ModsDirectory))
{
try
{
if (File.Exists(Path.Combine(dir, _modsFileName)))
{
Mod mod = JsonConvert.DeserializeObject<Mod>(File.ReadAllText(Path.Combine(dir, _modsFileName)), jsonSettings);
mod.ModDirectory = dir;
Add(mod);
}
}
catch (Exception e)
{
Trace.WriteLine("Mods JSON Deserialize Failed: " + e.ToString());
MessageBox.Show("Mods JSON Deserialize Failed: " + e.ToString());
}
}
}

}
}
175 changes: 172 additions & 3 deletions ZenovaLauncher/Pages/ModsPage.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,178 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:ZenovaLauncher"
xmlns:ui="http://schemas.modernwpf.com/2019"
mc:Ignorable="d">
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:comment="Comments"
mc:Ignorable="d comment">

<Grid>
<TextBlock Text="Mods Page goes here." />
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ui:ScrollViewerEx
Grid.Row="0"
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Auto"
IsDeferredScrollingEnabled="False">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Grid.Row="0" MaxWidth="900" Margin="15,10,15,12" HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ui:SimpleStackPanel Grid.Column="0" Orientation="Horizontal" Spacing="15">
<Button x:Name="ImportModButton" Click="ImportModClick">
<Button.Content>
<ui:SimpleStackPanel Orientation="Horizontal" Spacing="8" Margin="3">
<ui:SymbolIcon VerticalAlignment="Center" Symbol="Add" />
<TextBlock VerticalAlignment="Center" Text="Import..." />
</ui:SimpleStackPanel>
</Button.Content>
</Button>
<Grid Width="1" HorizontalAlignment="Right" Margin="0,8,0,8" SnapsToDevicePixels="True" Background="{DynamicResource AppBarSeparatorForeground}" />
</ui:SimpleStackPanel>
<ui:SimpleStackPanel Grid.Column="2" Orientation="Horizontal">
<Grid Width="1" HorizontalAlignment="Left" Margin="0,8,0,8" SnapsToDevicePixels="True" Background="{DynamicResource AppBarSeparatorForeground}" />
<ui:SimpleStackPanel Margin="17,0,10,0">
<TextBlock Margin="0,-8,0,0" FontSize="15" FontWeight="SemiBold" Typography.Capitals="AllSmallCaps" Text="Sort By" />
<ComboBox
x:Name="SortModsBox"
Style="{DynamicResource StandardComboBoxStyle}"
SelectedIndex="{Binding Path=ModSortingId}"
MinWidth="155"
HorizontalContentAlignment="Left"
Background="Transparent"
BorderThickness="0"
Padding="6,4,0,4"
Margin="-6,0,0,0"
SelectionChanged="SortChanged">
<ComboBoxItem Content="Supported version" />
<ComboBoxItem Content="Name" />
</ComboBox>
</ui:SimpleStackPanel>
</ui:SimpleStackPanel>
</Grid>
<Separator Grid.Row="0" VerticalAlignment="Bottom" Background="{DynamicResource AppBarSeparatorLowForeground}" />
<Grid Grid.Row="1" HorizontalAlignment="Stretch">
<ListBox
x:Name="ModsListBox"
Style="{DynamicResource ProfileListBoxStyle}"
Background="Transparent">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem" BasedOn="{StaticResource ProfileListBoxItemStyle}">
<EventSetter Event="PreviewGotKeyboardFocus" Handler="SelectCurrentItem" />
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid MouseLeftButtonUp="ModSelected">
<Rectangle MaxWidth="900" Fill="Transparent" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
<Separator x:Name="Separator" MaxWidth="900" VerticalAlignment="Top" Margin="15,0,15,0" Background="{DynamicResource AppBarSeparatorLowForeground}" />
<Grid MaxWidth="900" Margin="15,10,15,12" HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ui:SimpleStackPanel Grid.Column="0" HorizontalAlignment="Left" Orientation="Horizontal">
<ui:SimpleStackPanel>
<TextBlock FontWeight="Bold" FontSize="16" Text="{Binding Name}" />
<TextBlock FontSize="12" Text="{Binding Description}" />
</ui:SimpleStackPanel>
</ui:SimpleStackPanel>
<ui:SimpleStackPanel x:Name="InteractButtons" Grid.Column="2" HorizontalAlignment="Right" Orientation="Horizontal" Spacing="8" Visibility="Hidden">
<Button Padding="5,5,6,6" Style="{DynamicResource LauncherDefaultButtonStyle}">
<Button.Content>
<ui:SymbolIcon Symbol="More" />
</Button.Content>
<ui:FlyoutService.Flyout>
<ui:MenuFlyout Placement="BottomEdgeAlignedRight" >
<MenuItem Click="ModDetailsClick" Header="Details" />
<MenuItem Click="DeleteModClick" Header="Delete"/>
</ui:MenuFlyout>
</ui:FlyoutService.Flyout>
</Button>
</ui:SimpleStackPanel>
</Grid>
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsMouseOver}" Value="True">
<Setter TargetName="InteractButtons" Property="Visibility" Value="Visible" />
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected}" Value="True">
<Setter TargetName="InteractButtons" Property="Visibility" Value="Visible" />
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource PreviousData}}" Value="{x:Null}">
<Setter Property="Visibility" TargetName="Separator" Value="Collapsed"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Grid>
</ui:ScrollViewerEx>
<Grid
x:Name="ProgressGrid"
Grid.Row="1"
HorizontalAlignment="Stretch"
Background="{DynamicResource LauncherControlPageBackgroundChromeMediumBrush}"
Visibility="{Binding Path=IsLaunching, Converter={StaticResource BooleanToVisibilityConverter}}">
<Grid.RenderTransform>
<TranslateTransform />
</Grid.RenderTransform>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:Interaction.Behaviors>
<ei:ConditionBehavior>
<ei:ConditionalExpression>
<ei:ComparisonCondition LeftOperand="{Binding Path=IsLaunching}" RightOperand="True"/>
</ei:ConditionalExpression>
</ei:ConditionBehavior>
</i:Interaction.Behaviors>
<ei:ControlStoryboardAction ControlStoryboardOption="Play">
<ei:ControlStoryboardAction.Storyboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="ProgressGrid" Storyboard.TargetProperty="RenderTransform.Y" From="20" To="0" Duration="0:0:0.2" />
<DoubleAnimation Storyboard.TargetName="ProgressGrid" Storyboard.TargetProperty="Opacity" From="0.0" To="1.0" Duration="0:0:0.2" />
</Storyboard>
</ei:ControlStoryboardAction.Storyboard>
</ei:ControlStoryboardAction>
</i:EventTrigger>
<ei:DataTrigger Binding="{Binding Path=IsLaunching}" Value="True">
<ei:ControlStoryboardAction ControlStoryboardOption="Play">
<ei:ControlStoryboardAction.Storyboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="ProgressGrid" Storyboard.TargetProperty="RenderTransform.Y" From="20" To="0" Duration="0:0:0.2" />
<DoubleAnimation Storyboard.TargetName="ProgressGrid" Storyboard.TargetProperty="Opacity" From="0.0" To="1.0" Duration="0:0:0.2" />
</Storyboard>
</ei:ControlStoryboardAction.Storyboard>
</ei:ControlStoryboardAction>
</ei:DataTrigger>
</i:Interaction.Triggers>
<ProgressBar
Margin="10,9,10,9"
MinHeight="32"
HorizontalAlignment="Stretch"
ui:ControlHelper.CornerRadius="0"
Background="{DynamicResource LauncherControlTransientLowBackgroundBrush}"
Minimum="0"
Maximum="{Binding LaunchInfo.ProgressMax, Mode=OneWay}"
local:ProgressBarSmoother.AnimateTime="{Binding LaunchInfo.AnimateTime, Mode=OneWay}"
local:ProgressBarSmoother.SmoothValue="{Binding LaunchInfo.ProgressCurrent, Mode=OneWay}"
IsIndeterminate="{Binding LaunchInfo.IsProgressIndeterminate}" />
<TextBlock
Margin="25,0,0,0"
VerticalAlignment="Center"
Text="{Binding LaunchInfo.DisplayStatus}"
FontSize="12" />
</Grid>
</Grid>
</Page>
</Page>
54 changes: 53 additions & 1 deletion ZenovaLauncher/Pages/ModsPage.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
using System.Windows.Controls;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace ZenovaLauncher
{
Expand All @@ -10,6 +13,55 @@ public partial class ModsPage : Page
public ModsPage()
{
InitializeComponent();

DataContext = ProfileLauncher.instance;
ModsListBox.ItemsSource = ModManager.instance;
SortModsBox.DataContext = Preferences.instance;

SortModList(Preferences.instance.ModSorting);
}

private void SelectCurrentItem(object sender, KeyboardFocusChangedEventArgs e)
{
ListBoxItem item = (ListBoxItem)sender;
item.IsSelected = true;
}

private void ImportModClick(object sender, RoutedEventArgs e)
{

}

private void SortChanged(object sender, SelectionChangedEventArgs e)
{
SortModList(Preferences.instance.ModSorting);
}

private void ModSelected(object sender, MouseButtonEventArgs e)
{

}

private void ModDetailsClick(object sender, RoutedEventArgs e)
{

}

private void DeleteModClick(object sender, RoutedEventArgs e)
{

}

protected void SortModList(Mod.ModSortType sortType)
{
string sortTypeString = sortType == Mod.ModSortType.ByLatestSupported ? "LatestSupported" : "Name";
ListSortDirection sortDirection = sortType == Mod.ModSortType.ByLatestSupported ? ListSortDirection.Descending : ListSortDirection.Ascending;
if (ModsListBox != null)
{
ModsListBox.Items.SortDescriptions.Clear();
SortDescription sd = new SortDescription(sortTypeString, sortDirection);
ModsListBox.Items.SortDescriptions.Add(sd);
}
}
}
}
6 changes: 3 additions & 3 deletions ZenovaLauncher/Pages/ProfilesPage.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ui:SimpleStackPanel Grid.Column="0" Orientation="Horizontal">
<Button x:Name="AddProfileButton" Margin="0,0,15,0" Click="AddProfileClick">
<ui:SimpleStackPanel Grid.Column="0" Orientation="Horizontal" Spacing="15">
<Button x:Name="AddProfileButton" Click="AddProfileClick">
<Button.Content>
<ui:SimpleStackPanel Orientation="Horizontal" Spacing="8" Margin="3">
<ui:SymbolIcon VerticalAlignment="Center" Symbol="Add" />
Expand Down Expand Up @@ -221,4 +221,4 @@
FontSize="12" />
</Grid>
</Grid>
</Page>
</Page>
2 changes: 1 addition & 1 deletion ZenovaLauncher/Pages/ProfilesPage.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ public partial class ProfilesPage : Page
public ProfilesPage()
{
InitializeComponent();

DataContext = ProfileLauncher.instance;
ProfileListBox.ItemsSource = ProfileManager.instance;
SortProfileBox.DataContext = Preferences.instance;
ReleasesBox.DataContext = Preferences.instance;
BetasBox.DataContext = Preferences.instance;
HistoricalBox.DataContext = Preferences.instance;
ProgressGrid.ToString();

SortProfileList(Preferences.instance.ProfileSorting);
FilterProfileList();
Expand Down
Loading

0 comments on commit a2a0900

Please sign in to comment.