mirror of
https://github.com/XcodesOrg/XcodesApp.git
synced 2026-03-25 08:55:46 +00:00
Merge ec7b13497c into 1a0d3353b9
This commit is contained in:
commit
80dd8fa9f4
12 changed files with 635 additions and 110 deletions
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1220"
|
||||
LastUpgradeVersion = "2600"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1500"
|
||||
LastUpgradeVersion = "2600"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ struct GeneralPreferencePane: View {
|
|||
|
||||
GroupBox(label: Text("Misc")) {
|
||||
Toggle("TerminateAfterLastWindowClosed", isOn: $appState.terminateAfterLastWindowClosed)
|
||||
Toggle("EnableCollapsibleList", isOn: $appState.collapsableListEnabled)
|
||||
}
|
||||
.groupBoxStyle(PreferencesGroupBoxStyle())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
157
Xcodes/Frontend/XcodeList/XcodeMajorVersionRow.swift
Normal file
157
Xcodes/Frontend/XcodeList/XcodeMajorVersionRow.swift
Normal 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)
|
||||
}
|
||||
}
|
||||
140
Xcodes/Frontend/XcodeList/XcodeMinorVersionRow.swift
Normal file
140
Xcodes/Frontend/XcodeList/XcodeMinorVersionRow.swift
Normal 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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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\
|
||||
\
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
Loading…
Reference in a new issue