Skip to content

Commit

Permalink
Avalonia v11 - OpenListDialog focus manager, Images IFramebufferPlatf…
Browse files Browse the repository at this point in the history
…ormSurface, SharpTreeView overrides and IndexOf(..)
  • Loading branch information
DamianSuess committed Jul 21, 2023
1 parent 01deb70 commit c6c65fd
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 37 deletions.
3 changes: 3 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ indent_size = 2
[*.vsct]
indent_style = space
indent_size = 2
[*.md]
indent_style = space
indent_size = 2

[*.{cs,csx}]
tab_width = 4
Expand Down
8 changes: 6 additions & 2 deletions ILSpy.Core/Images/Images.cs
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,10 @@ private class WbFb : IFramebufferPlatformSurface
WriteableBitmap _bitmap;
public ILockedFramebuffer Lock() => _bitmap.Lock();

public WbFb(WriteableBitmap bitmap)
// Avalonia v11 - https://github.com/AvaloniaUI/Avalonia/pull/11914
public IFramebufferRenderTarget CreateFramebufferRenderTarget() => new FuncFramebufferRenderTarget(Lock);

public WbFb(WriteableBitmap bitmap)
{
_bitmap = bitmap;
}
Expand Down Expand Up @@ -324,7 +327,8 @@ private static Bitmap CreateOverlayImage(Bitmap baseImage, Bitmap overlay, bool
{
var image = new WriteableBitmap(new PixelSize(16, 16), new Vector(96, 96), PixelFormat.Rgba8888, AlphaFormat.Unpremul);

using (var rt = AvaloniaLocator.Current.GetService<IPlatformRenderInterface>().CreateRenderTarget(new[] { new WbFb(image)})) {
// Avalonia 0.10 - https://github.com/AvaloniaUI/Avalonia/pull/11557
using (var rt = AvaloniaLocator.Current.GetService<IPlatformRenderInterface>().CreateRenderTarget(new[] { new WbFb(image)})) {

using (var ctx = rt.CreateDrawingContext(null)) {

Expand Down
11 changes: 9 additions & 2 deletions ILSpy.Core/OpenListDialog.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,15 @@ private void InitializeComponent()
createButton.Click += CreateButton_Click;
resetButton.Click += ResetButton_Click;

TemplateApplied += (sender, e) => Application.Current.FocusManager.Focus(listView);
// Avalonia v0.10
//// TemplateApplied += (sender, e) => Application.Current.FocusManager.Focus(listView);

TemplateApplied += (sender, e) => {
// Avalonia v11
var focusManager = TopLevel.GetTopLevel(listView).FocusManager;
focusManager.GetFocusedElement().Focus();
};

listView.TemplateApplied += listView_Loaded;
}

Expand Down Expand Up @@ -175,6 +183,5 @@ private void listView_MouseDoubleClick(object sender, RoutedEventArgs e)
//this.DialogResult = true;
this.Close(true);
}

}
}
110 changes: 77 additions & 33 deletions SharpTreeView/SharpTreeView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using Avalonia;
Expand Down Expand Up @@ -191,46 +192,89 @@ void UpdateFocusedNode(List<SharpTreeNode> newSelection, int topSelectedIndex)
}
}

protected override IItemContainerGenerator CreateItemContainerGenerator()
{
return new ItemContainerGenerator<SharpTreeViewItem>(
this,
SharpTreeViewItem.ContentProperty,
SharpTreeViewItem.ContentTemplateProperty);
}

protected override void OnContainersMaterialized(ItemContainerEventArgs e)
{
base.OnContainersMaterialized(e);
foreach (var item in e.Containers) {
var container = item.ContainerControl as SharpTreeViewItem;
container.ParentTreeView = this;
// Make sure that the line renderer takes into account the new bound data
if (container.NodeView != null) {
container.NodeView.LinesRenderer.InvalidateVisual();
}
}
}
// Avalonia v11 - Removing, not being referenced.. Should we use, CreateContainerForItemOverride()?
////[Obsolete("Marked for removal in Avalonia v12")]
////protected override IItemContainerGenerator CreateItemContainerGenerator()
////{
//// return new ItemContainerGenerator<SharpTreeViewItem>(
//// this,
//// SharpTreeViewItem.ContentProperty,
//// SharpTreeViewItem.ContentTemplateProperty);
////}

protected override void OnContainersRecycled(ItemContainerEventArgs e)
// NEW: Avalonia 11 (testing replacement for OnContainersMaterialized)
protected override void PrepareContainerForItemOverride(Control container, object item, int index)
{
base.OnContainersRecycled(e);
base.PrepareContainerForItemOverride(container, item, index);

foreach (var item in e.Containers)
// TODO: See PR 9677
var tvi = container as SharpTreeViewItem;
tvi.ParentTreeView = this;
if (tvi.NodeView != null)
{
var container = item.ContainerControl as SharpTreeViewItem;
container.ParentTreeView = this;
// Make sure that the line renderer takes into account the new bound data
if (container.NodeView != null)
{
container.NodeView.LinesRenderer.InvalidateVisual();
}
}
}
tvi.NodeView.LinesRenderer.InvalidateVisual();
}
}

// Avalonia v0.10 (PR 9677 - https://github.com/AvaloniaUI/Avalonia/pull/9677)
////protected override void OnContainersMaterialized(ItemContainerEventArgs e)
////{
//// base.OnContainersMaterialized(e);
//// foreach (var item in e.Containers) {
//// var container = item.ContainerControl as SharpTreeViewItem;
//// container.ParentTreeView = this;
//// // Make sure that the line renderer takes into account the new bound data
//// if (container.NodeView != null) {
//// container.NodeView.LinesRenderer.InvalidateVisual();
//// }
//// }
////}

// NEW: Avalonia 11 (testing replacement for OnContainersRecycled)
protected override void ClearContainerForItemOverride(Control element)
{
base.ClearContainerForItemOverride(element);
var tvi = element as SharpTreeViewItem;
tvi.ParentTreeView = this;
if (tvi.NodeView != null)
{
tvi.NodeView.LinesRenderer.InvalidateVisual();
}
}

// NEW: Avalonia 11 (testing replacement for OnContainersRecycled)
protected override void ContainerIndexChangedOverride(Control container, int oldIndex, int newIndex)
{
base.ContainerIndexChangedOverride(container, oldIndex, newIndex);
////var tvi = container as SharpTreeViewItem;
////tvi.ParentTreeView = this;
////if (tvi.NodeView != null)
////{
//// tvi.NodeView.LinesRenderer.InvalidateVisual();
////}
}

// OLD: Avalonia v0.10
////protected override void OnContainersRecycled(ItemContainerEventArgs e)
////{
//// base.OnContainersRecycled(e);
////
//// foreach (var item in e.Containers)
//// {
//// var container = item.ContainerControl as SharpTreeViewItem;
//// container.ParentTreeView = this;
//// // Make sure that the line renderer takes into account the new bound data
//// if (container.NodeView != null)
//// {
//// container.NodeView.LinesRenderer.InvalidateVisual();
//// }
//// }
////}

internal Control ContainerFromItem(object item)
{
int index = IndexOf(Items, item);
int index = ItemsView.IndexOf(item); // Avalonia v11
//// int index = IndexOf(Items, item); // Avalonia v0.10
if (index != -1) {
return ItemContainerGenerator.ContainerFromIndex(index);
}
Expand Down

0 comments on commit c6c65fd

Please sign in to comment.