1
0
Fork 0

feat: imagegen2 아이콘·글리프·일러스트 생성 후 GUI 전면 적용 (투명 배경)

codex noninteractive + imagegen2로 앱 비주얼 에셋 일괄 생성, 코드 생성 차단
(gen-one.sh: FORBID 블록 + 코드파일 감지 + 재시도). 모든 산출물은
플러드필 배경 제거로 진짜 알파 투명 PNG화.

생성 에셋 (assets-gen/):
- app-master: 앱 아이콘 마스터 (사이클 화살표, 솔리드 타일 유지)
- 카테고리 글리프 8종: image/video/audio/document/data/vector/archive/ai
- 일러스트 2종: illus-empty(드롭존), illus-done(완료)
- logo-mark: 브랜드 마크

GUI 적용:
- 사이드바 헤더 브랜드 → logo-mark
- 드롭존 빈 상태 → illus-empty
- QuickProgressWindow 완료 → illus-done
- AI 작업 패널 → glyph-ai 스파클
- 큐/과거결과 행 라벨 아이콘 → 카테고리 글리프 (CategoryGlyphs 매핑)
- 미리보기 placeholder → 형식별 카테고리 글리프 (경고 대신)

앱 아이콘:
- app.ico (멀티 크기 16~256) + 윈도우 Icon
- MSIX 타일 4종(Square44/150·Wide310·Store) app-master 기반 갱신
- Package 버전 1.0.2.0
This commit is contained in:
Yun Chan 2026-06-01 22:00:42 +09:00
parent ef10c139cd
commit acb3fdbfd1
37 changed files with 189 additions and 34 deletions

View file

@ -0,0 +1,63 @@
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace Everything2Everything.App.Views;
/// <summary>
/// 파일 확장자 → 카테고리 글리프(imagegen2 생성 PNG) 매핑.
/// 큐 행·미리보기 placeholder 등에서 형식을 한눈에 보여주기 위해 사용한다.
/// </summary>
public static class CategoryGlyphs
{
private static readonly Dictionary<string, string> ExtToCategory = new(StringComparer.OrdinalIgnoreCase)
{
// image
[".jpg"] = "image", [".jpeg"] = "image", [".jpe"] = "image", [".png"] = "image",
[".webp"] = "image", [".avif"] = "image", [".bmp"] = "image", [".tif"] = "image",
[".tiff"] = "image", [".gif"] = "image", [".heic"] = "image", [".heif"] = "image",
[".cr2"] = "image", [".nef"] = "image", [".arw"] = "image", [".dng"] = "image", [".raw"] = "image",
// vector
[".svg"] = "vector", [".eps"] = "vector", [".ai"] = "vector",
// video
[".mp4"] = "video", [".webm"] = "video", [".mkv"] = "video", [".mov"] = "video", [".avi"] = "video",
// audio
[".mp3"] = "audio", [".aac"] = "audio", [".m4a"] = "audio", [".opus"] = "audio",
[".ogg"] = "audio", [".flac"] = "audio", [".wav"] = "audio",
// document
[".pdf"] = "document", [".docx"] = "document", [".doc"] = "document",
[".hwp"] = "document", [".hwpx"] = "document", [".html"] = "document", [".htm"] = "document",
[".md"] = "document", [".txt"] = "document", [".rtf"] = "document",
// data
[".csv"] = "data", [".json"] = "data", [".xlsx"] = "data", [".xls"] = "data",
[".tsv"] = "data", [".xml"] = "data", [".yaml"] = "data", [".yml"] = "data",
// archive
[".zip"] = "archive", [".7z"] = "archive", [".rar"] = "archive",
[".tar"] = "archive", [".gz"] = "archive",
};
private static readonly Dictionary<string, ImageSource> Cache = new(StringComparer.OrdinalIgnoreCase);
/// <summary>확장자(.jpg 등)에 해당하는 카테고리 글리프 이미지. 매핑이 없으면 document로 폴백.</summary>
public static ImageSource ForExtension(string? extension)
{
var ext = string.IsNullOrWhiteSpace(extension) ? "" : extension.Trim();
if (ext.Length > 0 && ext[0] != '.') ext = "." + ext;
var category = ExtToCategory.TryGetValue(ext, out var c) ? c : "document";
return ForCategory(category);
}
/// <summary>카테고리명(image/video/audio/document/data/vector/archive/ai)에 해당하는 글리프.</summary>
public static ImageSource ForCategory(string category)
{
if (Cache.TryGetValue(category, out var cached)) return cached;
var uri = new Uri($"pack://application:,,,/Assets/glyph-{category}.png", UriKind.Absolute);
var img = new BitmapImage();
img.BeginInit();
img.CacheOption = BitmapCacheOption.OnLoad;
img.UriSource = uri;
img.EndInit();
img.Freeze();
Cache[category] = img;
return img;
}
}