NetNewsWire/Shared/AppImage.swift

226 lines
7.9 KiB
Swift

//
// AppImage.swift
// NetNewsWire
//
// Created by Brent Simmons on 1/26/25.
// Copyright © 2025 Ranchero Software. All rights reserved.
//
#if os(macOS)
import AppKit
#elseif os(iOS)
import UIKit
#endif
import RSCore
import Account
struct AppImage {
// MARK: - Account
static func account(_ accountType: AccountType) -> RSImage? {
switch accountType {
case .onMyMac:
AppImage.accountLocal
case .cloudKit:
AppImage.accountCloudKit
case .feedbin:
AppImage.accountFeedbin
case .feedly:
AppImage.accountFeedly
case .freshRSS:
AppImage.accountFreshRSS
case .newsBlur:
AppImage.accountNewsBlur
case .inoreader:
AppImage.accountInoreader
case .bazQux:
AppImage.accountBazQux
case .theOldReader:
AppImage.accountTheOldReader
}
}
static var articleExtractorError = appImage("articleExtractorError")
static var articleExtractorOff = appImage("articleExtractorOff")
static var articleExtractorOn = appImage("articleExtractorOn")
static var faviconTemplate = appImage("faviconTemplateImage")
static var filterActive = systemImage("line.horizontal.3.decrease.circle.fill")
static var filterInactive = systemImage("line.horizontal.3.decrease.circle")
static var markAllAsRead = appImage("markAllAsRead")
static let nnwFeedIcon = RSImage(named: "nnwFeedIcon")!
static var share = systemImage("square.and.arrow.up")
static var starClosed = systemImage("star.fill")
static var starOpen = systemImage("star")
}
// MARK: - Mac
extension AppImage {
#if os(macOS)
static var addNewSidebarItem = systemImage("plus")
static var articleTheme = systemImage("doc.richtext")
static var cleanUp = systemImage("wind")
static var marsEditIcon = appImage("MarsEditIcon")
static var microblogIcon = appImage("MicroblogIcon")
static var nextUnread = systemImage("chevron.down.circle")
static var openInBrowser = systemImage("safari")
static var preferencesToolbarAccounts = systemImage("at")
static var preferencesToolbarAdvanced = systemImage("gearshape.2")
static var preferencesToolbarGeneral = systemImage("gearshape")
static var readClosed = systemImage("largecircle.fill.circle")
static var readOpen = systemImage("circle")
static var refresh = systemImage("arrow.clockwise")
static var timelineStarSelected = appImage("timelineStar").tinted(with: .white)
static var timelineStarUnselected = appImage("timelineStar").tinted(with: AppColor.star)
static var swipeMarkRead: RSImage = {
RSImage(systemSymbolName: "circle", accessibilityDescription: "Mark Read")!
.withSymbolConfiguration(.init(scale: .large))!
}()
static var swipeMarkUnread: RSImage = {
RSImage(systemSymbolName: "largecircle.fill.circle", accessibilityDescription: "Mark Unread")!
.withSymbolConfiguration(.init(scale: .large))!
}()
static var swipeMarkStarred: RSImage = {
RSImage(systemSymbolName: "star.fill", accessibilityDescription: "Star")!
.withSymbolConfiguration(.init(scale: .large))!
}()
static var swipeMarkUnstarred: RSImage = {
RSImage(systemSymbolName: "star", accessibilityDescription: "Unstar")!
.withSymbolConfiguration(.init(scale: .large))!
}()
// IconImages
static var searchFeed = IconImage(RSImage(named: NSImage.smartBadgeTemplateName)!, isSymbol: true, isBackgroundSuppressed: true)
// TODO: handle color palette change
static var starredFeed: IconImage = {
let image = systemImage("star.fill")
let preferredColor = AppColor.star
let coloredImage = image.tinted(with: preferredColor)
return IconImage(coloredImage, isSymbol: true, isBackgroundSuppressed: true, preferredColor: preferredColor.cgColor)
}()
static var todayFeed: IconImage = {
let image = systemImage("sun.max.fill")
let preferredColor = NSColor.orange
let coloredImage = image.tinted(with: preferredColor)
return IconImage(coloredImage, isSymbol: true, isBackgroundSuppressed: true, preferredColor: preferredColor.cgColor)
}()
static var unreadFeed: IconImage = {
let image = systemImage("largecircle.fill.circle")
let preferredColor = AppColor.accent
let coloredImage = image.tinted(with: preferredColor)
return IconImage(coloredImage, isSymbol: true, isBackgroundSuppressed: true, preferredColor: preferredColor.cgColor)
}()
static var folder: IconImage = {
let image = systemImage("folder")
let preferredColor = AppColor.accent
let coloredImage = image.tinted(with: preferredColor)
return IconImage(coloredImage, isSymbol: true, isBackgroundSuppressed: true, preferredColor: preferredColor.cgColor)
}()
#endif
}
// MARK: - iOS
extension AppImage {
#if os(iOS)
static var articleExtractorOffSF = systemImage("doc.plaintext")
static var articleExtractorOnSF = appImage("articleExtractorOnSF")
static var articleExtractorOffTinted = articleExtractorOff.tinted(color: AppColor.accent)!
static var articleExtractorOnTinted = articleExtractorOn.tinted(color: AppColor.accent)!
static var circleClosed = systemImage("largecircle.fill.circle")
static var circleOpen = systemImage("circle")
static var copy = systemImage("doc.on.doc")
static var deactivate = systemImage("minus.circle")
static var disclosure = appImage("disclosure")
static var edit = systemImage("square.and.pencil")
static var folderOutlinePlus = systemImage("folder.badge.plus")
static var info = systemImage("info.circle")
static var markBelowAsRead = systemImage("arrowtriangle.down.circle")
static var markAboveAsRead = systemImage("arrowtriangle.up.circle")
static var more = systemImage("ellipsis.circle")
static var nextArticle = systemImage("chevron.down")
static var nextUnreadArticle = systemImage("chevron.down.circle")
static var openInSidebar = systemImage("arrow.turn.down.left")
static var plus = systemImage("plus")
static var previousArticle = systemImage("chevron.up")
static var safari = systemImage("safari")
static var timelineStar = systemImage("star.fill").withTintColor(AppColor.star, renderingMode: .alwaysOriginal)
static var trash = systemImage("trash")
// IconImages
static var searchFeed = IconImage(systemImage("magnifyingglass"), isSymbol: true)
// TODO: handle color palette change
static var starredFeed: IconImage = {
let image = systemImage("star.fill")
return IconImage(image, isSymbol: true, isBackgroundSuppressed: true, preferredColor: AppColor.star.cgColor)
}()
static var todayFeed: IconImage = {
let image = systemImage("sun.max.fill")
return IconImage(image, isSymbol: true, isBackgroundSuppressed: true, preferredColor: UIColor.systemOrange.cgColor)
}()
static var unreadFeed: IconImage = {
let image = systemImage("largecircle.fill.circle")
return IconImage(image, isSymbol: true, isBackgroundSuppressed: true, preferredColor: AppColor.secondaryAccent.cgColor)
}()
static var folder: IconImage = {
let image = systemImage("folder.fill")
return IconImage(image, isSymbol: true, isBackgroundSuppressed: true, preferredColor: AppColor.secondaryAccent.cgColor)
}()
#endif
}
// MARK: - Private
private extension AppImage {
// MARK: - Account Images
static var accountBazQux = appImage("accountBazQux")
static var accountCloudKit = appImage("accountCloudKit")
static var accountFeedbin = appImage("accountFeedbin")
static var accountFeedly = appImage("accountFeedly")
static var accountFreshRSS = appImage("accountFreshRSS")
static var accountInoreader = appImage("accountInoreader")
static var accountNewsBlur = appImage("accountNewsBlur")
static var accountTheOldReader = appImage("accountTheOldReader")
#if os(macOS)
static var accountLocal = appImage("accountLocal")
#elseif os(iOS)
static var accountLocalPad = appImage("accountLocalPad")
static var accountLocalPhone = appImage("accountLocalPhone")
static var accountLocal = UIDevice.current.userInterfaceIdiom == .pad ? accountLocalPad : accountLocalPhone
#endif
static func appImage(_ name: String) -> RSImage {
RSImage(named: name)!
}
static func systemImage(_ name: String) -> RSImage {
#if os(macOS)
RSImage(systemSymbolName: name, accessibilityDescription: nil)!
#elseif os(iOS)
UIImage(systemName: name)!
#endif
}
}