diff --git a/Scripts/fix_libfido2_framework.sh b/Scripts/fix_libfido2_framework.sh new file mode 100755 index 0000000..d911106 --- /dev/null +++ b/Scripts/fix_libfido2_framework.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +# Fix libfido2.framework structure for macOS validation +# If this script is not run, the build will fail because xcodebuild is expecting the library in a specific structure +FRAMEWORK_PATH="${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Contents/Frameworks/libfido2.framework" + +if [ -d "$FRAMEWORK_PATH" ] && [ -f "$FRAMEWORK_PATH/Info.plist" ] && [ ! -d "$FRAMEWORK_PATH/Versions" ]; then + echo "Fixing libfido2.framework bundle structure..." + + # Create proper bundle structure + mkdir -p "$FRAMEWORK_PATH/Versions/A/Resources" + + # Move files to proper locations + mv "$FRAMEWORK_PATH/Info.plist" "$FRAMEWORK_PATH/Versions/A/Resources/" + mv "$FRAMEWORK_PATH/libfido2" "$FRAMEWORK_PATH/Versions/A/" + if [ -f "$FRAMEWORK_PATH/LICENSE" ]; then + mv "$FRAMEWORK_PATH/LICENSE" "$FRAMEWORK_PATH/Versions/A/" + fi + + # Create symbolic links + ln -sf A "$FRAMEWORK_PATH/Versions/Current" + ln -sf Versions/Current/libfido2 "$FRAMEWORK_PATH/libfido2" + ln -sf Versions/Current/Resources "$FRAMEWORK_PATH/Resources" + + echo "libfido2.framework structure fixed" +fi diff --git a/Xcodes.xcodeproj/project.pbxproj b/Xcodes.xcodeproj/project.pbxproj index 40a5932..abb6b13 100644 --- a/Xcodes.xcodeproj/project.pbxproj +++ b/Xcodes.xcodeproj/project.pbxproj @@ -139,6 +139,7 @@ E8DA461125FAF7FB002E85EF /* NotificationsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8DA461025FAF7FB002E85EF /* NotificationsView.swift */; }; E8E98A9025D8631800EC89A0 /* InstallationStepRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAFBC3FF259AC17F00E2A3D8 /* InstallationStepRowView.swift */; }; E8E98A9625D863D700EC89A0 /* InstallationStepDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8E98A9525D863D700EC89A0 /* InstallationStepDetailView.swift */; }; + E8EEAD1D2E79174F00BE67E8 /* XcodesIcon.icon in Resources */ = {isa = PBXBuildFile; fileRef = E8EEAD1C2E79174F00BE67E8 /* XcodesIcon.icon */; }; E8F44A1E296B4CD7002D6592 /* Path in Frameworks */ = {isa = PBXBuildFile; productRef = E8F44A1D296B4CD7002D6592 /* Path */; }; E8FA00542B5B109800769CE0 /* com.xcodesorg.xcodesapp.Helper in Copy Helper */ = {isa = PBXBuildFile; fileRef = CA9FF8AE2595967A00E47BAF /* com.xcodesorg.xcodesapp.Helper */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; E8FD5727291EE4AC001E004C /* AsyncNetworkService in Frameworks */ = {isa = PBXBuildFile; productRef = E8FD5726291EE4AC001E004C /* AsyncNetworkService */; }; @@ -341,6 +342,7 @@ E8D655BF288DD04700A139C2 /* SelectedActionType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectedActionType.swift; sourceTree = ""; }; E8DA461025FAF7FB002E85EF /* NotificationsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationsView.swift; sourceTree = ""; }; E8E98A9525D863D700EC89A0 /* InstallationStepDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstallationStepDetailView.swift; sourceTree = ""; }; + E8EEAD1C2E79174F00BE67E8 /* XcodesIcon.icon */ = {isa = PBXFileReference; lastKnownFileType = folder.iconcomposer.icon; path = XcodesIcon.icon; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -560,6 +562,7 @@ CABFAA1D2592F7F200380FEE /* Resources */ = { isa = PBXGroup; children = ( + E8EEAD1C2E79174F00BE67E8 /* XcodesIcon.icon */, CAA858DA25A3E11F00ACF8C0 /* aria2-release-1.35.0.tar.gz */, CAA8588025A2B63A00ACF8C0 /* aria2c */, CAA8588A25A2B69300ACF8C0 /* aria2c.LICENSE */, @@ -703,6 +706,7 @@ buildConfigurationList = CAD2E7BC2449575100113D76 /* Build configuration list for PBXNativeTarget "Xcodes" */; buildPhases = ( CAD2E79A2449574E00113D76 /* Sources */, + D971F84C2E79102E005F84C9 /* Fix libfido2 structure */, CAD2E79B2449574E00113D76 /* Frameworks */, CA9FF8292594F33200E47BAF /* Generate Acknowledgements */, CAD2E79C2449574E00113D76 /* Resources */, @@ -837,6 +841,7 @@ files = ( CAD2E7A92449575000113D76 /* Preview Assets.xcassets in Resources */, 9DD4FFCB2B13EC1800C974F1 /* Localizable.xcstrings in Resources */, + E8EEAD1D2E79174F00BE67E8 /* XcodesIcon.icon in Resources */, CA9FF83F2594FBC000E47BAF /* Licenses.rtf in Resources */, CAA858DB25A3E11F00ACF8C0 /* aria2-release-1.35.0.tar.gz in Resources */, CAD2E7A62449575000113D76 /* Assets.xcassets in Resources */, @@ -876,6 +881,24 @@ shellPath = /bin/sh; shellScript = "cd \"${SRCROOT}/Xcodes/AcknowledgementsGenerator\"\nxcrun -sdk macosx swift run AcknowledgementsGenerator \\\n -p \"${SRCROOT}/Xcodes.xcodeproj\" \\\n -o \"${SRCROOT}/Xcodes/Resources/Licenses.rtf\"\n"; }; + D971F84C2E79102E005F84C9 /* Fix libfido2 structure */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Fix libfido2 structure"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "${SRCROOT}/Scripts/fix_libfido2_framework.sh\n"; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -1092,7 +1115,8 @@ CA8FB636256E154800469DA5 /* Test */ = { isa = XCBuildConfiguration; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_APPICON_NAME = XcodesIcon; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY; CODE_SIGN_ENTITLEMENTS = Xcodes/Resources/XcodesTest.entitlements; CODE_SIGN_IDENTITY = "-"; @@ -1344,7 +1368,8 @@ CAD2E7BD2449575100113D76 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_APPICON_NAME = XcodesIcon; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY; CODE_SIGN_ENTITLEMENTS = Xcodes/Resources/Xcodes.entitlements; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; @@ -1372,7 +1397,8 @@ CAD2E7BE2449575100113D76 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_APPICON_NAME = XcodesIcon; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY; CODE_SIGN_ENTITLEMENTS = Xcodes/Resources/Xcodes.entitlements; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; diff --git a/Xcodes/Backend/AppState+Runtimes.swift b/Xcodes/Backend/AppState+Runtimes.swift index f9a9864..a0a0ba8 100644 --- a/Xcodes/Backend/AppState+Runtimes.swift +++ b/Xcodes/Backend/AppState+Runtimes.swift @@ -63,7 +63,8 @@ extension AppState { if selectedXcode.version > Version(major: 16, minor: 0, patch: 0) { if runtime.architectures?.isAppleSilicon ?? false { - if selectedXcode.version > Version(major: 26, minor: 0, patch: 0) { + // Need Xcode 26 but with some RC/Beta's its simpler to just to greater > 25 + if selectedXcode.version > Version(major: 25, minor: 0, patch: 0) { downloadRuntimeViaXcodeBuild(runtime: runtime) } else { // not supported diff --git a/Xcodes/Frontend/InfoPane/PlatformsView.swift b/Xcodes/Frontend/InfoPane/PlatformsView.swift index 9235870..6fe2134 100644 --- a/Xcodes/Frontend/InfoPane/PlatformsView.swift +++ b/Xcodes/Frontend/InfoPane/PlatformsView.swift @@ -35,21 +35,18 @@ struct PlatformsView: View { .frame(maxWidth: .infinity, alignment: .leading) if !architectures.isEmpty { Spacer() - Button { - switch selectedRuntimeArchitecture { - case .arm64: selectedRuntimeArchitecture = .x86_64 - case .x86_64: selectedRuntimeArchitecture = .arm64 - } - } label: { - switch selectedRuntimeArchitecture { - case .arm64: - Label(selectedRuntimeArchitecture.displayString, systemImage: "m4.button.horizontal") - .labelStyle(.trailingIcon) - case .x86_64: - Label(selectedRuntimeArchitecture.displayString, systemImage: "cpu.fill") - .labelStyle(.trailingIcon) + Picker("Architecture", selection: $selectedRuntimeArchitecture) { + ForEach(Architecture.allCases, id: \.self) { arch in + Label(arch.displayString, systemImage: arch.iconName) + .tag(arch) } + .labelStyle(.trailingIcon) } + .pickerStyle(.menu) + .menuStyle(.button) + .buttonStyle(.borderless) + .fixedSize() + .labelsHidden() } } diff --git a/Xcodes/Frontend/XcodeList/MainToolbar.swift b/Xcodes/Frontend/XcodeList/MainToolbar.swift index c4511de..b0ad763 100644 --- a/Xcodes/Frontend/XcodeList/MainToolbar.swift +++ b/Xcodes/Frontend/XcodeList/MainToolbar.swift @@ -22,60 +22,44 @@ struct MainToolbarModifier: ViewModifier { } .keyboardShortcut(KeyEquivalent("r")) .help("RefreshDescription") - Spacer() - - Button(action: { - switch architectures { - case .universal: architectures = .appleSilicon - case .appleSilicon: architectures = .universal - } - }) { - switch architectures { - case .universal: - Label("Universal", systemImage: "cpu.fill") - case .appleSilicon: - Label("Apple Silicon", systemImage: "m4.button.horizontal") - .labelStyle(.trailingIcon) - .foregroundColor(.accentColor) - } - } - .help("FilterAvailableDescription") - .disabled(architectures.isManaged) - Button(action: { - switch category { - case .all: category = .release - case .release: category = .beta - case .beta: category = .all + Spacer() + + let isFiltering = isInstalledOnly || category != .all || architectures != .universal + Menu("Filter", systemImage: "line.horizontal.3.decrease.circle") { + Section { + Toggle("Installed Only", systemImage: "arrow.down.app", isOn: $isInstalledOnly) .labelStyle(.titleAndIcon) } - }) { - switch category { - case .all: - Label("All", systemImage: "line.horizontal.3.decrease.circle") - case .release: + .help("FilterInstalledDescription") + + Section { + Picker("Category", selection: $category) { + Label("All", systemImage: "line.horizontal.3.decrease.circle") + .tag(XcodeListCategory.all) Label("ReleaseOnly", systemImage: "line.horizontal.3.decrease.circle.fill") - .labelStyle(.trailingIcon) + .tag(XcodeListCategory.release) + Label("BetaOnly", systemImage: "line.horizontal.3.decrease.circle.fill") + .tag(XcodeListCategory.beta) + } + } + .help("FilterAvailableDescription") + .disabled(category.isManaged) + + Section { + Picker("Architecture", selection: $architectures) { + Label("Universal", systemImage: "cpu.fill") + .tag(XcodeListArchitecture.universal) + Label("Apple Silicon", systemImage: "m4.button.horizontal") .foregroundColor(.accentColor) - case .beta: - Label("BetaOnly", systemImage: "line.horizontal.3.decrease.circle.fill") - .labelStyle(.trailingIcon) - .foregroundColor(.accentColor) + .tag(XcodeListArchitecture.appleSilicon) + } + .help("FilterArchitecturesDescription") + .disabled(architectures.isManaged) } + .labelStyle(.titleAndIcon) } - .help("FilterAvailableDescription") - .disabled(category.isManaged) - - Button(action: { - isInstalledOnly.toggle() - }) { - if isInstalledOnly { - Label("Filter", systemImage: "arrow.down.app.fill") - .foregroundColor(.accentColor) - } else { - Label("Filter", systemImage: "arrow.down.app") - } - } - .help("FilterInstalledDescription") + .pickerStyle(.inline) + .symbolVariant(isFiltering ? .fill : .none) } } } diff --git a/Xcodes/Resources/Localizable.xcstrings b/Xcodes/Resources/Localizable.xcstrings index 9d95df7..e6cc898 100644 --- a/Xcodes/Resources/Localizable.xcstrings +++ b/Xcodes/Resources/Localizable.xcstrings @@ -1547,7 +1547,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Are you sure you want to stop the installation of Xcode %@?" + "value" : "Tem certeza que deseja interromper a instalação do Xcode %@?" } }, "ru" : { @@ -1798,7 +1798,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Delete" + "value" : "Remover" } }, "ru" : { @@ -1923,7 +1923,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Are you sure you want to delete %@?" + "value" : "Tem certeza que deseja remover %@?" } }, "ru" : { @@ -2172,7 +2172,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Apple only supports downloading runtimes iOS 16.0+, watchOS 9.0+, tvOS 16+, visionOS 1.0+ with Xcode 16.1+. Please download, make active and try again." + "value" : "A Apple oferece suporte para download somente nos sistemas operacionais iOS 16.0+, watchOS 9.0+, tvOS 16+ e visionOS 1.0+ com Xcode 16.1+. Baixe, ative e tente novamente." } }, "ru" : { @@ -2297,7 +2297,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Apple supports downloading Apple Silicon runtimes only when Xcode 26+ is selected. Please Select and try downloading again or download the universal build." + "value" : "A Apple oferece suporte ao download de runtimes do Apple Silicon somente quando o Xcode 26+ estiver selecionado. Selecione e tente baixar novamente ou baixe a compilação universal." } }, "ru" : { @@ -3800,7 +3800,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Could not find file \"%@\"." + "value" : "Não foi possível encontrar o arquivo \"%@\"." } }, "ru" : { @@ -4910,7 +4910,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Authenticating" + "value" : "Autenticando" } }, "ru" : { @@ -6860,7 +6860,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Copy URL" + "value" : "Copiar URL" } }, "ru" : { @@ -6984,7 +6984,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Criar Symlink como Xcode.app" + "value" : "Criar link simbólico como Xcode.app" } }, "ru" : { @@ -7108,7 +7108,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Create Symlink as Xcode-Beta.app" + "value" : "Criar link simbólico como Xcode-Beta.app" } }, "ru" : { @@ -8719,7 +8719,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Error" + "value" : "Erro" } }, "ru" : { @@ -8838,7 +8838,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Experiments" + "value" : "Experimentos" } }, "ru" : { @@ -10810,7 +10810,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Install Apple Silicon" + "value" : "Instalar Apple Silicon" } }, "ru" : { @@ -10928,7 +10928,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Install Universal" + "value" : "Instalar Universal" } }, "ru" : { @@ -13428,7 +13428,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Install Directory" + "value" : "Diretório de instalação" } }, "ru" : { @@ -13676,7 +13676,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Xcodes searches and installs to a single directory. By default (and recommended) is to keep this /Applications. Any changes to where Xcode is stored may result in other apps/services to stop working. " + "value" : "Xcodes procura e instala em um diretório único. Por padrão (e recomendado) é mantido no /Applications. Qualquer mudança onde o Xcode é instalado pode resultar na falha de outros aplicativos/serviços." } }, "ru" : { @@ -13919,7 +13919,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Licensa" + "value" : "Licença" } }, "ru" : { @@ -15529,7 +15529,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Requerir uma nova funcionalidade" + "value" : "Solicitar uma nova funcionalidade" } }, "ru" : { @@ -15653,7 +15653,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Misc" + "value" : "Diversos" } }, "ru" : { @@ -16890,7 +16890,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Sua conta não possui nenhum telefone confiável, mas é necessário para autenticação de dois fatores.\n\nVer https://support.apple.com/en-ca/HT204915." + "value" : "Sua conta não possui nenhum telefone confiável, mas é necessário para autenticação de dois fatores.\n\nVeja https://support.apple.com/en-ca/HT204915." } }, "ru" : { @@ -17382,7 +17382,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "On select, will keep the name as the version eg. Xcode-13.4.1.app" + "value" : "Quando selecionado, será mantido o nome com a versão ex. Xcode-13.4.1.app" } }, "ru" : { @@ -17868,7 +17868,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Open In Rosetta" + "value" : "Abrir com Rosetta" } }, "ru" : { @@ -18234,7 +18234,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Perform post-install steps" + "value" : "Executar passos pós-instalação" } }, "ru" : { @@ -18482,7 +18482,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "PIN not set" + "value" : "PIN não definido" } }, "ru" : { @@ -18506,7 +18506,7 @@ "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "PIN not set" + "value" : "没有设置 PIN" } }, "zh-Hant" : { @@ -18606,7 +18606,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Platforms" + "value" : "Plataformas" } }, "ru" : { @@ -18730,7 +18730,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Installed Platforms" + "value" : "Plataformas instaladas" } }, "ru" : { @@ -18855,7 +18855,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Below are a list of platforms that are installed on this machine. " + "value" : "Abaixo contém uma lista de plataformas que estão instalada nesse computador." } }, "ru" : { @@ -20581,7 +20581,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Insert your physical security key and enter the PIN" + "value" : "Insira sua chave de segurança física e digite o PIN" } }, "ru" : { @@ -20706,7 +20706,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Touch your security key to verify that it’s you" + "value" : "Toque na sua chave de segurança para verificar que é você" } }, "ru" : { @@ -21315,7 +21315,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Mostrar opçao abrir com Rosetta" + "value" : "Mostrar opção abrir com Rosetta" } }, "ru" : { @@ -22061,7 +22061,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Support Xcodes" + "value" : "Ajude o Xcodes" } }, "ru" : { @@ -22185,7 +22185,7 @@ "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Terminate App after last window is closed" + "value" : "Encerrar o aplicativo quando a ultima janela for fechada" } }, "ru" : { diff --git a/Xcodes/Resources/XcodesIcon.icon/Assets/Dark.png b/Xcodes/Resources/XcodesIcon.icon/Assets/Dark.png new file mode 100644 index 0000000..3244844 Binary files /dev/null and b/Xcodes/Resources/XcodesIcon.icon/Assets/Dark.png differ diff --git a/Xcodes/Resources/XcodesIcon.icon/Assets/Light.png b/Xcodes/Resources/XcodesIcon.icon/Assets/Light.png new file mode 100644 index 0000000..c8728f9 Binary files /dev/null and b/Xcodes/Resources/XcodesIcon.icon/Assets/Light.png differ diff --git a/Xcodes/Resources/XcodesIcon.icon/Assets/Mono.png b/Xcodes/Resources/XcodesIcon.icon/Assets/Mono.png new file mode 100644 index 0000000..e151de3 Binary files /dev/null and b/Xcodes/Resources/XcodesIcon.icon/Assets/Mono.png differ diff --git a/Xcodes/Resources/XcodesIcon.icon/icon.json b/Xcodes/Resources/XcodesIcon.icon/icon.json new file mode 100644 index 0000000..b3cadb6 --- /dev/null +++ b/Xcodes/Resources/XcodesIcon.icon/icon.json @@ -0,0 +1,50 @@ +{ + "fill" : { + "automatic-gradient" : "extended-srgb:0.00000,0.47843,1.00000,1.00000" + }, + "groups" : [ + { + "layers" : [ + { + "glass" : false, + "hidden" : false, + "image-name-specializations" : [ + { + "value" : "Light.png" + }, + { + "appearance" : "dark", + "value" : "Dark.png" + }, + { + "appearance" : "tinted", + "value" : "Mono.png" + } + ], + "name" : "Dark", + "position" : { + "scale" : 1, + "translation-in-points" : [ + 0, + 0 + ] + } + } + ], + "shadow" : { + "kind" : "neutral", + "opacity" : 0.5 + }, + "specular" : false, + "translucency" : { + "enabled" : false, + "value" : 0.5 + } + } + ], + "supported-platforms" : { + "squares" : [ + "macOS" + ] + } +} \ No newline at end of file diff --git a/Xcodes/XcodesKit/Sources/XcodesKit/Models/XcodeReleases/Architecture.swift b/Xcodes/XcodesKit/Sources/XcodesKit/Models/XcodeReleases/Architecture.swift index eb3ab40..834ebee 100644 --- a/Xcodes/XcodesKit/Sources/XcodesKit/Models/XcodeReleases/Architecture.swift +++ b/Xcodes/XcodesKit/Sources/XcodesKit/Models/XcodeReleases/Architecture.swift @@ -8,7 +8,7 @@ import Foundation /// The name of an Architecture. -public enum Architecture: String, Codable, Equatable, Hashable, Identifiable { +public enum Architecture: String, Codable, Equatable, Hashable, Identifiable, CaseIterable { public var id: Self { self } /// The Arm64 architecture (Apple Silicon) @@ -24,6 +24,15 @@ public enum Architecture: String, Codable, Equatable, Hashable, Identifiable { return "Intel" } } + + public var iconName: String { + switch self { + case .arm64: + return "m4.button.horizontal" + case .x86_64: + return "cpu.fill" + } + } } extension Array where Element == Architecture {