Ejemplo n.º 1
0
        /// <summary>
        /// 사용자가 입력한 폰트 파일을 저장한다.
        /// </summary>
        /// <param name="fontFile"></param>
        /// <returns></returns>
        public static async Task InstallFont(StorageFile fontFile, ObservableCollection <KeyName> fontListSource, TappedEventHandler tapped)
        {
            var folder = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFolderAsync("Fonts", CreationCollisionOption.OpenIfExists);

            try
            {
                //폰트 복사(설치)
                var copy = await fontFile.CopyAsync(folder, Path.GetFileName(fontFile.Name), NameCollisionOption.FailIfExists);

                List <KeyName> addedFontList = new List <KeyName>();

                foreach (var fontItem in await GetFontItems(copy))
                {
                    fontItem.ItemTapped = tapped;
                    if (fontListSource != null)
                    {
                        if (!fontListSource.Any(x => x.Key == fontItem.Key))
                        {
                            var index = fontListSource.IndexOf(fontListSource.LastOrDefault(x => x.Name.CompareTo(fontItem.Name) < 0));
                            fontListSource.Insert(index + 1, fontItem);
                        }
                    }

                    if (FontList != null)
                    {
                        if (!FontList.Any(x => x.Key == fontItem.Key))
                        {
                            var index = FontList.IndexOf(FontList.Where(x => x.Type == FontTypes.App.ToString()).LastOrDefault(x => x.Name.CompareTo(fontItem.Name) < 0));
                            FontList.Insert(index + 1, fontItem);
                        }
                    }

                    if (!addedFontList.Contains(fontItem))
                    {
                        addedFontList.Add(fontItem);
                    }

                    if (fontItem.Payload is StorageFile)
                    {
                        var path = (fontItem.Payload as StorageFile).Path;
                        FontDAO.DeleteTempFont(new string[] { path });
                    }
                }

                //이벤트 처리
                if (FontFamilyListChanged != null)
                {
                    FontFamilyListChanged(FontList, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, addedFontList));
                }
            }
            catch (Exception) { }
        }
Ejemplo n.º 2
0
        public static async void LoadAllFont(Action complete)
        {
            if (FontList == null)
            {
                IsLoaded = false;
                FontList = new List <KeyName>();
            }

            //사용자 폰트
            var folder = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFolderAsync("Fonts", CreationCollisionOption.OpenIfExists);

            var files = await folder.GetFilesAsync();

            //삭제 대상 폰트
            var reservedDeletionFontList = FontDAO.GetTempFontList();

            //사용자폰트 로드
            foreach (var file in files.OrderBy(x => x.Name))
            {
                foreach (var fontItem in await GetFontItems(file))
                {
                    if (!FontList.Any(x => x.Key.ToString() == fontItem.Key.ToString()) && !reservedDeletionFontList.Any(x => x == (fontItem.Payload as StorageFile).Path))
                    {
                        FontList.Add(fontItem);
                        //System.Diagnostics.Debug.WriteLine($"모든 폰트 로드 : {fontItem.Key}");
                    }
                }
            }
            //기본값
            FontList.Add(new KeyName(FONT_FAMILY_DEFAUT, FONT_FAMILY_DEFAUT)
            {
                Type = FontTypes.OS.ToString()
            });
            //시스템 폰트
            IList <NativeHelper.Font> systemFontList = NativeHelper.FontList.GetSystemFontList("en-us");

            FontList.AddRange(systemFontList.Where(x => !IgnoreFonts.Contains(x.FamilyName) && !string.IsNullOrWhiteSpace(x.FamilyName))
                              .Select(x => new KeyName(x.FamilyName, x.FamilyName)
            {
                Type = FontTypes.OS.ToString()
            }));
            IsLoaded = true;

            complete?.Invoke();
        }
        /// <summary>フォント名称からFontInfoを取得します</summary>
        /// <param name="fontName">対象のフォント名</param>
        /// <returns></returns>
        /// <remarks>フォント名設定コンボボックスに表示されているフォント名称と合致するかを判定するので、引数の日本語/英語は考慮しなくて良い</remarks>
        private FontInfo GetFontInfoFromFontName(string fontName)
        {
            if (string.IsNullOrEmpty(fontName))
            {
                //todo:log
                return(null);
            }

            if (FontList == null || FontList.Any() == false)
            {
                //todo:log
                return(null);
            }

            FontInfo target = null;

            foreach (FontInfo fontInfo in FontList) //todo:高速化, 重複することないのでParallel等を検討
            {
                if (fontInfo == null)
                {
                    // ログを出せる情報がない
                    continue;
                }

                if (fontInfo.FontName.Equals(fontName))
                {
                    target = fontInfo;
                    break;
                }
            }

            if (target == null)
            {
                //todo:log
            }

            return(target);
        }