Skip to content

File icon improvements #1645

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Mar 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions CodeEdit.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -4700,7 +4700,7 @@
repositoryURL = "https://github.com/CodeEditApp/CodeEditSymbols";
requirement = {
kind = exactVersion;
version = 0.2.1;
version = 0.2.2;
};
};
287136B1292A407E00E9F5F4 /* XCRemoteSwiftPackageReference "SwiftLintPlugin" */ = {
Expand Down Expand Up @@ -4739,8 +4739,8 @@
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/CodeEditApp/CodeEditKit";
requirement = {
kind = upToNextMinorVersion;
minimumVersion = 0.1.0;
kind = exactVersion;
version = 0.1.1;
};
};
6C147C4329A329350089B630 /* XCRemoteSwiftPackageReference "swift-collections" */ = {
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"colors" : [
{
"color" : {
"color-space" : "display-p3",
"components" : {
"alpha" : "1.000",
"blue" : "0.176",
"green" : "0.303",
"red" : "0.956"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "display-p3",
"components" : {
"alpha" : "1.000",
"blue" : "0.376",
"green" : "0.475",
"red" : "0.960"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"colors" : [
{
"color" : {
"color-space" : "display-p3",
"components" : {
"alpha" : "1.000",
"blue" : "0.522",
"green" : "0.463",
"red" : "0.373"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "display-p3",
"components" : {
"alpha" : "1.000",
"blue" : "0.749",
"green" : "0.690",
"red" : "0.585"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
18 changes: 17 additions & 1 deletion CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFile.swift
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,23 @@ final class CEWorkspaceFile: Codable, Comparable, Hashable, Identifiable, Editor
let url: URL

/// Return the icon of the file as `Image`
var icon: Image { Image(systemName: systemImage) }
var icon: Image {
if let customImage = NSImage.symbol(named: systemImage) {
return Image(nsImage: customImage)
} else {
return Image(systemName: systemImage)
}
}

/// Return the icon of the file as `NSImage`
var nsIcon: NSImage {
if let customImage = NSImage.symbol(named: systemImage) {
return customImage
} else {
return NSImage(systemSymbolName: systemImage, accessibilityDescription: systemImage)
?? NSImage(systemSymbolName: "doc", accessibilityDescription: "doc")!
}
}

/// Returns a parent ``CEWorkspaceFile``.
///
Expand Down
153 changes: 114 additions & 39 deletions CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFileIcon.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,73 +12,129 @@ enum FileIcon {

// swiftlint:disable identifier_name
enum FileType: String {
case json
case js
case adb
case aif
case avi
case bash
case c
case cetheme
case clj
case cls
case cs
case css
case jsx
case swift
case d
case dart
case elm
case entitlements
case env
case ex
case example
case f95
case fs
case gitignore
case png
case jpg
case jpeg
case go
case gs
case h
case hs
case html
case ico
case svg
case entitlements
case plist
case java
case jl
case jpeg
case jpg
case js
case json
case jsx
case kt
case l
case LICENSE
case lock
case lsp
case lua
case m
case Makefile
case md
case txt = "text"
case rtf
case html
case mid
case mjs
case mk
case mod
case mov
case mp3
case mp4
case pas
case pdf
case pl
case plist
case png
case py
case resolved
case rb
case rs
case rtf
case scm
case scpt
case sh
case LICENSE
case java
case h
case m
case vue
case go
case ss
case strings
case sum
case mod
case Makefile
case svg
case swift
case ts
case rs
case tsx
case txt = "text"
case vue
case wav
case xcconfig
case yml
case zsh
}

// swiftlint:enable identifier_name

/// Returns a string describing a SFSymbol for files
/// If not specified otherwise this will return `"doc"`
static func fileIcon(fileType: FileType) -> String { // swiftlint:disable:this cyclomatic_complexity
static func fileIcon(fileType: FileType) -> String { // swiftlint:disable:this cyclomatic_complexity function_body_length line_length
switch fileType {
case .json, .js:
return "curlybraces"
case .json, .yml, .resolved:
return "doc.json"
case .lock:
return "lock.doc"
case .css:
return "number"
case .jsx:
return "curlybraces"
case .js, .mjs:
return "doc.javascript"
case .jsx, .tsx:
return "atom"
case .swift:
return "swift"
case .env, .example:
return "gearshape.fill"
case .gitignore:
return "arrow.triangle.branch"
case .png, .jpg, .jpeg, .ico:
case .pdf, .png, .jpg, .jpeg, .ico:
return "photo"
case .svg:
return "square.fill.on.circle.fill"
case .entitlements:
return "checkmark.seal"
case .plist:
return "tablecells"
case .md, .txt, .rtf:
case .md, .txt:
return "doc.plaintext"
case .html, .py, .sh:
case .rtf:
return "doc.richtext"
case .html:
return "chevron.left.forwardslash.chevron.right"
case .LICENSE:
return "key.fill"
case .java:
return "cup.and.saucer"
case .py:
return "doc.python"
case .rb:
return "doc.ruby"
case .strings:
return "text.quote"
case .h:
return "h.square"
case .m:
Expand All @@ -91,10 +147,23 @@ enum FileIcon {
return "s.square"
case .mod:
return "m.square"
case .Makefile:
case .bash, .sh, .Makefile, .zsh:
return "terminal"
case .rs:
return "r.square"
case .wav, .mp3, .aif, .mid:
return "speaker.wave.2"
case .avi, .mp4, .mov:
return "film"
case .scpt:
return "applescript"
case .xcconfig:
return "gearshape.2"
case .cetheme:
return "paintbrush"
case .adb, .clj, .cls, .cs, .d, .dart, .elm, .ex, .f95, .fs, .gs, .hs,
.jl, .kt, .l, .lsp, .lua, .mk, .pas, .pl, .scm, .ss:
return "doc.plaintext"
default:
return "doc"
}
Expand All @@ -106,14 +175,20 @@ enum FileIcon {
switch fileType {
case .swift, .html:
return .orange
case .java:
return .red
case .js, .entitlements, .json, .LICENSE:
return Color("SidebarYellow")
case .css, .ts, .jsx, .md, .py:
case .java, .jpg, .png, .svg, .ts:
return .blue
case .sh:
return .green
case .css:
return .teal
case .js, .mjs, .py, .entitlements, .LICENSE:
return Color("Amber")
case .json, .resolved, .rb, .strings, .yml:
return Color("Scarlet")
case .jsx, .tsx:
return .cyan
case .plist, .xcconfig, .sh:
return Color("Steel")
case .c, .cetheme:
return .purple
case .vue:
return Color(red: 0.255, green: 0.722, blue: 0.514, opacity: 1.0)
case .h:
Expand All @@ -129,7 +204,7 @@ enum FileIcon {
case .rs:
return .orange
default:
return .accentColor
return Color("Steel")
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,7 @@ final class PathBarMenuItem: NSMenuItem {
submenu = subMenu
color = NSColor(named: "FolderBlue") ?? NSColor(.secondary)
}
let image = NSImage(
systemSymbolName: icon,
accessibilityDescription: icon
)?.withSymbolConfiguration(.init(paletteColors: [color]))
let image = fileItem.nsIcon.withSymbolConfiguration(.init(paletteColors: [color]))
self.image = image
representedObject = fileItem
if fileItem.isFolder {
Expand Down
Loading