Browse Source

Merge pull request #797 from jkoritzinsky/Save-WindowIcon

Added a method to save an icon to a stream. This enables the scenario…
pull/801/head
danwalmsley 10 years ago
committed by GitHub
parent
commit
4afe10a09a
  1. 20
      src/Android/Avalonia.Android/AndroidPlatform.cs
  2. 1
      src/Android/Avalonia.Android/Avalonia.Android.csproj
  3. 59
      src/Android/Avalonia.Android/PlatformIconLoader.cs
  4. 3
      src/Avalonia.Controls/Platform/IWindowIconImpl.cs
  5. 2
      src/Avalonia.Controls/WindowIcon.cs
  6. 6
      src/Gtk/Avalonia.Gtk/IconImpl.cs
  7. 16
      src/Windows/Avalonia.Win32/IconImpl.cs
  8. 36
      src/iOS/Avalonia.iOS/PlatformIconLoader.cs

20
src/Android/Avalonia.Android/AndroidPlatform.cs

@ -25,7 +25,7 @@ namespace Avalonia
namespace Avalonia.Android
{
public class AndroidPlatform : IPlatformSettings, IWindowingPlatform, IPlatformIconLoader
public class AndroidPlatform : IPlatformSettings, IWindowingPlatform
{
public static readonly AndroidPlatform Instance = new AndroidPlatform();
public Size DoubleClickSize => new Size(4, 4);
@ -50,7 +50,8 @@ namespace Avalonia.Android
.Bind<IPlatformSettings>().ToConstant(Instance)
.Bind<IPlatformThreadingInterface>().ToConstant(new AndroidThreadingInterface())
.Bind<ISystemDialogImpl>().ToTransient<SystemDialogImpl>()
.Bind<IWindowingPlatform>().ToConstant(Instance);
.Bind<IWindowingPlatform>().ToConstant(Instance)
.Bind<IPlatformIconLoader>().ToSingleton<PlatformIconLoader>();
SkiaPlatform.Initialize();
}
@ -74,20 +75,5 @@ namespace Avalonia.Android
{
throw new NotImplementedException();
}
public IWindowIconImpl LoadIcon(string fileName)
{
return null;
}
public IWindowIconImpl LoadIcon(Stream stream)
{
return null;
}
public IWindowIconImpl LoadIcon(IBitmapImpl bitmap)
{
return null;
}
}
}

1
src/Android/Avalonia.Android/Avalonia.Android.csproj

@ -63,6 +63,7 @@
<ItemGroup>
<Compile Include="AndroidPlatform.cs" />
<Compile Include="AndroidThreadingInterface.cs" />
<Compile Include="PlatformIconLoader.cs" />
<Compile Include="Platform\ClipboardImpl.cs" />
<Compile Include="CursorFactory.cs" />
<Compile Include="Platform\Input\AndroidKeyboardDevice.cs" />

59
src/Android/Avalonia.Android/PlatformIconLoader.cs

@ -0,0 +1,59 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Avalonia.Platform;
using System.IO;
namespace Avalonia.Android
{
class PlatformIconLoader : IPlatformIconLoader
{
public IWindowIconImpl LoadIcon(IBitmapImpl bitmap)
{
using (var stream = new MemoryStream())
{
bitmap.Save(stream);
return LoadIcon(stream);
}
}
public IWindowIconImpl LoadIcon(Stream stream)
{
return new FakeIcon(stream);
}
public IWindowIconImpl LoadIcon(string fileName)
{
using (var file = File.Open(fileName, FileMode.Open))
{
return new FakeIcon(file);
}
}
}
// Stores the icon created as a stream to support saving even though an icon is never shown
public class FakeIcon : IWindowIconImpl
{
private Stream stream = new MemoryStream();
public FakeIcon(Stream stream)
{
stream.CopyTo(this.stream);
}
public Stream Save()
{
var returnStream = new MemoryStream();
stream.CopyTo(returnStream);
return returnStream;
}
}
}

3
src/Avalonia.Controls/Platform/IWindowIconImpl.cs

@ -1,9 +1,12 @@
// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System.IO;
namespace Avalonia.Platform
{
public interface IWindowIconImpl
{
Stream Save();
}
}

2
src/Avalonia.Controls/WindowIcon.cs

@ -30,5 +30,7 @@ namespace Avalonia.Controls
}
public IWindowIconImpl PlatformImpl { get; }
public Stream Save() => PlatformImpl.Save();
}
}

6
src/Gtk/Avalonia.Gtk/IconImpl.cs

@ -5,6 +5,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Gdk;
using System.IO;
namespace Avalonia.Gtk
{
@ -16,5 +17,10 @@ namespace Avalonia.Gtk
}
public Pixbuf Pixbuf { get; }
public Stream Save()
{
return new MemoryStream(Pixbuf.SaveToBuffer("png"));
}
}
}

16
src/Windows/Avalonia.Win32/IconImpl.cs

@ -5,6 +5,8 @@ using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Drawing.Imaging;
namespace Avalonia.Win32
{
@ -24,5 +26,19 @@ namespace Avalonia.Win32
}
public IntPtr HIcon => icon?.Handle ?? bitmap.GetHicon();
public Stream Save()
{
var stream = new MemoryStream();
if (icon != null)
{
icon.Save(stream);
}
else
{
bitmap.Save(stream, ImageFormat.Png);
}
return stream;
}
}
}

36
src/iOS/Avalonia.iOS/PlatformIconLoader.cs

@ -1,7 +1,4 @@
using Avalonia.Platform;
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace Avalonia.iOS
@ -10,17 +7,42 @@ namespace Avalonia.iOS
{
public IWindowIconImpl LoadIcon(IBitmapImpl bitmap)
{
return null;
using (var stream = new MemoryStream())
{
bitmap.Save(stream);
return LoadIcon(stream);
}
}
public IWindowIconImpl LoadIcon(Stream stream)
{
return null;
return new FakeIcon(stream);
}
public IWindowIconImpl LoadIcon(string fileName)
{
return null;
using (var file = File.Open(fileName, FileMode.Open))
{
return new FakeIcon(file);
}
}
}
}
// Stores the icon created as a stream to support saving even though an icon is never shown
public class FakeIcon : IWindowIconImpl
{
private Stream stream = new MemoryStream();
public FakeIcon(Stream stream)
{
stream.CopyTo(this.stream);
}
public Stream Save()
{
var returnStream = new MemoryStream();
stream.CopyTo(returnStream);
return returnStream;
}
}
}
Loading…
Cancel
Save