aboutsummaryrefslogtreecommitdiff
path: root/Hotline/macOS
diff options
context:
space:
mode:
authorDustin Mierau <dustin@mierau.me>2025-11-10 21:00:43 -0800
committerDustin Mierau <dustin@mierau.me>2025-11-10 21:00:43 -0800
commitddb9c69b24a67ac140af9ff20f5c36bdef6fb51b (patch)
tree0bb994f1ac7a608c90b33c402629b0c8b21caff4 /Hotline/macOS
parenta4263aea6e2875fa77783685985e5c8f7991337f (diff)
Remove "New" suffix from our transfer clients. Further cleanup. Allow previewing certain files with HFS types (but no extensions). Cleanup preview files when window closes.
Diffstat (limited to 'Hotline/macOS')
-rw-r--r--Hotline/macOS/Files/FilePreviewQuickLookView.swift53
-rw-r--r--Hotline/macOS/Files/FilesView.swift17
-rw-r--r--Hotline/macOS/Files/FolderItemView.swift2
-rw-r--r--Hotline/macOS/ServerView.swift72
-rw-r--r--Hotline/macOS/TransfersView.swift4
5 files changed, 67 insertions, 81 deletions
diff --git a/Hotline/macOS/Files/FilePreviewQuickLookView.swift b/Hotline/macOS/Files/FilePreviewQuickLookView.swift
index 26bd286..a504a7a 100644
--- a/Hotline/macOS/Files/FilePreviewQuickLookView.swift
+++ b/Hotline/macOS/Files/FilePreviewQuickLookView.swift
@@ -11,16 +11,16 @@ struct FilePreviewQuickLookView: View {
@Environment(\.dismiss) private var dismiss
@Binding var info: PreviewFileInfo?
- @State var preview: FilePreviewState? = nil
+ @State private var preview: FilePreviewState? = nil
@FocusState private var focusField: FilePreviewFocus?
var body: some View {
Group {
- if preview?.state != .loaded {
+ if self.preview?.state != .loaded {
VStack(alignment: .center, spacing: 0) {
Spacer()
- ProgressView(value: max(0.0, min(1.0, preview?.progress ?? 0.0)))
+ ProgressView(value: max(0.0, min(1.0, self.preview?.progress ?? 0.0)))
.focusable(false)
.progressViewStyle(.circular)
.controlSize(.extraLarge)
@@ -33,7 +33,7 @@ struct FilePreviewQuickLookView: View {
.padding()
}
else {
- if let fileURL = preview?.fileURL {
+ if let fileURL = self.preview?.fileURL {
QuickLookPreviewView(fileURL: fileURL)
.frame(minWidth: 400, maxWidth: .infinity, minHeight: 400, maxHeight: .infinity)
}
@@ -68,25 +68,15 @@ struct FilePreviewQuickLookView: View {
.focusable()
.focusEffectDisabled()
.background(Color(nsColor: .textBackgroundColor))
- .focused($focusField, equals: .window)
- .navigationTitle(info?.name ?? "File Preview")
- .background {
- if let fileURL = self.preview?.fileURL {
- WindowConfigurator { window in
- window.representedURL = fileURL
- window.standardWindowButton(.documentIconButton)?.isHidden = false
- }
- }
- }
+ .focused(self.$focusField, equals: .window)
+ .navigationTitle(self.info?.name ?? "File Preview")
+ .applyNavigationDocumentIfPresent(self.preview?.fileURL)
.toolbar {
- if let _ = preview?.fileURL {
+ if let fileURL = self.preview?.fileURL {
if let info = info {
ToolbarItem(placement: .primaryAction) {
Button {
- if let fileURL = preview?.fileURL,
- let data = try? Data(contentsOf: fileURL) {
- let _ = data.saveAsFileToDownloads(filename: info.name)
- }
+ FileManager.default.copyToDownloads(from: fileURL, using: info.name, bounceDock: true)
} label: {
Label("Download File...", systemImage: "arrow.down")
}
@@ -96,28 +86,27 @@ struct FilePreviewQuickLookView: View {
}
}
.task {
- if let info = info {
- preview = FilePreviewState(info: info)
- preview?.download()
+ if let info = self.info {
+ self.preview = FilePreviewState(info: info)
+ self.preview?.download()
}
}
.onAppear {
- if info == nil {
- Task {
- dismiss()
- }
+ guard self.info != nil else {
+ self.dismiss()
return
}
- focusField = .window
+ self.focusField = .window
}
.onDisappear {
- preview?.cancel()
- dismiss()
+ self.preview?.cancel()
+ self.preview?.cleanup()
+ self.dismiss()
}
- .onChange(of: preview?.state) {
- if preview?.state == .failed {
- dismiss()
+ .onChange(of: self.preview?.state) {
+ if self.preview?.state == .failed {
+ self.dismiss()
}
}
.preferredColorScheme(.dark)
diff --git a/Hotline/macOS/Files/FilesView.swift b/Hotline/macOS/Files/FilesView.swift
index d4ba5c8..984b120 100644
--- a/Hotline/macOS/Files/FilesView.swift
+++ b/Hotline/macOS/Files/FilesView.swift
@@ -376,11 +376,11 @@ struct FilesView: View {
private func openPreviewWindow(_ previewInfo: PreviewFileInfo) {
switch previewInfo.previewType {
case .image:
- openWindow(id: "preview-quicklook", value: previewInfo)
+ self.openWindow(id: "preview-quicklook", value: previewInfo)
case .text:
- openWindow(id: "preview-quicklook", value: previewInfo)
+ self.openWindow(id: "preview-quicklook", value: previewInfo)
case .unknown:
- openWindow(id: "preview-quicklook", value: previewInfo)
+ self.openWindow(id: "preview-quicklook", value: previewInfo)
return
}
}
@@ -397,10 +397,10 @@ struct FilesView: View {
@MainActor private func downloadFile(_ file: FileInfo) {
if file.isFolder {
- model.downloadFolderNew(file.name, path: file.path)
+ model.downloadFolder(file.name, path: file.path)
}
else {
- model.downloadFileNew(file.name, path: file.path)
+ model.downloadFile(file.name, path: file.path)
}
}
@@ -442,9 +442,12 @@ struct FilesView: View {
return
}
- model.previewFile(file.name, path: file.path) { info in
+ self.model.previewFile(file.name, path: file.path) { info in
if let info = info {
- openPreviewWindow(info)
+ var extendedInfo = info
+ extendedInfo.creator = file.creator
+ extendedInfo.type = file.type
+ self.openPreviewWindow(extendedInfo)
}
}
}
diff --git a/Hotline/macOS/Files/FolderItemView.swift b/Hotline/macOS/Files/FolderItemView.swift
index 2b1b695..9b13cc0 100644
--- a/Hotline/macOS/Files/FolderItemView.swift
+++ b/Hotline/macOS/Files/FolderItemView.swift
@@ -81,7 +81,7 @@ struct FolderItemView: View {
.opacity(file.isUnavailable ? 0.5 : 1.0)
if loading {
- ProgressView().controlSize(.small).padding([.leading, .trailing], 5)
+ ProgressView().controlSize(.mini).padding([.leading, .trailing], 5)
}
Spacer()
if !file.isUnavailable {
diff --git a/Hotline/macOS/ServerView.swift b/Hotline/macOS/ServerView.swift
index 757dbd8..d4b3407 100644
--- a/Hotline/macOS/ServerView.swift
+++ b/Hotline/macOS/ServerView.swift
@@ -93,7 +93,7 @@ struct ServerView: View {
ServerMenuItem(type: .board, name: "Board", image: "Section Board"),
ServerMenuItem(type: .news, name: "News", image: "Section News"),
ServerMenuItem(type: .files, name: "Files", image: "Section Files"),
- ServerMenuItem(type: .accounts, name: "Admin", image: "Section Users"),
+ ServerMenuItem(type: .accounts, name: "Accounts", image: "Section Users"),
]
static var classicMenuItems: [ServerMenuItem] = [
@@ -280,47 +280,43 @@ struct ServerView: View {
}
var transfersSection: some View {
-// Section("Transfers") {
- ForEach(model.transfers) { transfer in
- TransferItemView(transfer: transfer)
- }
-// }
+ ForEach(model.transfers) { transfer in
+ TransferItemView(transfer: transfer)
+ }
}
var usersSection: some View {
-// Section("\(model.users.count) Online") {
- ForEach(model.users) { user in
- HStack(spacing: 5) {
- if let iconImage = HotlineState.getClassicIcon(Int(user.iconID)) {
- Image(nsImage: iconImage)
- .frame(width: 16, height: 16)
- .padding(.leading, 2)
- .padding(.trailing, 2)
- }
- else {
- Image("User")
- .frame(width: 16, height: 16)
- .padding(.leading, 2)
- .padding(.trailing, 2)
- }
-
- Text(user.name)
- .foregroundStyle(user.isAdmin ? Color.hotlineRed : .primary)
-
- Spacer()
-
- if model.hasUnreadInstantMessages(userID: user.id) {
- Circle()
- .frame(width: 6, height: 6)
- .foregroundStyle(user.isAdmin ? Color.hotlineRed : .primary.opacity(0.5))
- .padding(EdgeInsets(top: 0, leading: 8, bottom: 0, trailing: 2))
- }
+ ForEach(model.users) { user in
+ HStack(spacing: 5) {
+ if let iconImage = HotlineState.getClassicIcon(Int(user.iconID)) {
+ Image(nsImage: iconImage)
+ .frame(width: 16, height: 16)
+ .padding(.leading, 2)
+ .padding(.trailing, 2)
+ }
+ else {
+ Image("User")
+ .frame(width: 16, height: 16)
+ .padding(.leading, 2)
+ .padding(.trailing, 2)
+ }
+
+ Text(user.name)
+ .foregroundStyle(user.isAdmin ? Color.hotlineRed : .primary)
+
+ Spacer()
+
+ if model.hasUnreadInstantMessages(userID: user.id) {
+ Circle()
+ .frame(width: 6, height: 6)
+ .foregroundStyle(user.isAdmin ? Color.hotlineRed : .primary.opacity(0.5))
+ .padding(EdgeInsets(top: 0, leading: 8, bottom: 0, trailing: 2))
}
- .opacity(user.isIdle ? 0.5 : 1.0)
- .opacity(controlActiveState == .inactive ? 0.5 : 1.0)
- .tag(ServerNavigationType.user(userID: user.id))
}
-// }
+ .opacity(user.isIdle ? 0.5 : 1.0)
+ .opacity(controlActiveState == .inactive ? 0.5 : 1.0)
+ .tag(ServerNavigationType.user(userID: user.id))
+ }
}
var serverView: some View {
@@ -353,7 +349,7 @@ struct ServerView: View {
case .accounts:
AccountManagerView()
.navigationTitle(model.serverTitle)
- .navigationSubtitle("Administration")
+ .navigationSubtitle("Accounts")
.navigationSplitViewColumnWidth(min: 250, ideal: 500)
case .user(let userID):
let user = model.users.first(where: { $0.id == userID })
diff --git a/Hotline/macOS/TransfersView.swift b/Hotline/macOS/TransfersView.swift
index 489a50b..bf8c8bd 100644
--- a/Hotline/macOS/TransfersView.swift
+++ b/Hotline/macOS/TransfersView.swift
@@ -19,9 +19,7 @@ struct TransfersView: View {
ToolbarItem(placement: .primaryAction) {
Button {
if self.selectedTransfers.isEmpty {
- if let downloadsURL = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first {
- NSWorkspace.shared.open(downloadsURL)
- }
+ NSWorkspace.shared.open(URL.downloadsDirectory)
}
else {
let fileURLs = self.selectedTransfers.compactMap(\.fileURL)