Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a

When considering version compatibility (and thus incrementing the major version), we only consider the configuration file major user experience changes. The host IDE version is not considered a version compatibility factor (since otherwise we'd have to increase the major version pretty often and that would make no sense).

## [Unreleased] (1.9.0)
### Added
- New C# file templates: **Avalonia Converter**, **Avalonia Multi Converter**. Thanks to @bugrakurnaz!

## [1.8.0] - 2025-11-16
### Changed
- **(Requirement update!)** Update the minimal supported Rider version to 2025.3.0.1.
Expand Down
8 changes: 8 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,12 @@ $ ./gradlew prepare

This will download the initial set of dependencies necessary for the plugin development and set up Rider SDK for .NET part of the project. After that, open either the frontend part of the plugin (the directory containing `build.gradle.kts`) using IntelliJ IDEA, or the `AvaloniaRider.sln` using Rider.

## Editing the Templates
The easiest way to edit the plugin's file templates is to mount them to a particular solution in the IDE and then edit them. For example:
1. Create a new solution, open in Rider.
2. Go to the IDE **Settings** window, press **Manage Layers** button.
3. Navigate to `<AvaloniaRider>/src/extensions/settings/fileTemplates.DotSettings`.
4. Go to the IDE **Settings** window, **Editor → File Templates** page.
5. Make changes to the template, save to the custom **fileTemplates** layer — it will be preserved in `fileTemplates.DotSettings` in the repository.

[gradle-jvm-wrapper]: https://github.com/mfilippov/gradle-jvm-wrapper
14 changes: 9 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,15 @@ There's a separate button to **debug** the previewer process for the current fil
### File templates

Right-click a directory or an Avalonia-enabled project and choose among the available file templates:
- Avalonia User Control
- Avalonia Templated control
- Avalonia Window
- Avalonia Resource Dictionary
- Avalonia Styles
- XAML:
- **Avalonia User Control**,
- **Avalonia Templated Control**,
- **Avalonia Window**,
- **Avalonia Resource Dictionary**,
- **Avalonia Styles**;
- C#:
- **Avalonia Converter**,
- **Avalonia Multi Converter**.

### Live templates

Expand Down
99 changes: 96 additions & 3 deletions src/extensions/settings/fileTemplates.DotSettings
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:s="clr-namespace:System;assembly=mscorlib"
xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CustomTools/CustomToolsData/@EntryValue"></s:String>
<!-- Avalonia User Control -->
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/QuickList/=2FBEA98F8AB8294B87A62E4CCD2CC3E3/Entry/=AA00FE2BDD2D35429C91F3F1C6A11BCF/@KeyIndexDefined">True</s:Boolean>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/QuickList/=2FBEA98F8AB8294B87A62E4CCD2CC3E3/Entry/=AA00FE2BDD2D35429C91F3F1C6A11BCF/EntryName/@EntryValue">Avalonia User Control</s:String>
Expand Down Expand Up @@ -234,4 +233,98 @@ namespace $NAMESPACE$&#xD;
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=AA33FE2BDD2D35429C91F3F1C6A11BCF/Applicability/=File/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=AA33FE2BDD2D35429C91F3F1C6A11BCF/Scope/=1F4DBD605BD33C409AE7328D8C5965C3/@KeyIndexDefined">True</s:Boolean>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=AA33FE2BDD2D35429C91F3F1C6A11BCF/Scope/=1F4DBD605BD33C409AE7328D8C5965C3/Type/@EntryValue">InAnyXamlProject</s:String>

<!-- Avalonia Converter -->
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=70D36F46D895B342B0EF49647B88A455/Scope/=E7CFFE18D9B99549AE3902238EDA927F/@KeyIndexDefined">True</s:Boolean>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=70D36F46D895B342B0EF49647B88A455/Scope/=E7CFFE18D9B99549AE3902238EDA927F/Type/@EntryValue">InXamlCSharpProject</s:String>
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/QuickList/=F0CA621CDF5AB24282D8CDC11C520997/Entry/=2CBD6971A7955044AD2624B84FB49E38/Position/@EntryValue">9</s:Int64>
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/QuickList/=F0CA621CDF5AB24282D8CDC11C520997/Entry/=567DCF4B487C244A9F6BB46E4E9F3B84/Position/@EntryValue">6</s:Int64>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/QuickList/=F0CA621CDF5AB24282D8CDC11C520997/Entry/=70D36F46D895B342B0EF49647B88A455/@KeyIndexDefined">True</s:Boolean>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/QuickList/=F0CA621CDF5AB24282D8CDC11C520997/Entry/=70D36F46D895B342B0EF49647B88A455/EntryName/@EntryValue">&lt;No Name&gt;</s:String>
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/QuickList/=F0CA621CDF5AB24282D8CDC11C520997/Entry/=70D36F46D895B342B0EF49647B88A455/Position/@EntryValue">10</s:Int64>
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/QuickList/=F0CA621CDF5AB24282D8CDC11C520997/Entry/=7F2A1BE8D0078241A9AE7802038BAD3C/Position/@EntryValue">7</s:Int64>
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/QuickList/=F0CA621CDF5AB24282D8CDC11C520997/Entry/=C4795E57DDEC1C4F97BBC8C7173EBBCA/Position/@EntryValue">8</s:Int64>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=70D36F46D895B342B0EF49647B88A455/@KeyIndexDefined">True</s:Boolean>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=70D36F46D895B342B0EF49647B88A455/Applicability/=File/@EntryIndexedValue">True</s:Boolean>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=70D36F46D895B342B0EF49647B88A455/CustomProperties/=Extension/@EntryIndexedValue">cs</s:String>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=70D36F46D895B342B0EF49647B88A455/CustomProperties/=FileName/@EntryIndexedValue">Converter</s:String>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=70D36F46D895B342B0EF49647B88A455/CustomProperties/=ValidateFileName/@EntryIndexedValue">True</s:String>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=70D36F46D895B342B0EF49647B88A455/Description/@EntryValue">Avalonia Converter</s:String>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=70D36F46D895B342B0EF49647B88A455/Reformat/@EntryValue">True</s:Boolean>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=70D36F46D895B342B0EF49647B88A455/ShortenQualifiedReferences/@EntryValue">True</s:Boolean>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=70D36F46D895B342B0EF49647B88A455/Text/@EntryValue">using System;
using System.Globalization;
using Avalonia.Data.Converters;

$HEADER$namespace $NAMESPACE$
{
public class $CLASS$ : IValueConverter
{
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
{
throw new NotImplementedException();
}

public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}</s:String>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=70D36F46D895B342B0EF49647B88A455/Field/=CLASS/@KeyIndexDefined">True</s:Boolean>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=70D36F46D895B342B0EF49647B88A455/Field/=CLASS/Expression/@EntryValue">getAlphaNumericFileNameWithoutExtension()</s:String>
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=70D36F46D895B342B0EF49647B88A455/Field/=CLASS/Order/@EntryValue">2</s:Int64>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=70D36F46D895B342B0EF49647B88A455/Field/=HEADER/@KeyIndexDefined">True</s:Boolean>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=70D36F46D895B342B0EF49647B88A455/Field/=HEADER/Expression/@EntryValue">fileheader()</s:String>
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=70D36F46D895B342B0EF49647B88A455/Field/=HEADER/Order/@EntryValue">0</s:Int64>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=70D36F46D895B342B0EF49647B88A455/Field/=NAMESPACE/@KeyIndexDefined">True</s:Boolean>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=70D36F46D895B342B0EF49647B88A455/Field/=NAMESPACE/Expression/@EntryValue">fileDefaultNamespace()</s:String>
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=70D36F46D895B342B0EF49647B88A455/Field/=NAMESPACE/Order/@EntryValue">1</s:Int64>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=70D36F46D895B342B0EF49647B88A455/Scope/=E8F0594528C33E45BBFEC6CFE851095D/@KeyIndexDefined">False</s:Boolean>


<!-- Avalonia Multi Converter -->
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/QuickList/=F0CA621CDF5AB24282D8CDC11C520997/Entry/=2CBD6971A7955044AD2624B84FB49E38/Position/@EntryValue">9</s:Int64>
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/QuickList/=F0CA621CDF5AB24282D8CDC11C520997/Entry/=567DCF4B487C244A9F6BB46E4E9F3B84/Position/@EntryValue">6</s:Int64>
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/QuickList/=F0CA621CDF5AB24282D8CDC11C520997/Entry/=7F2A1BE8D0078241A9AE7802038BAD3C/Position/@EntryValue">7</s:Int64>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/QuickList/=F0CA621CDF5AB24282D8CDC11C520997/Entry/=BA2B72EE2086334DBCE6473F29F18C87/@KeyIndexDefined">True</s:Boolean>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/QuickList/=F0CA621CDF5AB24282D8CDC11C520997/Entry/=BA2B72EE2086334DBCE6473F29F18C87/EntryName/@EntryValue">&lt;No Name&gt;</s:String>
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/QuickList/=F0CA621CDF5AB24282D8CDC11C520997/Entry/=BA2B72EE2086334DBCE6473F29F18C87/Position/@EntryValue">10</s:Int64>
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/QuickList/=F0CA621CDF5AB24282D8CDC11C520997/Entry/=C4795E57DDEC1C4F97BBC8C7173EBBCA/Position/@EntryValue">8</s:Int64>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=BA2B72EE2086334DBCE6473F29F18C87/@KeyIndexDefined">True</s:Boolean>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=BA2B72EE2086334DBCE6473F29F18C87/Applicability/=File/@EntryIndexedValue">True</s:Boolean>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=BA2B72EE2086334DBCE6473F29F18C87/CustomProperties/=Extension/@EntryIndexedValue">cs</s:String>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=BA2B72EE2086334DBCE6473F29F18C87/CustomProperties/=FileName/@EntryIndexedValue">MultiValueConverter</s:String>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=BA2B72EE2086334DBCE6473F29F18C87/CustomProperties/=ValidateFileName/@EntryIndexedValue">True</s:String>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=BA2B72EE2086334DBCE6473F29F18C87/Description/@EntryValue">Avalonia Multi Converter</s:String>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=BA2B72EE2086334DBCE6473F29F18C87/Reformat/@EntryValue">True</s:Boolean>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=BA2B72EE2086334DBCE6473F29F18C87/Scope/=E7CFFE18D9B99549AE3902238EDA927F/@KeyIndexDefined">True</s:Boolean>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=BA2B72EE2086334DBCE6473F29F18C87/Scope/=E7CFFE18D9B99549AE3902238EDA927F/Type/@EntryValue">InXamlCSharpProject</s:String>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=BA2B72EE2086334DBCE6473F29F18C87/ShortenQualifiedReferences/@EntryValue">True</s:Boolean>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=BA2B72EE2086334DBCE6473F29F18C87/Text/@EntryValue">using System;
using System.Collections.Generic;
using System.Globalization;
using Avalonia.Data.Converters;

$HEADER$namespace $NAMESPACE$
{
public class $CLASS$ : IMultiValueConverter
{
public object? Convert(IList&lt;object?&gt;? value, Type targetType, object? parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}</s:String>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=BA2B72EE2086334DBCE6473F29F18C87/Field/=CLASS/@KeyIndexDefined">True</s:Boolean>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=BA2B72EE2086334DBCE6473F29F18C87/Field/=CLASS/Expression/@EntryValue">getAlphaNumericFileNameWithoutExtension()</s:String>
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=BA2B72EE2086334DBCE6473F29F18C87/Field/=CLASS/Order/@EntryValue">2</s:Int64>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=BA2B72EE2086334DBCE6473F29F18C87/Field/=HEADER/@KeyIndexDefined">True</s:Boolean>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=BA2B72EE2086334DBCE6473F29F18C87/Field/=HEADER/Expression/@EntryValue">fileheader()</s:String>
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=BA2B72EE2086334DBCE6473F29F18C87/Field/=HEADER/Order/@EntryValue">0</s:Int64>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=BA2B72EE2086334DBCE6473F29F18C87/Field/=NAMESPACE/@KeyIndexDefined">True</s:Boolean>
<s:String x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=BA2B72EE2086334DBCE6473F29F18C87/Field/=NAMESPACE/Expression/@EntryValue">fileDefaultNamespace()</s:String>
<s:Int64 x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=BA2B72EE2086334DBCE6473F29F18C87/Field/=NAMESPACE/Order/@EntryValue">1</s:Int64>
<s:Boolean x:Key="/Default/PatternsAndTemplates/LiveTemplates/Template/=BA2B72EE2086334DBCE6473F29F18C87/Scope/=E8F0594528C33E45BBFEC6CFE851095D/@KeyIndexDefined">False</s:Boolean>

</wpf:ResourceDictionary>