This commit is contained in:
anciltech 2025-09-23 10:41:34 +02:00 committed by GitHub
commit 80dd8fa9f4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 635 additions and 110 deletions

View file

@ -3,10 +3,12 @@
archiveVersion = 1;
classes = {
};
objectVersion = 54;
objectVersion = 90;
objects = {
/* Begin PBXBuildFile section */
05AB7F172E76C96E007C5CFE /* XcodeMajorVersionRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05AB7F162E76C96E007C5CFE /* XcodeMajorVersionRow.swift */; };
05AB7F192E76CD8C007C5CFE /* XcodeMinorVersionRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05AB7F182E76CD8C007C5CFE /* XcodeMinorVersionRow.swift */; };
15F5B8902CCF09B900705E2F /* CryptoKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15F5B88F2CCF09B900705E2F /* CryptoKit.framework */; };
33027E342CA8C18800CB387C /* LibFido2Swift in Frameworks */ = {isa = PBXBuildFile; productRef = 334A932B2CA885A400A5E079 /* LibFido2Swift */; };
3328073F2CA5E2C80036F691 /* SignInSecurityKeyPinView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3328073E2CA5E2C80036F691 /* SignInSecurityKeyPinView.swift */; };
@ -165,39 +167,36 @@
/* Begin PBXCopyFilesBuildPhase section */
CA9FF8AC2595967A00E47BAF /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = /usr/share/man/man1/;
dstSubfolderSpec = 0;
dstSubfolder = None;
files = (
);
runOnlyForDeploymentPostprocessing = 1;
};
CA9FF8BB259596B500E47BAF /* Copy Helper */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = Contents/Library/LaunchServices;
dstSubfolderSpec = 1;
dstSubfolder = Wrapper;
files = (
E8FA00542B5B109800769CE0 /* com.xcodesorg.xcodesapp.Helper in Copy Helper */,
);
name = "Copy Helper";
runOnlyForDeploymentPostprocessing = 0;
};
CAA8589225A2B76F00ACF8C0 /* Copy aria2c */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 6;
dstSubfolder = Executables;
files = (
E8CBDB8927ADE32300B22292 /* unxip in Copy aria2c */,
CAA8589325A2B77E00ACF8C0 /* aria2c in Copy aria2c */,
);
name = "Copy aria2c";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
05AB7F162E76C96E007C5CFE /* XcodeMajorVersionRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XcodeMajorVersionRow.swift; sourceTree = "<group>"; };
05AB7F182E76CD8C007C5CFE /* XcodeMinorVersionRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XcodeMinorVersionRow.swift; sourceTree = "<group>"; };
15F5B88F2CCF09B900705E2F /* CryptoKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CryptoKit.framework; path = System/Library/Frameworks/CryptoKit.framework; sourceTree = SDKROOT; };
3328073E2CA5E2C80036F691 /* SignInSecurityKeyPinView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInSecurityKeyPinView.swift; sourceTree = "<group>"; };
332807402CA5EA820036F691 /* SignInSecurityKeyTouchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInSecurityKeyTouchView.swift; sourceTree = "<group>"; };
@ -348,14 +347,11 @@
/* Begin PBXFrameworksBuildPhase section */
CA9FF8AB2595967A00E47BAF /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
CAD2E79B2449574E00113D76 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
15F5B8902CCF09B900705E2F /* CryptoKit.framework in Frameworks */,
33027E342CA8C18800CB387C /* LibFido2Swift in Frameworks */,
@ -373,15 +369,12 @@
E84E4F572B335094003F3959 /* OrderedCollections in Frameworks */,
E8F44A1E296B4CD7002D6592 /* Path in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
CAD2E7B02449575100113D76 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
CAC28188259EE27200B8AB0B /* CombineExpectations in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
@ -489,6 +482,8 @@
CA44901E2463AD34003D8213 /* Tag.swift */,
CAE42486259A68A300B8B246 /* XcodeListCategory.swift */,
CAD2E7A32449574E00113D76 /* XcodeListView.swift */,
05AB7F162E76C96E007C5CFE /* XcodeMajorVersionRow.swift */,
05AB7F182E76CD8C007C5CFE /* XcodeMinorVersionRow.swift */,
CAFFFED7259CDA5000903F81 /* XcodeListViewRow.swift */,
E8D0296E284B029800647641 /* BottomStatusBar.swift */,
);
@ -694,8 +689,6 @@
);
buildRules = (
);
dependencies = (
);
name = com.xcodesorg.xcodesapp.Helper;
productName = com.robotsandpencils.XcodesApp.Helper;
productReference = CA9FF8AE2595967A00E47BAF /* com.xcodesorg.xcodesapp.Helper */;
@ -706,6 +699,7 @@
buildConfigurationList = CAD2E7BC2449575100113D76 /* Build configuration list for PBXNativeTarget "Xcodes" */;
buildPhases = (
CAD2E79A2449574E00113D76 /* Sources */,
05EACA532E76D21100CF1F9D /* Fix libfido2 structure */,
CAD2E79B2449574E00113D76 /* Frameworks */,
CA9FF8292594F33200E47BAF /* Generate Acknowledgements */,
CAD2E79C2449574E00113D76 /* Resources */,
@ -765,8 +759,9 @@
CAD2E7962449574E00113D76 /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
LastSwiftUpdateCheck = 1220;
LastUpgradeCheck = 1140;
LastUpgradeCheck = 2600;
ORGANIZATIONNAME = "Robots and Pencils";
TargetAttributes = {
CA9FF8AD2595967A00E47BAF = {
@ -782,7 +777,6 @@
};
};
buildConfigurationList = CAD2E7992449574E00113D76 /* Build configuration list for PBXProject "Xcodes" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
@ -823,6 +817,7 @@
E83FDC422CBB649100679C6B /* XCRemoteSwiftPackageReference "Sparkle" */,
33027E282CA8BB5800CB387C /* XCRemoteSwiftPackageReference "LibFido2Swift" */,
);
preferredProjectObjectVersion = 90;
productRefGroup = CAD2E79F2449574E00113D76 /* Products */;
projectDirPath = "";
projectRoot = "";
@ -837,7 +832,6 @@
/* Begin PBXResourcesBuildPhase section */
CAD2E79C2449574E00113D76 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
CAD2E7A92449575000113D76 /* Preview Assets.xcassets in Resources */,
9DD4FFCB2B13EC1800C974F1 /* Localizable.xcstrings in Resources */,
@ -846,47 +840,56 @@
CAA858DB25A3E11F00ACF8C0 /* aria2-release-1.35.0.tar.gz in Resources */,
CAD2E7A62449575000113D76 /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
CAD2E7B12449575100113D76 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
CA452BC1259FDDFE0072DFA4 /* Stub-version.plist in Resources */,
CA452BEB25A236500072DFA4 /* Stub-0.0.0.Info.plist in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
05EACA532E76D21100CF1F9D /* Fix libfido2 structure */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
name = "Fix libfido2 structure";
shellPath = /bin/sh;
shellScript = (
"./Scripts/fix_libfido2_framework.sh",
"",
"",
);
};
CA9FF8292594F33200E47BAF /* Generate Acknowledgements */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"$(SRCROOT)/Xcodes.xcodeproj",
"$(SRCROOT)/**/*.LICENSE",
);
name = "Generate Acknowledgements";
outputFileListPaths = (
);
outputPaths = (
"$(SRCROOT)/Xcodes/Resources/Licenses.rtf",
);
runOnlyForDeploymentPostprocessing = 0;
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";
shellScript = (
"cd \"${SRCROOT}/Xcodes/AcknowledgementsGenerator\"",
"xcrun -sdk macosx swift run AcknowledgementsGenerator \\",
" -p \"${SRCROOT}/Xcodes.xcodeproj\" \\",
" -o \"${SRCROOT}/Xcodes/Resources/Licenses.rtf\"",
"",
"",
"",
"",
"",
);
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
CA9FF8AA2595967A00E47BAF /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
CA9FF8D025959A9700E47BAF /* HelperXPCShared.swift in Sources */,
CA42DD7325AEB04300BC0B0C /* Logger.swift in Sources */,
@ -895,17 +898,16 @@
CA9FF8B12595967A00E47BAF /* main.swift in Sources */,
CA9FF8E025959BAA00E47BAF /* ConnectionVerifier.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
CAD2E79A2449574E00113D76 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
CA9FF8CF25959A9700E47BAF /* HelperXPCShared.swift in Sources */,
CA735109257BF96D00EA9CF8 /* AttributedText.swift in Sources */,
CAFBDC4E2599B33D003DCC5A /* MainToolbar.swift in Sources */,
CA11E7BA2598476C00D2EE1C /* XcodeCommands.swift in Sources */,
CAA8589B25A2B83000ACF8C0 /* Aria2CError.swift in Sources */,
05AB7F192E76CD8C007C5CFE /* XcodeMinorVersionRow.swift in Sources */,
536CFDD2263C94DE00026CE0 /* SignedInView.swift in Sources */,
CABFAA492593162500380FEE /* Bundle+InfoPlistValues.swift in Sources */,
CA9FF8662595130600E47BAF /* View+IsHidden.swift in Sources */,
@ -944,6 +946,7 @@
CA452BB0259FD9770072DFA4 /* ProgressIndicator.swift in Sources */,
B0403CF02AD92D7B00137C09 /* ReleaseNotesView.swift in Sources */,
CAFE4AB425B7D3AF0064FE51 /* AdvancedPreferencePane.swift in Sources */,
05AB7F172E76C96E007C5CFE /* XcodeMajorVersionRow.swift in Sources */,
CA9FF84E2595079F00E47BAF /* ScrollingTextView.swift in Sources */,
E832EAF82B0FBCF4001B570D /* RuntimeInstallationStepDetailView.swift in Sources */,
CABFA9C12592EEEA00380FEE /* Version+.swift in Sources */,
@ -1001,18 +1004,15 @@
CA39711924495F0E00AFFB77 /* AppStoreButtonStyle.swift in Sources */,
CA9FF88125955C7000E47BAF /* AvailableXcode.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
CAD2E7AF2449575100113D76 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
CAC281E7259FA45A00B8AB0B /* Environment+Mock.swift in Sources */,
CAC281E2259FA44600B8AB0B /* Bundle+XcodesTests.swift in Sources */,
CA2518EC25A7FF2B00F08414 /* AppStateUpdateTests.swift in Sources */,
CAB3AB0E25BCA6C200BF1B04 /* AppStateTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
@ -1030,10 +1030,11 @@
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
CA8FB635256E154800469DA5 /* Test */ = {
CA8FB635256E154800469DA5 /* Test configuration for PBXProject "Xcodes" */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
@ -1057,6 +1058,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@ -1065,9 +1067,12 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY;
COPY_PHASE_STRIP = NO;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = ZU6GR6B2FY;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
@ -1088,13 +1093,14 @@
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Test;
};
CA8FB636256E154800469DA5 /* Test */ = {
CA8FB636256E154800469DA5 /* Test configuration for PBXNativeTarget "Xcodes" */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = XcodesIcon;
@ -1104,9 +1110,10 @@
CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES;
DEAD_CODE_STRIPPING = YES;
CURRENT_PROJECT_VERSION = 34;
DEVELOPMENT_ASSET_PATHS = "\"Xcodes/Preview Content\"";
DEVELOPMENT_TEAM = "";
DEVELOPMENT_TEAM = ZU6GR6B2FY;
ENABLE_HARDENED_RUNTIME = NO;
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = Xcodes/Resources/Info.plist;
@ -1124,14 +1131,14 @@
};
name = Test;
};
CA8FB637256E154800469DA5 /* Test */ = {
CA8FB637256E154800469DA5 /* Test configuration for PBXNativeTarget "XcodesTests" */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = "";
INFOPLIST_FILE = XcodesTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@ -1148,13 +1155,14 @@
};
name = Test;
};
CA9FF8B22595967A00E47BAF /* Debug */ = {
CA9FF8B22595967A00E47BAF /* Debug configuration for PBXNativeTarget "com.xcodesorg.xcodesapp.Helper" */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY;
CODE_SIGN_STYLE = Automatic;
CREATE_INFOPLIST_SECTION_IN_BINARY = YES;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = ZU6GR6B2FY;
ENABLE_HARDENED_RUNTIME = YES;
INFOPLIST_FILE = "$(SRCROOT)/$(TARGET_NAME)/Info.plist";
@ -1173,7 +1181,7 @@
};
name = Debug;
};
CA9FF8B32595967A00E47BAF /* Test */ = {
CA9FF8B32595967A00E47BAF /* Test configuration for PBXNativeTarget "com.xcodesorg.xcodesapp.Helper" */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
@ -1181,7 +1189,8 @@
CODE_SIGN_ENTITLEMENTS = com.xcodesorg.xcodesapp.Helper/com.xcodesorg.xcodesapp.HelperTest.entitlements;
CODE_SIGN_STYLE = Manual;
CREATE_INFOPLIST_SECTION_IN_BINARY = YES;
DEVELOPMENT_TEAM = "";
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = ZU6GR6B2FY;
ENABLE_HARDENED_RUNTIME = NO;
INFOPLIST_FILE = "$(SRCROOT)/$(TARGET_NAME)/Info.plist";
MARKETING_VERSION = 2.0.0;
@ -1200,7 +1209,7 @@
};
name = Test;
};
CA9FF8B42595967A00E47BAF /* Release */ = {
CA9FF8B42595967A00E47BAF /* Release configuration for PBXNativeTarget "com.xcodesorg.xcodesapp.Helper" */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
@ -1208,6 +1217,7 @@
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CREATE_INFOPLIST_SECTION_IN_BINARY = YES;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = ZU6GR6B2FY;
ENABLE_HARDENED_RUNTIME = YES;
INFOPLIST_FILE = "$(SRCROOT)/$(TARGET_NAME)/Info.plist";
@ -1226,10 +1236,11 @@
};
name = Release;
};
CAD2E7BA2449575100113D76 /* Debug */ = {
CAD2E7BA2449575100113D76 /* Debug configuration for PBXProject "Xcodes" */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
@ -1253,6 +1264,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@ -1261,9 +1273,12 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY;
COPY_PHASE_STRIP = NO;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = ZU6GR6B2FY;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
@ -1284,16 +1299,18 @@
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
CAD2E7BB2449575100113D76 /* Release */ = {
CAD2E7BB2449575100113D76 /* Release configuration for PBXProject "Xcodes" */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
@ -1317,6 +1334,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@ -1325,9 +1343,12 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGNING_SUBJECT_ORGANIZATIONAL_UNIT = ZU6GR6B2FY;
COPY_PHASE_STRIP = NO;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = ZU6GR6B2FY;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@ -1341,13 +1362,14 @@
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = macosx;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OPTIMIZATION_LEVEL = "-O";
};
name = Release;
};
CAD2E7BD2449575100113D76 /* Debug */ = {
CAD2E7BD2449575100113D76 /* Debug configuration for PBXNativeTarget "Xcodes" */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = XcodesIcon;
@ -1357,6 +1379,7 @@
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
DEAD_CODE_STRIPPING = YES;
CURRENT_PROJECT_VERSION = 34;
DEVELOPMENT_ASSET_PATHS = "\"Xcodes/Preview Content\"";
DEVELOPMENT_TEAM = ZU6GR6B2FY;
@ -1376,7 +1399,7 @@
};
name = Debug;
};
CAD2E7BE2449575100113D76 /* Release */ = {
CAD2E7BE2449575100113D76 /* Release configuration for PBXNativeTarget "Xcodes" */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = XcodesIcon;
@ -1386,6 +1409,7 @@
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
DEAD_CODE_STRIPPING = YES;
CURRENT_PROJECT_VERSION = 34;
DEVELOPMENT_ASSET_PATHS = "\"Xcodes/Preview Content\"";
DEVELOPMENT_TEAM = ZU6GR6B2FY;
@ -1405,13 +1429,13 @@
};
name = Release;
};
CAD2E7C02449575100113D76 /* Debug */ = {
CAD2E7C02449575100113D76 /* Debug configuration for PBXNativeTarget "XcodesTests" */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = ZU6GR6B2FY;
INFOPLIST_FILE = XcodesTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@ -1427,14 +1451,14 @@
};
name = Debug;
};
CAD2E7C12449575100113D76 /* Release */ = {
CAD2E7C12449575100113D76 /* Release configuration for PBXNativeTarget "XcodesTests" */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
BUNDLE_LOADER = "$(TEST_HOST)";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = ZU6GR6B2FY;
INFOPLIST_FILE = XcodesTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
@ -1456,41 +1480,37 @@
CA9FF8B52595967A00E47BAF /* Build configuration list for PBXNativeTarget "com.xcodesorg.xcodesapp.Helper" */ = {
isa = XCConfigurationList;
buildConfigurations = (
CA9FF8B22595967A00E47BAF /* Debug */,
CA9FF8B32595967A00E47BAF /* Test */,
CA9FF8B42595967A00E47BAF /* Release */,
CA9FF8B22595967A00E47BAF /* Debug configuration for PBXNativeTarget "com.xcodesorg.xcodesapp.Helper" */,
CA9FF8B32595967A00E47BAF /* Test configuration for PBXNativeTarget "com.xcodesorg.xcodesapp.Helper" */,
CA9FF8B42595967A00E47BAF /* Release configuration for PBXNativeTarget "com.xcodesorg.xcodesapp.Helper" */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
CAD2E7992449574E00113D76 /* Build configuration list for PBXProject "Xcodes" */ = {
isa = XCConfigurationList;
buildConfigurations = (
CAD2E7BA2449575100113D76 /* Debug */,
CA8FB635256E154800469DA5 /* Test */,
CAD2E7BB2449575100113D76 /* Release */,
CAD2E7BA2449575100113D76 /* Debug configuration for PBXProject "Xcodes" */,
CA8FB635256E154800469DA5 /* Test configuration for PBXProject "Xcodes" */,
CAD2E7BB2449575100113D76 /* Release configuration for PBXProject "Xcodes" */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
CAD2E7BC2449575100113D76 /* Build configuration list for PBXNativeTarget "Xcodes" */ = {
isa = XCConfigurationList;
buildConfigurations = (
CAD2E7BD2449575100113D76 /* Debug */,
CA8FB636256E154800469DA5 /* Test */,
CAD2E7BE2449575100113D76 /* Release */,
CAD2E7BD2449575100113D76 /* Debug configuration for PBXNativeTarget "Xcodes" */,
CA8FB636256E154800469DA5 /* Test configuration for PBXNativeTarget "Xcodes" */,
CAD2E7BE2449575100113D76 /* Release configuration for PBXNativeTarget "Xcodes" */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
CAD2E7BF2449575100113D76 /* Build configuration list for PBXNativeTarget "XcodesTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
CAD2E7C02449575100113D76 /* Debug */,
CA8FB637256E154800469DA5 /* Test */,
CAD2E7C12449575100113D76 /* Release */,
CAD2E7C02449575100113D76 /* Debug configuration for PBXNativeTarget "XcodesTests" */,
CA8FB637256E154800469DA5 /* Test configuration for PBXNativeTarget "XcodesTests" */,
CAD2E7C12449575100113D76 /* Release configuration for PBXNativeTarget "XcodesTests" */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict/>
</plist>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1220"
LastUpgradeVersion = "2600"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1500"
LastUpgradeVersion = "2600"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"

View file

@ -139,6 +139,12 @@ class AppState: ObservableObject {
}
}
@Published var collapsableListEnabled = true {
didSet {
Current.defaults.set(collapsableListEnabled, forKey: "collapsableListEnabled")
}
}
// MARK: - Runtimes
@Published var downloadableRuntimes: [DownloadableRuntime] = []
@ -209,6 +215,7 @@ class AppState: ObservableObject {
installPath = Current.defaults.string(forKey: "installPath") ?? Path.defaultInstallDirectory.string
showOpenInRosettaOption = Current.defaults.bool(forKey: "showOpenInRosettaOption") ?? false
terminateAfterLastWindowClosed = Current.defaults.bool(forKey: "terminateAfterLastWindowClosed") ?? false
collapsableListEnabled = Current.defaults.bool(forKey: "collapsibleListEnabled") ?? true
}
// MARK: Timer

View file

@ -85,5 +85,97 @@ struct Xcode: Identifiable, CustomStringConvertible {
return nil
}
}
}
struct XcodeMinorVersionGroup: Identifiable {
let majorVersion: Int
let minorVersion: Int
let versions: [Xcode]
var isExpanded: Bool = false
var id: String {
"\(majorVersion).\(minorVersion)"
}
var latestRelease: Xcode? {
versions
.filter { $0.version.isNotPrerelease }
.sorted { $0.version < $1.version }
.last
}
var displayName: String {
"\(majorVersion).\(minorVersion)"
}
var hasInstalled: Bool {
versions.contains { $0.installState.installed }
}
var hasInstalling: Bool {
versions.contains { $0.installState.installing }
}
var selectedVersion: Xcode? {
versions.first { $0.selected }
}
}
struct XcodeMajorVersionGroup: Identifiable {
let majorVersion: Int
let minorVersionGroups: [XcodeMinorVersionGroup]
var isExpanded: Bool = false
var id: Int {
majorVersion
}
var versions: [Xcode] {
minorVersionGroups.flatMap { $0.versions }
}
var latestRelease: Xcode? {
versions
.filter { $0.version.isNotPrerelease }
.sorted { $0.version < $1.version }
.last
}
var displayName: String {
"\(majorVersion)"
}
var hasInstalled: Bool {
minorVersionGroups.contains { $0.hasInstalled }
}
var hasInstalling: Bool {
minorVersionGroups.contains { $0.hasInstalling }
}
var selectedVersion: Xcode? {
minorVersionGroups.compactMap { $0.selectedVersion }.first
}
}
extension Array where Element == Xcode {
func groupedByMajorVersion() -> [XcodeMajorVersionGroup] {
let majorGroups = Dictionary(grouping: self) { $0.version.major }
return majorGroups.map { majorVersion, xcodes in
let minorGroups = Dictionary(grouping: xcodes) { $0.version.minor }
let minorVersionGroups = minorGroups.map { minorVersion, minorXcodes in
XcodeMinorVersionGroup(
majorVersion: majorVersion,
minorVersion: minorVersion,
versions: minorXcodes.sorted { $0.version > $1.version }
)
}.sorted { $0.minorVersion > $1.minorVersion }
return XcodeMajorVersionGroup(
majorVersion: majorVersion,
minorVersionGroups: minorVersionGroups
)
}.sorted { $0.majorVersion > $1.majorVersion }
}
}

View file

@ -24,6 +24,7 @@ struct GeneralPreferencePane: View {
GroupBox(label: Text("Misc")) {
Toggle("TerminateAfterLastWindowClosed", isOn: $appState.terminateAfterLastWindowClosed)
Toggle("EnableCollapsibleList", isOn: $appState.collapsableListEnabled)
}
.groupBoxStyle(PreferencesGroupBoxStyle())
}

View file

@ -10,6 +10,8 @@ struct XcodeListView: View {
private let architecture: XcodeListArchitecture
private let isInstalledOnly: Bool
@AppStorage(PreferenceKey.allowedMajorVersions.rawValue) private var allowedMajorVersions = Int.max
@State private var expandedMajorVersions = Set<Int>()
@State private var expandedMinorVersions = Set<String>()
init(selectedXcodeID: Binding<Xcode.ID?>, searchText: String, category: XcodeListCategory, isInstalledOnly: Bool, architecture: XcodeListArchitecture) {
self._selectedXcodeID = selectedXcodeID
@ -29,12 +31,12 @@ struct XcodeListView: View {
case .beta:
xcodes = appState.allXcodes.filter { $0.version.isPrerelease }
}
if architecture == .appleSilicon {
xcodes = xcodes.filter { $0.architectures == [.arm64] }
}
let latestMajor = xcodes.sorted(\.version)
.filter { $0.version.isNotPrerelease }
.last?
@ -54,17 +56,32 @@ struct XcodeListView: View {
if !searchText.isEmpty {
xcodes = xcodes.filter { $0.description.contains(searchText) }
}
if isInstalledOnly {
xcodes = xcodes.filter { $0.installState.installed }
}
return xcodes
}
var majorVersionGroups: [XcodeMajorVersionGroup] {
visibleXcodes.groupedByMajorVersion()
}
var body: some View {
List(visibleXcodes, selection: $selectedXcodeID) { xcode in
XcodeListViewRow(xcode: xcode, selected: selectedXcodeID == xcode.id, appState: appState)
List(selection: $selectedXcodeID) {
if appState.collapsableListEnabled {
CollapsableListView(
visibleXcodes: visibleXcodes,
selectedXcodeID: $selectedXcodeID,
appState: appState
)
} else {
ForEach(visibleXcodes) { xcode in
XcodeListViewRow(xcode: xcode, selected: selectedXcodeID == xcode.id, appState: appState)
.tag(xcode.id)
}
}
}
.listStyle(.sidebar)
.safeAreaInset(edge: .bottom, spacing: 0) {
@ -76,6 +93,72 @@ struct XcodeListView: View {
}
}
struct CollapsableListView: View {
let visibleXcodes: [Xcode]
@Binding var selectedXcodeID: Xcode.ID?
let appState: AppState
@State private var expandedMajorVersions = Set<Int>()
@State private var expandedMinorVersions = Set<String>()
var majorVersionGroups: [XcodeMajorVersionGroup] {
visibleXcodes.groupedByMajorVersion()
}
var body: some View {
ForEach(majorVersionGroups) { majorVersionGroup in
let isMajorExpanded = expandedMajorVersions.contains(majorVersionGroup.majorVersion)
XcodeMajorVersionRow(
majorVersionGroup: majorVersionGroup,
isExpanded: isMajorExpanded,
onToggleExpanded: {
if isMajorExpanded {
expandedMajorVersions.remove(majorVersionGroup.majorVersion)
// Collapse all minor versions when major version is collapsed
for minorGroup in majorVersionGroup.minorVersionGroups {
expandedMinorVersions.remove(minorGroup.id)
}
} else {
expandedMajorVersions.insert(majorVersionGroup.majorVersion)
}
},
appState: appState
)
.tag(majorVersionGroup.selectedVersion?.id)
if isMajorExpanded {
ForEach(majorVersionGroup.minorVersionGroups) { minorVersionGroup in
let isMinorExpanded = expandedMinorVersions.contains(minorVersionGroup.id)
XcodeMinorVersionRow(
minorVersionGroup: minorVersionGroup,
isExpanded: isMinorExpanded,
onToggleExpanded: {
if isMinorExpanded {
expandedMinorVersions.remove(minorVersionGroup.id)
} else {
expandedMinorVersions.insert(minorVersionGroup.id)
}
},
appState: appState
)
.tag(minorVersionGroup.selectedVersion?.id)
if isMinorExpanded {
ForEach(minorVersionGroup.versions) { xcode in
XcodeListViewRow(xcode: xcode, selected: selectedXcodeID == xcode.id, appState: appState)
.padding(.leading, 40)
.tag(xcode.id)
}
}
}
}
}
}
}
struct PlatformsPocket: View {
@SwiftUI.Environment(\.openWindow) private var openWindow
@ -92,7 +175,11 @@ struct PlatformsPocket: View {
.background(.quaternary.opacity(0.75))
.clipShape(RoundedRectangle(cornerRadius: 8, style: .continuous))
}
.font(.body.weight(.medium))
.padding(.horizontal)
.padding(.vertical, 12)
.background(.quaternary.opacity(0.9))
.clipShape(RoundedRectangle(cornerRadius: 8, style: .continuous))
}
.buttonStyle(.plain)
}
@ -132,3 +219,4 @@ struct XcodeListView_Previews: PreviewProvider {
.previewLayout(.sizeThatFits)
}
}

View file

@ -0,0 +1,157 @@
import SwiftUI
import Version
import Path
struct XcodeMajorVersionRow: View {
let majorVersionGroup: XcodeMajorVersionGroup
let isExpanded: Bool
let onToggleExpanded: () -> Void
let appState: AppState
var body: some View {
HStack {
Button(action: onToggleExpanded) {
HStack(spacing: 8) {
Image(systemName: isExpanded ? "chevron.down" : "chevron.right")
.font(.caption.weight(.semibold))
.foregroundColor(.secondary)
majorVersionIcon
VStack(alignment: .leading, spacing: 2) {
Text(String(format: localizeString("Xcode %@"), majorVersionGroup.displayName))
.font(.body.weight(.medium))
if let latestRelease = majorVersionGroup.latestRelease {
Text(String(format: localizeString("Latest: %@"), latestRelease.description))
.font(.caption)
.foregroundColor(.secondary)
}
}
Spacer()
}
}
.buttonStyle(.plain)
selectControl()
.padding(.trailing, 16)
installControl()
}
.padding(.vertical, 8)
.background(Color.clear)
.contentShape(Rectangle())
}
@ViewBuilder
var majorVersionIcon: some View {
if let latestRelease = majorVersionGroup.latestRelease {
if let icon = latestRelease.icon {
Image(nsImage: icon)
.resizable()
.frame(width: 32, height: 32)
} else {
Image("xcode")
.resizable()
.frame(width: 32, height: 32)
.opacity(0.7)
}
} else {
Image("xcode-beta")
.resizable()
.frame(width: 32, height: 32)
.opacity(0.7)
}
}
@ViewBuilder
func selectControl() -> some View {
if let selectedVersion = majorVersionGroup.selectedVersion {
if selectedVersion.selected {
Image(systemName: "checkmark.circle.fill")
.foregroundColor(.green)
.help("ActiveVersionDescription")
} else {
EmptyView()
}
} else if majorVersionGroup.hasInstalled {
EmptyView()
} else {
EmptyView()
}
}
@ViewBuilder
func installControl() -> some View {
if majorVersionGroup.hasInstalling {
if let installingVersion = majorVersionGroup.versions.first(where: { $0.installState.installing }) {
if case let .installing(installationStep) = installingVersion.installState {
InstallationStepRowView(
installationStep: installationStep,
highlighted: false,
cancel: { appState.presentedAlert = .cancelInstall(xcode: installingVersion) }
)
}
}
} else if let latestRelease = majorVersionGroup.latestRelease {
switch latestRelease.installState {
case .installed:
Button("Open") { appState.open(xcode: latestRelease) }
.textCase(.uppercase)
.buttonStyle(AppStoreButtonStyle(primary: true, highlighted: false))
.help("OpenDescription")
case .notInstalled:
Button("Install Latest Release") {
appState.checkMinVersionAndInstall(id: latestRelease.id)
}
.textCase(.uppercase)
.buttonStyle(AppStoreButtonStyle(primary: false, highlighted: false))
.help("InstallLatestReleaseDescription")
case .installing:
EmptyView()
}
}
}
}
struct XcodeMajorVersionRow_Previews: PreviewProvider {
static var previews: some View {
let sampleXcodes = [
Xcode(version: Version("16.4.0")!, installState: .installed(Path("/Applications/Xcode-16.4.0.app")!), selected: true, icon: nil),
Xcode(version: Version("16.3.0")!, installState: .notInstalled, selected: false, icon: nil),
Xcode(version: Version("16.2.0")!, installState: .notInstalled, selected: false, icon: nil),
]
let minorVersionGroups = [
XcodeMinorVersionGroup(
majorVersion: 16,
minorVersion: 4,
versions: [sampleXcodes[0]]
),
XcodeMinorVersionGroup(
majorVersion: 16,
minorVersion: 3,
versions: [sampleXcodes[1]]
),
XcodeMinorVersionGroup(
majorVersion: 16,
minorVersion: 2,
versions: [sampleXcodes[2]]
)
]
let majorVersionGroup = XcodeMajorVersionGroup(
majorVersion: 16,
minorVersionGroups: minorVersionGroups,
isExpanded: false
)
XcodeMajorVersionRow(
majorVersionGroup: majorVersionGroup,
isExpanded: false,
onToggleExpanded: {},
appState: AppState()
)
.previewLayout(.sizeThatFits)
}
}

View file

@ -0,0 +1,140 @@
import SwiftUI
import Version
import Path
struct XcodeMinorVersionRow: View {
let minorVersionGroup: XcodeMinorVersionGroup
let isExpanded: Bool
let onToggleExpanded: () -> Void
let appState: AppState
var body: some View {
HStack {
Button(action: onToggleExpanded) {
HStack(spacing: 8) {
Image(systemName: isExpanded ? "chevron.down" : "chevron.right")
.font(.caption.weight(.semibold))
.foregroundColor(.secondary)
minorVersionIcon
VStack(alignment: .leading, spacing: 2) {
Text(String(format: localizeString("Xcode %@"), minorVersionGroup.displayName))
.font(.callout.weight(.medium))
if let latestRelease = minorVersionGroup.latestRelease {
Text(String(format: localizeString("Latest: %@"), latestRelease.description))
.font(.caption2)
.foregroundColor(.secondary)
}
}
Spacer()
}
}
.buttonStyle(.plain)
selectControl()
.padding(.trailing, 16)
installControl()
}
.padding(.vertical, 6)
.padding(.leading, 20)
.background(Color.clear)
.contentShape(Rectangle())
}
@ViewBuilder
var minorVersionIcon: some View {
if let latestRelease = minorVersionGroup.latestRelease {
if let icon = latestRelease.icon {
Image(nsImage: icon)
.resizable()
.frame(width: 28, height: 28)
} else {
Image("xcode")
.resizable()
.frame(width: 28, height: 28)
.opacity(0.6)
}
} else {
Image("xcode-beta")
.resizable()
.frame(width: 28, height: 28)
.opacity(0.6)
}
}
@ViewBuilder
func selectControl() -> some View {
if let selectedVersion = minorVersionGroup.selectedVersion {
if selectedVersion.selected {
Image(systemName: "checkmark.circle.fill")
.foregroundColor(.green)
.help("ActiveVersionDescription")
} else {
EmptyView()
}
} else if minorVersionGroup.hasInstalled {
EmptyView()
} else {
EmptyView()
}
}
@ViewBuilder
func installControl() -> some View {
if minorVersionGroup.hasInstalling {
if let installingVersion = minorVersionGroup.versions.first(where: { $0.installState.installing }) {
if case let .installing(installationStep) = installingVersion.installState {
InstallationStepRowView(
installationStep: installationStep,
highlighted: false,
cancel: { appState.presentedAlert = .cancelInstall(xcode: installingVersion) }
)
}
}
} else if let latestRelease = minorVersionGroup.latestRelease {
switch latestRelease.installState {
case .installed:
Button("Open") { appState.open(xcode: latestRelease) }
.textCase(.uppercase)
.buttonStyle(AppStoreButtonStyle(primary: true, highlighted: false))
.help("OpenDescription")
case .notInstalled:
Button("Install Latest") {
appState.checkMinVersionAndInstall(id: latestRelease.id)
}
.textCase(.uppercase)
.buttonStyle(AppStoreButtonStyle(primary: false, highlighted: false))
.help("InstallLatestVersionDescription")
case .installing:
EmptyView()
}
}
}
}
struct XcodeMinorVersionRow_Previews: PreviewProvider {
static var previews: some View {
let sampleXcodes = [
Xcode(version: Version("16.4.0")!, installState: .installed(Path("/Applications/Xcode-16.4.0.app")!), selected: true, icon: nil),
Xcode(version: Version("16.4.1")!, installState: .notInstalled, selected: false, icon: nil),
]
let minorVersionGroup = XcodeMinorVersionGroup(
majorVersion: 16,
minorVersion: 4,
versions: sampleXcodes,
isExpanded: false
)
XcodeMinorVersionRow(
minorVersionGroup: minorVersionGroup,
isExpanded: false,
onToggleExpanded: {},
appState: AppState()
)
.previewLayout(.sizeThatFits)
}
}

View file

@ -1064,33 +1064,6 @@ SOFTWARE.\
\
\
\fs34 data\
\
\fs26 MIT License\
\
Copyright (c) 2018 \
\
Permission is hereby granted, free of charge, to any person obtaining a copy\
of this software and associated documentation files (the "Software"), to deal\
in the Software without restriction, including without limitation the rights\
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\
copies of the Software, and to permit persons to whom the Software is\
furnished to do so, subject to the following conditions:\
\
The above copyright notice and this permission notice shall be included in all\
copies or substantial portions of the Software.\
\
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\
SOFTWARE.\
\
\
\fs34 Sparkle\
\

View file

@ -8794,6 +8794,24 @@
}
}
},
"EnableCollapsibleList" : {
"comment" : "A toggle that enables or disables the collapsible list feature.",
"isCommentAutoGenerated" : true,
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Haupt- und Unterversionen in der Listenansicht zusammenklappen"
}
},
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Collapse Major and Minor Versions in the list view"
}
}
}
},
"EnableNotifications" : {
"localizations" : {
"ar" : {
@ -11382,6 +11400,14 @@
}
}
},
"Install Latest" : {
"comment" : "A button that installs the latest Xcode version.",
"isCommentAutoGenerated" : true
},
"Install Latest Release" : {
"comment" : "A button that installs the latest release of Xcode.",
"isCommentAutoGenerated" : true
},
"Install Universal" : {
"localizations" : {
"ar" : {
@ -14259,6 +14285,14 @@
}
}
},
"InstallLatestReleaseDescription" : {
"comment" : "A button label that instructs the user to install the latest release of Xcode.",
"isCommentAutoGenerated" : true
},
"InstallLatestVersionDescription" : {
"comment" : "A button label that instructs the user to install the latest version of Xcode.",
"isCommentAutoGenerated" : true
},
"InstallPathDescription" : {
"localizations" : {
"ar" : {
@ -14520,6 +14554,10 @@
}
}
},
"Latest: %@" : {
"comment" : "A sublabel within the Xcode major version row that shows the description of the latest release in that version group.",
"isCommentAutoGenerated" : true
},
"License" : {
"localizations" : {
"ar" : {
@ -24851,6 +24889,10 @@
}
}
},
"Xcode %@" : {
"comment" : "A title and optional subtitle for a row in the checkout view, displaying the Xcode version and its latest release.",
"isCommentAutoGenerated" : true
},
"Xcodes" : {
"localizations" : {
"ar" : {
@ -24976,5 +25018,5 @@
}
}
},
"version" : "1.0"
"version" : "1.1"
}