mirror of
https://github.com/neon443/ShhShell.git
synced 2026-03-11 05:19:13 +00:00
added changing app icons
added setappicon function
This commit is contained in:
36
Resources/Assets.xcassets/beta.appiconset/Contents.json
Normal file
36
Resources/Assets.xcassets/beta.appiconset/Contents.json
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "ShhShell 1.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"platform" : "ios",
|
||||||
|
"size" : "1024x1024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "dark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"idiom" : "universal",
|
||||||
|
"platform" : "ios",
|
||||||
|
"size" : "1024x1024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "tinted"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"idiom" : "universal",
|
||||||
|
"platform" : "ios",
|
||||||
|
"size" : "1024x1024"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Resources/Assets.xcassets/beta.appiconset/ShhShell 1.png
Normal file
BIN
Resources/Assets.xcassets/beta.appiconset/ShhShell 1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 124 KiB |
@@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "ShhShell Blueprint@2x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"platform" : "ios",
|
||||||
|
"size" : "1024x1024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "dark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"idiom" : "universal",
|
||||||
|
"platform" : "ios",
|
||||||
|
"size" : "1024x1024"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "tinted"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"idiom" : "universal",
|
||||||
|
"platform" : "ios",
|
||||||
|
"size" : "1024x1024"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 558 KiB |
|
Before Width: | Height: | Size: 253 KiB After Width: | Height: | Size: 253 KiB |
@@ -1030,8 +1030,10 @@
|
|||||||
A92538BC2DEE06DE007E0A18 /* Debug */ = {
|
A92538BC2DEE06DE007E0A18 /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = "beta betaBlueprint";
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = regular;
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
|
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = ShhShell/ShhShell.entitlements;
|
CODE_SIGN_ENTITLEMENTS = ShhShell/ShhShell.entitlements;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = "$(BUILD)";
|
CURRENT_PROJECT_VERSION = "$(BUILD)";
|
||||||
@@ -1068,8 +1070,10 @@
|
|||||||
A92538BD2DEE06DE007E0A18 /* Release */ = {
|
A92538BD2DEE06DE007E0A18 /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = "beta betaBlueprint";
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = regular;
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
|
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = ShhShell/ShhShell.entitlements;
|
CODE_SIGN_ENTITLEMENTS = ShhShell/ShhShell.entitlements;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = "$(BUILD)";
|
CURRENT_PROJECT_VERSION = "$(BUILD)";
|
||||||
|
|||||||
@@ -47,6 +47,17 @@ class HostsManager: ObservableObject, @unchecked Sendable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setAppIcon() {
|
||||||
|
Task { @MainActor in
|
||||||
|
guard UIApplication.shared.supportsAlternateIcons else { return }
|
||||||
|
guard settings.appIcon.name != "regular" else {
|
||||||
|
UIApplication.shared.setAlternateIconName(nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
UIApplication.shared.setAlternateIconName("\(settings.appIcon.name)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func loadSettings() {
|
func loadSettings() {
|
||||||
guard let data = userDefaults.data(forKey: "settings") else { return }
|
guard let data = userDefaults.data(forKey: "settings") else { return }
|
||||||
guard let decoded = try? JSONDecoder().decode(AppSettings.self, from: data) else { return }
|
guard let decoded = try? JSONDecoder().decode(AppSettings.self, from: data) else { return }
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import Foundation
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
struct AppSettings: Codable, Sendable, Equatable {
|
struct AppSettings: Codable, Sendable, Equatable {
|
||||||
var scrollback: CGFloat = 1_000
|
var scrollback: CGFloat = 10_000
|
||||||
var cursorStyle: CursorStyle = .block
|
var cursorStyle: CursorStyle = .block
|
||||||
var locationPersist: Bool = false
|
var locationPersist: Bool = false
|
||||||
var bellSound: Bool = false
|
var bellSound: Bool = false
|
||||||
@@ -19,25 +19,62 @@ struct AppSettings: Codable, Sendable, Equatable {
|
|||||||
var appIcon: AppIcon = .regular
|
var appIcon: AppIcon = .regular
|
||||||
}
|
}
|
||||||
|
|
||||||
enum CursorStyle: Codable, CaseIterable, Equatable {
|
enum CursorStyle: Codable, CaseIterable, Equatable, CustomStringConvertible {
|
||||||
case block
|
case block
|
||||||
case bar
|
case bar
|
||||||
|
|
||||||
|
var description: String {
|
||||||
|
switch self {
|
||||||
|
case .block:
|
||||||
|
return "Block"
|
||||||
|
case .bar:
|
||||||
|
return "Bar"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum TerminalFilter: Codable, CaseIterable, Equatable {
|
enum TerminalFilter: Codable, CaseIterable, Equatable, CustomStringConvertible {
|
||||||
case none
|
case none
|
||||||
case crt
|
case crt
|
||||||
|
|
||||||
|
var description: String {
|
||||||
|
switch self {
|
||||||
|
case .none:
|
||||||
|
return "None"
|
||||||
|
case .crt:
|
||||||
|
return "CRT"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum AppIcon: Codable, CaseIterable, Equatable {
|
enum AppIcon: Codable, CaseIterable, Equatable, CustomStringConvertible {
|
||||||
case regular
|
case regular
|
||||||
case beta
|
case beta
|
||||||
case betaBlueprint
|
case betaBlueprint
|
||||||
|
|
||||||
var image: Image {
|
var image: Image {
|
||||||
|
return Image(self.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
var name: String {
|
||||||
switch self {
|
switch self {
|
||||||
case .regular, .beta, .betaBlueprint:
|
case .regular:
|
||||||
Image("\(self)")
|
return "regular"
|
||||||
|
case .beta:
|
||||||
|
return "beta"
|
||||||
|
case .betaBlueprint:
|
||||||
|
return "betaBlueprint"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var description: String {
|
||||||
|
switch self {
|
||||||
|
case .regular:
|
||||||
|
return "Default"
|
||||||
|
case .beta:
|
||||||
|
return "Beta"
|
||||||
|
case .betaBlueprint:
|
||||||
|
return "Beta Blueprint"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ struct SettingsView: View {
|
|||||||
|
|
||||||
Picker("Cursor", selection: $hostsManager.settings.cursorStyle) {
|
Picker("Cursor", selection: $hostsManager.settings.cursorStyle) {
|
||||||
ForEach(CursorStyle.allCases, id: \.self) { type in
|
ForEach(CursorStyle.allCases, id: \.self) { type in
|
||||||
Text("\(type)").tag(type)
|
Text(type.description).tag(type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.pickerStyle(.inline)
|
.pickerStyle(.inline)
|
||||||
@@ -48,7 +48,7 @@ struct SettingsView: View {
|
|||||||
|
|
||||||
Picker("terminal filter", selection: $hostsManager.settings.filter) {
|
Picker("terminal filter", selection: $hostsManager.settings.filter) {
|
||||||
ForEach(TerminalFilter.allCases, id: \.self) { filter in
|
ForEach(TerminalFilter.allCases, id: \.self) { filter in
|
||||||
Text("\(filter)").tag(filter)
|
Text(filter.description).tag(filter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.pickerStyle(.inline)
|
.pickerStyle(.inline)
|
||||||
@@ -68,7 +68,7 @@ struct SettingsView: View {
|
|||||||
.clipShape(RoundedRectangle(cornerRadius: 16.5))
|
.clipShape(RoundedRectangle(cornerRadius: 16.5))
|
||||||
.padding(5)
|
.padding(5)
|
||||||
Spacer()
|
Spacer()
|
||||||
Text("\(icon)").tag(icon)
|
Text(icon.description).tag(icon)
|
||||||
.font(.callout)
|
.font(.callout)
|
||||||
.padding(5)
|
.padding(5)
|
||||||
.padding(.bottom, 5)
|
.padding(.bottom, 5)
|
||||||
@@ -77,7 +77,10 @@ struct SettingsView: View {
|
|||||||
}
|
}
|
||||||
.frame(maxWidth: 85)
|
.frame(maxWidth: 85)
|
||||||
.onTapGesture {
|
.onTapGesture {
|
||||||
withAnimation { hostsManager.settings.appIcon = icon }
|
withAnimation {
|
||||||
|
hostsManager.settings.appIcon = icon
|
||||||
|
hostsManager.setAppIcon()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user