- tweak: Some view change

This commit is contained in:
2025-01-15 19:47:27 +03:00
parent 08e518602b
commit 5d7f443532
10 changed files with 143 additions and 64 deletions

View File

@@ -1,2 +1,2 @@
global using SourceGen; global using Nebula.Shared.Attributes;
global using Nebula.Launcher.ViewHelper; global using Nebula.Launcher.ViewHelper;

View File

@@ -110,7 +110,7 @@ public partial class ServerEntryModelView : ViewModelBase
Process.Exited += OnExited; Process.Exited += OnExited;
} }
catch (TaskCanceledException _) catch (TaskCanceledException)
{ {
PopupMessageService.Popup("Task canceled"); PopupMessageService.Popup("Task canceled");
} }

View File

@@ -65,8 +65,8 @@
Classes="ViewSelectButton" Classes="ViewSelectButton"
Command="{Binding TriggerPaneCommand}" Command="{Binding TriggerPaneCommand}"
Grid.Row="1" Grid.Row="1"
HorizontalAlignment="Left" HorizontalAlignment="Stretch"
Padding="15,0,15,0" Padding="5,0,5,0"
VerticalAlignment="Stretch"> VerticalAlignment="Stretch">
<Label HorizontalAlignment="Center" VerticalAlignment="Center">|||</Label> <Label HorizontalAlignment="Center" VerticalAlignment="Center">|||</Label>
</Button> </Button>

View File

@@ -15,7 +15,7 @@
<Grid <Grid
ColumnDefinitions="*,2*,40,40" ColumnDefinitions="*,2*,40,40"
Margin="10" Margin="5,5,5,0"
RowDefinitions="40,*"> RowDefinitions="40,*">
<Border <Border
BorderThickness="2,0,0,0" BorderThickness="2,0,0,0"

View File

@@ -18,9 +18,9 @@
<Grid <Grid
ColumnDefinitions="*" ColumnDefinitions="*"
Margin="5" Margin="5,0,5,5"
RowDefinitions="*,40"> RowDefinitions="*,40">
<ScrollViewer Margin="0,0,0,10" Padding="0,0,8,0"> <ScrollViewer Margin="0,0,0,10" Padding="0,0,10,0" Grid.RowSpan="2">
<ItemsControl <ItemsControl
Background="#00000000" Background="#00000000"
ItemsSource="{Binding ServerInfos}" ItemsSource="{Binding ServerInfos}"
@@ -33,6 +33,7 @@
RowDefinitions="30,*"> RowDefinitions="30,*">
<Border <Border
BorderThickness="2,0,0,0" BorderThickness="2,0,0,0"
CornerRadius="10,0,0,0"
Grid.Column="0" Grid.Column="0"
Grid.Row="0" Grid.Row="0"
Padding="10,0,0,0"> Padding="10,0,0,0">
@@ -42,7 +43,7 @@
</Border> </Border>
<Border <Border
BorderThickness="2,0,2,0" BorderThickness="2,0,2,0"
CornerRadius="0" CornerRadius="0,10,0,0"
Grid.Column="1" Grid.Column="1"
Grid.Row="0" Grid.Row="0"
Padding="5"> Padding="5">
@@ -166,10 +167,10 @@
</ScrollViewer> </ScrollViewer>
<Border <Border
BorderThickness="2,0,0,0" BorderThickness="2,2,2,0"
CornerRadius="10" CornerRadius="10"
Grid.Row="1"> Grid.Row="1">
<Grid ColumnDefinitions="*,40,40" RowDefinitions="*"> <Grid ColumnDefinitions="*,40,40" RowDefinitions="*" Margin="5,0,0,0">
<TextBox <TextBox
Margin="0" Margin="0"
Text="{Binding SearchText}" Text="{Binding SearchText}"

View File

@@ -0,0 +1,7 @@
namespace Nebula.Shared.Attributes
{
[AttributeUsage(AttributeTargets.Class)]
public class ConstructGeneratorAttribute : Attribute
{
}
}

View File

@@ -0,0 +1,7 @@
namespace Nebula.Shared.Attributes
{
[AttributeUsage(AttributeTargets.Property)]
public class GeneratePropertyAttribute : Attribute
{
}
}

View File

@@ -11,18 +11,15 @@ namespace Nebula.SourceGenerators;
[Generator] [Generator]
public class DependencyAutoGenerator : IIncrementalGenerator public class DependencyAutoGenerator : IIncrementalGenerator
{ {
private static readonly string ConstructGeneratorAttributeName = "ConstructGeneratorAttribute"; private static readonly string ConstructGeneratorAttributeName = "Nebula.Shared.Attributes.ConstructGeneratorAttribute";
private static readonly string GeneratePropertyAttributeName = "GeneratePropertyAttribute"; private static readonly string GeneratePropertyAttributeName = "Nebula.Shared.Attributes.GeneratePropertyAttribute";
public void Initialize(IncrementalGeneratorInitializationContext context) public void Initialize(IncrementalGeneratorInitializationContext context)
{ {
GenerateAttribute(ConstructGeneratorAttributeName, "Class", context);
GenerateAttribute(GeneratePropertyAttributeName, "Property", context);
var provider = context.SyntaxProvider var provider = context.SyntaxProvider
.CreateSyntaxProvider( .CreateSyntaxProvider(
(s, _) => s is ClassDeclarationSyntax, (s, _) => s is ClassDeclarationSyntax,
(ctx, _) => GetClassDeclarationForSourceGen(ctx)) (ctx, _) => SourceHelper.GetClassDeclarationForSourceGen(ctx,ConstructGeneratorAttributeName))
.Where(t => t.reportAttributeFound) .Where(t => t.reportAttributeFound)
.Select((t, _) => t.Item1); .Select((t, _) => t.Item1);
@@ -30,44 +27,6 @@ public class DependencyAutoGenerator : IIncrementalGenerator
(ctx, t) => GenerateCode(ctx, t.Left, t.Right)); (ctx, t) => GenerateCode(ctx, t.Left, t.Right));
} }
private static void GenerateAttribute(string attributeName, string usage,
IncrementalGeneratorInitializationContext context)
{
var attributeSourceCode = $@"// <auto-generated/>
namespace SourceGen
{{
[System.AttributeUsage(System.AttributeTargets.{usage})]
public class {attributeName} : System.Attribute
{{
}}
}}";
context.RegisterPostInitializationOutput(ctx => ctx.AddSource(
$"{attributeName}.g.cs",
SourceText.From(attributeSourceCode, Encoding.UTF8)));
}
private static (ClassDeclarationSyntax, bool reportAttributeFound) GetClassDeclarationForSourceGen(
GeneratorSyntaxContext context)
{
var classDeclarationSyntax = (ClassDeclarationSyntax)context.Node;
foreach (var attributeListSyntax in classDeclarationSyntax.AttributeLists)
foreach (var attributeSyntax in attributeListSyntax.Attributes)
{
if (context.SemanticModel.GetSymbolInfo(attributeSyntax).Symbol is not IMethodSymbol attributeSymbol)
continue;
var attributeName = attributeSymbol.ContainingType.ToDisplayString();
if (attributeName == $"SourceGen.{ConstructGeneratorAttributeName}")
return (classDeclarationSyntax, true);
}
return (classDeclarationSyntax, false);
}
private void GenerateCode(SourceProductionContext context, Compilation compilation, private void GenerateCode(SourceProductionContext context, Compilation compilation,
ImmutableArray<ClassDeclarationSyntax> classDeclarations) ImmutableArray<ClassDeclarationSyntax> classDeclarations)
{ {
@@ -118,15 +77,6 @@ partial class {className}
private static IEnumerable<IPropertySymbol> GetProperties(INamedTypeSymbol classSymbol) private static IEnumerable<IPropertySymbol> GetProperties(INamedTypeSymbol classSymbol)
{ {
return classSymbol.GetMembers().OfType<IPropertySymbol>().Where(a => return classSymbol.GetMembers().OfType<IPropertySymbol>().Where(a =>
HasAttribute(a, $"SourceGen.{GeneratePropertyAttributeName}")); SourceHelper.HasAttribute(a, GeneratePropertyAttributeName));
}
private static bool HasAttribute(ISymbol type, string attributeName)
{
foreach (var attribute in type.GetAttributes())
if (attribute.AttributeClass?.ToDisplayString() == attributeName)
return true;
return false;
} }
} }

View File

@@ -0,0 +1,56 @@
using System.Text;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Text;
namespace Nebula.SourceGenerators;
public static class SourceHelper
{
public static void GenerateAttribute(string attributeName, string usage,
IncrementalGeneratorInitializationContext context)
{
var attributeSourceCode = $@"// <auto-generated/>
namespace SourceGen
{{
[System.AttributeUsage(System.AttributeTargets.{usage})]
public class {attributeName} : System.Attribute
{{
}}
}}";
context.RegisterPostInitializationOutput(ctx => ctx.AddSource(
$"{attributeName}.g.cs",
SourceText.From(attributeSourceCode, Encoding.UTF8)));
}
public static bool HasAttribute(ISymbol type, string attributeName)
{
foreach (var attribute in type.GetAttributes())
if (attribute.AttributeClass?.ToDisplayString() == attributeName)
return true;
return false;
}
public static (ClassDeclarationSyntax, bool reportAttributeFound) GetClassDeclarationForSourceGen(
GeneratorSyntaxContext context, string AttributeName)
{
var classDeclarationSyntax = (ClassDeclarationSyntax)context.Node;
foreach (var attributeListSyntax in classDeclarationSyntax.AttributeLists)
foreach (var attributeSyntax in attributeListSyntax.Attributes)
{
if (context.SemanticModel.GetSymbolInfo(attributeSyntax).Symbol is not IMethodSymbol attributeSymbol)
continue;
var attributeName = attributeSymbol.ContainingType.ToDisplayString();
if (attributeName == AttributeName)
return (classDeclarationSyntax, true);
}
return (classDeclarationSyntax, false);
}
}

View File

@@ -0,0 +1,58 @@
using System.Collections.Immutable;
using System.Text;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Text;
namespace Nebula.SourceGenerators;
//[Generator]
public class ViewConstructGenerator : IIncrementalGenerator
{
public static string ViewForModelAttributeName = "ViewForModelAttribute";
public void Initialize(IncrementalGeneratorInitializationContext context)
{
var provider = context.SyntaxProvider
.CreateSyntaxProvider(
(s, _) => s is ClassDeclarationSyntax, (ctx, _) =>
SourceHelper.GetClassDeclarationForSourceGen(ctx,ViewForModelAttributeName)
)
.Where(t => t.reportAttributeFound)
.Select((t,_) => t.Item1);
context.RegisterSourceOutput(context.CompilationProvider.Combine(provider.Collect()), (ctx,t)=> GenerateCode(ctx, t.Left, t.Right));
}
private void GenerateCode(SourceProductionContext context, Compilation compilation, ImmutableArray<ClassDeclarationSyntax> syntaxes)
{
foreach (var classDeclarationSyntax in syntaxes)
{
var semanticModel = compilation.GetSemanticModel(classDeclarationSyntax.SyntaxTree);
if(semanticModel.GetDeclaredSymbol(classDeclarationSyntax) is not INamedTypeSymbol classSymbol)
continue;
var namespaceName = classSymbol.ContainingNamespace.ToDisplayString();
var className = classDeclarationSyntax.Identifier.Text;
var code = $@"// <auto-generated/>
using System;
using System.Collections.Generic;
namespace {namespaceName};
partial class {className}
{{
public {className}() : base(){{
}}
}}
";
// Add the source code to the compilation.
context.AddSource($"{className}.g.cs", SourceText.From(code, Encoding.UTF8));
}
}
}