yourtablecloth / TableCloth

식탁보 프로젝트
GNU Affero General Public License v3.0
883 stars 54 forks source link

즐겨찾기 기능 추가 PR #193

Closed atawLee closed 3 months ago

atawLee commented 3 months ago

https://github.com/yourtablecloth/TableCloth/issues/82 즐겨찾기 기능 구현

image image 위와 같이 즐겨찾기 기능을 추가했습니다.

SplashScreenLoadedCommand에서 json에 저장된 Favorite을 확인하여 Service 인스턴스에 추가로 부여합니다.

저장 기능은 CatalogPageItemFavoriteCommand를 위 favorite 버튼의 커맨드로 추가하였습니다.
위 커맨드 executeasync 에서 preferenceManager를 통해서 저장하는데, Json 저장시 길이가 짧아지는 경우 문제가 되어, OpenOrWrite에서 Create로 변경하였습니다.

즐겨찾기만 보는 기능은 CatalogPageViewModel에 OnFavoriteOnly 프로퍼티를 추가하여, SetProperty 발생시 CatalogPageLoadedCommand를 통해서 CatalogInternetService의

public static bool IsMatchedItem(object item, string filterText, bool isFavoriteOnly)
{
    var actualItem = item as CatalogInternetService;

    if (actualItem == null)
        return false;

    if (isFavoriteOnly && !actualItem.IsFavorite)
        return false;

    if (string.IsNullOrWhiteSpace(filterText))
        return true;

    var result = false;
    var splittedFilterText = filterText.Split(FilterTextSeparators, StringSplitOptions.RemoveEmptyEntries);

    foreach (var eachFilterText in splittedFilterText)
    {
        result |= actualItem.DisplayName.IndexOf(eachFilterText, StringComparison.OrdinalIgnoreCase) > (-1)
                  || actualItem.CategoryDisplayName.IndexOf(eachFilterText, StringComparison.OrdinalIgnoreCase) > (-1)
                  || actualItem.Url.IndexOf(eachFilterText, StringComparison.OrdinalIgnoreCase) > (-1)
                  || actualItem.Packages.Count.ToString().IndexOf(eachFilterText, StringComparison.OrdinalIgnoreCase) > (-1)
                  || actualItem.Packages.Any(x => x.Name.IndexOf(eachFilterText, StringComparison.OrdinalIgnoreCase) > (-1))
                  || actualItem.Id.IndexOf(eachFilterText, StringComparison.OrdinalIgnoreCase) > (-1)
                  || actualItem.GetSearchKeywords().Any(x => x.IndexOf(eachFilterText, StringComparison.OrdinalIgnoreCase) > (-1));
    }

    return result;
}

메서드로 오버로드하여 구현하였습니다. (기존 IsMatchedItem은 MainWindowViewModel 쪽에서 사용하고 있어서 오버로드로 구현하였습니다.)

테스트 코드는 저장 부분 로직 우선적으로 작성하였고, 기능은 전반적으로 확인 하였습니다

CLAassistant commented 3 months ago

CLA assistant check
All committers have signed the CLA.

rkttu commented 3 months ago

@atawLee 오랫동안 진행하지 못한 요청 사항이었는데 시간 내어 contribution을 진행해주셔서 정말 감사드립니다!