Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .swiftlint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ disabled_rules:

excluded:
- build
- .build
# TODO: Refactor these files and remove the temporary lint exclusion.
- BitDream/Transmission/TransmissionFunctions.swift
- BitDream/TransmissionStore.swift

type_name:
Expand All @@ -19,5 +19,5 @@ identifier_name:
- "^id$"

file_length:
warning: 600
warning: 800
error: 1000
26 changes: 9 additions & 17 deletions BitDream.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
4B1DADE8295E6C450037E9FB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4B1DADE7295E6C450037E9FB /* Assets.xcassets */; };
4B1DADEC295E6C450037E9FB /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4B1DADEB295E6C450037E9FB /* Preview Assets.xcassets */; };
4B1DADFE295E6F390037E9FB /* TransmissionTorrentModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B1DADFD295E6F390037E9FB /* TransmissionTorrentModels.swift */; };
4B1DAE00295E6F600037E9FB /* TransmissionFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B1DADFF295E6F600037E9FB /* TransmissionFunctions.swift */; };
4B1DAE02295E6FA30037E9FB /* AddTorrent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B1DAE01295E6FA30037E9FB /* AddTorrent.swift */; };
4B1DAE06295E6FC80037E9FB /* TorrentDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B1DAE05295E6FC80037E9FB /* TorrentDetail.swift */; };
4B1DAE0A295E6FE10037E9FB /* ServerDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B1DAE09295E6FE10037E9FB /* ServerDetail.swift */; };
Expand Down Expand Up @@ -97,10 +96,10 @@
4E2000034000000000C1D2E3 /* TorrentSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2000064000000000C1D2E3 /* TorrentSettings.swift */; };
4E2000084000000000C1D2E3 /* SettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2000094000000000C1D2E3 /* SettingsViewModel.swift */; };
4F7000024000000000A1B2C3 /* iOSTorrentFileRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F7000014000000000A1B2C3 /* iOSTorrentFileRow.swift */; };
4F7000044000000000A1B2C3 /* iOSTorrentFileDetailControls.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F7000034000000000A1B2C3 /* iOSTorrentFileDetailControls.swift */; };
4F8000044000000000A1B2C3 /* macOSContentSidebar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F8000014000000000A1B2C3 /* macOSContentSidebar.swift */; };
4F8000054000000000A1B2C3 /* macOSContentDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F8000024000000000A1B2C3 /* macOSContentDetail.swift */; };
4F8000064000000000A1B2C3 /* macOSContentToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F8000034000000000A1B2C3 /* macOSContentToolbar.swift */; };
4FA9A0024100000000A1B2C3 /* TorrentActionExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FA9A0014100000000A1B2C3 /* TorrentActionExecutor.swift */; };
5A1000014100000000A1B2C3 /* TransmissionModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A1000064100000000A1B2C3 /* TransmissionModels.swift */; };
5A1000214100000000A1B2C3 /* TransmissionTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A1000224100000000A1B2C3 /* TransmissionTransport.swift */; };
5A1000234100000000A1B2C3 /* TransmissionConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A1000244100000000A1B2C3 /* TransmissionConnection.swift */; };
Expand All @@ -111,8 +110,7 @@
7B1000014300000000A1B2C3 /* Formatting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B1000024300000000A1B2C3 /* Formatting.swift */; };
7B1000034300000000A1B2C3 /* Sorting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B1000044300000000A1B2C3 /* Sorting.swift */; };
7B1000054300000000A1B2C3 /* TransmissionReadSnapshots.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B1000064300000000A1B2C3 /* TransmissionReadSnapshots.swift */; };
7B1000074300000000A1B2C3 /* TransmissionLegacyConnectionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B1000084300000000A1B2C3 /* TransmissionLegacyConnectionInfo.swift */; };
7B1000094300000000A1B2C3 /* TransmissionLegacyUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B10000A4300000000A1B2C3 /* TransmissionLegacyUI.swift */; };
7B1000094300000000A1B2C3 /* TransmissionActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B10000A4300000000A1B2C3 /* TransmissionActions.swift */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand Down Expand Up @@ -153,7 +151,6 @@
4B1DADE9295E6C450037E9FB /* BitDream.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = BitDream.entitlements; sourceTree = "<group>"; };
4B1DADEB295E6C450037E9FB /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
4B1DADFD295E6F390037E9FB /* TransmissionTorrentModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransmissionTorrentModels.swift; sourceTree = "<group>"; };
4B1DADFF295E6F600037E9FB /* TransmissionFunctions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransmissionFunctions.swift; sourceTree = "<group>"; };
4B1DAE01295E6FA30037E9FB /* AddTorrent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddTorrent.swift; sourceTree = "<group>"; };
4B1DAE05295E6FC80037E9FB /* TorrentDetail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TorrentDetail.swift; sourceTree = "<group>"; };
4B1DAE09295E6FE10037E9FB /* ServerDetail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerDetail.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -236,10 +233,10 @@
4E2000064000000000C1D2E3 /* TorrentSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TorrentSettings.swift; sourceTree = "<group>"; };
4E2000094000000000C1D2E3 /* SettingsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewModel.swift; sourceTree = "<group>"; };
4F7000014000000000A1B2C3 /* iOSTorrentFileRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iOSTorrentFileRow.swift; sourceTree = "<group>"; };
4F7000034000000000A1B2C3 /* iOSTorrentFileDetailControls.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iOSTorrentFileDetailControls.swift; sourceTree = "<group>"; };
4F8000014000000000A1B2C3 /* macOSContentSidebar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = macOSContentSidebar.swift; sourceTree = "<group>"; };
4F8000024000000000A1B2C3 /* macOSContentDetail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = macOSContentDetail.swift; sourceTree = "<group>"; };
4F8000034000000000A1B2C3 /* macOSContentToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = macOSContentToolbar.swift; sourceTree = "<group>"; };
4FA9A0014100000000A1B2C3 /* TorrentActionExecutor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TorrentActionExecutor.swift; sourceTree = "<group>"; };
5A1000064100000000A1B2C3 /* TransmissionModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransmissionModels.swift; sourceTree = "<group>"; };
5A1000074100000000A1B2C3 /* BitDreamTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BitDreamTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
5A1000224100000000A1B2C3 /* TransmissionTransport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransmissionTransport.swift; sourceTree = "<group>"; };
Expand All @@ -251,8 +248,7 @@
7B1000024300000000A1B2C3 /* Formatting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Formatting.swift; sourceTree = "<group>"; };
7B1000044300000000A1B2C3 /* Sorting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sorting.swift; sourceTree = "<group>"; };
7B1000064300000000A1B2C3 /* TransmissionReadSnapshots.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransmissionReadSnapshots.swift; sourceTree = "<group>"; };
7B1000084300000000A1B2C3 /* TransmissionLegacyConnectionInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransmissionLegacyConnectionInfo.swift; sourceTree = "<group>"; };
7B10000A4300000000A1B2C3 /* TransmissionLegacyUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransmissionLegacyUI.swift; sourceTree = "<group>"; };
7B10000A4300000000A1B2C3 /* TransmissionActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransmissionActions.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
Expand Down Expand Up @@ -345,13 +341,13 @@
children = (
4B908AED2E6EBAC700C2DA5C /* Info.plist */,
4B7EF5702E6E9F0C00C1C281 /* AppConfig.swift */,
4B1DAE0F295E702B0037E9FB /* TransmissionStore.swift */,
4D1000033B00000000B1C2D3 /* AppUpdater.swift */,
4B1DADDE295E6C440037E9FB /* BitDreamApp.swift */,
7B1000024300000000A1B2C3 /* Formatting.swift */,
4D3A00043C00000000E1F1A1 /* KeychainService.swift */,
7B1000044300000000A1B2C3 /* Sorting.swift */,
4BD938E92D82AF6F006CE97C /* ThemeManager.swift */,
4B1DAE0F295E702B0037E9FB /* TransmissionStore.swift */,
4B0349D52F56EB81008ED58D /* AppIcon */,
4B73985B2E70097C00D06E5D /* Delegates */,
4D3A00073C00000000E1F1A1 /* Models */,
Expand Down Expand Up @@ -388,8 +384,6 @@
4B1DADFC295E6F0F0037E9FB /* Transmission */ = {
isa = PBXGroup;
children = (
4B1DADFF295E6F600037E9FB /* TransmissionFunctions.swift */,
7B1000084300000000A1B2C3 /* TransmissionLegacyConnectionInfo.swift */,
5A1000064100000000A1B2C3 /* TransmissionModels.swift */,
5A1000224100000000A1B2C3 /* TransmissionTransport.swift */,
5A1000244100000000A1B2C3 /* TransmissionConnection.swift */,
Expand Down Expand Up @@ -425,6 +419,7 @@
4B642D7A2D7E1EF6003CEADC /* iOSServerList.swift */,
4BC5C2B12D7D415100D80AB4 /* iOSTorrentDetail.swift */,
4B6F1EBD2D86C926003D8F6E /* iOSTorrentFileDetail.swift */,
4F7000034000000000A1B2C3 /* iOSTorrentFileDetailControls.swift */,
4F7000014000000000A1B2C3 /* iOSTorrentFileRow.swift */,
4B6F1EB32D82DB2D003D8F6E /* iOSTorrentListRow.swift */,
4BF593BA2E89C8C400A8C1FC /* iOSTorrentPeerDetail.swift */,
Expand Down Expand Up @@ -474,8 +469,7 @@
4B1DAE09295E6FE10037E9FB /* ServerDetail.swift */,
4B1DAE0B295E6FEF0037E9FB /* ServerList.swift */,
4B1DAE05295E6FC80037E9FB /* TorrentDetail.swift */,
4FA9A0014100000000A1B2C3 /* TorrentActionExecutor.swift */,
7B10000A4300000000A1B2C3 /* TransmissionLegacyUI.swift */,
7B10000A4300000000A1B2C3 /* TransmissionActions.swift */,
4B6F1EBF2D86D52A003D8F6E /* TorrentFileDetail.swift */,
4B6F1EB12D82DB21003D8F6E /* TorrentListRow.swift */,
4BF593B82E89BF6300A8C1FC /* TorrentPeerDetail.swift */,
Expand Down Expand Up @@ -751,13 +745,11 @@
4B6F1EB02D82D340003D8F6E /* iOSSettingsView.swift in Sources */,
4BC6F24B2E89F8510037DFDF /* PiecesGridView.swift in Sources */,
4B6F1EBC2D86C908003D8F6E /* macOSTorrentFileDetail.swift in Sources */,
4B1DAE00295E6F600037E9FB /* TransmissionFunctions.swift in Sources */,
5A1000014100000000A1B2C3 /* TransmissionModels.swift in Sources */,
5A1000214100000000A1B2C3 /* TransmissionTransport.swift in Sources */,
5A1000234100000000A1B2C3 /* TransmissionConnection.swift in Sources */,
7B1000054300000000A1B2C3 /* TransmissionReadSnapshots.swift in Sources */,
6A1000014200000000A1B2C3 /* TransmissionConnectionFactory.swift in Sources */,
7B1000074300000000A1B2C3 /* TransmissionLegacyConnectionInfo.swift in Sources */,
6A1000034200000000A1B2C3 /* TransmissionTorrents.swift in Sources */,
6A1000054200000000A1B2C3 /* TransmissionSession.swift in Sources */,
6A1000074200000000A1B2C3 /* TransmissionErrorPresentation.swift in Sources */,
Expand All @@ -775,18 +767,18 @@
4B1DAE0C295E6FEF0037E9FB /* ServerList.swift in Sources */,
4E2000024000000000C1D2E3 /* NetworkSettings.swift in Sources */,
4E2000014000000000C1D2E3 /* SpeedLimitsSettings.swift in Sources */,
4FA9A0024100000000A1B2C3 /* TorrentActionExecutor.swift in Sources */,
4B6F1EB22D82DB21003D8F6E /* TorrentListRow.swift in Sources */,
4B1DAE06295E6FC80037E9FB /* TorrentDetail.swift in Sources */,
4E2000034000000000C1D2E3 /* TorrentSettings.swift in Sources */,
4B6F1EBE2D86C926003D8F6E /* iOSTorrentFileDetail.swift in Sources */,
4F7000044000000000A1B2C3 /* iOSTorrentFileDetailControls.swift in Sources */,
4F7000024000000000A1B2C3 /* iOSTorrentFileRow.swift in Sources */,
4B73985C2E70097C00D06E5D /* AppFileOpenDelegate.swift in Sources */,
4BCF274F2E774EDC00F6BF76 /* DataWriter.swift in Sources */,
4BCF27502E774EDC00F6BF76 /* DataModels.swift in Sources */,
4B9CAC562D7E83460094CD03 /* iOSAddTorrent.swift in Sources */,
4BE364BA2E6E75B300CF1A33 /* SharedComponents.swift in Sources */,
7B1000094300000000A1B2C3 /* TransmissionLegacyUI.swift in Sources */,
7B1000094300000000A1B2C3 /* TransmissionActions.swift in Sources */,
4BF593B72E89BF5500A8C1FC /* macOSTorrentPeerDetail.swift in Sources */,
4BF593B92E89BF6300A8C1FC /* TorrentPeerDetail.swift in Sources */,
4BC5C2AA2D7D20B500D80AB4 /* iOSContentView.swift in Sources */,
Expand Down
82 changes: 57 additions & 25 deletions BitDream/BitDreamApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -57,17 +57,34 @@ struct BitDreamApp: App {
#endif
}

var body: some Scene {
#if os(macOS)
macOSScenes
#else
iOSScene
#endif
}
}

private extension BitDreamApp {
#if os(macOS)
private func syncMenuBarStatusItem(isEnabled: Bool? = nil) {
func syncMenuBarStatusItem(isEnabled: Bool? = nil) {
menuBarStatusItemController.configure(
isEnabled: isEnabled ?? menuBarTransferWidgetEnabled,
store: store
)
}
#endif

var body: some Scene {
#if os(macOS)
@SceneBuilder
var macOSScenes: some Scene {
mainWindowScene
connectionInfoScene
statisticsScene
aboutScene
settingsScene
}

var mainWindowScene: some Scene {
Window("BitDream", id: "main") {
ContentView()
.environmentObject(store) // Pass the shared store to the ContentView
Expand Down Expand Up @@ -127,6 +144,13 @@ struct BitDreamApp: App {
) { result in
switch result {
case .success(let urls):
guard store.host != nil else {
presentAddTorrentStoreError(
detail: addTorrentNoServerConfiguredMessage,
store: store
)
return
}
var failures: [(String, String)] = []
for url in urls {
do {
Expand Down Expand Up @@ -155,7 +179,6 @@ struct BitDreamApp: App {
store.showGlobalAlert = true
}
}
#if os(macOS)
.sheet(isPresented: $store.showGlobalRenameDialog) {
// Resolve target torrent using the stored ID
if let targetId = store.globalRenameTargetId,
Expand All @@ -176,24 +199,25 @@ struct BitDreamApp: App {
store.showGlobalAlert = true
return
}
renameTorrentRoot(torrent: targetTorrent, to: newName, store: store) { error in
if let error = error {
store.globalAlertTitle = "Rename Error"
store.globalAlertMessage = error
store.showGlobalAlert = true
} else {
performTransmissionAction(
operation: { try await store.renameTorrentRoot(targetTorrent, to: newName) },
onSuccess: { (_: TorrentRenameResponseArgs) in
store.showGlobalRenameDialog = false
store.globalRenameInput = ""
store.globalRenameTargetId = nil
},
onError: { message in
store.globalAlertTitle = "Rename Error"
store.globalAlertMessage = message
store.showGlobalAlert = true
}
}
)
}
)
.frame(width: 420)
.padding()
}
}
#endif
}
.windowResizability(.contentSize)
.commands {
Expand All @@ -213,6 +237,9 @@ struct BitDreamApp: App {
)
}
.modelContainer(persistenceController.container)
}

var connectionInfoScene: some Scene {
WindowGroup("Connection Info", id: "connection-info") {
macOSConnectionInfoView()
.environmentObject(store)
Expand All @@ -223,7 +250,9 @@ struct BitDreamApp: App {
}
.windowResizability(.contentSize)
.modelContainer(persistenceController.container)
}

var statisticsScene: some Scene {
WindowGroup("Statistics", id: "statistics") {
macOSStatisticsView()
.environmentObject(store)
Expand All @@ -234,7 +263,9 @@ struct BitDreamApp: App {
}
.windowResizability(.contentSize)
.modelContainer(persistenceController.container)
}

var aboutScene: some Scene {
// About window - Using WindowGroup to prevent automatic Window menu entry
// This follows Apple's recommended pattern for auxiliary windows that shouldn't
// appear in the Window menu, as About windows are not user-managed utility windows
Expand All @@ -248,8 +279,19 @@ struct BitDreamApp: App {
.windowResizability(.contentSize)
.defaultPosition(.center)
.modelContainer(persistenceController.container)
}

#else
var settingsScene: some Scene {
Settings {
SettingsView(store: store) // Use the same store instance
.frame(minWidth: 500, idealWidth: 550, maxWidth: 650)
.environmentObject(appUpdater)
.environmentObject(themeManager) // Pass the ThemeManager to the Settings view
.immediateTheme(manager: themeManager)
}
}
#else
var iOSScene: some Scene {
WindowGroup {
ContentView()
.environmentObject(store) // Pass the shared store to the ContentView
Expand All @@ -268,18 +310,8 @@ struct BitDreamApp: App {
}
}
.modelContainer(persistenceController.container)
#endif

#if os(macOS)
Settings {
SettingsView(store: store) // Use the same store instance
.frame(minWidth: 500, idealWidth: 550, maxWidth: 650)
.environmentObject(appUpdater)
.environmentObject(themeManager) // Pass the ThemeManager to the Settings view
.immediateTheme(manager: themeManager)
}
#endif
}
#endif
}

// TODO(swiftdata-cutover): Remove this function entirely after the migration
Expand Down
Loading