diff --git a/Xcodes/Backend/XcodeCommands.swift b/Xcodes/Backend/XcodeCommands.swift index 4cbee0b..efa45a0 100644 --- a/Xcodes/Backend/XcodeCommands.swift +++ b/Xcodes/Backend/XcodeCommands.swift @@ -48,6 +48,23 @@ struct InstallButton: View { } } +struct CancelInstallButton: View { + @EnvironmentObject var appState: AppState + let xcode: Xcode? + + var body: some View { + Button(action: cancelInstall) { + Text("Cancel") + .help("Cancel installation") + } + } + + private func cancelInstall() { + guard let xcode = xcode else { return } + appState.cancelInstall(id: xcode.id) + } +} + struct SelectButton: View { @EnvironmentObject var appState: AppState let xcode: Xcode? diff --git a/Xcodes/Frontend/XcodeList/InfoPane.swift b/Xcodes/Frontend/XcodeList/InfoPane.swift index 6392d73..d4b6916 100644 --- a/Xcodes/Frontend/XcodeList/InfoPane.swift +++ b/Xcodes/Frontend/XcodeList/InfoPane.swift @@ -20,30 +20,34 @@ struct InfoPane: View { .font(.title) .frame(maxWidth: .infinity, alignment: .leading) - if let path = xcode.path { - HStack { - Text(path) - Button(action: { appState.reveal(id: xcode.id) }) { - Image(systemName: "arrow.right.circle.fill") - } - .buttonStyle(PlainButtonStyle()) - .help("Reveal in Finder") - } - - HStack { - SelectButton(xcode: xcode) - .disabled(xcode.selected) - .help("Selected") - - OpenButton(xcode: xcode) - .help("Open") - - Spacer() - UninstallButton(xcode: xcode) - } - } else { + switch xcode.installState { + case .notInstalled: InstallButton(xcode: xcode) - .disabled(xcode.installState != .notInstalled) + case .installing: + CancelInstallButton(xcode: xcode) + case .installed: + if let path = xcode.path { + HStack { + Text(path) + Button(action: { appState.reveal(id: xcode.id) }) { + Image(systemName: "arrow.right.circle.fill") + } + .buttonStyle(PlainButtonStyle()) + .help("Reveal in Finder") + } + + HStack { + SelectButton(xcode: xcode) + .disabled(xcode.selected) + .help("Selected") + + OpenButton(xcode: xcode) + .help("Open") + + Spacer() + UninstallButton(xcode: xcode) + } + } } } diff --git a/Xcodes/Frontend/XcodeList/XcodeListViewRow.swift b/Xcodes/Frontend/XcodeList/XcodeListViewRow.swift index ce23a09..3c06c40 100644 --- a/Xcodes/Frontend/XcodeList/XcodeListViewRow.swift +++ b/Xcodes/Frontend/XcodeList/XcodeListViewRow.swift @@ -26,15 +26,18 @@ struct XcodeListViewRow: View { installControl(for: xcode) } .contextMenu { - if xcode.installed { + switch xcode.installState { + case .notInstalled: + InstallButton(xcode: xcode) + case .installing: + CancelInstallButton(xcode: xcode) + case .installed: SelectButton(xcode: xcode) OpenButton(xcode: xcode) RevealButton(xcode: xcode) CopyPathButton(xcode: xcode) Divider() UninstallButton(xcode: xcode) - } else { - InstallButton(xcode: xcode) } } }