1
0

feat: Do must works of ui

This commit is contained in:
Ca2didi 2025-03-30 17:56:20 +08:00
parent 3b4ecefb08
commit d2041ea5e4
19 changed files with 267 additions and 15 deletions

View File

@ -13,7 +13,14 @@
<entry key="Flawless.Client/Views/MainView.axaml" value="Flawless.Client/Flawless.Client.csproj" />
<entry key="Flawless.Client/Views/MainWindow.axaml" value="Flawless.Client/Flawless.Client.csproj" />
<entry key="Flawless.Client/Views/MainWindowView.axaml" value="Flawless.Client/Flawless.Client.csproj" />
<entry key="Flawless.Client/Views/RegisterPageView.axaml" value="Flawless.Client/Flawless.Client.csproj" />
<entry key="Flawless.Client/Views/RegisterView.axaml" value="Flawless.Client/Flawless.Client.csproj" />
<entry key="Flawless.Client/Views/RepositoryPage/RepoCommitPageView.axaml" value="Flawless.Client/Flawless.Client.csproj" />
<entry key="Flawless.Client/Views/RepositoryPage/RepoFileTreePageView.axaml" value="Flawless.Client/Flawless.Client.csproj" />
<entry key="Flawless.Client/Views/RepositoryPage/RepoIssuePageView.axaml" value="Flawless.Client/Flawless.Client.csproj" />
<entry key="Flawless.Client/Views/RepositoryPage/RepoSettingPageView.axaml" value="Flawless.Client/Flawless.Client.csproj" />
<entry key="Flawless.Client/Views/RepositoryPage/RepoWorkspacePageView.axaml" value="Flawless.Client/Flawless.Client.csproj" />
<entry key="Flawless.Client/Views/RepositoryPage/RepositoryDashboardPageView.axaml" value="Flawless.Client/Flawless.Client.csproj" />
<entry key="Flawless.Client/Views/RepositoryView.axaml" value="Flawless.Client/Flawless.Client.csproj" />
<entry key="Flawless.Client/Views/ServerConnectView.axaml" value="Flawless.Client/Flawless.Client.csproj" />
<entry key="Flawless.Client/Views/ServerConnectionView.axaml" value="Flawless.Client/Flawless.Client.csproj" />

View File

@ -14,6 +14,7 @@
<ItemGroup>
<PackageReference Include="Avalonia" Version="11.2.1" />
<PackageReference Include="Avalonia.Controls.TreeDataGrid" Version="11.1.1" />
<PackageReference Include="Avalonia.Desktop" Version="11.2.1" />
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.2.1" />
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
@ -25,6 +26,7 @@
<PackageReference Include="Irihi.Ursa" Version="1.10.0" />
<PackageReference Include="Irihi.Ursa.ReactiveUIExtension" Version="1.0.1" />
<PackageReference Include="Irihi.Ursa.Themes.Semi" Version="1.10.0" />
<PackageReference Include="Markdown.Avalonia" Version="11.0.2" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.3" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.3" />
<PackageReference Include="ReactiveUI.SourceGenerators" Version="2.1.27">

View File

@ -10,6 +10,7 @@ public record RepositoryHomePageModel(
string Description,
bool IsArchived,
bool IsOwner,
bool IsLocalAvailable,
string LatestCommitId)
{
public string FullName { get; } = $"{OwnerName}/{Name}";
@ -22,6 +23,7 @@ public record RepositoryHomePageModel(
r.Description ?? String.Empty,
r.IsArchived,
r.Role == RepositoryRole.Owner,
true,
r.LatestCommitId.ToString().Substring(0, 6));
}
}

View File

@ -22,7 +22,9 @@ public partial class HomeViewModel : ViewModelBase, IRoutableViewModel
public ObservableCollection<RepositoryHomePageModel> Repositories { get; } = new(new[]
{
new RepositoryHomePageModel(
"cardidi", "test1", "Abc", false, true, ""),
"cardidi", "test1", "Abc", false, true, false, ""),
new RepositoryHomePageModel(
"cardidi", "RT001", "Abc", false, true, true, ""),
});
[Reactive] private RepositoryHomePageModel? _selectedRepository;

View File

@ -10,11 +10,18 @@
x:Class="Flawless.Client.Views.HomeView">
<DockPanel Margin="50">
<StackPanel DockPanel.Dock="Top">
<Label Content="{Binding ServerFriendlyName, StringFormat='Server {0}'}" FontSize="18" FontWeight="400"></Label>
<Grid RowDefinitions="Auto, 18, Auto" ColumnDefinitions="*, Auto" DockPanel.Dock="Top">
<StackPanel Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2">
<Label Content="{Binding ServerFriendlyName, StringFormat='Server {0}', FallbackValue='Server LocalTest'}" FontSize="18" FontWeight="400"></Label>
<Label Content="Repositories" FontSize="32" FontWeight="600"></Label>
<Rectangle Height="18"/>
</StackPanel>
<StackPanel Grid.Row="0" Grid.Column="1" VerticalAlignment="Center">
<StackPanel Orientation="Horizontal" Spacing="8">
<u:IconButton Icon="{StaticResource SemiIconSetting}" Content="Settings"></u:IconButton>
<u:IconButton Classes="Danger" Icon="{StaticResource SemiIconQuit}" Content="Quit"></u:IconButton>
</StackPanel>
</StackPanel>
<StackPanel Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Orientation="Horizontal" Spacing="8">
<u:IconButton Icon="{StaticResource SemiIconRefresh}" Content="Refresh"
Command="{Binding RefreshRepositoriesCommand}"/>
<u:IconButton Icon="{StaticResource SemiIconPlus}" Content="Create"
@ -23,13 +30,16 @@
<StackPanel Orientation="Horizontal" Spacing="8">
<u:IconButton Icon="{StaticResource SemiIconFolderOpen}" Content="Open"
Command="{Binding OpenRepositoryCommand}"/>
<u:IconButton Icon="{StaticResource SemiIconDownload}" Content="Download"
IsEnabled="{Binding !SelectedRepository.IsLocalAvailable}"
Command="{Binding OpenRepositoryCommand}"/>
<u:IconButton Classes="Danger" Icon="{StaticResource SemiIconDelete}" Content="Delete"
IsEnabled="{Binding SelectedRepository.IsOwner}"
IsEnabled="{Binding SelectedRepository.IsLocalAvailable}"
Command="{Binding DeleteRepositoryCommand}"/>
</StackPanel>
</u:DisableContainer>
</StackPanel>
</StackPanel>
</Grid>
<Rectangle DockPanel.Dock="Top" Height="20"/>
<Grid ColumnDefinitions="*, 10, *" VerticalAlignment="Stretch">
<ScrollViewer Grid.Column="0" VerticalScrollBarVisibility="Auto" AllowAutoHide="True">
@ -38,7 +48,13 @@
Margin="0, 0, 8, 0">
<u:SelectionList.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Spacing="6" Margin="6 0">
<PathIcon MaxHeight="16" MaxWidth="16" Data="{StaticResource SemiIconDownload}"
IsVisible="{Binding !IsLocalAvailable}"/>
<PathIcon MaxHeight="16" MaxWidth="16" Data="{StaticResource SemiIconFolder}"
IsVisible="{Binding IsLocalAvailable}"/>
<TextBlock Margin="0, 12" VerticalAlignment="Center" Text="{Binding FullName, Mode=OneWay}"/>
</StackPanel>
</DataTemplate>
</u:SelectionList.ItemTemplate>
</u:SelectionList>
@ -47,7 +63,6 @@
<StackPanel VerticalAlignment="Stretch" Spacing="20">
<Label FontWeight="400" FontSize="24"
Content="{Binding SelectedRepository.Name, FallbackValue='Select a Repository'}"/>
<StackPanel Spacing="10" IsVisible="{Binding SelectedRepository, Converter={x:Static ObjectConverters.IsNotNull}}">
<StackPanel IsVisible="{Binding SelectedRepository.IsArchived, FallbackValue=False}"
Orientation="Horizontal" Spacing="6" VerticalAlignment="Center">
@ -63,7 +78,10 @@
<Label Content="{Binding SelectedRepository.LatestCommitId, FallbackValue='No Commit'}"/>
</StackPanel>
<ScrollViewer IsVisible="{Binding SelectedRepository}">
<StackPanel Orientation="Vertical" Spacing="8">
<Label Content="{Binding SelectedRepository.Description, FallbackValue='Description as below.'}"/>
<u:Divider Content="Recent Activities"/>
</StackPanel>
</ScrollViewer>
</StackPanel>
</StackPanel>

View File

@ -0,0 +1,18 @@
<UserControl xmlns="https://github.com/avaloniaui"
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"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Flawless.Client.Views.RepositoryPage.RepoCommitPageView">
<Grid ColumnDefinitions="2*, *">
<TreeDataGrid Grid.Column="0">
</TreeDataGrid>
<Border Grid.Column="1" Classes="Shadow" Theme="{StaticResource CardBorder}">
<ScrollViewer>
<StackPanel Spacing="4">
<Label Content="Commit Message"/>
</StackPanel>
</ScrollViewer>
</Border>
</Grid>
</UserControl>

View File

@ -0,0 +1,13 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace Flawless.Client.Views.RepositoryPage;
public partial class RepoCommitPageView : UserControl
{
public RepoCommitPageView()
{
InitializeComponent();
}
}

View File

@ -0,0 +1,29 @@
<UserControl xmlns="https://github.com/avaloniaui"
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:u="https://irihi.tech/ursa"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Flawless.Client.Views.RepositoryPage.RepoDashboardPageView">
<Grid ColumnDefinitions="2*, *">
<Border Grid.Column="0" Classes="Shadow" Theme="{StaticResource CardBorder}">
<StackPanel>
<Label Content="No Readme File Existed"/>
<!-- <md:MarkdownScrollViewer Markdown="## Hello World!!"/> -->
</StackPanel>
</Border>
<ScrollViewer Grid.Column="1" Margin="36 20">
<StackPanel Orientation="Vertical">
<u:Timeline
HorizontalAlignment="Left"
Mode="Left">
<u:TimelineItem Header="New Commit"/>
<u:TimelineItem/>
<u:TimelineItem/>
<u:TimelineItem/>
</u:Timeline>
</StackPanel>
</ScrollViewer>
</Grid>
</UserControl>

View File

@ -0,0 +1,13 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace Flawless.Client.Views.RepositoryPage;
public partial class RepoDashboardPageView : UserControl
{
public RepoDashboardPageView()
{
InitializeComponent();
}
}

View File

@ -0,0 +1,18 @@
<UserControl xmlns="https://github.com/avaloniaui"
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"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Flawless.Client.Views.RepositoryPage.RepoFileTreePageView">
<Grid ColumnDefinitions="2*, *">
<TreeDataGrid Grid.Column="0">
</TreeDataGrid>
<Border Grid.Column="1" Classes="Shadow" Theme="{StaticResource CardBorder}">
<ScrollViewer>
<StackPanel Spacing="4">
<Label Content="File History"/>
</StackPanel>
</ScrollViewer>
</Border>
</Grid>
</UserControl>

View File

@ -0,0 +1,13 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace Flawless.Client.Views.RepositoryPage;
public partial class RepoFileTreePageView : UserControl
{
public RepoFileTreePageView()
{
InitializeComponent();
}
}

View File

@ -0,0 +1,10 @@
<UserControl xmlns="https://github.com/avaloniaui"
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"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Flawless.Client.Views.RepositoryPage.RepoIssuePageView">
<StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
<Label Content="Sit down and wait patience."></Label>
</StackPanel>
</UserControl>

View File

@ -0,0 +1,13 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace Flawless.Client.Views.RepositoryPage;
public partial class RepoIssuePageView : UserControl
{
public RepoIssuePageView()
{
InitializeComponent();
}
}

View File

@ -0,0 +1,10 @@
<UserControl xmlns="https://github.com/avaloniaui"
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"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Flawless.Client.Views.RepositoryPage.RepoSettingPageView">
<StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
<Label Content="Sit down and wait patience."></Label>
</StackPanel>
</UserControl>

View File

@ -0,0 +1,13 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace Flawless.Client.Views.RepositoryPage;
public partial class RepoSettingPageView : UserControl
{
public RepoSettingPageView()
{
InitializeComponent();
}
}

View File

@ -0,0 +1,50 @@
<UserControl xmlns="https://github.com/avaloniaui"
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"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Flawless.Client.Views.RepositoryPage.RepoWorkspacePageView">
<DockPanel>
<StackPanel DockPanel.Dock="Bottom" Spacing="6" Margin="8">
<StackPanel Orientation="Horizontal">
<Label Content="Commit Message"/>
</StackPanel>
<TextBox Height="80"/>
<StackPanel HorizontalAlignment="Left" Orientation="Horizontal">
</StackPanel>
<Grid ColumnDefinitions="Auto, *, Auto">
<StackPanel Grid.Column="0" Orientation="Horizontal" HorizontalAlignment="Left">
<Button Content="Sync"></Button>
</StackPanel>
<StackPanel Grid.Column="2" Orientation="Horizontal" HorizontalAlignment="Right" Spacing="8">
<SplitButton Content="Commit">
<SplitButton.Flyout>
<MenuFlyout Placement="Top">
<MenuItem Header="Lock"/>
</MenuFlyout>
</SplitButton.Flyout>
</SplitButton>
</StackPanel>
</Grid>
</StackPanel>
<Border Classes="Shadow" Theme="{StaticResource CardBorder}">
<Grid ColumnDefinitions="*, 8, *">
<StackPanel Grid.Column="0" Orientation="Vertical" Spacing="8">
<Grid RowDefinitions="Auto, Auto">
<Label Grid.Row="0" FontSize="12" Content="Changes" HorizontalAlignment="Left"/>
<TreeDataGrid Grid.Row="1">
</TreeDataGrid>
</Grid>
</StackPanel>
<StackPanel Grid.Column="2" Orientation="Vertical" Spacing="8">
<Grid RowDefinitions="Auto, Auto">
<Label Grid.Row="0" FontSize="12" Content="Ready" HorizontalAlignment="Right"/>
<TreeDataGrid Grid.Row="1">
</TreeDataGrid>
</Grid>
</StackPanel>
</Grid>
</Border>
</DockPanel>
</UserControl>

View File

@ -0,0 +1,13 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
namespace Flawless.Client.Views.RepositoryPage;
public partial class RepoWorkspacePageView : UserControl
{
public RepoWorkspacePageView()
{
InitializeComponent();
}
}

View File

@ -5,11 +5,13 @@
xmlns:u="https://irihi.tech/ursa"
xmlns:semi="https://irihi.tech/semi"
xmlns:vm="using:Flawless.Client.ViewModels"
xmlns:page="using:Flawless.Client.Views.RepositoryPage"
mc:Ignorable="d" d:DesignWidth="1280" d:DesignHeight="768"
x:Class="Flawless.Client.Views.RepositoryView">
<DockPanel Margin="50">
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Spacing="20">
<u:IconButton Icon="{StaticResource SemiIconArrowLeft}" Content="All Repositories"/>
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal" VerticalAlignment="Center" Spacing="20">
<u:IconButton Height="4" Icon="{StaticResource SemiIconArrowLeft}" Content="All Repositories"/>
<Label FontWeight="400" FontSize="28" Content="Name of Repository"/>
</StackPanel>
<TabControl TabStripPlacement="Top" Margin="0 20">
@ -20,6 +22,7 @@
<Label Content="Dashboard"/>
</StackPanel>
</TabItem.Header>
<page:RepoDashboardPageView Margin="18" DataContext="{Binding $self}"/>
</TabItem>
<TabItem>
<TabItem.Header>
@ -28,6 +31,7 @@
<Label Content="Workspace"/>
</StackPanel>
</TabItem.Header>
<page:RepoWorkspacePageView Margin="18" DataContext="{Binding $self}"/>
</TabItem>
<TabItem>
<TabItem.Header>
@ -36,6 +40,7 @@
<Label Content="File Tree"/>
</StackPanel>
</TabItem.Header>
<page:RepoFileTreePageView Margin="18" DataContext="{Binding $self}"/>
</TabItem>
<TabItem>
<TabItem.Header>
@ -44,6 +49,7 @@
<Label Content="Commit"/>
</StackPanel>
</TabItem.Header>
<page:RepoCommitPageView Margin="18" DataContext="{Binding $self}"/>
</TabItem>
<TabItem>
<TabItem.Header>
@ -52,6 +58,7 @@
<Label Content="Issue"/>
</StackPanel>
</TabItem.Header>
<page:RepoIssuePageView Margin="18" DataContext="{Binding $self}"/>
</TabItem>
<TabItem>
<TabItem.Header>
@ -60,6 +67,7 @@
<Label Content="Setting"/>
</StackPanel>
</TabItem.Header>
<page:RepoSettingPageView Margin="18" DataContext="{Binding $self}"/>
</TabItem>
</TabControl>
</DockPanel>

View File

@ -10,7 +10,7 @@
<DockPanel Margin="50">
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Spacing="20">
<u:IconButton Icon="{StaticResource SemiIconArrowLeft}" Content="Back"/>
<u:IconButton Height="4" Icon="{StaticResource SemiIconArrowLeft}" Content="Back"/>
<Label FontWeight="400" FontSize="28" Content="Settings"/>
</StackPanel>
<TabControl TabStripPlacement="Left" Margin="0 20">