mirror of
https://github.com/sourcegit-scm/sourcegit
synced 2025-06-15 07:35:04 +00:00
feature: supports to load avatar from local image and save it to disk
Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
parent
25e272fa55
commit
f7c10d0b33
14 changed files with 145 additions and 31 deletions
|
@ -17,7 +17,7 @@ namespace SourceGit.Models
|
|||
{
|
||||
public interface IAvatarHost
|
||||
{
|
||||
void OnAvatarResourceChanged(string email);
|
||||
void OnAvatarResourceChanged(string email, Bitmap image);
|
||||
}
|
||||
|
||||
public partial class AvatarManager
|
||||
|
@ -119,7 +119,7 @@ namespace SourceGit.Models
|
|||
Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
_resources[email] = img;
|
||||
NotifyResourceChanged(email);
|
||||
NotifyResourceChanged(email, img);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -151,7 +151,7 @@ namespace SourceGit.Models
|
|||
if (File.Exists(localFile))
|
||||
File.Delete(localFile);
|
||||
|
||||
NotifyResourceChanged(email);
|
||||
NotifyResourceChanged(email, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -186,6 +186,37 @@ namespace SourceGit.Models
|
|||
return null;
|
||||
}
|
||||
|
||||
public void SetFromLocal(string email, string file)
|
||||
{
|
||||
try
|
||||
{
|
||||
Bitmap image = null;
|
||||
|
||||
using (var stream = File.OpenRead(file))
|
||||
{
|
||||
image = Bitmap.DecodeToWidth(stream, 128);
|
||||
}
|
||||
|
||||
if (image == null)
|
||||
return;
|
||||
|
||||
if (_resources.ContainsKey(email))
|
||||
_resources[email] = image;
|
||||
else
|
||||
_resources.Add(email, image);
|
||||
|
||||
_requesting.Remove(email);
|
||||
|
||||
var store = Path.Combine(_storePath, GetEmailHash(email));
|
||||
File.Copy(file, store, true);
|
||||
NotifyResourceChanged(email, image);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
|
||||
private void LoadDefaultAvatar(string key, string img)
|
||||
{
|
||||
var icon = AssetLoader.Open(new Uri($"avares://SourceGit/Resources/Images/{img}", UriKind.RelativeOrAbsolute));
|
||||
|
@ -203,12 +234,10 @@ namespace SourceGit.Models
|
|||
return builder.ToString();
|
||||
}
|
||||
|
||||
private void NotifyResourceChanged(string email)
|
||||
private void NotifyResourceChanged(string email, Bitmap image)
|
||||
{
|
||||
foreach (var avatar in _avatars)
|
||||
{
|
||||
avatar.OnAvatarResourceChanged(email);
|
||||
}
|
||||
avatar.OnAvatarResourceChanged(email, image);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
<x:String x:Key="Text.AssumeUnchanged" xml:space="preserve">ALS UNVERÄNDERT ANGENOMMENE DATEIEN</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Empty" xml:space="preserve">KEINE ALS UNVERÄNDERT ANGENOMMENEN DATEIEN</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Remove" xml:space="preserve">ENTFERNEN</x:String>
|
||||
<x:String x:Key="Text.Avatar.Refetch" xml:space="preserve">Aktualisieren</x:String>
|
||||
<x:String x:Key="Text.BinaryNotSupported" xml:space="preserve">BINÄRE DATEI NICHT UNTERSTÜTZT!!!</x:String>
|
||||
<x:String x:Key="Text.Bisect">Bisect</x:String>
|
||||
<x:String x:Key="Text.Bisect.Abort">Abbrechen</x:String>
|
||||
|
@ -550,7 +551,6 @@
|
|||
<x:String x:Key="Text.Rebase.AutoStash" xml:space="preserve">Lokale Änderungen stashen & wieder anwenden</x:String>
|
||||
<x:String x:Key="Text.Rebase.On" xml:space="preserve">Auf:</x:String>
|
||||
<x:String x:Key="Text.Rebase.Target" xml:space="preserve">Rebase:</x:String>
|
||||
<x:String x:Key="Text.RefetchAvatar" xml:space="preserve">Aktualisieren</x:String>
|
||||
<x:String x:Key="Text.Remote.AddTitle" xml:space="preserve">Remote hinzufügen</x:String>
|
||||
<x:String x:Key="Text.Remote.EditTitle" xml:space="preserve">Remote bearbeiten</x:String>
|
||||
<x:String x:Key="Text.Remote.Name" xml:space="preserve">Name:</x:String>
|
||||
|
|
|
@ -35,6 +35,8 @@
|
|||
<x:String x:Key="Text.AssumeUnchanged" xml:space="preserve">FILES ASSUME UNCHANGED</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Empty" xml:space="preserve">NO FILES ASSUMED AS UNCHANGED</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Remove" xml:space="preserve">REMOVE</x:String>
|
||||
<x:String x:Key="Text.Avatar.Load" xml:space="preserve">Load Image...</x:String>
|
||||
<x:String x:Key="Text.Avatar.Refetch" xml:space="preserve">Refresh</x:String>
|
||||
<x:String x:Key="Text.BinaryNotSupported" xml:space="preserve">BINARY FILE NOT SUPPORTED!!!</x:String>
|
||||
<x:String x:Key="Text.Bisect">Bisect</x:String>
|
||||
<x:String x:Key="Text.Bisect.Abort">Abort</x:String>
|
||||
|
@ -561,7 +563,6 @@
|
|||
<x:String x:Key="Text.Rebase.AutoStash" xml:space="preserve">Stash & reapply local changes</x:String>
|
||||
<x:String x:Key="Text.Rebase.On" xml:space="preserve">On:</x:String>
|
||||
<x:String x:Key="Text.Rebase.Target" xml:space="preserve">Rebase:</x:String>
|
||||
<x:String x:Key="Text.RefetchAvatar" xml:space="preserve">Refresh</x:String>
|
||||
<x:String x:Key="Text.Remote.AddTitle" xml:space="preserve">Add Remote</x:String>
|
||||
<x:String x:Key="Text.Remote.EditTitle" xml:space="preserve">Edit Remote</x:String>
|
||||
<x:String x:Key="Text.Remote.Name" xml:space="preserve">Name:</x:String>
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
<x:String x:Key="Text.AssumeUnchanged" xml:space="preserve">ARCHIVOS ASUMIDOS COMO SIN CAMBIOS</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Empty" xml:space="preserve">NO HAY ARCHIVOS ASUMIDOS COMO SIN CAMBIOS</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Remove" xml:space="preserve">REMOVER</x:String>
|
||||
<x:String x:Key="Text.Avatar.Refetch" xml:space="preserve">Refrescar</x:String>
|
||||
<x:String x:Key="Text.BinaryNotSupported" xml:space="preserve">¡ARCHIVO BINARIO NO SOPORTADO!</x:String>
|
||||
<x:String x:Key="Text.Bisect">Bisect</x:String>
|
||||
<x:String x:Key="Text.Bisect.Abort">Abortar</x:String>
|
||||
|
@ -565,7 +566,6 @@
|
|||
<x:String x:Key="Text.Rebase.AutoStash" xml:space="preserve">Stash & reaplicar cambios locales</x:String>
|
||||
<x:String x:Key="Text.Rebase.On" xml:space="preserve">En:</x:String>
|
||||
<x:String x:Key="Text.Rebase.Target" xml:space="preserve">Rebase:</x:String>
|
||||
<x:String x:Key="Text.RefetchAvatar" xml:space="preserve">Refrescar</x:String>
|
||||
<x:String x:Key="Text.Remote.AddTitle" xml:space="preserve">Añadir Remoto</x:String>
|
||||
<x:String x:Key="Text.Remote.EditTitle" xml:space="preserve">Editar Remoto</x:String>
|
||||
<x:String x:Key="Text.Remote.Name" xml:space="preserve">Nombre:</x:String>
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
<x:String x:Key="Text.AssumeUnchanged" xml:space="preserve">FICHIERS PRÉSUMÉS INCHANGÉS</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Empty" xml:space="preserve">PAS DE FICHIERS PRÉSUMÉS INCHANGÉS</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Remove" xml:space="preserve">SUPPRIMER</x:String>
|
||||
<x:String x:Key="Text.Avatar.Refetch" xml:space="preserve">Rafraîchir</x:String>
|
||||
<x:String x:Key="Text.BinaryNotSupported" xml:space="preserve">FICHIER BINAIRE NON SUPPORTÉ !!!</x:String>
|
||||
<x:String x:Key="Text.Blame" xml:space="preserve">Blâme</x:String>
|
||||
<x:String x:Key="Text.BlameTypeNotSupported" xml:space="preserve">LE BLÂME SUR CE FICHIER N'EST PAS SUPPORTÉ!!!</x:String>
|
||||
|
@ -532,7 +533,6 @@
|
|||
<x:String x:Key="Text.Rebase.AutoStash" xml:space="preserve">Stash & réappliquer changements locaux</x:String>
|
||||
<x:String x:Key="Text.Rebase.On" xml:space="preserve">Sur :</x:String>
|
||||
<x:String x:Key="Text.Rebase.Target" xml:space="preserve">Rebase :</x:String>
|
||||
<x:String x:Key="Text.RefetchAvatar" xml:space="preserve">Rafraîchir</x:String>
|
||||
<x:String x:Key="Text.Remote.AddTitle" xml:space="preserve">Ajouter dépôt distant</x:String>
|
||||
<x:String x:Key="Text.Remote.EditTitle" xml:space="preserve">Modifier dépôt distant</x:String>
|
||||
<x:String x:Key="Text.Remote.Name" xml:space="preserve">Nom :</x:String>
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
<x:String x:Key="Text.AssumeUnchanged" xml:space="preserve">FILE ASSUNTI COME INVARIATI</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Empty" xml:space="preserve">NESSUN FILE ASSUNTO COME INVARIATO</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Remove" xml:space="preserve">RIMUOVI</x:String>
|
||||
<x:String x:Key="Text.Avatar.Refetch" xml:space="preserve">Aggiorna</x:String>
|
||||
<x:String x:Key="Text.BinaryNotSupported" xml:space="preserve">FILE BINARIO NON SUPPORTATO!!!</x:String>
|
||||
<x:String x:Key="Text.Bisect" xml:space="preserve">Biseca</x:String>
|
||||
<x:String x:Key="Text.Bisect.Abort" xml:space="preserve">Annulla</x:String>
|
||||
|
@ -553,7 +554,6 @@
|
|||
<x:String x:Key="Text.Rebase.AutoStash" xml:space="preserve">Stasha e Riapplica modifiche locali</x:String>
|
||||
<x:String x:Key="Text.Rebase.On" xml:space="preserve">Su:</x:String>
|
||||
<x:String x:Key="Text.Rebase.Target" xml:space="preserve">Riallinea:</x:String>
|
||||
<x:String x:Key="Text.RefetchAvatar" xml:space="preserve">Aggiorna</x:String>
|
||||
<x:String x:Key="Text.Remote.AddTitle" xml:space="preserve">Aggiungi Remoto</x:String>
|
||||
<x:String x:Key="Text.Remote.EditTitle" xml:space="preserve">Modifica Remoto</x:String>
|
||||
<x:String x:Key="Text.Remote.Name" xml:space="preserve">Nome:</x:String>
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
<x:String x:Key="Text.AssumeUnchanged" xml:space="preserve">変更されていないとみなされるファイル</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Empty" xml:space="preserve">変更されていないとみなされるファイルはありません</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Remove" xml:space="preserve">削除</x:String>
|
||||
<x:String x:Key="Text.Avatar.Refetch" xml:space="preserve">更新</x:String>
|
||||
<x:String x:Key="Text.BinaryNotSupported" xml:space="preserve">バイナリファイルはサポートされていません!!!</x:String>
|
||||
<x:String x:Key="Text.Blame" xml:space="preserve">Blame</x:String>
|
||||
<x:String x:Key="Text.BlameTypeNotSupported" xml:space="preserve">BLAMEではこのファイルはサポートされていません!!!</x:String>
|
||||
|
@ -531,7 +532,6 @@
|
|||
<x:String x:Key="Text.Rebase.AutoStash" xml:space="preserve">ローカルの変更をスタッシュして再適用</x:String>
|
||||
<x:String x:Key="Text.Rebase.On" xml:space="preserve">On:</x:String>
|
||||
<x:String x:Key="Text.Rebase.Target" xml:space="preserve">リベース:</x:String>
|
||||
<x:String x:Key="Text.RefetchAvatar" xml:space="preserve">更新</x:String>
|
||||
<x:String x:Key="Text.Remote.AddTitle" xml:space="preserve">リモートを追加</x:String>
|
||||
<x:String x:Key="Text.Remote.EditTitle" xml:space="preserve">リモートを編集</x:String>
|
||||
<x:String x:Key="Text.Remote.Name" xml:space="preserve">名前:</x:String>
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
<x:String x:Key="Text.AssumeUnchanged" xml:space="preserve">ARQUIVOS CONSIDERADOS SEM ALTERAÇÕES</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Empty" xml:space="preserve">NENHUM ARQUIVO CONSIDERADO SEM ALTERAÇÕES</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Remove" xml:space="preserve">REMOVER</x:String>
|
||||
<x:String x:Key="Text.Avatar.Refetch" xml:space="preserve">Atualizar</x:String>
|
||||
<x:String x:Key="Text.BinaryNotSupported" xml:space="preserve">ARQUIVO BINÁRIO NÃO SUPORTADO!!!</x:String>
|
||||
<x:String x:Key="Text.Blame" xml:space="preserve">Blame</x:String>
|
||||
<x:String x:Key="Text.BlameTypeNotSupported" xml:space="preserve">BLAME NESTE ARQUIVO NÃO É SUPORTADO!!!</x:String>
|
||||
|
@ -488,7 +489,6 @@
|
|||
<x:String x:Key="Text.Rebase.AutoStash" xml:space="preserve">Guardar & reaplicar alterações locais</x:String>
|
||||
<x:String x:Key="Text.Rebase.On" xml:space="preserve">Em:</x:String>
|
||||
<x:String x:Key="Text.Rebase.Target" xml:space="preserve">Rebase:</x:String>
|
||||
<x:String x:Key="Text.RefetchAvatar" xml:space="preserve">Atualizar</x:String>
|
||||
<x:String x:Key="Text.Remote.AddTitle" xml:space="preserve">Adicionar Remoto</x:String>
|
||||
<x:String x:Key="Text.Remote.EditTitle" xml:space="preserve">Editar Remoto</x:String>
|
||||
<x:String x:Key="Text.Remote.Name" xml:space="preserve">Nome:</x:String>
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
<x:String x:Key="Text.AssumeUnchanged" xml:space="preserve">НЕОТСЛЕЖИВАЕМЫЕ ФАЙЛЫ</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Empty" xml:space="preserve">СПИСОК ПУСТ</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Remove" xml:space="preserve">УДАЛИТЬ</x:String>
|
||||
<x:String x:Key="Text.Avatar.Refetch" xml:space="preserve">Обновить</x:String>
|
||||
<x:String x:Key="Text.BinaryNotSupported" xml:space="preserve">ДВОИЧНЫЙ ФАЙЛ НЕ ПОДДЕРЖИВАЕТСЯ!!!</x:String>
|
||||
<x:String x:Key="Text.Bisect">Раздвоить</x:String>
|
||||
<x:String x:Key="Text.Bisect.Abort">О</x:String>
|
||||
|
@ -564,7 +565,6 @@
|
|||
<x:String x:Key="Text.Rebase.AutoStash" xml:space="preserve">Отложить и применить повторно локальные изменения</x:String>
|
||||
<x:String x:Key="Text.Rebase.On" xml:space="preserve">На:</x:String>
|
||||
<x:String x:Key="Text.Rebase.Target" xml:space="preserve">Переместить:</x:String>
|
||||
<x:String x:Key="Text.RefetchAvatar" xml:space="preserve">Обновить</x:String>
|
||||
<x:String x:Key="Text.Remote.AddTitle" xml:space="preserve">Добавить внешний репозиторий</x:String>
|
||||
<x:String x:Key="Text.Remote.EditTitle" xml:space="preserve">Редактировать внешний репозиторий</x:String>
|
||||
<x:String x:Key="Text.Remote.Name" xml:space="preserve">Имя:</x:String>
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
<x:String x:Key="Text.AssumeUnchanged" xml:space="preserve">கோப்புகள் மாற்றப்படவில்லை எனக் கருதப்படுகிறது</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Empty" xml:space="preserve">எந்த கோப்புகளும் மாற்றப்படவில்லை எனக் கருதப்படுகிறது</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Remove" xml:space="preserve">நீக்கு</x:String>
|
||||
<x:String x:Key="Text.Avatar.Refetch" xml:space="preserve">புதுப்பி</x:String>
|
||||
<x:String x:Key="Text.BinaryNotSupported" xml:space="preserve">இருமம் கோப்பு ஆதரிக்கப்படவில்லை!!!</x:String>
|
||||
<x:String x:Key="Text.Blame" xml:space="preserve">குற்றச்சாட்டு</x:String>
|
||||
<x:String x:Key="Text.BlameTypeNotSupported" xml:space="preserve">இந்த கோப்பில் குற்றம் சாட்ட ஆதரிக்கப்படவில்லை!!!</x:String>
|
||||
|
@ -531,7 +532,6 @@
|
|||
<x:String x:Key="Text.Rebase.AutoStash" xml:space="preserve">உள்ளக மாற்றங்களை பதுக்கிவை & மீண்டும் இடு</x:String>
|
||||
<x:String x:Key="Text.Rebase.On" xml:space="preserve">மேல்:</x:String>
|
||||
<x:String x:Key="Text.Rebase.Target" xml:space="preserve">மறுதளம்:</x:String>
|
||||
<x:String x:Key="Text.RefetchAvatar" xml:space="preserve">புதுப்பி</x:String>
|
||||
<x:String x:Key="Text.Remote.AddTitle" xml:space="preserve">தொலையைச் சேர்</x:String>
|
||||
<x:String x:Key="Text.Remote.EditTitle" xml:space="preserve">தொலையைத் திருத்து</x:String>
|
||||
<x:String x:Key="Text.Remote.Name" xml:space="preserve">பெயர்:</x:String>
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
<x:String x:Key="Text.AssumeUnchanged" xml:space="preserve">ФАЙЛИ, ЩО ВВАЖАЮТЬСЯ НЕЗМІНЕНИМИ</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Empty" xml:space="preserve">НЕМАЄ ФАЙЛІВ, ЩО ВВАЖАЮТЬСЯ НЕЗМІНЕНИМИ</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Remove" xml:space="preserve">ВИДАЛИТИ</x:String>
|
||||
<x:String x:Key="Text.Avatar.Refetch" xml:space="preserve">Оновити</x:String>
|
||||
<x:String x:Key="Text.BinaryNotSupported" xml:space="preserve">БІНАРНИЙ ФАЙЛ НЕ ПІДТРИМУЄТЬСЯ!!!</x:String>
|
||||
<x:String x:Key="Text.Blame" xml:space="preserve">Автор рядка</x:String>
|
||||
<x:String x:Key="Text.BlameTypeNotSupported" xml:space="preserve">ПОШУК АВТОРА РЯДКА ДЛЯ ЦЬОГО ФАЙЛУ НЕ ПІДТРИМУЄТЬСЯ!!!</x:String>
|
||||
|
@ -536,7 +537,6 @@
|
|||
<x:String x:Key="Text.Rebase.AutoStash" xml:space="preserve">Сховати та застосувати локальні зміни</x:String>
|
||||
<x:String x:Key="Text.Rebase.On" xml:space="preserve">На:</x:String>
|
||||
<x:String x:Key="Text.Rebase.Target" xml:space="preserve">Перебазувати:</x:String>
|
||||
<x:String x:Key="Text.RefetchAvatar" xml:space="preserve">Оновити</x:String>
|
||||
<x:String x:Key="Text.Remote.AddTitle" xml:space="preserve">Додати віддалене сховище</x:String>
|
||||
<x:String x:Key="Text.Remote.EditTitle" xml:space="preserve">Редагувати віддалене сховище</x:String>
|
||||
<x:String x:Key="Text.Remote.Name" xml:space="preserve">Назва:</x:String>
|
||||
|
|
|
@ -39,6 +39,8 @@
|
|||
<x:String x:Key="Text.AssumeUnchanged" xml:space="preserve">不跟踪更改的文件</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Empty" xml:space="preserve">没有不跟踪更改的文件</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Remove" xml:space="preserve">移除</x:String>
|
||||
<x:String x:Key="Text.Avatar.Load" xml:space="preserve">加载本地图片</x:String>
|
||||
<x:String x:Key="Text.Avatar.Refetch" xml:space="preserve">重新加载</x:String>
|
||||
<x:String x:Key="Text.BinaryNotSupported" xml:space="preserve">二进制文件不支持该操作!!!</x:String>
|
||||
<x:String x:Key="Text.Bisect">二分定位(bisect)</x:String>
|
||||
<x:String x:Key="Text.Bisect.Abort">终止</x:String>
|
||||
|
@ -565,7 +567,6 @@
|
|||
<x:String x:Key="Text.Rebase.AutoStash" xml:space="preserve">自动贮藏并恢复本地变更</x:String>
|
||||
<x:String x:Key="Text.Rebase.On" xml:space="preserve">目标提交 :</x:String>
|
||||
<x:String x:Key="Text.Rebase.Target" xml:space="preserve">分支 :</x:String>
|
||||
<x:String x:Key="Text.RefetchAvatar" xml:space="preserve">重新加载</x:String>
|
||||
<x:String x:Key="Text.Remote.AddTitle" xml:space="preserve">添加远程仓库</x:String>
|
||||
<x:String x:Key="Text.Remote.EditTitle" xml:space="preserve">编辑远程仓库</x:String>
|
||||
<x:String x:Key="Text.Remote.Name" xml:space="preserve">远程名 :</x:String>
|
||||
|
|
|
@ -39,6 +39,8 @@
|
|||
<x:String x:Key="Text.AssumeUnchanged" xml:space="preserve">不追蹤變更的檔案</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Empty" xml:space="preserve">沒有不追蹤變更的檔案</x:String>
|
||||
<x:String x:Key="Text.AssumeUnchanged.Remove" xml:space="preserve">移除</x:String>
|
||||
<x:String x:Key="Text.Avatar.Load" xml:space="preserve">載入本機圖片...</x:String>
|
||||
<x:String x:Key="Text.Avatar.Refetch" xml:space="preserve">重新載入</x:String>
|
||||
<x:String x:Key="Text.BinaryNotSupported" xml:space="preserve">二進位檔案不支援該操作!</x:String>
|
||||
<x:String x:Key="Text.Bisect">二分搜尋 (bisect)</x:String>
|
||||
<x:String x:Key="Text.Bisect.Abort">中止</x:String>
|
||||
|
@ -565,7 +567,6 @@
|
|||
<x:String x:Key="Text.Rebase.AutoStash" xml:space="preserve">自動擱置變更並復原本機變更</x:String>
|
||||
<x:String x:Key="Text.Rebase.On" xml:space="preserve">目標提交:</x:String>
|
||||
<x:String x:Key="Text.Rebase.Target" xml:space="preserve">分支:</x:String>
|
||||
<x:String x:Key="Text.RefetchAvatar" xml:space="preserve">重新載入</x:String>
|
||||
<x:String x:Key="Text.Remote.AddTitle" xml:space="preserve">新增遠端存放庫</x:String>
|
||||
<x:String x:Key="Text.Remote.EditTitle" xml:space="preserve">編輯遠端存放庫</x:String>
|
||||
<x:String x:Key="Text.Remote.Name" xml:space="preserve">遠端名稱:</x:String>
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
using System;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
|
||||
|
@ -8,6 +9,7 @@ using Avalonia.Controls;
|
|||
using Avalonia.Interactivity;
|
||||
using Avalonia.Media;
|
||||
using Avalonia.Media.Imaging;
|
||||
using Avalonia.Platform.Storage;
|
||||
|
||||
namespace SourceGit.Views
|
||||
{
|
||||
|
@ -24,16 +26,6 @@ namespace SourceGit.Views
|
|||
|
||||
public Avatar()
|
||||
{
|
||||
var refetch = new MenuItem() { Header = App.Text("RefetchAvatar") };
|
||||
refetch.Click += (_, _) =>
|
||||
{
|
||||
if (User != null)
|
||||
Models.AvatarManager.Instance.Request(User.Email, true);
|
||||
};
|
||||
|
||||
ContextMenu = new ContextMenu();
|
||||
ContextMenu.Items.Add(refetch);
|
||||
|
||||
RenderOptions.SetBitmapInterpolationMode(this, BitmapInterpolationMode.HighQuality);
|
||||
}
|
||||
|
||||
|
@ -102,11 +94,11 @@ namespace SourceGit.Views
|
|||
clip.Dispose();
|
||||
}
|
||||
|
||||
public void OnAvatarResourceChanged(string email)
|
||||
public void OnAvatarResourceChanged(string email, Bitmap image)
|
||||
{
|
||||
if (User.Email.Equals(email, StringComparison.Ordinal))
|
||||
{
|
||||
_img = Models.AvatarManager.Instance.Request(User.Email, false);
|
||||
_img = image;
|
||||
InvalidateVisual();
|
||||
}
|
||||
}
|
||||
|
@ -115,11 +107,13 @@ namespace SourceGit.Views
|
|||
{
|
||||
base.OnLoaded(e);
|
||||
Models.AvatarManager.Instance.Subscribe(this);
|
||||
ContextRequested += OnContextRequested;
|
||||
}
|
||||
|
||||
protected override void OnUnloaded(RoutedEventArgs e)
|
||||
{
|
||||
base.OnUnloaded(e);
|
||||
ContextRequested -= OnContextRequested;
|
||||
Models.AvatarManager.Instance.Unsubscribe(this);
|
||||
}
|
||||
|
||||
|
@ -138,6 +132,94 @@ namespace SourceGit.Views
|
|||
}
|
||||
}
|
||||
|
||||
private void OnContextRequested(object sender, ContextRequestedEventArgs e)
|
||||
{
|
||||
var toplevel = TopLevel.GetTopLevel(this);
|
||||
if (toplevel == null)
|
||||
{
|
||||
e.Handled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
var refetch = new MenuItem();
|
||||
refetch.Icon = App.CreateMenuIcon("Icons.Loading");
|
||||
refetch.Header = App.Text("Avatar.Refetch");
|
||||
refetch.Click += (_, ev) =>
|
||||
{
|
||||
if (User != null)
|
||||
Models.AvatarManager.Instance.Request(User.Email, true);
|
||||
|
||||
ev.Handled = true;
|
||||
};
|
||||
|
||||
var load = new MenuItem();
|
||||
load.Icon = App.CreateMenuIcon("Icons.Folder.Open");
|
||||
load.Header = App.Text("Avatar.Load");
|
||||
load.Click += async (_, ev) =>
|
||||
{
|
||||
var options = new FilePickerOpenOptions()
|
||||
{
|
||||
FileTypeFilter = [new FilePickerFileType("PNG") { Patterns = ["*.png"] }],
|
||||
AllowMultiple = false,
|
||||
};
|
||||
|
||||
var selected = await toplevel.StorageProvider.OpenFilePickerAsync(options);
|
||||
if (selected.Count == 1)
|
||||
{
|
||||
var localFile = selected[0].Path.LocalPath;
|
||||
Models.AvatarManager.Instance.SetFromLocal(User.Email, localFile);
|
||||
}
|
||||
|
||||
ev.Handled = true;
|
||||
};
|
||||
|
||||
var saveAs = new MenuItem();
|
||||
saveAs.Icon = App.CreateMenuIcon("Icons.Save");
|
||||
saveAs.Header = App.Text("SaveAs");
|
||||
saveAs.Click += async (_, ev) =>
|
||||
{
|
||||
var options = new FilePickerSaveOptions();
|
||||
options.Title = App.Text("SaveAs");
|
||||
options.DefaultExtension = ".png";
|
||||
options.FileTypeChoices = [new FilePickerFileType("PNG") { Patterns = ["*.png"] }];
|
||||
|
||||
var storageFile = await toplevel.StorageProvider.SaveFilePickerAsync(options);
|
||||
if (storageFile != null)
|
||||
{
|
||||
var saveTo = storageFile.Path.LocalPath;
|
||||
using (var writer = File.OpenWrite(saveTo))
|
||||
{
|
||||
if (_img != null)
|
||||
{
|
||||
_img.Save(writer);
|
||||
}
|
||||
else
|
||||
{
|
||||
var pixelSize = new PixelSize((int)Bounds.Width, (int)Bounds.Height);
|
||||
var dpi = new Vector(96, 96);
|
||||
|
||||
using (var rt = new RenderTargetBitmap(pixelSize, dpi))
|
||||
using (var ctx = rt.CreateDrawingContext())
|
||||
{
|
||||
this.Render(ctx);
|
||||
rt.Save(writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ev.Handled = true;
|
||||
};
|
||||
|
||||
var menu = new ContextMenu();
|
||||
menu.Items.Add(refetch);
|
||||
menu.Items.Add(load);
|
||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||
menu.Items.Add(saveAs);
|
||||
|
||||
menu.Open(this);
|
||||
}
|
||||
|
||||
private Bitmap _img = null;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue