Skip to content

Commit

Permalink
fix: Show transfers in a separate window (#129)
Browse files Browse the repository at this point in the history
  • Loading branch information
jbmorley authored Jul 19, 2024
1 parent 70d636e commit 766752d
Show file tree
Hide file tree
Showing 8 changed files with 95 additions and 90 deletions.
8 changes: 4 additions & 4 deletions Reconnect.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
D84964F62C1BFCB700405656 /* ReconnectUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D84964F52C1BFCB700405656 /* ReconnectUITests.swift */; };
D84964F82C1BFCB700405656 /* ReconnectUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D84964F72C1BFCB700405656 /* ReconnectUITestsLaunchTests.swift */; };
D8631DAB2C36867400344DC3 /* BrowserDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8631DAA2C36867300344DC3 /* BrowserDetailView.swift */; };
D8631DAD2C3739E600344DC3 /* TransfersPopoverButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8631DAC2C3739E600344DC3 /* TransfersPopoverButton.swift */; };
D8631DAF2C373A1600344DC3 /* TransferRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8631DAE2C373A1600344DC3 /* TransferRow.swift */; };
D8631DB12C374B0A00344DC3 /* Transfer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8631DB02C374B0A00344DC3 /* Transfer.swift */; };
D8631DB32C374B4400344DC3 /* TransfersModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8631DB22C374B4400344DC3 /* TransfersModel.swift */; };
Expand Down Expand Up @@ -56,6 +55,7 @@
D8E31EBA2C26E1E400350082 /* reconnect-license in Resources */ = {isa = PBXBuildFile; fileRef = D8E31EB92C26E1E400350082 /* reconnect-license */; };
D8F0E8F62C3778E80047B1BC /* UInt32.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8F0E8F52C3778E80047B1BC /* UInt32.swift */; };
D8FD72732C3D192F0038DB17 /* sparkle-license in Resources */ = {isa = PBXBuildFile; fileRef = D8FD72722C3D192F0038DB17 /* sparkle-license */; };
D8FFE85F2C49F2FB001F7D8A /* TransfersWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8FFE85E2C49F2FB001F7D8A /* TransfersWindow.swift */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand Down Expand Up @@ -99,7 +99,6 @@
D84964F52C1BFCB700405656 /* ReconnectUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReconnectUITests.swift; sourceTree = "<group>"; };
D84964F72C1BFCB700405656 /* ReconnectUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReconnectUITestsLaunchTests.swift; sourceTree = "<group>"; };
D8631DAA2C36867300344DC3 /* BrowserDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowserDetailView.swift; sourceTree = "<group>"; };
D8631DAC2C3739E600344DC3 /* TransfersPopoverButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransfersPopoverButton.swift; sourceTree = "<group>"; };
D8631DAE2C373A1600344DC3 /* TransferRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransferRow.swift; sourceTree = "<group>"; };
D8631DB02C374B0A00344DC3 /* Transfer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Transfer.swift; sourceTree = "<group>"; };
D8631DB22C374B4400344DC3 /* TransfersModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransfersModel.swift; sourceTree = "<group>"; };
Expand All @@ -126,6 +125,7 @@
D8E31EB92C26E1E400350082 /* reconnect-license */ = {isa = PBXFileReference; lastKnownFileType = text; path = "reconnect-license"; sourceTree = "<group>"; };
D8F0E8F52C3778E80047B1BC /* UInt32.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UInt32.swift; sourceTree = "<group>"; };
D8FD72722C3D192F0038DB17 /* sparkle-license */ = {isa = PBXFileReference; lastKnownFileType = text; path = "sparkle-license"; sourceTree = "<group>"; };
D8FFE85E2C49F2FB001F7D8A /* TransfersWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransfersWindow.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -185,8 +185,8 @@
D8D3E7A02C25410E003E696D /* MainMenu.swift */,
D89B5E8D2C2AA8680014A5B6 /* Sidebar.swift */,
D8631DAE2C373A1600344DC3 /* TransferRow.swift */,
D8631DAC2C3739E600344DC3 /* TransfersPopoverButton.swift */,
D8631DB42C374F8700344DC3 /* TransfersView.swift */,
D8FFE85E2C49F2FB001F7D8A /* TransfersWindow.swift */,
);
path = Views;
sourceTree = "<group>";
Expand Down Expand Up @@ -474,6 +474,7 @@
D83A786E2C3C87F5000E8192 /* FileType.swift in Sources */,
D8631DBB2C37657100344DC3 /* Array.swift in Sources */,
D83B4DE12C2F99C3003C3DC1 /* CheckForUpdatesViewModel.swift in Sources */,
D8FFE85F2C49F2FB001F7D8A /* TransfersWindow.swift in Sources */,
D83658B92C298C4F00B45693 /* NavigationStack.swift in Sources */,
D822EA132C2BA92E008A4BAA /* SerialDeviceMonitor.swift in Sources */,
D86924C82C30964400A8492C /* DockIconManaager.swift in Sources */,
Expand All @@ -487,7 +488,6 @@
D8E31EB72C26E13E00350082 /* String.swift in Sources */,
D8C409CA2C3D0B7600C9E857 /* Graphics.swift in Sources */,
D8D3E7A12C25410E003E696D /* MainMenu.swift in Sources */,
D8631DAD2C3739E600344DC3 /* TransfersPopoverButton.swift in Sources */,
D8631DB12C374B0A00344DC3 /* Transfer.swift in Sources */,
D84964DA2C1BFCB600405656 /* ReconnectApp.swift in Sources */,
D83A786C2C3C85FE000E8192 /* DirectoryEntry.swift in Sources */,
Expand Down
1 change: 1 addition & 0 deletions Reconnect/Extensions/URL.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ extension URL {
static let about = URL(string: "x-reconnect://about")!
static let browser = URL(string: "x-reconnect://browser")!
static let install = URL(string: "x-reconnect://install/")!
static let transfers = URL(string: "x-reconnect://transfers")!

func appendingPathComponents(_ pathComponents: [String]) -> URL {
return pathComponents.reduce(self) { url, pathComponent in
Expand Down
2 changes: 2 additions & 0 deletions Reconnect/Model/BrowserModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,7 @@ class BrowserModel {
}

func download(_ selection: Set<FileServer.DirectoryEntry.ID>? = nil, convertFiles: Bool) {
NSWorkspace.shared.open(.transfers)
let selection = selection ?? fileSelection
for path in selection {
if path.isWindowsDirectory {
Expand Down Expand Up @@ -222,6 +223,7 @@ class BrowserModel {
}

func upload(url: URL) {
NSWorkspace.shared.open(.transfers)
runAsync {
guard let path = self.path else {
throw ReconnectError.invalidFilePath
Expand Down
17 changes: 3 additions & 14 deletions Reconnect/ReconnectApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -50,22 +50,11 @@ struct ReconnectApp: App {

WindowGroup("My Psion") {
ContentView(applicationModel: applicationModel, transfersModel: transfersModel)
.onOpenURL { url in
print(url)
guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
let path = components.queryItems?.first(where: { $0.name == "path" })?.value,
let installerURL = URL(string: path),
installerURL.scheme == "file"
else {
return
}
let filename = installerURL.lastPathComponent
transfersModel.upload(from: installerURL, to: "C:".appendingWindowsPathComponent(filename))
}
.handlesExternalEvents(preferring: [.install, .browser], allowing: [])
}
.environment(applicationModel)
.handlesExternalEvents(matching: [.browser, .install])
.handlesExternalEvents(matching: [.browser])

TransfersWindow(transfersModel: transfersModel)

About(repository: "inseven/reconnect", copyright: "Copyright © 2024 Jason Morley") {
Action("GitHub", url: URL(string: "https://github.com/inseven/reconnect")!)
Expand Down
19 changes: 17 additions & 2 deletions Reconnect/Views/BrowserView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@ import SwiftUI
@MainActor
struct BrowserView: View {

@Environment(ApplicationModel.self) var applicationModel
@Environment(\.openWindow) private var openWindow

@Environment(ApplicationModel.self) private var applicationModel

@State private var browserModel: BrowserModel

Expand Down Expand Up @@ -136,7 +138,20 @@ struct BrowserView: View {
}

ToolbarItem(id: "transfers") {
TransfersPopoverButton(transfers: browserModel.transfersModel)
Button {
openWindow(id: TransfersWindow.id)
} label: {
Label {
Text("Transfers")
} icon: {
if browserModel.transfersModel.isActive {
Image(systemName: "arrow.up.arrow.down")
.foregroundStyle(.tint)
} else {
Image(systemName: "arrow.up.arrow.down")
}
}
}
}

ToolbarItem(id: "refresh") {
Expand Down
48 changes: 0 additions & 48 deletions Reconnect/Views/TransfersPopoverButton.swift

This file was deleted.

38 changes: 16 additions & 22 deletions Reconnect/Views/TransfersView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,36 +30,30 @@ struct TransfersView: View {

private let transfersModel: TransfersModel

init(transfers: TransfersModel) {
self.transfersModel = transfers
init(transfersModel: TransfersModel) {
self.transfersModel = transfersModel
}

var body: some View {
@Bindable var transfers = transfersModel
VStack(spacing: 0) {
ZStack {
Text("Transfers")
HStack {
Spacer()
Button("Clear") {
transfers.clear()
if transfers.transfers.isEmpty {
dismiss()
}
}
}
List(selection: $transfers.selection) {
ForEach(transfers.transfers) { transfer in
TransferRow(transfer: transfer)
}
.padding(LayoutMetrics.titleBarPadding)
List(selection: $transfers.selection) {
ForEach(transfers.transfers) { transfer in
TransferRow(transfer: transfer)
}
.scrollContentBackground(.hidden)
.frame(minHeight: LayoutMetrics.minimumHeight)
.frame(width: LayoutMetrics.width)
.toolbar {
ToolbarItem {
Button("Clear") {
transfers.clear()
if transfers.transfers.isEmpty {
dismiss()
}
}
}
.scrollContentBackground(.hidden)
.frame(minHeight: LayoutMetrics.minimumHeight)
}
.frame(width: LayoutMetrics.width)
.background(.thinMaterial)
}

}
52 changes: 52 additions & 0 deletions Reconnect/Views/TransfersWindow.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// Reconnect -- Psion connectivity for macOS
//
// Copyright (C) 2024 Jason Morley
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

import SwiftUI

import Diligence
import Interact
import Sparkle

struct TransfersWindow: Scene {

static let id = "transfers"

let transfersModel: TransfersModel

var body: some Scene {
Window("Transfers", id: Self.id) {
TransfersView(transfersModel: transfersModel)
.onOpenURL { url in
print(url)
guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
let path = components.queryItems?.first(where: { $0.name == "path" })?.value,
let installerURL = URL(string: path),
installerURL.scheme == "file"
else {
return
}
let filename = installerURL.lastPathComponent
transfersModel.upload(from: installerURL, to: "C:".appendingWindowsPathComponent(filename))
}
.handlesExternalEvents(preferring: [.install], allowing: [])
}
.windowResizability(.contentSize)
.handlesExternalEvents(matching: [.install, .transfers])
}

}

0 comments on commit 766752d

Please sign in to comment.