Skip to content

Commit

Permalink
feat: update API and product version to 1.0.0 (#314)
Browse files Browse the repository at this point in the history
* feat: add "Save as" button

* Create Build for Windows

Asana: https://app.asana.com/0/1206009821057985/1207478687634539/f

* Change executable workflow

* feat(planning): refactor mission saving logic and clean up code

Streamline the mission saving implementation in PlaningMissionSavingBrowserViewModel by removing unneeded code and improving readability. Minimized property visibility where not necessary, and removed unused imports within different files across the project. Also, cleaned up CompatibilitySuppressions.xml by removing redundant suppressions.

Asana: https://app.asana.com/0/1203851531040615/1207411924258622/f

* feat (planning): update file and mission naming mechanism

Removed hard-coded watermark from TextBox in 'PlaningMissionSavingBrowserView.axaml'. Adapted "FileName" and "Name" properties in 'PlaningMissionSavingBrowserViewModel.cs' and 'PlaningMissionViewModel.cs' to accept null. Edited the instantiation of 'PlaningMissionSavingBrowserViewModel' in 'PlaningPageViewModel.cs' to include the current mission name.

Asana: https://app.asana.com/0/1203851531040615/1207411924258622/f

* feat(api): update API version and remove NLog dependency

The API version has been updated from 0.3.2 to 0.3.3. Also, some other version upgrades have been carried out, such as AsvCommonVersion and AsvMavlinkVersion. Furthermore, the NLog dependency has been removed from the project Asv.Drones.Gui.

* feat(api-mavlink): update mavlink nuget;add RFSA device

* feat(actions): release action (#303)

Add release action for new version

* feat(plugins): update plugins to include API version compatibility check

Updated the plugin system to support API version compatibility. All plugins are now required to specify their API version, which is then checked for compatibility with the application's API version. If the versions do not match, the plugin will not be loaded. The API version has also been added to the application version display for transparency.

* fix: Update GetRfsaByFullId method return type and source

Renamed the return type of GetRfsaByFullId method from IAdsbClientDevice to IRfsaClientDevice in MavlinkDevicesService class. The data source was also shifted from AdsbDevices to RfsaDevices, and the associated DiagnosticId was adjusted consequently in CompatibilitySuppressions.xml.

* fix: Update API version to 0.3.6

In Directory.Build.props, the API version was updated from 0.3.5 to 0.3.6. The previous API version was also adjusted accordingly, from 0.3.4 to 0.3.5.

* fix: Include RfsaDevices in AllDevices and update suppressions file

In the MavlinkDevicesService, it now includes RfsaDevices in the AllDevices merge. Moreover, certain suppressions related to ApiVersion in the CompatibilitySuppressions.xml for Asv.Drones.Gui.Api have been removed.

* feat: Add RFSA device class in MavlinkHelper

The commit introduces a new device class, RFSA, in the MavlinkHelper. It maps the new RFSA class to a specific icon (Waveform). The default icon was also updated to 'HelpNetworkOutline' for any device class not explicitly defined.

* feat: add default app.args file

* feat: Update visibility binding and enhance logging

The code updates have reorganized the compile instruction order for 'RS.Designer.cs' in the project file. The ScrollViewer's visibility binding in the MapPageView is now dependent on 'LeftWidgets' and 'RightWidgets' count. Borders visibility binding is now dependent on 'BottomWidgets' and 'MapActions' count, improving UI responsiveness.
A 'CatchToLog' method has also been added to ReactiveCommand in the logging service, enhancing error handling by directing thrown exceptions to the log.

* fix(anchor editor): add icon margin in actions (#305)

asana: https://app.asana.com/0/1203851531040615/1207643849991134/f

* fix(Uav): move the mode button (#306)

asana: https://app.asana.com/0/1203851531040615/1207643849991144/f

* fix(uav): refactor MissionStatusView layout and FlightUavView (#309)

asana: https://app.asana.com/0/1203851531040615/1207643986818660/f
https://app.asana.com/0/1203851531040615/1207654116236034/f

* fix(log-service): add filters to different levels of errors according to Nlog documentation. Add Logger message save (#308)

Asana: https://app.asana.com/0/1206009821057985/1207643849991142/f

* fix(uav): fix MissionStatusView margin (#312)

asana: https://app.asana.com/0/1206118975886649/1207674317434296/f

* Fix size optimization and ArgumentNullException in AnchorEditor widget (#310)

* fix(anchor-editor): descending sorting of uav actions

Asana: https://app.asana.com/0/1203851531040615/1207643849991138/f

* fix(anchor-editor): check actions collections for null to avoid ArgumentNullException

Asana: https://app.asana.com/0/1203851531040615/1207664866852418/f

* fix(anchor-editor): actions size-optimization with more short locales

Asana: https://app.asana.com/0/1203851531040615/1207643849991138/f

* fix(anchor-editor): add scrolls to actions and coordinates part of widget

Asana: https://app.asana.com/0/1203851531040615/1207654116236041/f

* fix(anchor-editor): short locales to reboot/shutdown action

Asana: https://app.asana.com/0/1203851531040615/1207643849991138/f

* fix(anchor-editor): better flyout menu style and refactor scroll viewers

Asana: https://app.asana.com/0/1203851531040615/1207654116236041/f

* fix(anchor-editor): update layout and visual changes in AnchorsEditorView

Reduced the width of the second column in the Grid from 10 to 2. The Border element was replaced with a Rectangle for better visual clarity. Minor adjustments were made to clean up the code format, maintaining consistency in layout and improving overall readability.

Asana: https://app.asana.com/0/1203851531040615/1207654116236041/f

* fix(anchor-editor): fix actions collection sharing when selected item changed, fix localization and anchor title layout

Asana: https://app.asana.com/0/1203851531040615/1207654116236041/f

* fix(anchor-editor): update AnchorsEditorView layout properties

The properties of TextBlock and Rectangle in the AnchorsEditorView file have been revised. Specifically, the TextBlock has been assigned a name "ActionsTextBlock". Additionally, the fill color of the rectangle now relies on the foreground of ActionsTextBlock, ensuring better UI consistency.

Asana: https://app.asana.com/0/1203851531040615/1207654116236041/f

---------

Co-authored-by: u01 <[email protected]>

* fix(hierarchical-store): add scroll viewer at list of tasks (#311)

* fix(hierarchical-store): add scroll viewer at list of tasks

Asana: https://app.asana.com/0/1203851531040615/1207644963134958/f

* fix(hierarchical-store): more height to list of tasks to reduce empty space

Asana: https://app.asana.com/0/1203851531040615/1207644963134958/f

* fix: progress bar (#313)

Asana: https://app.asana.com/0/1203851531040615/1207644963134966/f

* feat: update API and product version to 1.0.0

The commit adds Asv.Avalonia.Toolkit as a reference in both Asv.Drones.Gui.Api and Asv.Drones.Gui projects. It also changes the "CopyToOutputDirectory" property of "app.args" to "Never". The version numbers for Product, API, and various dependencies have been upgraded to 1.0.0 in Directory.Build.props file.

---------

Co-authored-by: Ilya<[email protected]>
Co-authored-by: Eugene <[email protected]>
Co-authored-by: Alexey <[email protected]>
Co-authored-by: Maxim <[email protected]>
Co-authored-by: Lev <[email protected]>
  • Loading branch information
5 people authored Jun 29, 2024
1 parent 05ad55a commit 437423a
Show file tree
Hide file tree
Showing 67 changed files with 1,147 additions and 444 deletions.
91 changes: 91 additions & 0 deletions .github/workflows/BuildForWindows.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
name: Build and Release

on:
push:
tags:
- "v*"
jobs:
build-and-release:
runs-on: windows-latest
steps:
- name: Checkout code
uses: actions/checkout@v3

- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
dotnet-version: 8.0.x

- name: Add NuGet source
env:
NUGET_USERNAME: ${{ secrets.USER_NAME }}
NUGET_PASSWORD: ${{ secrets.GIHUB_NUGET_AUTH_TOKEN }}
run: |
echo "<configuration>" > nuget.config
echo "<packageSources>" >> nuget.config
echo '<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />' >> nuget.config
echo '<add key="asv" value="https://nuget.pkg.github.com/asv-soft/index.json" />' >> nuget.config
echo "</packageSources>" >> nuget.config
echo "<packageSourceCredentials>" >> nuget.config
echo "<asv>" >> nuget.config
echo '<add key="Username" value="'${{ secrets.USER_NAME }}'" />' >> nuget.config
echo '<add key="ClearTextPassword" value="'${{ secrets.GIHUB_NUGET_AUTH_TOKEN }}'" />' >> nuget.config
echo "</asv>" >> nuget.config
echo "</packageSourceCredentials>" >> nuget.config
echo "</configuration>" >> nuget.config
- name: Install dependencies
run: |
dotnet restore ./src/Asv.Drones.Gui.Api/Asv.Drones.Gui.Api.csproj
dotnet restore ./src/Asv.Drones.Gui/Asv.Drones.Gui.csproj
dotnet restore ./src/Asv.Drones.Gui.Desktop/Asv.Drones.Gui.Desktop.csproj
- name: Build
run: |
dotnet build ./src/Asv.Drones.Gui.Api/Asv.Drones.Gui.Api.csproj --configuration Release --no-restore
dotnet build ./src/Asv.Drones.Gui/Asv.Drones.Gui.csproj --configuration Release --no-restore
dotnet build ./src/Asv.Drones.Gui.Desktop/Asv.Drones.Gui.Desktop.csproj --configuration Release --no-restore
- name: Set version variable
env:
TAG: ${{ github.ref_name }}
run: echo "VERSION=${TAG#v}" >> $GITHUB_ENV


# here you must define path to your .csproj
- name: Publish project for installer
run: dotnet publish ./src/Asv.Drones.Gui.Desktop/Asv.Drones.Gui.Desktop.csproj -c Release -o ./publish/app

- name: Install NSIS
run: |
choco install nsis
#here you must define path to your .nsi file (it is used for installer setup and creation)
- name: Create EXE installer
run: makensis ./win-64-install.nsi

- name: List output files
run: Get-ChildItem -Path ./publish/app -Force

- name: Create Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GIHUB_NUGET_AUTH_TOKEN }}
RELEASE_BODY: ${{ steps.create-release-notes.outputs.release-notes }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
draft: false
prerelease: ${{ contains(github.ref, 'alpha') }}


- name: Upload Release Asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GIHUB_NUGET_AUTH_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./AsvDronesGuiInstaller.exe
asset_name: asv-drones-${{ github.ref_name }}-setup-windows-64.exe
asset_content_type: application/vnd.microsoft.portable-executable
23 changes: 0 additions & 23 deletions .github/workflows/ReleaseDeployAction.yml

This file was deleted.

2 changes: 1 addition & 1 deletion src/.run/Win-x64.run.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Win-x64" type="DotNetFolderPublish" factoryName="Publish to folder">
<riderPublish configuration="Release" delete_existing_files="true" include_native_libs_for_self_extract="true" platform="Any CPU" produce_single_file="true" runtime="win-x64" self_contained="true" target_folder="$PROJECT_DIR$/../publish/win-x64/app" target_framework="net7.0" uuid_high="-6069974389149972757" uuid_low="-5498245974063364756" />
<riderPublish configuration="Release" delete_existing_files="true" include_native_libs_for_self_extract="true" platform="Any CPU" produce_single_file="true" runtime="win-x64" self_contained="true" target_folder="$PROJECT_DIR$/../publish/win-x64/app" target_framework="net8.0" uuid_high="-6069974389149972757" uuid_low="-5498245974063364756" />
<method v="2" />
</configuration>
</component>
5 changes: 5 additions & 0 deletions src/Asv.Drones.Gui.Api/Asv.Drones.Gui.Api.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -81,4 +81,9 @@
<AdditionalFiles Include="Tools\Controls\Params\ParamItemView.axaml"/>
<AdditionalFiles Include="Tools\Controls\Params\ParamPageView.axaml"/>
</ItemGroup>
<ItemGroup>
<Reference Include="Asv.Avalonia.Toolkit">
<HintPath>..\..\..\..\Users\Havok\.nuget\packages\asv.avalonia.toolkit\0.1.7\lib\net8.0\Asv.Avalonia.Toolkit.dll</HintPath>
</Reference>
</ItemGroup>
</Project>
9 changes: 8 additions & 1 deletion src/Asv.Drones.Gui.Api/CompatibilitySuppressions.xml
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- https://learn.microsoft.com/en-us/dotnet/fundamentals/package-validation/diagnostic-ids -->
<Suppressions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Asv.Drones.Gui.Api.IMavlinkDevicesService.GetRfsaByFullId(System.UInt16)</Target>
<Left>lib/net8.0/Asv.Drones.Gui.Api.dll</Left>
<Right>lib/net8.0/Asv.Drones.Gui.Api.dll</Right>
<IsBaselineSuppression>true</IsBaselineSuppression>
</Suppression>
<Suppression>
<DiagnosticId>CP0006</DiagnosticId>
<Target>P:Asv.Drones.Gui.Api.ILocalizationService.Accuracy</Target>
<Target>M:Asv.Drones.Gui.Api.IMavlinkDevicesService.GetRfsaByFullId(System.UInt16)</Target>
<Left>lib/net8.0/Asv.Drones.Gui.Api.dll</Left>
<Right>lib/net8.0/Asv.Drones.Gui.Api.dll</Right>
<IsBaselineSuppression>true</IsBaselineSuppression>
Expand Down
9 changes: 9 additions & 0 deletions src/Asv.Drones.Gui.Api/RS.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions src/Asv.Drones.Gui.Api/RS.resx
Original file line number Diff line number Diff line change
Expand Up @@ -190,4 +190,7 @@
<data name="Anchor_Editor_Action_Paste" xml:space="preserve">
<value>Paste</value>
</data>
<data name="AnchorsEditorView_TextBlock_Actions" xml:space="preserve">
<value>Actions</value>
</data>
</root>
3 changes: 3 additions & 0 deletions src/Asv.Drones.Gui.Api/RS.ru.resx
Original file line number Diff line number Diff line change
Expand Up @@ -186,4 +186,7 @@
<data name="Anchor_Editor_Action_Paste" xml:space="preserve">
<value>Вставить</value>
</data>
<data name="AnchorsEditorView_TextBlock_Actions" xml:space="preserve">
<value>Действия</value>
</data>
</root>
20 changes: 18 additions & 2 deletions src/Asv.Drones.Gui.Api/Services/LogService/ILogService.cs
Original file line number Diff line number Diff line change
@@ -1,20 +1,36 @@
using ReactiveUI;

namespace Asv.Drones.Gui.Api;

public static class LogHelper
{
public static IDisposable CatchToLog<TParam, TResult>(this ReactiveCommand<TParam, TResult> cmd, ILogService log, string sender)
{
return cmd.ThrownExceptions.Subscribe(ex=>log.Error(sender, ex.Message,ex));
}
}


public interface ILogService
{
IObservable<LogMessage> OnMessage { get; }
void SaveMessage(LogMessage logMessage);
IEnumerable<LogItemViewModel> LoadItemsFromLogFile();
void DeleteLogFile();

public IDisposable CatchToLog<TParam, TResult>( ReactiveCommand<TParam, TResult> cmd, string sender)
{
return cmd.ThrownExceptions.Subscribe(ex=>Error(sender, ex.Message,ex));
}

public void Fatal(string sender, string message,
Exception ex = default)
Exception? ex = default)
{
SaveMessage(new LogMessage(DateTime.Now, LogMessageType.Fatal, sender, message, ex?.Message));
}

public void Error(string sender, string message,
Exception ex = default)
Exception? ex = default)
{
SaveMessage(new LogMessage(DateTime.Now, LogMessageType.Error, sender, message, ex?.Message));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,13 @@ public interface IMavlinkDevicesService
/// <param name="id">Id of searched vehicle</param>
/// <returns>Vehicle object</returns>
IVehicleClient? GetVehicleByFullId(ushort id);

IObservable<IChangeSet<IGbsClientDevice, ushort>> BaseStations { get; }
IGbsClientDevice? GetGbsByFullId(ushort id);
IObservable<IChangeSet<ISdrClientDevice, ushort>> Payloads { get; }
ISdrClientDevice? GetPayloadsByFullId(ushort id);
IObservable<IChangeSet<IAdsbClientDevice, ushort>> AdsbDevices { get; }
IAdsbClientDevice? GetAdsbVehicleByFullId(ushort id);
IObservable<IChangeSet<IRfsaClientDevice, ushort>> RfsaDevices { get; }
IRfsaClientDevice? GetRfsaByFullId(ushort id);
}
}
3 changes: 2 additions & 1 deletion src/Asv.Drones.Gui.Api/Services/Mavlink/MavlinkHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ public static MaterialIconKind GetIcon(DeviceClass type)
DeviceClass.SdrPayload => MaterialIconKind.Radio,
DeviceClass.GbsRtk => MaterialIconKind.RouterWireless,
DeviceClass.Adsb => MaterialIconKind.Radar,
_ => MaterialIconKind.Navigation,
DeviceClass.Rfsa => MaterialIconKind.Waveform,
_ => MaterialIconKind.HelpNetworkOutline,
};
}
}
Expand Down
3 changes: 3 additions & 0 deletions src/Asv.Drones.Gui.Api/Services/Plugins/ILocalPluginInfo.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
using Asv.Common;

namespace Asv.Drones.Gui.Api;

public interface ILocalPluginInfo : IPluginSpecification
Expand All @@ -21,6 +23,7 @@ public interface IPluginSearchInfo : IPluginSpecification

public interface IPluginSpecification
{
SemVersion ApiVersion { get; }
string PackageId { get; }
string? Title { get; }
public string? Description { get; }
Expand Down
2 changes: 2 additions & 0 deletions src/Asv.Drones.Gui.Api/Services/Plugins/IPluginManager.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using Asv.Common;
using DynamicData;

namespace Asv.Drones.Gui.Api;
Expand Down Expand Up @@ -31,6 +32,7 @@ Task Install(IPluginServerInfo source, string packageId, string version, IProgre
void CancelUninstall(ILocalPluginInfo pluginInfo);
IEnumerable<ILocalPluginInfo> Installed { get; }
bool IsInstalled(string packageId, out ILocalPluginInfo? info);
SemVersion ApiVersion { get; }
}

public class SearchQuery
Expand Down
6 changes: 5 additions & 1 deletion src/Asv.Drones.Gui.Api/Services/Plugins/NullPluginManager.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace Asv.Drones.Gui.Api;
using Asv.Common;

namespace Asv.Drones.Gui.Api;

public class NullPluginManager : IPluginManager
{
Expand Down Expand Up @@ -43,4 +45,6 @@ public bool IsInstalled(string packageId, out ILocalPluginInfo? info)
info = null;
return false;
}

public SemVersion ApiVersion { get; } = new(0);
}
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ public HierarchicalStoreEntryViewModel()
[Reactive] public string Description { get; set; }


protected virtual void OnError(HierarchicalStoreEntryAction action, Exception exception)
protected virtual void OnError(HierarchicalStoreEntryAction action, Exception? exception)
{
}

Expand Down Expand Up @@ -161,7 +161,7 @@ public HierarchicalStoreEntryViewModel(Node<IHierarchicalStoreEntry<TKey>, TKey>
ParentId = node.Item.ParentId;
}

protected override void OnError(HierarchicalStoreEntryAction action, Exception ex)
protected override void OnError(HierarchicalStoreEntryAction action, Exception? ex)
{
base.OnError(action, ex);
_log.Error("Store", $"Error to '{action}' entry", ex);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,24 +74,27 @@
Text="{Binding SearchText}" />
</Border>
</DockPanel>
<TreeView SelectionMode="Toggle" Margin="0,8,0,8" ItemsSource="{Binding Items}"
SelectedItem="{Binding SelectedItem, Mode=TwoWay}">
<TreeView.ItemTemplate>
<TreeDataTemplate ItemsSource="{Binding Items}">
<DockPanel HorizontalAlignment="Stretch" LastChildFill="False">
<avalonia:MaterialIcon
Margin="0,0,8,0"
Classes.folder="{Binding IsFolder}"
Classes.file="{Binding IsFile}"
Classes.expanded="{Binding IsExpanded}"
Classes.selected="{Binding IsSelected}"
Width="15" Height="15" />
<TextBlock MinWidth="120" Text="{Binding Name}" />
<TextBlock DockPanel.Dock="Right" Foreground="Gray" Text="{Binding Description}" />
</DockPanel>
</TreeDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
<ScrollViewer MaxHeight="400" VerticalAlignment="Top">
<TreeView SelectionMode="Toggle" Margin="0,8,0,8" ItemsSource="{Binding Items}"
SelectedItem="{Binding SelectedItem, Mode=TwoWay}">
<TreeView.ItemTemplate>
<TreeDataTemplate ItemsSource="{Binding Items}">
<DockPanel HorizontalAlignment="Stretch" LastChildFill="False">
<avalonia:MaterialIcon
Margin="0,0,8,0"
Classes.folder="{Binding IsFolder}"
Classes.file="{Binding IsFile}"
Classes.expanded="{Binding IsExpanded}"
Classes.selected="{Binding IsSelected}"
Width="15" Height="15" />
<TextBlock MinWidth="120" Text="{Binding Name}" />
<TextBlock DockPanel.Dock="Right" Foreground="Gray"
Text="{Binding Description}" />
</DockPanel>
</TreeDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</ScrollViewer>
</DockPanel>
</Border>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ protected virtual void CreateNewFolderImpl()
{
}

protected virtual void OnError(HierarchicalStoreAction action, Exception ex)
protected virtual void OnError(HierarchicalStoreAction action, Exception? ex)
{
}

Expand Down Expand Up @@ -236,7 +236,7 @@ public HierarchicalStoreViewModel(Uri id, IHierarchicalStore<TKey, TFile> store,
.Subscribe(x => x?.Refresh()).DisposeItWith(Disposable);
}

protected override void OnError(HierarchicalStoreAction action, Exception ex)
protected override void OnError(HierarchicalStoreAction action, Exception? ex)
{
_log.Error(DisplayName, $"Error to '{action:G}'", ex);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,6 @@ public RulerStartAnchor(Uri id, GeoPoint startPoint) : base(id)
OffsetX = OffsetXEnum.Center;
OffsetY = OffsetYEnum.Bottom;
StrokeThickness = 1;
BaseStrokeThickness = 1;
IconBrush = Brushes.Indigo;
Stroke = Brushes.White;
IsVisible = true;
Expand All @@ -139,8 +138,7 @@ public RulerStopAnchor(Uri id, RulerStartAnchor start, ILocalizationService loc,
BaseSize = 48;
OffsetX = OffsetXEnum.Center;
OffsetY = OffsetYEnum.Bottom;
StrokeThickness = 1;
BaseStrokeThickness = 1;
StrokeThickness = 1;
IconBrush = Brushes.Indigo;
Stroke = Brushes.White;
IsVisible = true;
Expand Down
Loading

0 comments on commit 437423a

Please sign in to comment.