🚧 Basic Menu, Login/Out context Switching added

This commit is contained in:
GalaxyLittlepaws
2024-04-08 19:04:39 -04:00
parent 222ee1d7d1
commit e79fd48efc
13 changed files with 282 additions and 14 deletions
+1 -1
View File
@@ -2,7 +2,7 @@ root = true
[*]
indent_style = space
indent_size = 2
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
+4 -1
View File
@@ -1,6 +1,9 @@
<Project>
<PropertyGroup>
<Version>0.1.0</Version>
<Product>GalaxyViewer</Product>
<Authors>Galaxy Littlepaws</Authors>
<Nullable>enable</Nullable>
<AvaloniaVersion>11.0.10</AvaloniaVersion>
</PropertyGroup>
</Project>
</Project>
+4 -4
View File
@@ -9,10 +9,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GalaxyViewer.Desktop", "Gal
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GalaxyViewer.Browser", "GalaxyViewer.Browser\GalaxyViewer.Browser.csproj", "{1C1A049E-235C-4CD0-B6FA-D53AC418F4DA}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GalaxyViewer.iOS", "GalaxyViewer.iOS\GalaxyViewer.iOS.csproj", "{EBD9022F-BC83-4846-9A11-6F7F3772DC64}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GalaxyViewer.Android", "GalaxyViewer.Android\GalaxyViewer.Android.csproj", "{7AD1DAC8-7FBE-49D5-8614-7321233DB82E}"
EndProject
# Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GalaxyViewer.iOS", "GalaxyViewer.iOS\GalaxyViewer.iOS.csproj", "{EBD9022F-BC83-4846-9A11-6F7F3772DC64}"
# EndProject
# Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GalaxyViewer.Android", "GalaxyViewer.Android\GalaxyViewer.Android.csproj", "{7AD1DAC8-7FBE-49D5-8614-7321233DB82E}"
# EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{3DA99C4E-89E3-4049-9C22-0A7EC60D83D8}"
ProjectSection(SolutionItems) = preProject
Directory.Build.props = Directory.Build.props
+57
View File
@@ -0,0 +1,57 @@
<llsd>
<array>
<!-- Second Life -->
<map>
<key>gridnick</key>
<string>agni</string>
<key>gridname</key>
<string>Second Life (agni)</string>
<key>platform</key>
<string>SecondLife</string>
<key>loginuri</key>
<string>https://login.agni.lindenlab.com/cgi-bin/login.cgi</string>
<key>loginpage</key>
<string>http://secondlife.com/app/login/?channel=Second+Life+Release</string>
<key>helperuri</key>
<string>https://secondlife.com/helpers/</string>
<key>website</key>
<string>http://secondlife.com/</string>
<key>support</key>
<string>http://secondlife.com/support/</string>
<key>register</key>
<string>http://secondlife.com/registration/</string>
<key>password</key>
<string>http://secondlife.com/account/request.php</string>
<key>version</key>
<string>0</string>
</map>
<!-- Second Life Beta -->
<map>
<key>gridnick</key>
<string>aditi</string>
<key>gridname</key>
<string>Second Life Beta (aditi)</string>
<key>platform</key>
<string>SecondLife</string>
<key>loginuri</key>
<string>https://login.aditi.lindenlab.com/cgi-bin/login.cgi</string>
<key>loginpage</key>
<string>http://secondlife.com/app/login/?channel=Second+Life+Beta</string>
<key>helperuri</key>
<string>http://aditi-secondlife.webdev.lindenlab.com/helpers/</string>
<key>website</key>
<string>http://secondlife.com/</string>
<key>support</key>
<string>http://secondlife.com/support/</string>
<key>register</key>
<string>http://secondlife.com/registration/</string>
<key>password</key>
<string>http://secondlife.com/account/request.php</string>
<key>version</key>
<string>1</string>
</map>
</array>
</llsd>
+2 -1
View File
@@ -5,7 +5,7 @@
<LangVersion>latest</LangVersion>
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
</PropertyGroup>
<ItemGroup>
<AvaloniaResource Include="Assets\**" />
</ItemGroup>
@@ -17,5 +17,6 @@
<PackageReference Include="Avalonia.ReactiveUI" Version="$(AvaloniaVersion)" />
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="$(AvaloniaVersion)" />
<!-- More things will go here -->
</ItemGroup>
</Project>
+34
View File
@@ -0,0 +1,34 @@
using System;
namespace GalaxyViewer.Models
{
public class Grid
{
public string GridNick { get; set; }
public string GridName { get; set; }
public string Platform { get; set; }
public string LoginUri { get; set; }
public string LoginPage { get; set; }
public string HelperUri { get; set; }
public string Website { get; set; }
public string Support { get; set; }
public string Register { get; set; }
public string Password { get; set; }
public string Version { get; set; }
public Grid(string gridNick, string gridName, string platform, string loginUri, string loginPage, string helperUri, string website, string support, string register, string password, string version)
{
GridNick = !string.IsNullOrEmpty(gridNick) ? gridNick : throw new ArgumentNullException(nameof(gridNick));
GridName = !string.IsNullOrEmpty(gridName) ? gridName : throw new ArgumentNullException(nameof(gridName));
Platform = !string.IsNullOrEmpty(platform) ? platform : throw new ArgumentNullException(nameof(platform));
LoginUri = !string.IsNullOrEmpty(loginUri) ? loginUri : throw new ArgumentNullException(nameof(loginUri));
LoginPage = !string.IsNullOrEmpty(loginPage) ? loginPage : throw new ArgumentNullException(nameof(loginPage));
HelperUri = !string.IsNullOrEmpty(helperUri) ? helperUri : throw new ArgumentNullException(nameof(helperUri));
Website = !string.IsNullOrEmpty(website) ? website : throw new ArgumentNullException(nameof(website));
Support = !string.IsNullOrEmpty(support) ? support : throw new ArgumentNullException(nameof(support));
Register = !string.IsNullOrEmpty(register) ? register : throw new ArgumentNullException(nameof(register));
Password = !string.IsNullOrEmpty(password) ? password : throw new ArgumentNullException(nameof(password));
Version = !string.IsNullOrEmpty(version) ? version : throw new ArgumentNullException(nameof(version));
}
}
}
+42
View File
@@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Linq;
using GalaxyViewer.Models;
namespace GalaxyViewer.Services
{
public class GridService
{
public List<Grid> ParseGridsFromXml()
{
string xmlFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Assets", "grids.xml");
var xdoc = XDocument.Load(xmlFilePath);
var grids = new List<Grid>();
if (xdoc.Root != null)
{
foreach (var gridElement in xdoc.Root.Elements("grid"))
{
var grid = new Grid(
gridElement.Element("gridnick")?.Value ?? string.Empty,
gridElement.Element("gridname")?.Value ?? string.Empty,
gridElement.Element("platform")?.Value ?? string.Empty,
gridElement.Element("loginuri")?.Value ?? string.Empty,
gridElement.Element("loginpage")?.Value ?? string.Empty,
gridElement.Element("helperuri")?.Value ?? string.Empty,
gridElement.Element("website")?.Value ?? string.Empty,
gridElement.Element("support")?.Value ?? string.Empty,
gridElement.Element("register")?.Value ?? string.Empty,
gridElement.Element("password")?.Value ?? string.Empty,
gridElement.Element("version")?.Value ?? string.Empty
);
grids.Add(grid);
}
}
return grids;
}
}
}
+42 -6
View File
@@ -1,8 +1,44 @@
namespace GalaxyViewer.ViewModels;
using Avalonia.Controls;
using GalaxyViewer.Views;
using ReactiveUI;
using System.Reactive;
public class MainViewModel : ViewModelBase
namespace GalaxyViewer.ViewModels
{
#pragma warning disable CA1822 // Mark members as static
public string Greeting => "Welcome to Avalonia!";
#pragma warning restore CA1822 // Mark members as static
}
public class MainViewModel : ViewModelBase
{
private UserControl? _currentView;
private bool _isLoggedIn;
public UserControl? CurrentView
{
get => _currentView;
set => this.RaiseAndSetIfChanged(ref _currentView, value);
}
public bool IsLoggedIn
{
get => _isLoggedIn;
set
{
this.RaiseAndSetIfChanged(ref _isLoggedIn, value);
CurrentView = value ? (UserControl)new LoggedInView() : new LoginView();
}
}
public ReactiveCommand<Unit, Unit> LogoutCommand { get; }
public MainViewModel()
{
_currentView = new LoginView();
IsLoggedIn = false; // Set this to true when the user logs in
LogoutCommand = ReactiveCommand.Create(Logout);
}
private void Logout()
{
IsLoggedIn = false;
}
}
}
+5
View File
@@ -0,0 +1,5 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="GalaxyViewer.Views.LoggedInView">
<TextBlock Text="Login Successful" HorizontalAlignment="Center" VerticalAlignment="Center" />
</UserControl>
+18
View File
@@ -0,0 +1,18 @@
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace GalaxyViewer.Views
{
public partial class LoggedInView : UserControl
{
public LoggedInView()
{
InitializeComponent();
}
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
}
}
+9
View File
@@ -0,0 +1,9 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="GalaxyViewer.Views.LoginView">
<StackPanel Margin="20">
<TextBox Name="UsernameBox" Watermark="Username" />
<TextBox Name="PasswordBox" Watermark="Password" PasswordChar="*" />
<Button Content="Login" Margin="0,10,0,0" Click="LoginButton_Click" />
</StackPanel>
</UserControl>
+24
View File
@@ -0,0 +1,24 @@
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace GalaxyViewer.Views
{
public partial class LoginView : UserControl
{
public LoginView()
{
InitializeComponent();
}
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
private void LoginButton_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
{
((ViewModels.MainViewModel)DataContext!).IsLoggedIn = true;
}
}
}
+40 -1
View File
@@ -12,5 +12,44 @@
<vm:MainViewModel />
</Design.DataContext>
<TextBlock Text="{Binding Greeting}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="File">
<MenuItem Header="New Window"/>
<Separator/>
<MenuItem Header="Upload Blinn-Phong Texture" IsEnabled="{Binding IsLoggedIn}"/>
<MenuItem Header="Upload PBR Material" IsEnabled="{Binding IsLoggedIn}"/>
<MenuItem Header="Upload Mesh" IsEnabled="{Binding IsLoggedIn}"/>
<MenuItem Header="Import Object" IsEnabled="{Binding IsLoggedIn}"/>
<MenuItem Header="Script Editor" IsEnabled="{Binding IsLoggedIn}"/>
<Separator/>
<MenuItem Header="Login"/>
<MenuItem Header="Logout" Command="{Binding LogoutCommand}" IsEnabled="{Binding IsLoggedIn}"/>
<MenuItem Header="Relog"/>
<MenuItem Header="Preferences"/>
<Separator/>
<MenuItem Header="Exit"/>
</MenuItem>
<MenuItem Header="World" IsEnabled="{Binding IsLoggedIn}">
<MenuItem Header="Create new Landmark Here"/>
<MenuItem Header="Set Home to Here"/>
<MenuItem Header="Teleport Home"/>
<MenuItem Header="About Land"/>
<MenuItem Header="About Region"/>
<MenuItem Header="World Map"/>
<MenuItem Header="Mini-Map"/>
<MenuItem Header="People Nearby"/>
</MenuItem>
<MenuItem Header="Community" IsEnabled="{Binding IsLoggedIn}">
<MenuItem Header="Friends"/>
<MenuItem Header="Groups"/>
<MenuItem Header="Events"/>
<MenuItem Header="Marketplace"/>
<MenuItem Header="Search"/>
</MenuItem>
<!-- Add more menu items as needed -->
</Menu>
<ContentControl Content="{Binding CurrentView}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</DockPanel>
</UserControl>